diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..6b2558c --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,12 @@ +{ + "permissions": { + "allow": [ + "Bash(ls \"D:\\\\git\\\\bomaos-shop\\\\src\\\\main\\\\resources\"\" 2>nul || echo \"目录不存在 \")", + "Bash(dir:*)", + "Bash(mvn compile:*)", + "Bash(xargs cat:*)", + "Bash(cd:*)", + "Bash(grep:*)" + ] + } +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d473ad1 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,109 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## 项目概述 + +波猫商店 (Bomaos-Shop) — 基于 Java 8 + Spring Boot 2.7.13 的自动化发卡电商平台,支持14种支付渠道、批发模式、自动/手动发货。 + +**重要提示:本仓库缺少 `src/main/` 目录,Java 源码 (`.java`) 和资源文件均不在标准位置。** 所有内容位于 `target/classes/` 下: +- **Java 后端**:仅有编译后的 `.class` 文件,无法直接编辑,需反编译才能理解逻辑 +- **前端模板和静态资源完整存在**:Beetl 模板 (`templates/`)、CSS/JS (`static/`)、配置文件 (`*.yml`) 均可直接编辑 +- **注意**:`target/` 是 Maven 构建输出目录,`mvn clean` 会清除其中所有文件 + +## 构建与运行 + +```bash +# Maven 编译 +mvn compile + +# 打包(跳过测试) +mvn clean package -DskipTests + +# 运行测试 +mvn test + +# 直接运行 +java -jar target/bomaos-shop-2.0.4.jar + +# Docker 部署(需先将 sql/bomaos-shop.sql 复制到 mysql/db/init.sql) +docker-compose up -d +``` + +应用默认端口 **8085**,开发环境数据库连接 `localhost:3307`,Docker 环境连接 `mysql:3306`。 + +## 技术栈 + +| 层级 | 技术 | +|------|------| +| 框架 | Spring Boot 2.7.13 | +| ORM | MyBatis-Plus 3.5.3.1 | +| 数据库 | MySQL 8.0 + Druid 连接池 | +| 认证 | Apache Shiro 1.11.0 + JWT (jwtp) | +| 模板引擎 | Beetl 3.0.16 | +| 前端 UI | Layui | +| 工具库 | Hutool 5.8.20、Lombok、Fastjson 2 | + +## 架构 + +### 包结构 (`com.bomaos`) + +``` +com.bomaos/ +├── BomaosApplication # 启动类 +├── carmi/ # 卡密管理(CRUD + Excel 导入导出) +├── orders/ # 订单管理 +├── products/ # 商品 & 分类管理 +├── settings/ # 支付配置、优惠券、商店设置、微信推送 +├── content/ # 文章 & 轮播图 +├── reception/ # 前台展示(首页、商品详情、支付回调) +├── dashboard/ # 后台仪表盘 +├── theme/ # 主题管理(白天/黑夜/暗黑) +├── website/ # 网站 SEO 设置 +└── common/ + ├── core/ + │ ├── pays/ # 14种支付渠道集成(alipay/wxpay/paypal/epusdt/epay 等) + │ ├── shiro/ # Shiro 安全配置 + │ ├── aspect/ # AOP 操作日志 + │ ├── config/ # Spring 配置类 + │ ├── enmu/ # 枚举(支付类型等) + │ ├── utils/ # 工具类 + │ └── web/ # BaseController / BaseApiController + └── system/ # 用户、角色、菜单、字典、日志等系统管理 +``` + +### 分层模式 + +每个业务模块遵循标准 MVC 分层:`controller/ → service/ → mapper/ → entity/`,部分模块含 `dto/`、`vo/`、`excel/`。 + +### 路由分区 + +- **后台管理**:`/products/**`、`/carmi/**`、`/orders/**`、`/settings/**`、`/content/**`、`/sys/**`、`/dashboard/**` +- **前台展示**:`/`(首页)、`/product/{id}`、`/order`、`/search`、`/pay` +- **支付回调**:`/notify/**` +- **JWT 保护的 API**:`/api/**` + +### 多环境配置 + +- `application.yml` — 公共配置(端口、连接池、MyBatis-Plus、JWT) +- `application-dev.yml` — 开发环境(MySQL localhost:3307) +- `application-test.yml` — 测试环境 +- `application-prod.yml` — 生产环境 +- 通过 `spring.profiles.active` 切换 + +### 数据库 + +24 张表,初始化脚本在 `sql/bomaos-shop.sql`。核心业务表:`sys_products`(商品)、`sys_cards`(卡密)、`sys_orders`(订单)、`sys_pays`(支付配置)、`sys_coupon`(优惠券)。系统表以 `sys_` 前缀命名,使用 RBAC 权限模型(`sys_user` / `sys_role` / `sys_menu` 及关联表)。 + +### 支付集成 + +支付实现集中在 `common.core.pays` 包下,每种支付方式一个子包。支付配置存储在 `sys_pays` 表中,JSON 格式保存各渠道参数。回调统一由 `reception.controller.NotifyController` 处理。 + +## 编码约定 + +- Java 8 语法,UTF-8 编码 +- 实体类使用 Lombok (`@Data`, `@TableName` 等) +- MyBatis-Plus 注解映射,XML Mapper 与 Java 文件同目录(`classpath:com/bomaos/**/*Mapper.xml`) +- 下划线数据库字段自动映射驼峰命名 (`map-underscore-to-camel-case: true`) +- 时间格式统一 `yyyy/MM/dd HH:mm:ss`,时区 GMT+8 +- 操作日志通过 AOP 切面 (`OperLogAspect`) 自动记录 diff --git a/bomaos-shop.sql b/bomaos-shop.sql new file mode 100644 index 0000000..d6cc642 --- /dev/null +++ b/bomaos-shop.sql @@ -0,0 +1,1815 @@ +/* + Navicat Premium Data Transfer + + Source Server : 本地 + Source Server Type : MySQL + Source Server Version : 90600 + Source Host : localhost:3307 + Source Schema : bomaos-shop + + Target Server Type : MySQL + Target Server Version : 90600 + File Encoding : 65001 + + Date: 11/02/2026 20:19:52 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for oauth_token +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_token`; +CREATE TABLE `oauth_token` ( + `token_id` int NOT NULL AUTO_INCREMENT, + `user_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `access_token` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `refresh_token` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `expire_time` datetime NULL DEFAULT NULL, + `refresh_token_expire_time` datetime NULL DEFAULT NULL, + `roles` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `permissions` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`token_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of oauth_token +-- ---------------------------- +INSERT INTO `oauth_token` VALUES (14, '83', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4MyIsImV4cCI6MTc3MjEwNDAxN30.hfgsRhvRfiigGhXUAAhS3-Fx9Zmjeh4_EcxhJIznbAg', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4MyIsImV4cCI6MTc3NzI4ODAxN30.0beW-nOu9mEF_FlKH9nbu1f1V42xt4hMkBUBD_e3H4k', '2026-02-26 19:06:58', '2026-04-27 19:06:58', NULL, NULL, '2026-01-27 19:06:57', '2026-01-27 19:06:57'); +INSERT INTO `oauth_token` VALUES (15, '83', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4MyIsImV4cCI6MTc3MjEwNDgyNX0.txO-wPPEHagJMUy1du-eMrCLnwRk4YSIa7-yf-8xyyY', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4MyIsImV4cCI6MTc3NzI4ODgyNX0.C1ndQDgomNTYEOQbfSKVuSaj8Y3A5B5gsniRl1Uo8Hs', '2026-02-26 19:20:26', '2026-04-27 19:20:26', NULL, NULL, '2026-01-27 19:20:25', '2026-01-27 19:20:25'); + +-- ---------------------------- +-- Table structure for oauth_token_key +-- ---------------------------- +DROP TABLE IF EXISTS `oauth_token_key`; +CREATE TABLE `oauth_token_key` ( + `id` int NOT NULL AUTO_INCREMENT, + `token_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '生成token时的key', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of oauth_token_key +-- ---------------------------- +INSERT INTO `oauth_token_key` VALUES (3, '87e7e4e8c6851e5a207abdb6f4c93d47b401ca05313e68549b574a59161c22ce', '2026-01-27 19:06:57'); + +-- ---------------------------- +-- Table structure for sys_article +-- ---------------------------- +DROP TABLE IF EXISTS `sys_article`; +CREATE TABLE `sys_article` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文章标题', + `excerpt` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '摘要', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '文章内容', + `likes` int NULL DEFAULT NULL COMMENT '点赞数', + `see_number` int NULL DEFAULT NULL COMMENT '查看数量', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `user_id` int NULL DEFAULT NULL COMMENT '用户uid', + `picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文章图片', + `enabled` int NULL DEFAULT NULL COMMENT '是否启用', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '文章表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_article +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_cards +-- ---------------------------- +DROP TABLE IF EXISTS `sys_cards`; +CREATE TABLE `sys_cards` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `product_id` int NULL DEFAULT NULL COMMENT '对应商品id', + `card_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '卡密', + `status` int NULL DEFAULT NULL COMMENT '卡密状态', + `sell_type` int NULL DEFAULT NULL COMMENT '售卡类型', + `number` int NULL DEFAULT NULL COMMENT '总数', + `sell_number` int NULL DEFAULT NULL COMMENT '售出数量', + `created_at` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updated_at` datetime NULL DEFAULT NULL COMMENT '更新时间', + `supplier_id` int NULL DEFAULT 0, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 240 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '卡密' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_cards +-- ---------------------------- +INSERT INTO `sys_cards` VALUES (218, 10, '1', 0, 0, 1, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54', 0); +INSERT INTO `sys_cards` VALUES (219, 10, '2', 0, 0, 1, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54', 0); +INSERT INTO `sys_cards` VALUES (220, 10, '3', 1, 0, 0, 1, '2026-01-27 19:05:54', '2026-01-28 15:43:07', 0); +INSERT INTO `sys_cards` VALUES (221, 10, '4', 0, 0, 1, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54', 0); +INSERT INTO `sys_cards` VALUES (222, 10, '5', 0, 0, 1, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54', 0); +INSERT INTO `sys_cards` VALUES (223, 10, '6', 0, 0, 1, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54', 0); +INSERT INTO `sys_cards` VALUES (224, 10, '7', 0, 0, 1, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54', 0); +INSERT INTO `sys_cards` VALUES (225, 10, '8', 0, 0, 1, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54', 0); +INSERT INTO `sys_cards` VALUES (226, 10, '9', 0, 0, 1, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54', 0); +INSERT INTO `sys_cards` VALUES (227, 10, '10', 0, 0, 1, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54', 0); +INSERT INTO `sys_cards` VALUES (228, 11, '123', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (229, 11, '2', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (230, 11, '3', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (231, 11, '4', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (232, 11, '5', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (233, 11, '6', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (234, 11, '7', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (235, 11, '8', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (236, 11, '9', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (237, 11, '00', 0, 0, 1, 0, '2026-01-28 15:04:40', '2026-01-28 15:04:40', 1); +INSERT INTO `sys_cards` VALUES (238, 12, 'dfasdfs', 0, 0, 1, 0, '2026-01-28 15:12:45', '2026-01-28 15:12:45', 1); +INSERT INTO `sys_cards` VALUES (239, 12, '1231', 0, 0, 1, 0, '2026-01-28 15:12:58', '2026-01-28 15:12:58', 1); + +-- ---------------------------- +-- Table structure for sys_carousel +-- ---------------------------- +DROP TABLE IF EXISTS `sys_carousel`; +CREATE TABLE `sys_carousel` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题', + `link` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '对应的链接地址', + `image_logo` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '图片地址', + `summary` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '简介', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `enabled` int NULL DEFAULT NULL COMMENT '是否启用', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '轮播图管理' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_carousel +-- ---------------------------- +INSERT INTO `sys_carousel` VALUES (2, 'test', 'product/0etEQDeM9zQZX4m4', '/file/20260202/7f5e31242e0e427e92cc8644d7661714.jpeg', 'test', '2026-02-11 18:41:34', '2026-02-11 18:41:34', 1); + +-- ---------------------------- +-- Table structure for sys_classifys +-- ---------------------------- +DROP TABLE IF EXISTS `sys_classifys`; +CREATE TABLE `sys_classifys` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '分类名称', + `status` int NULL DEFAULT NULL COMMENT '分类状态', + `sort` int NULL DEFAULT NULL COMMENT '排序', + `created_at` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updated_at` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '分类' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_classifys +-- ---------------------------- +INSERT INTO `sys_classifys` VALUES (3, '1', 1, 1000, '2026-01-27 18:57:17', '2026-01-27 18:57:17'); + +-- ---------------------------- +-- Table structure for sys_coupon +-- ---------------------------- +DROP TABLE IF EXISTS `sys_coupon`; +CREATE TABLE `sys_coupon` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `classifys_id` int NULL DEFAULT NULL COMMENT '分类id', + `product_id` int NULL DEFAULT NULL COMMENT '商品id', + `type` int NULL DEFAULT NULL COMMENT '类型-0一次性,1重复使用', + `status` int NULL DEFAULT NULL COMMENT '状态', + `coupon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '优惠券代码', + `discount_type` int NULL DEFAULT NULL COMMENT '面额或者百分比', + `discount_val` decimal(18, 2) NULL DEFAULT NULL COMMENT '面额、折扣 价格和百分比', + `count_used` int NULL DEFAULT NULL COMMENT '已使用次数', + `count_all` int NULL DEFAULT NULL COMMENT '可用次数', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `full_reduction` decimal(18, 2) NULL DEFAULT NULL COMMENT '满减金额', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '优惠券' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_coupon +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_dictionary +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dictionary`; +CREATE TABLE `sys_dictionary` ( + `dict_id` int NOT NULL AUTO_INCREMENT COMMENT '字典id', + `dict_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '字典标识', + `dict_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '字典名称', + `sort_number` int NOT NULL DEFAULT 1 COMMENT '排序号', + `comments` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `deleted` int NOT NULL DEFAULT 0 COMMENT '是否删除,0否,1是', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`dict_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dictionary +-- ---------------------------- +INSERT INTO `sys_dictionary` VALUES (1, 'sex', '性别', 1, '', 0, '2020-03-15 13:04:39', '2020-03-15 13:04:39'); +INSERT INTO `sys_dictionary` VALUES (2, 'organization_type', '机构类型', 2, '', 0, '2020-03-16 00:32:36', '2020-03-16 00:32:36'); + +-- ---------------------------- +-- Table structure for sys_dictionary_data +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dictionary_data`; +CREATE TABLE `sys_dictionary_data` ( + `dict_data_id` int NOT NULL AUTO_INCREMENT COMMENT '字典项id', + `dict_id` int NOT NULL COMMENT '字典id', + `dict_data_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '字典项标识', + `dict_data_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '字典项名称', + `sort_number` int NOT NULL DEFAULT 1 COMMENT '排序号', + `comments` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `deleted` int NOT NULL DEFAULT 0 COMMENT '是否删除,0否,1是', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`dict_data_id`) USING BTREE, + INDEX `dict_id`(`dict_id`) USING BTREE, + CONSTRAINT `sys_dictionary_data_ibfk_1` FOREIGN KEY (`dict_id`) REFERENCES `sys_dictionary` (`dict_id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典项' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dictionary_data +-- ---------------------------- +INSERT INTO `sys_dictionary_data` VALUES (1, 1, 'male', '男', 1, '', 0, '2020-03-15 13:07:28', '2020-03-15 13:07:28'); +INSERT INTO `sys_dictionary_data` VALUES (2, 1, 'female', '女', 2, '', 0, '2020-03-15 13:07:41', '2020-03-15 15:58:04'); +INSERT INTO `sys_dictionary_data` VALUES (3, 2, 'company', '公司', 1, '', 0, '2020-03-16 00:34:32', '2020-03-16 00:34:32'); +INSERT INTO `sys_dictionary_data` VALUES (4, 2, 'subsidiary', '子公司', 2, '', 0, '2020-03-16 00:35:02', '2020-03-16 00:35:02'); +INSERT INTO `sys_dictionary_data` VALUES (5, 2, 'department', '部门', 3, '', 0, '2020-03-16 00:35:18', '2020-03-16 00:35:18'); +INSERT INTO `sys_dictionary_data` VALUES (6, 2, 'group', '小组', 4, '', 0, '2020-03-16 00:35:36', '2020-03-16 00:35:36'); + +-- ---------------------------- +-- Table structure for sys_links +-- ---------------------------- +DROP TABLE IF EXISTS `sys_links`; +CREATE TABLE `sys_links` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题', + `link` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '链接地址', + `enabled` int NULL DEFAULT NULL COMMENT '是否开启', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remote_enabled` int NULL DEFAULT NULL COMMENT '远程端', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '友情链接表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_links +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_login_record +-- ---------------------------- +DROP TABLE IF EXISTS `sys_login_record`; +CREATE TABLE `sys_login_record` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户账号', + `os` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作系统', + `device` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备名', + `browser` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '浏览器类型', + `ip` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'ip地址', + `oper_type` int NOT NULL COMMENT '操作类型,0登录成功,1登录失败,2退出登录,3刷新token', + `comments` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '登录日志' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_login_record +-- ---------------------------- +INSERT INTO `sys_login_record` VALUES (21, 'admin', 'Mac OS X', 'Mac OS X', 'Chrome 11', '127.0.0.1', 0, NULL, '2023-07-31 11:53:25', '2023-07-31 11:53:25'); +INSERT INTO `sys_login_record` VALUES (22, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '密码错误', '2026-01-27 18:56:54', '2026-01-27 18:56:54'); +INSERT INTO `sys_login_record` VALUES (23, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '验证码错误', '2026-01-27 18:56:58', '2026-01-27 18:56:58'); +INSERT INTO `sys_login_record` VALUES (24, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-27 18:57:04', '2026-01-27 18:57:04'); +INSERT INTO `sys_login_record` VALUES (25, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '103.151.173.210', 0, NULL, '2026-01-27 20:12:50', '2026-01-27 20:12:50'); +INSERT INTO `sys_login_record` VALUES (26, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 13:40:14', '2026-01-28 13:40:14'); +INSERT INTO `sys_login_record` VALUES (27, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:10:34', '2026-01-28 14:10:34'); +INSERT INTO `sys_login_record` VALUES (28, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '验证码错误', '2026-01-28 14:15:45', '2026-01-28 14:15:45'); +INSERT INTO `sys_login_record` VALUES (29, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:15:51', '2026-01-28 14:15:51'); +INSERT INTO `sys_login_record` VALUES (30, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:21:56', '2026-01-28 14:21:56'); +INSERT INTO `sys_login_record` VALUES (31, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:35:44', '2026-01-28 14:35:44'); +INSERT INTO `sys_login_record` VALUES (32, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:46:44', '2026-01-28 14:46:44'); +INSERT INTO `sys_login_record` VALUES (33, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '验证码错误', '2026-01-28 14:51:08', '2026-01-28 14:51:08'); +INSERT INTO `sys_login_record` VALUES (34, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:51:17', '2026-01-28 14:51:17'); +INSERT INTO `sys_login_record` VALUES (35, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '验证码错误', '2026-01-28 14:53:45', '2026-01-28 14:53:45'); +INSERT INTO `sys_login_record` VALUES (36, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:53:51', '2026-01-28 14:53:51'); +INSERT INTO `sys_login_record` VALUES (37, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:56:08', '2026-01-28 14:56:08'); +INSERT INTO `sys_login_record` VALUES (38, 'test', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:57:32', '2026-01-28 14:57:32'); +INSERT INTO `sys_login_record` VALUES (39, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '密码错误', '2026-01-28 14:58:07', '2026-01-28 14:58:07'); +INSERT INTO `sys_login_record` VALUES (40, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '验证码错误', '2026-01-28 14:58:10', '2026-01-28 14:58:10'); +INSERT INTO `sys_login_record` VALUES (41, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 14:58:15', '2026-01-28 14:58:15'); +INSERT INTO `sys_login_record` VALUES (42, 'test', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 15:01:14', '2026-01-28 15:01:14'); +INSERT INTO `sys_login_record` VALUES (43, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 15:01:46', '2026-01-28 15:01:46'); +INSERT INTO `sys_login_record` VALUES (44, 'test', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 15:41:00', '2026-01-28 15:41:00'); +INSERT INTO `sys_login_record` VALUES (45, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 15:42:29', '2026-01-28 15:42:29'); +INSERT INTO `sys_login_record` VALUES (46, 'test', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 15:50:57', '2026-01-28 15:50:57'); +INSERT INTO `sys_login_record` VALUES (47, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 16:17:39', '2026-01-28 16:17:39'); +INSERT INTO `sys_login_record` VALUES (48, 'test', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-01-28 16:17:57', '2026-01-28 16:17:57'); +INSERT INTO `sys_login_record` VALUES (49, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-02-02 18:53:52', '2026-02-02 18:53:52'); +INSERT INTO `sys_login_record` VALUES (50, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-02-05 13:29:04', '2026-02-05 13:29:04'); +INSERT INTO `sys_login_record` VALUES (51, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-02-05 21:25:19', '2026-02-05 21:25:19'); +INSERT INTO `sys_login_record` VALUES (52, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '192.168.2.128', 0, NULL, '2026-02-05 21:38:44', '2026-02-05 21:38:44'); +INSERT INTO `sys_login_record` VALUES (53, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '192.168.2.128', 0, NULL, '2026-02-11 18:28:43', '2026-02-11 18:28:43'); +INSERT INTO `sys_login_record` VALUES (54, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-02-11 19:13:17', '2026-02-11 19:13:17'); +INSERT INTO `sys_login_record` VALUES (55, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-02-11 19:37:18', '2026-02-11 19:37:18'); +INSERT INTO `sys_login_record` VALUES (56, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '验证码错误', '2026-02-11 19:42:37', '2026-02-11 19:42:37'); +INSERT INTO `sys_login_record` VALUES (57, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '验证码错误', '2026-02-11 19:43:26', '2026-02-11 19:43:26'); +INSERT INTO `sys_login_record` VALUES (58, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 1, '验证码错误', '2026-02-11 19:43:33', '2026-02-11 19:43:33'); +INSERT INTO `sys_login_record` VALUES (59, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-02-11 19:43:42', '2026-02-11 19:43:42'); +INSERT INTO `sys_login_record` VALUES (60, 'test', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-02-11 19:44:32', '2026-02-11 19:44:32'); +INSERT INTO `sys_login_record` VALUES (61, 'admin', 'Windows 10', 'Windows 10', 'Chrome 14', '198.18.0.1', 0, NULL, '2026-02-11 20:18:03', '2026-02-11 20:18:03'); + +-- ---------------------------- +-- Table structure for sys_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `menu_id` int NOT NULL AUTO_INCREMENT COMMENT '菜单id', + `parent_id` int NOT NULL DEFAULT 0 COMMENT '上级id,0是顶级', + `menu_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜单名称', + `menu_icon` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜单图标', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜单地址', + `menu_type` int NULL DEFAULT 0 COMMENT '类型,0菜单,1按钮', + `sort_number` int NOT NULL DEFAULT 1 COMMENT '排序号', + `authority` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '权限标识', + `target` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '_self' COMMENT '打开位置', + `icon_color` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标颜色', + `hide` int NOT NULL DEFAULT 0 COMMENT '是否隐藏,0否,1是', + `deleted` int NOT NULL DEFAULT 0 COMMENT '是否删除,0否,1是', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 124 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '菜单' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_menu +-- ---------------------------- +INSERT INTO `sys_menu` VALUES (1, 0, '系统管理', 'layui-icon layui-icon-set-sm', '', 0, 997, '', '_self', NULL, 0, 0, '2020-02-26 12:51:23', '2021-03-27 20:25:24'); +INSERT INTO `sys_menu` VALUES (2, 1, '用户管理', NULL, 'sys/user', 0, 1, 'sys:user:view', '_self', NULL, 0, 0, '2020-02-26 12:51:55', '2020-03-21 18:45:26'); +INSERT INTO `sys_menu` VALUES (3, 2, '查询用户', NULL, NULL, 1, 1, 'sys:user:list', '_self', NULL, 0, 0, '2020-02-26 12:52:06', '2020-03-21 18:45:28'); +INSERT INTO `sys_menu` VALUES (4, 2, '添加用户', NULL, NULL, 1, 2, 'sys:user:save', '_self', NULL, 0, 0, '2020-02-26 12:52:26', '2020-03-21 18:45:29'); +INSERT INTO `sys_menu` VALUES (5, 2, '修改用户', NULL, NULL, 1, 3, 'sys:user:update', '_self', NULL, 0, 0, '2020-02-26 12:52:50', '2020-03-21 18:45:30'); +INSERT INTO `sys_menu` VALUES (6, 2, '删除用户', NULL, NULL, 1, 4, 'sys:user:remove', '_self', NULL, 0, 0, '2020-02-26 12:53:13', '2020-03-21 18:45:32'); +INSERT INTO `sys_menu` VALUES (7, 1, '角色管理', NULL, 'sys/role', 0, 2, 'sys:role:view', '_self', NULL, 0, 0, '2020-03-13 13:29:08', '2020-03-21 18:45:33'); +INSERT INTO `sys_menu` VALUES (8, 7, '查询角色', NULL, NULL, 1, 1, 'sys:role:list', '_self', NULL, 0, 0, '2020-03-13 13:30:41', '2020-03-21 18:45:34'); +INSERT INTO `sys_menu` VALUES (9, 7, '添加角色', NULL, NULL, 1, 2, 'sys:role:save', '_self', NULL, 0, 0, '2020-03-15 13:02:07', '2020-03-21 18:45:35'); +INSERT INTO `sys_menu` VALUES (10, 7, '修改角色', NULL, NULL, 1, 3, 'sys:role:update', '_self', NULL, 0, 0, '2020-03-15 13:02:49', '2020-03-21 18:45:36'); +INSERT INTO `sys_menu` VALUES (11, 7, '删除角色', NULL, NULL, 1, 4, 'sys:role:remove', '_self', NULL, 0, 0, '2020-03-20 17:58:51', '2020-03-21 18:45:38'); +INSERT INTO `sys_menu` VALUES (12, 1, '菜单管理', NULL, 'sys/menu', 0, 3, 'sys:menu:view', '_self', NULL, 0, 0, '2020-03-21 01:07:13', '2020-03-21 18:45:39'); +INSERT INTO `sys_menu` VALUES (13, 12, '查询菜单', NULL, NULL, 1, 1, 'sys:menu:list', '_self', NULL, 0, 0, '2020-03-21 16:43:30', '2020-03-21 18:45:40'); +INSERT INTO `sys_menu` VALUES (14, 12, '添加菜单', NULL, NULL, 1, 2, 'sys:menu:save', '_self', NULL, 0, 0, '2020-03-21 16:43:54', '2020-03-21 18:45:41'); +INSERT INTO `sys_menu` VALUES (15, 12, '修改菜单', NULL, NULL, 1, 3, 'sys:menu:update', '_self', NULL, 0, 0, '2020-03-21 18:24:17', '2020-03-21 18:45:43'); +INSERT INTO `sys_menu` VALUES (16, 12, '删除菜单', NULL, NULL, 1, 4, 'sys:menu:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:18', '2020-03-21 18:45:44'); +INSERT INTO `sys_menu` VALUES (17, 1, '机构管理', '', 'sys/organization', 0, 6, 'sys:org:view', '_self', NULL, 1, 0, '2020-03-21 18:24:20', '2026-01-28 14:35:20'); +INSERT INTO `sys_menu` VALUES (18, 17, '查询机构', NULL, NULL, 1, 1, 'sys:org:list', '_self', NULL, 0, 0, '2020-03-21 18:24:21', '2020-03-21 18:44:36'); +INSERT INTO `sys_menu` VALUES (19, 17, '添加机构', NULL, NULL, 1, 2, 'sys:org:save', '_self', NULL, 0, 0, '2020-03-21 18:24:22', '2020-03-21 18:45:51'); +INSERT INTO `sys_menu` VALUES (20, 17, '修改机构', NULL, NULL, 1, 3, 'sys:org:update', '_self', NULL, 0, 0, '2020-03-21 18:24:24', '2020-03-21 18:45:52'); +INSERT INTO `sys_menu` VALUES (21, 17, '删除机构', NULL, NULL, 1, 4, 'sys:org:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:25', '2020-03-21 18:45:54'); +INSERT INTO `sys_menu` VALUES (22, 1, '字典管理', '', 'sys/dict', 0, 5, 'sys:dict:view', '_self', NULL, 1, 0, '2020-03-21 18:24:26', '2021-11-10 16:41:17'); +INSERT INTO `sys_menu` VALUES (23, 22, '查询字典', NULL, NULL, 1, 1, 'sys:dict:list', '_self', NULL, 0, 0, '2020-03-21 18:24:27', '2020-03-21 18:44:42'); +INSERT INTO `sys_menu` VALUES (24, 22, '添加字典', NULL, NULL, 1, 2, 'sys:dict:save', '_self', NULL, 0, 0, '2020-03-21 18:24:28', '2020-03-21 18:45:59'); +INSERT INTO `sys_menu` VALUES (25, 22, '修改字典', NULL, NULL, 1, 3, 'sys:dict:update', '_self', NULL, 0, 0, '2020-03-21 18:24:29', '2020-03-21 18:46:01'); +INSERT INTO `sys_menu` VALUES (26, 22, '删除字典', NULL, NULL, 1, 4, 'sys:dict:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:31', '2020-03-21 18:46:02'); +INSERT INTO `sys_menu` VALUES (27, 0, '日志管理', 'layui-icon layui-icon-list', '', 0, 998, '', '_self', NULL, 0, 0, '2020-03-21 18:24:32', '2021-03-27 20:25:31'); +INSERT INTO `sys_menu` VALUES (28, 27, '登录日志', NULL, 'sys/loginRecord', 0, 1, 'sys:login_record:view', '_self', NULL, 0, 0, '2020-03-21 18:24:33', '2020-03-21 18:44:52'); +INSERT INTO `sys_menu` VALUES (29, 27, '操作日志', NULL, 'sys/operRecord', 0, 2, 'sys:oper_record:view', '_self', NULL, 0, 0, '2020-03-21 18:24:34', '2020-03-21 18:46:10'); +INSERT INTO `sys_menu` VALUES (30, 27, '数据监控', NULL, 'druid', 0, 3, NULL, '_self', NULL, 0, 0, '2020-03-21 18:24:35', '2020-03-22 14:46:21'); +INSERT INTO `sys_menu` VALUES (31, 0, '系统工具', 'layui-icon layui-icon-slider', '', 0, 999, '', '_self', NULL, 0, 0, '2020-03-21 18:24:36', '2021-03-27 20:25:39'); +INSERT INTO `sys_menu` VALUES (32, 31, '文件管理', NULL, 'file/manage', 0, 1, 'sys:file:view', '_self', NULL, 0, 0, '2020-03-21 18:24:38', '2020-03-22 14:46:57'); +INSERT INTO `sys_menu` VALUES (33, 32, '查询文件', NULL, NULL, 1, 1, 'sys:file:list', '_self', NULL, 0, 0, '2020-03-21 18:24:39', '2020-03-22 14:47:32'); +INSERT INTO `sys_menu` VALUES (34, 32, '删除文件', NULL, NULL, 1, 2, 'sys:file:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:40', '2020-03-22 14:46:54'); +INSERT INTO `sys_menu` VALUES (35, 31, '发送邮件', NULL, 'sys/email', 0, 2, 'sys:email:view', '_self', NULL, 0, 0, '2020-03-21 18:24:41', '2020-03-22 14:47:35'); +INSERT INTO `sys_menu` VALUES (36, 31, '项目生成', '', '', 0, 3, '', '_self', NULL, 1, 1, '2020-03-21 18:24:42', '2021-11-10 16:41:57'); +INSERT INTO `sys_menu` VALUES (37, 0, '商品管理', 'layui-icon layui-icon-cart-simple', '', 0, 2, '', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-30 02:17:40'); +INSERT INTO `sys_menu` VALUES (38, 37, '分类管理', '', 'products/classifys', 0, 1, 'products:classifys:view', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:26:54'); +INSERT INTO `sys_menu` VALUES (39, 38, '查询分类', '', '', 1, 1, 'products:classifys:list', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu` VALUES (40, 38, '添加分类', '', '', 1, 2, 'products:classifys:save', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu` VALUES (41, 38, '修改分类', '', '', 1, 3, 'products:classifys:update', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu` VALUES (42, 38, '删除分类', '', '', 1, 4, 'products:classifys:remove', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu` VALUES (43, 37, '商品管理', '', 'products/products', 0, 3, 'products:products:view', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-06-05 15:51:44'); +INSERT INTO `sys_menu` VALUES (44, 43, '查询商品', '', '', 1, 1, 'products:products:list', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu` VALUES (45, 43, '添加商品', '', '', 1, 2, 'products:products:save', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu` VALUES (46, 43, '修改商品', '', '', 1, 3, 'products:products:update', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu` VALUES (47, 43, '删除商品', '', '', 1, 4, 'products:products:remove', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu` VALUES (48, 0, '卡密管理', 'layui-icon layui-icon-template-1', '', 0, 3, '', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-30 02:18:38'); +INSERT INTO `sys_menu` VALUES (49, 48, '卡密管理', '', 'carmi/cards', 0, 2, 'carmi:cards:view', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:46:41'); +INSERT INTO `sys_menu` VALUES (50, 49, '查询卡密', '', '', 1, 1, 'carmi:cards:list', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:34:17'); +INSERT INTO `sys_menu` VALUES (51, 54, '添加卡密', '', '', 1, 2, 'carmi:cards:save', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:46:54'); +INSERT INTO `sys_menu` VALUES (52, 49, '修改卡密', '', '', 1, 3, 'carmi:cards:update', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:34:17'); +INSERT INTO `sys_menu` VALUES (53, 49, '删除卡密', '', '', 1, 4, 'carmi:cards:remove', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:34:17'); +INSERT INTO `sys_menu` VALUES (54, 48, '添加卡密', '', 'carmi/cards/add', 0, 1, 'carmi:cards:view', '_self', NULL, 0, 0, '2021-03-28 00:46:11', '2021-03-28 00:46:26'); +INSERT INTO `sys_menu` VALUES (55, 48, '售出卡密', '', 'carmi/cards/sold', 0, 3, 'carmi:cards:view', '_self', NULL, 0, 1, '2021-03-28 14:36:53', '2021-11-02 15:12:47'); +INSERT INTO `sys_menu` VALUES (56, 43, '查询卡密', '', '', 1, 1, 'carmi:cards:list', '_self', NULL, 0, 0, '2021-03-28 14:37:26', '2021-11-10 03:03:13'); +INSERT INTO `sys_menu` VALUES (57, 0, '系统配置', 'layui-icon layui-icon-set-fill', '', 0, 996, '', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-11-10 16:40:55'); +INSERT INTO `sys_menu` VALUES (58, 57, '支付配置', '', 'settings/pays', 0, 2, 'settings:pays:view', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-07-04 04:01:04'); +INSERT INTO `sys_menu` VALUES (59, 58, '查询支付配置', '', '', 1, 1, 'settings:pays:list', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu` VALUES (60, 58, '添加支付配置', '', '', 1, 2, 'settings:pays:save', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu` VALUES (61, 58, '修改支付配置', '', '', 1, 3, 'settings:pays:update', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu` VALUES (62, 58, '删除支付配置', '', '', 1, 4, 'settings:pays:remove', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu` VALUES (63, 0, '订单管理', 'layui-icon layui-icon-rmb', '', 0, 4, '', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-30 02:18:55'); +INSERT INTO `sys_menu` VALUES (64, 63, '订单流水', '', 'orders/orders', 0, 1, 'orders:orders:view', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 17:01:42'); +INSERT INTO `sys_menu` VALUES (65, 64, '查询订单表', '', '', 1, 1, 'orders:orders:list', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu` VALUES (66, 64, '添加订单表', '', '', 1, 2, 'orders:orders:save', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu` VALUES (67, 64, '修改订单表', '', '', 1, 3, 'orders:orders:update', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu` VALUES (68, 64, '删除订单表', '', '', 1, 4, 'orders:orders:remove', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu` VALUES (69, 0, '卡密订单关联', 'layui-icon layui-icon-senior', '', 0, 999, 'carmi:orderCard:view', '_self', NULL, 1, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:33'); +INSERT INTO `sys_menu` VALUES (70, 69, '订单关联卡密表管理', '', 'carmi/orderCard', 0, 1, 'carmi:orderCard:view', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:29'); +INSERT INTO `sys_menu` VALUES (71, 70, '查询订单关联卡密表', '', '', 1, 1, 'carmi:orderCard:list', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:56'); +INSERT INTO `sys_menu` VALUES (72, 70, '添加订单关联卡密表', '', '', 1, 2, 'carmi:orderCard:save', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:51'); +INSERT INTO `sys_menu` VALUES (73, 70, '修改订单关联卡密表', '', '', 1, 3, 'carmi:orderCard:update', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:58:02'); +INSERT INTO `sys_menu` VALUES (74, 70, '删除订单关联卡密表', '', '', 1, 4, 'carmi:orderCard:remove', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:58:05'); +INSERT INTO `sys_menu` VALUES (75, 0, '管理中心', 'layui-icon layui-icon-console', 'dashboard/workplace', 0, 1, 'dashboard:user:view', '_self', NULL, 0, 0, '2021-03-30 00:58:26', '2021-03-30 02:16:33'); +INSERT INTO `sys_menu` VALUES (76, 37, '添加商品', '', 'products/products/addProduct', 0, 2, 'products:products:view', '_self', NULL, 0, 0, '2021-06-05 15:51:32', '2021-06-05 15:52:52'); +INSERT INTO `sys_menu` VALUES (77, 0, 'website', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-06-06 02:17:34', '2021-06-06 02:19:37'); +INSERT INTO `sys_menu` VALUES (78, 57, '网站设置', '', 'website/website', 0, 4, 'website:website:view', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-07-04 04:01:28'); +INSERT INTO `sys_menu` VALUES (79, 78, '查询网站设置', '', '', 1, 1, 'website:website:list', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu` VALUES (80, 78, '添加网站设置', '', '', 1, 2, 'website:website:save', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu` VALUES (81, 78, '修改网站设置', '', '', 1, 3, 'website:website:update', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu` VALUES (82, 78, '删除网站设置', '', '', 1, 4, 'website:website:remove', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu` VALUES (83, 0, '营销助手', 'layui-icon layui-icon-senior', '', 0, 5, '', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:54:20'); +INSERT INTO `sys_menu` VALUES (84, 83, '优惠券管理', '', 'settings/coupon', 0, 2, 'settings:coupon:view', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:55:51'); +INSERT INTO `sys_menu` VALUES (85, 84, '查询优惠券', '', '', 1, 1, 'settings:coupon:list', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu` VALUES (86, 84, '添加优惠券', '', '', 1, 2, 'settings:coupon:save', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu` VALUES (87, 84, '修改优惠券', '', '', 1, 3, 'settings:coupon:update', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu` VALUES (88, 84, '删除优惠券', '', '', 1, 4, 'settings:coupon:remove', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu` VALUES (89, 83, '添加优惠券', '', 'settings/coupon/add', 0, 1, 'settings:coupon:view', '_self', NULL, 0, 0, '2021-06-23 07:55:44', '2021-06-23 07:56:13'); +INSERT INTO `sys_menu` VALUES (90, 0, 'theme', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-06-28 00:37:42', '2021-06-28 00:39:46'); +INSERT INTO `sys_menu` VALUES (91, 57, '主题配置', '', 'theme/theme', 0, 3, 'theme:theme:view', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:39:43'); +INSERT INTO `sys_menu` VALUES (92, 91, '查询主题配置', '', '', 1, 1, 'theme:theme:list', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu` VALUES (93, 91, '添加主题配置', '', '', 1, 2, 'theme:theme:save', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu` VALUES (94, 91, '修改主题配置', '', '', 1, 3, 'theme:theme:update', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu` VALUES (95, 91, '删除主题配置', '', '', 1, 4, 'theme:theme:remove', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu` VALUES (96, 0, 'settings', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-07-04 03:59:22', '2021-07-04 04:00:42'); +INSERT INTO `sys_menu` VALUES (97, 57, '商店设置', '', 'settings/shopSettings', 0, 1, 'settings:shopSettings:view', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 04:01:37'); +INSERT INTO `sys_menu` VALUES (98, 97, '查询商店设置', '', '', 1, 1, 'settings:shopSettings:list', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu` VALUES (99, 97, '添加商店设置', '', '', 1, 2, 'settings:shopSettings:save', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu` VALUES (100, 97, '修改商店设置', '', '', 1, 3, 'settings:shopSettings:update', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu` VALUES (101, 97, '删除商店设置', '', '', 1, 4, 'settings:shopSettings:remove', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu` VALUES (102, 57, '微信通知', '', 'wxpusher/send', 0, 2, 'settings:wxpusher:view', '_self', NULL, 0, 0, '2021-07-04 16:35:26', '2021-07-04 16:35:38'); +INSERT INTO `sys_menu` VALUES (103, 0, '内容管理', 'layui-icon layui-icon-senior', '', 0, 30, '', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 06:10:02'); +INSERT INTO `sys_menu` VALUES (104, 103, '文章管理', '', 'content/article', 0, 2, 'content:article:view', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-10 03:05:20'); +INSERT INTO `sys_menu` VALUES (105, 104, '查询文章表', '', '', 1, 1, 'content:article:list', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu` VALUES (106, 104, '添加文章表', '', '', 1, 2, 'content:article:save', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu` VALUES (107, 104, '修改文章表', '', '', 1, 3, 'content:article:update', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu` VALUES (108, 104, '删除文章表', '', '', 1, 4, 'content:article:remove', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu` VALUES (109, 103, '添加文章', '', 'content/article/addArticle', 0, 1, 'content:article:view', '_self', NULL, 0, 0, '2021-11-08 06:23:01', '2021-11-08 06:23:35'); +INSERT INTO `sys_menu` VALUES (110, 109, '添加文章表', '', '', 1, 1, 'content:article:save', '_self', NULL, 0, 0, '2021-11-08 06:24:24', '2021-11-08 06:25:03'); +INSERT INTO `sys_menu` VALUES (111, 0, 'content', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-11-10 03:01:51', '2021-11-10 03:03:49'); +INSERT INTO `sys_menu` VALUES (112, 103, '首页轮播', '', 'content/carousel', 0, 4, 'content:carousel:view', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 08:30:59'); +INSERT INTO `sys_menu` VALUES (113, 112, '查询轮播图管理', '', '', 1, 1, 'content:carousel:list', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu` VALUES (114, 112, '添加轮播图管理', '', '', 1, 2, 'content:carousel:save', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu` VALUES (115, 112, '修改轮播图管理', '', '', 1, 3, 'content:carousel:update', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu` VALUES (116, 112, '删除轮播图管理', '', '', 1, 4, 'content:carousel:remove', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu` VALUES (117, 103, '添加轮播图', '', 'content/carousel/addCarousel', 0, 3, 'content:carousel:view', '_self', NULL, 0, 1, '2021-11-10 03:05:12', '2021-11-10 08:30:37'); +INSERT INTO `sys_menu` VALUES (118, 117, '添加轮播图管理', '', '', 1, 1, 'content:carousel:save', '_self', NULL, 0, 0, '2021-11-10 03:06:39', '2021-11-10 03:06:39'); +INSERT INTO `sys_menu` VALUES (119, 1, '供货商管理', '', 'sys/supplier', 0, 4, 'sys:supplier:view', '_self', NULL, 0, 0, '2026-01-28 14:32:06', '2026-01-28 14:47:59'); +INSERT INTO `sys_menu` VALUES (120, 119, '查询供货商', '', '', 1, 1, 'sys:supplier:list', '_self', NULL, 0, 0, '2026-01-28 14:32:06', '2026-01-28 14:34:01'); +INSERT INTO `sys_menu` VALUES (121, 119, '添加供货商', '', '', 1, 2, 'sys:supplier:save', '_self', NULL, 0, 0, '2026-01-28 14:32:06', '2026-01-28 14:34:18'); +INSERT INTO `sys_menu` VALUES (122, 119, '修改供货商', '', '', 1, 3, 'sys:supplier:update', '_self', NULL, 0, 0, '2026-01-28 14:32:06', '2026-01-28 14:34:25'); +INSERT INTO `sys_menu` VALUES (123, 119, '删除供货商', '', '', 1, 4, 'sys:supplier:remove', '_self', NULL, 0, 0, '2026-01-28 14:32:06', '2026-01-28 14:34:32'); + +-- ---------------------------- +-- Table structure for sys_menu_copy1 +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu_copy1`; +CREATE TABLE `sys_menu_copy1` ( + `menu_id` int NOT NULL AUTO_INCREMENT COMMENT '菜单id', + `parent_id` int NOT NULL DEFAULT 0 COMMENT '上级id,0是顶级', + `menu_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜单名称', + `menu_icon` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜单图标', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜单地址', + `menu_type` int NULL DEFAULT 0 COMMENT '类型,0菜单,1按钮', + `sort_number` int NOT NULL DEFAULT 1 COMMENT '排序号', + `authority` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '权限标识', + `target` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '_self' COMMENT '打开位置', + `icon_color` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标颜色', + `hide` int NOT NULL DEFAULT 0 COMMENT '是否隐藏,0否,1是', + `deleted` int NOT NULL DEFAULT 0 COMMENT '是否删除,0否,1是', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 119 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '菜单' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_menu_copy1 +-- ---------------------------- +INSERT INTO `sys_menu_copy1` VALUES (1, 0, '系统管理', 'layui-icon layui-icon-set-sm', '', 0, 997, '', '_self', NULL, 0, 0, '2020-02-26 12:51:23', '2021-03-27 20:25:24'); +INSERT INTO `sys_menu_copy1` VALUES (2, 1, '用户管理', NULL, 'sys/user', 0, 1, 'sys:user:view', '_self', NULL, 0, 0, '2020-02-26 12:51:55', '2020-03-21 18:45:26'); +INSERT INTO `sys_menu_copy1` VALUES (3, 2, '查询用户', NULL, NULL, 1, 1, 'sys:user:list', '_self', NULL, 0, 0, '2020-02-26 12:52:06', '2020-03-21 18:45:28'); +INSERT INTO `sys_menu_copy1` VALUES (4, 2, '添加用户', NULL, NULL, 1, 2, 'sys:user:save', '_self', NULL, 0, 0, '2020-02-26 12:52:26', '2020-03-21 18:45:29'); +INSERT INTO `sys_menu_copy1` VALUES (5, 2, '修改用户', NULL, NULL, 1, 3, 'sys:user:update', '_self', NULL, 0, 0, '2020-02-26 12:52:50', '2020-03-21 18:45:30'); +INSERT INTO `sys_menu_copy1` VALUES (6, 2, '删除用户', NULL, NULL, 1, 4, 'sys:user:remove', '_self', NULL, 0, 0, '2020-02-26 12:53:13', '2020-03-21 18:45:32'); +INSERT INTO `sys_menu_copy1` VALUES (7, 1, '角色管理', NULL, 'sys/role', 0, 2, 'sys:role:view', '_self', NULL, 0, 0, '2020-03-13 13:29:08', '2020-03-21 18:45:33'); +INSERT INTO `sys_menu_copy1` VALUES (8, 7, '查询角色', NULL, NULL, 1, 1, 'sys:role:list', '_self', NULL, 0, 0, '2020-03-13 13:30:41', '2020-03-21 18:45:34'); +INSERT INTO `sys_menu_copy1` VALUES (9, 7, '添加角色', NULL, NULL, 1, 2, 'sys:role:save', '_self', NULL, 0, 0, '2020-03-15 13:02:07', '2020-03-21 18:45:35'); +INSERT INTO `sys_menu_copy1` VALUES (10, 7, '修改角色', NULL, NULL, 1, 3, 'sys:role:update', '_self', NULL, 0, 0, '2020-03-15 13:02:49', '2020-03-21 18:45:36'); +INSERT INTO `sys_menu_copy1` VALUES (11, 7, '删除角色', NULL, NULL, 1, 4, 'sys:role:remove', '_self', NULL, 0, 0, '2020-03-20 17:58:51', '2020-03-21 18:45:38'); +INSERT INTO `sys_menu_copy1` VALUES (12, 1, '菜单管理', NULL, 'sys/menu', 0, 3, 'sys:menu:view', '_self', NULL, 0, 0, '2020-03-21 01:07:13', '2020-03-21 18:45:39'); +INSERT INTO `sys_menu_copy1` VALUES (13, 12, '查询菜单', NULL, NULL, 1, 1, 'sys:menu:list', '_self', NULL, 0, 0, '2020-03-21 16:43:30', '2020-03-21 18:45:40'); +INSERT INTO `sys_menu_copy1` VALUES (14, 12, '添加菜单', NULL, NULL, 1, 2, 'sys:menu:save', '_self', NULL, 0, 0, '2020-03-21 16:43:54', '2020-03-21 18:45:41'); +INSERT INTO `sys_menu_copy1` VALUES (15, 12, '修改菜单', NULL, NULL, 1, 3, 'sys:menu:update', '_self', NULL, 0, 0, '2020-03-21 18:24:17', '2020-03-21 18:45:43'); +INSERT INTO `sys_menu_copy1` VALUES (16, 12, '删除菜单', NULL, NULL, 1, 4, 'sys:menu:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:18', '2020-03-21 18:45:44'); +INSERT INTO `sys_menu_copy1` VALUES (17, 1, '机构管理', '', 'sys/organization', 0, 4, 'sys:org:view', '_self', NULL, 1, 0, '2020-03-21 18:24:20', '2021-11-10 16:41:09'); +INSERT INTO `sys_menu_copy1` VALUES (18, 17, '查询机构', NULL, NULL, 1, 1, 'sys:org:list', '_self', NULL, 0, 0, '2020-03-21 18:24:21', '2020-03-21 18:44:36'); +INSERT INTO `sys_menu_copy1` VALUES (19, 17, '添加机构', NULL, NULL, 1, 2, 'sys:org:save', '_self', NULL, 0, 0, '2020-03-21 18:24:22', '2020-03-21 18:45:51'); +INSERT INTO `sys_menu_copy1` VALUES (20, 17, '修改机构', NULL, NULL, 1, 3, 'sys:org:update', '_self', NULL, 0, 0, '2020-03-21 18:24:24', '2020-03-21 18:45:52'); +INSERT INTO `sys_menu_copy1` VALUES (21, 17, '删除机构', NULL, NULL, 1, 4, 'sys:org:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:25', '2020-03-21 18:45:54'); +INSERT INTO `sys_menu_copy1` VALUES (22, 1, '字典管理', '', 'sys/dict', 0, 5, 'sys:dict:view', '_self', NULL, 1, 0, '2020-03-21 18:24:26', '2021-11-10 16:41:17'); +INSERT INTO `sys_menu_copy1` VALUES (23, 22, '查询字典', NULL, NULL, 1, 1, 'sys:dict:list', '_self', NULL, 0, 0, '2020-03-21 18:24:27', '2020-03-21 18:44:42'); +INSERT INTO `sys_menu_copy1` VALUES (24, 22, '添加字典', NULL, NULL, 1, 2, 'sys:dict:save', '_self', NULL, 0, 0, '2020-03-21 18:24:28', '2020-03-21 18:45:59'); +INSERT INTO `sys_menu_copy1` VALUES (25, 22, '修改字典', NULL, NULL, 1, 3, 'sys:dict:update', '_self', NULL, 0, 0, '2020-03-21 18:24:29', '2020-03-21 18:46:01'); +INSERT INTO `sys_menu_copy1` VALUES (26, 22, '删除字典', NULL, NULL, 1, 4, 'sys:dict:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:31', '2020-03-21 18:46:02'); +INSERT INTO `sys_menu_copy1` VALUES (27, 0, '日志管理', 'layui-icon layui-icon-list', '', 0, 998, '', '_self', NULL, 0, 0, '2020-03-21 18:24:32', '2021-03-27 20:25:31'); +INSERT INTO `sys_menu_copy1` VALUES (28, 27, '登录日志', NULL, 'sys/loginRecord', 0, 1, 'sys:login_record:view', '_self', NULL, 0, 0, '2020-03-21 18:24:33', '2020-03-21 18:44:52'); +INSERT INTO `sys_menu_copy1` VALUES (29, 27, '操作日志', NULL, 'sys/operRecord', 0, 2, 'sys:oper_record:view', '_self', NULL, 0, 0, '2020-03-21 18:24:34', '2020-03-21 18:46:10'); +INSERT INTO `sys_menu_copy1` VALUES (30, 27, '数据监控', NULL, 'druid', 0, 3, NULL, '_self', NULL, 0, 0, '2020-03-21 18:24:35', '2020-03-22 14:46:21'); +INSERT INTO `sys_menu_copy1` VALUES (31, 0, '系统工具', 'layui-icon layui-icon-slider', '', 0, 999, '', '_self', NULL, 0, 0, '2020-03-21 18:24:36', '2021-03-27 20:25:39'); +INSERT INTO `sys_menu_copy1` VALUES (32, 31, '文件管理', NULL, 'file/manage', 0, 1, 'sys:file:view', '_self', NULL, 0, 0, '2020-03-21 18:24:38', '2020-03-22 14:46:57'); +INSERT INTO `sys_menu_copy1` VALUES (33, 32, '查询文件', NULL, NULL, 1, 1, 'sys:file:list', '_self', NULL, 0, 0, '2020-03-21 18:24:39', '2020-03-22 14:47:32'); +INSERT INTO `sys_menu_copy1` VALUES (34, 32, '删除文件', NULL, NULL, 1, 2, 'sys:file:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:40', '2020-03-22 14:46:54'); +INSERT INTO `sys_menu_copy1` VALUES (35, 31, '发送邮件', NULL, 'sys/email', 0, 2, 'sys:email:view', '_self', NULL, 0, 0, '2020-03-21 18:24:41', '2020-03-22 14:47:35'); +INSERT INTO `sys_menu_copy1` VALUES (36, 31, '项目生成', '', '', 0, 3, '', '_self', NULL, 1, 1, '2020-03-21 18:24:42', '2021-11-10 16:41:57'); +INSERT INTO `sys_menu_copy1` VALUES (37, 0, '商品管理', 'layui-icon layui-icon-cart-simple', '', 0, 2, '', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-30 02:17:40'); +INSERT INTO `sys_menu_copy1` VALUES (38, 37, '分类管理', '', 'products/classifys', 0, 1, 'products:classifys:view', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:26:54'); +INSERT INTO `sys_menu_copy1` VALUES (39, 38, '查询分类', '', '', 1, 1, 'products:classifys:list', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy1` VALUES (40, 38, '添加分类', '', '', 1, 2, 'products:classifys:save', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy1` VALUES (41, 38, '修改分类', '', '', 1, 3, 'products:classifys:update', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy1` VALUES (42, 38, '删除分类', '', '', 1, 4, 'products:classifys:remove', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy1` VALUES (43, 37, '商品管理', '', 'products/products', 0, 3, 'products:products:view', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-06-05 15:51:44'); +INSERT INTO `sys_menu_copy1` VALUES (44, 43, '查询商品', '', '', 1, 1, 'products:products:list', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy1` VALUES (45, 43, '添加商品', '', '', 1, 2, 'products:products:save', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy1` VALUES (46, 43, '修改商品', '', '', 1, 3, 'products:products:update', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy1` VALUES (47, 43, '删除商品', '', '', 1, 4, 'products:products:remove', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy1` VALUES (48, 0, '卡密管理', 'layui-icon layui-icon-template-1', '', 0, 3, '', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-30 02:18:38'); +INSERT INTO `sys_menu_copy1` VALUES (49, 48, '卡密管理', '', 'carmi/cards', 0, 2, 'carmi:cards:view', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:46:41'); +INSERT INTO `sys_menu_copy1` VALUES (50, 49, '查询卡密', '', '', 1, 1, 'carmi:cards:list', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:34:17'); +INSERT INTO `sys_menu_copy1` VALUES (51, 54, '添加卡密', '', '', 1, 2, 'carmi:cards:save', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:46:54'); +INSERT INTO `sys_menu_copy1` VALUES (52, 49, '修改卡密', '', '', 1, 3, 'carmi:cards:update', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:34:17'); +INSERT INTO `sys_menu_copy1` VALUES (53, 49, '删除卡密', '', '', 1, 4, 'carmi:cards:remove', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:34:17'); +INSERT INTO `sys_menu_copy1` VALUES (54, 48, '添加卡密', '', 'carmi/cards/add', 0, 1, 'carmi:cards:view', '_self', NULL, 0, 0, '2021-03-28 00:46:11', '2021-03-28 00:46:26'); +INSERT INTO `sys_menu_copy1` VALUES (55, 48, '售出卡密', '', 'carmi/cards/sold', 0, 3, 'carmi:cards:view', '_self', NULL, 0, 1, '2021-03-28 14:36:53', '2021-11-02 15:12:47'); +INSERT INTO `sys_menu_copy1` VALUES (56, 43, '查询卡密', '', '', 1, 1, 'carmi:cards:list', '_self', NULL, 0, 0, '2021-03-28 14:37:26', '2021-11-10 03:03:13'); +INSERT INTO `sys_menu_copy1` VALUES (57, 0, '系统配置', 'layui-icon layui-icon-set-fill', '', 0, 996, '', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-11-10 16:40:55'); +INSERT INTO `sys_menu_copy1` VALUES (58, 57, '支付配置', '', 'settings/pays', 0, 2, 'settings:pays:view', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-07-04 04:01:04'); +INSERT INTO `sys_menu_copy1` VALUES (59, 58, '查询支付配置', '', '', 1, 1, 'settings:pays:list', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu_copy1` VALUES (60, 58, '添加支付配置', '', '', 1, 2, 'settings:pays:save', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu_copy1` VALUES (61, 58, '修改支付配置', '', '', 1, 3, 'settings:pays:update', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu_copy1` VALUES (62, 58, '删除支付配置', '', '', 1, 4, 'settings:pays:remove', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu_copy1` VALUES (63, 0, '订单管理', 'layui-icon layui-icon-rmb', '', 0, 4, '', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-30 02:18:55'); +INSERT INTO `sys_menu_copy1` VALUES (64, 63, '订单流水', '', 'orders/orders', 0, 1, 'orders:orders:view', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 17:01:42'); +INSERT INTO `sys_menu_copy1` VALUES (65, 64, '查询订单表', '', '', 1, 1, 'orders:orders:list', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu_copy1` VALUES (66, 64, '添加订单表', '', '', 1, 2, 'orders:orders:save', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu_copy1` VALUES (67, 64, '修改订单表', '', '', 1, 3, 'orders:orders:update', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu_copy1` VALUES (68, 64, '删除订单表', '', '', 1, 4, 'orders:orders:remove', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu_copy1` VALUES (69, 0, '卡密订单关联', 'layui-icon layui-icon-senior', '', 0, 999, 'carmi:orderCard:view', '_self', NULL, 1, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:33'); +INSERT INTO `sys_menu_copy1` VALUES (70, 69, '订单关联卡密表管理', '', 'carmi/orderCard', 0, 1, 'carmi:orderCard:view', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:29'); +INSERT INTO `sys_menu_copy1` VALUES (71, 70, '查询订单关联卡密表', '', '', 1, 1, 'carmi:orderCard:list', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:56'); +INSERT INTO `sys_menu_copy1` VALUES (72, 70, '添加订单关联卡密表', '', '', 1, 2, 'carmi:orderCard:save', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:51'); +INSERT INTO `sys_menu_copy1` VALUES (73, 70, '修改订单关联卡密表', '', '', 1, 3, 'carmi:orderCard:update', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:58:02'); +INSERT INTO `sys_menu_copy1` VALUES (74, 70, '删除订单关联卡密表', '', '', 1, 4, 'carmi:orderCard:remove', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:58:05'); +INSERT INTO `sys_menu_copy1` VALUES (75, 0, '管理中心', 'layui-icon layui-icon-console', 'dashboard/workplace', 0, 1, 'dashboard:user:view', '_self', NULL, 0, 0, '2021-03-30 00:58:26', '2021-03-30 02:16:33'); +INSERT INTO `sys_menu_copy1` VALUES (76, 37, '添加商品', '', 'products/products/addProduct', 0, 2, 'products:products:view', '_self', NULL, 0, 0, '2021-06-05 15:51:32', '2021-06-05 15:52:52'); +INSERT INTO `sys_menu_copy1` VALUES (77, 0, 'website', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-06-06 02:17:34', '2021-06-06 02:19:37'); +INSERT INTO `sys_menu_copy1` VALUES (78, 57, '网站设置', '', 'website/website', 0, 4, 'website:website:view', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-07-04 04:01:28'); +INSERT INTO `sys_menu_copy1` VALUES (79, 78, '查询网站设置', '', '', 1, 1, 'website:website:list', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu_copy1` VALUES (80, 78, '添加网站设置', '', '', 1, 2, 'website:website:save', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu_copy1` VALUES (81, 78, '修改网站设置', '', '', 1, 3, 'website:website:update', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu_copy1` VALUES (82, 78, '删除网站设置', '', '', 1, 4, 'website:website:remove', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu_copy1` VALUES (83, 0, '营销助手', 'layui-icon layui-icon-senior', '', 0, 5, '', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:54:20'); +INSERT INTO `sys_menu_copy1` VALUES (84, 83, '优惠券管理', '', 'settings/coupon', 0, 2, 'settings:coupon:view', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:55:51'); +INSERT INTO `sys_menu_copy1` VALUES (85, 84, '查询优惠券', '', '', 1, 1, 'settings:coupon:list', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu_copy1` VALUES (86, 84, '添加优惠券', '', '', 1, 2, 'settings:coupon:save', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu_copy1` VALUES (87, 84, '修改优惠券', '', '', 1, 3, 'settings:coupon:update', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu_copy1` VALUES (88, 84, '删除优惠券', '', '', 1, 4, 'settings:coupon:remove', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu_copy1` VALUES (89, 83, '添加优惠券', '', 'settings/coupon/add', 0, 1, 'settings:coupon:view', '_self', NULL, 0, 0, '2021-06-23 07:55:44', '2021-06-23 07:56:13'); +INSERT INTO `sys_menu_copy1` VALUES (90, 0, 'theme', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-06-28 00:37:42', '2021-06-28 00:39:46'); +INSERT INTO `sys_menu_copy1` VALUES (91, 57, '主题配置', '', 'theme/theme', 0, 3, 'theme:theme:view', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:39:43'); +INSERT INTO `sys_menu_copy1` VALUES (92, 91, '查询主题配置', '', '', 1, 1, 'theme:theme:list', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu_copy1` VALUES (93, 91, '添加主题配置', '', '', 1, 2, 'theme:theme:save', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu_copy1` VALUES (94, 91, '修改主题配置', '', '', 1, 3, 'theme:theme:update', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu_copy1` VALUES (95, 91, '删除主题配置', '', '', 1, 4, 'theme:theme:remove', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu_copy1` VALUES (96, 0, 'settings', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-07-04 03:59:22', '2021-07-04 04:00:42'); +INSERT INTO `sys_menu_copy1` VALUES (97, 57, '商店设置', '', 'settings/shopSettings', 0, 1, 'settings:shopSettings:view', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 04:01:37'); +INSERT INTO `sys_menu_copy1` VALUES (98, 97, '查询商店设置', '', '', 1, 1, 'settings:shopSettings:list', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu_copy1` VALUES (99, 97, '添加商店设置', '', '', 1, 2, 'settings:shopSettings:save', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu_copy1` VALUES (100, 97, '修改商店设置', '', '', 1, 3, 'settings:shopSettings:update', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu_copy1` VALUES (101, 97, '删除商店设置', '', '', 1, 4, 'settings:shopSettings:remove', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu_copy1` VALUES (102, 57, '微信通知', '', 'wxpusher/send', 0, 2, 'settings:wxpusher:view', '_self', NULL, 0, 0, '2021-07-04 16:35:26', '2021-07-04 16:35:38'); +INSERT INTO `sys_menu_copy1` VALUES (103, 0, '内容管理', 'layui-icon layui-icon-senior', '', 0, 30, '', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 06:10:02'); +INSERT INTO `sys_menu_copy1` VALUES (104, 103, '文章管理', '', 'content/article', 0, 2, 'content:article:view', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-10 03:05:20'); +INSERT INTO `sys_menu_copy1` VALUES (105, 104, '查询文章表', '', '', 1, 1, 'content:article:list', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu_copy1` VALUES (106, 104, '添加文章表', '', '', 1, 2, 'content:article:save', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu_copy1` VALUES (107, 104, '修改文章表', '', '', 1, 3, 'content:article:update', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu_copy1` VALUES (108, 104, '删除文章表', '', '', 1, 4, 'content:article:remove', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu_copy1` VALUES (109, 103, '添加文章', '', 'content/article/addArticle', 0, 1, 'content:article:view', '_self', NULL, 0, 0, '2021-11-08 06:23:01', '2021-11-08 06:23:35'); +INSERT INTO `sys_menu_copy1` VALUES (110, 109, '添加文章表', '', '', 1, 1, 'content:article:save', '_self', NULL, 0, 0, '2021-11-08 06:24:24', '2021-11-08 06:25:03'); +INSERT INTO `sys_menu_copy1` VALUES (111, 0, 'content', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-11-10 03:01:51', '2021-11-10 03:03:49'); +INSERT INTO `sys_menu_copy1` VALUES (112, 103, '首页轮播', '', 'content/carousel', 0, 4, 'content:carousel:view', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 08:30:59'); +INSERT INTO `sys_menu_copy1` VALUES (113, 112, '查询轮播图管理', '', '', 1, 1, 'content:carousel:list', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu_copy1` VALUES (114, 112, '添加轮播图管理', '', '', 1, 2, 'content:carousel:save', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu_copy1` VALUES (115, 112, '修改轮播图管理', '', '', 1, 3, 'content:carousel:update', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu_copy1` VALUES (116, 112, '删除轮播图管理', '', '', 1, 4, 'content:carousel:remove', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu_copy1` VALUES (117, 103, '添加轮播图', '', 'content/carousel/addCarousel', 0, 3, 'content:carousel:view', '_self', NULL, 0, 1, '2021-11-10 03:05:12', '2021-11-10 08:30:37'); +INSERT INTO `sys_menu_copy1` VALUES (118, 117, '添加轮播图管理', '', '', 1, 1, 'content:carousel:save', '_self', NULL, 0, 0, '2021-11-10 03:06:39', '2021-11-10 03:06:39'); + +-- ---------------------------- +-- Table structure for sys_menu_copy2 +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu_copy2`; +CREATE TABLE `sys_menu_copy2` ( + `menu_id` int NOT NULL AUTO_INCREMENT COMMENT '菜单id', + `parent_id` int NOT NULL DEFAULT 0 COMMENT '上级id,0是顶级', + `menu_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜单名称', + `menu_icon` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜单图标', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '菜单地址', + `menu_type` int NULL DEFAULT 0 COMMENT '类型,0菜单,1按钮', + `sort_number` int NOT NULL DEFAULT 1 COMMENT '排序号', + `authority` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '权限标识', + `target` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '_self' COMMENT '打开位置', + `icon_color` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标颜色', + `hide` int NOT NULL DEFAULT 0 COMMENT '是否隐藏,0否,1是', + `deleted` int NOT NULL DEFAULT 0 COMMENT '是否删除,0否,1是', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 119 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '菜单' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_menu_copy2 +-- ---------------------------- +INSERT INTO `sys_menu_copy2` VALUES (1, 0, '系统管理', 'layui-icon layui-icon-set-sm', '', 0, 997, '', '_self', NULL, 0, 0, '2020-02-26 12:51:23', '2021-03-27 20:25:24'); +INSERT INTO `sys_menu_copy2` VALUES (2, 1, '用户管理', NULL, 'sys/user', 0, 1, 'sys:user:view', '_self', NULL, 0, 0, '2020-02-26 12:51:55', '2020-03-21 18:45:26'); +INSERT INTO `sys_menu_copy2` VALUES (3, 2, '查询用户', NULL, NULL, 1, 1, 'sys:user:list', '_self', NULL, 0, 0, '2020-02-26 12:52:06', '2020-03-21 18:45:28'); +INSERT INTO `sys_menu_copy2` VALUES (4, 2, '添加用户', NULL, NULL, 1, 2, 'sys:user:save', '_self', NULL, 0, 0, '2020-02-26 12:52:26', '2020-03-21 18:45:29'); +INSERT INTO `sys_menu_copy2` VALUES (5, 2, '修改用户', NULL, NULL, 1, 3, 'sys:user:update', '_self', NULL, 0, 0, '2020-02-26 12:52:50', '2020-03-21 18:45:30'); +INSERT INTO `sys_menu_copy2` VALUES (6, 2, '删除用户', NULL, NULL, 1, 4, 'sys:user:remove', '_self', NULL, 0, 0, '2020-02-26 12:53:13', '2020-03-21 18:45:32'); +INSERT INTO `sys_menu_copy2` VALUES (7, 1, '角色管理', NULL, 'sys/role', 0, 2, 'sys:role:view', '_self', NULL, 0, 0, '2020-03-13 13:29:08', '2020-03-21 18:45:33'); +INSERT INTO `sys_menu_copy2` VALUES (8, 7, '查询角色', NULL, NULL, 1, 1, 'sys:role:list', '_self', NULL, 0, 0, '2020-03-13 13:30:41', '2020-03-21 18:45:34'); +INSERT INTO `sys_menu_copy2` VALUES (9, 7, '添加角色', NULL, NULL, 1, 2, 'sys:role:save', '_self', NULL, 0, 0, '2020-03-15 13:02:07', '2020-03-21 18:45:35'); +INSERT INTO `sys_menu_copy2` VALUES (10, 7, '修改角色', NULL, NULL, 1, 3, 'sys:role:update', '_self', NULL, 0, 0, '2020-03-15 13:02:49', '2020-03-21 18:45:36'); +INSERT INTO `sys_menu_copy2` VALUES (11, 7, '删除角色', NULL, NULL, 1, 4, 'sys:role:remove', '_self', NULL, 0, 0, '2020-03-20 17:58:51', '2020-03-21 18:45:38'); +INSERT INTO `sys_menu_copy2` VALUES (12, 1, '菜单管理', NULL, 'sys/menu', 0, 3, 'sys:menu:view', '_self', NULL, 0, 0, '2020-03-21 01:07:13', '2020-03-21 18:45:39'); +INSERT INTO `sys_menu_copy2` VALUES (13, 12, '查询菜单', NULL, NULL, 1, 1, 'sys:menu:list', '_self', NULL, 0, 0, '2020-03-21 16:43:30', '2020-03-21 18:45:40'); +INSERT INTO `sys_menu_copy2` VALUES (14, 12, '添加菜单', NULL, NULL, 1, 2, 'sys:menu:save', '_self', NULL, 0, 0, '2020-03-21 16:43:54', '2020-03-21 18:45:41'); +INSERT INTO `sys_menu_copy2` VALUES (15, 12, '修改菜单', NULL, NULL, 1, 3, 'sys:menu:update', '_self', NULL, 0, 0, '2020-03-21 18:24:17', '2020-03-21 18:45:43'); +INSERT INTO `sys_menu_copy2` VALUES (16, 12, '删除菜单', NULL, NULL, 1, 4, 'sys:menu:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:18', '2020-03-21 18:45:44'); +INSERT INTO `sys_menu_copy2` VALUES (17, 1, '机构管理', '', 'sys/organization', 0, 4, 'sys:org:view', '_self', NULL, 1, 0, '2020-03-21 18:24:20', '2021-11-10 16:41:09'); +INSERT INTO `sys_menu_copy2` VALUES (18, 17, '查询机构', NULL, NULL, 1, 1, 'sys:org:list', '_self', NULL, 0, 0, '2020-03-21 18:24:21', '2020-03-21 18:44:36'); +INSERT INTO `sys_menu_copy2` VALUES (19, 17, '添加机构', NULL, NULL, 1, 2, 'sys:org:save', '_self', NULL, 0, 0, '2020-03-21 18:24:22', '2020-03-21 18:45:51'); +INSERT INTO `sys_menu_copy2` VALUES (20, 17, '修改机构', NULL, NULL, 1, 3, 'sys:org:update', '_self', NULL, 0, 0, '2020-03-21 18:24:24', '2020-03-21 18:45:52'); +INSERT INTO `sys_menu_copy2` VALUES (21, 17, '删除机构', NULL, NULL, 1, 4, 'sys:org:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:25', '2020-03-21 18:45:54'); +INSERT INTO `sys_menu_copy2` VALUES (22, 1, '字典管理', '', 'sys/dict', 0, 5, 'sys:dict:view', '_self', NULL, 1, 0, '2020-03-21 18:24:26', '2021-11-10 16:41:17'); +INSERT INTO `sys_menu_copy2` VALUES (23, 22, '查询字典', NULL, NULL, 1, 1, 'sys:dict:list', '_self', NULL, 0, 0, '2020-03-21 18:24:27', '2020-03-21 18:44:42'); +INSERT INTO `sys_menu_copy2` VALUES (24, 22, '添加字典', NULL, NULL, 1, 2, 'sys:dict:save', '_self', NULL, 0, 0, '2020-03-21 18:24:28', '2020-03-21 18:45:59'); +INSERT INTO `sys_menu_copy2` VALUES (25, 22, '修改字典', NULL, NULL, 1, 3, 'sys:dict:update', '_self', NULL, 0, 0, '2020-03-21 18:24:29', '2020-03-21 18:46:01'); +INSERT INTO `sys_menu_copy2` VALUES (26, 22, '删除字典', NULL, NULL, 1, 4, 'sys:dict:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:31', '2020-03-21 18:46:02'); +INSERT INTO `sys_menu_copy2` VALUES (27, 0, '日志管理', 'layui-icon layui-icon-list', '', 0, 998, '', '_self', NULL, 0, 0, '2020-03-21 18:24:32', '2021-03-27 20:25:31'); +INSERT INTO `sys_menu_copy2` VALUES (28, 27, '登录日志', NULL, 'sys/loginRecord', 0, 1, 'sys:login_record:view', '_self', NULL, 0, 0, '2020-03-21 18:24:33', '2020-03-21 18:44:52'); +INSERT INTO `sys_menu_copy2` VALUES (29, 27, '操作日志', NULL, 'sys/operRecord', 0, 2, 'sys:oper_record:view', '_self', NULL, 0, 0, '2020-03-21 18:24:34', '2020-03-21 18:46:10'); +INSERT INTO `sys_menu_copy2` VALUES (30, 27, '数据监控', NULL, 'druid', 0, 3, NULL, '_self', NULL, 0, 0, '2020-03-21 18:24:35', '2020-03-22 14:46:21'); +INSERT INTO `sys_menu_copy2` VALUES (31, 0, '系统工具', 'layui-icon layui-icon-slider', '', 0, 999, '', '_self', NULL, 0, 0, '2020-03-21 18:24:36', '2021-03-27 20:25:39'); +INSERT INTO `sys_menu_copy2` VALUES (32, 31, '文件管理', NULL, 'file/manage', 0, 1, 'sys:file:view', '_self', NULL, 0, 0, '2020-03-21 18:24:38', '2020-03-22 14:46:57'); +INSERT INTO `sys_menu_copy2` VALUES (33, 32, '查询文件', NULL, NULL, 1, 1, 'sys:file:list', '_self', NULL, 0, 0, '2020-03-21 18:24:39', '2020-03-22 14:47:32'); +INSERT INTO `sys_menu_copy2` VALUES (34, 32, '删除文件', NULL, NULL, 1, 2, 'sys:file:remove', '_self', NULL, 0, 0, '2020-03-21 18:24:40', '2020-03-22 14:46:54'); +INSERT INTO `sys_menu_copy2` VALUES (35, 31, '发送邮件', NULL, 'sys/email', 0, 2, 'sys:email:view', '_self', NULL, 0, 0, '2020-03-21 18:24:41', '2020-03-22 14:47:35'); +INSERT INTO `sys_menu_copy2` VALUES (36, 31, '项目生成', '', '', 0, 3, '', '_self', NULL, 1, 1, '2020-03-21 18:24:42', '2021-11-10 16:41:57'); +INSERT INTO `sys_menu_copy2` VALUES (37, 0, '商品管理', 'layui-icon layui-icon-cart-simple', '', 0, 2, '', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-30 02:17:40'); +INSERT INTO `sys_menu_copy2` VALUES (38, 37, '分类管理', '', 'products/classifys', 0, 1, 'products:classifys:view', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:26:54'); +INSERT INTO `sys_menu_copy2` VALUES (39, 38, '查询分类', '', '', 1, 1, 'products:classifys:list', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy2` VALUES (40, 38, '添加分类', '', '', 1, 2, 'products:classifys:save', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy2` VALUES (41, 38, '修改分类', '', '', 1, 3, 'products:classifys:update', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy2` VALUES (42, 38, '删除分类', '', '', 1, 4, 'products:classifys:remove', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy2` VALUES (43, 37, '商品管理', '', 'products/products', 0, 3, 'products:products:view', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-06-05 15:51:44'); +INSERT INTO `sys_menu_copy2` VALUES (44, 43, '查询商品', '', '', 1, 1, 'products:products:list', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy2` VALUES (45, 43, '添加商品', '', '', 1, 2, 'products:products:save', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy2` VALUES (46, 43, '修改商品', '', '', 1, 3, 'products:products:update', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy2` VALUES (47, 43, '删除商品', '', '', 1, 4, 'products:products:remove', '_self', NULL, 0, 0, '2021-03-27 20:23:20', '2021-03-27 20:23:20'); +INSERT INTO `sys_menu_copy2` VALUES (48, 0, '卡密管理', 'layui-icon layui-icon-template-1', '', 0, 3, '', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-30 02:18:38'); +INSERT INTO `sys_menu_copy2` VALUES (49, 48, '卡密管理', '', 'carmi/cards', 0, 2, 'carmi:cards:view', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:46:41'); +INSERT INTO `sys_menu_copy2` VALUES (50, 49, '查询卡密', '', '', 1, 1, 'carmi:cards:list', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:34:17'); +INSERT INTO `sys_menu_copy2` VALUES (51, 54, '添加卡密', '', '', 1, 2, 'carmi:cards:save', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:46:54'); +INSERT INTO `sys_menu_copy2` VALUES (52, 49, '修改卡密', '', '', 1, 3, 'carmi:cards:update', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:34:17'); +INSERT INTO `sys_menu_copy2` VALUES (53, 49, '删除卡密', '', '', 1, 4, 'carmi:cards:remove', '_self', NULL, 0, 0, '2021-03-28 00:34:17', '2021-03-28 00:34:17'); +INSERT INTO `sys_menu_copy2` VALUES (54, 48, '添加卡密', '', 'carmi/cards/add', 0, 1, 'carmi:cards:view', '_self', NULL, 0, 0, '2021-03-28 00:46:11', '2021-03-28 00:46:26'); +INSERT INTO `sys_menu_copy2` VALUES (55, 48, '售出卡密', '', 'carmi/cards/sold', 0, 3, 'carmi:cards:view', '_self', NULL, 0, 1, '2021-03-28 14:36:53', '2021-11-02 15:12:47'); +INSERT INTO `sys_menu_copy2` VALUES (56, 43, '查询卡密', '', '', 1, 1, 'carmi:cards:list', '_self', NULL, 0, 0, '2021-03-28 14:37:26', '2021-11-10 03:03:13'); +INSERT INTO `sys_menu_copy2` VALUES (57, 0, '系统配置', 'layui-icon layui-icon-set-fill', '', 0, 996, '', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-11-10 16:40:55'); +INSERT INTO `sys_menu_copy2` VALUES (58, 57, '支付配置', '', 'settings/pays', 0, 2, 'settings:pays:view', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-07-04 04:01:04'); +INSERT INTO `sys_menu_copy2` VALUES (59, 58, '查询支付配置', '', '', 1, 1, 'settings:pays:list', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu_copy2` VALUES (60, 58, '添加支付配置', '', '', 1, 2, 'settings:pays:save', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu_copy2` VALUES (61, 58, '修改支付配置', '', '', 1, 3, 'settings:pays:update', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu_copy2` VALUES (62, 58, '删除支付配置', '', '', 1, 4, 'settings:pays:remove', '_self', NULL, 0, 0, '2021-03-29 11:07:27', '2021-03-29 11:07:27'); +INSERT INTO `sys_menu_copy2` VALUES (63, 0, '订单管理', 'layui-icon layui-icon-rmb', '', 0, 4, '', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-30 02:18:55'); +INSERT INTO `sys_menu_copy2` VALUES (64, 63, '订单流水', '', 'orders/orders', 0, 1, 'orders:orders:view', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 17:01:42'); +INSERT INTO `sys_menu_copy2` VALUES (65, 64, '查询订单表', '', '', 1, 1, 'orders:orders:list', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu_copy2` VALUES (66, 64, '添加订单表', '', '', 1, 2, 'orders:orders:save', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu_copy2` VALUES (67, 64, '修改订单表', '', '', 1, 3, 'orders:orders:update', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu_copy2` VALUES (68, 64, '删除订单表', '', '', 1, 4, 'orders:orders:remove', '_self', NULL, 0, 0, '2021-03-29 16:26:07', '2021-03-29 16:26:07'); +INSERT INTO `sys_menu_copy2` VALUES (69, 0, '卡密订单关联', 'layui-icon layui-icon-senior', '', 0, 999, 'carmi:orderCard:view', '_self', NULL, 1, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:33'); +INSERT INTO `sys_menu_copy2` VALUES (70, 69, '订单关联卡密表管理', '', 'carmi/orderCard', 0, 1, 'carmi:orderCard:view', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:29'); +INSERT INTO `sys_menu_copy2` VALUES (71, 70, '查询订单关联卡密表', '', '', 1, 1, 'carmi:orderCard:list', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:56'); +INSERT INTO `sys_menu_copy2` VALUES (72, 70, '添加订单关联卡密表', '', '', 1, 2, 'carmi:orderCard:save', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:57:51'); +INSERT INTO `sys_menu_copy2` VALUES (73, 70, '修改订单关联卡密表', '', '', 1, 3, 'carmi:orderCard:update', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:58:02'); +INSERT INTO `sys_menu_copy2` VALUES (74, 70, '删除订单关联卡密表', '', '', 1, 4, 'carmi:orderCard:remove', '_self', NULL, 0, 1, '2021-03-29 22:28:45', '2021-11-02 16:58:05'); +INSERT INTO `sys_menu_copy2` VALUES (75, 0, '管理中心', 'layui-icon layui-icon-console', 'dashboard/workplace', 0, 1, 'dashboard:user:view', '_self', NULL, 0, 0, '2021-03-30 00:58:26', '2021-03-30 02:16:33'); +INSERT INTO `sys_menu_copy2` VALUES (76, 37, '添加商品', '', 'products/products/addProduct', 0, 2, 'products:products:view', '_self', NULL, 0, 0, '2021-06-05 15:51:32', '2021-06-05 15:52:52'); +INSERT INTO `sys_menu_copy2` VALUES (77, 0, 'website', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-06-06 02:17:34', '2021-06-06 02:19:37'); +INSERT INTO `sys_menu_copy2` VALUES (78, 57, '网站设置', '', 'website/website', 0, 4, 'website:website:view', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-07-04 04:01:28'); +INSERT INTO `sys_menu_copy2` VALUES (79, 78, '查询网站设置', '', '', 1, 1, 'website:website:list', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu_copy2` VALUES (80, 78, '添加网站设置', '', '', 1, 2, 'website:website:save', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu_copy2` VALUES (81, 78, '修改网站设置', '', '', 1, 3, 'website:website:update', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu_copy2` VALUES (82, 78, '删除网站设置', '', '', 1, 4, 'website:website:remove', '_self', NULL, 0, 0, '2021-06-06 02:17:34', '2021-06-06 02:17:34'); +INSERT INTO `sys_menu_copy2` VALUES (83, 0, '营销助手', 'layui-icon layui-icon-senior', '', 0, 5, '', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:54:20'); +INSERT INTO `sys_menu_copy2` VALUES (84, 83, '优惠券管理', '', 'settings/coupon', 0, 2, 'settings:coupon:view', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:55:51'); +INSERT INTO `sys_menu_copy2` VALUES (85, 84, '查询优惠券', '', '', 1, 1, 'settings:coupon:list', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu_copy2` VALUES (86, 84, '添加优惠券', '', '', 1, 2, 'settings:coupon:save', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu_copy2` VALUES (87, 84, '修改优惠券', '', '', 1, 3, 'settings:coupon:update', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu_copy2` VALUES (88, 84, '删除优惠券', '', '', 1, 4, 'settings:coupon:remove', '_self', NULL, 0, 0, '2021-06-23 07:44:46', '2021-06-23 07:44:46'); +INSERT INTO `sys_menu_copy2` VALUES (89, 83, '添加优惠券', '', 'settings/coupon/add', 0, 1, 'settings:coupon:view', '_self', NULL, 0, 0, '2021-06-23 07:55:44', '2021-06-23 07:56:13'); +INSERT INTO `sys_menu_copy2` VALUES (90, 0, 'theme', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-06-28 00:37:42', '2021-06-28 00:39:46'); +INSERT INTO `sys_menu_copy2` VALUES (91, 57, '主题配置', '', 'theme/theme', 0, 3, 'theme:theme:view', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:39:43'); +INSERT INTO `sys_menu_copy2` VALUES (92, 91, '查询主题配置', '', '', 1, 1, 'theme:theme:list', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu_copy2` VALUES (93, 91, '添加主题配置', '', '', 1, 2, 'theme:theme:save', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu_copy2` VALUES (94, 91, '修改主题配置', '', '', 1, 3, 'theme:theme:update', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu_copy2` VALUES (95, 91, '删除主题配置', '', '', 1, 4, 'theme:theme:remove', '_self', NULL, 0, 0, '2021-06-28 00:37:42', '2021-06-28 00:37:42'); +INSERT INTO `sys_menu_copy2` VALUES (96, 0, 'settings', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-07-04 03:59:22', '2021-07-04 04:00:42'); +INSERT INTO `sys_menu_copy2` VALUES (97, 57, '商店设置', '', 'settings/shopSettings', 0, 1, 'settings:shopSettings:view', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 04:01:37'); +INSERT INTO `sys_menu_copy2` VALUES (98, 97, '查询商店设置', '', '', 1, 1, 'settings:shopSettings:list', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu_copy2` VALUES (99, 97, '添加商店设置', '', '', 1, 2, 'settings:shopSettings:save', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu_copy2` VALUES (100, 97, '修改商店设置', '', '', 1, 3, 'settings:shopSettings:update', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu_copy2` VALUES (101, 97, '删除商店设置', '', '', 1, 4, 'settings:shopSettings:remove', '_self', NULL, 0, 0, '2021-07-04 03:59:22', '2021-07-04 03:59:22'); +INSERT INTO `sys_menu_copy2` VALUES (102, 57, '微信通知', '', 'wxpusher/send', 0, 2, 'settings:wxpusher:view', '_self', NULL, 0, 0, '2021-07-04 16:35:26', '2021-07-04 16:35:38'); +INSERT INTO `sys_menu_copy2` VALUES (103, 0, '内容管理', 'layui-icon layui-icon-senior', '', 0, 30, '', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 06:10:02'); +INSERT INTO `sys_menu_copy2` VALUES (104, 103, '文章管理', '', 'content/article', 0, 2, 'content:article:view', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-10 03:05:20'); +INSERT INTO `sys_menu_copy2` VALUES (105, 104, '查询文章表', '', '', 1, 1, 'content:article:list', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu_copy2` VALUES (106, 104, '添加文章表', '', '', 1, 2, 'content:article:save', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu_copy2` VALUES (107, 104, '修改文章表', '', '', 1, 3, 'content:article:update', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu_copy2` VALUES (108, 104, '删除文章表', '', '', 1, 4, 'content:article:remove', '_self', NULL, 0, 0, '2021-11-08 04:59:08', '2021-11-08 04:59:08'); +INSERT INTO `sys_menu_copy2` VALUES (109, 103, '添加文章', '', 'content/article/addArticle', 0, 1, 'content:article:view', '_self', NULL, 0, 0, '2021-11-08 06:23:01', '2021-11-08 06:23:35'); +INSERT INTO `sys_menu_copy2` VALUES (110, 109, '添加文章表', '', '', 1, 1, 'content:article:save', '_self', NULL, 0, 0, '2021-11-08 06:24:24', '2021-11-08 06:25:03'); +INSERT INTO `sys_menu_copy2` VALUES (111, 0, 'content', 'layui-icon layui-icon-senior', '', 0, 1, '', '_self', NULL, 0, 1, '2021-11-10 03:01:51', '2021-11-10 03:03:49'); +INSERT INTO `sys_menu_copy2` VALUES (112, 103, '首页轮播', '', 'content/carousel', 0, 4, 'content:carousel:view', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 08:30:59'); +INSERT INTO `sys_menu_copy2` VALUES (113, 112, '查询轮播图管理', '', '', 1, 1, 'content:carousel:list', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu_copy2` VALUES (114, 112, '添加轮播图管理', '', '', 1, 2, 'content:carousel:save', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu_copy2` VALUES (115, 112, '修改轮播图管理', '', '', 1, 3, 'content:carousel:update', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu_copy2` VALUES (116, 112, '删除轮播图管理', '', '', 1, 4, 'content:carousel:remove', '_self', NULL, 0, 0, '2021-11-10 03:01:51', '2021-11-10 03:01:51'); +INSERT INTO `sys_menu_copy2` VALUES (117, 103, '添加轮播图', '', 'content/carousel/addCarousel', 0, 3, 'content:carousel:view', '_self', NULL, 0, 1, '2021-11-10 03:05:12', '2021-11-10 08:30:37'); +INSERT INTO `sys_menu_copy2` VALUES (118, 117, '添加轮播图管理', '', '', 1, 1, 'content:carousel:save', '_self', NULL, 0, 0, '2021-11-10 03:06:39', '2021-11-10 03:06:39'); + +-- ---------------------------- +-- Table structure for sys_oper_record +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oper_record`; +CREATE TABLE `sys_oper_record` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` int NULL DEFAULT NULL COMMENT '用户id', + `model` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作模块', + `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作方法', + `url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '请求地址', + `request_method` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '请求方式', + `oper_method` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '调用方法', + `param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '请求参数', + `result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '返回结果', + `ip` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'ip地址', + `comments` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `spend_time` int NULL DEFAULT NULL COMMENT '请求耗时,单位毫秒', + `state` int NOT NULL DEFAULT 0 COMMENT '状态,0成功,1异常', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `user_id`(`user_id`) USING BTREE, + CONSTRAINT `sys_oper_record_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 1606 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_oper_record +-- ---------------------------- +INSERT INTO `sys_oper_record` VALUES (1125, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '127.0.0.1', NULL, 36, 0, '2023-07-31 11:53:27', '2023-07-31 11:53:27'); +INSERT INTO `sys_oper_record` VALUES (1126, 1, '文章表管理', '分页查询', '/content/article/page', 'GET', 'com.bomaos.content.controller.ArticleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 7, 0, '2023-07-31 11:53:42', '2023-07-31 11:53:42'); +INSERT INTO `sys_oper_record` VALUES (1127, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 3, 0, '2023-07-31 11:53:43', '2023-07-31 11:53:43'); +INSERT INTO `sys_oper_record` VALUES (1128, 1, '优惠券管理', '分页查询', '/settings/coupon/page', 'GET', 'com.bomaos.settings.controller.CouponController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 8, 0, '2023-07-31 11:53:46', '2023-07-31 11:53:46'); +INSERT INTO `sys_oper_record` VALUES (1129, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 4, 0, '2023-07-31 11:53:47', '2023-07-31 11:53:47'); +INSERT INTO `sys_oper_record` VALUES (1130, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 7, 0, '2023-07-31 11:53:49', '2023-07-31 11:53:49'); +INSERT INTO `sys_oper_record` VALUES (1131, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 19, 0, '2023-07-31 11:53:52', '2023-07-31 11:53:52'); +INSERT INTO `sys_oper_record` VALUES (1132, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 9, 0, '2023-07-31 11:53:54', '2023-07-31 11:53:54'); +INSERT INTO `sys_oper_record` VALUES (1133, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 25, 0, '2023-07-31 11:53:56', '2023-07-31 11:53:56'); +INSERT INTO `sys_oper_record` VALUES (1134, 1, '支付配置管理', '修改', '/settings/pays/update', 'POST', 'com.bomaos.settings.controller.PaysController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '127.0.0.1', NULL, 16, 0, '2023-07-31 11:55:10', '2023-07-31 11:55:10'); +INSERT INTO `sys_oper_record` VALUES (1135, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 13, 0, '2023-07-31 11:55:10', '2023-07-31 11:55:10'); +INSERT INTO `sys_oper_record` VALUES (1136, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"2\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 30, 0, '2023-07-31 11:55:12', '2023-07-31 11:55:12'); +INSERT INTO `sys_oper_record` VALUES (1137, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '127.0.0.1', NULL, 19, 0, '2023-07-31 11:55:21', '2023-07-31 11:55:21'); +INSERT INTO `sys_oper_record` VALUES (1138, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-27 18:57:08', '2026-01-27 18:57:08'); +INSERT INTO `sys_oper_record` VALUES (1139, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 11, 0, '2026-01-27 18:57:08', '2026-01-27 18:57:08'); +INSERT INTO `sys_oper_record` VALUES (1140, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 18:57:13', '2026-01-27 18:57:13'); +INSERT INTO `sys_oper_record` VALUES (1141, 1, '分类管理', '添加', '/products/classifys/save', 'POST', 'com.bomaos.products.controller.ClassifysController.save', NULL, '{\"msg\":\"添加成功\",\"code\":0}', '198.18.0.1', NULL, 10, 0, '2026-01-27 18:57:17', '2026-01-27 18:57:17'); +INSERT INTO `sys_oper_record` VALUES (1142, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-01-27 18:57:17', '2026-01-27 18:57:17'); +INSERT INTO `sys_oper_record` VALUES (1143, 1, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260127/ce075246aff548059be7bf718a1bdc8c.png\",\"dir\":\"/20260127\",\"url\":\"20260127/ce075246aff548059be7bf718a1bdc8c.png\"}', '198.18.0.1', NULL, 12, 0, '2026-01-27 18:58:00', '2026-01-27 18:58:00'); +INSERT INTO `sys_oper_record` VALUES (1144, 1, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260127/a87c977970b143d4b23ac5c9505d0aa3.png\",\"dir\":\"/20260127\",\"url\":\"20260127/a87c977970b143d4b23ac5c9505d0aa3.png\"}', '198.18.0.1', NULL, 0, 0, '2026-01-27 18:58:03', '2026-01-27 18:58:03'); +INSERT INTO `sys_oper_record` VALUES (1145, 1, '商品管理', '添加', '/products/products/save', 'POST', 'com.bomaos.products.controller.ProductsController.save', NULL, '{\"msg\":\"添加商品成功\",\"code\":0}', '198.18.0.1', NULL, 8, 0, '2026-01-27 18:58:11', '2026-01-27 18:58:11'); +INSERT INTO `sys_oper_record` VALUES (1146, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 22, 0, '2026-01-27 18:58:13', '2026-01-27 18:58:13'); +INSERT INTO `sys_oper_record` VALUES (1147, 1, '优惠券管理', '分页查询', '/settings/coupon/page', 'GET', 'com.bomaos.settings.controller.CouponController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-27 18:58:21', '2026-01-27 18:58:21'); +INSERT INTO `sys_oper_record` VALUES (1148, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 1, 0, '2026-01-27 18:58:25', '2026-01-27 18:58:25'); +INSERT INTO `sys_oper_record` VALUES (1149, 1, '优惠券管理', '分页查询', '/settings/coupon/page', 'GET', 'com.bomaos.settings.controller.CouponController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-27 18:58:26', '2026-01-27 18:58:26'); +INSERT INTO `sys_oper_record` VALUES (1150, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 13, 0, '2026-01-27 18:58:28', '2026-01-27 18:58:28'); +INSERT INTO `sys_oper_record` VALUES (1151, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-27 18:58:28', '2026-01-27 18:58:28'); +INSERT INTO `sys_oper_record` VALUES (1152, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-27 18:58:30', '2026-01-27 18:58:30'); +INSERT INTO `sys_oper_record` VALUES (1153, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-27 18:58:31', '2026-01-27 18:58:31'); +INSERT INTO `sys_oper_record` VALUES (1154, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-27 18:58:32', '2026-01-27 18:58:32'); +INSERT INTO `sys_oper_record` VALUES (1155, 1, '主题配置管理', '分页查询', '/theme/theme/page', 'GET', 'com.bomaos.theme.controller.ThemeController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-27 18:58:55', '2026-01-27 18:58:55'); +INSERT INTO `sys_oper_record` VALUES (1156, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 12, 0, '2026-01-27 18:58:57', '2026-01-27 18:58:57'); +INSERT INTO `sys_oper_record` VALUES (1157, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:00:11', '2026-01-27 19:00:11'); +INSERT INTO `sys_oper_record` VALUES (1158, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 1, 0, '2026-01-27 19:00:14', '2026-01-27 19:00:14'); +INSERT INTO `sys_oper_record` VALUES (1159, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:00:15', '2026-01-27 19:00:15'); +INSERT INTO `sys_oper_record` VALUES (1160, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 1, 0, '2026-01-27 19:00:23', '2026-01-27 19:00:23'); +INSERT INTO `sys_oper_record` VALUES (1161, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 1, 0, '2026-01-27 19:00:26', '2026-01-27 19:00:26'); +INSERT INTO `sys_oper_record` VALUES (1162, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"],\"dir\":[\"20260127\"]}', NULL, '198.18.0.1', NULL, 0, 0, '2026-01-27 19:00:26', '2026-01-27 19:00:26'); +INSERT INTO `sys_oper_record` VALUES (1163, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-27 19:00:27', '2026-01-27 19:00:27'); +INSERT INTO `sys_oper_record` VALUES (1164, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-27 19:00:31', '2026-01-27 19:00:31'); +INSERT INTO `sys_oper_record` VALUES (1165, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 1, 0, '2026-01-27 19:00:32', '2026-01-27 19:00:32'); +INSERT INTO `sys_oper_record` VALUES (1166, 1, '优惠券管理', '分页查询', '/settings/coupon/page', 'GET', 'com.bomaos.settings.controller.CouponController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-27 19:00:36', '2026-01-27 19:00:36'); +INSERT INTO `sys_oper_record` VALUES (1167, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:02:15', '2026-01-27 19:02:15'); +INSERT INTO `sys_oper_record` VALUES (1168, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:03:45', '2026-01-27 19:03:45'); +INSERT INTO `sys_oper_record` VALUES (1169, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:03:47', '2026-01-27 19:03:47'); +INSERT INTO `sys_oper_record` VALUES (1170, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:03:48', '2026-01-27 19:03:48'); +INSERT INTO `sys_oper_record` VALUES (1171, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-01-27 19:05:10', '2026-01-27 19:05:10'); +INSERT INTO `sys_oper_record` VALUES (1172, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 14, 0, '2026-01-27 19:05:12', '2026-01-27 19:05:12'); +INSERT INTO `sys_oper_record` VALUES (1173, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:05:21', '2026-01-27 19:05:21'); +INSERT INTO `sys_oper_record` VALUES (1174, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:05:23', '2026-01-27 19:05:23'); +INSERT INTO `sys_oper_record` VALUES (1175, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-27 19:05:24', '2026-01-27 19:05:24'); +INSERT INTO `sys_oper_record` VALUES (1176, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-27 19:05:25', '2026-01-27 19:05:25'); +INSERT INTO `sys_oper_record` VALUES (1177, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 11, 0, '2026-01-27 19:05:38', '2026-01-27 19:05:38'); +INSERT INTO `sys_oper_record` VALUES (1178, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:05:41', '2026-01-27 19:05:41'); +INSERT INTO `sys_oper_record` VALUES (1179, 1, '商品管理', '查询全部', '/products/products/getProductList', 'POST', 'com.bomaos.products.controller.ProductsController.getProductList', '{\"id\":[\"3\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-27 19:05:43', '2026-01-27 19:05:43'); +INSERT INTO `sys_oper_record` VALUES (1180, 1, '卡密管理', '添加', '/carmi/cards/save', 'POST', 'com.bomaos.carmi.controller.CardsController.save', NULL, '{\"msg\":\"批量添加卡密成功!\",\"code\":0}', '198.18.0.1', NULL, 22, 0, '2026-01-27 19:05:54', '2026-01-27 19:05:54'); +INSERT INTO `sys_oper_record` VALUES (1181, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 20, 0, '2026-01-27 19:05:55', '2026-01-27 19:05:55'); +INSERT INTO `sys_oper_record` VALUES (1182, 1, '支付', '提交支付', '/pay/TUD20260127190620tccHRD', 'GET', 'com.bomaos.reception.controller.OrderController.pay', '{}', NULL, '198.18.0.1', NULL, 13, 0, '2026-01-27 19:06:21', '2026-01-27 19:06:21'); +INSERT INTO `sys_oper_record` VALUES (1183, 1, '支付', '提交支付', '/pay/TUD20260127190635xk1N9w', 'GET', 'com.bomaos.reception.controller.OrderController.pay', '{}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-27 19:06:36', '2026-01-27 19:06:36'); +INSERT INTO `sys_oper_record` VALUES (1184, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-27 19:07:07', '2026-01-27 19:07:07'); +INSERT INTO `sys_oper_record` VALUES (1185, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 10, 0, '2026-01-27 19:07:08', '2026-01-27 19:07:08'); +INSERT INTO `sys_oper_record` VALUES (1186, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-27 19:07:08', '2026-01-27 19:07:08'); +INSERT INTO `sys_oper_record` VALUES (1187, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 18, 0, '2026-01-27 19:07:10', '2026-01-27 19:07:10'); +INSERT INTO `sys_oper_record` VALUES (1188, 1, '优惠券管理', '分页查询', '/settings/coupon/page', 'GET', 'com.bomaos.settings.controller.CouponController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:07:12', '2026-01-27 19:07:12'); +INSERT INTO `sys_oper_record` VALUES (1189, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 21, 0, '2026-01-27 19:20:30', '2026-01-27 19:20:30'); +INSERT INTO `sys_oper_record` VALUES (1190, 1, '商品管理', '查询全部', '/products/products/getProductList', 'POST', 'com.bomaos.products.controller.ProductsController.getProductList', '{\"id\":[\"3\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:20:33', '2026-01-27 19:20:33'); +INSERT INTO `sys_oper_record` VALUES (1191, 1, '商品管理', '查询全部', '/products/products/getProductList', 'POST', 'com.bomaos.products.controller.ProductsController.getProductList', '{\"id\":[\"3\"]}', NULL, '198.18.0.1', NULL, 1, 0, '2026-01-27 19:20:36', '2026-01-27 19:20:36'); +INSERT INTO `sys_oper_record` VALUES (1192, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 15, 0, '2026-01-27 19:22:15', '2026-01-27 19:22:15'); +INSERT INTO `sys_oper_record` VALUES (1193, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 24, 0, '2026-01-27 19:22:32', '2026-01-27 19:22:32'); +INSERT INTO `sys_oper_record` VALUES (1194, 1, '卡密管理', '导出指定的数据', '/carmi/cards/export', 'GET', 'com.bomaos.carmi.controller.CardsController.exportCardSecret', '{\"productId\":[\"10\"],\"status\":[\"0\"],\"sellType\":[\"0\"]}', NULL, '198.18.0.1', NULL, 448, 0, '2026-01-27 19:22:32', '2026-01-27 19:22:32'); +INSERT INTO `sys_oper_record` VALUES (1195, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-01-27 19:22:58', '2026-01-27 19:22:58'); +INSERT INTO `sys_oper_record` VALUES (1196, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 15, 0, '2026-01-27 19:23:06', '2026-01-27 19:23:06'); +INSERT INTO `sys_oper_record` VALUES (1197, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-27 19:23:08', '2026-01-27 19:23:08'); +INSERT INTO `sys_oper_record` VALUES (1198, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 15, 0, '2026-01-27 19:23:10', '2026-01-27 19:23:10'); +INSERT INTO `sys_oper_record` VALUES (1199, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 41, 0, '2026-01-27 19:26:33', '2026-01-27 19:26:33'); +INSERT INTO `sys_oper_record` VALUES (1200, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 14, 0, '2026-01-27 19:26:34', '2026-01-27 19:26:34'); +INSERT INTO `sys_oper_record` VALUES (1201, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-27 19:26:35', '2026-01-27 19:26:35'); +INSERT INTO `sys_oper_record` VALUES (1202, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-27 19:26:53', '2026-01-27 19:26:53'); +INSERT INTO `sys_oper_record` VALUES (1203, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-27 19:26:54', '2026-01-27 19:26:54'); +INSERT INTO `sys_oper_record` VALUES (1204, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-27 19:26:55', '2026-01-27 19:26:55'); +INSERT INTO `sys_oper_record` VALUES (1205, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 18, 0, '2026-01-27 19:27:08', '2026-01-27 19:27:08'); +INSERT INTO `sys_oper_record` VALUES (1206, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-27 19:27:08', '2026-01-27 19:27:08'); +INSERT INTO `sys_oper_record` VALUES (1207, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-27 19:27:09', '2026-01-27 19:27:09'); +INSERT INTO `sys_oper_record` VALUES (1208, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-27 19:27:09', '2026-01-27 19:27:09'); +INSERT INTO `sys_oper_record` VALUES (1209, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-27 19:27:10', '2026-01-27 19:27:10'); +INSERT INTO `sys_oper_record` VALUES (1210, 1, '优惠券管理', '分页查询', '/settings/coupon/page', 'GET', 'com.bomaos.settings.controller.CouponController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:27:11', '2026-01-27 19:27:11'); +INSERT INTO `sys_oper_record` VALUES (1211, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-27 19:27:12', '2026-01-27 19:27:12'); +INSERT INTO `sys_oper_record` VALUES (1212, 1, '文章表管理', '分页查询', '/content/article/page', 'GET', 'com.bomaos.content.controller.ArticleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:27:13', '2026-01-27 19:27:13'); +INSERT INTO `sys_oper_record` VALUES (1213, 1, '文章表管理', '分页查询', '/content/article/page', 'GET', 'com.bomaos.content.controller.ArticleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"],\"sort\":[\"seeNumber\"],\"order\":[\"asc\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-27 19:27:19', '2026-01-27 19:27:19'); +INSERT INTO `sys_oper_record` VALUES (1214, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '103.151.173.210', NULL, 12, 0, '2026-01-27 20:13:17', '2026-01-27 20:13:17'); +INSERT INTO `sys_oper_record` VALUES (1215, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 64, 0, '2026-01-28 13:40:15', '2026-01-28 13:40:15'); +INSERT INTO `sys_oper_record` VALUES (1216, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 13, 0, '2026-01-28 13:40:20', '2026-01-28 13:40:20'); +INSERT INTO `sys_oper_record` VALUES (1217, 1, '主题配置管理', '分页查询', '/theme/theme/page', 'GET', 'com.bomaos.theme.controller.ThemeController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 13:40:25', '2026-01-28 13:40:25'); +INSERT INTO `sys_oper_record` VALUES (1218, 1, '优惠券管理', '分页查询', '/settings/coupon/page', 'GET', 'com.bomaos.settings.controller.CouponController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 13:40:28', '2026-01-28 13:40:28'); +INSERT INTO `sys_oper_record` VALUES (1219, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 13:40:29', '2026-01-28 13:40:29'); +INSERT INTO `sys_oper_record` VALUES (1220, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 22, 0, '2026-01-28 14:01:22', '2026-01-28 14:01:22'); +INSERT INTO `sys_oper_record` VALUES (1221, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 33, 0, '2026-01-28 14:01:25', '2026-01-28 14:01:25'); +INSERT INTO `sys_oper_record` VALUES (1222, 1, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260128/9961eda568d4441099938a2b52608bbf.png\",\"dir\":\"/20260128\",\"url\":\"20260128/9961eda568d4441099938a2b52608bbf.png\"}', '198.18.0.1', NULL, 8, 0, '2026-01-28 14:01:32', '2026-01-28 14:01:32'); +INSERT INTO `sys_oper_record` VALUES (1223, 1, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260128/fbc715ab22de4b81a62f52cee25b9bf6.png\",\"dir\":\"/20260128\",\"url\":\"20260128/fbc715ab22de4b81a62f52cee25b9bf6.png\"}', '198.18.0.1', NULL, 1, 0, '2026-01-28 14:01:36', '2026-01-28 14:01:36'); +INSERT INTO `sys_oper_record` VALUES (1224, 1, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 17, 0, '2026-01-28 14:01:37', '2026-01-28 14:01:37'); +INSERT INTO `sys_oper_record` VALUES (1225, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 0, 0, '2026-01-28 14:01:52', '2026-01-28 14:01:52'); +INSERT INTO `sys_oper_record` VALUES (1226, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"],\"dir\":[\"20260128\"]}', NULL, '198.18.0.1', NULL, 0, 0, '2026-01-28 14:01:52', '2026-01-28 14:01:52'); +INSERT INTO `sys_oper_record` VALUES (1227, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 0, 0, '2026-01-28 14:01:55', '2026-01-28 14:01:55'); +INSERT INTO `sys_oper_record` VALUES (1228, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"],\"dir\":[\"20260128\"]}', NULL, '198.18.0.1', NULL, 0, 0, '2026-01-28 14:01:55', '2026-01-28 14:01:55'); +INSERT INTO `sys_oper_record` VALUES (1229, 1, '登录日志', '分页查询', '/sys/loginRecord/page', 'GET', 'com.bomaos.common.system.controller.LoginRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 18, 0, '2026-01-28 14:01:56', '2026-01-28 14:01:56'); +INSERT INTO `sys_oper_record` VALUES (1230, 1, '操作日志', '分页查询', '/sys/operRecord/page', 'GET', 'com.bomaos.common.system.controller.OperRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 14:01:58', '2026-01-28 14:01:58'); +INSERT INTO `sys_oper_record` VALUES (1231, 1, '操作日志', '分页查询', '/sys/operRecord/page', 'GET', 'com.bomaos.common.system.controller.OperRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:02:01', '2026-01-28 14:02:01'); +INSERT INTO `sys_oper_record` VALUES (1232, 1, '登录日志', '分页查询', '/sys/loginRecord/page', 'GET', 'com.bomaos.common.system.controller.LoginRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:02:01', '2026-01-28 14:02:01'); +INSERT INTO `sys_oper_record` VALUES (1233, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 13, 0, '2026-01-28 14:02:02', '2026-01-28 14:02:02'); +INSERT INTO `sys_oper_record` VALUES (1234, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 14:02:03', '2026-01-28 14:02:03'); +INSERT INTO `sys_oper_record` VALUES (1235, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-28 14:02:03', '2026-01-28 14:02:03'); +INSERT INTO `sys_oper_record` VALUES (1236, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:02:04', '2026-01-28 14:02:04'); +INSERT INTO `sys_oper_record` VALUES (1237, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 50, 0, '2026-01-28 14:10:36', '2026-01-28 14:10:36'); +INSERT INTO `sys_oper_record` VALUES (1238, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 14, 0, '2026-01-28 14:10:55', '2026-01-28 14:10:55'); +INSERT INTO `sys_oper_record` VALUES (1239, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 49, 0, '2026-01-28 14:15:53', '2026-01-28 14:15:53'); +INSERT INTO `sys_oper_record` VALUES (1240, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 14:15:59', '2026-01-28 14:15:59'); +INSERT INTO `sys_oper_record` VALUES (1241, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:17:03', '2026-01-28 14:17:03'); +INSERT INTO `sys_oper_record` VALUES (1242, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:17:22', '2026-01-28 14:17:22'); +INSERT INTO `sys_oper_record` VALUES (1243, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:23', '2026-01-28 14:17:23'); +INSERT INTO `sys_oper_record` VALUES (1244, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:23', '2026-01-28 14:17:23'); +INSERT INTO `sys_oper_record` VALUES (1245, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:24', '2026-01-28 14:17:24'); +INSERT INTO `sys_oper_record` VALUES (1246, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:39', '2026-01-28 14:17:39'); +INSERT INTO `sys_oper_record` VALUES (1247, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:39', '2026-01-28 14:17:39'); +INSERT INTO `sys_oper_record` VALUES (1248, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:40', '2026-01-28 14:17:40'); +INSERT INTO `sys_oper_record` VALUES (1249, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:40', '2026-01-28 14:17:40'); +INSERT INTO `sys_oper_record` VALUES (1250, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-28 14:17:40', '2026-01-28 14:17:40'); +INSERT INTO `sys_oper_record` VALUES (1251, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:41', '2026-01-28 14:17:41'); +INSERT INTO `sys_oper_record` VALUES (1252, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:41', '2026-01-28 14:17:41'); +INSERT INTO `sys_oper_record` VALUES (1253, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:41', '2026-01-28 14:17:41'); +INSERT INTO `sys_oper_record` VALUES (1254, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:41', '2026-01-28 14:17:41'); +INSERT INTO `sys_oper_record` VALUES (1255, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:41', '2026-01-28 14:17:41'); +INSERT INTO `sys_oper_record` VALUES (1256, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:41', '2026-01-28 14:17:41'); +INSERT INTO `sys_oper_record` VALUES (1257, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:42', '2026-01-28 14:17:42'); +INSERT INTO `sys_oper_record` VALUES (1258, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:42', '2026-01-28 14:17:42'); +INSERT INTO `sys_oper_record` VALUES (1259, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:42', '2026-01-28 14:17:42'); +INSERT INTO `sys_oper_record` VALUES (1260, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:42', '2026-01-28 14:17:42'); +INSERT INTO `sys_oper_record` VALUES (1261, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:42', '2026-01-28 14:17:42'); +INSERT INTO `sys_oper_record` VALUES (1262, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:43', '2026-01-28 14:17:43'); +INSERT INTO `sys_oper_record` VALUES (1263, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:43', '2026-01-28 14:17:43'); +INSERT INTO `sys_oper_record` VALUES (1264, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:43', '2026-01-28 14:17:43'); +INSERT INTO `sys_oper_record` VALUES (1265, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:43', '2026-01-28 14:17:43'); +INSERT INTO `sys_oper_record` VALUES (1266, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:43', '2026-01-28 14:17:43'); +INSERT INTO `sys_oper_record` VALUES (1267, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:43', '2026-01-28 14:17:43'); +INSERT INTO `sys_oper_record` VALUES (1268, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:44', '2026-01-28 14:17:44'); +INSERT INTO `sys_oper_record` VALUES (1269, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:44', '2026-01-28 14:17:44'); +INSERT INTO `sys_oper_record` VALUES (1270, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:44', '2026-01-28 14:17:44'); +INSERT INTO `sys_oper_record` VALUES (1271, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:44', '2026-01-28 14:17:44'); +INSERT INTO `sys_oper_record` VALUES (1272, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:44', '2026-01-28 14:17:44'); +INSERT INTO `sys_oper_record` VALUES (1273, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:44', '2026-01-28 14:17:44'); +INSERT INTO `sys_oper_record` VALUES (1274, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:45', '2026-01-28 14:17:45'); +INSERT INTO `sys_oper_record` VALUES (1275, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:45', '2026-01-28 14:17:45'); +INSERT INTO `sys_oper_record` VALUES (1276, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:45', '2026-01-28 14:17:45'); +INSERT INTO `sys_oper_record` VALUES (1277, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-28 14:17:45', '2026-01-28 14:17:45'); +INSERT INTO `sys_oper_record` VALUES (1278, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:45', '2026-01-28 14:17:45'); +INSERT INTO `sys_oper_record` VALUES (1279, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-28 14:17:45', '2026-01-28 14:17:45'); +INSERT INTO `sys_oper_record` VALUES (1280, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:46', '2026-01-28 14:17:46'); +INSERT INTO `sys_oper_record` VALUES (1281, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:46', '2026-01-28 14:17:46'); +INSERT INTO `sys_oper_record` VALUES (1282, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:17:46', '2026-01-28 14:17:46'); +INSERT INTO `sys_oper_record` VALUES (1283, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:17:46', '2026-01-28 14:17:46'); +INSERT INTO `sys_oper_record` VALUES (1284, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:17:46', '2026-01-28 14:17:46'); +INSERT INTO `sys_oper_record` VALUES (1285, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-28 14:17:46', '2026-01-28 14:17:46'); +INSERT INTO `sys_oper_record` VALUES (1286, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:17:47', '2026-01-28 14:17:47'); +INSERT INTO `sys_oper_record` VALUES (1287, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-28 14:17:47', '2026-01-28 14:17:47'); +INSERT INTO `sys_oper_record` VALUES (1288, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 53, 0, '2026-01-28 14:21:58', '2026-01-28 14:21:58'); +INSERT INTO `sys_oper_record` VALUES (1289, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-28 14:22:01', '2026-01-28 14:22:01'); +INSERT INTO `sys_oper_record` VALUES (1290, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-28 14:22:01', '2026-01-28 14:22:01'); +INSERT INTO `sys_oper_record` VALUES (1291, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:22:23', '2026-01-28 14:22:23'); +INSERT INTO `sys_oper_record` VALUES (1292, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 12, 0, '2026-01-28 14:22:25', '2026-01-28 14:22:25'); +INSERT INTO `sys_oper_record` VALUES (1293, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:24:13', '2026-01-28 14:24:13'); +INSERT INTO `sys_oper_record` VALUES (1294, 1, '登录日志', '分页查询', '/sys/loginRecord/page', 'GET', 'com.bomaos.common.system.controller.LoginRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 14:24:15', '2026-01-28 14:24:15'); +INSERT INTO `sys_oper_record` VALUES (1295, 1, '操作日志', '分页查询', '/sys/operRecord/page', 'GET', 'com.bomaos.common.system.controller.OperRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 14:24:16', '2026-01-28 14:24:16'); +INSERT INTO `sys_oper_record` VALUES (1296, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-28 14:24:16', '2026-01-28 14:24:16'); +INSERT INTO `sys_oper_record` VALUES (1297, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 14:24:17', '2026-01-28 14:24:17'); +INSERT INTO `sys_oper_record` VALUES (1298, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 14:24:17', '2026-01-28 14:24:17'); +INSERT INTO `sys_oper_record` VALUES (1299, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-28 14:32:41', '2026-01-28 14:32:41'); +INSERT INTO `sys_oper_record` VALUES (1300, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 14:32:44', '2026-01-28 14:32:44'); +INSERT INTO `sys_oper_record` VALUES (1301, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:33:18', '2026-01-28 14:33:18'); +INSERT INTO `sys_oper_record` VALUES (1302, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:33:20', '2026-01-28 14:33:20'); +INSERT INTO `sys_oper_record` VALUES (1303, 1, '菜单管理', '修改', '/sys/menu/update', 'POST', 'com.bomaos.common.system.controller.MenuController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 11, 0, '2026-01-28 14:33:40', '2026-01-28 14:33:40'); +INSERT INTO `sys_oper_record` VALUES (1304, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:33:40', '2026-01-28 14:33:40'); +INSERT INTO `sys_oper_record` VALUES (1305, 1, '菜单管理', '修改', '/sys/menu/update', 'POST', 'com.bomaos.common.system.controller.MenuController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 7, 0, '2026-01-28 14:34:01', '2026-01-28 14:34:01'); +INSERT INTO `sys_oper_record` VALUES (1306, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 14:34:01', '2026-01-28 14:34:01'); +INSERT INTO `sys_oper_record` VALUES (1307, 1, '菜单管理', '修改', '/sys/menu/update', 'POST', 'com.bomaos.common.system.controller.MenuController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 7, 0, '2026-01-28 14:34:18', '2026-01-28 14:34:18'); +INSERT INTO `sys_oper_record` VALUES (1308, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:34:18', '2026-01-28 14:34:18'); +INSERT INTO `sys_oper_record` VALUES (1309, 1, '菜单管理', '修改', '/sys/menu/update', 'POST', 'com.bomaos.common.system.controller.MenuController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 7, 0, '2026-01-28 14:34:25', '2026-01-28 14:34:25'); +INSERT INTO `sys_oper_record` VALUES (1310, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:34:25', '2026-01-28 14:34:25'); +INSERT INTO `sys_oper_record` VALUES (1311, 1, '菜单管理', '修改', '/sys/menu/update', 'POST', 'com.bomaos.common.system.controller.MenuController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 6, 0, '2026-01-28 14:34:32', '2026-01-28 14:34:32'); +INSERT INTO `sys_oper_record` VALUES (1312, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:34:32', '2026-01-28 14:34:32'); +INSERT INTO `sys_oper_record` VALUES (1313, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:34:39', '2026-01-28 14:34:39'); +INSERT INTO `sys_oper_record` VALUES (1314, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:34:40', '2026-01-28 14:34:40'); +INSERT INTO `sys_oper_record` VALUES (1315, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 14:34:41', '2026-01-28 14:34:41'); +INSERT INTO `sys_oper_record` VALUES (1316, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 14:34:41', '2026-01-28 14:34:41'); +INSERT INTO `sys_oper_record` VALUES (1317, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:34:42', '2026-01-28 14:34:42'); +INSERT INTO `sys_oper_record` VALUES (1318, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:34:47', '2026-01-28 14:34:47'); +INSERT INTO `sys_oper_record` VALUES (1319, 1, '菜单管理', '修改', '/sys/menu/update', 'POST', 'com.bomaos.common.system.controller.MenuController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 6, 0, '2026-01-28 14:35:11', '2026-01-28 14:35:11'); +INSERT INTO `sys_oper_record` VALUES (1320, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:35:11', '2026-01-28 14:35:11'); +INSERT INTO `sys_oper_record` VALUES (1321, 1, '菜单管理', '修改', '/sys/menu/update', 'POST', 'com.bomaos.common.system.controller.MenuController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 6, 0, '2026-01-28 14:35:20', '2026-01-28 14:35:20'); +INSERT INTO `sys_oper_record` VALUES (1322, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 14:35:20', '2026-01-28 14:35:20'); +INSERT INTO `sys_oper_record` VALUES (1323, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:35:22', '2026-01-28 14:35:22'); +INSERT INTO `sys_oper_record` VALUES (1324, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:35:25', '2026-01-28 14:35:25'); +INSERT INTO `sys_oper_record` VALUES (1325, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:35:25', '2026-01-28 14:35:25'); +INSERT INTO `sys_oper_record` VALUES (1326, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:35:45', '2026-01-28 14:35:45'); +INSERT INTO `sys_oper_record` VALUES (1327, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:35:49', '2026-01-28 14:35:49'); +INSERT INTO `sys_oper_record` VALUES (1328, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:36:17', '2026-01-28 14:36:17'); +INSERT INTO `sys_oper_record` VALUES (1329, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:36:22', '2026-01-28 14:36:22'); +INSERT INTO `sys_oper_record` VALUES (1330, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:36:25', '2026-01-28 14:36:25'); +INSERT INTO `sys_oper_record` VALUES (1331, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:36:28', '2026-01-28 14:36:28'); +INSERT INTO `sys_oper_record` VALUES (1332, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 14:36:52', '2026-01-28 14:36:52'); +INSERT INTO `sys_oper_record` VALUES (1333, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:36:53', '2026-01-28 14:36:53'); +INSERT INTO `sys_oper_record` VALUES (1334, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:36:56', '2026-01-28 14:36:56'); +INSERT INTO `sys_oper_record` VALUES (1335, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 10, 0, '2026-01-28 14:44:56', '2026-01-28 14:44:56'); +INSERT INTO `sys_oper_record` VALUES (1336, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:44:56', '2026-01-28 14:44:56'); +INSERT INTO `sys_oper_record` VALUES (1337, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:46:45', '2026-01-28 14:46:45'); +INSERT INTO `sys_oper_record` VALUES (1338, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-28 14:46:48', '2026-01-28 14:46:48'); +INSERT INTO `sys_oper_record` VALUES (1339, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:46:49', '2026-01-28 14:46:49'); +INSERT INTO `sys_oper_record` VALUES (1340, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:46:51', '2026-01-28 14:46:51'); +INSERT INTO `sys_oper_record` VALUES (1341, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:46:58', '2026-01-28 14:46:58'); +INSERT INTO `sys_oper_record` VALUES (1342, 1, '菜单管理', '修改', '/sys/menu/update', 'POST', 'com.bomaos.common.system.controller.MenuController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 7, 0, '2026-01-28 14:47:29', '2026-01-28 14:47:29'); +INSERT INTO `sys_oper_record` VALUES (1343, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:47:29', '2026-01-28 14:47:29'); +INSERT INTO `sys_oper_record` VALUES (1344, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:47:36', '2026-01-28 14:47:36'); +INSERT INTO `sys_oper_record` VALUES (1345, 1, '登录日志', '分页查询', '/sys/loginRecord/page', 'GET', 'com.bomaos.common.system.controller.LoginRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:47:43', '2026-01-28 14:47:43'); +INSERT INTO `sys_oper_record` VALUES (1346, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:47:45', '2026-01-28 14:47:45'); +INSERT INTO `sys_oper_record` VALUES (1347, 1, '菜单管理', '修改', '/sys/menu/update', 'POST', 'com.bomaos.common.system.controller.MenuController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 7, 0, '2026-01-28 14:47:59', '2026-01-28 14:47:59'); +INSERT INTO `sys_oper_record` VALUES (1348, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:47:59', '2026-01-28 14:47:59'); +INSERT INTO `sys_oper_record` VALUES (1349, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:48:03', '2026-01-28 14:48:03'); +INSERT INTO `sys_oper_record` VALUES (1350, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:48:28', '2026-01-28 14:48:28'); +INSERT INTO `sys_oper_record` VALUES (1351, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 14:48:57', '2026-01-28 14:48:57'); +INSERT INTO `sys_oper_record` VALUES (1352, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-28 14:49:06', '2026-01-28 14:49:06'); +INSERT INTO `sys_oper_record` VALUES (1353, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-28 14:49:11', '2026-01-28 14:49:11'); +INSERT INTO `sys_oper_record` VALUES (1354, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-28 14:49:38', '2026-01-28 14:49:38'); +INSERT INTO `sys_oper_record` VALUES (1355, 1, '供货商管理', '分页查询', '/sys/supplier/page', 'GET', 'com.bomaos.common.system.controller.SupplierController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 14:49:40', '2026-01-28 14:49:40'); +INSERT INTO `sys_oper_record` VALUES (1356, 1, '供货商管理', '添加', '/sys/supplier/save', 'POST', 'com.bomaos.common.system.controller.SupplierController.save', NULL, '{\"msg\":\"添加成功\",\"code\":0}', '198.18.0.1', NULL, 12, 0, '2026-01-28 14:49:55', '2026-01-28 14:49:55'); +INSERT INTO `sys_oper_record` VALUES (1357, 1, '供货商管理', '分页查询', '/sys/supplier/page', 'GET', 'com.bomaos.common.system.controller.SupplierController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:49:56', '2026-01-28 14:49:56'); +INSERT INTO `sys_oper_record` VALUES (1358, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:50:01', '2026-01-28 14:50:01'); +INSERT INTO `sys_oper_record` VALUES (1359, 1, '供货商管理', '分页查询', '/sys/supplier/page', 'GET', 'com.bomaos.common.system.controller.SupplierController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:50:17', '2026-01-28 14:50:17'); +INSERT INTO `sys_oper_record` VALUES (1360, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 14:50:18', '2026-01-28 14:50:18'); +INSERT INTO `sys_oper_record` VALUES (1361, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 53, 0, '2026-01-28 14:51:19', '2026-01-28 14:51:19'); +INSERT INTO `sys_oper_record` VALUES (1362, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:51:22', '2026-01-28 14:51:22'); +INSERT INTO `sys_oper_record` VALUES (1363, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 14:51:29', '2026-01-28 14:51:29'); +INSERT INTO `sys_oper_record` VALUES (1364, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/20260128\"]}', NULL, '198.18.0.1', NULL, 1, 0, '2026-01-28 14:51:34', '2026-01-28 14:51:34'); +INSERT INTO `sys_oper_record` VALUES (1365, 1, '网站设置管理', '修改', '/website/website/update', 'POST', 'com.bomaos.website.controller.WebsiteController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 10, 0, '2026-01-28 14:51:46', '2026-01-28 14:51:46'); +INSERT INTO `sys_oper_record` VALUES (1366, 1, '网站设置管理', '修改', '/website/website/update', 'POST', 'com.bomaos.website.controller.WebsiteController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 2, 0, '2026-01-28 14:51:50', '2026-01-28 14:51:50'); +INSERT INTO `sys_oper_record` VALUES (1367, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/\"]}', NULL, '198.18.0.1', NULL, 0, 0, '2026-01-28 14:51:51', '2026-01-28 14:51:51'); +INSERT INTO `sys_oper_record` VALUES (1368, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/20260128\"]}', NULL, '198.18.0.1', NULL, 0, 0, '2026-01-28 14:51:53', '2026-01-28 14:51:53'); +INSERT INTO `sys_oper_record` VALUES (1369, 1, '网站设置管理', '修改', '/website/website/update', 'POST', 'com.bomaos.website.controller.WebsiteController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 8, 0, '2026-01-28 14:52:07', '2026-01-28 14:52:07'); +INSERT INTO `sys_oper_record` VALUES (1370, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:52:09', '2026-01-28 14:52:09'); +INSERT INTO `sys_oper_record` VALUES (1371, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 14:52:09', '2026-01-28 14:52:09'); +INSERT INTO `sys_oper_record` VALUES (1372, 1, '供货商管理', '分页查询', '/sys/supplier/page', 'GET', 'com.bomaos.common.system.controller.SupplierController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-28 14:52:22', '2026-01-28 14:52:22'); +INSERT INTO `sys_oper_record` VALUES (1373, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 15, 0, '2026-01-28 14:53:52', '2026-01-28 14:53:52'); +INSERT INTO `sys_oper_record` VALUES (1374, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 18, 0, '2026-01-28 14:53:54', '2026-01-28 14:53:54'); +INSERT INTO `sys_oper_record` VALUES (1375, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 26, 0, '2026-01-28 14:53:55', '2026-01-28 14:53:55'); +INSERT INTO `sys_oper_record` VALUES (1376, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-01-28 14:54:00', '2026-01-28 14:54:00'); +INSERT INTO `sys_oper_record` VALUES (1377, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 70, 0, '2026-01-28 14:56:10', '2026-01-28 14:56:10'); +INSERT INTO `sys_oper_record` VALUES (1378, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 12, 0, '2026-01-28 14:56:13', '2026-01-28 14:56:13'); +INSERT INTO `sys_oper_record` VALUES (1379, 1, '用户管理', '添加', '/sys/user/save', 'POST', 'com.bomaos.common.system.controller.UserController.save', NULL, NULL, '198.18.0.1', 'com.bomaos.common.core.exception.BusinessException: 账号已存在', 5, 1, '2026-01-28 14:56:39', '2026-01-28 14:56:39'); +INSERT INTO `sys_oper_record` VALUES (1380, 1, '用户管理', '添加', '/sys/user/save', 'POST', 'com.bomaos.common.system.controller.UserController.save', NULL, NULL, '198.18.0.1', 'com.bomaos.common.core.exception.BusinessException: 手机号已存在', 6, 1, '2026-01-28 14:56:52', '2026-01-28 14:56:52'); +INSERT INTO `sys_oper_record` VALUES (1381, 1, '用户管理', '添加', '/sys/user/save', 'POST', 'com.bomaos.common.system.controller.UserController.save', NULL, '{\"msg\":\"添加成功\",\"code\":0}', '198.18.0.1', NULL, 13, 0, '2026-01-28 14:57:02', '2026-01-28 14:57:02'); +INSERT INTO `sys_oper_record` VALUES (1382, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 10, 0, '2026-01-28 14:57:02', '2026-01-28 14:57:02'); +INSERT INTO `sys_oper_record` VALUES (1383, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 14:58:17', '2026-01-28 14:58:17'); +INSERT INTO `sys_oper_record` VALUES (1384, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-28 14:58:22', '2026-01-28 14:58:22'); +INSERT INTO `sys_oper_record` VALUES (1385, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 14:58:22', '2026-01-28 14:58:22'); +INSERT INTO `sys_oper_record` VALUES (1386, 1, '角色管理', '查询角色菜单', '/sys/role/menu/list', 'GET', 'com.bomaos.common.system.controller.RoleMenuController.list', '{\"roleId\":[\"2\"]}', NULL, '198.18.0.1', NULL, 14, 0, '2026-01-28 14:58:27', '2026-01-28 14:58:27'); +INSERT INTO `sys_oper_record` VALUES (1387, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-28 15:00:47', '2026-01-28 15:00:47'); +INSERT INTO `sys_oper_record` VALUES (1388, 1, '用户管理', '修改', '/sys/user/update', 'POST', 'com.bomaos.common.system.controller.UserController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 21, 0, '2026-01-28 15:00:56', '2026-01-28 15:00:56'); +INSERT INTO `sys_oper_record` VALUES (1389, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 11, 0, '2026-01-28 15:00:56', '2026-01-28 15:00:56'); +INSERT INTO `sys_oper_record` VALUES (1390, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 10, 0, '2026-01-28 15:01:18', '2026-01-28 15:01:18'); +INSERT INTO `sys_oper_record` VALUES (1391, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 15:01:24', '2026-01-28 15:01:24'); +INSERT INTO `sys_oper_record` VALUES (1392, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 15:01:48', '2026-01-28 15:01:48'); +INSERT INTO `sys_oper_record` VALUES (1393, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 29, 0, '2026-01-28 15:01:50', '2026-01-28 15:01:50'); +INSERT INTO `sys_oper_record` VALUES (1394, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 13, 0, '2026-01-28 15:01:52', '2026-01-28 15:01:52'); +INSERT INTO `sys_oper_record` VALUES (1395, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 15:02:02', '2026-01-28 15:02:02'); +INSERT INTO `sys_oper_record` VALUES (1396, 2, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260128/443d28b6eedd4a139f129cb1e80bf0c1.png\",\"dir\":\"/20260128\",\"url\":\"20260128/443d28b6eedd4a139f129cb1e80bf0c1.png\"}', '198.18.0.1', NULL, 3, 0, '2026-01-28 15:03:02', '2026-01-28 15:03:02'); +INSERT INTO `sys_oper_record` VALUES (1397, 2, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260128/e80ca8c118fb4a4e937569ec6de7f48f.png\",\"dir\":\"/20260128\",\"url\":\"20260128/e80ca8c118fb4a4e937569ec6de7f48f.png\"}', '198.18.0.1', NULL, 1, 0, '2026-01-28 15:03:13', '2026-01-28 15:03:13'); +INSERT INTO `sys_oper_record` VALUES (1398, 2, '商品管理', '添加', '/products/products/save', 'POST', 'com.bomaos.products.controller.ProductsController.save', NULL, '{\"msg\":\"添加商品成功\",\"code\":0}', '198.18.0.1', NULL, 14, 0, '2026-01-28 15:03:21', '2026-01-28 15:03:21'); +INSERT INTO `sys_oper_record` VALUES (1399, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 13, 0, '2026-01-28 15:03:29', '2026-01-28 15:03:29'); +INSERT INTO `sys_oper_record` VALUES (1400, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-28 15:03:39', '2026-01-28 15:03:39'); +INSERT INTO `sys_oper_record` VALUES (1401, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 12, 0, '2026-01-28 15:04:21', '2026-01-28 15:04:21'); +INSERT INTO `sys_oper_record` VALUES (1402, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 15:04:26', '2026-01-28 15:04:26'); +INSERT INTO `sys_oper_record` VALUES (1403, 2, '商品管理', '查询全部', '/products/products/getProductList', 'POST', 'com.bomaos.products.controller.ProductsController.getProductList', '{\"id\":[\"3\"]}', NULL, '198.18.0.1', NULL, 2, 0, '2026-01-28 15:04:28', '2026-01-28 15:04:28'); +INSERT INTO `sys_oper_record` VALUES (1404, 2, '卡密管理', '添加', '/carmi/cards/save', 'POST', 'com.bomaos.carmi.controller.CardsController.save', NULL, '{\"msg\":\"批量添加卡密成功!\",\"code\":0}', '198.18.0.1', NULL, 24, 0, '2026-01-28 15:04:39', '2026-01-28 15:04:39'); +INSERT INTO `sys_oper_record` VALUES (1405, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 25, 0, '2026-01-28 15:04:44', '2026-01-28 15:04:44'); +INSERT INTO `sys_oper_record` VALUES (1406, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 20, 0, '2026-01-28 15:08:34', '2026-01-28 15:08:34'); +INSERT INTO `sys_oper_record` VALUES (1407, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-01-28 15:08:35', '2026-01-28 15:08:35'); +INSERT INTO `sys_oper_record` VALUES (1408, 2, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260128/15fd2b62ad1343a9be2aaa126c6e6e94.jpeg\",\"dir\":\"/20260128\",\"url\":\"20260128/15fd2b62ad1343a9be2aaa126c6e6e94.jpeg\"}', '198.18.0.1', NULL, 3, 0, '2026-01-28 15:12:07', '2026-01-28 15:12:07'); +INSERT INTO `sys_oper_record` VALUES (1409, 2, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260128/17ad879f9d584e8386f1aa79851c09e0.png\",\"dir\":\"/20260128\",\"url\":\"20260128/17ad879f9d584e8386f1aa79851c09e0.png\"}', '198.18.0.1', NULL, 1, 0, '2026-01-28 15:12:12', '2026-01-28 15:12:12'); +INSERT INTO `sys_oper_record` VALUES (1410, 2, '商品管理', '添加', '/products/products/save', 'POST', 'com.bomaos.products.controller.ProductsController.save', NULL, '{\"msg\":\"添加商品成功\",\"code\":0}', '198.18.0.1', NULL, 10, 0, '2026-01-28 15:12:18', '2026-01-28 15:12:18'); +INSERT INTO `sys_oper_record` VALUES (1411, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 17, 0, '2026-01-28 15:12:19', '2026-01-28 15:12:19'); +INSERT INTO `sys_oper_record` VALUES (1412, 2, '商品管理', '查询全部', '/products/products/getProductList', 'POST', 'com.bomaos.products.controller.ProductsController.getProductList', '{\"id\":[\"3\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 15:12:40', '2026-01-28 15:12:40'); +INSERT INTO `sys_oper_record` VALUES (1413, 2, '卡密管理', '添加', '/carmi/cards/save', 'POST', 'com.bomaos.carmi.controller.CardsController.save', NULL, '{\"msg\":\"批量添加卡密成功!\",\"code\":0}', '198.18.0.1', NULL, 9, 0, '2026-01-28 15:12:44', '2026-01-28 15:12:44'); +INSERT INTO `sys_oper_record` VALUES (1414, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 18, 0, '2026-01-28 15:12:48', '2026-01-28 15:12:48'); +INSERT INTO `sys_oper_record` VALUES (1415, 2, '商品管理', '查询全部', '/products/products/getProductList', 'POST', 'com.bomaos.products.controller.ProductsController.getProductList', '{\"id\":[\"\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 15:12:53', '2026-01-28 15:12:53'); +INSERT INTO `sys_oper_record` VALUES (1416, 2, '商品管理', '查询全部', '/products/products/getProductList', 'POST', 'com.bomaos.products.controller.ProductsController.getProductList', '{\"id\":[\"3\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 15:12:54', '2026-01-28 15:12:54'); +INSERT INTO `sys_oper_record` VALUES (1417, 2, '卡密管理', '添加', '/carmi/cards/save', 'POST', 'com.bomaos.carmi.controller.CardsController.save', NULL, '{\"msg\":\"批量添加卡密成功!\",\"code\":0}', '198.18.0.1', NULL, 8, 0, '2026-01-28 15:12:58', '2026-01-28 15:12:58'); +INSERT INTO `sys_oper_record` VALUES (1418, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 30, 0, '2026-01-28 15:13:11', '2026-01-28 15:13:11'); +INSERT INTO `sys_oper_record` VALUES (1419, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"2\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-01-28 15:13:19', '2026-01-28 15:13:19'); +INSERT INTO `sys_oper_record` VALUES (1420, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 26, 0, '2026-01-28 15:17:09', '2026-01-28 15:17:09'); +INSERT INTO `sys_oper_record` VALUES (1421, 2, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 14, 0, '2026-01-28 15:17:24', '2026-01-28 15:17:24'); +INSERT INTO `sys_oper_record` VALUES (1422, 1, '支付', '提交支付', '/pay/TUD20260128151738D8IezJ', 'GET', 'com.bomaos.reception.controller.OrderController.pay', '{}', NULL, '198.18.0.1', NULL, 27, 0, '2026-01-28 15:17:39', '2026-01-28 15:17:39'); +INSERT INTO `sys_oper_record` VALUES (1423, 1, '支付', '提交支付', '/pay/TUD20260128151803CqdtTP', 'GET', 'com.bomaos.reception.controller.OrderController.pay', '{}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 15:18:04', '2026-01-28 15:18:04'); +INSERT INTO `sys_oper_record` VALUES (1424, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-01-28 15:18:46', '2026-01-28 15:18:46'); +INSERT INTO `sys_oper_record` VALUES (1425, 1, '主题配置管理', '分页查询', '/theme/theme/page', 'GET', 'com.bomaos.theme.controller.ThemeController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 15:18:51', '2026-01-28 15:18:51'); +INSERT INTO `sys_oper_record` VALUES (1426, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 15:18:52', '2026-01-28 15:18:52'); +INSERT INTO `sys_oper_record` VALUES (1427, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-01-28 15:19:02', '2026-01-28 15:19:02'); +INSERT INTO `sys_oper_record` VALUES (1428, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-01-28 15:38:17', '2026-01-28 15:38:17'); +INSERT INTO `sys_oper_record` VALUES (1429, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 15:38:17', '2026-01-28 15:38:17'); +INSERT INTO `sys_oper_record` VALUES (1430, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 15:38:18', '2026-01-28 15:38:18'); +INSERT INTO `sys_oper_record` VALUES (1431, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 15:38:18', '2026-01-28 15:38:18'); +INSERT INTO `sys_oper_record` VALUES (1432, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 15:38:18', '2026-01-28 15:38:18'); +INSERT INTO `sys_oper_record` VALUES (1433, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 15:38:18', '2026-01-28 15:38:18'); +INSERT INTO `sys_oper_record` VALUES (1434, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 15:38:18', '2026-01-28 15:38:18'); +INSERT INTO `sys_oper_record` VALUES (1435, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 15:38:22', '2026-01-28 15:38:22'); +INSERT INTO `sys_oper_record` VALUES (1436, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 15:38:22', '2026-01-28 15:38:22'); +INSERT INTO `sys_oper_record` VALUES (1437, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 15:38:22', '2026-01-28 15:38:22'); +INSERT INTO `sys_oper_record` VALUES (1438, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 15:38:22', '2026-01-28 15:38:22'); +INSERT INTO `sys_oper_record` VALUES (1439, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-01-28 15:38:22', '2026-01-28 15:38:22'); +INSERT INTO `sys_oper_record` VALUES (1440, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 78, 0, '2026-01-28 15:41:45', '2026-01-28 15:41:45'); +INSERT INTO `sys_oper_record` VALUES (1441, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 40, 0, '2026-01-28 15:41:47', '2026-01-28 15:41:47'); +INSERT INTO `sys_oper_record` VALUES (1442, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 23, 0, '2026-01-28 15:41:49', '2026-01-28 15:41:49'); +INSERT INTO `sys_oper_record` VALUES (1443, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 23, 0, '2026-01-28 15:42:30', '2026-01-28 15:42:30'); +INSERT INTO `sys_oper_record` VALUES (1444, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 14, 0, '2026-01-28 15:42:33', '2026-01-28 15:42:33'); +INSERT INTO `sys_oper_record` VALUES (1445, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 15:42:45', '2026-01-28 15:42:45'); +INSERT INTO `sys_oper_record` VALUES (1446, 1, '商品列表管理', '商品手动补单', '/orders/orders/status/update', 'POST', 'com.bomaos.orders.controller.OrdersController.updateStates', '{\"id\":[\"87\"],\"productId\":[\"12\"],\"payNo\":[\"123456789\"]}', '{\"msg\":\"补单成功!!\",\"code\":0}', '198.18.0.1', NULL, 820, 0, '2026-01-28 15:42:55', '2026-01-28 15:42:55'); +INSERT INTO `sys_oper_record` VALUES (1447, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 15:42:55', '2026-01-28 15:42:55'); +INSERT INTO `sys_oper_record` VALUES (1448, 1, '商品列表管理', '商品手动补单', '/orders/orders/status/update', 'POST', 'com.bomaos.orders.controller.OrdersController.updateStates', '{\"id\":[\"85\"],\"productId\":[\"10\"],\"payNo\":[\"adfas\"]}', '{\"msg\":\"补单成功!!\",\"code\":0}', '198.18.0.1', NULL, 490, 0, '2026-01-28 15:43:07', '2026-01-28 15:43:07'); +INSERT INTO `sys_oper_record` VALUES (1449, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 15:43:07', '2026-01-28 15:43:07'); +INSERT INTO `sys_oper_record` VALUES (1450, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 25, 0, '2026-01-28 15:51:08', '2026-01-28 15:51:08'); +INSERT INTO `sys_oper_record` VALUES (1451, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 38, 0, '2026-01-28 15:51:14', '2026-01-28 15:51:14'); +INSERT INTO `sys_oper_record` VALUES (1452, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 35, 0, '2026-01-28 15:51:16', '2026-01-28 15:51:16'); +INSERT INTO `sys_oper_record` VALUES (1453, 2, '商品管理', '查询全部', '/products/products/getProductList', 'POST', 'com.bomaos.products.controller.ProductsController.getProductList', '{\"id\":[\"\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 15:51:18', '2026-01-28 15:51:18'); +INSERT INTO `sys_oper_record` VALUES (1454, 2, '商品管理', '查询全部', '/products/products/getProductList', 'POST', 'com.bomaos.products.controller.ProductsController.getProductList', '{\"id\":[\"3\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-01-28 15:51:19', '2026-01-28 15:51:19'); +INSERT INTO `sys_oper_record` VALUES (1455, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 25, 0, '2026-01-28 15:51:22', '2026-01-28 15:51:22'); +INSERT INTO `sys_oper_record` VALUES (1456, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 21, 0, '2026-01-28 15:51:36', '2026-01-28 15:51:36'); +INSERT INTO `sys_oper_record` VALUES (1457, 1, '订单表管理', '修改', '/orders/orders/updateCards', 'POST', 'com.bomaos.orders.controller.OrdersController.updateCards', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 2, 0, '2026-01-28 15:52:05', '2026-01-28 15:52:05'); +INSERT INTO `sys_oper_record` VALUES (1458, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-01-28 15:52:05', '2026-01-28 15:52:05'); +INSERT INTO `sys_oper_record` VALUES (1459, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 44, 0, '2026-01-28 16:08:42', '2026-01-28 16:08:42'); +INSERT INTO `sys_oper_record` VALUES (1460, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 33, 0, '2026-01-28 16:09:01', '2026-01-28 16:09:01'); +INSERT INTO `sys_oper_record` VALUES (1461, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"2\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-01-28 16:09:03', '2026-01-28 16:09:03'); +INSERT INTO `sys_oper_record` VALUES (1462, 2, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 38, 0, '2026-01-28 16:09:07', '2026-01-28 16:09:07'); +INSERT INTO `sys_oper_record` VALUES (1463, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 24, 0, '2026-01-28 16:09:11', '2026-01-28 16:09:11'); +INSERT INTO `sys_oper_record` VALUES (1464, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-01-28 16:17:40', '2026-01-28 16:17:40'); +INSERT INTO `sys_oper_record` VALUES (1465, 2, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 16:17:58', '2026-01-28 16:17:58'); +INSERT INTO `sys_oper_record` VALUES (1466, 2, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-01-28 16:18:00', '2026-01-28 16:18:00'); +INSERT INTO `sys_oper_record` VALUES (1467, 2, '商品列表管理', '商品手动补单', '/orders/orders/status/update', 'POST', 'com.bomaos.orders.controller.OrdersController.updateStates', '{\"id\":[\"86\"],\"productId\":[\"12\"],\"payNo\":[\"123\"]}', '{\"msg\":\"补单成功!!\",\"code\":0}', '198.18.0.1', NULL, 3594, 0, '2026-01-28 16:38:06', '2026-01-28 16:38:06'); +INSERT INTO `sys_oper_record` VALUES (1468, 2, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 23, 0, '2026-01-28 16:38:06', '2026-01-28 16:38:06'); +INSERT INTO `sys_oper_record` VALUES (1469, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 54, 0, '2026-02-02 18:53:53', '2026-02-02 18:53:53'); +INSERT INTO `sys_oper_record` VALUES (1470, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 10, 0, '2026-02-02 18:53:54', '2026-02-02 18:53:54'); +INSERT INTO `sys_oper_record` VALUES (1471, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 51, 0, '2026-02-02 18:53:55', '2026-02-02 18:53:55'); +INSERT INTO `sys_oper_record` VALUES (1472, 1, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260202/665d5ad61c664fb088134f06cb0b4142.png\",\"dir\":\"/20260202\",\"url\":\"20260202/665d5ad61c664fb088134f06cb0b4142.png\"}', '198.18.0.1', NULL, 8, 0, '2026-02-02 18:54:11', '2026-02-02 18:54:11'); +INSERT INTO `sys_oper_record` VALUES (1473, 1, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 13, 0, '2026-02-02 18:54:12', '2026-02-02 18:54:12'); +INSERT INTO `sys_oper_record` VALUES (1474, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 27, 0, '2026-02-02 18:54:15', '2026-02-02 18:54:15'); +INSERT INTO `sys_oper_record` VALUES (1475, 1, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260202/736528891d864d218722f639c40018a1.png\",\"dir\":\"/20260202\",\"url\":\"20260202/736528891d864d218722f639c40018a1.png\"}', '198.18.0.1', NULL, 3, 0, '2026-02-02 18:54:23', '2026-02-02 18:54:23'); +INSERT INTO `sys_oper_record` VALUES (1476, 1, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 8, 0, '2026-02-02 18:54:24', '2026-02-02 18:54:24'); +INSERT INTO `sys_oper_record` VALUES (1477, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 27, 0, '2026-02-02 18:54:25', '2026-02-02 18:54:25'); +INSERT INTO `sys_oper_record` VALUES (1478, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 34, 0, '2026-02-02 18:54:28', '2026-02-02 18:54:28'); +INSERT INTO `sys_oper_record` VALUES (1479, 1, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260202/1bab5acf0a5a4005a6b6b9f7d8bcbba6.jpeg\",\"dir\":\"/20260202\",\"url\":\"20260202/1bab5acf0a5a4005a6b6b9f7d8bcbba6.jpeg\"}', '198.18.0.1', NULL, 2, 0, '2026-02-02 18:54:39', '2026-02-02 18:54:39'); +INSERT INTO `sys_oper_record` VALUES (1480, 1, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 8, 0, '2026-02-02 18:54:40', '2026-02-02 18:54:40'); +INSERT INTO `sys_oper_record` VALUES (1481, 1, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 4, 0, '2026-02-02 18:54:46', '2026-02-02 18:54:46'); +INSERT INTO `sys_oper_record` VALUES (1482, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 18, 0, '2026-02-02 18:54:47', '2026-02-02 18:54:47'); +INSERT INTO `sys_oper_record` VALUES (1483, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-02-02 18:54:48', '2026-02-02 18:54:48'); +INSERT INTO `sys_oper_record` VALUES (1484, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 17, 0, '2026-02-02 18:54:52', '2026-02-02 18:54:52'); +INSERT INTO `sys_oper_record` VALUES (1485, 1, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 3, 0, '2026-02-02 18:54:56', '2026-02-02 18:54:56'); +INSERT INTO `sys_oper_record` VALUES (1486, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 23, 0, '2026-02-02 18:54:57', '2026-02-02 18:54:57'); +INSERT INTO `sys_oper_record` VALUES (1487, 1, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 3, 0, '2026-02-02 18:55:00', '2026-02-02 18:55:00'); +INSERT INTO `sys_oper_record` VALUES (1488, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 21, 0, '2026-02-02 18:55:01', '2026-02-02 18:55:01'); +INSERT INTO `sys_oper_record` VALUES (1489, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-02-02 18:55:02', '2026-02-02 18:55:02'); +INSERT INTO `sys_oper_record` VALUES (1490, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 18, 0, '2026-02-02 18:55:07', '2026-02-02 18:55:07'); +INSERT INTO `sys_oper_record` VALUES (1491, 1, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260202/10e511ebd9af4fdf8f97d0c8313f73eb.png\",\"dir\":\"/20260202\",\"url\":\"20260202/10e511ebd9af4fdf8f97d0c8313f73eb.png\"}', '198.18.0.1', NULL, 0, 0, '2026-02-02 18:55:17', '2026-02-02 18:55:17'); +INSERT INTO `sys_oper_record` VALUES (1492, 1, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 10, 0, '2026-02-02 18:55:18', '2026-02-02 18:55:18'); +INSERT INTO `sys_oper_record` VALUES (1493, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-02-02 18:55:19', '2026-02-02 18:55:19'); +INSERT INTO `sys_oper_record` VALUES (1494, 1, '文件管理', '上传base64文件', '/file/upload/base64', 'POST', 'com.bomaos.common.system.controller.FileController.uploadBase64', NULL, '{\"msg\":\"上传成功\",\"code\":0,\"location\":\"http://localhost:8085/file/20260202/7f5e31242e0e427e92cc8644d7661714.jpeg\",\"dir\":\"/20260202\",\"url\":\"20260202/7f5e31242e0e427e92cc8644d7661714.jpeg\"}', '198.18.0.1', NULL, 1, 0, '2026-02-02 18:55:28', '2026-02-02 18:55:28'); +INSERT INTO `sys_oper_record` VALUES (1495, 1, '商品管理', '修改', '/products/products/update', 'POST', 'com.bomaos.products.controller.ProductsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '198.18.0.1', NULL, 7, 0, '2026-02-02 18:55:29', '2026-02-02 18:55:29'); +INSERT INTO `sys_oper_record` VALUES (1496, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 24, 0, '2026-02-02 19:21:07', '2026-02-02 19:21:07'); +INSERT INTO `sys_oper_record` VALUES (1497, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 16, 0, '2026-02-02 19:21:09', '2026-02-02 19:21:09'); +INSERT INTO `sys_oper_record` VALUES (1498, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-02-02 19:21:10', '2026-02-02 19:21:10'); +INSERT INTO `sys_oper_record` VALUES (1499, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 18, 0, '2026-02-02 19:21:13', '2026-02-02 19:21:13'); +INSERT INTO `sys_oper_record` VALUES (1500, 1, '供货商管理', '分页查询', '/sys/supplier/page', 'GET', 'com.bomaos.common.system.controller.SupplierController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-02-02 19:21:14', '2026-02-02 19:21:14'); +INSERT INTO `sys_oper_record` VALUES (1501, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-02-02 19:21:18', '2026-02-02 19:21:18'); +INSERT INTO `sys_oper_record` VALUES (1502, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-02-02 19:22:16', '2026-02-02 19:22:16'); +INSERT INTO `sys_oper_record` VALUES (1503, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-02-02 19:22:17', '2026-02-02 19:22:17'); +INSERT INTO `sys_oper_record` VALUES (1504, 1, '主题配置管理', '分页查询', '/theme/theme/page', 'GET', 'com.bomaos.theme.controller.ThemeController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-02-02 19:22:18', '2026-02-02 19:22:18'); +INSERT INTO `sys_oper_record` VALUES (1505, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 19, 0, '2026-02-02 19:22:19', '2026-02-02 19:22:19'); +INSERT INTO `sys_oper_record` VALUES (1506, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-02-02 19:22:21', '2026-02-02 19:22:21'); +INSERT INTO `sys_oper_record` VALUES (1507, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-02-02 19:22:27', '2026-02-02 19:22:27'); +INSERT INTO `sys_oper_record` VALUES (1508, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-02-02 19:22:27', '2026-02-02 19:22:27'); +INSERT INTO `sys_oper_record` VALUES (1509, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 3, 0, '2026-02-02 19:22:28', '2026-02-02 19:22:28'); +INSERT INTO `sys_oper_record` VALUES (1510, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-02-02 19:22:28', '2026-02-02 19:22:28'); +INSERT INTO `sys_oper_record` VALUES (1511, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-02-02 19:22:28', '2026-02-02 19:22:28'); +INSERT INTO `sys_oper_record` VALUES (1512, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-02-02 19:22:34', '2026-02-02 19:22:34'); +INSERT INTO `sys_oper_record` VALUES (1513, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 60, 0, '2026-02-05 13:29:05', '2026-02-05 13:29:05'); +INSERT INTO `sys_oper_record` VALUES (1514, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-02-05 13:29:19', '2026-02-05 13:29:19'); +INSERT INTO `sys_oper_record` VALUES (1515, 1, '管理', '分页查询', '/orders/orders/pageAll', 'POST', 'com.bomaos.orders.controller.OrdersController.pageall', '{\"page\":[\"1\"],\"limit\":[\"10\"],\"contact\":[\"123\"]}', NULL, '198.18.0.1', NULL, 11, 0, '2026-02-05 13:29:56', '2026-02-05 13:29:56'); +INSERT INTO `sys_oper_record` VALUES (1516, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 58, 0, '2026-02-05 21:25:20', '2026-02-05 21:25:20'); +INSERT INTO `sys_oper_record` VALUES (1517, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 31, 0, '2026-02-05 21:25:29', '2026-02-05 21:25:29'); +INSERT INTO `sys_oper_record` VALUES (1518, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"20\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-02-05 21:25:42', '2026-02-05 21:25:42'); +INSERT INTO `sys_oper_record` VALUES (1519, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 15, 0, '2026-02-05 21:31:40', '2026-02-05 21:31:40'); +INSERT INTO `sys_oper_record` VALUES (1520, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 12, 0, '2026-02-05 21:31:51', '2026-02-05 21:31:51'); +INSERT INTO `sys_oper_record` VALUES (1521, 1, '主题配置管理', '分页查询', '/theme/theme/page', 'GET', 'com.bomaos.theme.controller.ThemeController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 7, 0, '2026-02-05 21:31:52', '2026-02-05 21:31:52'); +INSERT INTO `sys_oper_record` VALUES (1522, 1, '主题配置管理', '分页查询', '/theme/theme/page', 'GET', 'com.bomaos.theme.controller.ThemeController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-05 21:31:53', '2026-02-05 21:31:53'); +INSERT INTO `sys_oper_record` VALUES (1523, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 9, 0, '2026-02-05 21:31:57', '2026-02-05 21:31:57'); +INSERT INTO `sys_oper_record` VALUES (1524, 1, '登录日志', '分页查询', '/sys/loginRecord/page', 'GET', 'com.bomaos.common.system.controller.LoginRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 10, 0, '2026-02-05 21:32:01', '2026-02-05 21:32:01'); +INSERT INTO `sys_oper_record` VALUES (1525, 1, '操作日志', '分页查询', '/sys/operRecord/page', 'GET', 'com.bomaos.common.system.controller.OperRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 12, 0, '2026-02-05 21:32:01', '2026-02-05 21:32:01'); +INSERT INTO `sys_oper_record` VALUES (1526, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-05 21:32:02', '2026-02-05 21:32:02'); +INSERT INTO `sys_oper_record` VALUES (1527, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"],\"dir\":[\"20260202\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-05 21:32:02', '2026-02-05 21:32:02'); +INSERT INTO `sys_oper_record` VALUES (1528, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 12, 0, '2026-02-05 21:32:11', '2026-02-05 21:32:11'); +INSERT INTO `sys_oper_record` VALUES (1529, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 43, 0, '2026-02-05 21:32:12', '2026-02-05 21:32:12'); +INSERT INTO `sys_oper_record` VALUES (1530, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 65, 0, '2026-02-05 21:38:45', '2026-02-05 21:38:45'); +INSERT INTO `sys_oper_record` VALUES (1531, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 7, 0, '2026-02-05 21:39:48', '2026-02-05 21:39:48'); +INSERT INTO `sys_oper_record` VALUES (1532, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 19, 0, '2026-02-05 21:39:50', '2026-02-05 21:39:50'); +INSERT INTO `sys_oper_record` VALUES (1533, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 61, 0, '2026-02-11 18:28:46', '2026-02-11 18:28:46'); +INSERT INTO `sys_oper_record` VALUES (1534, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 11, 0, '2026-02-11 18:28:48', '2026-02-11 18:28:48'); +INSERT INTO `sys_oper_record` VALUES (1535, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 1, 0, '2026-02-11 18:28:50', '2026-02-11 18:28:50'); +INSERT INTO `sys_oper_record` VALUES (1536, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"],\"dir\":[\"20260202\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:28:50', '2026-02-11 18:28:50'); +INSERT INTO `sys_oper_record` VALUES (1537, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/\"]}', NULL, '192.168.2.128', NULL, 1, 0, '2026-02-11 18:28:59', '2026-02-11 18:28:59'); +INSERT INTO `sys_oper_record` VALUES (1538, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/20260202\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:29:02', '2026-02-11 18:29:02'); +INSERT INTO `sys_oper_record` VALUES (1539, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:29:09', '2026-02-11 18:29:09'); +INSERT INTO `sys_oper_record` VALUES (1540, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/20260202\"]}', NULL, '192.168.2.128', NULL, 1, 0, '2026-02-11 18:29:10', '2026-02-11 18:29:10'); +INSERT INTO `sys_oper_record` VALUES (1541, 1, '网站设置管理', '修改', '/website/website/update', 'POST', 'com.bomaos.website.controller.WebsiteController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 10, 0, '2026-02-11 18:29:13', '2026-02-11 18:29:13'); +INSERT INTO `sys_oper_record` VALUES (1542, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 7, 0, '2026-02-11 18:29:16', '2026-02-11 18:29:16'); +INSERT INTO `sys_oper_record` VALUES (1543, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:29:21', '2026-02-11 18:29:21'); +INSERT INTO `sys_oper_record` VALUES (1544, 1, '文件管理', '上传文件', '/file/upload', 'POST', 'com.bomaos.common.system.controller.FileController.upload', NULL, '{\"msg\":\"上传成功\",\"fileName\":\"b0c947953254d1ae465f2b91e778333b.png\",\"code\":0,\"location\":\"/file/20260211/a65c775b6e1ae95759a5d910e7e2fbcf.png\",\"dir\":\"/20260211\",\"url\":\"20260211/a65c775b6e1ae95759a5d910e7e2fbcf.png\"}', '192.168.2.128', NULL, 6, 0, '2026-02-11 18:29:25', '2026-02-11 18:29:25'); +INSERT INTO `sys_oper_record` VALUES (1545, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/20260211\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:29:25', '2026-02-11 18:29:25'); +INSERT INTO `sys_oper_record` VALUES (1546, 1, '文件管理', '上传文件', '/file/upload', 'POST', 'com.bomaos.common.system.controller.FileController.upload', NULL, '{\"msg\":\"上传成功\",\"fileName\":\"yolologo.png\",\"code\":0,\"location\":\"/file/20260211/60a839edbea8124075b63bfa12bda0d5.png\",\"dir\":\"/20260211\",\"url\":\"20260211/60a839edbea8124075b63bfa12bda0d5.png\"}', '192.168.2.128', NULL, 2, 0, '2026-02-11 18:29:32', '2026-02-11 18:29:32'); +INSERT INTO `sys_oper_record` VALUES (1547, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/20260211\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:29:32', '2026-02-11 18:29:32'); +INSERT INTO `sys_oper_record` VALUES (1548, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:29:36', '2026-02-11 18:29:36'); +INSERT INTO `sys_oper_record` VALUES (1549, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/20260211\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:29:37', '2026-02-11 18:29:37'); +INSERT INTO `sys_oper_record` VALUES (1550, 1, '网站设置管理', '修改', '/website/website/update', 'POST', 'com.bomaos.website.controller.WebsiteController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 7, 0, '2026-02-11 18:29:39', '2026-02-11 18:29:39'); +INSERT INTO `sys_oper_record` VALUES (1551, 1, '主题配置管理', '分页查询', '/theme/theme/page', 'GET', 'com.bomaos.theme.controller.ThemeController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 6, 0, '2026-02-11 18:39:10', '2026-02-11 18:39:10'); +INSERT INTO `sys_oper_record` VALUES (1552, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 18, 0, '2026-02-11 18:39:14', '2026-02-11 18:39:14'); +INSERT INTO `sys_oper_record` VALUES (1553, 1, '商店设置管理', '修改', '/settings/shopSettings/update', 'POST', 'com.bomaos.settings.controller.ShopSettingsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 9, 0, '2026-02-11 18:39:22', '2026-02-11 18:39:22'); +INSERT INTO `sys_oper_record` VALUES (1554, 1, '商店设置管理', '修改', '/settings/shopSettings/update', 'POST', 'com.bomaos.settings.controller.ShopSettingsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 8, 0, '2026-02-11 18:39:29', '2026-02-11 18:39:29'); +INSERT INTO `sys_oper_record` VALUES (1555, 1, '商店设置管理', '修改', '/settings/shopSettings/update', 'POST', 'com.bomaos.settings.controller.ShopSettingsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 6, 0, '2026-02-11 18:39:32', '2026-02-11 18:39:32'); +INSERT INTO `sys_oper_record` VALUES (1556, 1, '商店设置管理', '修改', '/settings/shopSettings/update', 'POST', 'com.bomaos.settings.controller.ShopSettingsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 8, 0, '2026-02-11 18:39:44', '2026-02-11 18:39:44'); +INSERT INTO `sys_oper_record` VALUES (1557, 1, '商店设置管理', '修改', '/settings/shopSettings/update', 'POST', 'com.bomaos.settings.controller.ShopSettingsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 8, 0, '2026-02-11 18:39:50', '2026-02-11 18:39:50'); +INSERT INTO `sys_oper_record` VALUES (1558, 1, '商店设置管理', '修改', '/settings/shopSettings/update', 'POST', 'com.bomaos.settings.controller.ShopSettingsController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 6, 0, '2026-02-11 18:39:55', '2026-02-11 18:39:55'); +INSERT INTO `sys_oper_record` VALUES (1559, 1, '主题配置管理', '分页查询', '/theme/theme/page', 'GET', 'com.bomaos.theme.controller.ThemeController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:40:41', '2026-02-11 18:40:41'); +INSERT INTO `sys_oper_record` VALUES (1560, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 2, 0, '2026-02-11 18:41:04', '2026-02-11 18:41:04'); +INSERT INTO `sys_oper_record` VALUES (1561, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:41:08', '2026-02-11 18:41:08'); +INSERT INTO `sys_oper_record` VALUES (1562, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"dir\":[\"/20260202\"]}', NULL, '192.168.2.128', NULL, 1, 0, '2026-02-11 18:41:09', '2026-02-11 18:41:09'); +INSERT INTO `sys_oper_record` VALUES (1563, 1, '轮播图管理管理', '添加', '/content/carousel/save', 'POST', 'com.bomaos.content.controller.CarouselController.save', NULL, '{\"msg\":\"添加成功\",\"code\":0}', '192.168.2.128', NULL, 11, 0, '2026-02-11 18:41:33', '2026-02-11 18:41:33'); +INSERT INTO `sys_oper_record` VALUES (1564, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:41:33', '2026-02-11 18:41:33'); +INSERT INTO `sys_oper_record` VALUES (1565, 1, '轮播图管理管理', '修改', '/content/carousel/update', 'POST', 'com.bomaos.content.controller.CarouselController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 6, 0, '2026-02-11 18:42:29', '2026-02-11 18:42:29'); +INSERT INTO `sys_oper_record` VALUES (1566, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 4, 0, '2026-02-11 18:42:29', '2026-02-11 18:42:29'); +INSERT INTO `sys_oper_record` VALUES (1567, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 7, 0, '2026-02-11 18:42:33', '2026-02-11 18:42:33'); +INSERT INTO `sys_oper_record` VALUES (1568, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:42:38', '2026-02-11 18:42:38'); +INSERT INTO `sys_oper_record` VALUES (1569, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 4, 0, '2026-02-11 18:43:18', '2026-02-11 18:43:18'); +INSERT INTO `sys_oper_record` VALUES (1570, 1, '轮播图管理管理', '修改', '/content/carousel/update', 'POST', 'com.bomaos.content.controller.CarouselController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 6, 0, '2026-02-11 18:43:22', '2026-02-11 18:43:22'); +INSERT INTO `sys_oper_record` VALUES (1571, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 4, 0, '2026-02-11 18:43:22', '2026-02-11 18:43:22'); +INSERT INTO `sys_oper_record` VALUES (1572, 1, '轮播图管理管理', '修改', '/content/carousel/update', 'POST', 'com.bomaos.content.controller.CarouselController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 7, 0, '2026-02-11 18:43:29', '2026-02-11 18:43:29'); +INSERT INTO `sys_oper_record` VALUES (1573, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 3, 0, '2026-02-11 18:43:29', '2026-02-11 18:43:29'); +INSERT INTO `sys_oper_record` VALUES (1574, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:43:48', '2026-02-11 18:43:48'); +INSERT INTO `sys_oper_record` VALUES (1575, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 22, 0, '2026-02-11 18:43:49', '2026-02-11 18:43:49'); +INSERT INTO `sys_oper_record` VALUES (1576, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 6, 0, '2026-02-11 18:45:23', '2026-02-11 18:45:23'); +INSERT INTO `sys_oper_record` VALUES (1577, 1, '轮播图管理管理', '修改', '/content/carousel/update', 'POST', 'com.bomaos.content.controller.CarouselController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 7, 0, '2026-02-11 18:45:29', '2026-02-11 18:45:29'); +INSERT INTO `sys_oper_record` VALUES (1578, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 4, 0, '2026-02-11 18:45:29', '2026-02-11 18:45:29'); +INSERT INTO `sys_oper_record` VALUES (1579, 1, '轮播图管理管理', '修改', '/content/carousel/update', 'POST', 'com.bomaos.content.controller.CarouselController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 5, 0, '2026-02-11 18:45:36', '2026-02-11 18:45:36'); +INSERT INTO `sys_oper_record` VALUES (1580, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 3, 0, '2026-02-11 18:45:36', '2026-02-11 18:45:36'); +INSERT INTO `sys_oper_record` VALUES (1581, 1, '网站设置管理', '修改', '/website/website/update', 'POST', 'com.bomaos.website.controller.WebsiteController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 7, 0, '2026-02-11 18:46:37', '2026-02-11 18:46:37'); +INSERT INTO `sys_oper_record` VALUES (1582, 1, '网站设置管理', '修改', '/website/website/update', 'POST', 'com.bomaos.website.controller.WebsiteController.update', NULL, '{\"msg\":\"修改成功\",\"code\":0}', '192.168.2.128', NULL, 8, 0, '2026-02-11 18:46:46', '2026-02-11 18:46:46'); +INSERT INTO `sys_oper_record` VALUES (1583, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 7, 0, '2026-02-11 18:46:48', '2026-02-11 18:46:48'); +INSERT INTO `sys_oper_record` VALUES (1584, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 4, 0, '2026-02-11 18:47:15', '2026-02-11 18:47:15'); +INSERT INTO `sys_oper_record` VALUES (1585, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 6, 0, '2026-02-11 18:47:15', '2026-02-11 18:47:15'); +INSERT INTO `sys_oper_record` VALUES (1586, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 4, 0, '2026-02-11 18:47:15', '2026-02-11 18:47:15'); +INSERT INTO `sys_oper_record` VALUES (1587, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 3, 0, '2026-02-11 18:47:16', '2026-02-11 18:47:16'); +INSERT INTO `sys_oper_record` VALUES (1588, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 3, 0, '2026-02-11 18:47:16', '2026-02-11 18:47:16'); +INSERT INTO `sys_oper_record` VALUES (1589, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:47:16', '2026-02-11 18:47:16'); +INSERT INTO `sys_oper_record` VALUES (1590, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 3, 0, '2026-02-11 18:47:16', '2026-02-11 18:47:16'); +INSERT INTO `sys_oper_record` VALUES (1591, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:47:25', '2026-02-11 18:47:25'); +INSERT INTO `sys_oper_record` VALUES (1592, 1, '文件管理', '查询全部', '/file/list', 'GET', 'com.bomaos.common.system.controller.FileController.list', '{\"page\":[\"1\"],\"limit\":[\"10\"],\"dir\":[\"20260211\"]}', NULL, '192.168.2.128', NULL, 0, 0, '2026-02-11 18:47:25', '2026-02-11 18:47:25'); +INSERT INTO `sys_oper_record` VALUES (1593, 1, '登录日志', '分页查询', '/sys/loginRecord/page', 'GET', 'com.bomaos.common.system.controller.LoginRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 10, 0, '2026-02-11 18:47:27', '2026-02-11 18:47:27'); +INSERT INTO `sys_oper_record` VALUES (1594, 1, '操作日志', '分页查询', '/sys/operRecord/page', 'GET', 'com.bomaos.common.system.controller.OperRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:47:27', '2026-02-11 18:47:27'); +INSERT INTO `sys_oper_record` VALUES (1595, 1, '操作日志', '分页查询', '/sys/operRecord/page', 'GET', 'com.bomaos.common.system.controller.OperRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:47:29', '2026-02-11 18:47:29'); +INSERT INTO `sys_oper_record` VALUES (1596, 1, '登录日志', '分页查询', '/sys/loginRecord/page', 'GET', 'com.bomaos.common.system.controller.LoginRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:47:31', '2026-02-11 18:47:31'); +INSERT INTO `sys_oper_record` VALUES (1597, 1, '操作日志', '分页查询', '/sys/operRecord/page', 'GET', 'com.bomaos.common.system.controller.OperRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 6, 0, '2026-02-11 18:47:32', '2026-02-11 18:47:32'); +INSERT INTO `sys_oper_record` VALUES (1598, 1, '登录日志', '分页查询', '/sys/loginRecord/page', 'GET', 'com.bomaos.common.system.controller.LoginRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 3, 0, '2026-02-11 18:47:33', '2026-02-11 18:47:33'); +INSERT INTO `sys_oper_record` VALUES (1599, 1, '操作日志', '分页查询', '/sys/operRecord/page', 'GET', 'com.bomaos.common.system.controller.OperRecordController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:48:16', '2026-02-11 18:48:16'); +INSERT INTO `sys_oper_record` VALUES (1600, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 15, 0, '2026-02-11 18:48:20', '2026-02-11 18:48:20'); +INSERT INTO `sys_oper_record` VALUES (1601, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 3, 0, '2026-02-11 18:48:21', '2026-02-11 18:48:21'); +INSERT INTO `sys_oper_record` VALUES (1602, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:48:21', '2026-02-11 18:48:21'); +INSERT INTO `sys_oper_record` VALUES (1603, 1, '供货商管理', '分页查询', '/sys/supplier/page', 'GET', 'com.bomaos.common.system.controller.SupplierController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 3, 0, '2026-02-11 18:48:21', '2026-02-11 18:48:21'); +INSERT INTO `sys_oper_record` VALUES (1604, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 5, 0, '2026-02-11 18:48:27', '2026-02-11 18:48:27'); +INSERT INTO `sys_oper_record` VALUES (1605, 1, '主题配置管理', '分页查询', '/theme/theme/page', 'GET', 'com.bomaos.theme.controller.ThemeController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '192.168.2.128', NULL, 3, 0, '2026-02-11 18:48:30', '2026-02-11 18:48:30'); +INSERT INTO `sys_oper_record` VALUES (1606, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 9, 0, '2026-02-11 18:49:47', '2026-02-11 18:49:47'); +INSERT INTO `sys_oper_record` VALUES (1607, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-02-11 18:51:18', '2026-02-11 18:51:18'); +INSERT INTO `sys_oper_record` VALUES (1608, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 9, 0, '2026-02-11 18:51:23', '2026-02-11 18:51:23'); +INSERT INTO `sys_oper_record` VALUES (1609, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '192.168.2.128', NULL, 8, 0, '2026-02-11 18:56:15', '2026-02-11 18:56:15'); +INSERT INTO `sys_oper_record` VALUES (1610, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 53, 0, '2026-02-11 19:13:19', '2026-02-11 19:13:19'); +INSERT INTO `sys_oper_record` VALUES (1611, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-02-11 19:13:29', '2026-02-11 19:13:29'); +INSERT INTO `sys_oper_record` VALUES (1612, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 12, 0, '2026-02-11 19:13:29', '2026-02-11 19:13:29'); +INSERT INTO `sys_oper_record` VALUES (1613, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-02-11 19:13:30', '2026-02-11 19:13:30'); +INSERT INTO `sys_oper_record` VALUES (1614, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 8, 0, '2026-02-11 19:13:30', '2026-02-11 19:13:30'); +INSERT INTO `sys_oper_record` VALUES (1615, 1, '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 20, 0, '2026-02-11 19:13:31', '2026-02-11 19:13:31'); +INSERT INTO `sys_oper_record` VALUES (1616, 1, '文章表管理', '分页查询', '/content/article/page', 'GET', 'com.bomaos.content.controller.ArticleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-02-11 19:13:34', '2026-02-11 19:13:34'); +INSERT INTO `sys_oper_record` VALUES (1617, 1, '文章表管理', '分页查询', '/content/article/page', 'GET', 'com.bomaos.content.controller.ArticleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-02-11 19:13:34', '2026-02-11 19:13:34'); +INSERT INTO `sys_oper_record` VALUES (1618, 1, '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-02-11 19:13:35', '2026-02-11 19:13:35'); +INSERT INTO `sys_oper_record` VALUES (1619, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 22, 0, '2026-02-11 19:37:20', '2026-02-11 19:37:20'); +INSERT INTO `sys_oper_record` VALUES (1620, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-02-11 19:37:25', '2026-02-11 19:37:25'); +INSERT INTO `sys_oper_record` VALUES (1621, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 24, 0, '2026-02-11 19:43:43', '2026-02-11 19:43:43'); +INSERT INTO `sys_oper_record` VALUES (1622, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-02-11 19:43:48', '2026-02-11 19:43:48'); +INSERT INTO `sys_oper_record` VALUES (1623, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 6, 0, '2026-02-11 19:43:48', '2026-02-11 19:43:48'); +INSERT INTO `sys_oper_record` VALUES (1624, 1, '角色管理', '分页查询', '/sys/role/page', 'GET', 'com.bomaos.common.system.controller.RoleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-02-11 19:43:51', '2026-02-11 19:43:51'); +INSERT INTO `sys_oper_record` VALUES (1625, 1, '菜单管理', '查询全部', '/sys/menu/list', 'GET', 'com.bomaos.common.system.controller.MenuController.list', '{}', NULL, '198.18.0.1', NULL, 6, 0, '2026-02-11 19:43:51', '2026-02-11 19:43:51'); +INSERT INTO `sys_oper_record` VALUES (1626, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 14, 0, '2026-02-11 19:43:51', '2026-02-11 19:43:51'); +INSERT INTO `sys_oper_record` VALUES (1627, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-02-11 19:43:56', '2026-02-11 19:43:56'); +INSERT INTO `sys_oper_record` VALUES (1628, 1, '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 32, 0, '2026-02-11 19:43:57', '2026-02-11 19:43:57'); +INSERT INTO `sys_oper_record` VALUES (1629, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 11, 0, '2026-02-11 19:43:58', '2026-02-11 19:43:58'); +INSERT INTO `sys_oper_record` VALUES (1630, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 26, 0, '2026-02-11 19:43:59', '2026-02-11 19:43:59'); +INSERT INTO `sys_oper_record` VALUES (1631, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-02-11 19:44:07', '2026-02-11 19:44:07'); +INSERT INTO `sys_oper_record` VALUES (1632, 2, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 8, 0, '2026-02-11 19:44:34', '2026-02-11 19:44:34'); +INSERT INTO `sys_oper_record` VALUES (1633, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 28, 0, '2026-02-11 19:44:36', '2026-02-11 19:44:36'); +INSERT INTO `sys_oper_record` VALUES (1634, 2, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 22, 0, '2026-02-11 19:44:38', '2026-02-11 19:44:38'); +INSERT INTO `sys_oper_record` VALUES (1635, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 53, 0, '2026-02-11 20:18:05', '2026-02-11 20:18:05'); +INSERT INTO `sys_oper_record` VALUES (1636, 1, '供应商管理', '分页查询', '/sys/supplier/page', 'GET', 'com.bomaos.common.system.controller.SupplierController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', 'org.springframework.jdbc.BadSqlGrammarException: \r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'order clause\'\r\n### The error may exist in file [D:\\git\\bomaos-shop\\target\\classes\\com\\bomaos\\common\\system\\mapper\\xml\\SupplierMapper.xml]\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: SELECT a.* FROM sys_supplier a ORDER BY created_at DESC LIMIT ?\r\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'order clause\'\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'order clause\'', 52, 1, '2026-02-11 20:18:07', '2026-02-11 20:18:07'); +INSERT INTO `sys_oper_record` VALUES (1637, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 17, 0, '2026-02-11 20:18:13', '2026-02-11 20:18:13'); +INSERT INTO `sys_oper_record` VALUES (1638, 1, '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 31, 0, '2026-02-11 20:18:14', '2026-02-11 20:18:14'); +INSERT INTO `sys_oper_record` VALUES (1639, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', NULL, '198.18.0.1', NULL, 4, 0, '2026-02-11 20:18:30', '2026-02-11 20:18:30'); +INSERT INTO `sys_oper_record` VALUES (1640, 1, '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 5, 0, '2026-02-11 20:18:32', '2026-02-11 20:18:32'); +INSERT INTO `sys_oper_record` VALUES (1641, 1, '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 7, 0, '2026-02-11 20:18:33', '2026-02-11 20:18:33'); +INSERT INTO `sys_oper_record` VALUES (1642, 1, '用户管理', '分页查询', '/sys/user/page', 'GET', 'com.bomaos.common.system.controller.UserController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', NULL, 12, 0, '2026-02-11 20:18:37', '2026-02-11 20:18:37'); +INSERT INTO `sys_oper_record` VALUES (1643, 1, '供应商管理', '分页查询', '/sys/supplier/page', 'GET', 'com.bomaos.common.system.controller.SupplierController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', NULL, '198.18.0.1', 'org.springframework.jdbc.BadSqlGrammarException: \r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'order clause\'\r\n### The error may exist in file [D:\\git\\bomaos-shop\\target\\classes\\com\\bomaos\\common\\system\\mapper\\xml\\SupplierMapper.xml]\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: SELECT a.* FROM sys_supplier a ORDER BY created_at DESC LIMIT ?\r\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'order clause\'\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'order clause\'', 8, 1, '2026-02-11 20:18:38', '2026-02-11 20:18:38'); +INSERT INTO `sys_oper_record` VALUES (1644, 1, '供应商管理', '添加', '/sys/supplier/save', 'POST', 'com.bomaos.common.system.controller.SupplierController.save', NULL, NULL, '198.18.0.1', 'org.springframework.jdbc.BadSqlGrammarException: \r\n### Error updating database. Cause: java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'field list\'\r\n### The error may exist in com/bomaos/common/system/mapper/SupplierMapper.java (best guess)\r\n### The error may involve com.bomaos.common.system.mapper.SupplierMapper.insert-Inline\r\n### The error occurred while setting parameters\r\n### SQL: INSERT INTO sys_supplier ( name, contact, balance, created_at, updated_at ) VALUES ( ?, ?, ?, ?, ? )\r\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'field list\'\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'field list\'', 8, 1, '2026-02-11 20:18:44', '2026-02-11 20:18:44'); +INSERT INTO `sys_oper_record` VALUES (1645, 1, '供应商管理', '添加', '/sys/supplier/save', 'POST', 'com.bomaos.common.system.controller.SupplierController.save', NULL, NULL, '198.18.0.1', 'org.springframework.jdbc.BadSqlGrammarException: \r\n### Error updating database. Cause: java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'field list\'\r\n### The error may exist in com/bomaos/common/system/mapper/SupplierMapper.java (best guess)\r\n### The error may involve com.bomaos.common.system.mapper.SupplierMapper.insert-Inline\r\n### The error occurred while setting parameters\r\n### SQL: INSERT INTO sys_supplier ( name, contact, balance, created_at, updated_at ) VALUES ( ?, ?, ?, ?, ? )\r\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'field list\'\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \'created_at\' in \'field list\'', 3, 1, '2026-02-11 20:18:46', '2026-02-11 20:18:46'); + +-- ---------------------------- +-- Table structure for sys_orders +-- ---------------------------- +DROP TABLE IF EXISTS `sys_orders`; +CREATE TABLE `sys_orders` ( + `id` int NOT NULL AUTO_INCREMENT, + `member` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '订单号', + `status` int NULL DEFAULT NULL COMMENT '状态', + `number` int NULL DEFAULT NULL COMMENT '订单数量', + `pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间', + `contact` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '买家联系方式', + `product_id` int NULL DEFAULT NULL COMMENT '商品id', + `product_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名称', + `ship_type` int NULL DEFAULT NULL COMMENT '发货模式', + `pay_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付类型', + `guest_id` int NULL DEFAULT NULL COMMENT '支付用户的id(如果有)', + `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '买家ip', + `device` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '购买设备', + `pay_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '流水号', + `money` decimal(18, 2) NULL DEFAULT NULL COMMENT '付款金额', + `price` decimal(18, 2) NOT NULL COMMENT '提交金额', + `create_time` datetime NULL DEFAULT NULL COMMENT '订单创建时间', + `cloud_payid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '云端id', + `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邮件通知', + `is_coupon` int NULL DEFAULT NULL COMMENT '是否使用优惠券', + `coupon_id` int NULL DEFAULT NULL COMMENT '优惠券id', + `user_id` int UNSIGNED NULL DEFAULT NULL COMMENT '用户id', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '订单密码', + `cards_info` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '卡密信息', + `attach_info` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '附加信息', + `handling_fee` decimal(18, 2) NULL DEFAULT NULL COMMENT '手续费', + `supplier_id` int NULL DEFAULT 0, + PRIMARY KEY (`id`, `price`) USING BTREE, + INDEX `id`(`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 89 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_orders +-- ---------------------------- +INSERT INTO `sys_orders` VALUES (83, 'TUD202601271906128b94nQ', 0, 1, NULL, '1724962375', 10, 'test', 0, 'epay_alipay', NULL, '198.18.0.1', 'Windows 10', NULL, 100.00, 100.00, '2026-01-27 19:06:13', '', NULL, 0, NULL, NULL, '123', NULL, NULL, 0.00, 0); +INSERT INTO `sys_orders` VALUES (84, 'TUD20260127190620tccHRD', 0, 1, NULL, '1724962375', 10, 'test', 0, 'epay_alipay', NULL, '198.18.0.1', 'Windows 10', NULL, 100.00, 100.00, '2026-01-27 19:06:20', '', NULL, 0, NULL, NULL, '123', NULL, NULL, 0.00, 0); +INSERT INTO `sys_orders` VALUES (85, 'TUD20260127190635xk1N9w', 1, 1, '2026-01-28 15:43:07', '1724962375', 10, 'test', 0, 'epay_alipay', NULL, '198.18.0.1', 'Windows 10', 'adfas', 100.00, 100.00, '2026-01-27 19:06:36', '', NULL, 0, NULL, NULL, '123', '3', NULL, 0.00, 0); +INSERT INTO `sys_orders` VALUES (86, 'TUD20260128151738D8IezJ', 2, 1, '2026-01-28 16:38:03', '123', 12, '供销商A的手动发货', 1, 'epay_alipay', NULL, '198.18.0.1', 'Windows 10', '123', 100.00, 100.00, '2026-01-28 15:17:39', '', NULL, 0, NULL, NULL, '123', NULL, 'QQ账号=123,TK账号=123,TK视频链接=1231,TK密码=23', 0.00, 1); +INSERT INTO `sys_orders` VALUES (87, 'TUD20260128151803CqdtTP', 2, 1, '2026-01-28 15:42:55', '123', 12, '供销商A的手动发货', 1, 'epay_alipay', NULL, '198.18.0.1', 'Windows 10', '123456789', 100.00, 100.00, '2026-01-28 15:18:04', '', NULL, 0, NULL, NULL, '123', NULL, 'QQ账号=123,TK账号=123,TK视频链接=1231,TK密码=23', 0.00, 1); +INSERT INTO `sys_orders` VALUES (88, 'TUD20260128160714qqDE1G', 0, 1, NULL, '123123', 10, 'test', 0, 'epay_alipay', NULL, '198.18.0.1', 'Windows 10', NULL, 100.00, 100.00, '2026-01-28 16:07:15', '', NULL, 0, NULL, NULL, '123123', NULL, NULL, 0.00, 0); + +-- ---------------------------- +-- Table structure for sys_organization +-- ---------------------------- +DROP TABLE IF EXISTS `sys_organization`; +CREATE TABLE `sys_organization` ( + `organization_id` int NOT NULL AUTO_INCREMENT COMMENT '机构id', + `parent_id` int NOT NULL DEFAULT 0 COMMENT '上级id,0是顶级', + `organization_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '机构名称', + `organization_full_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '机构全称', + `organization_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '机构代码', + `organization_type` int NOT NULL COMMENT '机构类型', + `leader_id` int NULL DEFAULT NULL COMMENT '负责人id', + `sort_number` int NOT NULL DEFAULT 1 COMMENT '排序号', + `comments` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `deleted` int NOT NULL DEFAULT 0 COMMENT '是否删除,0否,1是', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`organization_id`) USING BTREE, + INDEX `leader_id`(`leader_id`) USING BTREE, + CONSTRAINT `sys_organization_ibfk_1` FOREIGN KEY (`leader_id`) REFERENCES `sys_user` (`user_id`) ON DELETE SET NULL ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '组织机构' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_organization +-- ---------------------------- +INSERT INTO `sys_organization` VALUES (1, 0, 'XXX公司', 'XXXXXXXXX科技有限公司', NULL, 3, NULL, 1, '', 0, '2020-03-15 13:14:55', '2020-03-21 15:12:49'); +INSERT INTO `sys_organization` VALUES (2, 1, '研发部', '研发部', NULL, 5, NULL, 2, '', 0, '2020-03-15 13:15:16', '2020-03-16 00:43:09'); +INSERT INTO `sys_organization` VALUES (3, 2, '高教组', '高等教育行业项目组', NULL, 6, NULL, 3, '', 0, '2020-03-15 13:15:45', '2020-03-16 00:42:49'); +INSERT INTO `sys_organization` VALUES (4, 2, '政务组', '政务行业项目组', NULL, 6, NULL, 4, '', 0, '2020-03-15 13:16:15', '2020-03-16 00:42:54'); +INSERT INTO `sys_organization` VALUES (5, 2, '制造组', '生产制造行业项目组', NULL, 6, NULL, 5, '', 0, '2020-03-15 13:16:37', '2020-03-21 15:13:05'); +INSERT INTO `sys_organization` VALUES (6, 2, '仿真组', '虚拟仿真行业项目组', NULL, 6, NULL, 6, '', 0, '2020-03-15 13:16:57', '2020-03-16 00:43:03'); +INSERT INTO `sys_organization` VALUES (7, 1, '测试部', '测试部', NULL, 5, NULL, 6, '', 0, '2020-03-15 13:17:19', '2020-03-16 00:43:14'); +INSERT INTO `sys_organization` VALUES (8, 1, '设计部', 'UI设计部门', NULL, 5, NULL, 7, '', 0, '2020-03-15 13:17:56', '2020-03-16 00:43:18'); +INSERT INTO `sys_organization` VALUES (9, 1, '市场部', '市场部', NULL, 5, NULL, 8, '', 0, '2020-03-15 13:18:15', '2020-03-16 00:43:23'); + +-- ---------------------------- +-- Table structure for sys_pays +-- ---------------------------- +DROP TABLE IF EXISTS `sys_pays`; +CREATE TABLE `sys_pays` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称', + `driver` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '驱动', + `config` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '配置', + `comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '说明', + `created_at` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updated_at` datetime NULL DEFAULT NULL COMMENT '更新时间', + `is_mobile` int NULL DEFAULT NULL COMMENT '移动端', + `is_pc` int NULL DEFAULT NULL COMMENT 'pc端', + `is_handling_fee` int NULL DEFAULT NULL COMMENT '手续费tag', + `handling_fee` int NULL DEFAULT NULL COMMENT '手续费', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_pays +-- ---------------------------- +INSERT INTO `sys_pays` VALUES (1, '支付宝', 'mqpay_alipay', '{\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', 'V免签 - 支付宝(费率0)(自己搭建)', '2021-03-29 16:16:05', '2021-03-29 16:16:07', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (2, '微信', 'mqpay_wxpay', '{\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', 'V免签 - 微信 (费率0)(自己搭建)', '2021-03-29 16:17:52', '2021-03-29 16:17:55', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (3, 'QQ钱包', 'epay_qqpay', '{\"pid\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', '易支付 - QQ钱包', '2021-05-24 16:12:49', '2021-10-30 16:12:49', 0, 0, 0, 0); +INSERT INTO `sys_pays` VALUES (5, '支付宝', 'epay_alipay', '{\"pid\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', '易支付 - 支付宝', '2021-05-24 12:00:01', '2021-05-24 12:00:04', 1, 1, NULL, 0); +INSERT INTO `sys_pays` VALUES (6, '微信', 'epay_wxpay', '{\"pid\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', '易支付 - 微信', '2021-05-24 12:00:55', '2021-05-24 12:01:00', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (7, '微信', 'yungouos_wxpay', '{\"mchId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxxx\"}', 'YunGouOS - 微信(个人小薇支付-费率低) 申请地址:https://dwz.cn/QQLN87nX', '2021-06-06 04:53:12', '2021-06-06 04:53:20', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (8, '支付宝', 'yungouos_alipay', '{\"mchId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', 'YunGouOS - 支付宝 (个人小薇支付-费率低) 申请地址:https://dwz.cn/QQLN87nX', '2021-06-06 04:54:03', '2021-06-06 04:54:06', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (9, '微信', 'xunhupay_wxpay', '{\"appid\":\"xxx\",\"appsecret\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"https://api.xunhupay.com/payment/do.html\"}', '虎皮椒V3 - 微信(费率-H5版2%/普通版1%) 申请地址:https://www.xunhupay.com', '2021-06-06 22:24:47', '2021-06-06 22:24:50', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (10, '支付宝', 'xunhupay_alipay', '{\"appid\":\"xxx\",\"appsecret\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"https://api.xunhupay.com/payment/do.html\"}', '虎皮椒V3 - 支付宝 申请地址:https://www.xunhupay.com', '2021-06-06 22:25:19', '2021-06-06 22:25:22', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (13, '微信', 'payjs_wxpay', '{\"mchId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', 'Payjs - 微信扫码 申请地址:https://payjs.cn', '2021-06-27 14:17:54', '2021-06-27 14:17:58', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (14, '支付宝', 'payjs_alipay', '{\"mchId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', 'Payjs - 支付宝扫码 申请地址:https://payjs.cn', '2021-06-27 14:18:38', '2021-06-27 14:18:43', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (17, '微信', 'wxpay', '{\"mchId\":\"xxx\",\"appId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', '官方微信 - 扫码支付', '2021-07-02 02:47:37', '2021-07-02 02:47:40', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (18, '支付宝', 'alipay', '{\"private_key\":\"xxx\",\"notify_url\":\"xxx\",\"app_id\":\"xxx\",\"alipay_public_key\":\"xxx\"}', '官方支付宝 - 当面付', '2021-07-03 18:53:08', '2021-07-02 18:53:11', 0, 0, 0, 0); +INSERT INTO `sys_pays` VALUES (19, '微信H5', 'wxpay_h5', '{\"mchId\":\"xxx\",\"appId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', '官方微信 - H5支付 (开启后只在手机端显示)', '2021-07-02 23:20:54', '2021-08-17 23:20:56', 0, 0, NULL, 0); +INSERT INTO `sys_pays` VALUES (20, 'Paypal', 'paypal', '{\"clientId\":\"xxx\",\"return_url\":\"xxx\",\"clientSecret\":\"xxx\"}', 'Paypal 境外支付(默认美元交易)', '2021-08-24 12:04:25', '2021-08-24 12:04:28', 0, 0, 0, 0); +INSERT INTO `sys_pays` VALUES (22, '支付宝PC', 'alipay_pc', '{\"private_key\":\"xxx\",\"notify_url\":\"xxx\",\"app_id\":\"xxx\",\"alipay_public_key\":\"xxx\"}', '支付宝官方 - pc端支付', '2021-07-03 03:04:02', '2021-11-03 03:04:02', 0, 0, 0, 0); +INSERT INTO `sys_pays` VALUES (23, 'USDT', 'epusdt', '{\"notify_url\":\"xxx\",\"create_url\":\"填写收银台域名后面不变/api/v1/order/create-transaction\",\"key\":\"xxx\"}', 'Epusdt TRC-20 数字货币 自己搭建【地址:https://github.com/assimon/epusdt】', '2022-09-15 15:33:41', '2022-09-15 15:33:43', 0, 0, 0, 8); +INSERT INTO `sys_pays` VALUES (24, '支付宝', 'budpay_alipay', '{\"pid\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"https://pay.whbh1658.vip/api\",\"key\":\"xxx\"}', 'Budpay-支付宝支付', '2023-07-28 08:28:46', '2023-07-28 08:28:48', 0, 0, 0, 0); + +-- ---------------------------- +-- Table structure for sys_products +-- ---------------------------- +DROP TABLE IF EXISTS `sys_products`; +CREATE TABLE `sys_products` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名称', + `price` decimal(18, 2) NULL DEFAULT NULL COMMENT '商品金额', + `sort` int NULL DEFAULT NULL COMMENT '排序', + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品链接', + `status` int NULL DEFAULT NULL COMMENT '商品状态', + `pd_info` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品详情', + `created_at` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updated_at` datetime NULL DEFAULT NULL COMMENT '更新时间', + `deleted_at` datetime NULL DEFAULT NULL COMMENT '删除时间', + `classify_id` int NULL DEFAULT NULL COMMENT '分类id', + `index_logo` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '首页截图', + `image_logo` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品logo', + `is_wholesale` int NULL DEFAULT NULL COMMENT '批发功能', + `wholesale` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '批发配置', + `restricts` int NULL DEFAULT 0 COMMENT '限制购买', + `ship_type` int NULL DEFAULT NULL COMMENT '发货类型(0-自动,1-手动)', + `inventory` int NULL DEFAULT NULL COMMENT '商品库存(人工发货类型生效)', + `sales` int NULL DEFAULT NULL COMMENT '销量', + `is_password` int NULL DEFAULT NULL COMMENT '是否开启密码查询', + `customize_input` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '自定义输入框', + `is_customize` int NULL DEFAULT NULL COMMENT '是否开启自定义输入框', + `sell_type` int NULL DEFAULT NULL COMMENT '售卡类型', + `component_point` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '提示语', + `component_type` int NULL DEFAULT NULL COMMENT '提示类型', + `component_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '提示链接', + `component_enabled` int NULL DEFAULT NULL COMMENT '是否开启提示', + `supplier_id` int NULL DEFAULT 0, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_products +-- ---------------------------- +INSERT INTO `sys_products` VALUES (10, 'test', 100.00, 1000, 'pO8o2meHEkoT1cYf', 1, '

test 测试详情

', '2026-01-27 18:58:12', '2026-01-27 18:58:12', '2026-01-27 18:58:12', 3, '/file/20260202/665d5ad61c664fb088134f06cb0b4142.png', '/file/20260128/fbc715ab22de4b81a62f52cee25b9bf6.png', 0, '', 99, 0, NULL, NULL, 1, NULL, 0, 0, 'test提示', 1, 'www.baidu.com', 0, 0); +INSERT INTO `sys_products` VALUES (11, '供应商A商品', 99.00, 1000, '3lOQ41i6fcgpEJ9k', 1, '

asdfasd

', '2026-01-28 15:03:21', '2026-01-28 15:03:21', '2026-01-28 15:03:21', 3, '/file/20260202/10e511ebd9af4fdf8f97d0c8313f73eb.png', '/file/20260202/736528891d864d218722f639c40018a1.png', 0, '', 0, 0, NULL, NULL, 1, NULL, 0, 0, 'test提示', 1, 'www.baidu.com', 1, 1); +INSERT INTO `sys_products` VALUES (12, '供销商A的手动发货', 100.00, 1000, '0etEQDeM9zQZX4m4', 1, '

fasdfas

', '2026-01-28 15:12:18', '2026-01-28 15:12:18', '2026-01-28 15:12:18', 3, '/file/20260202/7f5e31242e0e427e92cc8644d7661714.jpeg', '/file/20260202/1bab5acf0a5a4005a6b6b9f7d8bcbba6.jpeg', 0, '', 0, 1, 98, 2, 1, 'qq_account=QQ账号=true\ntk_account=TK账号=true\ntk_lianjie=TK视频链接=true\ntk_pass=TK密码=false', 1, 0, 'test提示', 1, 'www.baidu.com', 1, 1); + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `role_id` int NOT NULL AUTO_INCREMENT COMMENT '角色id', + `role_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色名称', + `role_code` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '角色标识', + `comments` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `deleted` int NOT NULL DEFAULT 0 COMMENT '是否删除,0否,1是', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`role_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +INSERT INTO `sys_role` VALUES (1, '管理员', 'admin', '管理员', 0, '2020-02-26 15:18:37', '2020-03-21 15:15:54'); +INSERT INTO `sys_role` VALUES (2, '普通用户', 'user', '普通用户', 0, '2020-02-26 15:18:52', '2020-03-21 15:16:02'); +INSERT INTO `sys_role` VALUES (3, '游客', 'guest', '游客', 0, '2020-02-26 15:19:49', '2020-03-21 15:16:57'); +INSERT INTO `sys_role` VALUES (4, '供应商', NULL, 'Dedicated supplier role', 0, '2026-01-28 15:00:21', '2026-02-02 19:22:31'); + +-- ---------------------------- +-- Table structure for sys_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', + `role_id` int NOT NULL COMMENT '角色id', + `menu_id` int NOT NULL COMMENT '菜单id', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `FK_sys_role_permission_role`(`role_id`) USING BTREE, + INDEX `menu_id`(`menu_id`) USING BTREE, + CONSTRAINT `sys_role_menu_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT `sys_role_menu_ibfk_2` FOREIGN KEY (`menu_id`) REFERENCES `sys_menu` (`menu_id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 804 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色权限' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_role_menu +-- ---------------------------- +INSERT INTO `sys_role_menu` VALUES (656, 1, 75, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (657, 1, 37, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (658, 1, 38, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (659, 1, 39, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (660, 1, 40, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (661, 1, 41, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (662, 1, 42, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (663, 1, 76, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (664, 1, 43, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (665, 1, 44, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (666, 1, 56, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (667, 1, 45, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (668, 1, 46, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (669, 1, 47, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (670, 1, 48, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (671, 1, 54, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (672, 1, 51, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (673, 1, 49, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (674, 1, 50, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (675, 1, 52, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (676, 1, 53, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (677, 1, 63, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (678, 1, 64, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (679, 1, 65, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (680, 1, 66, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (681, 1, 67, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (682, 1, 68, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (683, 1, 83, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (684, 1, 89, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (685, 1, 84, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (686, 1, 85, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (687, 1, 86, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (688, 1, 87, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (689, 1, 88, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (690, 1, 103, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (691, 1, 109, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (692, 1, 110, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (693, 1, 104, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (694, 1, 105, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (695, 1, 106, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (696, 1, 107, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (697, 1, 108, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (698, 1, 117, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (699, 1, 118, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (700, 1, 112, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (701, 1, 113, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (702, 1, 114, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (703, 1, 115, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (704, 1, 116, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (705, 1, 1, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (706, 1, 2, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (707, 1, 3, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (708, 1, 4, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (709, 1, 5, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (710, 1, 6, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (711, 1, 7, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (712, 1, 8, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (713, 1, 9, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (714, 1, 10, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (715, 1, 11, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (716, 1, 12, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (717, 1, 13, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (718, 1, 14, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (719, 1, 15, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (720, 1, 16, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (721, 1, 17, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (722, 1, 18, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (723, 1, 19, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (724, 1, 20, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (725, 1, 21, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (726, 1, 22, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (727, 1, 23, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (728, 1, 24, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (729, 1, 25, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (730, 1, 26, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (731, 1, 57, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (732, 1, 97, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (733, 1, 98, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (734, 1, 99, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (735, 1, 100, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (736, 1, 101, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (737, 1, 58, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (738, 1, 59, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (739, 1, 60, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (740, 1, 61, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (741, 1, 62, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (742, 1, 102, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (743, 1, 91, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (744, 1, 92, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (745, 1, 93, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (746, 1, 94, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (747, 1, 95, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (748, 1, 78, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (749, 1, 79, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (750, 1, 80, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (751, 1, 81, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (752, 1, 82, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (753, 1, 27, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (754, 1, 28, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (755, 1, 29, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (756, 1, 30, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (757, 1, 31, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (758, 1, 32, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (759, 1, 33, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (760, 1, 34, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (761, 1, 35, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (762, 1, 36, '2021-11-10 03:07:03', '2021-11-10 03:07:03'); +INSERT INTO `sys_role_menu` VALUES (763, 1, 119, '2026-01-28 14:44:14', '2026-01-28 14:44:14'); +INSERT INTO `sys_role_menu` VALUES (764, 1, 120, '2026-01-28 14:44:14', '2026-01-28 14:44:14'); +INSERT INTO `sys_role_menu` VALUES (765, 1, 121, '2026-01-28 14:44:14', '2026-01-28 14:44:14'); +INSERT INTO `sys_role_menu` VALUES (766, 1, 122, '2026-01-28 14:44:15', '2026-01-28 14:44:15'); +INSERT INTO `sys_role_menu` VALUES (767, 1, 123, '2026-01-28 14:44:15', '2026-01-28 14:44:15'); +INSERT INTO `sys_role_menu` VALUES (768, 4, 37, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (769, 4, 38, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (770, 4, 43, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (771, 4, 76, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (775, 4, 43, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (776, 4, 44, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (777, 4, 45, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (778, 4, 46, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (779, 4, 47, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (780, 4, 49, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (781, 4, 50, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (782, 4, 51, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (783, 4, 52, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (784, 4, 53, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (785, 4, 54, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (786, 4, 55, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (787, 4, 56, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (788, 4, 76, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (790, 4, 37, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (791, 4, 43, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (792, 4, 48, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (793, 4, 49, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (794, 4, 54, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (797, 4, 75, '2026-01-28 15:00:21', '2026-01-28 15:00:21'); +INSERT INTO `sys_role_menu` VALUES (798, 4, 63, '2026-01-28 16:13:39', '2026-01-28 16:13:39'); +INSERT INTO `sys_role_menu` VALUES (799, 4, 64, '2026-01-28 16:13:39', '2026-01-28 16:13:39'); +INSERT INTO `sys_role_menu` VALUES (800, 4, 65, '2026-01-28 16:13:39', '2026-01-28 16:13:39'); +INSERT INTO `sys_role_menu` VALUES (801, 4, 66, '2026-01-28 16:13:39', '2026-01-28 16:13:39'); +INSERT INTO `sys_role_menu` VALUES (802, 4, 67, '2026-01-28 16:13:39', '2026-01-28 16:13:39'); +INSERT INTO `sys_role_menu` VALUES (803, 4, 68, '2026-01-28 16:13:39', '2026-01-28 16:13:39'); + +-- ---------------------------- +-- Table structure for sys_shop_settings +-- ---------------------------- +DROP TABLE IF EXISTS `sys_shop_settings`; +CREATE TABLE `sys_shop_settings` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', + `is_window` int NULL DEFAULT NULL COMMENT '是否开启弹窗', + `window_text` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '弹窗内容', + `is_background` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '全局背景图', + `store_details` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商店详情', + `is_wxpusher` int NULL DEFAULT NULL COMMENT '是否开启微信通知', + `app_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'pusher token', + `wxpush_uid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信通知uid', + `is_email` int NULL DEFAULT 0 COMMENT '邮件通知开关', + `is_list_layout` int NULL DEFAULT NULL COMMENT '是否开启列表布局', + `quotations` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '首页语录', + `qq_customer_service` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'QQ客服', + `qq_group_qrcode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'QQ群二维码', + `tg_customer_service` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'TG客服', + `is_client` int NULL DEFAULT NULL COMMENT '是否开启客服', + `crisp_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'crisp密钥', + `is_model` int NULL DEFAULT NULL COMMENT '首页模版', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商店设置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_shop_settings +-- ---------------------------- +INSERT INTO `sys_shop_settings` VALUES (1, 1, '
\n

    想把世界最好的给你,却发现世上最好的是你;我不要不老的青春,只要一个盗不走的爱人。

\n

 

\n
\n
\n

    有时幸福就像手心里的沙,握得越紧,失去得越快;有时幸福就像隔岸的花朵,隐约可见,却无法触摸。两个人的世界里,总要一个闹着、一个笑着、一个吵着、一个哄着。

\n
', 'https://s1.hdslb.com/bfs/static/blive/blfe-dynamic-web/static/img/background.bc725153.png', '

打开祝福的心扉,让梦想在晨光中翱翔。

', 1, 'xxx', 'xxx', 0, 1, '打开祝福的心扉,让梦想在晨光中翱翔。', '1724962375', 'xxx', 'xxx', 1, '3ff64218-c586-4c42-91fe-c13c8aa07405', 1); + +-- ---------------------------- +-- Table structure for sys_supplier +-- ---------------------------- +DROP TABLE IF EXISTS `sys_supplier`; +CREATE TABLE `sys_supplier` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `contact` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `balance` decimal(10, 2) NULL DEFAULT 0.00, + `create_time` datetime NULL DEFAULT NULL, + `update_time` datetime NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_supplier +-- ---------------------------- +INSERT INTO `sys_supplier` VALUES (1, '测试供应商', '111', 0.00, '2026-01-28 14:49:55', '2026-01-28 14:49:55'); + +-- ---------------------------- +-- Table structure for sys_theme +-- ---------------------------- +DROP TABLE IF EXISTS `sys_theme`; +CREATE TABLE `sys_theme` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '主题名称', + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '说明', + `driver` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '主题驱动', + `enable` int NULL DEFAULT NULL COMMENT '是否设置', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '主题配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_theme +-- ---------------------------- +INSERT INTO `sys_theme` VALUES (1, '系统默认', '系统预设主题', 'default', 1, '2021-06-28 00:58:32', '2021-06-28 00:58:34'); + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `user_id` int NOT NULL AUTO_INCREMENT COMMENT '用户id', + `username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '账号', + `password` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码', + `nick_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '昵称', + `avatar` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '头像', + `sex` int NULL DEFAULT NULL COMMENT '性别', + `phone` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手机号', + `email` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邮箱', + `email_verified` int NOT NULL DEFAULT 0 COMMENT '邮箱是否验证,0否,1是', + `true_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '真实姓名', + `id_card` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '身份证号', + `birthday` date NULL DEFAULT NULL COMMENT '出生日期', + `introduction` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '个人简介', + `organization_id` int NULL DEFAULT NULL COMMENT '机构id', + `state` int NOT NULL DEFAULT 0 COMMENT '状态,0正常,1冻结', + `deleted` int NOT NULL DEFAULT 0 COMMENT '是否删除,0否,1是', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `qq_uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'qquuid', + `wx_uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'wxuuid', + `supplier_id` int NULL DEFAULT 0, + PRIMARY KEY (`user_id`) USING BTREE, + INDEX `organization_id`(`organization_id`) USING BTREE, + CONSTRAINT `sys_user_ibfk_1` FOREIGN KEY (`organization_id`) REFERENCES `sys_organization` (`organization_id`) ON DELETE SET NULL ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', '管理员', NULL, 1, '', NULL, 0, NULL, NULL, NULL, '312312344444', NULL, 0, 0, '2020-01-13 14:43:52', '2022-04-12 15:25:09', NULL, NULL, 0); +INSERT INTO `sys_user` VALUES (2, 'test', 'e120ea280aa50693d5568d0071456460', '供货商A', NULL, 1, '17563066666', NULL, 0, NULL, NULL, NULL, NULL, NULL, 0, 0, '2026-01-28 14:57:02', '2026-01-28 14:57:02', NULL, NULL, 1); + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', + `user_id` int NOT NULL COMMENT '用户id', + `role_id` int NOT NULL COMMENT '角色id', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `FK_sys_user_role`(`user_id`) USING BTREE, + INDEX `FK_sys_user_role_role`(`role_id`) USING BTREE, + CONSTRAINT `sys_user_role_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT `sys_user_role_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户角色' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +INSERT INTO `sys_user_role` VALUES (2, 1, 1, '2021-08-23 18:29:06', '2021-08-23 18:29:06'); +INSERT INTO `sys_user_role` VALUES (4, 2, 4, '2026-01-28 15:00:56', '2026-01-28 15:00:56'); + +-- ---------------------------- +-- Table structure for sys_website +-- ---------------------------- +DROP TABLE IF EXISTS `sys_website`; +CREATE TABLE `sys_website` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', + `website_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '网站名称', + `website_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '网站域名', + `website_logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '网站logo', + `contact` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系方式', + `beian_icp` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备案ICP', + `keywords` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '关键字', + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '网站描述', + `favicon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'favicon', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '网站设置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_website +-- ---------------------------- +INSERT INTO `sys_website` VALUES (1, 'yolo商店', 'http://free.bomaos.com', '/file/20260211/60a839edbea8124075b63bfa12bda0d5.png', '1724962375', 'Copyright © 2012-2022 YOLO商店', '商城系统,商城源码,tg营销助手,发卡网', 'YOLO商店 - 全新UI商城系统', '/file/20260211/60a839edbea8124075b63bfa12bda0d5.png'); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/bomaos-shop.sql b/sql/bomaos-shop.sql deleted file mode 100644 index b6d0257..0000000 --- a/sql/bomaos-shop.sql +++ /dev/null @@ -1,597 +0,0 @@ -/* - Navicat MySQL Data Transfer - - Source Server : 本地 - Source Server Type : MySQL - Source Server Version : 80027 - Source Host : localhost - Source Database : bomaos-shop - - Target Server Type : MySQL - Target Server Version : 80027 - File Encoding : utf-8 - - Date: 07/31/2023 11:57:42 AM -*/ - -SET NAMES utf8; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for `oauth_token` --- ---------------------------- -DROP TABLE IF EXISTS `oauth_token`; -CREATE TABLE `oauth_token` ( - `token_id` int NOT NULL AUTO_INCREMENT, - `user_id` varchar(128) NOT NULL, - `access_token` varchar(128) NOT NULL, - `refresh_token` varchar(128) DEFAULT NULL, - `expire_time` datetime DEFAULT NULL, - `refresh_token_expire_time` datetime DEFAULT NULL, - `roles` varchar(512) DEFAULT NULL, - `permissions` varchar(512) DEFAULT NULL, - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`token_id`) -) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Table structure for `oauth_token_key` --- ---------------------------- -DROP TABLE IF EXISTS `oauth_token_key`; -CREATE TABLE `oauth_token_key` ( - `id` int NOT NULL AUTO_INCREMENT, - `token_key` varchar(128) NOT NULL COMMENT '生成token时的key', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Table structure for `sys_article` --- ---------------------------- -DROP TABLE IF EXISTS `sys_article`; -CREATE TABLE `sys_article` ( - `id` int NOT NULL AUTO_INCREMENT, - `title` varchar(255) DEFAULT NULL COMMENT '文章标题', - `excerpt` longtext COMMENT '摘要', - `content` longtext COMMENT '文章内容', - `likes` int DEFAULT NULL COMMENT '点赞数', - `see_number` int DEFAULT NULL COMMENT '查看数量', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `user_id` int DEFAULT NULL COMMENT '用户uid', - `picture` varchar(255) DEFAULT NULL COMMENT '文章图片', - `enabled` int DEFAULT NULL COMMENT '是否启用', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章表'; - --- ---------------------------- --- Table structure for `sys_cards` --- ---------------------------- -DROP TABLE IF EXISTS `sys_cards`; -CREATE TABLE `sys_cards` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', - `product_id` int DEFAULT NULL COMMENT '对应商品id', - `card_info` text COMMENT '卡密', - `status` int DEFAULT NULL COMMENT '卡密状态', - `sell_type` int DEFAULT NULL COMMENT '售卡类型', - `number` int DEFAULT NULL COMMENT '总数', - `sell_number` int DEFAULT NULL COMMENT '售出数量', - `created_at` datetime DEFAULT NULL COMMENT '创建时间', - `updated_at` datetime DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=218 DEFAULT CHARSET=utf8mb4 COMMENT='卡密'; - --- ---------------------------- --- Table structure for `sys_carousel` --- ---------------------------- -DROP TABLE IF EXISTS `sys_carousel`; -CREATE TABLE `sys_carousel` ( - `id` int NOT NULL AUTO_INCREMENT, - `title` varchar(255) DEFAULT NULL COMMENT '标题', - `link` longtext COMMENT '对应的链接地址', - `image_logo` longtext COMMENT '图片地址', - `summary` longtext COMMENT '简介', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `enabled` int DEFAULT NULL COMMENT '是否启用', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='轮播图管理'; - --- ---------------------------- --- Table structure for `sys_classifys` --- ---------------------------- -DROP TABLE IF EXISTS `sys_classifys`; -CREATE TABLE `sys_classifys` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', - `name` varchar(200) DEFAULT NULL COMMENT '分类名称', - `status` int DEFAULT NULL COMMENT '分类状态', - `sort` int DEFAULT NULL COMMENT '排序', - `created_at` datetime DEFAULT NULL COMMENT '创建时间', - `updated_at` datetime DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='分类'; - --- ---------------------------- --- Table structure for `sys_coupon` --- ---------------------------- -DROP TABLE IF EXISTS `sys_coupon`; -CREATE TABLE `sys_coupon` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', - `classifys_id` int DEFAULT NULL COMMENT '分类id', - `product_id` int DEFAULT NULL COMMENT '商品id', - `type` int DEFAULT NULL COMMENT '类型-0一次性,1重复使用', - `status` int DEFAULT NULL COMMENT '状态', - `coupon` varchar(255) DEFAULT NULL COMMENT '优惠券代码', - `discount_type` int DEFAULT NULL COMMENT '面额或者百分比', - `discount_val` decimal(18,2) DEFAULT NULL COMMENT '面额、折扣 价格和百分比', - `count_used` int DEFAULT NULL COMMENT '已使用次数', - `count_all` int DEFAULT NULL COMMENT '可用次数', - `remark` varchar(255) DEFAULT NULL COMMENT '备注', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `full_reduction` decimal(18,2) DEFAULT NULL COMMENT '满减金额', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券'; - --- ---------------------------- --- Table structure for `sys_dictionary` --- ---------------------------- -DROP TABLE IF EXISTS `sys_dictionary`; -CREATE TABLE `sys_dictionary` ( - `dict_id` int NOT NULL AUTO_INCREMENT COMMENT '字典id', - `dict_code` varchar(100) NOT NULL COMMENT '字典标识', - `dict_name` varchar(200) NOT NULL COMMENT '字典名称', - `sort_number` int NOT NULL DEFAULT '1' COMMENT '排序号', - `comments` varchar(400) DEFAULT NULL COMMENT '备注', - `deleted` int NOT NULL DEFAULT '0' COMMENT '是否删除,0否,1是', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`dict_id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='字典'; - --- ---------------------------- --- Records of `sys_dictionary` --- ---------------------------- -BEGIN; -INSERT INTO `sys_dictionary` VALUES ('1', 'sex', '性别', '1', '', '0', '2020-03-15 13:04:39', '2020-03-15 13:04:39'), ('2', 'organization_type', '机构类型', '2', '', '0', '2020-03-16 00:32:36', '2020-03-16 00:32:36'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_dictionary_data` --- ---------------------------- -DROP TABLE IF EXISTS `sys_dictionary_data`; -CREATE TABLE `sys_dictionary_data` ( - `dict_data_id` int NOT NULL AUTO_INCREMENT COMMENT '字典项id', - `dict_id` int NOT NULL COMMENT '字典id', - `dict_data_code` varchar(100) NOT NULL COMMENT '字典项标识', - `dict_data_name` varchar(200) NOT NULL COMMENT '字典项名称', - `sort_number` int NOT NULL DEFAULT '1' COMMENT '排序号', - `comments` varchar(400) DEFAULT NULL COMMENT '备注', - `deleted` int NOT NULL DEFAULT '0' COMMENT '是否删除,0否,1是', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`dict_data_id`), - KEY `dict_id` (`dict_id`), - CONSTRAINT `sys_dictionary_data_ibfk_1` FOREIGN KEY (`dict_id`) REFERENCES `sys_dictionary` (`dict_id`) ON DELETE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='字典项'; - --- ---------------------------- --- Records of `sys_dictionary_data` --- ---------------------------- -BEGIN; -INSERT INTO `sys_dictionary_data` VALUES ('1', '1', 'male', '男', '1', '', '0', '2020-03-15 13:07:28', '2020-03-15 13:07:28'), ('2', '1', 'female', '女', '2', '', '0', '2020-03-15 13:07:41', '2020-03-15 15:58:04'), ('3', '2', 'company', '公司', '1', '', '0', '2020-03-16 00:34:32', '2020-03-16 00:34:32'), ('4', '2', 'subsidiary', '子公司', '2', '', '0', '2020-03-16 00:35:02', '2020-03-16 00:35:02'), ('5', '2', 'department', '部门', '3', '', '0', '2020-03-16 00:35:18', '2020-03-16 00:35:18'), ('6', '2', 'group', '小组', '4', '', '0', '2020-03-16 00:35:36', '2020-03-16 00:35:36'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_links` --- ---------------------------- -DROP TABLE IF EXISTS `sys_links`; -CREATE TABLE `sys_links` ( - `id` int NOT NULL AUTO_INCREMENT, - `title` varchar(255) DEFAULT NULL COMMENT '标题', - `link` longtext COMMENT '链接地址', - `enabled` int DEFAULT NULL COMMENT '是否开启', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `remote_enabled` int DEFAULT NULL COMMENT '远程端', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='友情链接表'; - --- ---------------------------- --- Table structure for `sys_login_record` --- ---------------------------- -DROP TABLE IF EXISTS `sys_login_record`; -CREATE TABLE `sys_login_record` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', - `username` varchar(100) NOT NULL COMMENT '用户账号', - `os` varchar(200) DEFAULT NULL COMMENT '操作系统', - `device` varchar(200) DEFAULT NULL COMMENT '设备名', - `browser` varchar(200) DEFAULT NULL COMMENT '浏览器类型', - `ip` varchar(200) DEFAULT NULL COMMENT 'ip地址', - `oper_type` int NOT NULL COMMENT '操作类型,0登录成功,1登录失败,2退出登录,3刷新token', - `comments` varchar(400) DEFAULT NULL COMMENT '备注', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='登录日志'; - --- ---------------------------- --- Records of `sys_login_record` --- ---------------------------- -BEGIN; -INSERT INTO `sys_login_record` VALUES ('21', 'admin', 'Mac OS X', 'Mac OS X', 'Chrome 11', '127.0.0.1', '0', null, '2023-07-31 11:53:25', '2023-07-31 11:53:25'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_menu` --- ---------------------------- -DROP TABLE IF EXISTS `sys_menu`; -CREATE TABLE `sys_menu` ( - `menu_id` int NOT NULL AUTO_INCREMENT COMMENT '菜单id', - `parent_id` int NOT NULL DEFAULT '0' COMMENT '上级id,0是顶级', - `menu_name` varchar(200) NOT NULL COMMENT '菜单名称', - `menu_icon` varchar(200) DEFAULT NULL COMMENT '菜单图标', - `path` varchar(200) DEFAULT NULL COMMENT '菜单地址', - `menu_type` int DEFAULT '0' COMMENT '类型,0菜单,1按钮', - `sort_number` int NOT NULL DEFAULT '1' COMMENT '排序号', - `authority` varchar(200) DEFAULT NULL COMMENT '权限标识', - `target` varchar(200) DEFAULT '_self' COMMENT '打开位置', - `icon_color` varchar(200) DEFAULT NULL COMMENT '图标颜色', - `hide` int NOT NULL DEFAULT '0' COMMENT '是否隐藏,0否,1是', - `deleted` int NOT NULL DEFAULT '0' COMMENT '是否删除,0否,1是', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`menu_id`) -) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8mb4 COMMENT='菜单'; - --- ---------------------------- --- Records of `sys_menu` --- ---------------------------- -BEGIN; -INSERT INTO `sys_menu` VALUES ('1', '0', '系统管理', 'layui-icon layui-icon-set-sm', '', '0', '997', '', '_self', null, '0', '0', '2020-02-26 12:51:23', '2021-03-27 20:25:24'), ('2', '1', '用户管理', null, 'sys/user', '0', '1', 'sys:user:view', '_self', null, '0', '0', '2020-02-26 12:51:55', '2020-03-21 18:45:26'), ('3', '2', '查询用户', null, null, '1', '1', 'sys:user:list', '_self', null, '0', '0', '2020-02-26 12:52:06', '2020-03-21 18:45:28'), ('4', '2', '添加用户', null, null, '1', '2', 'sys:user:save', '_self', null, '0', '0', '2020-02-26 12:52:26', '2020-03-21 18:45:29'), ('5', '2', '修改用户', null, null, '1', '3', 'sys:user:update', '_self', null, '0', '0', '2020-02-26 12:52:50', '2020-03-21 18:45:30'), ('6', '2', '删除用户', null, null, '1', '4', 'sys:user:remove', '_self', null, '0', '0', '2020-02-26 12:53:13', '2020-03-21 18:45:32'), ('7', '1', '角色管理', null, 'sys/role', '0', '2', 'sys:role:view', '_self', null, '0', '0', '2020-03-13 13:29:08', '2020-03-21 18:45:33'), ('8', '7', '查询角色', null, null, '1', '1', 'sys:role:list', '_self', null, '0', '0', '2020-03-13 13:30:41', '2020-03-21 18:45:34'), ('9', '7', '添加角色', null, null, '1', '2', 'sys:role:save', '_self', null, '0', '0', '2020-03-15 13:02:07', '2020-03-21 18:45:35'), ('10', '7', '修改角色', null, null, '1', '3', 'sys:role:update', '_self', null, '0', '0', '2020-03-15 13:02:49', '2020-03-21 18:45:36'), ('11', '7', '删除角色', null, null, '1', '4', 'sys:role:remove', '_self', null, '0', '0', '2020-03-20 17:58:51', '2020-03-21 18:45:38'), ('12', '1', '菜单管理', null, 'sys/menu', '0', '3', 'sys:menu:view', '_self', null, '0', '0', '2020-03-21 01:07:13', '2020-03-21 18:45:39'), ('13', '12', '查询菜单', null, null, '1', '1', 'sys:menu:list', '_self', null, '0', '0', '2020-03-21 16:43:30', '2020-03-21 18:45:40'), ('14', '12', '添加菜单', null, null, '1', '2', 'sys:menu:save', '_self', null, '0', '0', '2020-03-21 16:43:54', '2020-03-21 18:45:41'), ('15', '12', '修改菜单', null, null, '1', '3', 'sys:menu:update', '_self', null, '0', '0', '2020-03-21 18:24:17', '2020-03-21 18:45:43'), ('16', '12', '删除菜单', null, null, '1', '4', 'sys:menu:remove', '_self', null, '0', '0', '2020-03-21 18:24:18', '2020-03-21 18:45:44'), ('17', '1', '机构管理', '', 'sys/organization', '0', '4', 'sys:org:view', '_self', null, '1', '0', '2020-03-21 18:24:20', '2021-11-10 16:41:09'), ('18', '17', '查询机构', null, null, '1', '1', 'sys:org:list', '_self', null, '0', '0', '2020-03-21 18:24:21', '2020-03-21 18:44:36'), ('19', '17', '添加机构', null, null, '1', '2', 'sys:org:save', '_self', null, '0', '0', '2020-03-21 18:24:22', '2020-03-21 18:45:51'), ('20', '17', '修改机构', null, null, '1', '3', 'sys:org:update', '_self', null, '0', '0', '2020-03-21 18:24:24', '2020-03-21 18:45:52'), ('21', '17', '删除机构', null, null, '1', '4', 'sys:org:remove', '_self', null, '0', '0', '2020-03-21 18:24:25', '2020-03-21 18:45:54'), ('22', '1', '字典管理', '', 'sys/dict', '0', '5', 'sys:dict:view', '_self', null, '1', '0', '2020-03-21 18:24:26', '2021-11-10 16:41:17'), ('23', '22', '查询字典', null, null, '1', '1', 'sys:dict:list', '_self', null, '0', '0', '2020-03-21 18:24:27', '2020-03-21 18:44:42'), ('24', '22', '添加字典', null, null, '1', '2', 'sys:dict:save', '_self', null, '0', '0', '2020-03-21 18:24:28', '2020-03-21 18:45:59'), ('25', '22', '修改字典', null, null, '1', '3', 'sys:dict:update', '_self', null, '0', '0', '2020-03-21 18:24:29', '2020-03-21 18:46:01'), ('26', '22', '删除字典', null, null, '1', '4', 'sys:dict:remove', '_self', null, '0', '0', '2020-03-21 18:24:31', '2020-03-21 18:46:02'), ('27', '0', '日志管理', 'layui-icon layui-icon-list', '', '0', '998', '', '_self', null, '0', '0', '2020-03-21 18:24:32', '2021-03-27 20:25:31'), ('28', '27', '登录日志', null, 'sys/loginRecord', '0', '1', 'sys:login_record:view', '_self', null, '0', '0', '2020-03-21 18:24:33', '2020-03-21 18:44:52'), ('29', '27', '操作日志', null, 'sys/operRecord', '0', '2', 'sys:oper_record:view', '_self', null, '0', '0', '2020-03-21 18:24:34', '2020-03-21 18:46:10'), ('30', '27', '数据监控', null, 'druid', '0', '3', null, '_self', null, '0', '0', '2020-03-21 18:24:35', '2020-03-22 14:46:21'), ('31', '0', '系统工具', 'layui-icon layui-icon-slider', '', '0', '999', '', '_self', null, '0', '0', '2020-03-21 18:24:36', '2021-03-27 20:25:39'), ('32', '31', '文件管理', null, 'file/manage', '0', '1', 'sys:file:view', '_self', null, '0', '0', '2020-03-21 18:24:38', '2020-03-22 14:46:57'), ('33', '32', '查询文件', null, null, '1', '1', 'sys:file:list', '_self', null, '0', '0', '2020-03-21 18:24:39', '2020-03-22 14:47:32'), ('34', '32', '删除文件', null, null, '1', '2', 'sys:file:remove', '_self', null, '0', '0', '2020-03-21 18:24:40', '2020-03-22 14:46:54'), ('35', '31', '发送邮件', null, 'sys/email', '0', '2', 'sys:email:view', '_self', null, '0', '0', '2020-03-21 18:24:41', '2020-03-22 14:47:35'), ('36', '31', '项目生成', '', '', '0', '3', '', '_self', null, '1', '1', '2020-03-21 18:24:42', '2021-11-10 16:41:57'), ('37', '0', '商品管理', 'layui-icon layui-icon-cart-simple', '', '0', '2', '', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-30 02:17:40'), ('38', '37', '分类管理', '', 'products/classifys', '0', '1', 'products:classifys:view', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-27 20:26:54'), ('39', '38', '查询分类', '', '', '1', '1', 'products:classifys:list', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-27 20:23:20'), ('40', '38', '添加分类', '', '', '1', '2', 'products:classifys:save', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-27 20:23:20'), ('41', '38', '修改分类', '', '', '1', '3', 'products:classifys:update', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-27 20:23:20'), ('42', '38', '删除分类', '', '', '1', '4', 'products:classifys:remove', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-27 20:23:20'), ('43', '37', '商品管理', '', 'products/products', '0', '3', 'products:products:view', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-06-05 15:51:44'), ('44', '43', '查询商品', '', '', '1', '1', 'products:products:list', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-27 20:23:20'), ('45', '43', '添加商品', '', '', '1', '2', 'products:products:save', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-27 20:23:20'), ('46', '43', '修改商品', '', '', '1', '3', 'products:products:update', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-27 20:23:20'), ('47', '43', '删除商品', '', '', '1', '4', 'products:products:remove', '_self', null, '0', '0', '2021-03-27 20:23:20', '2021-03-27 20:23:20'), ('48', '0', '卡密管理', 'layui-icon layui-icon-template-1', '', '0', '3', '', '_self', null, '0', '0', '2021-03-28 00:34:17', '2021-03-30 02:18:38'), ('49', '48', '卡密管理', '', 'carmi/cards', '0', '2', 'carmi:cards:view', '_self', null, '0', '0', '2021-03-28 00:34:17', '2021-03-28 00:46:41'), ('50', '49', '查询卡密', '', '', '1', '1', 'carmi:cards:list', '_self', null, '0', '0', '2021-03-28 00:34:17', '2021-03-28 00:34:17'), ('51', '54', '添加卡密', '', '', '1', '2', 'carmi:cards:save', '_self', null, '0', '0', '2021-03-28 00:34:17', '2021-03-28 00:46:54'), ('52', '49', '修改卡密', '', '', '1', '3', 'carmi:cards:update', '_self', null, '0', '0', '2021-03-28 00:34:17', '2021-03-28 00:34:17'), ('53', '49', '删除卡密', '', '', '1', '4', 'carmi:cards:remove', '_self', null, '0', '0', '2021-03-28 00:34:17', '2021-03-28 00:34:17'), ('54', '48', '添加卡密', '', 'carmi/cards/add', '0', '1', 'carmi:cards:view', '_self', null, '0', '0', '2021-03-28 00:46:11', '2021-03-28 00:46:26'), ('55', '48', '售出卡密', '', 'carmi/cards/sold', '0', '3', 'carmi:cards:view', '_self', null, '0', '1', '2021-03-28 14:36:53', '2021-11-02 15:12:47'), ('56', '43', '查询卡密', '', '', '1', '1', 'carmi:cards:list', '_self', null, '0', '0', '2021-03-28 14:37:26', '2021-11-10 03:03:13'), ('57', '0', '系统配置', 'layui-icon layui-icon-set-fill', '', '0', '996', '', '_self', null, '0', '0', '2021-03-29 11:07:27', '2021-11-10 16:40:55'), ('58', '57', '支付配置', '', 'settings/pays', '0', '2', 'settings:pays:view', '_self', null, '0', '0', '2021-03-29 11:07:27', '2021-07-04 04:01:04'), ('59', '58', '查询支付配置', '', '', '1', '1', 'settings:pays:list', '_self', null, '0', '0', '2021-03-29 11:07:27', '2021-03-29 11:07:27'), ('60', '58', '添加支付配置', '', '', '1', '2', 'settings:pays:save', '_self', null, '0', '0', '2021-03-29 11:07:27', '2021-03-29 11:07:27'), ('61', '58', '修改支付配置', '', '', '1', '3', 'settings:pays:update', '_self', null, '0', '0', '2021-03-29 11:07:27', '2021-03-29 11:07:27'), ('62', '58', '删除支付配置', '', '', '1', '4', 'settings:pays:remove', '_self', null, '0', '0', '2021-03-29 11:07:27', '2021-03-29 11:07:27'), ('63', '0', '订单管理', 'layui-icon layui-icon-rmb', '', '0', '4', '', '_self', null, '0', '0', '2021-03-29 16:26:07', '2021-03-30 02:18:55'), ('64', '63', '订单流水', '', 'orders/orders', '0', '1', 'orders:orders:view', '_self', null, '0', '0', '2021-03-29 16:26:07', '2021-03-29 17:01:42'), ('65', '64', '查询订单表', '', '', '1', '1', 'orders:orders:list', '_self', null, '0', '0', '2021-03-29 16:26:07', '2021-03-29 16:26:07'), ('66', '64', '添加订单表', '', '', '1', '2', 'orders:orders:save', '_self', null, '0', '0', '2021-03-29 16:26:07', '2021-03-29 16:26:07'), ('67', '64', '修改订单表', '', '', '1', '3', 'orders:orders:update', '_self', null, '0', '0', '2021-03-29 16:26:07', '2021-03-29 16:26:07'), ('68', '64', '删除订单表', '', '', '1', '4', 'orders:orders:remove', '_self', null, '0', '0', '2021-03-29 16:26:07', '2021-03-29 16:26:07'), ('69', '0', '卡密订单关联', 'layui-icon layui-icon-senior', '', '0', '999', 'carmi:orderCard:view', '_self', null, '1', '1', '2021-03-29 22:28:45', '2021-11-02 16:57:33'), ('70', '69', '订单关联卡密表管理', '', 'carmi/orderCard', '0', '1', 'carmi:orderCard:view', '_self', null, '0', '1', '2021-03-29 22:28:45', '2021-11-02 16:57:29'), ('71', '70', '查询订单关联卡密表', '', '', '1', '1', 'carmi:orderCard:list', '_self', null, '0', '1', '2021-03-29 22:28:45', '2021-11-02 16:57:56'), ('72', '70', '添加订单关联卡密表', '', '', '1', '2', 'carmi:orderCard:save', '_self', null, '0', '1', '2021-03-29 22:28:45', '2021-11-02 16:57:51'), ('73', '70', '修改订单关联卡密表', '', '', '1', '3', 'carmi:orderCard:update', '_self', null, '0', '1', '2021-03-29 22:28:45', '2021-11-02 16:58:02'), ('74', '70', '删除订单关联卡密表', '', '', '1', '4', 'carmi:orderCard:remove', '_self', null, '0', '1', '2021-03-29 22:28:45', '2021-11-02 16:58:05'), ('75', '0', '管理中心', 'layui-icon layui-icon-console', 'dashboard/workplace', '0', '1', 'dashboard:user:view', '_self', null, '0', '0', '2021-03-30 00:58:26', '2021-03-30 02:16:33'), ('76', '37', '添加商品', '', 'products/products/addProduct', '0', '2', 'products:products:view', '_self', null, '0', '0', '2021-06-05 15:51:32', '2021-06-05 15:52:52'), ('77', '0', 'website', 'layui-icon layui-icon-senior', '', '0', '1', '', '_self', null, '0', '1', '2021-06-06 02:17:34', '2021-06-06 02:19:37'), ('78', '57', '网站设置', '', 'website/website', '0', '4', 'website:website:view', '_self', null, '0', '0', '2021-06-06 02:17:34', '2021-07-04 04:01:28'), ('79', '78', '查询网站设置', '', '', '1', '1', 'website:website:list', '_self', null, '0', '0', '2021-06-06 02:17:34', '2021-06-06 02:17:34'), ('80', '78', '添加网站设置', '', '', '1', '2', 'website:website:save', '_self', null, '0', '0', '2021-06-06 02:17:34', '2021-06-06 02:17:34'), ('81', '78', '修改网站设置', '', '', '1', '3', 'website:website:update', '_self', null, '0', '0', '2021-06-06 02:17:34', '2021-06-06 02:17:34'), ('82', '78', '删除网站设置', '', '', '1', '4', 'website:website:remove', '_self', null, '0', '0', '2021-06-06 02:17:34', '2021-06-06 02:17:34'), ('83', '0', '营销助手', 'layui-icon layui-icon-senior', '', '0', '5', '', '_self', null, '0', '0', '2021-06-23 07:44:46', '2021-06-23 07:54:20'), ('84', '83', '优惠券管理', '', 'settings/coupon', '0', '2', 'settings:coupon:view', '_self', null, '0', '0', '2021-06-23 07:44:46', '2021-06-23 07:55:51'), ('85', '84', '查询优惠券', '', '', '1', '1', 'settings:coupon:list', '_self', null, '0', '0', '2021-06-23 07:44:46', '2021-06-23 07:44:46'), ('86', '84', '添加优惠券', '', '', '1', '2', 'settings:coupon:save', '_self', null, '0', '0', '2021-06-23 07:44:46', '2021-06-23 07:44:46'), ('87', '84', '修改优惠券', '', '', '1', '3', 'settings:coupon:update', '_self', null, '0', '0', '2021-06-23 07:44:46', '2021-06-23 07:44:46'), ('88', '84', '删除优惠券', '', '', '1', '4', 'settings:coupon:remove', '_self', null, '0', '0', '2021-06-23 07:44:46', '2021-06-23 07:44:46'), ('89', '83', '添加优惠券', '', 'settings/coupon/add', '0', '1', 'settings:coupon:view', '_self', null, '0', '0', '2021-06-23 07:55:44', '2021-06-23 07:56:13'), ('90', '0', 'theme', 'layui-icon layui-icon-senior', '', '0', '1', '', '_self', null, '0', '1', '2021-06-28 00:37:42', '2021-06-28 00:39:46'), ('91', '57', '主题配置', '', 'theme/theme', '0', '3', 'theme:theme:view', '_self', null, '0', '0', '2021-06-28 00:37:42', '2021-06-28 00:39:43'), ('92', '91', '查询主题配置', '', '', '1', '1', 'theme:theme:list', '_self', null, '0', '0', '2021-06-28 00:37:42', '2021-06-28 00:37:42'), ('93', '91', '添加主题配置', '', '', '1', '2', 'theme:theme:save', '_self', null, '0', '0', '2021-06-28 00:37:42', '2021-06-28 00:37:42'), ('94', '91', '修改主题配置', '', '', '1', '3', 'theme:theme:update', '_self', null, '0', '0', '2021-06-28 00:37:42', '2021-06-28 00:37:42'), ('95', '91', '删除主题配置', '', '', '1', '4', 'theme:theme:remove', '_self', null, '0', '0', '2021-06-28 00:37:42', '2021-06-28 00:37:42'), ('96', '0', 'settings', 'layui-icon layui-icon-senior', '', '0', '1', '', '_self', null, '0', '1', '2021-07-04 03:59:22', '2021-07-04 04:00:42'), ('97', '57', '商店设置', '', 'settings/shopSettings', '0', '1', 'settings:shopSettings:view', '_self', null, '0', '0', '2021-07-04 03:59:22', '2021-07-04 04:01:37'), ('98', '97', '查询商店设置', '', '', '1', '1', 'settings:shopSettings:list', '_self', null, '0', '0', '2021-07-04 03:59:22', '2021-07-04 03:59:22'), ('99', '97', '添加商店设置', '', '', '1', '2', 'settings:shopSettings:save', '_self', null, '0', '0', '2021-07-04 03:59:22', '2021-07-04 03:59:22'), ('100', '97', '修改商店设置', '', '', '1', '3', 'settings:shopSettings:update', '_self', null, '0', '0', '2021-07-04 03:59:22', '2021-07-04 03:59:22'), ('101', '97', '删除商店设置', '', '', '1', '4', 'settings:shopSettings:remove', '_self', null, '0', '0', '2021-07-04 03:59:22', '2021-07-04 03:59:22'), ('102', '57', '微信通知', '', 'wxpusher/send', '0', '2', 'settings:wxpusher:view', '_self', null, '0', '0', '2021-07-04 16:35:26', '2021-07-04 16:35:38'), ('103', '0', '内容管理', 'layui-icon layui-icon-senior', '', '0', '30', '', '_self', null, '0', '0', '2021-11-08 04:59:08', '2021-11-08 06:10:02'), ('104', '103', '文章管理', '', 'content/article', '0', '2', 'content:article:view', '_self', null, '0', '0', '2021-11-08 04:59:08', '2021-11-10 03:05:20'), ('105', '104', '查询文章表', '', '', '1', '1', 'content:article:list', '_self', null, '0', '0', '2021-11-08 04:59:08', '2021-11-08 04:59:08'), ('106', '104', '添加文章表', '', '', '1', '2', 'content:article:save', '_self', null, '0', '0', '2021-11-08 04:59:08', '2021-11-08 04:59:08'), ('107', '104', '修改文章表', '', '', '1', '3', 'content:article:update', '_self', null, '0', '0', '2021-11-08 04:59:08', '2021-11-08 04:59:08'), ('108', '104', '删除文章表', '', '', '1', '4', 'content:article:remove', '_self', null, '0', '0', '2021-11-08 04:59:08', '2021-11-08 04:59:08'), ('109', '103', '添加文章', '', 'content/article/addArticle', '0', '1', 'content:article:view', '_self', null, '0', '0', '2021-11-08 06:23:01', '2021-11-08 06:23:35'), ('110', '109', '添加文章表', '', '', '1', '1', 'content:article:save', '_self', null, '0', '0', '2021-11-08 06:24:24', '2021-11-08 06:25:03'), ('111', '0', 'content', 'layui-icon layui-icon-senior', '', '0', '1', '', '_self', null, '0', '1', '2021-11-10 03:01:51', '2021-11-10 03:03:49'), ('112', '103', '首页轮播', '', 'content/carousel', '0', '4', 'content:carousel:view', '_self', null, '0', '0', '2021-11-10 03:01:51', '2021-11-10 08:30:59'), ('113', '112', '查询轮播图管理', '', '', '1', '1', 'content:carousel:list', '_self', null, '0', '0', '2021-11-10 03:01:51', '2021-11-10 03:01:51'), ('114', '112', '添加轮播图管理', '', '', '1', '2', 'content:carousel:save', '_self', null, '0', '0', '2021-11-10 03:01:51', '2021-11-10 03:01:51'), ('115', '112', '修改轮播图管理', '', '', '1', '3', 'content:carousel:update', '_self', null, '0', '0', '2021-11-10 03:01:51', '2021-11-10 03:01:51'), ('116', '112', '删除轮播图管理', '', '', '1', '4', 'content:carousel:remove', '_self', null, '0', '0', '2021-11-10 03:01:51', '2021-11-10 03:01:51'), ('117', '103', '添加轮播图', '', 'content/carousel/addCarousel', '0', '3', 'content:carousel:view', '_self', null, '0', '1', '2021-11-10 03:05:12', '2021-11-10 08:30:37'), ('118', '117', '添加轮播图管理', '', '', '1', '1', 'content:carousel:save', '_self', null, '0', '0', '2021-11-10 03:06:39', '2021-11-10 03:06:39'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_oper_record` --- ---------------------------- -DROP TABLE IF EXISTS `sys_oper_record`; -CREATE TABLE `sys_oper_record` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', - `user_id` int DEFAULT NULL COMMENT '用户id', - `model` varchar(200) DEFAULT NULL COMMENT '操作模块', - `description` varchar(200) DEFAULT NULL COMMENT '操作方法', - `url` varchar(200) DEFAULT NULL COMMENT '请求地址', - `request_method` varchar(200) DEFAULT NULL COMMENT '请求方式', - `oper_method` varchar(200) DEFAULT NULL COMMENT '调用方法', - `param` varchar(2000) DEFAULT NULL COMMENT '请求参数', - `result` varchar(2000) DEFAULT NULL COMMENT '返回结果', - `ip` varchar(200) DEFAULT NULL COMMENT 'ip地址', - `comments` varchar(2000) DEFAULT NULL COMMENT '备注', - `spend_time` int DEFAULT NULL COMMENT '请求耗时,单位毫秒', - `state` int NOT NULL DEFAULT '0' COMMENT '状态,0成功,1异常', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - KEY `user_id` (`user_id`), - CONSTRAINT `sys_oper_record_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=1138 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志'; - --- ---------------------------- --- Records of `sys_oper_record` --- ---------------------------- -BEGIN; -INSERT INTO `sys_oper_record` VALUES ('1125', '1', '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"5\"]}', null, '127.0.0.1', null, '36', '0', '2023-07-31 11:53:27', '2023-07-31 11:53:27'), ('1126', '1', '文章表管理', '分页查询', '/content/article/page', 'GET', 'com.bomaos.content.controller.ArticleController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '7', '0', '2023-07-31 11:53:42', '2023-07-31 11:53:42'), ('1127', '1', '轮播图管理管理', '分页查询', '/content/carousel/page', 'GET', 'com.bomaos.content.controller.CarouselController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '3', '0', '2023-07-31 11:53:43', '2023-07-31 11:53:43'), ('1128', '1', '优惠券管理', '分页查询', '/settings/coupon/page', 'GET', 'com.bomaos.settings.controller.CouponController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '8', '0', '2023-07-31 11:53:46', '2023-07-31 11:53:46'), ('1129', '1', '订单表管理', '分页查询', '/orders/orders/page', 'GET', 'com.bomaos.orders.controller.OrdersController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '4', '0', '2023-07-31 11:53:47', '2023-07-31 11:53:47'), ('1130', '1', '卡密管理', '分页查询', '/carmi/cards/page', 'GET', 'com.bomaos.carmi.controller.CardsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '7', '0', '2023-07-31 11:53:49', '2023-07-31 11:53:49'), ('1131', '1', '商品管理', '分页查询', '/products/products/page', 'GET', 'com.bomaos.products.controller.ProductsController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '19', '0', '2023-07-31 11:53:52', '2023-07-31 11:53:52'), ('1132', '1', '分类管理', '分页查询', '/products/classifys/page', 'GET', 'com.bomaos.products.controller.ClassifysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '9', '0', '2023-07-31 11:53:54', '2023-07-31 11:53:54'), ('1133', '1', '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '25', '0', '2023-07-31 11:53:56', '2023-07-31 11:53:56'), ('1134', '1', '支付配置管理', '修改', '/settings/pays/update', 'POST', 'com.bomaos.settings.controller.PaysController.update', null, '{\"msg\":\"修改成功\",\"code\":0}', '127.0.0.1', null, '16', '0', '2023-07-31 11:55:10', '2023-07-31 11:55:10'), ('1135', '1', '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '13', '0', '2023-07-31 11:55:10', '2023-07-31 11:55:10'), ('1136', '1', '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"2\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '30', '0', '2023-07-31 11:55:12', '2023-07-31 11:55:12'), ('1137', '1', '支付配置管理', '分页查询', '/settings/pays/page', 'GET', 'com.bomaos.settings.controller.PaysController.page', '{\"page\":[\"1\"],\"limit\":[\"10\"]}', null, '127.0.0.1', null, '19', '0', '2023-07-31 11:55:21', '2023-07-31 11:55:21'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_orders` --- ---------------------------- -DROP TABLE IF EXISTS `sys_orders`; -CREATE TABLE `sys_orders` ( - `id` int NOT NULL AUTO_INCREMENT, - `member` varchar(255) DEFAULT NULL COMMENT '订单号', - `status` int DEFAULT NULL COMMENT '状态', - `number` int DEFAULT NULL COMMENT '订单数量', - `pay_time` datetime DEFAULT NULL COMMENT '支付时间', - `contact` varchar(255) DEFAULT NULL COMMENT '买家联系方式', - `product_id` int DEFAULT NULL COMMENT '商品id', - `product_name` varchar(255) DEFAULT NULL COMMENT '商品名称', - `ship_type` int DEFAULT NULL COMMENT '发货模式', - `pay_type` varchar(255) DEFAULT NULL COMMENT '支付类型', - `guest_id` int DEFAULT NULL COMMENT '支付用户的id(如果有)', - `ip` varchar(255) DEFAULT NULL COMMENT '买家ip', - `device` varchar(255) DEFAULT NULL COMMENT '购买设备', - `pay_no` varchar(255) DEFAULT NULL COMMENT '流水号', - `money` decimal(18,2) DEFAULT NULL COMMENT '付款金额', - `price` decimal(18,2) NOT NULL COMMENT '提交金额', - `create_time` datetime DEFAULT NULL COMMENT '订单创建时间', - `cloud_payid` varchar(255) DEFAULT '' COMMENT '云端id', - `email` varchar(255) DEFAULT NULL COMMENT '邮件通知', - `is_coupon` int DEFAULT NULL COMMENT '是否使用优惠券', - `coupon_id` int DEFAULT NULL COMMENT '优惠券id', - `user_id` int unsigned DEFAULT NULL COMMENT '用户id', - `password` varchar(255) DEFAULT NULL COMMENT '订单密码', - `cards_info` longtext COMMENT '卡密信息', - `attach_info` longtext COMMENT '附加信息', - `handling_fee` decimal(18,2) DEFAULT NULL COMMENT '手续费', - PRIMARY KEY (`id`,`price`), - KEY `id` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=83 DEFAULT CHARSET=utf8mb4 COMMENT='订单表'; - --- ---------------------------- --- Table structure for `sys_organization` --- ---------------------------- -DROP TABLE IF EXISTS `sys_organization`; -CREATE TABLE `sys_organization` ( - `organization_id` int NOT NULL AUTO_INCREMENT COMMENT '机构id', - `parent_id` int NOT NULL DEFAULT '0' COMMENT '上级id,0是顶级', - `organization_name` varchar(200) NOT NULL COMMENT '机构名称', - `organization_full_name` varchar(200) DEFAULT NULL COMMENT '机构全称', - `organization_code` varchar(100) DEFAULT NULL COMMENT '机构代码', - `organization_type` int NOT NULL COMMENT '机构类型', - `leader_id` int DEFAULT NULL COMMENT '负责人id', - `sort_number` int NOT NULL DEFAULT '1' COMMENT '排序号', - `comments` varchar(400) DEFAULT NULL COMMENT '备注', - `deleted` int NOT NULL DEFAULT '0' COMMENT '是否删除,0否,1是', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`organization_id`), - KEY `leader_id` (`leader_id`), - CONSTRAINT `sys_organization_ibfk_1` FOREIGN KEY (`leader_id`) REFERENCES `sys_user` (`user_id`) ON DELETE SET NULL -) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='组织机构'; - --- ---------------------------- --- Records of `sys_organization` --- ---------------------------- -BEGIN; -INSERT INTO `sys_organization` VALUES ('1', '0', 'XXX公司', 'XXXXXXXXX科技有限公司', null, '3', null, '1', '', '0', '2020-03-15 13:14:55', '2020-03-21 15:12:49'), ('2', '1', '研发部', '研发部', null, '5', null, '2', '', '0', '2020-03-15 13:15:16', '2020-03-16 00:43:09'), ('3', '2', '高教组', '高等教育行业项目组', null, '6', null, '3', '', '0', '2020-03-15 13:15:45', '2020-03-16 00:42:49'), ('4', '2', '政务组', '政务行业项目组', null, '6', null, '4', '', '0', '2020-03-15 13:16:15', '2020-03-16 00:42:54'), ('5', '2', '制造组', '生产制造行业项目组', null, '6', null, '5', '', '0', '2020-03-15 13:16:37', '2020-03-21 15:13:05'), ('6', '2', '仿真组', '虚拟仿真行业项目组', null, '6', null, '6', '', '0', '2020-03-15 13:16:57', '2020-03-16 00:43:03'), ('7', '1', '测试部', '测试部', null, '5', null, '6', '', '0', '2020-03-15 13:17:19', '2020-03-16 00:43:14'), ('8', '1', '设计部', 'UI设计部门', null, '5', null, '7', '', '0', '2020-03-15 13:17:56', '2020-03-16 00:43:18'), ('9', '1', '市场部', '市场部', null, '5', null, '8', '', '0', '2020-03-15 13:18:15', '2020-03-16 00:43:23'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_pays` --- ---------------------------- -DROP TABLE IF EXISTS `sys_pays`; -CREATE TABLE `sys_pays` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', - `name` varchar(255) DEFAULT NULL COMMENT '名称', - `driver` varchar(255) DEFAULT NULL COMMENT '驱动', - `config` longtext COMMENT '配置', - `comment` varchar(255) DEFAULT NULL COMMENT '说明', - `created_at` datetime DEFAULT NULL COMMENT '创建时间', - `updated_at` datetime DEFAULT NULL COMMENT '更新时间', - `is_mobile` int DEFAULT NULL COMMENT '移动端', - `is_pc` int DEFAULT NULL COMMENT 'pc端', - `is_handling_fee` int DEFAULT NULL COMMENT '手续费tag', - `handling_fee` int DEFAULT NULL COMMENT '手续费', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4 COMMENT='支付配置'; - --- ---------------------------- --- Records of `sys_pays` --- ---------------------------- -BEGIN; -INSERT INTO `sys_pays` VALUES ('1', '支付宝', 'mqpay_alipay', '{\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', 'V免签 - 支付宝(费率0)(自己搭建)', '2021-03-29 16:16:05', '2021-03-29 16:16:07', '0', '0', null, '0'), ('2', '微信', 'mqpay_wxpay', '{\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', 'V免签 - 微信 (费率0)(自己搭建)', '2021-03-29 16:17:52', '2021-03-29 16:17:55', '0', '0', null, '0'), ('3', 'QQ钱包', 'epay_qqpay', '{\"pid\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', '易支付 - QQ钱包', '2021-05-24 16:12:49', '2021-10-30 16:12:49', '0', '0', '0', '0'), ('5', '支付宝', 'epay_alipay', '{\"pid\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', '易支付 - 支付宝', '2021-05-24 12:00:01', '2021-05-24 12:00:04', '1', '1', null, '0'), ('6', '微信', 'epay_wxpay', '{\"pid\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"xxx\",\"key\":\"xxx\"}', '易支付 - 微信', '2021-05-24 12:00:55', '2021-05-24 12:01:00', '0', '0', null, '0'), ('7', '微信', 'yungouos_wxpay', '{\"mchId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxxx\"}', 'YunGouOS - 微信(个人小薇支付-费率低) 申请地址:https://dwz.cn/QQLN87nX', '2021-06-06 04:53:12', '2021-06-06 04:53:20', '0', '0', null, '0'), ('8', '支付宝', 'yungouos_alipay', '{\"mchId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', 'YunGouOS - 支付宝 (个人小薇支付-费率低) 申请地址:https://dwz.cn/QQLN87nX', '2021-06-06 04:54:03', '2021-06-06 04:54:06', '0', '0', null, '0'), ('9', '微信', 'xunhupay_wxpay', '{\"appid\":\"xxx\",\"appsecret\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"https://api.xunhupay.com/payment/do.html\"}', '虎皮椒V3 - 微信(费率-H5版2%/普通版1%) 申请地址:https://www.xunhupay.com', '2021-06-06 22:24:47', '2021-06-06 22:24:50', '0', '0', null, '0'), ('10', '支付宝', 'xunhupay_alipay', '{\"appid\":\"xxx\",\"appsecret\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"https://api.xunhupay.com/payment/do.html\"}', '虎皮椒V3 - 支付宝 申请地址:https://www.xunhupay.com', '2021-06-06 22:25:19', '2021-06-06 22:25:22', '0', '0', null, '0'), ('13', '微信', 'payjs_wxpay', '{\"mchId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', 'Payjs - 微信扫码 申请地址:https://payjs.cn', '2021-06-27 14:17:54', '2021-06-27 14:17:58', '0', '0', null, '0'), ('14', '支付宝', 'payjs_alipay', '{\"mchId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', 'Payjs - 支付宝扫码 申请地址:https://payjs.cn', '2021-06-27 14:18:38', '2021-06-27 14:18:43', '0', '0', null, '0'), ('17', '微信', 'wxpay', '{\"mchId\":\"xxx\",\"appId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', '官方微信 - 扫码支付', '2021-07-02 02:47:37', '2021-07-02 02:47:40', '0', '0', null, '0'), ('18', '支付宝', 'alipay', '{\"private_key\":\"xxx\",\"notify_url\":\"xxx\",\"app_id\":\"xxx\",\"alipay_public_key\":\"xxx\"}', '官方支付宝 - 当面付', '2021-07-03 18:53:08', '2021-07-02 18:53:11', '0', '0', '0', '0'), ('19', '微信H5', 'wxpay_h5', '{\"mchId\":\"xxx\",\"appId\":\"xxx\",\"notify_url\":\"xxx\",\"key\":\"xxx\"}', '官方微信 - H5支付 (开启后只在手机端显示)', '2021-07-02 23:20:54', '2021-08-17 23:20:56', '0', '0', null, '0'), ('20', 'Paypal', 'paypal', '{\"clientId\":\"xxx\",\"return_url\":\"xxx\",\"clientSecret\":\"xxx\"}', 'Paypal 境外支付(默认美元交易)', '2021-08-24 12:04:25', '2021-08-24 12:04:28', '0', '0', '0', '0'), ('22', '支付宝PC', 'alipay_pc', '{\"private_key\":\"xxx\",\"notify_url\":\"xxx\",\"app_id\":\"xxx\",\"alipay_public_key\":\"xxx\"}', '支付宝官方 - pc端支付', '2021-07-03 03:04:02', '2021-11-03 03:04:02', '0', '0', '0', '0'), ('23', 'USDT', 'epusdt', '{\"notify_url\":\"xxx\",\"create_url\":\"填写收银台域名后面不变/api/v1/order/create-transaction\",\"key\":\"xxx\"}', 'Epusdt TRC-20 数字货币 自己搭建【地址:https://github.com/assimon/epusdt】', '2022-09-15 15:33:41', '2022-09-15 15:33:43', '0', '0', '0', '8'), ('24', '支付宝', 'budpay_alipay', '{\"pid\":\"xxx\",\"notify_url\":\"xxx\",\"create_url\":\"https://pay.whbh1658.vip/api\",\"key\":\"xxx\"}', 'Budpay-支付宝支付', '2023-07-28 08:28:46', '2023-07-28 08:28:48', '0', '0', '0', '0'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_products` --- ---------------------------- -DROP TABLE IF EXISTS `sys_products`; -CREATE TABLE `sys_products` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID', - `name` varchar(255) DEFAULT NULL COMMENT '商品名称', - `price` decimal(18,2) DEFAULT NULL COMMENT '商品金额', - `sort` int DEFAULT NULL COMMENT '排序', - `link` varchar(255) DEFAULT NULL COMMENT '商品链接', - `status` int DEFAULT NULL COMMENT '商品状态', - `pd_info` longtext COMMENT '商品详情', - `created_at` datetime DEFAULT NULL COMMENT '创建时间', - `updated_at` datetime DEFAULT NULL COMMENT '更新时间', - `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', - `classify_id` int DEFAULT NULL COMMENT '分类id', - `index_logo` longtext COMMENT '首页截图', - `image_logo` longtext COMMENT '商品logo', - `is_wholesale` int DEFAULT NULL COMMENT '批发功能', - `wholesale` longtext COMMENT '批发配置', - `restricts` int DEFAULT '0' COMMENT '限制购买', - `ship_type` int DEFAULT NULL COMMENT '发货类型(0-自动,1-手动)', - `inventory` int DEFAULT NULL COMMENT '商品库存(人工发货类型生效)', - `sales` int DEFAULT NULL COMMENT '销量', - `is_password` int DEFAULT NULL COMMENT '是否开启密码查询', - `customize_input` longtext COMMENT '自定义输入框', - `is_customize` int DEFAULT NULL COMMENT '是否开启自定义输入框', - `sell_type` int DEFAULT NULL COMMENT '售卡类型', - `component_point` varchar(255) NOT NULL COMMENT '提示语', - `component_type` int DEFAULT NULL COMMENT '提示类型', - `component_url` varchar(255) DEFAULT NULL COMMENT '提示链接', - `component_enabled` int DEFAULT NULL COMMENT '是否开启提示', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='商品'; - --- ---------------------------- --- Table structure for `sys_role` --- ---------------------------- -DROP TABLE IF EXISTS `sys_role`; -CREATE TABLE `sys_role` ( - `role_id` int NOT NULL AUTO_INCREMENT COMMENT '角色id', - `role_name` varchar(200) NOT NULL COMMENT '角色名称', - `role_code` varchar(200) DEFAULT NULL COMMENT '角色标识', - `comments` varchar(400) DEFAULT NULL COMMENT '备注', - `deleted` int NOT NULL DEFAULT '0' COMMENT '是否删除,0否,1是', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`role_id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='角色'; - --- ---------------------------- --- Records of `sys_role` --- ---------------------------- -BEGIN; -INSERT INTO `sys_role` VALUES ('1', '管理员', 'admin', '管理员', '0', '2020-02-26 15:18:37', '2020-03-21 15:15:54'), ('2', '普通用户', 'user', '普通用户', '0', '2020-02-26 15:18:52', '2020-03-21 15:16:02'), ('3', '游客', 'guest', '游客', '0', '2020-02-26 15:19:49', '2020-03-21 15:16:57'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_role_menu` --- ---------------------------- -DROP TABLE IF EXISTS `sys_role_menu`; -CREATE TABLE `sys_role_menu` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `role_id` int NOT NULL COMMENT '角色id', - `menu_id` int NOT NULL COMMENT '菜单id', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - KEY `FK_sys_role_permission_role` (`role_id`), - KEY `menu_id` (`menu_id`), - CONSTRAINT `sys_role_menu_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE CASCADE, - CONSTRAINT `sys_role_menu_ibfk_2` FOREIGN KEY (`menu_id`) REFERENCES `sys_menu` (`menu_id`) ON DELETE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=763 DEFAULT CHARSET=utf8mb4 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='角色权限'; - --- ---------------------------- --- Records of `sys_role_menu` --- ---------------------------- -BEGIN; -INSERT INTO `sys_role_menu` VALUES ('656', '1', '75', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('657', '1', '37', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('658', '1', '38', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('659', '1', '39', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('660', '1', '40', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('661', '1', '41', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('662', '1', '42', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('663', '1', '76', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('664', '1', '43', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('665', '1', '44', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('666', '1', '56', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('667', '1', '45', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('668', '1', '46', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('669', '1', '47', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('670', '1', '48', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('671', '1', '54', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('672', '1', '51', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('673', '1', '49', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('674', '1', '50', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('675', '1', '52', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('676', '1', '53', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('677', '1', '63', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('678', '1', '64', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('679', '1', '65', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('680', '1', '66', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('681', '1', '67', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('682', '1', '68', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('683', '1', '83', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('684', '1', '89', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('685', '1', '84', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('686', '1', '85', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('687', '1', '86', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('688', '1', '87', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('689', '1', '88', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('690', '1', '103', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('691', '1', '109', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('692', '1', '110', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('693', '1', '104', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('694', '1', '105', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('695', '1', '106', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('696', '1', '107', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('697', '1', '108', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('698', '1', '117', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('699', '1', '118', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('700', '1', '112', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('701', '1', '113', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('702', '1', '114', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('703', '1', '115', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('704', '1', '116', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('705', '1', '1', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('706', '1', '2', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('707', '1', '3', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('708', '1', '4', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('709', '1', '5', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('710', '1', '6', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('711', '1', '7', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('712', '1', '8', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('713', '1', '9', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('714', '1', '10', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('715', '1', '11', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('716', '1', '12', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('717', '1', '13', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('718', '1', '14', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('719', '1', '15', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('720', '1', '16', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('721', '1', '17', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('722', '1', '18', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('723', '1', '19', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('724', '1', '20', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('725', '1', '21', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('726', '1', '22', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('727', '1', '23', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('728', '1', '24', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('729', '1', '25', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('730', '1', '26', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('731', '1', '57', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('732', '1', '97', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('733', '1', '98', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('734', '1', '99', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('735', '1', '100', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('736', '1', '101', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('737', '1', '58', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('738', '1', '59', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('739', '1', '60', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('740', '1', '61', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('741', '1', '62', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('742', '1', '102', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('743', '1', '91', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('744', '1', '92', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('745', '1', '93', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('746', '1', '94', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('747', '1', '95', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('748', '1', '78', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('749', '1', '79', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('750', '1', '80', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('751', '1', '81', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('752', '1', '82', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('753', '1', '27', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('754', '1', '28', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('755', '1', '29', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('756', '1', '30', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('757', '1', '31', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('758', '1', '32', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('759', '1', '33', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('760', '1', '34', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('761', '1', '35', '2021-11-10 03:07:03', '2021-11-10 03:07:03'), ('762', '1', '36', '2021-11-10 03:07:03', '2021-11-10 03:07:03'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_shop_settings` --- ---------------------------- -DROP TABLE IF EXISTS `sys_shop_settings`; -CREATE TABLE `sys_shop_settings` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', - `is_window` int DEFAULT NULL COMMENT '是否开启弹窗', - `window_text` longtext COMMENT '弹窗内容', - `is_background` varchar(255) DEFAULT NULL COMMENT '全局背景图', - `store_details` longtext COMMENT '商店详情', - `is_wxpusher` int DEFAULT NULL COMMENT '是否开启微信通知', - `app_token` varchar(255) DEFAULT NULL COMMENT 'pusher token', - `wxpush_uid` varchar(255) DEFAULT NULL COMMENT '微信通知uid', - `is_email` int DEFAULT '0' COMMENT '邮件通知开关', - `is_list_layout` int DEFAULT NULL COMMENT '是否开启列表布局', - `quotations` varchar(255) DEFAULT NULL COMMENT '首页语录', - `qq_customer_service` varchar(255) DEFAULT NULL COMMENT 'QQ客服', - `qq_group_qrcode` varchar(255) DEFAULT NULL COMMENT 'QQ群二维码', - `tg_customer_service` varchar(255) DEFAULT NULL COMMENT 'TG客服', - `is_client` int DEFAULT NULL COMMENT '是否开启客服', - `crisp_key` varchar(255) DEFAULT NULL COMMENT 'crisp密钥', - `is_model` int DEFAULT NULL COMMENT '首页模版', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='商店设置'; - --- ---------------------------- --- Records of `sys_shop_settings` --- ---------------------------- -BEGIN; -INSERT INTO `sys_shop_settings` VALUES ('1', '1', '
\n

    想把世界最好的给你,却发现世上最好的是你;我不要不老的青春,只要一个盗不走的爱人。

\n

 

\n
\n
\n

    有时幸福就像手心里的沙,握得越紧,失去得越快;有时幸福就像隔岸的花朵,隐约可见,却无法触摸。两个人的世界里,总要一个闹着、一个笑着、一个吵着、一个哄着。

\n
', 'https://s1.hdslb.com/bfs/static/blive/blfe-dynamic-web/static/img/background.bc725153.png', '

打开祝福的心扉,让梦想在晨光中翱翔。

', '1', 'xxx', 'xxx', '0', '1', '打开祝福的心扉,让梦想在晨光中翱翔。', '1724962375', 'xxx', 'xxx', '1', '3ff64218-c586-4c42-91fe-c13c8aa07405', '0'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_theme` --- ---------------------------- -DROP TABLE IF EXISTS `sys_theme`; -CREATE TABLE `sys_theme` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', - `name` varchar(255) DEFAULT NULL COMMENT '主题名称', - `description` longtext COMMENT '说明', - `driver` varchar(255) DEFAULT NULL COMMENT '主题驱动', - `enable` int DEFAULT NULL COMMENT '是否设置', - `update_date` datetime DEFAULT NULL COMMENT '更新时间', - `create_date` datetime DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='主题配置'; - --- ---------------------------- --- Records of `sys_theme` --- ---------------------------- -BEGIN; -INSERT INTO `sys_theme` VALUES ('1', '系统默认', '系统预设主题', 'default', '1', '2021-06-28 00:58:32', '2021-06-28 00:58:34'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_user` --- ---------------------------- -DROP TABLE IF EXISTS `sys_user`; -CREATE TABLE `sys_user` ( - `user_id` int NOT NULL AUTO_INCREMENT COMMENT '用户id', - `username` varchar(100) NOT NULL COMMENT '账号', - `password` varchar(200) NOT NULL COMMENT '密码', - `nick_name` varchar(200) NOT NULL COMMENT '昵称', - `avatar` varchar(200) DEFAULT NULL COMMENT '头像', - `sex` int DEFAULT NULL COMMENT '性别', - `phone` varchar(200) DEFAULT NULL COMMENT '手机号', - `email` varchar(200) DEFAULT NULL COMMENT '邮箱', - `email_verified` int NOT NULL DEFAULT '0' COMMENT '邮箱是否验证,0否,1是', - `true_name` varchar(200) DEFAULT NULL COMMENT '真实姓名', - `id_card` varchar(200) DEFAULT NULL COMMENT '身份证号', - `birthday` date DEFAULT NULL COMMENT '出生日期', - `introduction` varchar(200) DEFAULT NULL COMMENT '个人简介', - `organization_id` int DEFAULT NULL COMMENT '机构id', - `state` int NOT NULL DEFAULT '0' COMMENT '状态,0正常,1冻结', - `deleted` int NOT NULL DEFAULT '0' COMMENT '是否删除,0否,1是', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - `qq_uuid` varchar(255) DEFAULT NULL COMMENT 'qquuid', - `wx_uuid` varchar(255) DEFAULT NULL COMMENT 'wxuuid', - PRIMARY KEY (`user_id`), - KEY `organization_id` (`organization_id`), - CONSTRAINT `sys_user_ibfk_1` FOREIGN KEY (`organization_id`) REFERENCES `sys_organization` (`organization_id`) ON DELETE SET NULL -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='用户'; - --- ---------------------------- --- Records of `sys_user` --- ---------------------------- -BEGIN; -INSERT INTO `sys_user` VALUES ('1', 'admin', '21232f297a57a5a743894a0e4a801fc3', '管理员', null, '1', '', null, '0', null, null, null, '312312344444', null, '0', '0', '2020-01-13 14:43:52', '2022-04-12 15:25:09', null, null); -COMMIT; - --- ---------------------------- --- Table structure for `sys_user_role` --- ---------------------------- -DROP TABLE IF EXISTS `sys_user_role`; -CREATE TABLE `sys_user_role` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `user_id` int NOT NULL COMMENT '用户id', - `role_id` int NOT NULL COMMENT '角色id', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - KEY `FK_sys_user_role` (`user_id`), - KEY `FK_sys_user_role_role` (`role_id`), - CONSTRAINT `sys_user_role_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE CASCADE, - CONSTRAINT `sys_user_role_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='用户角色'; - --- ---------------------------- --- Records of `sys_user_role` --- ---------------------------- -BEGIN; -INSERT INTO `sys_user_role` VALUES ('2', '1', '1', '2021-08-23 18:29:06', '2021-08-23 18:29:06'); -COMMIT; - --- ---------------------------- --- Table structure for `sys_website` --- ---------------------------- -DROP TABLE IF EXISTS `sys_website`; -CREATE TABLE `sys_website` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', - `website_name` varchar(255) DEFAULT NULL COMMENT '网站名称', - `website_url` varchar(255) DEFAULT NULL COMMENT '网站域名', - `website_logo` varchar(255) DEFAULT '' COMMENT '网站logo', - `contact` varchar(255) DEFAULT NULL COMMENT '联系方式', - `beian_icp` varchar(255) DEFAULT NULL COMMENT '备案ICP', - `keywords` longtext COMMENT '关键字', - `description` longtext COMMENT '网站描述', - `favicon` varchar(255) DEFAULT NULL COMMENT 'favicon', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='网站设置'; - --- ---------------------------- --- Records of `sys_website` --- ---------------------------- -BEGIN; -INSERT INTO `sys_website` VALUES ('1', '波猫商店', 'http://free.bomaos.com', '', '1724962375', 'Copyright © 2012-2022 波猫商店', '商城系统,商城源码,tg营销助手,发卡网', '波猫商店 - 全新UI商城系统', ''); -COMMIT; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/src/main/java/com/bomaos/BomaosApplication.java b/src/main/java/com/bomaos/BomaosApplication.java new file mode 100644 index 0000000..beb9e0b --- /dev/null +++ b/src/main/java/com/bomaos/BomaosApplication.java @@ -0,0 +1,24 @@ +package com.bomaos; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; +import org.wf.jwtp.configuration.EnableJwtPermission; + +@EnableJwtPermission +@EnableAsync +@MapperScan("com.bomaos.**.mapper") +@SpringBootApplication +public class BomaosApplication /*extends SpringBootServletInitializer*/ { + + public static void main(String[] args) { + SpringApplication.run(BomaosApplication.class, args); + } + + /*@Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(ZlianWebApplication.class); + }*/ + +} diff --git a/src/main/java/com/bomaos/carmi/controller/CardsController.java b/src/main/java/com/bomaos/carmi/controller/CardsController.java new file mode 100644 index 0000000..7a23e5c --- /dev/null +++ b/src/main/java/com/bomaos/carmi/controller/CardsController.java @@ -0,0 +1,223 @@ +package com.bomaos.carmi.controller; + +import com.bomaos.carmi.entity.Cards; +import com.bomaos.carmi.service.CardsService; +import com.bomaos.carmi.vo.CardsDts; +import com.bomaos.carmi.vo.CardsVo; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.products.entity.Classifys; +import com.bomaos.products.entity.Products; +import com.bomaos.products.service.ClassifysService; +import com.bomaos.products.service.ProductsService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 卡密管理 + * Created by Panyoujie on 2021-03-28 00:33:15 + */ +@Controller +@RequestMapping("/carmi/cards") +public class CardsController extends BaseController { + + @Autowired + private CardsService cardsService; + + @Autowired + private ClassifysService classifysService; + + @Autowired + private ProductsService productsService; + + @RequiresPermissions("carmi:cards:view") + @RequestMapping() + public String view(Model model) { + List classifysList = classifysService.listAll(null); + model.addAttribute("classifysList", classifysList); + // 供应商数据隔离:只显示自己的商品 + Integer supplierId = getLoginUserSupplierId(); + List productsList; + if (supplierId != null) { + productsList = productsService.list( + new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper() + .eq("supplier_id", supplierId)); + } else { + productsList = productsService.listAll(null); + } + model.addAttribute("productsList", productsList); + return "carmi/cards.html"; + } + + @RequiresPermissions("carmi:cards:view") + @RequestMapping("/add") + public String ViewAdd(Model model) { + List classifysList = classifysService.listAll(null); + model.addAttribute("classifysList", classifysList); + return "carmi/cards-add.html"; + } + + /** + * 分页查询卡密 + */ + @RequiresPermissions("carmi:cards:list") + @OperLog(value = "卡密管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + // 供应商数据隔离 + Integer supplierId = getLoginUserSupplierId(); + if (supplierId != null) { + pageParam.put("supplierId", supplierId); + } + List records = cardsService.page(pageParam, pageParam.getWrapper()).getRecords(); + List cardsVoList = records.stream().map((cards) -> { + CardsVo cardsVo = new CardsVo(); + BeanUtils.copyProperties(cards, cardsVo); + // 查出商品的名称 + Products products = productsService.getById(cards.getProductId()); + cardsVo.setProductName(products.getName()); + return cardsVo; + }).collect(Collectors.toList()); + return new PageResult<>(cardsVoList, pageParam.getTotal()); + } + + /** + * 查询全部卡密 + */ + @RequiresPermissions("carmi:cards:list") + @OperLog(value = "卡密管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(cardsService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询卡密 + */ + @RequiresPermissions("carmi:cards:list") + @OperLog(value = "卡密管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(cardsService.getById(id)); + } + + /** + * 添加卡密 + */ + @RequiresPermissions("carmi:cards:save") + @OperLog(value = "卡密管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(CardsDts cardsDts) { + Products products = productsService.getById(cardsDts.getProductId()); + // 供应商只能向自己的商品添加卡密 + Integer supplierId = getLoginUserSupplierId(); + if (supplierId != null && !supplierId.equals(products.getSupplierId())) { + return JsonResult.error("无权操作此商品的卡密!"); + } + if (products.getSellType() != cardsDts.getSellType()) { // 重复销售 + return JsonResult.error("本商品为重复售卡类型、请使用重复售卡来导入卡密!!"); + } + return cardsService.addCards(cardsDts); + } + + /** + * 修改卡密 + */ + @RequiresPermissions("carmi:cards:update") + @OperLog(value = "卡密管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Cards cards) { + if (cardsService.updateById(cards)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除卡密 + */ + @RequiresPermissions("carmi:cards:remove") + @OperLog(value = "卡密管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (cardsService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加卡密 + */ + @RequiresPermissions("carmi:cards:save") + @OperLog(value = "卡密管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (cardsService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改卡密 + */ + @RequiresPermissions("carmi:cards:update") + @OperLog(value = "卡密管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(cardsService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除卡密 + */ + @RequiresPermissions("carmi:cards:remove") + @OperLog(value = "卡密管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (cardsService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 卡密导出 + * + * @param request + * @throws Exception + */ + @RequiresPermissions("carmi:cards:list") + @OperLog(value = "卡密管理", desc = "导出指定的数据") + @RequestMapping(value = "/export", method = RequestMethod.GET) + public void exportCardSecret(HttpServletRequest request) throws Exception { + cardsService.export(request); + } + +} diff --git a/src/main/java/com/bomaos/carmi/dto/CardsDto.java b/src/main/java/com/bomaos/carmi/dto/CardsDto.java new file mode 100644 index 0000000..284e5a7 --- /dev/null +++ b/src/main/java/com/bomaos/carmi/dto/CardsDto.java @@ -0,0 +1,42 @@ +package com.bomaos.carmi.dto; + +import com.bomaos.carmi.excel.Excel; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; + +@Data +@ToString +@Excel("卡券导出信息") +public class CardsDto implements Serializable { + private static final long serialVersionUID = 1L; + + @Excel("ID") + private Integer id; + + /** + * 对应商品id + */ + @Excel("对应商品ID") + private String productName; + + /** + * 卡密 + */ + @Excel("卡密") + private String cardInfo; + + /** + * 卡密状态 + */ + @Excel("卡密状态") + private String status; + + /** + * 创建时间 + */ + @Excel("创建时间") + private String createdAt; + +} diff --git a/src/main/java/com/bomaos/carmi/entity/Cards.java b/src/main/java/com/bomaos/carmi/entity/Cards.java new file mode 100644 index 0000000..4683c2f --- /dev/null +++ b/src/main/java/com/bomaos/carmi/entity/Cards.java @@ -0,0 +1,73 @@ +package com.bomaos.carmi.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Date; + +/** + * 卡密 + * Created by Panyoujie on 2021-03-28 00:33:15 + */ +@Data +@ToString +@TableName("sys_cards") +public class Cards implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 自增ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 对应商品id + */ + private Integer productId; + + /** + * 卡密 + */ + private String cardInfo; + + /** + * 卡密状态 + */ + private Integer status; + + /** + * 售卡类型 + */ + private Integer sellType; + + /** + * 总数 + */ + private Integer number; + + /** + * 售出数量 + */ + private Integer sellNumber; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新时间 + */ + private Date updatedAt; + + /** + * 供应商id + */ + private Integer supplierId; + +} diff --git a/src/main/java/com/bomaos/carmi/excel/Excel.java b/src/main/java/com/bomaos/carmi/excel/Excel.java new file mode 100644 index 0000000..ac62c08 --- /dev/null +++ b/src/main/java/com/bomaos/carmi/excel/Excel.java @@ -0,0 +1,22 @@ +package com.bomaos.carmi.excel; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.FIELD}) +public @interface Excel { + // 字段标题名称或文件名称 + String value(); + + // excel操作类型ExcelType + ExcelType type() default ExcelType.ALL; + + // 字段字典标识,用于导入导出时进行字典转换(只支持导出操作) + String dict() default ""; + + // 关联操作实体对象字段名称,用于获取关联数据(只支持导出操作) + String joinField() default ""; +} diff --git a/src/main/java/com/bomaos/carmi/excel/ExcelSxssFUtil.java b/src/main/java/com/bomaos/carmi/excel/ExcelSxssFUtil.java new file mode 100644 index 0000000..328ba0a --- /dev/null +++ b/src/main/java/com/bomaos/carmi/excel/ExcelSxssFUtil.java @@ -0,0 +1,223 @@ +package com.bomaos.carmi.excel; + +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.streaming.SXSSFCell; +import org.apache.poi.xssf.streaming.SXSSFRow; +import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFFont; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletResponse; +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author lixy + * @className: ExcelSxssFUtil + * @Version 1.0 + * @description: TODO 大批量数据导出 + * @Email: 2542130759@qq.com + * @date 2020/12/16 17:14 + */ +public class ExcelSxssFUtil { + + + public static void exportExcel(List fields, SXSSFWorkbook workbook, List list, String sheetTitle) { + List fns = getFieldName(fields); + + SXSSFSheet sheet = getCommon(workbook, sheetTitle, fields); + CellStyle cellStyle = getCellStyle(workbook); + + // 时间样式 + CellStyle dateStyle = workbook.createCellStyle(); + dateStyle.cloneStyleFrom(cellStyle); + DataFormat format = workbook.createDataFormat(); + dateStyle.setDataFormat(format.getFormat("yyyy-MM-dd HH:mm:ss")); + + for (int i = 0; i < list.size(); i++) { + SXSSFRow row = sheet.createRow(i + 2); + T item = list.get(i); + + // 通过反射机制获取实体对象的状态 + try { + final BeanInfo bi = Introspector.getBeanInfo(item.getClass()); + for (final PropertyDescriptor pd : bi.getPropertyDescriptors()) { + if (fns.contains(pd.getName())) { + Object value = pd.getReadMethod().invoke(item, (Object[]) null); + int index = fns.indexOf(pd.getName()); + SXSSFCell cell = row.createCell(index); + if (value != null) { + Excel excel = fields.get(index).getAnnotation(Excel.class); + // 给单元格赋值 + if (value instanceof Number) { + cell.setCellValue((Double.valueOf(String.valueOf(value)))); + } else if (value instanceof Date) { + cell.setCellValue((Date) value); + cell.setCellStyle(dateStyle); + continue; + } else { + cell.setCellValue(String.valueOf(value)); + } + } + cell.setCellStyle(cellStyle); + } + } + } catch (InvocationTargetException | IntrospectionException | IllegalAccessException e) { + String message = "导入失败:字段名称匹配失败!"; + throw new IllegalArgumentException(message, e); + } + + } + } + + + /** + * 获取通用样式 + */ + private static CellStyle getCellStyle(SXSSFWorkbook workbook) { + CellStyle cellStyle = workbook.createCellStyle(); + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderLeft(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setAlignment(HorizontalAlignment.LEFT); + XSSFFont font = (XSSFFont) workbook.createFont(); + font.setFontName("Microsoft YaHei UI"); + cellStyle.setFont(font); + return cellStyle; + } + + /** + * 功能模板(标题及表头) + */ + public static SXSSFSheet getCommon(SXSSFWorkbook workbook, String sheetTitle, List fields) { + SXSSFSheet sheet = workbook.createSheet(sheetTitle); + + // 设置列宽度 + for (int i = 0; i < fields.size(); i++) { + sheet.setColumnWidth(i, 16 * 256); + } + + // 通用样式 + CellStyle cellStyle = getCellStyle(workbook); + + // 标题样式 + CellStyle titleStyle = workbook.createCellStyle(); + titleStyle.cloneStyleFrom(cellStyle); + titleStyle.setAlignment(HorizontalAlignment.CENTER); + titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = workbook.createFont(); + titleFont.setFontName("Microsoft YaHei UI"); + titleFont.setBold(true); + titleFont.setFontHeightInPoints((short) 14); + titleStyle.setFont(titleFont); + + // 表头样式 + CellStyle thStyle = workbook.createCellStyle(); + thStyle.cloneStyleFrom(titleStyle); + thStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + thStyle.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font thFont = workbook.createFont(); + thFont.setFontName("Microsoft YaHei UI"); + thFont.setBold(titleFont.getBold()); + thFont.setColor(IndexedColors.WHITE.getIndex()); + thStyle.setFont(thFont); + + // 创建标题样式、表格表头 + SXSSFRow titleRow = sheet.createRow(0); + SXSSFRow thsRow = sheet.createRow(1); + for (int i = 0; i < fields.size(); i++) { + Excel excel = fields.get(i).getAnnotation(Excel.class); + SXSSFCell title = titleRow.createCell(i); + title.setCellStyle(titleStyle); + SXSSFCell th = thsRow.createCell(i); + th.setCellValue(excel.value()); + th.setCellStyle(thStyle); + } + + // 绘制标题 + titleRow.setHeight((short) (26 * 20)); + SXSSFCell titleCell = titleRow.createCell(0); + titleCell.setCellValue(sheetTitle); + titleCell.setCellStyle(titleStyle); + + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, fields.size() - 1)); + return sheet; + + } + + public static List getExcelList(Class entity, ExcelType type) { + List list = new ArrayList<>(); + Field[] fields = entity.getDeclaredFields(); + for (Field field : fields) { + if (field.isAnnotationPresent(Excel.class)) { + ExcelType fieldType = field.getAnnotation(Excel.class).type(); + if (fieldType.equals(ExcelType.ALL) || fieldType.equals(type)) { + list.add(field); + } + } + } + return list; + } + + /** + * 获取实体类带有@Excel字段名 + */ + private static List getFieldName(List fields) { + List list = new ArrayList<>(); + for (Field field : fields) { + list.add(field.getName()); + } + return list; + } + + public static void download(SXSSFWorkbook workbook, String fileName) { + try { + fileName = URLEncoder.encode(fileName + ".xlsx", "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + ServletRequestAttributes getServletRequest = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletResponse response = getServletRequest.getResponse(); + response.setCharacterEncoding("utf-8"); + response.setContentType("multipart/form-data"); + response.setHeader("Content-Disposition", "attachment;fileName=" + fileName); + OutputStream ros = null; + try { + ros = response.getOutputStream(); + workbook.write(ros); + ros.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (ros != null) { + try { + ros.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (workbook != null) { + try { + workbook.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/src/main/java/com/bomaos/carmi/excel/ExcelType.java b/src/main/java/com/bomaos/carmi/excel/ExcelType.java new file mode 100644 index 0000000..7de25d2 --- /dev/null +++ b/src/main/java/com/bomaos/carmi/excel/ExcelType.java @@ -0,0 +1,5 @@ +package com.bomaos.carmi.excel; + +public enum ExcelType { + ALL, IMPORT, EXPORT +} diff --git a/src/main/java/com/bomaos/carmi/mapper/CardsMapper.java b/src/main/java/com/bomaos/carmi/mapper/CardsMapper.java new file mode 100644 index 0000000..134acd8 --- /dev/null +++ b/src/main/java/com/bomaos/carmi/mapper/CardsMapper.java @@ -0,0 +1,37 @@ +package com.bomaos.carmi.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.carmi.entity.Cards; +import com.bomaos.common.core.web.PageParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 卡密Mapper接口 + * Created by Panyoujie on 2021-03-28 00:33:15 + */ +public interface CardsMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + + + /** + * 查询卡密 + * + * @param status + * @param productId + * @return + */ + List getCard(Integer status, Integer productId, Integer number); + +} diff --git a/src/main/java/com/bomaos/carmi/mapper/xml/CardsMapper.xml b/src/main/java/com/bomaos/carmi/mapper/xml/CardsMapper.xml new file mode 100644 index 0000000..005945a --- /dev/null +++ b/src/main/java/com/bomaos/carmi/mapper/xml/CardsMapper.xml @@ -0,0 +1,63 @@ + + + + + + + SELECT a.* + FROM sys_cards a + + + + AND a.id = #{page.pageData.id} + + + AND a.product_id = #{page.pageData.productId} + + + AND a.card_info LIKE CONCAT('%', #{page.pageData.cardInfo}, '%') + + + AND a.status = #{page.pageData.status} + + + AND a.sell_type = #{page.pageData.sellType} + + + AND a.number = #{page.pageData.number} + + + AND a.sell_number = #{page.pageData.sellNumber} + + + AND a.created_at LIKE CONCAT('%', #{page.pageData.createdAt}, '%') + + + AND a.updated_at LIKE CONCAT('%', #{page.pageData.updatedAt}, '%') + + + AND a.supplier_id = #{page.pageData.supplierId} + + + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/carmi/service/CardsService.java b/src/main/java/com/bomaos/carmi/service/CardsService.java new file mode 100644 index 0000000..fabef8d --- /dev/null +++ b/src/main/java/com/bomaos/carmi/service/CardsService.java @@ -0,0 +1,35 @@ +package com.bomaos.carmi.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.carmi.entity.Cards; +import com.bomaos.carmi.vo.CardsDts; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** + * 卡密服务类 + * Created by Panyoujie on 2021-03-28 00:33:15 + */ +public interface CardsService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + + JsonResult addCards(CardsDts cardsDts); + + List getCard(Integer status, Integer productId, Integer number); + + void export(HttpServletRequest request); +} diff --git a/src/main/java/com/bomaos/carmi/service/impl/CardsServiceImpl.java b/src/main/java/com/bomaos/carmi/service/impl/CardsServiceImpl.java new file mode 100644 index 0000000..bde0ddd --- /dev/null +++ b/src/main/java/com/bomaos/carmi/service/impl/CardsServiceImpl.java @@ -0,0 +1,158 @@ +package com.bomaos.carmi.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.carmi.dto.CardsDto; +import com.bomaos.carmi.entity.Cards; +import com.bomaos.carmi.excel.Excel; +import com.bomaos.carmi.excel.ExcelSxssFUtil; +import com.bomaos.carmi.excel.ExcelType; +import com.bomaos.carmi.mapper.CardsMapper; +import com.bomaos.carmi.service.CardsService; +import com.bomaos.carmi.vo.CardsDts; +import com.bomaos.common.core.utils.CoreUtil; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.products.entity.Products; +import com.bomaos.products.mapper.ProductsMapper; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 卡密服务实现类 + * Created by Panyoujie on 2021-03-28 00:33:15 + */ +@Service +@Transactional +public class CardsServiceImpl extends ServiceImpl implements CardsService { + + @Autowired + private ProductsMapper productsMapper; + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + + @Override + public JsonResult addCards(CardsDts cardsDts) { + if (cardsDts.getSellType() == 0) { // 单卡销售 + String[] cardsInfo = cardsDts.getCardInfo().split("\\n"); + + List newlist = new ArrayList(); + for (int i = 0; i < cardsInfo.length; ++i) { + if (cardsDts.getRepeat() == 0) { + newlist.add(CoreUtil.getStringNoBlank(cardsInfo[i])); + } else if (cardsDts.getRepeat() == 1 && !newlist.contains(cardsInfo[i])) { + newlist.add(CoreUtil.getStringNoBlank(cardsInfo[i])); + } + } + + while (newlist.remove(null)) ; + while (newlist.remove("")) ; + + List cardsArrayList = new ArrayList<>(); + for (String cardInfo : newlist) { + Cards cards = new Cards(); + cards.setProductId(cardsDts.getProductId()); + cards.setCardInfo(CoreUtil.getStringNoBlank(cardInfo)); + cards.setStatus(0); // 设置未出售 + cards.setSellType(0); + cards.setNumber(1); + cards.setSellNumber(0); + cards.setCreatedAt(new Date()); + cards.setUpdatedAt(new Date()); + cardsArrayList.add(cards); + } + + boolean batch = this.saveBatch(cardsArrayList); + if (batch) { + return JsonResult.ok("批量添加卡密成功!"); + } + return JsonResult.error("添加卡密失败"); + } else { // 重复销售 + + Cards cards1 = this.getOne(new QueryWrapper().eq("product_id", cardsDts.getProductId()).eq("status", 0).eq("sell_type", 1)); + if (!ObjectUtils.isEmpty(cards1)) { + return JsonResult.error("当前商品为重复销售类型、已存在一个重复销售的卡密、请勿重复添加,如需修改当前卡密数量请前往卡密管理进行操作。"); + } + + Cards cards = new Cards(); + cards.setProductId(cardsDts.getProductId()); + cards.setCardInfo(CoreUtil.getStringNoBlank(cardsDts.getCardInfo())); + cards.setStatus(0); // 设置未出售 + cards.setSellType(1); + cards.setNumber(cardsDts.getSellNumber()); + cards.setSellNumber(0); + cards.setCreatedAt(new Date()); + cards.setUpdatedAt(new Date()); + boolean save = this.save(cards); + if (save) { + return JsonResult.ok("重复销售卡密添加成功!"); + } + return JsonResult.error("重复销售的卡密添加失败。"); + } + } + + @Override + public List getCard(Integer status, Integer productId, Integer number) { + return baseMapper.getCard(status, productId, number); + } + + @Override + public void export(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + List cardsList = this.list(pageParam.getOrderWrapper()); + List cardsDtoList = cardsList.stream().map((cards -> { + CardsDto cardsDto = new CardsDto(); + BeanUtils.copyProperties(cards, cardsDto); + // TODO 导出时间这里需要抓换String,否则导出数据异常,可优化 + cardsDto.setCreatedAt(DateUtil.formatDateTime(cards.getCreatedAt())); + if (cards.getStatus() == 1) { + cardsDto.setStatus("已出售"); + } else { + cardsDto.setStatus("未出售"); + } + Products products = productsMapper.selectById(cards.getProductId()); + if (!ObjectUtils.isEmpty(products)) { + cardsDto.setProductName(products.getName()); + } else { + cardsDto.setProductName("商品已删除"); + } + return cardsDto; + })).collect(Collectors.toList()); + + + for (CardsDto cardsDto : cardsDtoList) { + + System.out.println(cardsDto); + } + Excel excel = CardsDto.class.getAnnotation(Excel.class); + List fields = ExcelSxssFUtil.getExcelList(CardsDto.class, ExcelType.EXPORT); + String sheetTitle = excel.value(); + SXSSFWorkbook workbook = new SXSSFWorkbook(); + ExcelSxssFUtil.exportExcel(fields, workbook, cardsDtoList, sheetTitle); + ExcelSxssFUtil.download(workbook, sheetTitle); + } + +} diff --git a/src/main/java/com/bomaos/carmi/vo/CardsDts.java b/src/main/java/com/bomaos/carmi/vo/CardsDts.java new file mode 100644 index 0000000..1cd3649 --- /dev/null +++ b/src/main/java/com/bomaos/carmi/vo/CardsDts.java @@ -0,0 +1,35 @@ +package com.bomaos.carmi.vo; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class CardsDts { + + /** + * 商品id + */ + private Integer productId; + + /** + * 销售类型 + */ + private Integer sellType; + + /** + * 卡密信息 + */ + private String cardInfo; + + /** + * 销售次数 + */ + private Integer sellNumber; + + /** + * 过滤重复 + */ + private Integer repeat; + +} diff --git a/src/main/java/com/bomaos/carmi/vo/CardsVo.java b/src/main/java/com/bomaos/carmi/vo/CardsVo.java new file mode 100644 index 0000000..6bbf1ba --- /dev/null +++ b/src/main/java/com/bomaos/carmi/vo/CardsVo.java @@ -0,0 +1,57 @@ +package com.bomaos.carmi.vo; + +import lombok.Data; +import lombok.ToString; + +import java.util.Date; + +@Data +@ToString +public class CardsVo { + + /** + * 自增ID + */ + private Integer id; + + /** + * 对应商品id + */ + private String productName; + + /** + * 卡密 + */ + private String cardInfo; + + /** + * 卡密状态 + */ + private Integer status; + + /** + * 售卡类型 + */ + private Integer sellType; + + /** + * 总数 + */ + private Integer number; + + /** + * 售出数量 + */ + private Integer sellNumber; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新时间 + */ + private Date updatedAt; + +} diff --git a/src/main/java/com/bomaos/common/core/Constants.java b/src/main/java/com/bomaos/common/core/Constants.java new file mode 100644 index 0000000..4ad267f --- /dev/null +++ b/src/main/java/com/bomaos/common/core/Constants.java @@ -0,0 +1,41 @@ +package com.bomaos.common.core; + +import org.springframework.util.ResourceUtils; + +import java.io.FileNotFoundException; + +/** + * 系统常量 + * Created by Panyoujie on 2019-10-29 15:55 + */ +public class Constants { + + /* 文件服务器配置 */ + /*public static final String UPLOAD_DIR = System.getProperty("user.dir") + "/upload/"; // 上传的目录*/ + public static String UPLOAD_DIR = ""; // 上传的目录 + + static { + try { + UPLOAD_DIR = ResourceUtils.getURL("classpath:").getPath() + "/static/upload/"; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + public static final boolean UPLOAD_UUID_NAME = false; // 文件上传是否用uuid命名 + public static final boolean UPLOAD_MD5_NAME = true; // 文件上传是否用MD5命名 + + // OpenOffice在不同操作系统上的安装路径 + public static final String OPEN_OFFICE_PATH_WINDOWS = "C:/OpenOffice"; + public static final String OPEN_OFFICE_PATH_LINUX = "/opt/openoffice.org3"; + public static final String OPEN_OFFICE_PATH_MAC = "/Applications/OpenOffice.org.app/Contents/"; + + /* 返回结果统一 */ + public static final int RESULT_OK_CODE = 0; // 默认成功码 + public static final int RESULT_ERROR_CODE = 1; // 默认失败码 + + /** + * 支付超时时间(分钟) + */ + public static Integer PAY_TIMEOUT_MINUTES = 5; +} diff --git a/src/main/java/com/bomaos/common/core/annotation/OperLog.java b/src/main/java/com/bomaos/common/core/annotation/OperLog.java new file mode 100644 index 0000000..46f8514 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/annotation/OperLog.java @@ -0,0 +1,36 @@ +package com.bomaos.common.core.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 操作日志记录注解 + * Created by Panyoujie on 2020-03-21 17:03 + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface OperLog { + + /** + * 模块 + */ + String value(); + + /** + * 功能 + */ + String desc(); + + /** + * 是否记录请求参数 + */ + boolean param() default true; + + /** + * 是否记录返回结果 + */ + boolean result() default false; + +} diff --git a/src/main/java/com/bomaos/common/core/aspect/OperLogAspect.java b/src/main/java/com/bomaos/common/core/aspect/OperLogAspect.java new file mode 100644 index 0000000..9759d93 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/aspect/OperLogAspect.java @@ -0,0 +1,102 @@ +package com.bomaos.common.core.aspect; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.utils.UserAgentGetter; +import com.bomaos.common.system.entity.OperRecord; +import com.bomaos.common.system.entity.User; +import com.bomaos.common.system.service.OperRecordService; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; + +/** + * 操作日志记录 + * Created by Panyoujie on 2020-03-21 16:58 + */ +@Aspect +@Component +public class OperLogAspect { + private final ThreadLocal startTime = new ThreadLocal<>(); + @Autowired + private OperRecordService operRecordService; + + @Pointcut("@annotation(com.bomaos.common.core.annotation.OperLog)") + public void operLog() { + } + + @Before("operLog()") + public void doBefore(JoinPoint joinPoint) throws Throwable { + startTime.set(System.currentTimeMillis()); + } + + @AfterReturning(pointcut = "operLog()", returning = "result") + public void doAfterReturning(JoinPoint joinPoint, Object result) { + saveLog(joinPoint, result, null); + } + + @AfterThrowing(value = "operLog()", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Exception e) { + saveLog(joinPoint, null, e); + } + + private void saveLog(JoinPoint joinPoint, Object result, Exception e) { + // 获取reques对象 + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = (attributes == null ? null : attributes.getRequest()); + // 构建操作日志 + OperRecord operRecord = new OperRecord(); + operRecord.setUserId(getLoginUserId()); + if (startTime.get() != null) operRecord.setSpendTime(System.currentTimeMillis() - startTime.get()); + if (request != null) { + operRecord.setRequestMethod(request.getMethod()); + operRecord.setUrl(request.getRequestURI()); + operRecord.setIp(UserAgentGetter.getIp(request)); + } + // 记录异常信息 + if (e != null) { + operRecord.setState(1); + operRecord.setComments(StrUtil.sub(e.toString(), 0, 2000)); + } + // 记录模块名、操作功能、请求方法、请求参数、返回结果 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + operRecord.setOperMethod(joinPoint.getTarget().getClass().getName() + "." + signature.getName()); + Method method = signature.getMethod(); + if (method != null) { + OperLog operLog = method.getAnnotation(OperLog.class); + if (operLog != null) { + operRecord.setModel(operLog.value()); + operRecord.setDescription(operLog.desc()); + if (operLog.param() && request != null) { + operRecord.setParam(StrUtil.sub(JSON.toJSONString(request.getParameterMap()), 0, 2000)); + } + if (operLog.result() && result != null) { + operRecord.setResult(StrUtil.sub(JSON.toJSONString(result), 0, 2000)); + } + } + } + operRecordService.saveAsync(operRecord); + } + + /** + * 获取当前登录的userId + */ + private Integer getLoginUserId() { + Subject subject = SecurityUtils.getSubject(); + if (subject == null) return null; + Object object = subject.getPrincipal(); + if (object instanceof User) return ((User) object).getUserId(); + return null; + } + +} diff --git a/src/main/java/com/bomaos/common/core/config/BeetlConfiguration.java b/src/main/java/com/bomaos/common/core/config/BeetlConfiguration.java new file mode 100644 index 0000000..1772e08 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/config/BeetlConfiguration.java @@ -0,0 +1,59 @@ +package com.bomaos.common.core.config; + +import com.bomaos.common.core.shiro.ShiroExt; +import org.beetl.core.resource.ClasspathResourceLoader; +import org.beetl.ext.spring.BeetlGroupUtilConfiguration; +import org.beetl.ext.spring.BeetlSpringViewResolver; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + +/** + * Beetl配置 + * Created by Panyoujie on 2018-02-22 11:29 + */ +@Configuration +public class BeetlConfiguration { + @Value("${beetl.templatesPath:templates}") + private String templatesPath; // 模板根目录 + @Value("${beetl.suffix:html}") + private String suffix; // 模板后缀 + @Value("${beetl.dev:true}") + private boolean dev; // 开启热加载 + + @Bean(name = "beetlConfig") + public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() { + BeetlGroupUtilConfiguration bguc = new BeetlGroupUtilConfiguration(); + Properties extProperties = new Properties(); + extProperties.put("RESOURCE.autoCheck", dev ? "true" : "false"); + extProperties.put("HTML_TAG_FLAG", ":"); + bguc.setConfigProperties(extProperties); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + if (loader == null) loader = BeetlConfiguration.class.getClassLoader(); + bguc.setResourceLoader(new ClasspathResourceLoader(loader, templatesPath)); + bguc.init(); + // 增加自定义函数 + bguc.getGroupTemplate().registerFunctionPackage("so", new ShiroExt()); + // 增加自定义标签 + bguc.getGroupTemplate().registerTag("include", org.beetl.ext.tag.html.IncludeResourceHtmlTag.class); + bguc.getGroupTemplate().registerTag("layout", org.beetl.ext.tag.html.LayoutResourceHtmlTag.class); + bguc.getGroupTemplate().registerTag("set", org.beetl.ext.tag.html.SetHtmlTag.class); + bguc.getGroupTemplate().registerTag("if", org.beetl.ext.tag.html.IfHtmlTag.class); + bguc.getGroupTemplate().registerTag("for", org.beetl.ext.tag.html.ForeachHtmlTag.class); + return bguc; + } + + @Bean(name = "beetlViewResolver") + public BeetlSpringViewResolver getBeetlSpringViewResolver(@Qualifier("beetlConfig") BeetlGroupUtilConfiguration bguc) { + BeetlSpringViewResolver bsvr = new BeetlSpringViewResolver(); + bsvr.setContentType("text/html;charset=UTF-8"); + bsvr.setViewNames("*." + suffix, "*." + suffix + "#*"); + bsvr.setOrder(0); + bsvr.setConfig(bguc); + return bsvr; + } + +} diff --git a/src/main/java/com/bomaos/common/core/config/DateConverterConfig.java b/src/main/java/com/bomaos/common/core/config/DateConverterConfig.java new file mode 100644 index 0000000..1a602b7 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/config/DateConverterConfig.java @@ -0,0 +1,53 @@ +package com.bomaos.common.core.config; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 日期类型转换器 + * Created by Panyoujie on 2018-08-17 08:43 + */ +@Component +public class DateConverterConfig implements Converter { + private static final List formats = new ArrayList<>(); + + /* + * 以下几种时间格式自动转成Date类型 + */ + static { + formats.add("yyyy-MM-dd"); + formats.add("yyyy-MM-dd HH:mm"); + formats.add("yyyy-MM-dd HH:mm:ss"); + } + + @Override + public Date convert(String s) { + if (s == null || s.trim().isEmpty()) { + return null; + } else if (s.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { + return parseDate(s, formats.get(0)); + } else if (s.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) { + return parseDate(s, formats.get(1)); + } else if (s.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) { + return parseDate(s, formats.get(2)); + } else { + throw new IllegalArgumentException("DateConverterConfig: Invalid date value '" + s + "'"); + } + } + + private Date parseDate(String date, String format) { + SimpleDateFormat sdf = new SimpleDateFormat(format); + try { + return sdf.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/com/bomaos/common/core/config/MybatisPlusConfig.java b/src/main/java/com/bomaos/common/core/config/MybatisPlusConfig.java new file mode 100644 index 0000000..7b47f0a --- /dev/null +++ b/src/main/java/com/bomaos/common/core/config/MybatisPlusConfig.java @@ -0,0 +1,28 @@ +package com.bomaos.common.core.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * MybatisPlus配置 + * Created by Panyoujie on 2018-02-22 11:29 + */ +@EnableTransactionManagement +@Configuration +public class MybatisPlusConfig { + + /** + * 分页插件 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } + +} diff --git a/src/main/java/com/bomaos/common/core/config/WebMvcConfig.java b/src/main/java/com/bomaos/common/core/config/WebMvcConfig.java new file mode 100644 index 0000000..45eb674 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/config/WebMvcConfig.java @@ -0,0 +1,34 @@ +package com.bomaos.common.core.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.filter.FormContentFilter; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * WebMvc配置, 拦截器、资源映射等都在此配置 + * Created by Panyoujie on 2019-06-12 10:11 + */ +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + /** + * 支持跨域访问 + */ + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/api/**").maxAge(3600) + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("Content-Type", "x-requested-with", "X-Custom-Header", "Authorization"); + } + + /** + * 支持PUT、DELETE请求 + */ + @Bean + public FormContentFilter httpPutFormContentFilter() { + return new FormContentFilter(); + } + +} diff --git a/src/main/java/com/bomaos/common/core/enmu/Alipay.java b/src/main/java/com/bomaos/common/core/enmu/Alipay.java new file mode 100644 index 0000000..8243a26 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/enmu/Alipay.java @@ -0,0 +1,32 @@ +package com.bomaos.common.core.enmu; + +public enum Alipay { + MQPAY_ALIPAY("mqpay_alipay"), + EPAY_ALIPAY("epay_alipay"), + BUDPAY_ALIPAY("budpay_alipay"), + YUNGOUOS_ALIPAY("yungouos_alipay"), + XUNHUPAY_ALIPAY("xunhupay_alipay"), + PAYJS_ALIPAY("payjs_alipay"), + ALIPAY("alipay"), + ALIPAY_PC("alipay_pc"); + + Alipay(String code) { + this.code = code; + } + + private final String code; + + public String getCode() { + return code; + } + + public static boolean getByValue(String value) { + for (Alipay alipay : values()) { + if (alipay.getCode().equals(value)) { + return true; + } + } + return false; + } + +} diff --git a/src/main/java/com/bomaos/common/core/enmu/Paypal.java b/src/main/java/com/bomaos/common/core/enmu/Paypal.java new file mode 100644 index 0000000..e31567c --- /dev/null +++ b/src/main/java/com/bomaos/common/core/enmu/Paypal.java @@ -0,0 +1,25 @@ +package com.bomaos.common.core.enmu; + +public enum Paypal { + PAYPAL("paypal"); + + Paypal(String code) { + this.code = code; + } + + private final String code; + + public String getCode() { + return code; + } + + public static boolean getByValue(String value) { + for (Paypal paypal : values()) { + if (paypal.getCode().equals(value)) { + return true; + } + } + return false; + } + +} diff --git a/src/main/java/com/bomaos/common/core/enmu/QQPay.java b/src/main/java/com/bomaos/common/core/enmu/QQPay.java new file mode 100644 index 0000000..fd7901d --- /dev/null +++ b/src/main/java/com/bomaos/common/core/enmu/QQPay.java @@ -0,0 +1,24 @@ +package com.bomaos.common.core.enmu; + +public enum QQPay { + EPAY_QQPAY("epay_qqpay"); + + QQPay(String code) { + this.code = code; + } + + private final String code; + + public String getCode() { + return code; + } + + public static boolean getByValue(String value) { + for (QQPay qqPay : values()) { + if (qqPay.getCode().equals(value)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/com/bomaos/common/core/enmu/USDT.java b/src/main/java/com/bomaos/common/core/enmu/USDT.java new file mode 100644 index 0000000..82ae416 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/enmu/USDT.java @@ -0,0 +1,25 @@ +package com.bomaos.common.core.enmu; + +public enum USDT { + EPUSDT("epusdt"); + + USDT(String code) { + this.code = code; + } + + private final String code; + + public String getCode() { + return code; + } + + public static boolean getByValue(String value) { + for (USDT usdt : values()) { + if (usdt.getCode().equals(value)) { + return true; + } + } + return false; + } + +} diff --git a/src/main/java/com/bomaos/common/core/enmu/Wxpay.java b/src/main/java/com/bomaos/common/core/enmu/Wxpay.java new file mode 100644 index 0000000..fea5eef --- /dev/null +++ b/src/main/java/com/bomaos/common/core/enmu/Wxpay.java @@ -0,0 +1,31 @@ +package com.bomaos.common.core.enmu; + +public enum Wxpay { + MQPAY_WXPAY("mqpay_wxpay"), + EPAY_WXPAY("epay_wxpay"), + YUNGOUOS_WXPAY("yungouos_wxpay"), + XUNHUPAY_WXPAY("xunhupay_wxpay"), + PAYJS_WXPAY("payjs_wxpay"), + WXPAY("wxpay"), + WXPAU_H5("wxpay_h5"); + + Wxpay(String code) { + this.code = code; + } + + private final String code; + + public String getCode() { + return code; + } + + public static boolean getByValue(String value) { + for (Wxpay wxpay : values()) { + if (wxpay.getCode().equals(value)) { + return true; + } + } + return false; + } + +} diff --git a/src/main/java/com/bomaos/common/core/exception/BusinessException.java b/src/main/java/com/bomaos/common/core/exception/BusinessException.java new file mode 100644 index 0000000..2d70586 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/exception/BusinessException.java @@ -0,0 +1,39 @@ +package com.bomaos.common.core.exception; + +/** + * 业务异常 + * Created by Panyoujie on 2018-02-22 11:29 + */ +public class BusinessException extends IException { + private static final long serialVersionUID = 5450935008012318697L; + + public BusinessException() { + super(); + } + + public BusinessException(String message) { + super(message); + } + + public BusinessException(Integer code, String message) { + super(code, message); + } + + @Override + public Integer getCode() { + Integer code = super.getCode(); + if (code == null) { + code = 500; + } + return code; + } + + @Override + public String getMessage() { + String message = super.getMessage(); + if (message == null) { + message = "系统错误"; + } + return message; + } +} diff --git a/src/main/java/com/bomaos/common/core/exception/GlobalExceptionHandler.java b/src/main/java/com/bomaos/common/core/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..2d6a2e7 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/exception/GlobalExceptionHandler.java @@ -0,0 +1,75 @@ +package com.bomaos.common.core.exception; + +import com.alibaba.fastjson.JSON; +import com.bomaos.common.core.Constants; +import com.bomaos.common.core.web.JsonResult; +import org.apache.shiro.authz.UnauthorizedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * 全局异常处理器 + * Created by Panyoujie on 2018-02-22 11:29 + */ +@ControllerAdvice +public class GlobalExceptionHandler { + private final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class.getName()); + + @ExceptionHandler(Exception.class) + public String errorHandler(Exception ex, HttpServletRequest request, HttpServletResponse response) { + // 对不同错误进行不同处理 + if (ex instanceof IException) { + return doHandler("error/500.html", ((IException) ex).getCode(), ex.getMessage(), ex.toString(), request, response); + } else if (ex instanceof UnauthorizedException) { + return doHandler("error/403.html", 403, "没有访问权限", ex.toString(), request, response); + } + logger.error(ex.getMessage(), ex); + return doHandler("error/500.html", Constants.RESULT_ERROR_CODE, "系统错误", ex.toString(), request, response); + } + + /** + * 处理错误,ajax返回json,非ajax跳转页面 + */ + private String doHandler(String url, Integer code, String msg, String error, HttpServletRequest request, HttpServletResponse response) { + if (isAjax(request)) { + cross(response); // 支持跨域 + response.setContentType("application/json;charset=utf-8"); + try { + PrintWriter out = response.getWriter(); + out.write(JSON.toJSONString(JsonResult.error(code, msg).put("error", error))); + out.flush(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + return url; + } + + /** + * 判断是不是ajax请求 + */ + private boolean isAjax(HttpServletRequest request) { + String xHeader = request.getHeader("X-Requested-With"); + return (xHeader != null && xHeader.contains("XMLHttpRequest")); + } + + /** + * 支持跨域请求 + */ + private void cross(HttpServletResponse response) { + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header, Authorization"); + } + +} diff --git a/src/main/java/com/bomaos/common/core/exception/IException.java b/src/main/java/com/bomaos/common/core/exception/IException.java new file mode 100644 index 0000000..fc2d7bc --- /dev/null +++ b/src/main/java/com/bomaos/common/core/exception/IException.java @@ -0,0 +1,30 @@ +package com.bomaos.common.core.exception; + +/** + * 自定义异常基类 + * Created by Panyoujie on 2018-02-22 11:29 + */ +public abstract class IException extends RuntimeException { + private static final long serialVersionUID = -1582874427218948396L; + private Integer code; + + public IException() { + } + + public IException(String message) { + super(message); + } + + public IException(Integer code, String message) { + super(message); + this.code = code; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } +} diff --git a/src/main/java/com/bomaos/common/core/exception/ParameterException.java b/src/main/java/com/bomaos/common/core/exception/ParameterException.java new file mode 100644 index 0000000..8bb6216 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/exception/ParameterException.java @@ -0,0 +1,39 @@ +package com.bomaos.common.core.exception; + +/** + * 参数异常 + * Created by Panyoujie on 2018-02-22 11:29 + */ +public class ParameterException extends IException { + private static final long serialVersionUID = 7993671808524980055L; + + public ParameterException() { + super(); + } + + public ParameterException(String message) { + super(message); + } + + public ParameterException(Integer code, String message) { + super(code, message); + } + + @Override + public Integer getCode() { + Integer code = super.getCode(); + if (code == null) { + code = 400; + } + return code; + } + + @Override + public String getMessage() { + String message = super.getMessage(); + if (message == null) { + message = "参数错误"; + } + return message; + } +} diff --git a/src/main/java/com/bomaos/common/core/pays/alipay/AlipayUtil.java b/src/main/java/com/bomaos/common/core/pays/alipay/AlipayUtil.java new file mode 100644 index 0000000..4362e41 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/alipay/AlipayUtil.java @@ -0,0 +1,105 @@ +package com.bomaos.common.core.pays.alipay; + +import com.alibaba.fastjson.JSON; +import com.alipay.easysdk.factory.Factory; +import com.alipay.easysdk.kernel.Config; +import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse; +import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse; +import com.bomaos.settings.entity.Pays; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; + +/** + * author:panyoujie + * date:2022-0902 + */ +public class AlipayUtil { + + private static final Logger logger = LoggerFactory.getLogger(AlipayUtil.class); + + /** + * 支付宝当面付 + * + * @param subject 自定义内容 + * @param orderNo 订单号 + * @param totalAmount 订单金额 + * @return + */ + public static String getFaceToFace(Pays pays, String subject, String orderNo, String totalAmount) { + // 获取支付配置信息 + Map mapTypes = JSON.parseObject(pays.getConfig()); + String app_id = mapTypes.get("app_id").toString(); + String private_key = mapTypes.get("private_key").toString(); + String alipay_public_key = mapTypes.get("alipay_public_key").toString(); + String notify_url = mapTypes.get("notify_url").toString() + "/alipay/notify"; // 异步通知地址 + + // 1. 设置参数(全局只需设置一次) + Factory.setOptions(getOptions(app_id, private_key, alipay_public_key, notify_url)); + try { + // 2. 发起API调用(使用面对面支付中的预下单) + AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace().preCreate(subject, orderNo, totalAmount); + // 3. 处理响应或异常 + if ("10000".equals(response.code)) { + logger.info("调用成功:{}", response.qrCode); + return response.qrCode; //返回二维码 + } else { + logger.error("调用失败,原因:{},{}", response.msg, response.subMsg); + } + } catch (Exception e) { + logger.error("调用遭遇异常,原因:{}", e.getMessage()); + throw new RuntimeException(e.getMessage(), e); + } + return null; + } + + /** + * 支付宝电脑网站支付 + * + * @param subject 自定义内容 + * @param orderNo 订单号 + * @param totalAmount 订单金额 + * @return + */ + public static String getPcPage(Pays pays, String subject, String orderNo, String totalAmount) { + // 获取支付配置信息 + Map mapTypes = JSON.parseObject(pays.getConfig()); + String app_id = mapTypes.get("app_id").toString(); + String private_key = mapTypes.get("private_key").toString(); + String alipay_public_key = mapTypes.get("alipay_public_key").toString(); + String url = mapTypes.get("notify_url").toString(); + String notify_url = url + "/alipay/notify"; + String return_url = url + "/alipay/return_url"; + + // 1. 设置参数(全局只需设置一次) + Factory.setOptions(getOptions(app_id, private_key, alipay_public_key, notify_url)); + try { + // 2. 发起API调用(使用面对面支付中的预下单) + AlipayTradePagePayResponse response = Factory.Payment.Page().pay(subject, orderNo, totalAmount, return_url); + // 3. 处理响应或异常 + return response.getBody(); + } catch (Exception e) { + logger.error("调用遭遇异常,原因:{}", e.getMessage()); + throw new RuntimeException(e.getMessage(), e); + } + } + + private static Config getOptions(String appId, String privateKey, String publicKey, String notifyUrl) { + Config config = new Config(); + config.protocol = "https"; + config.gatewayHost = "openapi.alipay.com"; + config.signType = "RSA2"; + + // 请更换为您的AppId + config.appId = appId; + // 请更换为您的PKCS8格式的应用私钥 + config.merchantPrivateKey = privateKey; + config.alipayPublicKey = publicKey; + // 如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可 + config.notifyUrl = notifyUrl; //这里是支付宝接口回调地址 + + return config; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/budpay/BudpayUtil.java b/src/main/java/com/bomaos/common/core/pays/budpay/BudpayUtil.java new file mode 100644 index 0000000..5666765 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/budpay/BudpayUtil.java @@ -0,0 +1,90 @@ +package com.bomaos.common.core.pays.budpay; + +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bomaos.settings.entity.Pays; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +public class BudpayUtil { + + public static String budpaySendPay(Pays pays, String price, String payId, String param) { + Map mapTypes = JSON.parseObject(pays.getConfig()); + + String key = mapTypes.get("key").toString(); + String pid = mapTypes.get("pid").toString(); + String create_url = mapTypes.get("create_url").toString(); + String notify_url = mapTypes.get("notify_url").toString(); + + String notifyUrl = notify_url + "/budpay/notifyUrl"; + String returnUrl = notify_url + "/budpay/returnUrl"; + + Map paramMap = new HashMap<>(); + paramMap.put("method", "epay://pay/create"); + paramMap.put("mch_id", pid); + if (pays.getDriver().equals("budpay_alipay")) { + paramMap.put("pay_type", "alipay"); + } else if (pays.getDriver().equals("budpay_wechat")) { + paramMap.put("pay_type", "wechat"); + } + + paramMap.put("out_trade_no", payId); + paramMap.put("notify_url", notifyUrl); + paramMap.put("return_url", returnUrl); + paramMap.put("name", param); + paramMap.put("amount", price); + String sign = createSign(paramMap, key); + + paramMap.put("sign", sign); + + String httpsPost = RequestUtil.getHttpsPost(create_url, paramMap); + JSONObject jsonObject = JSON.parseObject(httpsPost); + String url = jsonObject.get("url").toString(); + System.out.println(url); + return url; + } + + /** + * 生成密钥 + * + * @param params + * @param privateKey + * @return + */ + public static String createSign(Map params, String privateKey) { + // 生成签名前先去除sign + params.remove("sign"); + Map newmap = new HashMap<>(); + for (Map.Entry param : params.entrySet()) { + String value = (String) param.getValue(); + if (StringUtils.isBlank(value)) { + continue; + } + newmap.put(param.getKey(), param.getValue().toString()); + } + + // 使用HashMap,并使用Arrays.sort排序 + String[] sortedKeys = newmap.keySet().toArray(new String[]{}); + Arrays.sort(sortedKeys);// 排序请求参数 + + StringBuilder builder = new StringBuilder(); + for (String key : sortedKeys) { + if (StringUtils.isBlank(key)) { + continue; + } + builder.append(key).append("=").append(params.get(key)).append("&"); + } + /** + * 拼接上appsecret + */ + String stringSignTemp = builder + "key=" + privateKey; + String signValue = SecureUtil.md5(stringSignTemp); + + return signValue; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/budpay/RequestUtil.java b/src/main/java/com/bomaos/common/core/pays/budpay/RequestUtil.java new file mode 100644 index 0000000..5c2d410 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/budpay/RequestUtil.java @@ -0,0 +1,44 @@ +package com.bomaos.common.core.pays.budpay; + +import org.springframework.http.*; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.StandardCharsets; +import java.util.Map; + +/** + * 虎皮椒工具类 + * author Panyoujie + * Url https://zdins.cn + */ +public class RequestUtil { + + /** + * 虎皮椒请求接口 + * + * @param url + * @param params + * @return + */ + public static String getHttpsPost(String url, Map params) { + MultiValueMap multiValueMap = new LinkedMultiValueMap<>(); + for (Map.Entry stringObjectEntry : params.entrySet()) { + multiValueMap.add(stringObjectEntry.getKey(), stringObjectEntry.getValue()); + } + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); + HttpHeaders headers = new HttpHeaders(); + HttpMethod method = HttpMethod.POST; + // 以表单的方式提交 + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + //将请求头部和参数合成一个请求 + HttpEntity> requestEntity = new HttpEntity<>(multiValueMap, headers); + //执行HTTP请求,将返回的结构使用ResultVO类格式化 + ResponseEntity exchange = restTemplate.exchange(url, method, requestEntity, String.class); + return exchange.getBody(); + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/epay/EpayUtil.java b/src/main/java/com/bomaos/common/core/pays/epay/EpayUtil.java new file mode 100644 index 0000000..d257c0e --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/epay/EpayUtil.java @@ -0,0 +1,102 @@ +package com.bomaos.common.core.pays.epay; + +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSON; +import com.bomaos.settings.entity.Pays; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +public class EpayUtil { + + public static String epaySendPay(Pays pays, String price, String payId, String param) { + Map mapTypes = JSON.parseObject(pays.getConfig()); + + String key = mapTypes.get("key").toString(); + String pid = mapTypes.get("pid").toString(); + String create_url = mapTypes.get("create_url").toString(); + String notify_url = mapTypes.get("notify_url").toString(); + + String notifyUrl = notify_url + "/epay/notifyUrl"; + String returnUrl = notify_url + "/epay/returnUrl"; + + Map paramMap = new HashMap<>(); + paramMap.put("pid", pid); + + String type = ""; + if (pays.getDriver().equals("epay_alipay")) { + type = "alipay"; + paramMap.put("type", "alipay"); + } else if (pays.getDriver().equals("epay_wxpay")) { + type = "wxpay"; + paramMap.put("type", "wxpay"); + } else if (pays.getDriver().equals("epay_qqpay")) { + type = "qqpay"; + paramMap.put("type", "qqpay"); + } + + paramMap.put("out_trade_no", payId); + paramMap.put("notify_url", notifyUrl); + paramMap.put("return_url", returnUrl); + paramMap.put("name", param); + paramMap.put("money", price); + String sign = createSign(paramMap, key); + + paramMap.put("sign", sign); + String sign_type = "MD5"; + paramMap.put("sign_type", sign_type); + + String urls = create_url + "/submit.php" + + "?pid=" + pid + "&type=" + type + "&out_trade_no=" + payId + + "¬ify_url=" + notifyUrl + "&return_url=" + returnUrl + + "&name=" + param + "&money=" + price + "&sign=" + sign + + "&sign_type=" + sign_type; + + return urls; + } + + /** + * 生成密钥 + * + * @param params + * @param privateKey + * @return + */ + public static String createSign(Map params, String privateKey) { + // 生成签名前先去除sign + params.remove("sign"); + params.remove("sign_type"); + + Map newmap = new HashMap<>(); + for (Map.Entry param : params.entrySet()) { + String value = (String) param.getValue(); + if (StringUtils.isBlank(value)) { + continue; + } + newmap.put(param.getKey(), param.getValue().toString()); + } + + // 使用HashMap,并使用Arrays.sort排序 + String[] sortedKeys = newmap.keySet().toArray(new String[]{}); + Arrays.sort(sortedKeys);// 排序请求参数 + + StringBuilder builder = new StringBuilder(); + for (String key : sortedKeys) { + if (StringUtils.isBlank(key)) { + continue; + } + builder.append(key).append("=").append(params.get(key)).append("&"); + } + String result = builder.deleteCharAt(builder.length() - 1).toString(); + /** + * 拼接上appsecret + */ + String stringSignTemp = result + privateKey; + String signValue = SecureUtil.md5(stringSignTemp); + + return signValue; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/epusdt/Epusdt.java b/src/main/java/com/bomaos/common/core/pays/epusdt/Epusdt.java new file mode 100644 index 0000000..46b27f7 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/epusdt/Epusdt.java @@ -0,0 +1,16 @@ +package com.bomaos.common.core.pays.epusdt; + +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Data +@ToString +public class Epusdt { + private String order_id; + private BigDecimal amount; + private String notify_url; + private String redirect_url; + private String signature; +} diff --git a/src/main/java/com/bomaos/common/core/pays/epusdt/RequestUtil.java b/src/main/java/com/bomaos/common/core/pays/epusdt/RequestUtil.java new file mode 100644 index 0000000..c1f8e4e --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/epusdt/RequestUtil.java @@ -0,0 +1,36 @@ +package com.bomaos.common.core.pays.epusdt; + +import com.alibaba.fastjson.JSONObject; +import com.bomaos.common.core.pays.epusdt.entity.EpusdtEntity; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import java.util.Map; + +/** + * epusdt sdk + * date: 2022-05-23 15:56 + * Url: github.com/panyoujies + */ +public class RequestUtil { + + /** + * epusdt 请求接口 + * + * @param url + * @param params + * @return + */ + public static EpusdtEntity sendPost(String url, Map params) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity<>(JSONObject.toJSONString(params), headers); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity exchange = restTemplate.postForEntity(url, requestEntity, EpusdtEntity.class); + return exchange.getBody(); + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/epusdt/entity/EpusdtData.java b/src/main/java/com/bomaos/common/core/pays/epusdt/entity/EpusdtData.java new file mode 100644 index 0000000..bf27b03 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/epusdt/entity/EpusdtData.java @@ -0,0 +1,16 @@ +package com.bomaos.common.core.pays.epusdt.entity; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class EpusdtData { + private String trade_id; + private String order_id; + private Float amount; + private Float actual_amount; + private String token; + private Integer expiration_time; + private String payment_url; +} diff --git a/src/main/java/com/bomaos/common/core/pays/epusdt/entity/EpusdtEntity.java b/src/main/java/com/bomaos/common/core/pays/epusdt/entity/EpusdtEntity.java new file mode 100644 index 0000000..2059e27 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/epusdt/entity/EpusdtEntity.java @@ -0,0 +1,13 @@ +package com.bomaos.common.core.pays.epusdt.entity; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class EpusdtEntity { + private Integer status_code; + private String message; + private EpusdtData data; + private String request_id; +} diff --git a/src/main/java/com/bomaos/common/core/pays/epusdt/entity/EpusdtNotify.java b/src/main/java/com/bomaos/common/core/pays/epusdt/entity/EpusdtNotify.java new file mode 100644 index 0000000..4f9f27c --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/epusdt/entity/EpusdtNotify.java @@ -0,0 +1,22 @@ +package com.bomaos.common.core.pays.epusdt.entity; + +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ToString +public class EpusdtNotify implements Serializable { + private static final long serialVersionUID = 1L; + + private String trade_id; + private String order_id; + private BigDecimal amount; + private BigDecimal actual_amount; + private String token; + private String block_transaction_id; + private String signature; + private Integer status; +} diff --git a/src/main/java/com/bomaos/common/core/pays/epusdt/sendPay.java b/src/main/java/com/bomaos/common/core/pays/epusdt/sendPay.java new file mode 100644 index 0000000..e82fd7b --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/epusdt/sendPay.java @@ -0,0 +1,72 @@ +package com.bomaos.common.core.pays.epusdt; + +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSON; +import com.bomaos.common.core.pays.epusdt.entity.EpusdtEntity; +import com.bomaos.settings.entity.Pays; +import org.springframework.util.ObjectUtils; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Arrays; +import java.util.Map; + +/** + * author:github.com/panyoujies + * date: 2022-05-23 15:56 + */ +public class sendPay { + + /** + * 创建支付 + * + * @param pays 支付驱动 + * @param price 金额 + * @param payId 订单id + * @param param 附加内容 + * @return 付款链接 + */ + public static EpusdtEntity createPayment(Pays pays, String price, String payId, String param) { + Map mapTypes = JSON.parseObject(pays.getConfig()); + + String key = mapTypes.get("key").toString(); + String create_url = mapTypes.get("create_url").toString(); + String notify_url = mapTypes.get("notify_url").toString(); + + String bigDecimal = new BigDecimal(price).setScale(2, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString(); + Epusdt dujiao = new Epusdt(); + dujiao.setAmount(new BigDecimal(bigDecimal)); + dujiao.setOrder_id(payId); + dujiao.setNotify_url(notify_url + "/epusdt/notifyUrl"); + dujiao.setRedirect_url(notify_url + "/epusdt/returnUrl?order_id=" + payId); + String sign = createSign(dujiao, key); + dujiao.setSignature(sign); + + EpusdtEntity curl = RequestUtil.sendPost(create_url, JSON.parseObject(JSON.toJSONString(dujiao), Map.class)); + return curl; + } + + public static String createSign(Object dujiao, String signKey) { + Map params = JSON.parseObject(JSON.toJSONString(dujiao), Map.class); + params.remove("signature"); + // 使用HashMap,并使用Arrays.sort排序 + String[] sortedKeys = params.keySet().toArray(new String[]{}); + Arrays.sort(sortedKeys); // 排序请求参数 + StringBuilder builder = new StringBuilder(); + for (String key : sortedKeys) { + if (ObjectUtils.isEmpty(params.get(key))) { + continue; + } + builder.append(key).append("=").append(params.get(key)).append("&"); + } + // 去除后一位& + builder.deleteCharAt(builder.length() - 1).toString(); + /** + * 拼接上appsecret + */ + builder.append(signKey); + String signValue = SecureUtil.md5(builder.toString()); + return signValue; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/jiepay/JiepaySend.java b/src/main/java/com/bomaos/common/core/pays/jiepay/JiepaySend.java new file mode 100644 index 0000000..5e98455 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/jiepay/JiepaySend.java @@ -0,0 +1,36 @@ +package com.bomaos.common.core.pays.jiepay; + +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSON; +import com.bomaos.settings.entity.Pays; + +import java.util.Map; + +public class JiepaySend { + + public static String jiePayUtils(Pays pays, String price, String payId, String param) { + + Map mapTypes = JSON.parseObject(pays.getConfig()); + + String appid = mapTypes.get("appid").toString(); + String apptoken = mapTypes.get("apptoken").toString(); + + String sign = SecureUtil.md5(appid + apptoken); + + Integer type = 1; + if (pays.getDriver().equals("jiepay_alipay")) { + type = 1; + } else if (pays.getDriver().equals("jiepay_wxpay")) { + type = 2; + } + + String is_ok = "true"; + String url = "http://pay.joo.life/Corder?appid=" + + appid + "&code=" + type + "&order_id=" + + payId + "&order_rmb=" + price + "&sign=" + + sign + "&is_ok=" + is_ok + "&diy=" + param; + + return url; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/mqpay/mqPay.java b/src/main/java/com/bomaos/common/core/pays/mqpay/mqPay.java new file mode 100644 index 0000000..5438bbc --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/mqpay/mqPay.java @@ -0,0 +1,41 @@ +package com.bomaos.common.core.pays.mqpay; + +import com.alibaba.fastjson.JSON; +import com.bomaos.settings.entity.Pays; +import org.springframework.util.DigestUtils; + +import java.util.Map; + +public class mqPay { + + public static String sendCreateMqPay(Pays pays, String price, String payId, String cloudPayid, String param) { + + Map mapTypes = JSON.parseObject(pays.getConfig()); + + String key = mapTypes.get("key").toString(); + String create_url = mapTypes.get("create_url").toString(); + String notify_url = mapTypes.get("notify_url").toString(); + + Integer type = 2; // 默认支付宝 + if (pays.getDriver().equals("mqpay_alipay")) { + type = 2; + } else if (pays.getDriver().equals("mqpay_wxpay")) { + type = 1; + } + + String notifyUrl = notify_url + "/mqpay/notifyUrl"; + String returnUrl = notify_url + "/mqpay/returnUrl"; + + String jsSign = md5(payId + param + type + price + key); + String url = create_url + "/createOrder?payId=" + payId + "&type=" + type + "&price=" + price + "¬ifyUrl=" + notifyUrl + "&returnUrl=" + returnUrl + "&sign=" + jsSign + "¶m=" + param + "&isHtml=1"; + + return url; + } + + public static String md5(String text) { + //加密后的字符串 + String encodeStr = DigestUtils.md5DigestAsHex(text.getBytes()); + return encodeStr; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/payjs/HttpsUtils.java b/src/main/java/com/bomaos/common/core/pays/payjs/HttpsUtils.java new file mode 100644 index 0000000..948ebd9 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/payjs/HttpsUtils.java @@ -0,0 +1,244 @@ +package com.bomaos.common.core.pays.payjs; + +import javax.net.ssl.*; +import java.io.*; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.List; +import java.util.Map; + +/** + * 发送http和https + * + * @author zhangwp 289022259@qq.com + * @date 2017-04 + */ +@SuppressWarnings("deprecation") +public class HttpsUtils { + + private static class TrustAnyTrustManager implements X509TrustManager { + + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier { + public boolean verify(String hostname, SSLSession session) { + return true; + } + } + + public static String httpsPost(String url, String content, String charset) throws NoSuchAlgorithmException, KeyManagementException, IOException { + byte[] bb = HttpsUtils.post(url, content, charset); + String str = new String(bb, StandardCharsets.UTF_8); + return str; + } + + /** + * post方式请求服务器(https协议) + * + * @param url 请求地址 + * @param content 参数 + * @param charset 编码 + * @return + * @throws NoSuchAlgorithmException + * @throws KeyManagementException + * @throws IOException + * @author zhangwp 289022259@qq.com + * @date 2017-04 + */ + public static byte[] post(String url, String content, String charset) throws NoSuchAlgorithmException, KeyManagementException, IOException { + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom()); + + URL console = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.setDoOutput(true); + conn.connect(); + DataOutputStream out = new DataOutputStream(conn.getOutputStream()); + out.write(content.getBytes(charset)); + // 刷新、关闭 + out.flush(); + out.close(); + InputStream is = conn.getInputStream(); + if (is != null) { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = is.read(buffer)) != -1) { + outStream.write(buffer, 0, len); + } + is.close(); + return outStream.toByteArray(); + } + return null; + } + + /** + * 向指定URL发送GET方法的请求 + * + * @param url 发送请求的URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param token 环信token + * @return URL 所代表远程资源的响应结果 + * @author zhangwp 289022259@qq.com + * @date 2017-04 + */ + public static String sendGet(String url, String param, String token) { + String result = ""; + BufferedReader in = null; + try { + String urlNameString = url + "?" + param; + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + // connection.setRequestProperty("accept", "*/*"); + // connection.setRequestProperty("connection", "Keep-Alive"); + // connection.setRequestProperty("user-agent", + // "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.1;SV1)"); + // 设置环信token + if (token != null && !"".equals(token)) { + conn.setRequestProperty("Authorization", "Bearer " + token); + } + conn.setConnectTimeout(1000 * 5); + conn.setReadTimeout(1000 * 5); + // 建立实际的连接 + conn.connect(); + // 获取所有响应头字段 + Map> map = conn.getHeaderFields(); + // 遍历所有的响应头字段 + for (String key : map.keySet()) { + System.out.println(key + "--->" + map.get(key)); + } + // 定义 BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + } catch (Exception e) { + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } + // 使用finally块来关闭输入流 + finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception e2) { + e2.printStackTrace(); + } + } + return result; + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,json格式 + * @param token 环信token + * @return 所代表远程资源的响应结果 + * @throws IOException + * @author zhangwp 289022259@qq.com + * @date 2017-04 + */ + public static String sendPost(String url, String param, String token) throws IOException { + PrintWriter out = null; + BufferedReader in = null; + String result = ""; + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + // conn.setRequestProperty("accept", "*/*"); + // conn.setRequestProperty("connection", "Keep-Alive"); + // conn.setRequestProperty("user-agent", + // "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 设置参数格式为json + conn.setRequestProperty("Content-Type", "application/json"); + // 设置环信token + if (token != null && !"".equals(token)) { + conn.setRequestProperty("Authorization", "Bearer " + token); + } + conn.setConnectTimeout(1000 * 5); + conn.setReadTimeout(1000 * 5); + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // 发送请求参数 + out.print(param); + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + } finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return result; + } + + public static String sendPostHttps(String url, String param, String token, String charset) throws IOException, NoSuchAlgorithmException, KeyManagementException { + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom()); + + URL console = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.setDoOutput(true); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Authorization", "Bearer " + token); + conn.connect(); + DataOutputStream out = new DataOutputStream(conn.getOutputStream()); + out.write(param.getBytes(charset)); + // 刷新、关闭 + out.flush(); + out.close(); + InputStream is = conn.getInputStream(); + if (is != null) { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = is.read(buffer)) != -1) { + outStream.write(buffer, 0, len); + } + is.close(); + return outStream.toString(String.valueOf(StandardCharsets.UTF_8)); + } + return null; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/payjs/PayjsConfig.java b/src/main/java/com/bomaos/common/core/pays/payjs/PayjsConfig.java new file mode 100644 index 0000000..5031aa3 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/payjs/PayjsConfig.java @@ -0,0 +1,22 @@ +package com.bomaos.common.core.pays.payjs; + +/** + * @Author chengtianqi + * @create 2020/8/28 17:08 + */ +public class PayjsConfig { + // API 地址 + public final static String nativeUrl = "https://payjs.cn/api/native"; + public final static String jsapiUrl = "https://payjs.cn/api/jsapi"; + public final static String micropayUrl = "https://payjs.cn/api/micropay"; + public final static String cashierUrl = "https://payjs.cn/api/cashier"; + public final static String checkUrl = "https://payjs.cn/api/check"; + public final static String closeUrl = "https://payjs.cn/api/close"; + public final static String reverseUrl = "https://payjs.cn/api/reverse"; + public final static String refundUrl = "https://payjs.cn/api/refund"; + public final static String infoUrl = "https://payjs.cn/api/info"; + public final static String complaintUrl = "https://payjs.cn/api/complaint"; + public final static String bankUrl = "https://payjs.cn/api/bank"; + public final static String mwebUrl = "https://payjs.cn/api/mweb"; + +} diff --git a/src/main/java/com/bomaos/common/core/pays/payjs/SignUtil.java b/src/main/java/com/bomaos/common/core/pays/payjs/SignUtil.java new file mode 100644 index 0000000..dc9fa46 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/payjs/SignUtil.java @@ -0,0 +1,64 @@ +package com.bomaos.common.core.pays.payjs; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; +import java.security.MessageDigest; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +public class SignUtil { + + //签名算法 + public static String sign(Map params, String secret) { + String sign = ""; + StringBuilder sb = new StringBuilder(); + //step1:先对请求参数排序 + Set keyset = params.keySet(); + TreeSet sortSet = new TreeSet(); + sortSet.addAll(keyset); + Iterator it = sortSet.iterator(); + //step2:把参数的key value链接起来 secretkey放在最后面,得到要加密的字符串 + while (it.hasNext()) { + String key = it.next(); + String value = params.get(key).toString(); + sb.append(key).append("=").append(value).append("&"); + } + sb.append("key=").append(secret); + byte[] md5Digest; + try { + //得到Md5加密得到sign + md5Digest = getMD5Digest(sb.toString()); + sign = byte2hex(md5Digest); + } catch (IOException e) { + System.out.println("生成签名错误" + e); + } + return sign; + } + + private static String byte2hex(byte[] bytes) { + StringBuilder sign = new StringBuilder(); + for (int i = 0; i < bytes.length; i++) { + String hex = Integer.toHexString(bytes[i] & 0xFF); + if (hex.length() == 1) { + sign.append("0"); + } + sign.append(hex.toUpperCase()); + } + return sign.toString(); + } + + private static byte[] getMD5Digest(String data) throws IOException { + byte[] bytes = null; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + bytes = md.digest(data.getBytes(StandardCharsets.UTF_8)); + } catch (GeneralSecurityException gse) { + throw new IOException(gse); + } + return bytes; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/payjs/sendPayjs.java b/src/main/java/com/bomaos/common/core/pays/payjs/sendPayjs.java new file mode 100644 index 0000000..41b0a2c --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/payjs/sendPayjs.java @@ -0,0 +1,63 @@ +package com.bomaos.common.core.pays.payjs; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bomaos.settings.entity.Pays; + +import java.io.IOException; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.Map; + +public class sendPayjs { + + /** + * payjs 支付 + * + * @param pays 本地支付驱动 + * @param price 付款金额 + * @param ordersMember 本地订单号 + * @param goodsName 商品名称 + * @param goodsDescription 自定义内容 + * @return 返回收款二维码 + * @throws IOException + */ + public static String pay(Pays pays, String price, String ordersMember, String goodsName, String goodsDescription) throws IOException { + + Map mapTypes = JSON.parseObject(pays.getConfig()); + + String mchId = mapTypes.get("mchId").toString(); // + String key = mapTypes.get("key").toString(); // + String notifyUrl = mapTypes.get("notify_url").toString() + "/payjs/notify"; // + + BigDecimal bigDecimal = new BigDecimal(price); + BigDecimal multiply = bigDecimal.multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_DOWN); + String format = new DecimalFormat("0.##").format(multiply); + + Map payData = new HashMap<>(); + payData.put("mchid", mchId); + payData.put("total_fee", format); + payData.put("out_trade_no", ordersMember); // 订单号 随便输的,自己生成一下就好了 + payData.put("body", goodsName); + payData.put("attach", goodsDescription); + payData.put("notify_url", notifyUrl); + + /** + * 支付宝付款参数 + */ + if (pays.getDriver().equals("payjs_alipay")) { + payData.put("type", "alipay"); + } + + // 进行sign签名 + payData.put("sign", SignUtil.sign(payData, key)); + + // 请求payjs获取二维码 + String result = HttpsUtils.sendPost(PayjsConfig.nativeUrl, JSON.toJSONString(payData), null); + JSONObject jsonObject = JSON.parseObject(result); + String code_url = jsonObject.get("code_url").toString(); // 获取付款二维码 + + return code_url; + } +} diff --git a/src/main/java/com/bomaos/common/core/pays/paypal/PaypalSend.java b/src/main/java/com/bomaos/common/core/pays/paypal/PaypalSend.java new file mode 100644 index 0000000..fb932c3 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/paypal/PaypalSend.java @@ -0,0 +1,93 @@ +package com.bomaos.common.core.pays.paypal; + +import com.alibaba.fastjson.JSON; +import com.bomaos.common.core.pays.paypal.config.PaypalPaymentIntent; +import com.bomaos.common.core.pays.paypal.config.PaypalPaymentMethod; +import com.bomaos.settings.entity.Pays; +import com.paypal.api.payments.*; +import com.paypal.base.rest.APIContext; +import com.paypal.base.rest.OAuthTokenCredential; +import com.paypal.base.rest.PayPalRESTException; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 说明:用于创建 paypal 国际支付收款 + * 调用 createPayment 方法即可发起支付 + * 作者:Panyoujie + * 时间:2021-08-24 + */ +public class PaypalSend { + + private static final String mode = "live"; // live (正式环境) sandbox (测试环境) + + public static Payment createPayment(Pays pays, + String total, + String currency, + PaypalPaymentMethod method, + PaypalPaymentIntent intent, + String description) throws PayPalRESTException { + + Map mapTypes = JSON.parseObject(pays.getConfig()); + String clientId = mapTypes.get("clientId").toString(); + String clientSecret = mapTypes.get("clientSecret").toString(); + String successUrl = mapTypes.get("return_url").toString() + "/paypal/success"; + String cancelUrl = mapTypes.get("return_url").toString() + "/paypal/cancel"; + + APIContext apiContext = apiContext(clientId, clientSecret, mode); + + Amount amount = new Amount(); + amount.setCurrency(currency); + amount.setTotal(total); + + Transaction transaction = new Transaction(); + transaction.setDescription(description); + transaction.setAmount(amount); + + List transactions = new ArrayList<>(); + transactions.add(transaction); + + Payer payer = new Payer(); + payer.setPaymentMethod(method.toString()); + + Payment payment = new Payment(); + payment.setIntent(intent.toString()); + payment.setPayer(payer); + payment.setTransactions(transactions); + RedirectUrls redirectUrls = new RedirectUrls(); + redirectUrls.setCancelUrl(cancelUrl); + redirectUrls.setReturnUrl(successUrl); + payment.setRedirectUrls(redirectUrls); + apiContext.setMaskRequestId(true); + return payment.create(apiContext); + } + + public static Payment executePayment(String clientId, String clientSecret, String paymentId, String payerId) throws PayPalRESTException { + APIContext apiContext = apiContext(clientId, clientSecret, mode); + Payment payment = new Payment(); + payment.setId(paymentId); + PaymentExecution paymentExecute = new PaymentExecution(); + paymentExecute.setPayerId(payerId); + return payment.execute(apiContext, paymentExecute); + } + + public static Map paypalSdkConfig(String mode) { + Map sdkConfig = new HashMap<>(); + sdkConfig.put("mode", mode); + return sdkConfig; + } + + public static OAuthTokenCredential authTokenCredential(String clientId, String clientSecret, String mode) { + return new OAuthTokenCredential(clientId, clientSecret, paypalSdkConfig(mode)); + } + + public static APIContext apiContext(String clientId, String clientSecret, String mode) throws PayPalRESTException { + APIContext apiContext = new APIContext(authTokenCredential(clientId, clientSecret, mode).getAccessToken()); + apiContext.setConfigurationMap(paypalSdkConfig(mode)); + return apiContext; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/paypal/config/PaypalPaymentIntent.java b/src/main/java/com/bomaos/common/core/pays/paypal/config/PaypalPaymentIntent.java new file mode 100644 index 0000000..7009795 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/paypal/config/PaypalPaymentIntent.java @@ -0,0 +1,10 @@ +package com.bomaos.common.core.pays.paypal.config; + +/** + * 说明:Paypal 枚举类 + * 作者:Panyoujie + * 时间:2021-08-24 + */ +public enum PaypalPaymentIntent { + sale, authorize, order +} diff --git a/src/main/java/com/bomaos/common/core/pays/paypal/config/PaypalPaymentMethod.java b/src/main/java/com/bomaos/common/core/pays/paypal/config/PaypalPaymentMethod.java new file mode 100644 index 0000000..72930e0 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/paypal/config/PaypalPaymentMethod.java @@ -0,0 +1,10 @@ +package com.bomaos.common.core.pays.paypal.config; + +/** + * 说明:Paypal 枚举类 + * 作者:Panyoujie + * 时间:2021-08-24 + */ +public enum PaypalPaymentMethod { + credit_card, paypal +} diff --git a/src/main/java/com/bomaos/common/core/pays/wxpay/SendWxPay.java b/src/main/java/com/bomaos/common/core/pays/wxpay/SendWxPay.java new file mode 100644 index 0000000..92c8e9b --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/wxpay/SendWxPay.java @@ -0,0 +1,148 @@ +package com.bomaos.common.core.pays.wxpay; + +import com.alibaba.fastjson.JSON; +import com.bomaos.settings.entity.Pays; +import com.github.wxpay.sdk.WXPay; + +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.Map; + +public class SendWxPay { + + /** + * 微信官方支付 Native + * + * @param pays 支付驱动 + * @param price 金额 + * @param ordersMember 商品id + * @param goodsName 商品名称 + * @param goodsDescription 附加内容 + * @param ip 用户ip地址 + * @return 返回url + */ + public static String payNattve(Pays pays, String price, String ordersMember, String goodsName, String goodsDescription, String ip) { + + Map mapTypes = JSON.parseObject(pays.getConfig()); + String appId = mapTypes.get("appId").toString(); + String mchId = mapTypes.get("mchId").toString(); + String key = mapTypes.get("key").toString(); + String notifyUrl = mapTypes.get("notify_url").toString() + "/wxpay/notify"; // 异步通知地址 + + /** + * 处理金额 + */ + BigDecimal bigDecimal = new BigDecimal(price); + BigDecimal multiply = bigDecimal.multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_DOWN); + String money = new DecimalFormat("0.##").format(multiply); + + WXPayConfigImpl wxPayConfig = new WXPayConfigImpl(); + wxPayConfig.setAppID(appId); + wxPayConfig.setMchID(mchId); + wxPayConfig.setKey(key); + wxPayConfig.setCertPath("resources/cert/wxpay/apiclient_cert.p12"); // 证书地址 + wxPayConfig.setPayNotifyUrl(notifyUrl); // 异步通知 + + WXPay wxPay = new WXPay(wxPayConfig); + + Map requestMap = new HashMap<>(); + requestMap.put("body", goodsName); // 商品描述 + requestMap.put("out_trade_no", ordersMember); // 商户订单号 + requestMap.put("total_fee", money); // 总金额 + requestMap.put("spbill_create_ip", ip); // 终端IP + requestMap.put("trade_type", "NATIVE"); // Native支付类型 + requestMap.put("product_id", ordersMember); // trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义。 + requestMap.put("attach", goodsDescription); // 附加数据 + requestMap.put("notify_url", wxPayConfig.getPayNotifyUrl()); // 接收微信支付异步通知回调地址 + + try { + Map stringStringMap = wxPay.unifiedOrder(requestMap); + String result_code = stringStringMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + String code_url = stringStringMap.get("code_url"); + return code_url; + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 微信官方h5支付 + * + * @param pays 支付驱动 + * @param price 金额 + * @param ordersMember 商品id + * @param goodsName 商品名称 + * @param goodsDescription 附加内容 + * @param ip 用户ip地址 + * @return 返回url + */ + public static String payMweb(Pays pays, String price, String ordersMember, String goodsName, String goodsDescription, String ip) { + + Map mapTypes = JSON.parseObject(pays.getConfig()); + String appId = mapTypes.get("appId").toString(); + String mchId = mapTypes.get("mchId").toString(); + String key = mapTypes.get("key").toString(); + String notifyUrl = mapTypes.get("notify_url").toString() + "/wxpay/notify"; // 异步通知地址 + String wap_url = mapTypes.get("notify_url").toString(); + + //支付回调页面 + String REDIRECT_URL = wap_url + "/search/order/"; + + /** + * 处理金额 + */ + BigDecimal bigDecimal = new BigDecimal(price); + BigDecimal multiply = bigDecimal.multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_DOWN); + String money = new DecimalFormat("0.##").format(multiply); + + WXPayConfigImpl wxPayConfig = new WXPayConfigImpl(); + wxPayConfig.setAppID(appId); + wxPayConfig.setMchID(mchId); + wxPayConfig.setKey(key); + wxPayConfig.setCertPath("resources/cert/wxpay/apiclient_cert.p12"); // 证书地址 + wxPayConfig.setPayNotifyUrl(notifyUrl); // 异步通知 + + WXPay wxPay = new WXPay(wxPayConfig); + + Map requestMap = new HashMap<>(); + requestMap.put("body", goodsName); // 商品描述 + requestMap.put("out_trade_no", ordersMember); // 商户订单号 + requestMap.put("total_fee", money); // 总金额 + requestMap.put("trade_type", "MWEB"); // Mweb支付类型 + requestMap.put("spbill_create_ip", ip); // 终端IP + + Map map = new HashMap<>(); + Map map1 = new HashMap<>(); + map1.put("type", "Wap"); + map1.put("wap_url", wap_url); + map1.put("wap_name", goodsName); + String jsonString = JSON.toJSONString(map1); + map.put("h5_info", jsonString); + + String jsonString1 = JSON.toJSONString(map); + requestMap.put("scene_info", jsonString1); + requestMap.put("attach", goodsDescription); // 附加数据 + requestMap.put("notify_url", wxPayConfig.getPayNotifyUrl()); // 接收微信支付异步通知回调地址 + + try { + Map stringStringMap = wxPay.unifiedOrder(requestMap); + String result_code = stringStringMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + // String trade_type = stringStringMap.get("trade_type"); + String mweb_url = stringStringMap.get("mweb_url"); + String url = URLEncoder.encode(REDIRECT_URL + ordersMember, "utf-8"); + mweb_url = mweb_url + "&redirect_url=" + url; + return mweb_url; + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/wxpay/WXPayConfigImpl.java b/src/main/java/com/bomaos/common/core/pays/wxpay/WXPayConfigImpl.java new file mode 100644 index 0000000..2667473 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/wxpay/WXPayConfigImpl.java @@ -0,0 +1,71 @@ +package com.bomaos.common.core.pays.wxpay; + +import com.github.wxpay.sdk.WXPayConfig; +import lombok.Data; +import lombok.ToString; + +import java.io.InputStream; + +@Data +@ToString +public class WXPayConfigImpl implements WXPayConfig { + + /** + * 获取 App ID + * + * @return App ID + */ + private String appID; + + /** + * 获取 Mch ID + * + * @return Mch ID + */ + private String mchID; + + /** + * 获取 API 密钥 + * + * @return API密钥 + */ + private String key; + + /** + * 获取商户证书内容 + * + * @return 商户证书内容 + */ + private String certPath; + + /** + * HTTP(S) 连接超时时间,单位毫秒 + * + * @return + */ + private int httpConnectTimeoutMs = 8000; + + /** + * HTTP(S) 读数据超时时间,单位毫秒 + * + * @return + */ + private int httpReadTimeoutMs = 10000; + + /** + * 微信支付异步通知地址 + */ + private String payNotifyUrl; + + /** + * 微信退款异步通知地址 + */ + private String refundNotifyUrl; + + @Override + public InputStream getCertStream() { + InputStream certStream = getClass().getClassLoader().getResourceAsStream(certPath); + return certStream; + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/xunhupay/PayUtils.java b/src/main/java/com/bomaos/common/core/pays/xunhupay/PayUtils.java new file mode 100644 index 0000000..1585ba7 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/xunhupay/PayUtils.java @@ -0,0 +1,144 @@ +package com.bomaos.common.core.pays.xunhupay; + +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSONObject; +import com.bomaos.settings.entity.Pays; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ObjectUtils; +import org.springframework.web.client.HttpClientErrorException; + +import java.util.*; + +/** + * 虎皮椒支付 + * author Panyoujie + * Url https://zdins.cn + */ +public class PayUtils { + + /** + * 虎皮椒支付 + * + * @param product_type 商品名称 + * @param price 金额 + * @param orderMember 订单id + * @return + */ + public static Map pay(String webName, Pays pays, String product_type, String price, String orderMember, String plugins) { + + String config = pays.getConfig(); + JSONObject configs = JSONObject.parseObject(config); + + /** + * @param appid 商品名称 + * @param appsecret 密钥 + * @param url 订单id + */ + String appid = (String) configs.get("appid"); + String appsecret = (String) configs.get("appsecret"); + String create_url = (String) configs.get("create_url"); + String notify_url = (String) configs.get("notify_url"); + + Map sortParams = new HashMap<>(); + sortParams.put("version", "1.1"); + sortParams.put("lang", "zh-cn"); + sortParams.put("plugins", plugins); + sortParams.put("appid", appid); + sortParams.put("trade_order_id", orderMember); + if (StringUtils.equals(pays.getDriver(), "xunhupay_wxpay")) { + sortParams.put("payment", "wechat"); // 微信 + sortParams.put("type", "WAP"); + sortParams.put("wap_url", notify_url); + sortParams.put("wap_name", webName); + } else { + sortParams.put("payment", "alipay"); // 支付宝 + } + sortParams.put("total_fee", price); + sortParams.put("title", product_type); + sortParams.put("time", getSecondTimestamp(new Date())); + sortParams.put("notify_url", notify_url + "/xunhupay/notifyUrl"); + sortParams.put("return_url", notify_url + "/xunhupay/returnUrl?trade_order_id=" + orderMember); + sortParams.put("callback_url", notify_url); + sortParams.put("nonce_str", getRandomNumber(9)); + sortParams.put("hash", createSign(sortParams, appsecret)); + Map map1 = null; + try { + XunhuEntity xunhuEntity = RequestUtil.getHttpsPost(create_url, sortParams); + if (xunhuEntity.getErrcode() == 0 && xunhuEntity.getErrmsg().equals("success!")) { + HashMap map = new HashMap<>(); + map.put("url_qrcode", xunhuEntity.getUrl_qrcode()); + map.put("url1", xunhuEntity.getUrl()); + map1 = map; + } + } catch (HttpClientErrorException e) { + System.out.println("e.getMessage() = " + e.getMessage()); + } + return map1; + } + + /** + * 生成密钥 + * + * @param params + * @param privateKey + * @return + */ + public static String createSign(Map params, String privateKey) { + params.remove("hash"); + // 使用HashMap,并使用Arrays.sort排序 + String[] sortedKeys = params.keySet().toArray(new String[]{}); + Arrays.sort(sortedKeys);// 排序请求参数 + StringBuilder builder = new StringBuilder(); + for (String key : sortedKeys) { + if (ObjectUtils.isEmpty(params.get(key))) { + continue; + } + builder.append(key).append("=").append(params.get(key)).append("&"); + } + String result = builder.deleteCharAt(builder.length() - 1).toString(); + + /** + * 拼接上appsecret + */ + String stringSignTemp = result + privateKey; + String signValue = SecureUtil.md5(stringSignTemp); + + return signValue; + } + + + /** + * 获取精确到秒的时间戳 原理 获取毫秒时间戳,因为 1秒 = 100毫秒 去除后三位 就是秒的时间戳 + * + * @return + */ + public static int getSecondTimestamp(Date date) { + if (null == date) { + return 0; + } + String timestamp = String.valueOf(date.getTime()); + int length = timestamp.length(); + if (length > 3) { + return Integer.valueOf(timestamp.substring(0, length - 3)); + } else { + return 0; + } + } + + /** + * 生成一个随机数字 + * + * @param length 长度自定义 + * @return + */ + public static String getRandomNumber(int length) { + String str = "0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; ++i) { + int number = random.nextInt(str.length()); + sb.append(str.charAt(number)); + } + return sb.toString(); + } +} diff --git a/src/main/java/com/bomaos/common/core/pays/xunhupay/RequestUtil.java b/src/main/java/com/bomaos/common/core/pays/xunhupay/RequestUtil.java new file mode 100644 index 0000000..ee3d089 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/xunhupay/RequestUtil.java @@ -0,0 +1,44 @@ +package com.bomaos.common.core.pays.xunhupay; + +import org.springframework.http.*; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.StandardCharsets; +import java.util.Map; + +/** + * 虎皮椒工具类 + * author Panyoujie + * Url https://zdins.cn + */ +public class RequestUtil { + + /** + * 虎皮椒请求接口 + * + * @param url + * @param params + * @return + */ + public static XunhuEntity getHttpsPost(String url, Map params) { + MultiValueMap multiValueMap = new LinkedMultiValueMap<>(); + for (Map.Entry stringObjectEntry : params.entrySet()) { + multiValueMap.add(stringObjectEntry.getKey(), stringObjectEntry.getValue()); + } + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); + HttpHeaders headers = new HttpHeaders(); + HttpMethod method = HttpMethod.POST; + // 以表单的方式提交 + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + //将请求头部和参数合成一个请求 + HttpEntity> requestEntity = new HttpEntity<>(multiValueMap, headers); + //执行HTTP请求,将返回的结构使用ResultVO类格式化 + ResponseEntity exchange = restTemplate.exchange(url, method, requestEntity, XunhuEntity.class); + return exchange.getBody(); + } + +} diff --git a/src/main/java/com/bomaos/common/core/pays/xunhupay/XunhuEntity.java b/src/main/java/com/bomaos/common/core/pays/xunhupay/XunhuEntity.java new file mode 100644 index 0000000..0a58c9a --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/xunhupay/XunhuEntity.java @@ -0,0 +1,15 @@ +package com.bomaos.common.core.pays.xunhupay; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class XunhuEntity { + private Integer errcode; + private String errmsg; + private String hash; + private String openid; + private String url_qrcode; + private String url; +} diff --git a/src/main/java/com/bomaos/common/core/pays/yungouos/YunGouosConfig.java b/src/main/java/com/bomaos/common/core/pays/yungouos/YunGouosConfig.java new file mode 100644 index 0000000..5a8df36 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/pays/yungouos/YunGouosConfig.java @@ -0,0 +1,70 @@ +package com.bomaos.common.core.pays.yungouos; + +import com.alibaba.fastjson.JSON; +import com.bomaos.settings.entity.Pays; +import com.yungouos.pay.alipay.AliPay; +import com.yungouos.pay.wxpay.WxPay; + +import java.util.Map; + +public class YunGouosConfig { + + /** + * yungou微信支付接口 + * + * @param pays 支付配置 + * @param price 金额 + * @param ordersMember 本地订单号 + * @param goodsDescription 附加内容 + * @return + */ + public static String yunGouosWxPay(Pays pays, String price, String ordersMember, String goodsName, String goodsDescription) { + Map mapTypes = JSON.parseObject(pays.getConfig()); + + String mchId = mapTypes.get("mchId").toString(); // + String key = mapTypes.get("key").toString(); // + String notifyUrl = mapTypes.get("notify_url").toString() + "/yungouos/notify"; // + + String result = null; + + try { + /** + * 扫码支付 返回二维码连接 + */ + result = WxPay.nativePay(ordersMember, price, mchId, goodsName, "1", goodsDescription, notifyUrl, null, null, null, null, key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * @param pays + * @param price + * @param ordersMember + * @param goodsName + * @param goodsDescription + * @return + */ + public static String yunGouosAliPay(Pays pays, String price, String ordersMember, String goodsName, String goodsDescription) { + Map mapTypes = JSON.parseObject(pays.getConfig()); + + String mchId = mapTypes.get("mchId").toString(); // + String key = mapTypes.get("key").toString(); // + String notifyUrl = mapTypes.get("notify_url").toString() + "/yungouos/notify"; // + + String result = null; + + try { + /** + * 扫码支付 返回二维码连接 + */ + result = AliPay.nativePay(ordersMember, price, mchId, goodsName, "1", goodsDescription, notifyUrl, key); + + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + +} diff --git a/src/main/java/com/bomaos/common/core/shiro/ShiroConfig.java b/src/main/java/com/bomaos/common/core/shiro/ShiroConfig.java new file mode 100644 index 0000000..ae72353 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/shiro/ShiroConfig.java @@ -0,0 +1,213 @@ +package com.bomaos.common.core.shiro; + +import org.apache.shiro.authc.credential.HashedCredentialsMatcher; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.apache.shiro.codec.Base64; +import org.apache.shiro.io.ResourceUtils; +import org.apache.shiro.spring.LifecycleBeanPostProcessor; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.CookieRememberMeManager; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.servlet.SimpleCookie; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; + +import javax.servlet.Filter; +import java.io.IOException; +import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * shiro框架配置 + * Created by Panyoujie on 2017-04-28 09:45 + */ +@Configuration +public class ShiroConfig { + + /** + * shiro过滤器 + */ + @Bean(name = "shiroFilter") + public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) { + + ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); + shiroFilter.setSecurityManager(securityManager); + + // 登录配置 + shiroFilter.setLoginUrl("/login"); + shiroFilter.setSuccessUrl("/admin"); + shiroFilter.setUnauthorizedUrl("/error?code=403"); + + // 自定义过滤器 + Map filtersMap = new LinkedHashMap<>(); + filtersMap.put("slf", new ShiroLoginFilter()); + shiroFilter.setFilters(filtersMap); + + // 拦截配置 + Map filterChainDefinitions = new LinkedHashMap<>(); + filterChainDefinitions.put("/assets/**", "anon"); + filterChainDefinitions.put("/default/**", "anon"); + filterChainDefinitions.put("/favicon.ico", "anon"); + filterChainDefinitions.put("/file/**", "anon"); + filterChainDefinitions.put("/ads.txt", "anon"); + + /** + * 首页 + */ + filterChainDefinitions.put("/", "anon"); + filterChainDefinitions.put("/index", "anon"); + filterChainDefinitions.put("/article", "anon"); + filterChainDefinitions.put("/article/**", "anon"); + filterChainDefinitions.put("/getArticleList", "anon"); + filterChainDefinitions.put("/search", "anon"); + filterChainDefinitions.put("/search/order/**", "anon"); + filterChainDefinitions.put("/exportCards", "anon"); + filterChainDefinitions.put("/orders/orders/pageAll", "anon"); + filterChainDefinitions.put("/getProductSearchList", "anon"); + filterChainDefinitions.put("/getShoppingNotes", "anon"); + filterChainDefinitions.put("/file/enQrcode", "anon"); + filterChainDefinitions.put("/content/article/updateLike", "anon"); + + /** + * 商品 + */ + filterChainDefinitions.put("/product/**", "anon"); + filterChainDefinitions.put("/getProductById", "anon"); + filterChainDefinitions.put("/getProductList", "anon"); + + // 订单创建 + filterChainDefinitions.put("/buy", "anon"); + + // 支付 + filterChainDefinitions.put("/pay/**", "anon"); + filterChainDefinitions.put("/alipayPc/**", "anon"); + filterChainDefinitions.put("/order/state/**", "anon"); + filterChainDefinitions.put("/pay/state/**", "anon"); + + // 异步通知 + filterChainDefinitions.put("/mqpay/notifyUrl", "anon"); + filterChainDefinitions.put("/mqpay/returnUrl", "anon"); + filterChainDefinitions.put("/epay/notifyUrl", "anon"); + filterChainDefinitions.put("/epay/returnUrl", "anon"); + filterChainDefinitions.put("/budpay/notifyUrl", "anon"); + filterChainDefinitions.put("/budpay/returnUrl", "anon"); + filterChainDefinitions.put("/xunhupay/notifyUrl", "anon"); + filterChainDefinitions.put("/xunhupay/returnUrl", "anon"); + filterChainDefinitions.put("/yungouos/notify", "anon"); + filterChainDefinitions.put("/payjs/notify", "anon"); + filterChainDefinitions.put("/wxpay/notify", "anon"); + filterChainDefinitions.put("/alipay/notify", "anon"); + filterChainDefinitions.put("/alipay/return_url", "anon"); + filterChainDefinitions.put("/paypal/cancel", "anon"); + filterChainDefinitions.put("/paypal/success", "anon"); + filterChainDefinitions.put("/epusdt/notifyUrl", "anon"); + filterChainDefinitions.put("/epusdt/returnUrl", "anon"); + filterChainDefinitions.put("/wxpusher/callback", "anon"); + + // api + filterChainDefinitions.put("/api/**", "anon"); + filterChainDefinitions.put("/error", "anon"); + filterChainDefinitions.put("/login", "anon"); + filterChainDefinitions.put("/logout", "logout"); + //filterChainDefinitions.put("/**", "slf,authc"); + filterChainDefinitions.put("/**", "slf,user"); // 记住密码也能访问 + shiroFilter.setFilterChainDefinitionMap(filterChainDefinitions); + return shiroFilter; + } + + /** + * userRealm + */ + @Bean(name = "userRealm") + @DependsOn("lifecycleBeanPostProcessor") + public UserRealm userRealm() { + UserRealm userRealm = new UserRealm(); + // 密码凭证器 + userRealm.setCredentialsMatcher(new HashedCredentialsMatcher("md5")); + return userRealm; + } + + /** + * 安全管理器 + */ + @Bean(name = "securityManager") + public DefaultWebSecurityManager securityManager() { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(userRealm()); + securityManager.setSessionManager(sessionManager()); + securityManager.setCacheManager(cacheManager()); + securityManager.setRememberMeManager(cookieRememberMeManager()); + return securityManager; + } + + @Bean + public DefaultWebSessionManager sessionManager() { + DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); + sessionManager.setSessionIdUrlRewritingEnabled(false); + return sessionManager; + } + + /** + * 缓存管理器 + */ + @Bean(name = "cacheManager") + public EhCacheManager cacheManager() { + EhCacheManager cacheManager = new EhCacheManager(); + net.sf.ehcache.CacheManager cm = net.sf.ehcache.CacheManager.getCacheManager("shirocache"); + if (cm == null) { + String configFile = "classpath:ehcache/ehcache-shiro.xml"; + InputStream is = null; + try { + is = ResourceUtils.getInputStreamForPath(configFile); + cm = new net.sf.ehcache.CacheManager(is); + } catch (IOException e) { + throw new IllegalStateException("Unable to obtain input stream for cacheManagerConfigFile [" + configFile + "]", e); + } finally { + ResourceUtils.close(is); + } + } + cacheManager.setCacheManager(cm); + return cacheManager; + } + + /** + * 记住密码cookie + */ + @Bean + public SimpleCookie rememberMeCookie() { + SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); + simpleCookie.setMaxAge(60 * 60 * 24 * 7); // 过期时间7天 + return simpleCookie; + } + + /** + * 记住密码cookie管理器 + */ + @Bean + public CookieRememberMeManager cookieRememberMeManager() { + CookieRememberMeManager manager = new CookieRememberMeManager(); + manager.setCookie(rememberMeCookie()); + manager.setCipherKey(Base64.decode("BT7lf0hw4W/QMxpS/Rb+Ng==")); + return manager; + } + + /** + * 开启shiro注解功能 + */ + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() { + AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); + advisor.setSecurityManager(securityManager()); + return advisor; + } + + @Bean(name = "lifecycleBeanPostProcessor") + public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { + return new LifecycleBeanPostProcessor(); + } + +} diff --git a/src/main/java/com/bomaos/common/core/shiro/ShiroExt.java b/src/main/java/com/bomaos/common/core/shiro/ShiroExt.java new file mode 100644 index 0000000..138320b --- /dev/null +++ b/src/main/java/com/bomaos/common/core/shiro/ShiroExt.java @@ -0,0 +1,190 @@ +package com.bomaos.common.core.shiro; + +import com.bomaos.common.system.entity.User; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; + +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; + +/** + * shiro常用方法 + * Created by Panyoujie on 2017-04-28 09:45 + */ +public class ShiroExt { + + /** + * 是否是游客访问(用户没有登录) + */ + public boolean isGuest() { + return getSubject() == null || getSubject().getPrincipal() == null; + } + + /** + * 是否已经认证(包含登录和记住密码) + */ + public boolean isUser() { + return getSubject() != null && getSubject().getPrincipal() != null; + } + + /** + * 是否是登录通过认证的 + */ + public boolean isAuthenticated() { + return getSubject() != null && getSubject().isAuthenticated(); + } + + /** + * 是否是没有进行登录通过认证(记住密码) + */ + public boolean isNotAuthenticated() { + return !isAuthenticated(); + } + + /** + * 获取当前用户信息 + */ + public String principal() { + return principal(null); + } + + /** + * 获取当前用户信息 + * + * @param property 用户属性名 + */ + public String principal(String property) { + return principal(property, User.class.getName()); + } + + /** + * 获取当前用户信息 + * + * @param property 用户属性名 + * @param className 用户class名 + */ + public String principal(String property, String className) { + String strValue = null; + if (getSubject() != null) { + Object principal; + if (className == null) { + principal = getSubject().getPrincipal(); + } else { + principal = getPrincipalFromClassName(className); + } + if (principal != null) { + if (property == null) { + strValue = principal.toString(); + } else { + strValue = getPrincipalProperty(principal, property); + } + } + } + return strValue; + } + + /** + * 是否具有某个角色 + * + * @param role 角色标识 + */ + public boolean hasRole(String role) { + return getSubject() != null && getSubject().hasRole(role); + } + + /** + * 是否没有有某个角色 + * + * @param role 角色标识 + */ + public boolean lacksRole(String role) { + return !hasRole(role); + } + + /** + * 是否具有任意一个角色 + * + * @param roles 角色标识 + */ + public boolean hasAnyRole(String roles) { + boolean hasAnyRole = false; + Subject subject = getSubject(); + if (subject != null) { + for (String role : roles.split(",")) { + if (subject.hasRole(role.trim())) { + hasAnyRole = true; + break; + } + } + } + return hasAnyRole; + } + + /** + * 是否具有某个权限 + * + * @param p 权限标识 + */ + public boolean hasPermission(String p) { + return getSubject() != null && getSubject().isPermitted(p); + } + + /** + * 是否没有某个权限 + * + * @param p 权限标识 + */ + public boolean lacksPermission(String p) { + return !hasPermission(p); + } + + /** + * 根据class获取当前用户 + */ + private Object getPrincipalFromClassName(String className) { + Object principal = null; + try { + Class clazz = Class.forName(className); + principal = getSubject().getPrincipals().oneByType(clazz); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return principal; + } + + /** + * 获取当前用户的某个属性 + */ + private String getPrincipalProperty(Object principal, String property) { + String strValue = null; + try { + BeanInfo bi = Introspector.getBeanInfo(principal.getClass()); + boolean foundProperty = false; + for (PropertyDescriptor pd : bi.getPropertyDescriptors()) { + if (pd.getName().equals(property)) { + Object value = pd.getReadMethod().invoke(principal, (Object[]) null); + if (value != null) strValue = value.toString(); + foundProperty = true; + break; + } + } + if (!foundProperty) { + String message = "Property [" + property + "] not found in principal of type [" + principal.getClass().getName() + "]"; + throw new RuntimeException(message); + } + } catch (Exception e) { + String message = "Error reading property [" + property + "] from principal of type [" + principal.getClass().getName() + "]"; + throw new RuntimeException(message, e); + } + return strValue; + } + + /** + * 获取当前登录的用户 + */ + protected Subject getSubject() { + return SecurityUtils.getSubject(); + } + +} diff --git a/src/main/java/com/bomaos/common/core/shiro/ShiroLoginFilter.java b/src/main/java/com/bomaos/common/core/shiro/ShiroLoginFilter.java new file mode 100644 index 0000000..9345e7d --- /dev/null +++ b/src/main/java/com/bomaos/common/core/shiro/ShiroLoginFilter.java @@ -0,0 +1,45 @@ +package com.bomaos.common.core.shiro; + +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.AccessControlFilter; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import java.io.PrintWriter; + +/** + * 自定义shiro过滤器 + * Created by Panyoujie on 2017-04-28 09:45 + */ +public class ShiroLoginFilter extends AccessControlFilter { + + @Override + protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) { + return false; + } + + @Override + protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { + Subject subject = getSubject(servletRequest, servletResponse); + if (!subject.isAuthenticated() && !subject.isRemembered()) { + if (isAjax((HttpServletRequest) servletRequest)) { + servletResponse.setContentType("application/json;charset=UTF-8"); + PrintWriter out = servletResponse.getWriter(); + out.write("{\"msg\": \"登录过期,请重新登录\", \"code\": 401}"); + out.flush(); + return false; + } + } + return true; + } + + /** + * 判断是不是ajax请求 + */ + private boolean isAjax(HttpServletRequest request) { + String xHeader = request.getHeader("X-Requested-With"); + return (xHeader != null && xHeader.contains("XMLHttpRequest")); + } + +} diff --git a/src/main/java/com/bomaos/common/core/shiro/UserRealm.java b/src/main/java/com/bomaos/common/core/shiro/UserRealm.java new file mode 100644 index 0000000..73879fc --- /dev/null +++ b/src/main/java/com/bomaos/common/core/shiro/UserRealm.java @@ -0,0 +1,63 @@ +package com.bomaos.common.core.shiro; + +import com.bomaos.common.system.entity.Role; +import com.bomaos.common.system.entity.User; +import com.bomaos.common.system.service.UserService; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; + +import java.util.HashSet; +import java.util.Set; + +/** + * Shiro认证和授权 + * Created by Panyoujie on 2017-04-28 09:45 + */ +public class UserRealm extends AuthorizingRealm { + + @Lazy + @Autowired + private UserService userService; + + /** + * 认证 + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { + String username = (String) authenticationToken.getPrincipal(); + User user = userService.getByUsername(username); + if (user == null) throw new UnknownAccountException(); // 账号不存在 + if (user.getState() != 0) throw new LockedAccountException(); // 账号被锁定 + return new SimpleAuthenticationInfo(user, user.getPassword(), getName()); + } + + /** + * 授权 + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + User user = (User) SecurityUtils.getSubject().getPrincipal(); + SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); + userService.selectRoleAndAuth(user); + // 角色 + Set roles = new HashSet<>(); + for (Role r : user.getRoles()) { + if (r.getDeleted() == 0) roles.add(r.getRoleCode()); + } + authorizationInfo.setRoles(roles); + // 权限 + Set permissions = new HashSet<>(); + for (String auth : user.getAuthorities()) { + if (auth != null && !auth.trim().isEmpty()) permissions.add(auth); + } + authorizationInfo.setStringPermissions(permissions); + return authorizationInfo; + } + +} diff --git a/src/main/java/com/bomaos/common/core/utils/CoreUtil.java b/src/main/java/com/bomaos/common/core/utils/CoreUtil.java new file mode 100644 index 0000000..ec664ba --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/CoreUtil.java @@ -0,0 +1,320 @@ +package com.bomaos.common.core.utils; + +import cn.hutool.core.util.StrUtil; + +import java.lang.reflect.Field; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 常用工具方法 + * Created by Panyoujie on 2017-6-10 10:10 + */ +public class CoreUtil { + private static final String[] chars = new String[]{"a", "b", "c", "d", "e", "f", + "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", + "W", "X", "Y", "Z"}; + + /** + * toString,为null返回空白字符 + */ + public static String toString(Object obj) { + return obj == null ? "" : obj.toString(); + } + + /** + * 连接多个字符串,null自动过滤 + */ + public static String connect(Object... objects) { + StringBuilder sb = new StringBuilder(); + for (Object obj : objects) sb.append(toString(obj)); + return sb.toString(); + } + + /** + * 首字母大写 + */ + public static String upperHead(String str) { + if (str == null || str.length() == 0) return str; + if (str.length() == 1) return str.toUpperCase(); + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + + /** + * 生成8位uuid + */ + public static String randomUUID8() { + StringBuffer buffer = new StringBuffer(); + String uuid = UUID.randomUUID().toString().replace("-", ""); + for (int i = 0; i < 8; i++) { + String str = uuid.substring(i * 4, i * 4 + 4); + int x = Integer.parseInt(str, 16); + buffer.append(chars[x % 0x3E]); + } + return buffer.toString(); + } + + /** + * 生成16位uuid + */ + public static String randomUUID16() { + StringBuffer buffer = new StringBuffer(); + String uuid = UUID.randomUUID().toString().replace("-", ""); + for (int i = 0; i < 16; i++) { + String str = uuid.substring(i * 2, i * 2 + 2); + int x = Integer.parseInt(str, 16); + buffer.append(chars[x % 0x3E]); + } + return buffer.toString(); + } + + /** + * 把对象转成Map + */ + public static Map objectToMap(T t) { + return objectToMap(t, null); + } + + /** + * 把对象集合转成Map集合 + */ + public static List> objectToMap(List ts) { + return objectToMap(ts, null); + } + + /** + * 把对象转成Map,只包含指定字段 + * + * @param t 对象 + * @param fields 包含的字段 + * @return Map + */ + public static Map objectToMap(T t, String[] fields) { + if (t == null) return null; + List fieldList = null; + if (fields != null) fieldList = Arrays.asList(fields); + Map map = new HashMap<>(); + Field[] fieldArray = t.getClass().getDeclaredFields(); + for (Field field : fieldArray) { + field.setAccessible(true); + if (fieldList == null || fieldList.contains(field.getName())) { + try { + map.put(field.getName(), field.get(t)); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + return map; + } + + /** + * 把对个对象集合转成Map集合,只包含指定字段 + * + * @param ts 对象集合 + * @param fields 包含的字段 + * @return List + */ + public static List> objectToMap(List ts, String[] fields) { + List> rs = new ArrayList<>(); + for (T t : ts) { + Map map = objectToMap(t, fields); + if (map != null) rs.add(map); + } + return rs; + } + + /** + * 复制父类的属性的值到子类 + * + * @param f 父类对象 + * @param c 子类对象 + */ + public static void copyAttribute(F f, C c) { + for (Field field : f.getClass().getDeclaredFields()) { + try { + field.setAccessible(true); + Field cf = c.getClass().getField(field.getName()); + cf.setAccessible(true); + cf.set(c, field.get(f)); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 把父类克隆为子类 + * + * @param father 父类对象 + * @param clazz 子类类型 + */ + public static C cloneToChild(F father, Class clazz) { + try { + C child = clazz.newInstance(); + copyAttribute(father, child); + return child; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 判断excel某列是否有空值 + */ + public static String excelCheckBlank(List> list, int startRow, int... cols) { + StringBuilder sb = new StringBuilder(); + for (int col : cols) { + for (int i = 0; i < list.size(); i++) { + Object value = list.get(i).get(col); + if (value == null || StrUtil.isBlank(value.toString())) { + if (sb.length() != 0) sb.append("\r\n"); + sb.append("第").append(i + startRow + 1).append("行第"); + sb.append(col + 1).append("列不能为空."); + } + } + } + return sb.toString(); + } + + /** + * 判断excel某列是否有重复值 + */ + public static String excelCheckRepeat(List> list, int startRow, int... cols) { + StringBuilder sb = new StringBuilder(); + for (int col : cols) { + for (int i = 0; i < list.size(); i++) { + Object value = list.get(i).get(col); + for (int j = 0; j < list.size(); j++) { + if (i != j && value != null && value.equals(list.get(j).get(col))) { + if (sb.length() != 0) sb.append("\r\n"); + sb.append("第").append(i + startRow + 1).append("行第").append(col + 1).append("列与第"); + sb.append(j + startRow + 1).append("行第").append(col + 1).append("列重复."); + } + } + } + } + return sb.toString(); + } + + /** + * 检查list集合中元素字段是否有重复 + * + * @param list 集合 + * @param field 字段名称 + * @return 返回重复的元素 + */ + public static T listCheckRepeat(List list, String field) { + for (int i = 0; i < list.size(); i++) { + for (int j = 0; j < list.size(); j++) { + if (i != j) { + Object value = getFieldValue(list.get(i), field); + if (value != null && value.equals(getFieldValue(list.get(j), field))) { + return list.get(j); + } + } + } + } + return null; + } + + /** + * 检查list集合中元素字段是否有重复 + * + * @param list 集合 + * @param field 字段名称 + * @param field 字段中文名称,用于错误提示 + * @return 返回错误提示信息 + */ + public static String listCheckRepeat(List list, String field, String zhName) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < list.size(); i++) { + for (int j = 0; j < list.size(); j++) { + if (i != j) { + Object value = getFieldValue(list.get(i), field); + if (value != null && value.equals(getFieldValue(list.get(j), field))) { + if (sb.length() != 0) sb.append("\r\n"); + sb.append("第").append(i + 1).append("条与第").append(j + 1).append("条数据的").append(zhName).append("重复."); + } + } + } + } + return sb.toString(); + } + + /** + * 检查list集合中元素字段是否有空值 + * + * @param list 集合 + * @param field 字段名称 + * @return 返回为空的元素 + */ + public static T listCheckBlank(List list, String field) { + for (int i = 0; i < list.size(); i++) { + Object value = getFieldValue(list.get(i), field); + if (value == null || StrUtil.isBlank(value.toString())) { + return list.get(i); + } + } + return null; + } + + /** + * 检查list集合中元素字段是否有空值 + * + * @param list 集合 + * @param field 字段名称 + * @param field 字段中文名称,用于错误提示 + * @return 返回错误提示信息 + */ + public static String listCheckBlank(List list, String field, String zhName) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < list.size(); i++) { + Object value = getFieldValue(list.get(i), field); + if (value == null || StrUtil.isBlank(value.toString())) { + if (sb.length() != 0) sb.append("\r\n"); + sb.append("第").append(i + 1).append("条数据的").append(zhName).append("不能为空."); + } + } + return sb.toString(); + } + + /** + * 获取某个对象的某个字段的值 + */ + public static Object getFieldValue(Object t, String field) { + if (t == null || field == null) return null; + try { + Field clazzField = t.getClass().getDeclaredField(field); + clazzField.setAccessible(true); + return clazzField.get(t); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 去除回车和空格 + * + * @param str + * @return + */ + public static String getStringNoBlank(String str) { + if (str != null && !"".equals(str)) { + str.replaceAll("\n", ""); + Pattern p = Pattern.compile("(^\\s*)|(\\s*$)"); + Matcher m = p.matcher(str); + String strNoBlank = m.replaceAll(""); + return strNoBlank; + } else { + return ""; + } + } + +} diff --git a/src/main/java/com/bomaos/common/core/utils/DateUtil.java b/src/main/java/com/bomaos/common/core/utils/DateUtil.java new file mode 100644 index 0000000..839b94f --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/DateUtil.java @@ -0,0 +1,153 @@ +package com.bomaos.common.core.utils; + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class DateUtil { + + public static String subData() { + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式 + String date = df.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳 + return date; + } + + public static String getDate() { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");//设置日期格式 + String date = df.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳 + return date; + } + + public static String getSubDate(Date date) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式 + String dateToString = df.format(date);// new Date()为获取当前系统时间,也可使用当前时间戳 + return dateToString; + } + + /** + * 设置到秒 + * + * @param date + * @return + */ + public static String getSubDateMiao(Date date) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");//设置日期格式 + String dateToString = df.format(date);// new Date()为获取当前系统时间,也可使用当前时间戳 + return dateToString; + } + + // 获取当天的开始时间 + public static Date getDayBegin() { + Calendar cal = new GregorianCalendar(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + // 获取当天的结束时间 + public static Date getDayEnd() { + Calendar cal = new GregorianCalendar(); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + return cal.getTime(); + } + + // 获取大大大大前天的开始时间 + public static Long getStartDayTime(Integer day) { + Calendar cal = new GregorianCalendar(); + cal.setTime(getDayBegin()); + cal.add(Calendar.DAY_OF_MONTH, day); + return cal.getTime().getTime(); + } + + // 获取大大大大前天的结束时间 + public static Long getEndDayTime(Integer day) { + Calendar cal = new GregorianCalendar(); + cal.setTime(getDayEnd()); + cal.add(Calendar.DAY_OF_MONTH, day); + return cal.getTime().getTime(); + } + + // 获取本周的开始时间 + @SuppressWarnings("unused") + public static Long getBeginDayOfWeek() { + Date date = new Date(); + if (date == null) { + return null; + } + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int dayofweek = cal.get(Calendar.DAY_OF_WEEK); + if (dayofweek == 1) { + dayofweek += 7; + } + cal.add(Calendar.DATE, 2 - dayofweek); + return getDayStartTime(cal.getTime()).getTime(); + } + + // 获取本周的结束时间 + public static Long getEndDayOfWeek() { + Calendar cal = Calendar.getInstance(); + cal.setTime(getBeginDayOfWeek1()); + cal.add(Calendar.DAY_OF_WEEK, 6); + Date weekEndSta = cal.getTime(); + return getDayEndTime(weekEndSta).getTime(); + } + + // 获取本周的开始时间 + @SuppressWarnings("unused") + public static Date getBeginDayOfWeek1() { + Date date = new Date(); + if (date == null) { + return null; + } + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int dayofweek = cal.get(Calendar.DAY_OF_WEEK); + if (dayofweek == 1) { + dayofweek += 7; + } + cal.add(Calendar.DATE, 2 - dayofweek); + return getDayStartTime(cal.getTime()); + } + + // 获取某个日期的开始时间 + public static Timestamp getDayStartTime(Date d) { + Calendar calendar = Calendar.getInstance(); + if (null != d) + calendar.setTime(d); + calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), + calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0); + calendar.set(Calendar.MILLISECOND, 0); + return new Timestamp(calendar.getTimeInMillis()); + } + + // 获取某个日期的结束时间 + public static Timestamp getDayEndTime(Date d) { + Calendar calendar = Calendar.getInstance(); + if (null != d) + calendar.setTime(d); + calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), + calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59); + calendar.set(Calendar.MILLISECOND, 999); + return new Timestamp(calendar.getTimeInMillis()); + } + + /* + * 将时间戳转换为时间 + */ + public static String stampToDate(String stap) { + String time; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long lt = new Long(stap); + Date date = new Date(lt); + time = simpleDateFormat.format(date); + return time; + } + +} diff --git a/src/main/java/com/bomaos/common/core/utils/DeviceUtils.java b/src/main/java/com/bomaos/common/core/utils/DeviceUtils.java new file mode 100644 index 0000000..a7569b4 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/DeviceUtils.java @@ -0,0 +1,22 @@ +package com.bomaos.common.core.utils; + +import javax.servlet.http.HttpServletRequest; + +public class DeviceUtils { + + public static boolean isMobileDevice(HttpServletRequest request) { + String userAgent = request.getHeader("User-Agent"); + + // 判断是否为移动设备的关键字 + String[] mobileKeywords = {"Mobile", "Android", "iPhone", "iPad", "Windows Phone"}; + + // 遍历关键字,判断User-Agent中是否包含 + for (String keyword : mobileKeywords) { + if (userAgent.contains(keyword)) { + return true; + } + } + + return false; + } +} diff --git a/src/main/java/com/bomaos/common/core/utils/FileUploadUtil.java b/src/main/java/com/bomaos/common/core/utils/FileUploadUtil.java new file mode 100644 index 0000000..affbe82 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/FileUploadUtil.java @@ -0,0 +1,325 @@ +package com.bomaos.common.core.utils; + +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.bomaos.common.core.Constants; +import com.bomaos.common.core.web.JsonResult; +import org.apache.tika.Tika; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 文件上传下载工具类 + * Created by Panyoujie on 2018-12-14 08:38 + */ +public class FileUploadUtil { + // 文件上传的目录 + public static final String UPLOAD_FILE_DIR = Constants.UPLOAD_DIR + "file/"; + // 缩略图存放的目录 + private static final String UPLOAD_SM_DIR = Constants.UPLOAD_DIR + "thumbnail/"; + + /** + * 上传文件 + * + * @param file MultipartFile + * @return 示例:{"code": 0, "msg": "", "url": "", "fileName": ""} + */ + public static JsonResult upload(MultipartFile file, HttpServletRequest request) { + String path; // 文件保存路径 + // 文件原始名称 + String orgName = file.getOriginalFilename(), dir = getDateDir(); + + if (orgName == null) return JsonResult.error("上传失败"); + File outFile; + String suffix = orgName.substring(orgName.lastIndexOf(".") + 1); // 获取文件后缀 + + if (Constants.UPLOAD_MD5_NAME) { // 使用md5命名方式解决图片重复上传问题 + try { + String md5 = SecureUtil.md5(file.getInputStream()); + path = dir + md5 + "." + suffix; + outFile = new File(UPLOAD_FILE_DIR, path); + } catch (Exception e) { + e.printStackTrace(); + return JsonResult.error("上传失败").put("error", e.getMessage()); + } + } else if (Constants.UPLOAD_UUID_NAME) { // uuid命名 + path = dir + UUID.randomUUID().toString().replaceAll("-", "") + "." + suffix; + outFile = new File(UPLOAD_FILE_DIR, path); + } else { // 使用原名称,存在相同着加(1) + path = dir + orgName; + outFile = new File(UPLOAD_FILE_DIR, path); + int sameSize = 1; + String prefix = orgName.substring(0, orgName.lastIndexOf(".")); // 获取文件名称 + while (outFile.exists()) { + path = dir + prefix + "(" + sameSize + ")." + suffix; + outFile = new File(UPLOAD_FILE_DIR, path); + sameSize++; + } + } + try { + if (!outFile.getParentFile().exists()) { + if (!outFile.getParentFile().mkdirs()) return JsonResult.error("上传失败"); + } + file.transferTo(outFile); + JsonResult jsonResult = JsonResult.ok("上传成功").put("url", path).put("fileName", orgName) + .put("dir", "/" + StrUtil.removeSuffix(dir, "/")); + if (request != null) { + jsonResult.put("location", "/file/" + path); + } + return jsonResult; + } catch (Exception e) { + e.printStackTrace(); + return JsonResult.error("上传失败").put("error", e.getMessage()); + } + } + + /** + * 上传文件base64格式 + * + * @param base64 base64编码字符 + * @return 示例:{"code": 0, "msg": "", "url": ""} + */ + public static JsonResult upload(String base64, HttpServletRequest request) { + if (base64 == null || base64.trim().isEmpty()) return JsonResult.error("上传失败"); + String suffix = base64.substring(11, base64.indexOf(";")); // 获取文件格式 + String dir = getDateDir(); + String path = dir + UUID.randomUUID().toString().replaceAll("-", "") + "." + suffix; + File outFile = new File(UPLOAD_FILE_DIR, path); + if (!outFile.getParentFile().exists()) { + if (!outFile.getParentFile().mkdirs()) return JsonResult.error("上传失败"); + } + try { + byte[] bytes = Base64.getDecoder().decode(base64.substring(base64.indexOf(";") + 8).getBytes()); + IoUtil.write(new FileOutputStream(outFile), true, bytes); + } catch (Exception e) { + e.printStackTrace(); + return JsonResult.error("上传失败").put("error", e.getMessage()); + } + JsonResult jsonResult = JsonResult.ok("上传成功").put("url", path) + .put("dir", "/" + StrUtil.removeSuffix(dir, "/")); + if (request != null) { + jsonResult.put("location", StrUtil.removeSuffix( + StrUtil.removeSuffix(request.getRequestURL(), "upload/base64") + , "upload") + path); + } + return jsonResult; + } + + /** + * 按照日期分存放目录 + */ + public static String getDateDir() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd/"); + return sdf.format(new Date()); + } + + /** + * 预览文件 + */ + public static void preview(File file, HttpServletResponse response) { + if (file == null || !file.exists()) { + outNotFund(response); + return; + } + // 支持word、excel预览 + if (OpenOfficeUtil.canConverter(file.getName())) { + File pdfFile = OpenOfficeUtil.converterToPDF(file.getAbsolutePath()); + if (pdfFile != null) file = pdfFile; + } + String contentType = getFileType(file); // 获取文件类型 + if (contentType != null) { + response.setContentType(contentType); + } else { + setDownloadHeader(response, file.getName()); + } + try { + output(file, response.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 预览源文件 + */ + public static void preview(String path, HttpServletResponse response) { + preview(new File(UPLOAD_FILE_DIR, path), response); + } + + /** + * 下载源文件 + */ + public static void download(String path, HttpServletResponse response) { + File file = new File(UPLOAD_FILE_DIR, path); + if (!file.exists()) { + outNotFund(response); + return; + } + setDownloadHeader(response, file.getName()); + try { + output(file, response.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 预览缩略图 + */ + public static void thumbnail(String path, HttpServletResponse response) { + // 如果是图片并且缩略图不存在则生成 + File file = new File(UPLOAD_FILE_DIR, path); + File smFile = new File(UPLOAD_SM_DIR, path); + if (!smFile.exists() && isImgFile(file)) { + // 大于100kb生成100kb的缩略图 + long fileSize = file.length(); + if ((fileSize / 1024) > 100) { + try { + if (smFile.getParentFile().mkdirs()) { + ImgUtil.scale(file, smFile, 100f / (fileSize / 1024f)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + preview(file, response); + return; + } + } + preview(smFile, response); + } + + /** + * 输出文件流 + */ + public static void output(File file, OutputStream os) { + BufferedInputStream is = null; + try { + is = new BufferedInputStream(new FileInputStream(file)); + byte[] bytes = new byte[1024 * 256]; + int len; + while ((len = is.read(bytes)) != -1) { + os.write(bytes, 0, len); + } + os.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * 删除文件 + */ + public static boolean delete(String path) { + File file = new File(UPLOAD_FILE_DIR, path); + if (file.delete()) new File(UPLOAD_SM_DIR, path).delete(); + return true; + } + + /** + * 获取文件列表 + */ + public static List> list(String dir) { + dir = dir == null ? "" : dir; + List> list = new ArrayList<>(); + File file = new File(UPLOAD_FILE_DIR + dir); + File[] files = file.listFiles(); + if (files == null) return list; + for (File f : files) { + Map map = new HashMap<>(); + map.put("name", f.getName()); + map.put("size", f.length()); + map.put("isDir", f.isDirectory()); + if (!f.isDirectory()) { + map.put("url", dir + "/" + f.getName()); + map.put("smUrl", "thumbnail" + dir + "/" + f.getName()); + } + map.put("updateTime", f.lastModified()); + list.add(map); + } + return list; + } + + /** + * 获取文件类型 + */ + public static String getFileType(File file) { + String contentType = null; + try { + contentType = new Tika().detect(file); + } catch (IOException e) { + e.printStackTrace(); + } + return contentType; + } + + /** + * 判断是否是图片类型 + */ + public static boolean isImgFile(File file) { + String contentType = getFileType(file); + return contentType != null && contentType.startsWith("image/"); + } + + /** + * 设置下载文件的header + */ + public static void setDownloadHeader(HttpServletResponse response, String fileName) { + response.setContentType("application/force-download"); + try { + fileName = URLEncoder.encode(fileName, "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + response.setHeader("Content-Disposition", "attachment;fileName=" + fileName); + } + + /** + * 输出文件不存在 + */ + public static void outNotFund(HttpServletResponse response) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + outMessage("404 Not Found", response); + } + + /** + * 输出错误信息 + */ + public static void outMessage(String message, HttpServletResponse response) { + response.setContentType("text/html;charset=UTF-8"); + try { + PrintWriter writer = response.getWriter(); + writer.write(""); + writer.write("" + message + ""); + writer.write("

" + message + "

"); + writer.write("

Zlianpay File Server

"); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/bomaos/common/core/utils/FormCheckUtil.java b/src/main/java/com/bomaos/common/core/utils/FormCheckUtil.java new file mode 100644 index 0000000..f28d428 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/FormCheckUtil.java @@ -0,0 +1,199 @@ +package com.bomaos.common.core.utils; + +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.Objects; + +/** + * 格式校验工具类 + * Created by Panyoujie on 2018-12-14 8:38 + */ +public class FormCheckUtil { + + /** + * 密码是否符合格式(5-12位非空白字符) + */ + public static boolean isPassword(String password) { + return test(password, "^[\\S]{5,12}$"); + } + + /** + * 两个对象是否相等 + */ + public static boolean equals(Object obj1, Object obj2) { + return Objects.equals(obj1, obj2); + } + + /** + * 是否是手机号 + */ + public static boolean isPhone(String phone) { + return test(phone, "^1\\d{10}$"); + } + + /** + * 是否是邮箱 + */ + public static boolean isEmail(String email) { + return test(email, "^([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$"); + } + + /** + * 是否是网址 + */ + public static boolean isUrl(String url) { + return test(url, "(^#)|(^http(s*):\\/\\/[^\\s]+\\.[^\\s]+)"); + } + + /** + * 是否是数字 + */ + public static boolean isNumber(String number) { + return test(number, "^1\\d{10}$"); + } + + /** + * 是否是日期 + */ + public static boolean isDate(String date) { + return test(date, "^(\\d{4})[-\\/](\\d{1}|0\\d{1}|1[0-2])([-\\/](\\d{1}|0\\d{1}|[1-2][0-9]|3[0-1]))*$"); + } + + /** + * 是否是身份证 + */ + public static boolean isIdentity(String identity) { + return test(identity, "(^\\d{15}$)|(^\\d{17}(x|X|\\d)$)"); + } + + /** + * 是否是整数 + */ + public static boolean isDigits(String str) { + return test(str, "^-?\\d+$"); + } + + /** + * 是否是正整数 + */ + public static boolean isDigitsP(String str) { + return test(str, "^[1-9]\\d*$"); + } + + /** + * 是否是负整数 + */ + public static boolean isDigitsN(String str) { + return test(str, "^-[1-9]\\d*$"); + } + + /** + * 是否是非负整数(正整数或0) + */ + public static boolean isDigitsPZ(String str) { + return test(str, "^\\d+$"); + } + + /** + * 是否是非正整数(负整数或0) + */ + public static boolean isDigitsNZ(String str) { + return test(str, "^-[1-9]\\d*|0"); + } + + /** + * 验证最大长度、最小长度 + */ + public static boolean maxMinLength(String str, Integer maxLength, Integer minLength) { + if (maxLength != null && (str == null || str.length() > maxLength)) { + return false; + } + return !(minLength != null && (str == null || str.length() < minLength)); + } + + /** + * 验证最大值、最小值 + */ + public static boolean maxMin(Integer value, Integer max, Integer min) { + if (max != null && value != null && value > max) { + return false; + } + return !(min != null && value != null && value < min); + } + + /** + * 字符串是否匹配正则表达式 + */ + public static boolean test(String str, String reg) { + return str != null && str.matches(reg); + } + + /** + * 是否是身份证(强校验) + */ + public static String isIdentityStrong(String identity) { + if (!isIdentity(identity)) { + return "身份证号码格式错误"; + } + String ai; + if (identity.length() == 18) { + ai = identity.substring(0, 17); + } else { + ai = identity.substring(0, 6) + "19" + identity.substring(6, 15); + } + // 验证出生年月 + String year = ai.substring(6, 10); // 年 + String birthday = year + "-" + ai.substring(10, 12) + "-" + ai.substring(12, 14); + if (!isDate(birthday)) { + return "身份证号码出生日期无效"; + } + try { + long time = new SimpleDateFormat("yyyy-MM-dd").parse(birthday).getTime(); + GregorianCalendar gc = new GregorianCalendar(); + if ((gc.get(Calendar.YEAR) - Integer.parseInt(year)) > 150 || (gc.getTime().getTime() - time) < 0) { + return "身份证号码出生日期不在有效范围"; + } + } catch (Exception e) { + e.printStackTrace(); + return "身份证号码校验失败"; + } + // 验证地区码 + String[] areaCodes = new String[]{"11", "12", "13", "14", "15", "21", "22", "23", + "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", "44", "45", "46", + "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", "81", "82", "91"}; + if (!Arrays.asList(areaCodes).contains(ai.substring(0, 2))) { + return "身份证号码地区编码错误"; + } + // 验证最后一位 + if (identity.length() == 18) { + String[] valCode = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; + String[] wi = {"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"}; + int totalMulAiWi = 0; + for (int i = 0; i < 17; i++) { + totalMulAiWi += Integer.parseInt(String.valueOf(ai.charAt(i))) * Integer.parseInt(wi[i]); + } + ai += valCode[totalMulAiWi % 11]; + if (!ai.equals(identity)) { + return "身份证号码最后一位错误"; + } + } + return null; + } + + /** + * 值是否在给定值内 + */ + public static boolean isIn(Object value, Object... values) { + if (value != null) { + for (Object obj : values) { + if (value.equals(obj)) { + return true; + } + } + } + return false; + } + +} diff --git a/src/main/java/com/bomaos/common/core/utils/JSONUtil.java b/src/main/java/com/bomaos/common/core/utils/JSONUtil.java new file mode 100644 index 0000000..d0462a3 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/JSONUtil.java @@ -0,0 +1,376 @@ +package com.bomaos.common.core.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * JSON解析工具类 + * Created by Panyoujie on 2017-06-10 10:10 + */ +public class JSONUtil { + + /** + * 获取code + */ + public static int getCode(String json) { + return getIntValue(json, "code"); + } + + /** + * 获取message + */ + public static String getMessage(String json) { + return getString(json, "msg"); + } + + /** + * 得到String类型值 + */ + public static String getString(String json, String key) { + String result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getString(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到int类型的值 + */ + public static int getIntValue(String json, String key) { + int result = 0; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getIntValue(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到boolean类型的值 + */ + public static boolean getBooleanValue(String json, String key) { + boolean result = false; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getBooleanValue(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到long类型的值 + */ + public static long getLongValue(String json, String key) { + long result = 0; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getLongValue(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到double类型的值 + */ + public static double getDoubleValue(String json, String key) { + double result = 0; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getDoubleValue(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到float类型的值 + */ + public static float getFloatValue(String json, String key) { + float result = 0; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getFloatValue(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到byte类型的值 + */ + public static byte getByteValue(String json, String key) { + byte result = 0; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getByteValue(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到short类型的值 + */ + public static short getShortValue(String json, String key) { + short result = 0; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getShortValue(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到Integer类型的值 + */ + public static Integer getInteger(String json, String key) { + Integer result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getInteger(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到Boolean类型的值 + */ + public static Boolean getBoolean(String json, String key) { + Boolean result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getBoolean(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到Long类型的值 + */ + public static Long getLong(String json, String key) { + Long result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getLong(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到Double类型的值 + */ + public static Double getDouble(String json, String key) { + Double result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getDouble(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到Float类型的值 + */ + public static Float getFloat(String json, String key) { + Float result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getFloat(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到Byte类型的值 + */ + public static Byte getByte(String json, String key) { + Byte result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getByte(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到Short类型的值 + */ + public static Short getShort(String json, String key) { + Short result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getShort(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到byte[]类型的值 + */ + public static byte[] getBytes(String json, String key) { + byte[] result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getBytes(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到BigInteger类型的值 + */ + public static BigInteger getBigInteger(String json, String key) { + BigInteger result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getBigInteger(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到BigDecimal类型的值 + */ + public static BigDecimal getBigDecimal(String json, String key) { + BigDecimal result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getBigDecimal(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到Date类型的值 + * + * @param json + * @param key + * @return + */ + public static Date getDate(String json, String key) { + Date result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getDate(key); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到对象类型的值 + */ + public static T getObject(String json, String key, Class clazz) { + T result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + result = jsonObject.getObject(key, clazz); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 得到对象类型的集合 + * + * @param json + * @param key + * @param clazz + * @return + */ + public static List getArray(String json, String key, Class clazz) { + List result = null; + try { + JSONObject jsonObject = JSON.parseObject(json); + String string = jsonObject.getString(key); + result = JSON.parseArray(string, clazz); + } catch (Exception e) { + e.printStackTrace(); + } + if (result == null) { + result = new ArrayList<>(); + } + return result; + } + + /** + * json转换换成对象 + * + * @param json + * @param clazz + * @return + */ + public static T parseObject(String json, Class clazz) { + T result = null; + try { + result = JSON.parseObject(json, clazz); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * json转换换成集合 + * + * @param json + * @param clazz + * @return + */ + public static List parseArray(String json, Class clazz) { + List result = null; + try { + result = JSON.parseArray(json, clazz); + } catch (Exception e) { + e.printStackTrace(); + } + if (result == null) { + result = new ArrayList<>(); + } + return result; + } + +} diff --git a/src/main/java/com/bomaos/common/core/utils/OpenOfficeUtil.java b/src/main/java/com/bomaos/common/core/utils/OpenOfficeUtil.java new file mode 100644 index 0000000..713e6b4 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/OpenOfficeUtil.java @@ -0,0 +1,120 @@ +package com.bomaos.common.core.utils; + +import com.bomaos.common.core.Constants; +import org.artofsolving.jodconverter.OfficeDocumentConverter; +import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; +import org.artofsolving.jodconverter.office.OfficeManager; + +import java.io.File; +import java.util.Arrays; +import java.util.Base64; +import java.util.regex.Pattern; + +/** + * OpenOfficeUtil + * Created by Panyoujie on 2018-12-14 08:38 + */ +public class OpenOfficeUtil { + // pdf转换后的目录 + private static final String PDF_TEMP_DIR = Constants.UPLOAD_DIR + "pdf/"; + // 支持转换pdf的文件后缀列表 + private static final String[] CAN_CONVERTER_FILES = new String[]{"doc", "docx", "xls", "xlsx", "ppt", "pptx"}; + + /** + * 文件转pdf + * + * @param filePath 源文件路径 + * @return File + */ + public static File converterToPDF(String filePath) { + return converterToPDF(filePath, true); + } + + /** + * 文件转pdf + * + * @param filePath 源文件路径 + * @param cache 是否使用上次转换过的文件 + * @return File + */ + public static File converterToPDF(String filePath, boolean cache) { + if (filePath == null || filePath.trim().isEmpty()) { + return null; + } + File srcFile = new File(filePath); + if (!srcFile.exists()) { + return null; + } + // 是否转换过 + File outFile = new File(PDF_TEMP_DIR, Base64.getEncoder().encodeToString(filePath.getBytes()) + ".pdf"); + if (cache && outFile.exists()) { + return outFile; + } + // 转换 + OfficeManager officeManager = null; + try { + officeManager = getOfficeManager(); + OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager); + return converterFile(srcFile, outFile, converter); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (officeManager != null) { + officeManager.stop(); + } + } + return null; + } + + /** + * 转换文件 + */ + public static File converterFile(File inFile, File outFile, OfficeDocumentConverter converter) { + if (!outFile.getParentFile().exists()) { + if (!outFile.getParentFile().mkdirs()) return outFile; + } + converter.convert(inFile, outFile); + return outFile; + } + + /** + * 判断文件后缀是否可以转换pdf + */ + public static boolean canConverter(String path) { + try { + String suffix = path.substring(path.lastIndexOf(".") + 1); + return Arrays.asList(CAN_CONVERTER_FILES).contains(suffix); + } catch (Exception e) { + return false; + } + } + + /** + * 连接并启动OpenOffice + */ + public static OfficeManager getOfficeManager() { + String officeHome = getOfficeHome(); + if (officeHome == null) return null; + DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration(); + config.setOfficeHome(officeHome); // 设置OpenOffice安装目录 + OfficeManager officeManager = config.buildOfficeManager(); + officeManager.start(); // 启动OpenOffice服务 + return officeManager; + } + + /** + * 根据操作系统获取OpenOffice安装目录 + */ + public static String getOfficeHome() { + String osName = System.getProperty("os.name"); + if (Pattern.matches("Linux.*", osName)) { + return Constants.OPEN_OFFICE_PATH_LINUX; + } else if (Pattern.matches("Windows.*", osName)) { + return Constants.OPEN_OFFICE_PATH_WINDOWS; + } else if (Pattern.matches("Mac.*", osName)) { + return Constants.OPEN_OFFICE_PATH_MAC; + } + return null; + } + +} diff --git a/src/main/java/com/bomaos/common/core/utils/PicUtils.java b/src/main/java/com/bomaos/common/core/utils/PicUtils.java new file mode 100644 index 0000000..d40bffb --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/PicUtils.java @@ -0,0 +1,109 @@ +package com.bomaos.common.core.utils; + +import net.coobird.thumbnailator.Thumbnails; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; + +/** + * 图片压缩Utils + */ +public class PicUtils { + + private static final Logger logger = LoggerFactory.getLogger(PicUtils.class); + + /*public static void main(String[] args) throws IOException { + byte[] bytes = FileUtils.readFileToByteArray(new File("D:/a.png")); + long l = System.currentTimeMillis(); + bytes = PicUtils.compressPicForScale(bytes, 30, "x");// 图片小于300kb + System.out.println(System.currentTimeMillis() - l); + FileUtils.writeByteArrayToFile(new File("D:/aa.png"), bytes); + }*/ + + /** + * 根据指定大小压缩图片 + * + * @param imageBytes 源图片字节数组 + * @param desFileSize 指定图片大小,单位kb + * @param imageId 影像编号 + * @return 压缩质量后的图片字节数组 + */ + public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize, String imageId) { + if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) { + return imageBytes; + } + long srcSize = imageBytes.length; + double accuracy = getAccuracy(srcSize / 1024); + try { + while (imageBytes.length > desFileSize * 1024) { + ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length); + Thumbnails.of(inputStream) + .scale(accuracy) + .outputQuality(accuracy) + .toOutputStream(outputStream); + imageBytes = outputStream.toByteArray(); + } + logger.info("【图片压缩】imageId={} | 图片原大小={}kb | 压缩后大小={}kb", imageId, srcSize / 1024, imageBytes.length / 1024); + } catch (Exception e) { + logger.error("【图片压缩】msg=图片压缩失败!", e); + } + return imageBytes; + } + + /** + * 自动调节精度(经验数值) + * + * @param size 源图片大小 + * @return 图片压缩质量比 + */ + private static double getAccuracy(long size) { + double accuracy; + if (size < 900) { + accuracy = 0.85; + } else if (size < 2047) { + accuracy = 0.6; + } else if (size < 3275) { + accuracy = 0.44; + } else { + accuracy = 0.4; + } + return accuracy; + } + + /** + * 图片指定宽度高度 + * + * @param path 图片地址 + * @param width 图片宽度 + * @param height 图片高度 + * @return + */ + public static void changeSize(String path, int width, int height, HttpServletResponse response) { + try { + File file = new File(FileUploadUtil.UPLOAD_FILE_DIR + path); + if (!file.exists()) { + // 文件不存在 + return; + } + byte[] imageBytes = FileUtils.readFileToByteArray(file); + ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes); + BufferedImage image = Thumbnails.of(inputStream).size(width, height).keepAspectRatio(false).asBufferedImage(); + //以JPEG格式向客户端发送 + ServletOutputStream os = response.getOutputStream(); + ImageIO.write(image, "JPG", os); + os.flush(); + os.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/bomaos/common/core/utils/RequestParamsUtil.java b/src/main/java/com/bomaos/common/core/utils/RequestParamsUtil.java new file mode 100644 index 0000000..e3d5089 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/RequestParamsUtil.java @@ -0,0 +1,26 @@ +package com.bomaos.common.core.utils; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class RequestParamsUtil { + + public static Map getParameterMap(HttpServletRequest request) { + Map params = new HashMap<>(); //申明hashMap变量储存接收到的参数名用于排序 + Map requestParams = request.getParameterMap(); //获取请求的全部参数 + String valueStr = ""; //申明字符变量 保存接收到的变量 + for ( + Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) { + String name = (String) iter.next(); + String[] values = (String[]) requestParams.get(name); + valueStr = values[0]; + //乱码解决,这段代码在出现乱码时使用。如果sign不相等也可以使用这段代码转化 + //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk"); + params.put(name, valueStr);//增加到params保存 + } + + return params; + } +} diff --git a/src/main/java/com/bomaos/common/core/utils/RmbUtil.java b/src/main/java/com/bomaos/common/core/utils/RmbUtil.java new file mode 100644 index 0000000..665533b --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/RmbUtil.java @@ -0,0 +1,35 @@ +package com.bomaos.common.core.utils; + +import com.bomaos.orders.entity.Orders; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RmbUtil { + + /** + * 根据查询到订单数量统计订单的总金额 + * + * @param ordersList + * @return + */ + public static Map getRmbCount(List ordersList) { + // 今天的收款金额 + BigDecimal decimal = new BigDecimal("0.00"); + Integer longTotal = 0; // 今天的成交订单 + for (Orders orders : ordersList) { + BigDecimal bigDecimal = new BigDecimal(orders.getMoney().toString()); + longTotal++; + decimal = decimal.add(bigDecimal); + } + + HashMap map = new HashMap<>(); + map.put("totalSumlong", decimal); + map.put("longTotal", longTotal); + + return map; + } + +} diff --git a/src/main/java/com/bomaos/common/core/utils/StringUtil.java b/src/main/java/com/bomaos/common/core/utils/StringUtil.java new file mode 100644 index 0000000..1b9e24a --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/StringUtil.java @@ -0,0 +1,33 @@ +package com.bomaos.common.core.utils; + +import java.util.Random; + +public class StringUtil { + + public static String getRandomString(int length) { + String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < length; ++i) { + int number = random.nextInt(str.length()); + sb.append(str.charAt(number)); + } + + return sb.toString(); + } + + public static String getRandomNumber(int length) { + String str = "0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < length; ++i) { + int number = random.nextInt(str.length()); + sb.append(str.charAt(number)); + } + + return sb.toString(); + } + +} diff --git a/src/main/java/com/bomaos/common/core/utils/UserAgentGetter.java b/src/main/java/com/bomaos/common/core/utils/UserAgentGetter.java new file mode 100644 index 0000000..eb2c36f --- /dev/null +++ b/src/main/java/com/bomaos/common/core/utils/UserAgentGetter.java @@ -0,0 +1,99 @@ +package com.bomaos.common.core.utils; + +import eu.bitwalker.useragentutils.UserAgent; + +import javax.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * 获取客户端设备信息 + * Created by Panyoujie on 2017-6-10 10:10 + */ +public class UserAgentGetter { + private final UserAgent userAgent; + private final String userAgentString; + private final HttpServletRequest userRequest; + + public UserAgentGetter(HttpServletRequest request) { + this.userRequest = request; + this.userAgentString = request.getHeader("User-Agent"); + this.userAgent = UserAgent.parseUserAgentString(userAgentString); + } + + /** + * 获取浏览器类型 + */ + public String getBrowser() { + if (null == userAgent) return "Unknown"; + return userAgent.getBrowser().getName(); + } + + /** + * 获取操作系统 + */ + public String getOS() { + if (null == userAgent) return "Unknown"; + return userAgent.getOperatingSystem().getName(); + } + + /** + * 获取设备型号 + */ + public String getDevice() { + if (null == userAgentString) return "Unknown"; + if (userAgentString.contains("Android")) { + String[] str = userAgentString.split("[()]+"); + str = str[1].split("[;]"); + String[] res = str[str.length - 1].split("Build/"); + return res[0].trim(); + } else if (userAgentString.contains("iPhone")) { + String[] str = userAgentString.split("[()]+"); + String res = "iphone" + str[1].split("OS")[1].split("like")[0]; + return res.trim(); + } else if (userAgentString.contains("iPad")) { + return "iPad"; + } else { + return getOS().trim(); + } + } + + /** + * 获取ip地址 + */ + public String getIp() { + return getIp(userRequest); + } + + /** + * 获取ip地址 + */ + public static String getIp(HttpServletRequest request) { + String ip = null; + try { + ip = request.getHeader("x-forwarded-for"); + if (isBlankIp(ip)) ip = request.getHeader("Proxy-Client-IP"); + if (isBlankIp(ip)) ip = request.getHeader("WL-Proxy-Client-IP"); + if (isBlankIp(ip)) ip = request.getHeader("HTTP_CLIENT_IP"); + if (isBlankIp(ip)) ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + if (isBlankIp(ip)) ip = request.getRemoteAddr(); + // 多个ip获取第一个 + if (!isBlankIp(ip) && ip.length() > 15) ip = ip.split(",")[0]; + } catch (Exception e) { + e.printStackTrace(); + } + if ("0:0:0:0:0:0:0:1".equals(ip)) { + try { + ip = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + return ip; + } + + private static boolean isBlankIp(String ip) { + return ip == null || ip.trim().isEmpty() || "unknown".equalsIgnoreCase(ip); + } + +} diff --git a/src/main/java/com/bomaos/common/core/web/BaseApiController.java b/src/main/java/com/bomaos/common/core/web/BaseApiController.java new file mode 100644 index 0000000..f1ee188 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/web/BaseApiController.java @@ -0,0 +1,27 @@ +package com.bomaos.common.core.web; + +import org.wf.jwtp.provider.Token; +import org.wf.jwtp.util.SubjectUtil; + +import javax.servlet.http.HttpServletRequest; + +public class BaseApiController extends BaseController { + + /** + * 获取当前登录的token + */ + public Token getLoginToken(HttpServletRequest request) { + return SubjectUtil.getToken(request); + } + + /** + * 获取当前登录的userId + * + * @param request + * @return + */ + public Long getLoginUserId(HttpServletRequest request) { + Token token = getLoginToken(request); + return token == null ? null : Long.parseLong(token.getUserId()); + } +} diff --git a/src/main/java/com/bomaos/common/core/web/BaseController.java b/src/main/java/com/bomaos/common/core/web/BaseController.java new file mode 100644 index 0000000..09eab90 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/web/BaseController.java @@ -0,0 +1,60 @@ +package com.bomaos.common.core.web; + +import com.bomaos.common.system.entity.User; +import com.bomaos.website.entity.Website; +import com.bomaos.website.service.WebsiteService; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Controller基类 + * Created by Panyoujie on 2017-06-10 10:10 + */ +public class BaseController { + + @Autowired + private WebsiteService websiteService; + + /** + * 获取当前登录的user + */ + public User getLoginUser() { + Subject subject = SecurityUtils.getSubject(); + if (subject == null) return null; + Object object = subject.getPrincipal(); + if (object != null) return (User) object; + return null; + } + + /** + * 获取当前登录的userId + */ + public Integer getLoginUserId() { + User loginUser = getLoginUser(); + return loginUser == null ? null : loginUser.getUserId(); + } + + public String getWebName() { + Website website = websiteService.getById(1); + return website.getWebsiteName(); + } + + /** + * 获取当前登录用户的supplierId,管理员返回null + */ + public Integer getLoginUserSupplierId() { + User loginUser = getLoginUser(); + if (loginUser == null) return null; + Integer supplierId = loginUser.getSupplierId(); + return (supplierId != null && supplierId > 0) ? supplierId : null; + } + + /** + * 判断当前用户是否为供应商 + */ + public boolean isSupplier() { + return getLoginUserSupplierId() != null; + } + +} diff --git a/src/main/java/com/bomaos/common/core/web/BatchParam.java b/src/main/java/com/bomaos/common/core/web/BatchParam.java new file mode 100644 index 0000000..c5f125c --- /dev/null +++ b/src/main/java/com/bomaos/common/core/web/BatchParam.java @@ -0,0 +1,52 @@ +package com.bomaos.common.core.web; + +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.io.Serializable; +import java.util.List; + +/** + * 批量修改通用参数 + * Created by Panyoujie on 2020-03-13 0:11 + */ +public class BatchParam implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 主键id集合 + */ + private List ids; + /** + * 批量修改多个字段 + */ + private T data; + + /** + * 通用批量修改方法 + * + * @param service IService + * @param idName id字段名称 + * @return boolean + */ + public boolean update(IService service, String idName) { + if (data == null) return false; + return service.update(data, new UpdateWrapper().in(idName, this.getIds())); + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + +} diff --git a/src/main/java/com/bomaos/common/core/web/JsonResult.java b/src/main/java/com/bomaos/common/core/web/JsonResult.java new file mode 100644 index 0000000..3a79179 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/web/JsonResult.java @@ -0,0 +1,103 @@ +package com.bomaos.common.core.web; + +import com.bomaos.common.core.Constants; + +import java.util.HashMap; + +/** + * 接口返回结果对象 + * Created by Panyoujie on 2017-06-10 10:10 + */ +public class JsonResult extends HashMap { + private static final long serialVersionUID = 1L; + private static final String CODE_NAME = "code"; // 状态码字段名称 + private static final String MSG_NAME = "msg"; // 状态信息字段名称 + private static final String DATA_NAME = "data"; // 数据字段名称 + private static final int DEFAULT_OK_CODE = Constants.RESULT_OK_CODE; // 默认成功码 + private static final int DEFAULT_ERROR_CODE = Constants.RESULT_ERROR_CODE; // 默认失败码 + private static final String DEFAULT_OK_MSG = "操作成功"; // 默认成功msg + private static final String DEFAULT_ERROR_MSG = "操作失败"; // 默认失败msg + + private JsonResult() { + } + + /** + * 返回成功 + */ + public static JsonResult ok() { + return ok(null); + } + + /** + * 返回成功 + */ + public static JsonResult ok(String message) { + return ok(DEFAULT_OK_CODE, message); + } + + /** + * 返回成功 + */ + public static JsonResult ok(int code, String message) { + if (message == null) message = DEFAULT_OK_MSG; + JsonResult jsonResult = new JsonResult(); + jsonResult.put(CODE_NAME, code); + jsonResult.put(MSG_NAME, message); + return jsonResult; + } + + /** + * 返回失败 + */ + public static JsonResult error() { + return error(null); + } + + /** + * 返回失败 + */ + public static JsonResult error(String message) { + return error(DEFAULT_ERROR_CODE, message); + } + + /** + * 返回失败 + */ + public static JsonResult error(int code, String message) { + if (message == null) message = DEFAULT_ERROR_MSG; + return ok(code, message); + } + + public JsonResult setCode(Integer code) { + return put(CODE_NAME, code); + } + + public JsonResult setMsg(String message) { + return put(MSG_NAME, message); + } + + public JsonResult setData(Object object) { + return put(DATA_NAME, object); + } + + public Integer getCode(int code) { + Object o = get(CODE_NAME); + return o == null ? null : Integer.parseInt(o.toString()); + } + + public String getMsg() { + Object o = get(MSG_NAME); + return o == null ? null : o.toString(); + } + + public Object getData() { + return get(DATA_NAME); + } + + @Override + public JsonResult put(String key, Object object) { + if (key != null && object != null) super.put(key, object); + return this; + } + +} diff --git a/src/main/java/com/bomaos/common/core/web/PageParam.java b/src/main/java/com/bomaos/common/core/web/PageParam.java new file mode 100644 index 0000000..4b23440 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/web/PageParam.java @@ -0,0 +1,441 @@ +package com.bomaos.common.core.web; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Field; +import java.util.*; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * 列表分页、排序、搜索通用接收参数封装 + * Created by Panyoujie on 2019-04-26 10:34 + */ +public class PageParam extends Page { + private static final String FILED_PAGE = "page"; // 第几页参数名称 + private static final String FILED_LIMIT = "limit"; // 每页显示数量参数名称 + private static final String FILED_SORT = "sort"; // 排序字段参数名称 + private static final String FILED_ORDER = "order"; // 排序方式参数名称 + private static final String VALUE_ORDER_ASC = "asc"; // 表示升序的值 + private static final String VALUE_ORDER_DESC = "desc"; // 表示降序的值 + private static final Pattern HUMP_PATTERN = Pattern.compile("[A-Z]"); // 驼峰转下划线正则匹配 + /** + * 除分页、排序外的其他参数 + */ + private Map pageData; + /** + * 是否把字段名称驼峰转下划线 + */ + private boolean needToLine = true; + + public PageParam() { + super(); + } + + public PageParam(HttpServletRequest request) { + init(request); + } + + public PageParam(HttpServletRequest request, boolean needToLine) { + setNeedToLine(needToLine); + init(request); + } + + public boolean isNeedToLine() { + return needToLine; + } + + public PageParam setNeedToLine(boolean needToLine) { + this.needToLine = needToLine; + return this; + } + + public Map getPageData() { + return pageData; + } + + public void setPageData(Map data) { + this.pageData = data; + } + + /** + * 从request中获取参数并填充到PageParam中 + */ + public PageParam init(HttpServletRequest request) { + String sortValue = null, orderValue = null; + Map map = new HashMap<>(); + Enumeration names = request.getParameterNames(); + while (names.hasMoreElements()) { + String name = names.nextElement(); + String value = request.getParameter(name); + if (value == null || value.isEmpty() || value.replace(" ", "").isEmpty()) { + continue; + } + if (FILED_PAGE.equals(name)) { + setCurrent(Long.parseLong(value)); + } else if (FILED_LIMIT.equals(name)) { + setSize(Long.parseLong(value)); + } else if (FILED_SORT.equals(name)) { + sortValue = (needToLine ? humpToLine(value) : value); + } else if (FILED_ORDER.equals(name)) { + orderValue = value; + } else { + map.put(name, value); + } + } + setPageData(map); + // 同步排序方式到MyBatisPlus中 + if (sortValue != null) { + /* if (VALUE_ORDER_ASC.equals(orderValue))*/ + setOrder(sortValue, !VALUE_ORDER_DESC.equals(orderValue)); + } + return this; + } + + /** + * 获取升序排序的字段 + */ + public List getOrderAscs() { + List ascs = new ArrayList<>(); + List orders = getOrders(); + if (orders != null) { + for (OrderItem order : orders) { + if (order.isAsc()) ascs.add(order.getColumn()); + } + } + return ascs; + } + + /** + * 获取降序排序的字段 + */ + public List getOrderDescs() { + List descs = new ArrayList<>(); + List orders = getOrders(); + if (orders != null) { + for (OrderItem order : orders) { + if (!order.isAsc()) descs.add(order.getColumn()); + } + } + return descs; + } + + /** + * 增加asc排序方式 + */ + public PageParam addOrderAsc(String... ascs) { + if (ascs != null) { + List tAscs = getOrderAscs(); + List orderItems = new ArrayList<>(); + for (String column : ascs) { + if (!tAscs.contains(column)) { + OrderItem orderItem = new OrderItem(); + orderItem.setAsc(true); + orderItem.setColumn(column); + orderItems.add(orderItem); + } + } + if (getOrders() == null) { + setOrders(orderItems); + } else { + getOrders().addAll(orderItems); + } + } + return this; + } + + /** + * 增加desc排序方式 + */ + public PageParam addOrderDesc(String... descs) { + if (descs != null) { + List tDescs = getOrderDescs(); + List orderItems = new ArrayList<>(); + for (String column : descs) { + if (!tDescs.contains(column)) { + OrderItem orderItem = new OrderItem(); + orderItem.setAsc(false); + orderItem.setColumn(column); + orderItems.add(orderItem); + } + } + if (getOrders() == null) { + setOrders(orderItems); + } else { + getOrders().addAll(orderItems); + } + } + return this; + } + + /** + * 移除某个排序字段 + */ + public PageParam removeOrder(String order, Boolean isAsc) { + List orderItems = getOrders(); + if (orderItems != null) { + Iterator iterator = orderItems.iterator(); + while (iterator.hasNext()) { + OrderItem item = iterator.next(); + if (isAsc == null || isAsc == item.isAsc()) { + if (order.equals(item.getColumn())) iterator.remove(); + } + } + } + return this; + } + + /** + * 设置排序方式 + */ + public PageParam setOrder(String order, boolean isAsc) { + List orderItems = new ArrayList<>(); + if (order != null) { + OrderItem orderItem = new OrderItem(); + orderItem.setAsc(isAsc); + orderItem.setColumn(order); + orderItems.add(orderItem); + } + setOrders(orderItems); + return this; + } + + /** + * 设置默认排序方式 + */ + public PageParam setDefaultOrder(String[] ascs, String[] descs) { + List orderItems = getOrders(); + if (orderItems == null || orderItems.size() == 0) { + addOrderAsc(ascs); + addOrderDesc(descs); + } + return this; + } + + /** + * 往pageData里面增加参数 + */ + public PageParam put(String key, Object value) { + if (pageData == null) pageData = new HashMap<>(); + pageData.put(key, value); + return this; + } + + /** + * 获取pageData里面参数 + */ + public Object get(String key) { + return pageData.get(key); + } + + public String getString(String key) { + Object o = pageData.get(key); + if (o != null) return String.valueOf(o); + return null; + } + + public Integer getInt(String key) { + String str = getString(key); + if (str != null) return Integer.parseInt(str); + return null; + } + + public Long getLong(String key) { + String str = getString(key); + if (str != null) return Long.parseLong(str); + return null; + } + + public Float getFloat(String key) { + String str = getString(key); + if (str != null) return Float.parseFloat(str); + return null; + } + + public Double getDouble(String key) { + String str = getString(key); + if (str != null) return Double.parseDouble(str); + return null; + } + + public Boolean getBoolean(String key) { + String str = getString(key); + if (str != null) return Boolean.parseBoolean(str); + return null; + } + + /** + * 构建查询条件 + * + * @param excludes 不包含的参数 + * @return QueryWrapper + */ + public QueryWrapper getWrapper(String... excludes) { + List exList = Arrays.asList(excludes); + QueryWrapper queryWrapper = new QueryWrapper(); + for (String key : pageData.keySet()) { + if (!exList.contains(key)) buildWrapper(queryWrapper, key, getString(key)); + } + return queryWrapper; + } + + /** + * 构建查询条件 + * + * @param columns 只包含的参数 + * @return QueryWrapper + */ + public QueryWrapper getWrapperWith(String... columns) { + List keyList = Arrays.asList(columns); + QueryWrapper queryWrapper = new QueryWrapper(); + for (String key : pageData.keySet()) { + if (keyList.contains(key)) buildWrapper(queryWrapper, key, getString(key)); + } + return queryWrapper; + } + + /** + * 逐个构建QueryWrapper + */ + private void buildWrapper(QueryWrapper queryWrapper, String key, String value) { + if (value == null || "deleted".equals(key)) return; + if (Arrays.asList("id", "sortNumber", "state").contains(key) || key.endsWith("Id")) { + queryWrapper.eq(needToLine ? humpToLine(key) : key, value); + } else if ("createTimeStart".equals(key)) { + queryWrapper.ge("create_time", value); + } else if ("createTimeEnd".equals(key)) { + queryWrapper.le("create_time", value); + } else { + queryWrapper.like(needToLine ? humpToLine(key) : key, value); + } + } + + /** + * 构建排序的QueryWrapper + * + * @param queryWrapper 搜索条件的wrapper + * @return QueryWrapper + */ + public QueryWrapper getOrderWrapper(QueryWrapper queryWrapper) { + if (queryWrapper == null) queryWrapper = new QueryWrapper(); + queryWrapper.orderByAsc(getOrderAscs()); + queryWrapper.orderByDesc(getOrderDescs()); + return queryWrapper; + } + + /** + * 构建包含排序的查询条件 + * + * @return QueryWrapper + */ + public QueryWrapper getOrderWrapper() { + return getOrderWrapper(getWrapper()); + } + + /** + * 获取不分页的参数,包含排序和pageData + * + * @return Map + */ + public Map getNoPageParam() { + Map map = new HashMap<>(); + map.put("pageData", this.pageData); + List orders = getOrders(); + if (orders != null && orders.size() > 0) map.put("orders", orders); + return map; + } + + /** + * 获取查询结果中第一条数据 + */ + public T getOne(List records) { + return records == null || records.size() == 0 ? null : records.get(0); + } + + /** + * 代码排序查询结果,实现类似SQL语句的排序效果 + */ + public List sortRecords(List records) { + if (records == null || records.size() <= 1) return records; + List orderItems = getOrders(); + if (orderItems != null) { + Comparator comparator = null; + for (OrderItem order : orderItems) { + if (order.getColumn() != null) { + Function keyExtractor = t -> getFieldValue(t, needToLine ? lineToHump(order.getColumn()) : order.getColumn()); + if (comparator == null) { + if (order.isAsc()) { + comparator = Comparator.comparing(keyExtractor); + } else { + comparator = Comparator.comparing(keyExtractor, Comparator.reverseOrder()); + } + } else { + if (order.isAsc()) { + comparator.thenComparing(keyExtractor); + } else { + comparator.thenComparing(keyExtractor, Comparator.reverseOrder()); + } + } + } + } + if (comparator != null) { + return records.stream().sorted(comparator).collect(Collectors.toList()); + } + } + return records; + } + + /** + * 驼峰转下划线 + */ + public static String humpToLine(String str) { + if (str == null) return null; + Matcher matcher = HUMP_PATTERN.matcher(str); + StringBuffer sb = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase()); + } + matcher.appendTail(sb); + return sb.toString(); + } + + /** + * 下划线转驼峰 + */ + public static String lineToHump(String str) { + if (str == null) return null; + StringBuilder sb = new StringBuilder(); + String[] ss = str.split("_"); + sb.append(ss[0]); + for (int i = 1; i < ss.length; i++) { + if (ss[i].length() > 0) sb.append(ss[i].substring(0, 1).toUpperCase()); + if (ss[i].length() > 1) sb.append(ss[i].substring(1)); + } + return sb.toString(); + } + + /** + * 获取对象某个字段的值 + * + * @param t 对象 + * @param field 字段 + * @return Object + */ + public static Object getFieldValue(Object t, String field) { + if (t == null || field == null) return null; + try { + Field clazzField = t.getClass().getDeclaredField(field); + clazzField.setAccessible(true); + return clazzField.get(t); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/src/main/java/com/bomaos/common/core/web/PageResult.java b/src/main/java/com/bomaos/common/core/web/PageResult.java new file mode 100644 index 0000000..2d59f67 --- /dev/null +++ b/src/main/java/com/bomaos/common/core/web/PageResult.java @@ -0,0 +1,83 @@ +package com.bomaos.common.core.web; + +import java.io.Serializable; +import java.util.List; + +/** + * 分页查询通用返回结果 + * Created by Panyoujie on 2017-06-10 10:10 + */ +public class PageResult implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 状态码 + */ + private int code = 0; + /** + * 提示信息 + */ + private String msg; + /** + * 总数量 + */ + private long count; + /** + * 当前页数据 + */ + private List data; + + public PageResult() { + } + + public PageResult(List rows) { + this(rows, rows == null ? 0 : rows.size()); + } + + public PageResult(List rows, long total) { + this.count = total; + this.data = rows; + } + + public PageResult(int code, List rows, long total) { + this.code = code; + this.count = total; + this.data = rows; + } + + public int getCode() { + return code; + } + + public PageResult setCode(int code) { + this.code = code; + return this; + } + + public String getMsg() { + return msg; + } + + public PageResult setMsg(String msg) { + this.msg = msg; + return this; + } + + public long getCount() { + return count; + } + + public PageResult setCount(long count) { + this.count = count; + return this; + } + + public List getData() { + return data; + } + + public PageResult setData(List data) { + this.data = data; + return this; + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/DictionaryController.java b/src/main/java/com/bomaos/common/system/controller/DictionaryController.java new file mode 100644 index 0000000..7a0c329 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/DictionaryController.java @@ -0,0 +1,174 @@ +package com.bomaos.common.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.utils.CoreUtil; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.Dictionary; +import com.bomaos.common.system.service.DictionaryService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 字典管理 + * Created by Panyoujie on 2020-03-14 11:29:03 + */ +@Controller +@RequestMapping("/sys/dict") +public class DictionaryController extends BaseController { + @Autowired + private DictionaryService dictionaryService; + + @RequiresPermissions("sys:dict:view") + @RequestMapping() + public String view() { + return "system/dictionary.html"; + } + + /** + * 分页查询字典 + */ + @OperLog(value = "字典管理", desc = "分页查询") + @RequiresPermissions("sys:dict:list") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return new PageResult<>(dictionaryService.page(pageParam, pageParam.getWrapper()).getRecords(), pageParam.getTotal()); + } + + /** + * 查询全部字典 + */ + @OperLog(value = "字典管理", desc = "查询全部") + @RequiresPermissions("sys:dict:list") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(dictionaryService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询字典 + */ + @OperLog(value = "字典管理", desc = "根据id查询") + @RequiresPermissions("sys:dict:list") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(dictionaryService.getById(id)); + } + + /** + * 添加字典 + */ + @OperLog(value = "字典管理", desc = "添加", param = false, result = true) + @RequiresPermissions("sys:dict:save") + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Dictionary dictionary) { + if (dictionaryService.count(new QueryWrapper().eq("dict_code", dictionary.getDictCode())) > 0) { + return JsonResult.error("字典标识已存在"); + } + if (dictionaryService.count(new QueryWrapper().eq("dict_name", dictionary.getDictName())) > 0) { + return JsonResult.error("字典名称已存在"); + } + if (dictionaryService.save(dictionary)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改字典 + */ + @OperLog(value = "字典管理", desc = "修改", param = false, result = true) + @RequiresPermissions("sys:dict:update") + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Dictionary dictionary) { + if (dictionaryService.count(new QueryWrapper().eq("dict_code", dictionary.getDictCode()) + .ne("dict_id", dictionary.getDictId())) > 0) { + return JsonResult.error("字典代码已存在"); + } + if (dictionaryService.count(new QueryWrapper().eq("dict_name", dictionary.getDictName()) + .ne("dict_id", dictionary.getDictId())) > 0) { + return JsonResult.error("字典名称已存在"); + } + if (dictionaryService.updateById(dictionary)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除字典 + */ + @OperLog(value = "字典管理", desc = "删除", result = true) + @RequiresPermissions("sys:dict:remove") + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (dictionaryService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加字典 + */ + @OperLog(value = "字典管理", desc = "批量添加", param = false, result = true) + @RequiresPermissions("sys:dict:save") + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + // 对集合本身进行非空和重复校验 + StringBuilder sb = new StringBuilder(); + sb.append(CoreUtil.listCheckBlank(list, "dictCode", "字典标识")); + sb.append(CoreUtil.listCheckBlank(list, "dictName", "字典名称")); + sb.append(CoreUtil.listCheckRepeat(list, "dictCode", "字典标识")); + sb.append(CoreUtil.listCheckRepeat(list, "dictName", "字典名称")); + if (sb.length() != 0) return JsonResult.error(sb.toString()); + // 数据库层面校验 + if (dictionaryService.count(new QueryWrapper().in("dict_code", + list.stream().map(Dictionary::getDictCode).collect(Collectors.toList()))) > 0) { + return JsonResult.error("字典标识已存在"); + } + if (dictionaryService.count(new QueryWrapper().in("dict_name", + list.stream().map(Dictionary::getDictName).collect(Collectors.toList()))) > 0) { + return JsonResult.error("字典名称已存在"); + } + if (dictionaryService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量删除字典 + */ + @OperLog(value = "字典管理", desc = "批量删除", result = true) + @RequiresPermissions("sys:dict:remove") + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (dictionaryService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/DictionaryDataController.java b/src/main/java/com/bomaos/common/system/controller/DictionaryDataController.java new file mode 100644 index 0000000..1373c07 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/DictionaryDataController.java @@ -0,0 +1,162 @@ +package com.bomaos.common.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.DictionaryData; +import com.bomaos.common.system.service.DictionaryDataService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 字典项管理 + * Created by Panyoujie on 2020-03-14 11:29:04 + */ +@Controller +@RequestMapping("/sys/dictdata") +public class DictionaryDataController extends BaseController { + @Autowired + private DictionaryDataService dictionaryDataService; + + /** + * 分页查询字典项 + */ + @OperLog(value = "字典项管理", desc = "分页查询") + @RequiresPermissions("sys:dict:list") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return dictionaryDataService.listPage(pageParam); + } + + /** + * 查询全部字典项 + */ + @OperLog(value = "字典项管理", desc = "查询全部") + @RequiresPermissions("sys:dict:list") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + List records = dictionaryDataService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.sortRecords(records)); + } + + /** + * 根据id查询字典项 + */ + @OperLog(value = "字典项管理", desc = "根据id查询") + @RequiresPermissions("sys:dict:list") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + PageParam pageParam = new PageParam<>(); + pageParam.put("dictDataId", id); + List records = dictionaryDataService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.getOne(records)); + } + + /** + * 添加字典项 + */ + @OperLog(value = "字典项管理", desc = "添加", param = false, result = true) + @RequiresPermissions("sys:dict:save") + @ResponseBody + @RequestMapping("/save") + public JsonResult add(DictionaryData dictionaryData) { + if (dictionaryDataService.count(new QueryWrapper() + .eq("dict_id", dictionaryData.getDictId()) + .eq("dict_data_name", dictionaryData.getDictDataName())) > 0) { + return JsonResult.error("字典项名称已存在"); + } + if (dictionaryDataService.count(new QueryWrapper() + .eq("dict_id", dictionaryData.getDictId()) + .eq("dict_data_code", dictionaryData.getDictDataCode())) > 0) { + return JsonResult.error("字典项标识已存在"); + } + if (dictionaryDataService.save(dictionaryData)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改字典项 + */ + @OperLog(value = "字典项管理", desc = "修改", param = false, result = true) + @RequiresPermissions("sys:dict:update") + @ResponseBody + @RequestMapping("/update") + public JsonResult update(DictionaryData dictionaryData) { + if (dictionaryDataService.count(new QueryWrapper() + .eq("dict_id", dictionaryData.getDictId()) + .eq("dict_data_name", dictionaryData.getDictDataName()) + .ne("dict_data_id", dictionaryData.getDictDataId())) > 0) { + return JsonResult.error("字典项名称已存在"); + } + if (dictionaryDataService.count(new QueryWrapper() + .eq("dict_id", dictionaryData.getDictId()) + .eq("dict_data_code", dictionaryData.getDictDataCode()) + .ne("dict_data_id", dictionaryData.getDictDataId())) > 0) { + return JsonResult.error("字典项标识已存在"); + } + if (dictionaryDataService.updateById(dictionaryData)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除字典项 + */ + @OperLog(value = "字典项管理", desc = "删除", result = true) + @RequiresPermissions("sys:dict:remove") + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (dictionaryDataService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加字典项 + */ + @OperLog(value = "字典项管理", desc = "批量添加", param = false, result = true) + @RequiresPermissions("sys:dict:save") + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List dictDataList) { + if (dictionaryDataService.saveBatch(dictDataList)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量删除字典项 + */ + @OperLog(value = "字典项管理", desc = "批量删除", result = true) + @RequiresPermissions("sys:dict:remove") + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (dictionaryDataService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/EmailController.java b/src/main/java/com/bomaos/common/system/controller/EmailController.java new file mode 100644 index 0000000..040b5cb --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/EmailController.java @@ -0,0 +1,47 @@ +package com.bomaos.common.system.controller; + +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.system.service.EmailService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.mail.MessagingException; + +/** + * 邮件功能 + * Created by Panyoujie on 2020-03-21 0:37 + */ +@Controller +@RequestMapping("/sys/email") +public class EmailController { + @Autowired + private EmailService emailService; + + @RequiresPermissions("sys:email:view") + @RequestMapping() + public String view() { + return "system/email.html"; + } + + /** + * 发送邮件 + */ + @OperLog(value = "邮件功能", desc = "发送邮件", result = true, param = false) + @RequiresPermissions("sys:email:view") + @ResponseBody + @RequestMapping("/send") + public JsonResult send(String title, String html, String email) { + try { + emailService.sendFullTextEmail(title, html, new String[]{email}); + return JsonResult.ok("发送成功"); + } catch (MessagingException e) { + e.printStackTrace(); + } + return JsonResult.error("发送失败"); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/FileController.java b/src/main/java/com/bomaos/common/system/controller/FileController.java new file mode 100644 index 0000000..88cfc78 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/FileController.java @@ -0,0 +1,194 @@ +package com.bomaos.common.system.controller; + +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.utils.FileUploadUtil; +import com.bomaos.common.core.utils.PicUtils; +import com.bomaos.common.core.web.JsonResult; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * 文件服务器 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Controller +@RequestMapping("/file") +public class FileController { + + @RequiresPermissions("sys:file:view") + @RequestMapping("/manage") + public String view() { + return "system/file.html"; + } + + /** + * 上传文件 + */ + @OperLog(value = "文件管理", desc = "上传文件", param = false, result = true) + @ResponseBody + @PostMapping("/upload") + public JsonResult upload(@RequestParam MultipartFile file, HttpServletRequest request) { + return FileUploadUtil.upload(file, request); + } + + /** + * 上传base64文件 + */ + @OperLog(value = "文件管理", desc = "上传base64文件", param = false, result = true) + @ResponseBody + @PostMapping("/upload/base64") + public JsonResult uploadBase64(String base64, HttpServletRequest request) { + return FileUploadUtil.upload(base64, request); + } + + @ResponseBody + @GetMapping("/enQrcode") + public void enQrcode(HttpServletResponse resp, String url) throws IOException { + if (url != null && !"".equals(url)) { + ServletOutputStream stream = null; + try { + int width = 240;//图片的宽度 + int height = 240;//高度 + + /* + * 定义二维码的参数 + */ + HashMap hashMap = new HashMap(); + // 设置二维码字符编码 + hashMap.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + // 设置二维码纠错等级 + hashMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); + // 设置二维码边距 + hashMap.put(EncodeHintType.MARGIN, 1); + + stream = resp.getOutputStream(); + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix m = writer.encode(url, BarcodeFormat.QR_CODE, height, width, hashMap); + MatrixToImageWriter.writeToStream(m, "png", stream); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (stream != null) { + stream.flush(); + stream.close(); + } + } + } + } + + @PostMapping("/import") + @ResponseBody + public void importZip(@RequestParam("file") MultipartFile file) throws IOException { + ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream(), Charset.forName("gbk")); + ZipEntry zipEntry; + while ((zipEntry = zipInputStream.getNextEntry()) != null) { + if (!zipEntry.isDirectory()) { + // do nothing + String name = zipEntry.getName(); + long size = zipEntry.getSize(); + byte[] extra = zipEntry.getExtra(); + if (size == -1) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + while (true) { + int bytes = zipInputStream.read(); + if (bytes == -1) break; + baos.write(bytes); + } + baos.close(); + System.out.println(baos.toString()); + } else { + byte[] bytes = new byte[(int) zipEntry.getSize()]; + zipInputStream.read(bytes, 0, (int) zipEntry.getSize()); + System.out.println(new String(bytes)); + } + } + } + zipInputStream.closeEntry(); + zipInputStream.close(); + } + + /** + * 预览文件 + */ + @GetMapping("/{dir}/{name:.+}") + public void file(@PathVariable("dir") String dir, @PathVariable("name") String name, Integer width, Integer height, HttpServletResponse response) { + if (width != null && width > 0 && height != null && height > 0) { + PicUtils.changeSize(dir + "/" + name, width, height, response); + } else { + FileUploadUtil.preview(dir + "/" + name, response); + } + } + + /** + * 下载文件 + */ + @GetMapping("/download/{dir}/{name:.+}") + public void downloadFile(@PathVariable("dir") String dir, @PathVariable("name") String name, HttpServletResponse response) { + FileUploadUtil.download(dir + "/" + name, response); + } + + /** + * 查看缩略图 + */ + @GetMapping("/thumbnail/{dir}/{name:.+}") + public void smFile(@PathVariable("dir") String dir, @PathVariable("name") String name, HttpServletResponse response) { + FileUploadUtil.thumbnail(dir + "/" + name, response); + } + + /** + * 删除文件 + */ + @OperLog(value = "文件管理", desc = "删除文件", result = true) + @RequiresPermissions("sys:file:remove") + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(String path) { + if (path == null || path.trim().isEmpty()) { + return JsonResult.error("参数不能为空"); + } + if (FileUploadUtil.delete(path)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 查询文件列表 + */ + @OperLog(value = "文件管理", desc = "查询全部") + @RequiresPermissions("sys:file:list") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(String dir) { + List> list = FileUploadUtil.list(dir); + list.sort(new Comparator>() { + @Override + public int compare(Map o1, Map o2) { + return ((Long) o2.get("updateTime")).compareTo((Long) o1.get("updateTime")); + } + }); + return JsonResult.ok().setData(list); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/LoginRecordController.java b/src/main/java/com/bomaos/common/system/controller/LoginRecordController.java new file mode 100644 index 0000000..982cbf8 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/LoginRecordController.java @@ -0,0 +1,75 @@ +package com.bomaos.common.system.controller; + +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.LoginRecord; +import com.bomaos.common.system.service.LoginRecordService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 登录日志 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Controller +@RequestMapping("/sys/loginRecord") +public class LoginRecordController extends BaseController { + @Autowired + private LoginRecordService loginRecordService; + + @RequiresPermissions("sys:login_record:view") + @RequestMapping() + public String view() { + return "system/login-record.html"; + } + + /** + * 分页查询登录日志 + */ + @OperLog(value = "登录日志", desc = "分页查询") + @RequiresPermissions("sys:login_record:view") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.setDefaultOrder(null, new String[]{"create_time"}); + return loginRecordService.listPage(pageParam); + } + + /** + * 查询全部登录日志 + */ + @OperLog(value = "登录日志", desc = "查询全部") + @RequiresPermissions("sys:login_record:view") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + List records = loginRecordService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.sortRecords(records)); + } + + /** + * 根据id查询登录日志 + */ + @OperLog(value = "登录日志", desc = "根据id查询") + @RequiresPermissions("sys:login_record:view") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + PageParam pageParam = new PageParam<>(); + pageParam.put("id", id); + List records = loginRecordService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.getOne(records)); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/MainController.java b/src/main/java/com/bomaos/common/system/controller/MainController.java new file mode 100644 index 0000000..cd3dcff --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/MainController.java @@ -0,0 +1,183 @@ +package com.bomaos.common.system.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.system.entity.LoginRecord; +import com.bomaos.common.system.entity.Menu; +import com.bomaos.common.system.service.LoginRecordService; +import com.bomaos.common.system.service.MenuService; +import com.bomaos.settings.entity.Pays; +import com.bomaos.settings.service.PaysService; +import com.bomaos.website.entity.Website; +import com.bomaos.website.service.WebsiteService; +import com.wf.captcha.utils.CaptchaUtil; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.servlet.error.ErrorController; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 首页、登录、验证码等 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Controller +public class MainController extends BaseController implements ErrorController { + + @Autowired + private MenuService menuService; + + @Autowired + private LoginRecordService loginRecordService; + + @Autowired + private WebsiteService websiteService; + + @Autowired + private PaysService paysService; + + /** + * 用户登录 + */ + @ResponseBody + @PostMapping("/login") + public JsonResult login(String username, String password, String code, Boolean remember, HttpServletRequest request) { + if (username == null || username.trim().isEmpty()) return JsonResult.error("请输入账号"); + if (!CaptchaUtil.ver(code, request)) { + CaptchaUtil.clear(request); // 清除session中的验证码 + loginRecordService.saveAsync(username, LoginRecord.TYPE_ERROR, "验证码错误", request); + return JsonResult.error("验证码不正确"); + } + try { + if (remember == null) remember = false; + SecurityUtils.getSubject().login(new UsernamePasswordToken(username, password, remember)); + loginRecordService.saveAsync(username, request); + return JsonResult.ok("登录成功"); + } catch (IncorrectCredentialsException ice) { + loginRecordService.saveAsync(username, LoginRecord.TYPE_ERROR, "密码错误", request); + return JsonResult.error("密码错误"); + } catch (UnknownAccountException uae) { + loginRecordService.saveAsync(username, LoginRecord.TYPE_ERROR, "账号不存在", request); + return JsonResult.error("账号不存在"); + } catch (LockedAccountException e) { + loginRecordService.saveAsync(username, LoginRecord.TYPE_ERROR, "账号被锁定", request); + return JsonResult.error("账号被锁定"); + } catch (ExcessiveAttemptsException eae) { + loginRecordService.saveAsync(username, LoginRecord.TYPE_ERROR, "操作频繁", request); + return JsonResult.error("操作频繁,请稍后再试"); + } + } + + /** + * 登录页 + */ + @GetMapping("/login") + public String login(Model model) { + + Website website = websiteService.getById(1); + model.addAttribute("website", website); + + if (getLoginUser() != null) return "redirect:index"; + return "login.html"; + } + + /** + * 主页 + */ + @RequestMapping("/admin") + public String index(Model model) { + + Pays paypal = paysService.getOne(new QueryWrapper().eq("driver", "paypal")); + Pays zlqqpay = paysService.getOne(new QueryWrapper().eq("driver", "epay_qqpay")); + + if (ObjectUtils.isEmpty(paypal)) { + Pays pays1 = new Pays(); + pays1.setName("Paypal"); + pays1.setDriver("paypal"); + + Map map = new HashMap<>(); + map.put("clientId", "xxx"); + map.put("clientSecret", "xxx"); + map.put("return_url", "xxx"); + String jsonString = JSON.toJSONString(map); + pays1.setConfig(jsonString); + pays1.setComment("Paypal 境外支付(默认美元交易)"); + pays1.setIsMobile(0); + pays1.setIsPc(0); + pays1.setCreatedAt(new Date()); + pays1.setUpdatedAt(new Date()); + paysService.save(pays1); + } + + if (ObjectUtils.isEmpty(zlqqpay)) { + Pays pays1 = new Pays(); + pays1.setName("QQ钱包"); + pays1.setDriver("epay_qqpay"); + + Map map = new HashMap<>(); + map.put("pid", "xxx"); + map.put("key", "xxx"); + map.put("notify_url", "xxx"); + map.put("create_url", "xxx"); + + String jsonString = JSON.toJSONString(map); + pays1.setConfig(jsonString); + pays1.setComment("易支付 - QQ钱包"); + pays1.setIsMobile(0); + pays1.setIsPc(0); + pays1.setCreatedAt(new Date()); + pays1.setUpdatedAt(new Date()); + paysService.save(pays1); + } + + Website website = websiteService.getById(1); + model.addAttribute("website", website); + + // 左侧菜单 + List menus = menuService.getUserMenu(getLoginUserId(), Menu.TYPE_MENU); + model.addAttribute("menus", menuService.toMenuTree(menus, 0)); + return "main.html"; + } + + /** + * 图形验证码 + */ + @RequestMapping("/assets/captcha") + public void captcha(HttpServletRequest request, HttpServletResponse response) { + try { + CaptchaUtil.out(5, request, response); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 主页弹窗页面 + */ + @RequestMapping("/tpl/{name}") + public String tpl(@PathVariable("name") String name) { + return "index/" + name + ".html"; + } + + /** + * 错误页 + */ + @RequestMapping("/error") + public String error() { + return "error/404.html"; + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/MenuController.java b/src/main/java/com/bomaos/common/system/controller/MenuController.java new file mode 100644 index 0000000..042b27e --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/MenuController.java @@ -0,0 +1,154 @@ +package com.bomaos.common.system.controller; + +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.common.system.entity.Menu; +import com.bomaos.common.system.service.MenuService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 菜单管理 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Controller +@RequestMapping("/sys/menu") +public class MenuController extends BaseController { + @Autowired + private MenuService menuService; + + @RequiresPermissions("sys:menu:view") + @RequestMapping() + public String view() { + return "system/menu.html"; + } + + /** + * 分页查询菜单 + */ + @OperLog(value = "菜单管理", desc = "分页查询") + @RequiresPermissions("sys:menu:list") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.setDefaultOrder(new String[]{"sort_number"}, null); + return menuService.listPage(pageParam); + } + + /** + * 查询全部菜单 + */ + @OperLog(value = "菜单管理", desc = "查询全部") + @RequiresPermissions("sys:menu:list") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.setDefaultOrder(new String[]{"sort_number"}, null); + return JsonResult.ok().setData(menuService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询菜单 + */ + @OperLog(value = "菜单管理", desc = "根据id查询") + @RequiresPermissions("sys:menu:list") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(menuService.getById(id)); + } + + /** + * 添加菜单 + */ + @OperLog(value = "菜单管理", desc = "添加", param = false, result = true) + @RequiresPermissions("sys:menu:save") + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Menu menu) { + if (menuService.save(menu)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改菜单 + */ + @OperLog(value = "菜单管理", desc = "修改", param = false, result = true) + @RequiresPermissions("sys:menu:update") + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Menu menu) { + if (menuService.updateById(menu)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除菜单 + */ + @OperLog(value = "菜单管理", desc = "删除", result = true) + @RequiresPermissions("sys:menu:remove") + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (menuService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加菜单 + */ + @OperLog(value = "菜单管理", desc = "批量添加", param = false, result = true) + @RequiresPermissions("sys:menu:save") + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List menuList) { + if (menuService.saveBatch(menuList)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改菜单 + */ + @OperLog(value = "菜单管理", desc = "批量修改", result = true) + @RequiresPermissions("sys:menu:update") + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(menuService, "menu_id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除菜单 + */ + @OperLog(value = "菜单管理", desc = "批量删除", result = true) + @RequiresPermissions("sys:menu:remove") + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (menuService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/OperRecordController.java b/src/main/java/com/bomaos/common/system/controller/OperRecordController.java new file mode 100644 index 0000000..89dd5da --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/OperRecordController.java @@ -0,0 +1,75 @@ +package com.bomaos.common.system.controller; + +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.OperRecord; +import com.bomaos.common.system.service.OperRecordService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 操作日志 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Controller +@RequestMapping("/sys/operRecord") +public class OperRecordController extends BaseController { + @Autowired + private OperRecordService operLogService; + + @RequiresPermissions("sys:oper_record:view") + @RequestMapping() + public String view() { + return "system/oper-record.html"; + } + + /** + * 分页查询操作日志 + */ + @OperLog(value = "操作日志", desc = "分页查询") + @RequiresPermissions("sys:oper_record:view") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.setDefaultOrder(null, new String[]{"create_time"}); + return operLogService.listPage(pageParam); + } + + /** + * 查询全部操作日志 + */ + @OperLog(value = "操作日志", desc = "查询全部") + @RequiresPermissions("sys:oper_record:view") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + List records = operLogService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.sortRecords(records)); + } + + /** + * 根据id查询操作日志 + */ + @OperLog(value = "操作日志", desc = "根据id查询") + @RequiresPermissions("sys:oper_record:view") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + PageParam pageParam = new PageParam<>(); + pageParam.put("id", id); + List records = operLogService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.getOne(records)); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/OrganizationController.java b/src/main/java/com/bomaos/common/system/controller/OrganizationController.java new file mode 100644 index 0000000..423a4ad --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/OrganizationController.java @@ -0,0 +1,183 @@ +package com.bomaos.common.system.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.common.system.entity.Organization; +import com.bomaos.common.system.service.DictionaryDataService; +import com.bomaos.common.system.service.OrganizationService; +import com.bomaos.common.system.service.RoleService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 组织机构管理 + * Created by AutoGenerator on 2020-03-14 11:29:04 + */ +@Controller +@RequestMapping("/sys/organization") +public class OrganizationController extends BaseController { + @Autowired + private OrganizationService organizationService; + @Autowired + private DictionaryDataService dictionaryDataService; + @Autowired + private RoleService roleService; + + @RequiresPermissions("sys:org:view") + @RequestMapping() + public String view(Model model) { + model.addAttribute("sexList", dictionaryDataService.listByDictCode("sex")); + model.addAttribute("organizationTypeList", dictionaryDataService.listByDictCode("organization_type")); + model.addAttribute("rolesJson", JSON.toJSONString(roleService.list())); + return "system/organization.html"; + } + + /** + * 分页查询组织机构 + */ + @OperLog(value = "机构管理", desc = "分页查询") + @RequiresPermissions("sys:org:list") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return organizationService.listPage(pageParam); + } + + /** + * 查询全部组织机构 + */ + @OperLog(value = "机构管理", desc = "查询全部") + @RequiresPermissions("sys:org:list") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + List records = organizationService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.sortRecords(records)); + } + + /** + * 根据id查询组织机构 + */ + @OperLog(value = "机构管理", desc = "根据id查询") + @RequiresPermissions("sys:org:list") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + PageParam pageParam = new PageParam<>(); + pageParam.put("organizationId", id); + List records = organizationService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.getOne(records)); + } + + /** + * 添加组织机构 + */ + @OperLog(value = "机构管理", desc = "添加", param = false, result = true) + @RequiresPermissions("sys:org:save") + @ResponseBody + @RequestMapping("/save") + public JsonResult add(Organization organization) { + if (organization.getParentId() == null) organization.setParentId(0); + if (organizationService.count(new QueryWrapper() + .eq("organization_name", organization.getOrganizationName()) + .eq("parent_id", organization.getParentId())) > 0) { + return JsonResult.error("机构名称已存在"); + } + if (organizationService.save(organization)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改组织机构 + */ + @OperLog(value = "机构管理", desc = "修改", param = false, result = true) + @RequiresPermissions("sys:org:update") + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Organization organization) { + if (organization.getOrganizationName() != null) { + if (organization.getParentId() == null) organization.setParentId(0); + if (organizationService.count(new QueryWrapper() + .eq("organization_name", organization.getOrganizationName()) + .eq("parent_id", organization.getParentId()) + .ne("organization_id", organization.getOrganizationId())) > 0) { + return JsonResult.error("机构名称已存在"); + } + } + if (organizationService.updateById(organization)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除组织机构 + */ + @OperLog(value = "机构管理", desc = "删除", result = true) + @RequiresPermissions("sys:org:remove") + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (organizationService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加组织机构 + */ + @OperLog(value = "机构管理", desc = "批量添加", param = false, result = true) + @RequiresPermissions("sys:org:save") + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List organizationList) { + if (organizationService.saveBatch(organizationList)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改组织机构 + */ + @OperLog(value = "机构管理", desc = "批量修改", result = true) + @RequiresPermissions("sys:org:update") + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(organizationService, "organization_id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除组织机构 + */ + @OperLog(value = "机构管理", desc = "批量删除", result = true) + @RequiresPermissions("sys:org:remove") + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (organizationService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/RoleController.java b/src/main/java/com/bomaos/common/system/controller/RoleController.java new file mode 100644 index 0000000..d8bdc60 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/RoleController.java @@ -0,0 +1,174 @@ +package com.bomaos.common.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.utils.CoreUtil; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.Role; +import com.bomaos.common.system.service.RoleService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 角色管理 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Controller +@RequestMapping("/sys/role") +public class RoleController extends BaseController { + @Autowired + private RoleService roleService; + + @RequiresPermissions("sys:role:view") + @RequestMapping() + public String view() { + return "system/role.html"; + } + + /** + * 分页查询角色 + */ + @OperLog(value = "角色管理", desc = "分页查询") + @RequiresPermissions("sys:role:list") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return new PageResult<>(roleService.page(pageParam, pageParam.getWrapper()).getRecords(), pageParam.getTotal()); + } + + /** + * 查询全部角色 + */ + @OperLog(value = "角色管理", desc = "查询全部") + @RequiresPermissions("sys:role:list") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(roleService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询角色 + */ + @OperLog(value = "角色管理", desc = "根据id查询") + @RequiresPermissions("sys:role:list") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(roleService.getById(id)); + } + + /** + * 添加角色 + */ + @OperLog(value = "角色管理", desc = "添加", param = false, result = true) + @RequiresPermissions("sys:role:save") + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Role role) { + if (roleService.count(new QueryWrapper().eq("role_code", role.getRoleCode())) > 0) { + return JsonResult.error("角色标识已存在"); + } + if (roleService.count(new QueryWrapper().eq("role_name", role.getRoleName())) > 0) { + return JsonResult.error("角色名称已存在"); + } + if (roleService.save(role)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改角色 + */ + @OperLog(value = "角色管理", desc = "修改", param = false, result = true) + @RequiresPermissions("sys:role:update") + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Role role) { + if (role.getRoleCode() != null && roleService.count(new QueryWrapper().eq("role_code", role.getRoleCode()) + .ne("role_id", role.getRoleId())) > 0) { + return JsonResult.error("角色标识已存在"); + } + if (role.getRoleName() != null && roleService.count(new QueryWrapper().eq("role_name", role.getRoleName()) + .ne("role_id", role.getRoleId())) > 0) { + return JsonResult.error("角色名称已存在"); + } + if (roleService.updateById(role)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除角色 + */ + @OperLog(value = "角色管理", desc = "删除", result = true) + @RequiresPermissions("sys:role:remove") + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (roleService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加角色 + */ + @OperLog(value = "角色管理", desc = "批量添加", param = false, result = true) + @RequiresPermissions("sys:role:save") + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + // 对集合本身进行非空和重复校验 + StringBuilder sb = new StringBuilder(); + sb.append(CoreUtil.listCheckBlank(list, "roleCode", "角色标识")); + sb.append(CoreUtil.listCheckBlank(list, "roleName", "角色名称")); + sb.append(CoreUtil.listCheckRepeat(list, "roleCode", "角色标识")); + sb.append(CoreUtil.listCheckRepeat(list, "roleName", "角色名称")); + if (sb.length() != 0) return JsonResult.error(sb.toString()); + // 数据库层面校验 + if (roleService.count(new QueryWrapper().in("role_code", + list.stream().map(Role::getRoleCode).collect(Collectors.toList()))) > 0) { + return JsonResult.error("角色标识已存在"); + } + if (roleService.count(new QueryWrapper().in("role_name", + list.stream().map(Role::getRoleName).collect(Collectors.toList()))) > 0) { + return JsonResult.error("角色名称已存在"); + } + if (roleService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量删除角色 + */ + @OperLog(value = "角色管理", desc = "批量删除", result = true) + @RequiresPermissions("sys:role:remove") + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (roleService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/RoleMenuController.java b/src/main/java/com/bomaos/common/system/controller/RoleMenuController.java new file mode 100644 index 0000000..b02b74d --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/RoleMenuController.java @@ -0,0 +1,119 @@ +package com.bomaos.common.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.exception.BusinessException; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.system.entity.Menu; +import com.bomaos.common.system.entity.RoleMenu; +import com.bomaos.common.system.service.MenuService; +import com.bomaos.common.system.service.RoleMenuService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.ArrayList; +import java.util.List; + +/** + * 角色菜单管理 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Controller +@RequestMapping("/sys/role/menu") +public class RoleMenuController extends BaseController { + @Autowired + private RoleMenuService roleMenuService; + @Autowired + private MenuService menuService; + + /** + * 查询角色菜单 + */ + @OperLog(value = "角色管理", desc = "查询角色菜单") + @RequiresPermissions("sys:role:list") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(Integer roleId) { + List menus = menuService.list(new QueryWrapper().orderByAsc("sort_number")); + List roleMenus = roleMenuService.list(new QueryWrapper().eq("role_id", roleId)); + for (Menu menu : menus) { + menu.setOpen(true); + menu.setChecked(false); + for (RoleMenu roleMenu : roleMenus) { + if (menu.getMenuId().equals(roleMenu.getMenuId())) { + menu.setChecked(true); + break; + } + } + } + return JsonResult.ok().setData(menus); + } + + /** + * 添加角色菜单 + */ + @OperLog(value = "角色管理", desc = "添加角色菜单") + @RequiresPermissions("sys:role:update") + @ResponseBody + @RequestMapping("/save") + public JsonResult addRoleAuth(Integer roleId, Integer menuId) { + RoleMenu roleMenu = new RoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(menuId); + if (roleMenuService.save(roleMenu)) { + return JsonResult.ok(); + } + return JsonResult.error(); + } + + /** + * 移除角色菜单 + */ + @OperLog(value = "角色管理", desc = "移除角色菜单") + @RequiresPermissions("sys:role:update") + @ResponseBody + @RequestMapping("/remove") + public JsonResult removeRoleAuth(Integer roleId, Integer menuId) { + if (roleMenuService.remove(new UpdateWrapper() + .eq("role_id", roleId).eq("menuId", menuId))) { + return JsonResult.ok(); + } + return JsonResult.error(); + } + + /** + * 批量修改角色菜单 + */ + @OperLog(value = "角色管理", desc = "修改角色菜单") + @RequiresPermissions("sys:role:update") + @Transactional + @ResponseBody + @RequestMapping("/update/{id}") + public JsonResult setRoleAuth(@PathVariable("id") Integer roleId, @RequestBody List menuIds) { + roleMenuService.remove(new UpdateWrapper().eq("role_id", roleId)); + if (menuIds.size() > 0) { + List roleMenuList = new ArrayList<>(); + for (Integer menuId : menuIds) { + RoleMenu roleMenu = new RoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(menuId); + roleMenuList.add(roleMenu); + } + if (roleMenuService.saveBatch(roleMenuList)) { + return JsonResult.ok("保存成功"); + } else { + throw new BusinessException("操作失败"); + } + } + return JsonResult.ok("保存成功"); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/SupplierController.java b/src/main/java/com/bomaos/common/system/controller/SupplierController.java new file mode 100644 index 0000000..dac0531 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/SupplierController.java @@ -0,0 +1,130 @@ +package com.bomaos.common.system.controller; + +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.common.system.entity.Supplier; +import com.bomaos.common.system.service.SupplierService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; + +/** + * 供应商管理 + */ +@Controller +@RequestMapping("/sys/supplier") +public class SupplierController extends BaseController { + + @Autowired + private SupplierService supplierService; + + @RequiresPermissions("sys:supplier:view") + @RequestMapping() + public String view() { + return "system/supplier.html"; + } + + /** + * 分页查询供应商 + */ + @RequiresPermissions("sys:supplier:list") + @OperLog(value = "供应商管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.setDefaultOrder(null, new String[]{"create_time"}); + return supplierService.listPage(pageParam); + } + + /** + * 查询全部供应商 + */ + @RequiresPermissions("sys:supplier:list") + @OperLog(value = "供应商管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + List records = supplierService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.sortRecords(records)); + } + + /** + * 根据id查询供应商 + */ + @RequiresPermissions("sys:supplier:list") + @OperLog(value = "供应商管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(supplierService.getById(id)); + } + + /** + * 添加供应商 + */ + @RequiresPermissions("sys:supplier:save") + @OperLog(value = "供应商管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Supplier supplier) { + supplier.setCreateTime(new Date()); + supplier.setUpdateTime(new Date()); + if (supplierService.save(supplier)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改供应商 + */ + @RequiresPermissions("sys:supplier:update") + @OperLog(value = "供应商管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Supplier supplier) { + supplier.setUpdateTime(new Date()); + if (supplierService.updateById(supplier)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除供应商 + */ + @RequiresPermissions("sys:supplier:remove") + @OperLog(value = "供应商管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (supplierService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量删除供应商 + */ + @RequiresPermissions("sys:supplier:remove") + @OperLog(value = "供应商管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (supplierService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + +} diff --git a/src/main/java/com/bomaos/common/system/controller/UserController.java b/src/main/java/com/bomaos/common/system/controller/UserController.java new file mode 100644 index 0000000..58f392e --- /dev/null +++ b/src/main/java/com/bomaos/common/system/controller/UserController.java @@ -0,0 +1,412 @@ +package com.bomaos.common.system.controller; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.poi.excel.ExcelReader; +import cn.hutool.poi.excel.ExcelUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.utils.CoreUtil; +import com.bomaos.common.core.web.*; +import com.bomaos.common.system.entity.DictionaryData; +import com.bomaos.common.system.entity.Organization; +import com.bomaos.common.system.entity.Role; +import com.bomaos.common.system.entity.User; +import com.bomaos.common.system.entity.Supplier; +import com.bomaos.common.system.service.*; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 用户管理 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Controller +@RequestMapping("/sys/user") +public class UserController extends BaseController { + @Autowired + private UserService userService; + @Autowired + private DictionaryDataService dictionaryDataService; + @Autowired + private RoleService roleService; + @Autowired + private OrganizationService organizationService; + @Autowired + private SupplierService supplierService; + + @RequiresPermissions("sys:user:view") + @RequestMapping() + public String view(Model model) { + model.addAttribute("sexList", dictionaryDataService.listByDictCode("sex")); + model.addAttribute("organizationTypeList", dictionaryDataService.listByDictCode("organization_type")); + model.addAttribute("rolesJson", JSON.toJSONString(roleService.list())); + model.addAttribute("supplierListJson", JSON.toJSONString(supplierService.list())); + return "system/user.html"; + } + + /** + * 个人中心 + */ + @RequestMapping("/info") + public String userInfo(Model model) { + model.addAttribute("user", userService.getFullById(getLoginUserId())); + model.addAttribute("sexList", dictionaryDataService.listByDictCode("sex")); + return "index/user-info.html"; + } + + /** + * 分页查询用户 + */ + @OperLog(value = "用户管理", desc = "分页查询") + @RequiresPermissions("sys:user:list") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.setDefaultOrder(null, new String[]{"create_time"}); + return userService.listPage(pageParam); + } + + /** + * 查询全部用户 + */ + @OperLog(value = "用户管理", desc = "查询全部") + @RequiresPermissions("sys:user:list") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + List records = userService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.sortRecords(records)); + } + + /** + * 根据id查询用户 + */ + @OperLog(value = "用户管理", desc = "根据id查询") + @RequiresPermissions("sys:user:list") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + PageParam pageParam = new PageParam<>(); + pageParam.put("userId", id); + List records = userService.listAll(pageParam.getNoPageParam()); + return JsonResult.ok().setData(pageParam.getOne(records)); + } + + /** + * 添加用户 + */ + @OperLog(value = "用户管理", desc = "添加", param = false, result = true) + @RequiresPermissions("sys:user:save") + @ResponseBody + @RequestMapping("/save") + public JsonResult save(@RequestBody User user) { + user.setState(0); + user.setPassword(userService.encodePsw(user.getPassword())); + if (userService.saveUser(user)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改用户 + */ + @OperLog(value = "用户管理", desc = "修改", param = false, result = true) + @RequiresPermissions("sys:user:update") + @ResponseBody + @RequestMapping("/update") + public JsonResult update(@RequestBody User user) { + user.setState(null); // 状态不能修改 + user.setPassword(null); // 密码不能修改 + user.setUsername(null); // 账号不能修改 + if (userService.updateUser(user)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除用户 + */ + @OperLog(value = "用户管理", desc = "删除", result = true) + @RequiresPermissions("sys:user:remove") + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (userService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量修改用户 + */ + @OperLog(value = "用户管理", desc = "批量修改", param = false, result = true) + @RequiresPermissions("sys:user:update") + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + // 不能修改的字段 + batchParam.getData().setPassword(null); + batchParam.getData().setState(null); + batchParam.getData().setUsername(null); + batchParam.getData().setPhone(null); + batchParam.getData().setEmail(null); + if (batchParam.update(userService, "user_id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除用户 + */ + @OperLog(value = "用户管理", desc = "批量删除", result = true) + @RequiresPermissions("sys:user:remove") + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (userService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 修改用户状态 + */ + @OperLog(value = "用户管理", desc = "修改状态", result = true) + @RequiresPermissions("sys:user:update") + @ResponseBody + @RequestMapping("/state/update") + public JsonResult updateState(Integer id, Integer state) { + if (state == null || (state != 0 && state != 1)) { + return JsonResult.error("状态值不正确"); + } + User user = new User(); + user.setUserId(id); + user.setState(state); + if (userService.updateById(user)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量修改用户状态 + */ + @OperLog(value = "用户管理", desc = "批量修改状态", result = true) + @RequiresPermissions("sys:user:update") + @ResponseBody + @RequestMapping("/state/updateBatch") + public JsonResult updateStateBatch(@RequestBody BatchParam batchParam) { + User user = new User(); + user.setState(batchParam.getData().getState()); + if (user.getState() == null || (user.getState() != 0 && user.getState() != 1)) { + return JsonResult.error("状态值不正确"); + } + if (batchParam.update(userService, "user_id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 重置密码 + */ + @OperLog(value = "用户管理", desc = "重置密码", param = false, result = true) + @RequiresPermissions("sys:user:update") + @ResponseBody + @RequestMapping("/psw/reset") + public JsonResult resetPsw(Integer id, String password) { + User user = new User(); + user.setUserId(id); + user.setPassword(userService.encodePsw(password)); + if (userService.updateById(user)) { + return JsonResult.ok("重置成功"); + } else { + return JsonResult.error("重置失败"); + } + } + + /** + * 批量重置密码 + */ + @OperLog(value = "用户管理", desc = "批量重置密码", param = false, result = true) + @RequiresPermissions("sys:user:update") + @ResponseBody + @RequestMapping("/psw/resetBatch") + public JsonResult resetPswBatch(@RequestBody BatchParam batchParam) { + User user = new User(); + user.setPassword(userService.encodePsw(batchParam.getData().getPassword())); + if (batchParam.update(userService, "user_id")) { + return JsonResult.ok("重置成功"); + } else { + return JsonResult.error("重置失败"); + } + } + + /** + * 修改自己密码 + */ + @OperLog(value = "用户管理", desc = "修改自己密码", param = false, result = true) + @ResponseBody + @RequestMapping("/psw/update") + public JsonResult updatePsw(String oldPsw, String newPsw) { + if (StrUtil.hasBlank(oldPsw, newPsw)) { + return JsonResult.error("参数不能为空"); + } + if (getLoginUserId() == null) { + return JsonResult.error("未登录"); + } + if (!userService.comparePsw(userService.getById(getLoginUserId()).getPassword(), oldPsw)) { + return JsonResult.error("原密码输入不正确"); + } + User user = new User(); + user.setUserId(getLoginUserId()); + user.setPassword(userService.encodePsw(newPsw)); + if (userService.updateById(user)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 修改自己资料 + */ + @OperLog(value = "用户管理", desc = "修改个人信息", param = false, result = true) + @ResponseBody + @RequestMapping("/info/update") + public JsonResult updateInfo(User user) { + user.setUserId(getLoginUserId()); + // 不能修改的字段 + user.setState(null); + user.setPassword(null); + user.setUsername(null); + user.setOrganizationId(null); + if (userService.updateById(user)) { + User loginUser = getLoginUser(); + if (user.getNickName() != null) loginUser.setNickName(user.getNickName()); + if (user.getAvatar() != null) loginUser.setAvatar(user.getAvatar()); + return JsonResult.ok("保存成功").setData(userService.getFullById(user.getUserId())); + } + return JsonResult.error("保存失败"); + } + + /** + * excel导入用户 + */ + @Transactional + @OperLog(value = "用户管理", desc = "excel导入", param = false, result = true) + @RequiresPermissions("sys:user:save") + @ResponseBody + @RequestMapping("/import") + public JsonResult importBatch(MultipartFile file) { + StringBuilder sb = new StringBuilder(); + try { + // 读取excel + int startRow = 1; + ExcelReader reader = ExcelUtil.getReader(file.getInputStream(), 0); + List> list = reader.read(startRow); + // 进行非空和重复检查 + sb.append(CoreUtil.excelCheckBlank(list, startRow, 0, 1, 2, 3, 4, 7)); + sb.append(CoreUtil.excelCheckRepeat(list, startRow, 0, 5, 6)); + if (!sb.toString().isEmpty()) return JsonResult.error(sb.toString()); + // 进行数据库层面检查 + List users = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + List objects = list.get(i); + String username = String.valueOf(objects.get(0)); // 账号 + String password = String.valueOf(objects.get(1)); // 密码 + String nickName = String.valueOf(objects.get(2)); // 用户名 + String sexName = String.valueOf(objects.get(3)); // 性别 + String roleName = String.valueOf(objects.get(4)); // 角色名 + String phone = String.valueOf(objects.get(5)); // 手机号 + String email = String.valueOf(objects.get(6)); // 邮箱 + String orgName = String.valueOf(objects.get(7)); // 组织机构 + if (userService.count(new QueryWrapper().eq("username", username)) > 0) { + sb.append("第"); + sb.append(i + startRow + 1); + sb.append("行第1"); + sb.append("列账号已存在;\r\n"); + } + if (StrUtil.isNotBlank(phone) && userService.count(new QueryWrapper().eq("phone", phone)) > 0) { + sb.append("第"); + sb.append(i + startRow + 1); + sb.append("行第6"); + sb.append("列手机号已存在;\r\n"); + } + if (StrUtil.isNotBlank(email) && userService.count(new QueryWrapper().eq("email", email)) > 0) { + sb.append("第"); + sb.append(i + startRow + 1); + sb.append("行第7"); + sb.append("列邮箱已存在;\r\n"); + } + User user = new User(); + user.setUsername(username); + user.setNickName(nickName); + user.setPassword(userService.encodePsw(password)); + user.setState(0); + user.setPhone(phone); + user.setEmail(email); + DictionaryData sexDictData = dictionaryDataService.listByDictCodeAndName("sex", sexName); + if (sexDictData == null) { + sb.append("第"); + sb.append(i + startRow + 1); + sb.append("行第4"); + sb.append("列性别不存在;\r\n"); + } else { + user.setSex(sexDictData.getDictDataId()); + } + Role role = roleService.getOne(new QueryWrapper().eq("role_name", roleName), false); + if (role == null) { + sb.append("第"); + sb.append(i + startRow + 1); + sb.append("行第5"); + sb.append("列角色不存在;\r\n"); + } else { + user.setRoleIds(Collections.singletonList(role.getRoleId())); + } + Organization org = organizationService.getOne(new QueryWrapper().eq("organization_full_name", orgName), false); + if (org == null) { + sb.append("第"); + sb.append(i + startRow + 1); + sb.append("行第8"); + sb.append("列机构不存在;\r\n"); + } else { + user.setOrganizationId(org.getOrganizationId()); + } + users.add(user); + } + if (!sb.toString().isEmpty()) return JsonResult.error(sb.toString()); + // 开始添加用户 + int okNum = 0, errorNum = 0; + for (User user : users) { + if (userService.saveUser(user)) okNum++; + else errorNum++; + } + return JsonResult.ok("导入完成,成功" + okNum + "条,失败" + errorNum + "条"); + } catch (IOException e) { + e.printStackTrace(); + } + return JsonResult.error("导入失败"); + } + +} diff --git a/src/main/java/com/bomaos/common/system/entity/Dictionary.java b/src/main/java/com/bomaos/common/system/entity/Dictionary.java new file mode 100644 index 0000000..0df38ac --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/Dictionary.java @@ -0,0 +1,131 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典 + * Created by Panyoujie on 2020-03-14 11:29:03 + */ +@TableName("sys_dictionary") +public class Dictionary implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 字典id + */ + @TableId(value = "dict_id", type = IdType.AUTO) + private Integer dictId; + /** + * 字典标识 + */ + private String dictCode; + /** + * 字典名称 + */ + private String dictName; + /** + * 排序号 + */ + private Integer sortNumber; + /** + * 备注 + */ + private String comments; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 是否删除,0否,1是 + */ + @TableLogic + private Integer deleted; + + public Integer getDictId() { + return dictId; + } + + public void setDictId(Integer dictId) { + this.dictId = dictId; + } + + public String getDictCode() { + return dictCode; + } + + public void setDictCode(String dictCode) { + this.dictCode = dictCode; + } + + public String getDictName() { + return dictName; + } + + public void setDictName(String dictName) { + this.dictName = dictName; + } + + public Integer getSortNumber() { + return sortNumber; + } + + public void setSortNumber(Integer sortNumber) { + this.sortNumber = sortNumber; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public Integer getDeleted() { + return deleted; + } + + public void setDeleted(Integer deleted) { + this.deleted = deleted; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "Dictionary{" + + ", dictId=" + dictId + + ", dictCode=" + dictCode + + ", dictName=" + dictName + + ", sortNumber=" + sortNumber + + ", comments=" + comments + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deleted=" + deleted + + "}"; + } + +} diff --git a/src/main/java/com/bomaos/common/system/entity/DictionaryData.java b/src/main/java/com/bomaos/common/system/entity/DictionaryData.java new file mode 100644 index 0000000..b19acd5 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/DictionaryData.java @@ -0,0 +1,169 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典项 + * Created by Panyoujie on 2020-03-14 11:29:04 + */ +@TableName("sys_dictionary_data") +public class DictionaryData implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 字典项id + */ + @TableId(value = "dict_data_id", type = IdType.AUTO) + private Integer dictDataId; + /** + * 字典id + */ + private Integer dictId; + /** + * 字典项标识 + */ + private String dictDataCode; + /** + * 字典项名称 + */ + private String dictDataName; + /** + * 排序号 + */ + private Integer sortNumber; + /** + * 备注 + */ + private String comments; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 是否删除,0否,1是 + */ + @TableLogic + private Integer deleted; + /** + * 字典代码 + */ + @TableField(exist = false) + private String dictCode; + /** + * 字典名称 + */ + @TableField(exist = false) + private String dictName; + + public Integer getDictDataId() { + return dictDataId; + } + + public void setDictDataId(Integer dictDataId) { + this.dictDataId = dictDataId; + } + + public Integer getDictId() { + return dictId; + } + + public void setDictId(Integer dictId) { + this.dictId = dictId; + } + + public String getDictDataCode() { + return dictDataCode; + } + + public void setDictDataCode(String dictDataCode) { + this.dictDataCode = dictDataCode; + } + + public String getDictDataName() { + return dictDataName; + } + + public void setDictDataName(String dictDataName) { + this.dictDataName = dictDataName; + } + + public Integer getSortNumber() { + return sortNumber; + } + + public void setSortNumber(Integer sortNumber) { + this.sortNumber = sortNumber; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getDeleted() { + return deleted; + } + + public void setDeleted(Integer deleted) { + this.deleted = deleted; + } + + public String getDictCode() { + return dictCode; + } + + public void setDictCode(String dictCode) { + this.dictCode = dictCode; + } + + public String getDictName() { + return dictName; + } + + public void setDictName(String dictName) { + this.dictName = dictName; + } + + @Override + public String toString() { + return "DictionaryData{" + + ", dictDataId=" + dictDataId + + ", dictId=" + dictId + + ", dictDataCode=" + dictDataCode + + ", dictDataName=" + dictDataName + + ", sortNumber=" + sortNumber + + ", comments=" + comments + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deleted=" + deleted + + ", dictCode=" + dictCode + + ", dictName=" + dictName + + "}"; + } + +} diff --git a/src/main/java/com/bomaos/common/system/entity/LoginRecord.java b/src/main/java/com/bomaos/common/system/entity/LoginRecord.java new file mode 100644 index 0000000..df33458 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/LoginRecord.java @@ -0,0 +1,173 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.util.Date; + +/** + * 登录日志 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@TableName("sys_login_record") +public class LoginRecord implements Serializable { + private static final long serialVersionUID = 1L; + public static final int TYPE_LOGIN = 0; // 登录 + public static final int TYPE_ERROR = 1; // 登录失败 + public static final int TYPE_LOGOUT = 2; // 退出登录 + public static final int TYPE_REFRESH = 3; // 刷新token + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 用户id + */ + private String username; + /** + * 操作系统 + */ + private String os; + /** + * 设备名 + */ + private String device; + /** + * 浏览器类型 + */ + private String browser; + /** + * ip地址 + */ + private String ip; + /** + * 操作类型,0登录成功,1登录失败,2退出登录,3刷新token + */ + private Integer operType; + /** + * 备注 + */ + private String comments; + /** + * 操作时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 用户昵称 + */ + @TableField(exist = false) + private String nickName; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public String getDevice() { + return device; + } + + public void setDevice(String device) { + this.device = device; + } + + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public Integer getOperType() { + return operType; + } + + public void setOperType(Integer operType) { + this.operType = operType; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + @Override + public String toString() { + return "LoginRecord{" + + ", id=" + id + + ", os=" + os + + ", device=" + device + + ", browser=" + browser + + ", ip=" + ip + + ", operType=" + operType + + ", comments=" + comments + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", username=" + username + + ", nickName=" + nickName + + "}"; + } +} diff --git a/src/main/java/com/bomaos/common/system/entity/Menu.java b/src/main/java/com/bomaos/common/system/entity/Menu.java new file mode 100644 index 0000000..4d3ba79 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/Menu.java @@ -0,0 +1,259 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 菜单 + * Created by AutoGenerator on 2018-12-24 16:10 + */ +@TableName("sys_menu") +public class Menu implements Serializable { + private static final long serialVersionUID = 1L; + public static final int TYPE_MENU = 0; // 菜单类型 + public static final int TYPE_BTN = 1; // 按钮类型 + /** + * 菜单id + */ + @TableId(value = "menu_id", type = IdType.AUTO) + private Integer menuId; + /** + * 上级id,0是顶级 + */ + private Integer parentId; + /** + * 菜单名称 + */ + private String menuName; + /** + * 菜单图标 + */ + private String menuIcon; + /** + * 图标颜色 + */ + private String iconColor; + /** + * 菜单地址 + */ + private String path; + /** + * 打开位置 + */ + private String target; + /** + * 是否隐藏,0否,1是 + */ + private Integer hide; + /** + * 排序号 + */ + private Integer sortNumber; + /** + * 权限标识 + */ + private String authority; + /** + * 菜单类型,0菜单,1按钮 + */ + private Integer menuType; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 是否删除,0否,1是 + */ + @TableLogic + private Integer deleted; + /** + * 上级菜单名称 + */ + @TableField(exist = false) + private String parentName; + /** + * 子菜单 + */ + @TableField(exist = false) + private List children; + /** + * 回显选中状态,0未选中,1选中 + */ + @TableField(exist = false) + private Boolean checked; + @TableField(exist = false) + private Boolean open; + + public Integer getMenuId() { + return menuId; + } + + public void setMenuId(Integer menuId) { + this.menuId = menuId; + } + + public Integer getParentId() { + return parentId; + } + + public void setParentId(Integer parentId) { + this.parentId = parentId; + } + + public String getMenuName() { + return menuName; + } + + public void setMenuName(String menuName) { + this.menuName = menuName; + } + + public String getIconColor() { + return iconColor; + } + + public void setIconColor(String iconColor) { + this.iconColor = iconColor; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getMenuIcon() { + return menuIcon; + } + + public void setMenuIcon(String menuIcon) { + this.menuIcon = menuIcon; + } + + public Integer getSortNumber() { + return sortNumber; + } + + public void setSortNumber(Integer sortNumber) { + this.sortNumber = sortNumber; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + + public Integer getHide() { + return hide; + } + + public void setHide(Integer hide) { + this.hide = hide; + } + + public String getAuthority() { + return authority; + } + + public void setAuthority(String authority) { + this.authority = authority; + } + + public Integer getMenuType() { + return menuType; + } + + public void setMenuType(Integer menuType) { + this.menuType = menuType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getDeleted() { + return deleted; + } + + public void setDeleted(Integer deleted) { + this.deleted = deleted; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public Boolean getChecked() { + return checked; + } + + public void setChecked(Boolean checked) { + this.checked = checked; + } + + public Boolean getOpen() { + return open; + } + + public void setOpen(Boolean open) { + this.open = open; + } + + @Override + public String toString() { + return "Menu{" + + ", menuId=" + menuId + + ", parentId=" + parentId + + ", menuName=" + menuName + + ", path=" + path + + ", menuIcon=" + menuIcon + + ", iconColor=" + iconColor + + ", sortNumber=" + sortNumber + + ", target=" + target + + ", hide=" + hide + + ", authority=" + authority + + ", menuType=" + menuType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deleted=" + deleted + + ", parentName=" + parentName + + "}"; + } + +} diff --git a/src/main/java/com/bomaos/common/system/entity/OperRecord.java b/src/main/java/com/bomaos/common/system/entity/OperRecord.java new file mode 100644 index 0000000..18d5d65 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/OperRecord.java @@ -0,0 +1,247 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@TableName("sys_oper_record") +public class OperRecord implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 用户id + */ + private Integer userId; + /** + * 模块 + */ + private String model; + /** + * 方法 + */ + private String description; + /** + * 请求地址 + */ + private String url; + /** + * 请求方式 + */ + private String requestMethod; + /** + * 调用方法 + */ + private String operMethod; + /** + * 请求参数 + */ + private String param; + /** + * 返回结果 + */ + private String result; + /** + * ip地址 + */ + private String ip; + /** + * 消耗时间,单位毫秒 + */ + private Long spendTime; + /** + * 状态,0成功,1异常 + */ + private Integer state; + /** + * 备注 + */ + private String comments; + /** + * 操作时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 用户昵称 + */ + @TableField(exist = false) + private String nickName; + /** + * 用户账号 + */ + @TableField(exist = false) + private String username; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getRequestMethod() { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) { + this.requestMethod = requestMethod; + } + + public String getOperMethod() { + return operMethod; + } + + public void setOperMethod(String operMethod) { + this.operMethod = operMethod; + } + + public String getParam() { + return param; + } + + public void setParam(String param) { + this.param = param; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public Long getSpendTime() { + return spendTime; + } + + public void setSpendTime(Long spendTime) { + this.spendTime = spendTime; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + @Override + public String toString() { + return "LoginRecord{" + + ", id=" + id + + ", userId=" + userId + + ", model=" + model + + ", description=" + description + + ", url=" + url + + ", requestMethod=" + requestMethod + + ", operMethod=" + operMethod + + ", param=" + param + + ", result=" + result + + ", ip=" + ip + + ", spendTime=" + spendTime + + ", state=" + state + + ", comments=" + comments + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", nickName=" + nickName + + "}"; + } +} diff --git a/src/main/java/com/bomaos/common/system/entity/Organization.java b/src/main/java/com/bomaos/common/system/entity/Organization.java new file mode 100644 index 0000000..cba690e --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/Organization.java @@ -0,0 +1,235 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +/** + * 组织机构 + * Created by AutoGenerator on 2020-03-14 11:29:04 + */ +@TableName("sys_organization") +public class Organization implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 机构id + */ + @TableId(value = "organization_id", type = IdType.AUTO) + private Integer organizationId; + /** + * 上级id,0是顶级 + */ + private Integer parentId; + /** + * 机构名称 + */ + private String organizationName; + /** + * 机构全称 + */ + private String organizationFullName; + + /** + * 机构代码 + */ + private String organizationCode; + /** + * 机构类型 + */ + private Integer organizationType; + /** + * 负责人id + */ + private Integer leaderId; + /** + * 排序号 + */ + private Integer sortNumber; + /** + * 备注 + */ + private String comments; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 是否删除,0否,1是 + */ + @TableLogic + private Integer deleted; + /** + * 负责人姓名 + */ + @TableField(exist = false) + private String leaderName; + /** + * 负责人账号 + */ + @TableField(exist = false) + private String leaderAccount; + /** + * 上级名称 + */ + @TableField(exist = false) + private String parentName; + /** + * 机构类型名称 + */ + @TableField(exist = false) + private String organizationTypeName; + + public Integer getOrganizationId() { + return organizationId; + } + + public void setOrganizationId(Integer organizationId) { + this.organizationId = organizationId; + } + + public Integer getParentId() { + return parentId; + } + + public void setParentId(Integer parentId) { + this.parentId = parentId; + } + + public String getOrganizationName() { + return organizationName; + } + + public void setOrganizationName(String organizationName) { + this.organizationName = organizationName; + } + + public String getOrganizationFullName() { + return organizationFullName; + } + + public void setOrganizationFullName(String organizationFullName) { + this.organizationFullName = organizationFullName; + } + + public String getOrganizationCode() { + return organizationCode; + } + + public void setOrganizationCode(String organizationCode) { + this.organizationCode = organizationCode; + } + + public Integer getOrganizationType() { + return organizationType; + } + + public void setOrganizationType(Integer organizationType) { + this.organizationType = organizationType; + } + + public Integer getLeaderId() { + return leaderId; + } + + public void setLeaderId(Integer leaderId) { + this.leaderId = leaderId; + } + + public Integer getSortNumber() { + return sortNumber; + } + + public void setSortNumber(Integer sortNumber) { + this.sortNumber = sortNumber; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getDeleted() { + return deleted; + } + + public void setDeleted(Integer deleted) { + this.deleted = deleted; + } + + public String getLeaderName() { + return leaderName; + } + + public void setLeaderName(String leaderName) { + this.leaderName = leaderName; + } + + public String getLeaderAccount() { + return leaderAccount; + } + + public void setLeaderAccount(String leaderAccount) { + this.leaderAccount = leaderAccount; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public String getOrganizationTypeName() { + return organizationTypeName; + } + + public void setOrganizationTypeName(String organizationTypeName) { + this.organizationTypeName = organizationTypeName; + } + + @Override + public String toString() { + return "Organization{" + + ", organizationId=" + organizationId + + ", parentId=" + parentId + + ", organizationName=" + organizationName + + ", organizationFullName=" + organizationFullName + + ", organizationType=" + organizationType + + ", leaderId=" + leaderId + + ", sortNumber=" + sortNumber + + ", comments=" + comments + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deleted=" + deleted + + ", leaderName=" + leaderName + + ", parentName=" + parentName + + ", organizationTypeName=" + organizationTypeName + + "}"; + } + +} diff --git a/src/main/java/com/bomaos/common/system/entity/Role.java b/src/main/java/com/bomaos/common/system/entity/Role.java new file mode 100644 index 0000000..a8f4860 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/Role.java @@ -0,0 +1,140 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +/** + * 角色 + * Created by AutoGenerator on 2018-12-24 16:10 + */ +@TableName("sys_role") +public class Role implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 角色id + */ + @TableId(value = "role_id", type = IdType.AUTO) + private Integer roleId; + /** + * 角色名称 + */ + private String roleName; + /** + * 角色标识 + */ + private String roleCode; + /** + * 备注 + */ + private String comments; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 是否删除,0否,1是 + */ + @TableLogic + private Integer deleted; + /** + * 用户id + */ + @TableField(exist = false) + private Integer userId; + + public Role() { + } + + public Role(Integer roleId, String roleName) { + this(roleId, roleName, null); + } + + public Role(Integer roleId, String roleName, String comments) { + this.roleId = roleId; + this.roleName = roleName; + this.comments = comments; + } + + public Integer getRoleId() { + return roleId; + } + + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleCode() { + return roleCode; + } + + public void setRoleCode(String roleCode) { + this.roleCode = roleCode; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getDeleted() { + return deleted; + } + + public void setDeleted(Integer deleted) { + this.deleted = deleted; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "Role{" + + ", roleId=" + roleId + + ", roleName=" + roleName + + ", comments=" + comments + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deleted=" + deleted + + ", userId=" + userId + + "}"; + } +} diff --git a/src/main/java/com/bomaos/common/system/entity/RoleMenu.java b/src/main/java/com/bomaos/common/system/entity/RoleMenu.java new file mode 100644 index 0000000..2014ae7 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/RoleMenu.java @@ -0,0 +1,90 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.util.Date; + +/** + * 角色权限 + * Created by AutoGenerator on 2018-12-24 16:10 + */ +@TableName("sys_role_menu") +public class RoleMenu implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 角色id + */ + private Integer roleId; + /** + * 菜单id + */ + private Integer menuId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getRoleId() { + return roleId; + } + + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + public Integer getMenuId() { + return menuId; + } + + public void setMenuId(Integer menuId) { + this.menuId = menuId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "RoleAuthorities{" + + ", id=" + id + + ", roleId=" + roleId + + ", menuId=" + menuId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + "}"; + } + +} diff --git a/src/main/java/com/bomaos/common/system/entity/Supplier.java b/src/main/java/com/bomaos/common/system/entity/Supplier.java new file mode 100644 index 0000000..c4dab90 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/Supplier.java @@ -0,0 +1,52 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 供应商 + */ +@Data +@ToString +@TableName("sys_supplier") +public class Supplier implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 自增ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 供应商名称 + */ + private String name; + + /** + * 联系方式 + */ + private String contact; + + /** + * 余额 + */ + private BigDecimal balance; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; +} diff --git a/src/main/java/com/bomaos/common/system/entity/User.java b/src/main/java/com/bomaos/common/system/entity/User.java new file mode 100644 index 0000000..91b087e --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/User.java @@ -0,0 +1,350 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 用户 + * Created by AutoGenerator on 2018-12-24 16:10 + */ +@TableName("sys_user") +public class User implements Serializable { + private static final long serialVersionUID = 242146703513492331L; + /** + * 用户id + */ + @TableId(value = "user_id", type = IdType.AUTO) + private Integer userId; + /** + * 账号 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 昵称 + */ + private String nickName; + /** + * 头像 + */ + private String avatar; + /** + * 性别 + */ + private Integer sex; + /** + * 手机号 + */ + private String phone; + /** + * 邮箱 + */ + private String email; + /** + * 邮箱是否验证,0否,1是 + */ + private Integer emailVerified; + /** + * 真实姓名 + */ + private String trueName; + /** + * 身份证号 + */ + private String idCard; + /** + * 出生日期 + */ + private Date birthday; + /** + * 个人简介 + */ + private String introduction; + /** + * 机构id + */ + private Integer organizationId; + /** + * 供应商id + */ + private Integer supplierId; + /** + * 状态,0正常,1冻结 + */ + private Integer state; + /** + * 注册时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 是否删除,0否,1是 + */ + @TableLogic + private Integer deleted; + /** + * 权限列表 + */ + @TableField(exist = false) + private List authorities; + /** + * 角色列表 + */ + @TableField(exist = false) + private List roles; + /** + * 角色id + */ + @TableField(exist = false) + private List roleIds; + /** + * 机构名称 + */ + @TableField(exist = false) + private String organizationName; + /** + * 性别名称 + */ + @TableField(exist = false) + private String sexName; + /** + * 供应商名称 + */ + @TableField(exist = false) + private String supplierName; + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Integer getEmailVerified() { + return emailVerified; + } + + public void setEmailVerified(Integer emailVerified) { + this.emailVerified = emailVerified; + } + + public String getTrueName() { + return trueName; + } + + public void setTrueName(String trueName) { + this.trueName = trueName; + } + + public String getIdCard() { + return idCard; + } + + public void setIdCard(String idCard) { + this.idCard = idCard; + } + + public Date getBirthday() { + return birthday; + } + + public void setBirthday(Date birthday) { + this.birthday = birthday; + } + + public String getIntroduction() { + return introduction; + } + + public void setIntroduction(String introduction) { + this.introduction = introduction; + } + + public Integer getOrganizationId() { + return organizationId; + } + + public void setOrganizationId(Integer organizationId) { + this.organizationId = organizationId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getDeleted() { + return deleted; + } + + public void setDeleted(Integer deleted) { + this.deleted = deleted; + } + + public List getAuthorities() { + return authorities; + } + + public void setAuthorities(List authorities) { + this.authorities = authorities; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public String getOrganizationName() { + return organizationName; + } + + public void setOrganizationName(String organizationName) { + this.organizationName = organizationName; + } + + public String getSexName() { + return sexName; + } + + public void setSexName(String sexName) { + this.sexName = sexName; + } + + public Integer getSupplierId() { + return supplierId; + } + + public void setSupplierId(Integer supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + @Override + public String toString() { + return "User{" + + ", userId=" + userId + + ", username=" + username + + ", password=" + password + + ", nickName=" + nickName + + ", avatar=" + avatar + + ", sex=" + sex + + ", phone=" + phone + + ", email=" + email + + ", emailVerified=" + emailVerified + + ", trueName=" + trueName + + ", idCard=" + idCard + + ", birthday=" + birthday + + ", introduction=" + introduction + + ", organizationId=" + organizationId + + ", state=" + state + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deleted=" + deleted + + ", organizationName=" + organizationName + + "}"; + } + +} diff --git a/src/main/java/com/bomaos/common/system/entity/UserRole.java b/src/main/java/com/bomaos/common/system/entity/UserRole.java new file mode 100644 index 0000000..8c64070 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/entity/UserRole.java @@ -0,0 +1,104 @@ +package com.bomaos.common.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户角色 + * Created by AutoGenerator on 2018-12-24 16:10 + */ +@TableName("sys_user_role") +public class UserRole implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 用户id + */ + private Integer userId; + /** + * 角色id + */ + private Integer roleId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 角色名称 + */ + @TableField(exist = false) + private String roleName; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getRoleId() { + return roleId; + } + + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + @Override + public String toString() { + return "UserRole{" + + ", id=" + id + + ", userId=" + userId + + ", roleId=" + roleId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", roleName=" + roleName + + "}"; + } +} diff --git a/src/main/java/com/bomaos/common/system/mapper/DictionaryDataMapper.java b/src/main/java/com/bomaos/common/system/mapper/DictionaryDataMapper.java new file mode 100644 index 0000000..a8fae04 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/DictionaryDataMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.system.entity.DictionaryData; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 字典项Mapper接口 + * Created by Panyoujie on 2020-03-14 11:29:04 + */ +public interface DictionaryDataMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/DictionaryMapper.java b/src/main/java/com/bomaos/common/system/mapper/DictionaryMapper.java new file mode 100644 index 0000000..61240c3 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/DictionaryMapper.java @@ -0,0 +1,12 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.system.entity.Dictionary; + +/** + * 字典Mapper接口 + * Created by Panyoujie on 2020-03-14 11:29:03 + */ +public interface DictionaryMapper extends BaseMapper { + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/LoginRecordMapper.java b/src/main/java/com/bomaos/common/system/mapper/LoginRecordMapper.java new file mode 100644 index 0000000..2ee32ac --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/LoginRecordMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.system.entity.LoginRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 登录日志Mapper接口 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface LoginRecordMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/MenuMapper.java b/src/main/java/com/bomaos/common/system/mapper/MenuMapper.java new file mode 100644 index 0000000..df326e5 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/MenuMapper.java @@ -0,0 +1,26 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.system.entity.Menu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 菜单Mapper接口 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface MenuMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 根据用户id查询 + */ + List listByUserId(@Param("userId") Integer userId, @Param("menuType") Integer menuType); + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/OperRecordMapper.java b/src/main/java/com/bomaos/common/system/mapper/OperRecordMapper.java new file mode 100644 index 0000000..cd9ceea --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/OperRecordMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.system.entity.OperRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 操作日志Mapper接口 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface OperRecordMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/OrganizationMapper.java b/src/main/java/com/bomaos/common/system/mapper/OrganizationMapper.java new file mode 100644 index 0000000..cb44981 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/OrganizationMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.system.entity.Organization; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 组织机构Mapper接口 + * Created by Panyoujie on 2020-03-14 11:29:04 + */ +public interface OrganizationMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/RoleMapper.java b/src/main/java/com/bomaos/common/system/mapper/RoleMapper.java new file mode 100644 index 0000000..5c327ce --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/RoleMapper.java @@ -0,0 +1,12 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.system.entity.Role; + +/** + * 角色Mapper接口 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface RoleMapper extends BaseMapper { + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/RoleMenuMapper.java b/src/main/java/com/bomaos/common/system/mapper/RoleMenuMapper.java new file mode 100644 index 0000000..13130b5 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/RoleMenuMapper.java @@ -0,0 +1,12 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.system.entity.RoleMenu; + +/** + * 角色权限Mapper接口 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface RoleMenuMapper extends BaseMapper { + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/SupplierMapper.java b/src/main/java/com/bomaos/common/system/mapper/SupplierMapper.java new file mode 100644 index 0000000..f85094a --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/SupplierMapper.java @@ -0,0 +1,26 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.system.entity.Supplier; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 供应商Mapper接口 + */ +public interface SupplierMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/UserMapper.java b/src/main/java/com/bomaos/common/system/mapper/UserMapper.java new file mode 100644 index 0000000..bdfb7ad --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/UserMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.system.entity.User; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 用户Mapper接口 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface UserMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/UserRoleMapper.java b/src/main/java/com/bomaos/common/system/mapper/UserRoleMapper.java new file mode 100644 index 0000000..e7c743a --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/UserRoleMapper.java @@ -0,0 +1,31 @@ +package com.bomaos.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.system.entity.Role; +import com.bomaos.common.system.entity.UserRole; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户角色Mapper接口 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface UserRoleMapper extends BaseMapper { + + /** + * 批量添加用户角色 + */ + int insertBatch(@Param("userId") Integer userId, @Param("roleIds") List roleIds); + + /** + * 批量查询用户角色 + */ + List listByUserIds(@Param("userIds") List userIds); + + /** + * 查询某个用户的角色 + */ + List listByUserId(@Param("userId") Integer userId); + +} diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/DictionaryDataMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/DictionaryDataMapper.xml new file mode 100644 index 0000000..dfd9a86 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/DictionaryDataMapper.xml @@ -0,0 +1,63 @@ + + + + + + + SELECT a.*, b.dict_code, b.dict_name + FROM sys_dictionary_data a + LEFT JOIN sys_dictionary b ON a.dict_id = b.dict_id + + + + AND a.dict_data_id = #{page.pageData.dictDataId} + + + AND a.dict_id = #{page.pageData.dictId} + + + AND a.dict_data_code = #{page.pageData.dictDataCode} + + + AND a.dict_data_name = #{page.pageData.dictDataName} + + + AND a.sort_number = #{page.pageData.sortNumber} + + + AND a.comments = #{page.pageData.comments} + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND a.deleted = #{page.pageData.deleted} + + + AND a.deleted = 0 + + + AND b.dict_code = #{page.pageData.dictCode} + + + AND b.dict_name = #{page.pageData.dictName} + + + AND b.deleted = 0 + + + + + + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/DictionaryMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/DictionaryMapper.xml new file mode 100644 index 0000000..26b07ed --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/DictionaryMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/LoginRecordMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/LoginRecordMapper.xml new file mode 100644 index 0000000..7f16f69 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/LoginRecordMapper.xml @@ -0,0 +1,41 @@ + + + + + + + SELECT a.*, b.nick_name + FROM sys_login_record a + LEFT JOIN sys_user b ON a.username = b.username + + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND b.username LIKE CONCAT('%', #{page.pageData.username}, '%') + + + AND b.nick_name LIKE CONCAT('%', #{page.pageData.nickName}, '%') + + + AND a.id = #{page.pageData.id} + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/MenuMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/MenuMapper.xml new file mode 100644 index 0000000..a8b99a1 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/MenuMapper.xml @@ -0,0 +1,60 @@ + + + + + + SELECT a.*, b.menu_name parent_name + FROM sys_menu a + LEFT JOIN sys_menu b ON a.parent_id = b.menu_id + + + + AND a.menu_id = #{page.pageData.menuId} + + + AND a.parent_id = #{page.pageData.parentId} + + + AND a.menu_name LIKE CONCAT('%', #{page.pageData.menuName}, '%') + + + AND a.menu_url LIKE CONCAT('%', #{page.pageData.path}, '%') + + + AND a.authority LIKE CONCAT('%', #{page.pageData.authority}, '%') + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND a.deleted = #{page.pageData.deleted} + + + AND a.deleted = 0 + + + AND parent_name LIKE CONCAT('%', #{page.pageData.parentName}, '%') + + + + + + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/OperRecordMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/OperRecordMapper.xml new file mode 100644 index 0000000..d336733 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/OperRecordMapper.xml @@ -0,0 +1,41 @@ + + + + + + + SELECT a.*, b.nick_name, b.username + FROM sys_oper_record a + LEFT JOIN sys_user b ON a.user_id = b.user_id + + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND b.username LIKE CONCAT('%', #{page.pageData.username}, '%') + + + AND b.nick_name LIKE CONCAT('%', #{page.pageData.nickName}, '%') + + + AND a.id = #{page.pageData.id} + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/OrganizationMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/OrganizationMapper.xml new file mode 100644 index 0000000..eb8c59d --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/OrganizationMapper.xml @@ -0,0 +1,80 @@ + + + + + + + SELECT a.*, b.nick_name leader_name, b.username leader_account, c.organization_name parent_name, + d.dict_data_name organization_type_name + FROM sys_organization a + LEFT JOIN sys_user b ON a.leader_id = b.user_id + LEFT JOIN sys_organization c ON a.parent_id = c.organization_id + LEFT JOIN sys_dictionary_data d ON a.organization_type = d.dict_data_id + + + + AND a.organization_id = #{page.pageData.organizationId} + + + AND a.parent_id = #{page.pageData.parentId} + + + AND a.organization_name LIKE CONCAT('%', #{page.pageData.organizationName}, '%') + + + AND a.organization_full_name LIKE CONCAT('%', #{page.pageData.organizationFullName}, '%') + + + AND a.organization_type = #{page.pageData.organizationType} + + + AND a.leader_id = #{page.pageData.leaderId} + + + AND a.comments LIKE CONCAT('%', #{page.pageData.comments}, '%') + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND leader_name LIKE CONCAT('%', #{page.pageData.leaderName}, '%') + + + AND leader_account LIKE CONCAT('%', #{page.pageData.leaderAccount}, '%') + + + AND parent_name LIKE CONCAT('%', #{page.pageData.parentName}, '%') + + + AND organization_type_name LIKE CONCAT('%', #{page.pageData.organizationTypeName}, '%') + + + AND a.deleted = #{page.pageData.deleted} + + + AND a.deleted = 0 + + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/RoleMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/RoleMapper.xml new file mode 100644 index 0000000..54b29f6 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/RoleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/RoleMenuMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/RoleMenuMapper.xml new file mode 100644 index 0000000..92e76c8 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/RoleMenuMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/SupplierMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/SupplierMapper.xml new file mode 100644 index 0000000..d68fbe2 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/SupplierMapper.xml @@ -0,0 +1,34 @@ + + + + + + + SELECT a.* + FROM sys_supplier a + + + + AND a.id = #{page.pageData.id} + + + AND a.name LIKE CONCAT('%', #{page.pageData.name}, '%') + + + AND a.contact LIKE CONCAT('%', #{page.pageData.contact}, '%') + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/UserMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/UserMapper.xml new file mode 100644 index 0000000..984965d --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/UserMapper.xml @@ -0,0 +1,79 @@ + + + + + + + SELECT a.*, b.organization_name, c.dict_data_name sex_name, d.name supplier_name + FROM sys_user a + LEFT JOIN sys_organization b ON a.organization_id = b.organization_id + LEFT JOIN sys_dictionary_data c ON a.sex = c.dict_data_id + LEFT JOIN sys_supplier d ON a.supplier_id = d.id + + + + AND a.user_id = #{page.pageData.userId} + + + AND a.user_id IN (SELECT user_id FROM sys_user_role WHERE role_id=#{page.pageData.roleId}) + + + AND a.username LIKE CONCAT('%', #{page.pageData.username}, '%') + + + AND a.nick_name LIKE CONCAT('%', #{page.pageData.nickName}, '%') + + + AND a.phone LIKE CONCAT('%', #{page.pageData.phone}, '%') + + + AND a.email LIKE CONCAT('%', #{page.pageData.email}, '%') + + + AND a.true_name LIKE CONCAT('%', #{page.pageData.trueName}, '%') + + + AND a.id_card LIKE CONCAT('%', #{page.pageData.idCard}, '%') + + + AND a.sex = #{page.pageData.sex} + + + AND a.state = #{page.pageData.state} + + + AND a.organization_id = #{page.pageData.organizationId} + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND a.deleted = #{page.pageData.deleted} + + + AND a.deleted = 0 + + + AND b.organization_name LIKE CONCAT('%', #{page.pageData.organizationName}, '%') + + + AND a.supplier_id = #{page.pageData.supplierId} + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/common/system/mapper/xml/UserRoleMapper.xml b/src/main/java/com/bomaos/common/system/mapper/xml/UserRoleMapper.xml new file mode 100644 index 0000000..c0c8ce8 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/mapper/xml/UserRoleMapper.xml @@ -0,0 +1,29 @@ + + + + + + INSERT INTO sys_user_role(user_id, role_id) VALUES + + (#{userId}, #{roleId}) + + + + + + + + diff --git a/src/main/java/com/bomaos/common/system/service/DictionaryDataService.java b/src/main/java/com/bomaos/common/system/service/DictionaryDataService.java new file mode 100644 index 0000000..a292c30 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/DictionaryDataService.java @@ -0,0 +1,37 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.DictionaryData; + +import java.util.List; +import java.util.Map; + +/** + * 字典项服务类 + * Created by Panyoujie on 2020-03-14 11:29:04 + */ +public interface DictionaryDataService extends IService { + + /** + * 关联分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 关联查询所有 + */ + List listAll(Map page); + + /** + * 根据字典代码查询字典项 + */ + List listByDictCode(String dictCode); + + /** + * 根据字典代码和字典项名称查询字典项 + */ + DictionaryData listByDictCodeAndName(String dictCode, String name); + +} diff --git a/src/main/java/com/bomaos/common/system/service/DictionaryService.java b/src/main/java/com/bomaos/common/system/service/DictionaryService.java new file mode 100644 index 0000000..3a14169 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/DictionaryService.java @@ -0,0 +1,12 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.system.entity.Dictionary; + +/** + * 字典服务类 + * Created by Panyoujie on 2020-03-14 11:29:03 + */ +public interface DictionaryService extends IService { + +} diff --git a/src/main/java/com/bomaos/common/system/service/EmailService.java b/src/main/java/com/bomaos/common/system/service/EmailService.java new file mode 100644 index 0000000..d5a19b0 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/EmailService.java @@ -0,0 +1,42 @@ +package com.bomaos.common.system.service; + +import javax.mail.MessagingException; +import java.io.IOException; +import java.util.Map; + +/** + * 发送邮件 + * Created by Panyoujie on 2019-06-19 04:07 + */ +public interface EmailService { + /** + * 发送普通邮件 + * + * @param title 标题 + * @param content 内容 + * @param toEmails 收件人 + */ + void sendTextEmail(String title, String content, String[] toEmails); + + /** + * 发送富文本邮件 + * + * @param title 标题 + * @param html 富文本 + * @param toEmails 收件人 + */ + void sendFullTextEmail(String title, String html, String[] toEmails) throws MessagingException; + + /** + * 发送html模板邮件 + * + * @param title 标题 + * @param htmlPath html路径 + * @param map 填充数据 + * @param toEmails 收件人 + * @throws MessagingException MessagingException + * @throws IOException IOException + */ + void sendHtmlEmail(String title, String htmlPath, Map map, String[] toEmails) throws MessagingException, IOException; + +} diff --git a/src/main/java/com/bomaos/common/system/service/LoginRecordService.java b/src/main/java/com/bomaos/common/system/service/LoginRecordService.java new file mode 100644 index 0000000..f931156 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/LoginRecordService.java @@ -0,0 +1,46 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.LoginRecord; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** + * 登录日志服务类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface LoginRecordService extends IService { + + /** + * 关联分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 关联查询所有 + */ + List listAll(Map page); + + /** + * 添加登录日志 + * + * @param username 用户账号 + * @param type 操作类型 + * @param comments 备注 + * @param request HttpServletRequest + */ + void saveAsync(String username, Integer type, String comments, HttpServletRequest request); + + /** + * 添加登录成功的登录日志 + * + * @param username 用户账号 + * @param request HttpServletRequest + */ + void saveAsync(String username, HttpServletRequest request); + +} diff --git a/src/main/java/com/bomaos/common/system/service/MenuService.java b/src/main/java/com/bomaos/common/system/service/MenuService.java new file mode 100644 index 0000000..2055c0d --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/MenuService.java @@ -0,0 +1,39 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.Menu; + +import java.util.List; + +/** + * 菜单服务类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface MenuService extends IService { + + /** + * 关联分页查询菜单 + */ + PageResult listPage(PageParam pageParam); + + /** + * 根据用户id查询菜单列表 + * + * @param userId 用户id + * @param menuType 菜单类型,为null不筛选 + * @return List + */ + List getUserMenu(Integer userId, Integer menuType); + + /** + * 转化为树形结构 + * + * @param menus 菜单list + * @param parentId 最顶级id + * @return List + */ + List toMenuTree(List menus, Integer parentId); + +} diff --git a/src/main/java/com/bomaos/common/system/service/OperRecordService.java b/src/main/java/com/bomaos/common/system/service/OperRecordService.java new file mode 100644 index 0000000..5e93fd9 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/OperRecordService.java @@ -0,0 +1,32 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.OperRecord; + +import java.util.List; +import java.util.Map; + +/** + * 操作日志服务类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface OperRecordService extends IService { + + /** + * 关联分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 关联查询所有 + */ + List listAll(Map page); + + /** + * 异步添加 + */ + void saveAsync(OperRecord operRecord); + +} diff --git a/src/main/java/com/bomaos/common/system/service/OrganizationService.java b/src/main/java/com/bomaos/common/system/service/OrganizationService.java new file mode 100644 index 0000000..f68121d --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/OrganizationService.java @@ -0,0 +1,27 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.Organization; + +import java.util.List; +import java.util.Map; + +/** + * 组织机构服务类 + * Created by Panyoujie on 2020-03-14 11:29:04 + */ +public interface OrganizationService extends IService { + + /** + * 关联分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 关联查询所有 + */ + List listAll(Map page); + +} diff --git a/src/main/java/com/bomaos/common/system/service/RoleMenuService.java b/src/main/java/com/bomaos/common/system/service/RoleMenuService.java new file mode 100644 index 0000000..1b95ca6 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/RoleMenuService.java @@ -0,0 +1,12 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.system.entity.RoleMenu; + +/** + * 角色菜单服务类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface RoleMenuService extends IService { + +} diff --git a/src/main/java/com/bomaos/common/system/service/RoleService.java b/src/main/java/com/bomaos/common/system/service/RoleService.java new file mode 100644 index 0000000..df26ac8 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/RoleService.java @@ -0,0 +1,12 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.system.entity.Role; + +/** + * 角色服务类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface RoleService extends IService { + +} diff --git a/src/main/java/com/bomaos/common/system/service/SupplierService.java b/src/main/java/com/bomaos/common/system/service/SupplierService.java new file mode 100644 index 0000000..5352108 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/SupplierService.java @@ -0,0 +1,26 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.Supplier; + +import java.util.List; +import java.util.Map; + +/** + * 供应商服务类 + */ +public interface SupplierService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询全部 + */ + List listAll(Map page); + +} diff --git a/src/main/java/com/bomaos/common/system/service/UserRoleService.java b/src/main/java/com/bomaos/common/system/service/UserRoleService.java new file mode 100644 index 0000000..c777f35 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/UserRoleService.java @@ -0,0 +1,17 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.system.entity.UserRole; + +/** + * 用户角色服务类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface UserRoleService extends IService { + + /** + * 查询用户的角色id + */ + Integer[] getRoleIds(String userId); + +} diff --git a/src/main/java/com/bomaos/common/system/service/UserService.java b/src/main/java/com/bomaos/common/system/service/UserService.java new file mode 100644 index 0000000..a8eeb85 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/UserService.java @@ -0,0 +1,66 @@ +package com.bomaos.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.User; + +import java.util.List; +import java.util.Map; + +/** + * 用户服务类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +public interface UserService extends IService { + + /** + * 根据账号查询用户 + */ + User getByUsername(String username); + + /** + * 根据id查询用户(关联查询) + */ + User getFullById(Integer userId); + + /** + * 查询用户角色和权限 + */ + User selectRoleAndAuth(User user); + + /** + * 关联分页查询用户 + */ + PageResult listPage(PageParam page); + + /** + * 关联查询全部用户 + */ + List listAll(Map page); + + /** + * 添加用户(包含角色) + */ + boolean saveUser(User user); + + /** + * 修改用户(包含角色) + */ + boolean updateUser(User user); + + /** + * 比较用户密码 + * + * @param dbPsw 数据库存储的密码 + * @param inputPsw 用户输入的密码 + * @return boolean + */ + boolean comparePsw(String dbPsw, String inputPsw); + + /** + * md5加密用户密码 + */ + String encodePsw(String psw); + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/DictionaryDataServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/DictionaryDataServiceImpl.java new file mode 100644 index 0000000..7e5d21e --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/DictionaryDataServiceImpl.java @@ -0,0 +1,48 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.DictionaryData; +import com.bomaos.common.system.mapper.DictionaryDataMapper; +import com.bomaos.common.system.service.DictionaryDataService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 字典项服务实现类 + * Created by Panyoujie on 2020-03-14 11:29:04 + */ +@Service +public class DictionaryDataServiceImpl extends ServiceImpl implements DictionaryDataService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + + @Override + public List listByDictCode(String dictCode) { + PageParam pageParam = new PageParam<>(); + pageParam.put("dictCode", dictCode).setDefaultOrder(new String[]{"sort_number"}, null); + List records = baseMapper.listAll(pageParam.getNoPageParam()); + return pageParam.sortRecords(records); + } + + @Override + public DictionaryData listByDictCodeAndName(String dictCode, String dictDataName) { + PageParam pageParam = new PageParam<>(); + pageParam.put("dictCode", dictCode).put("dictDataName", dictDataName); + List records = baseMapper.listAll(pageParam.getNoPageParam()); + return pageParam.getOne(records); + } + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/DictionaryServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/DictionaryServiceImpl.java new file mode 100644 index 0000000..79c80d8 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/DictionaryServiceImpl.java @@ -0,0 +1,16 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.system.entity.Dictionary; +import com.bomaos.common.system.mapper.DictionaryMapper; +import com.bomaos.common.system.service.DictionaryService; +import org.springframework.stereotype.Service; + +/** + * 字典服务实现类 + * Created by Panyoujie on 2020-03-14 11:29:03 + */ +@Service +public class DictionaryServiceImpl extends ServiceImpl implements DictionaryService { + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/EmailServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/EmailServiceImpl.java new file mode 100644 index 0000000..b54a463 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/EmailServiceImpl.java @@ -0,0 +1,64 @@ +package com.bomaos.common.system.service.impl; + +import com.bomaos.common.system.service.EmailService; +import org.beetl.core.Configuration; +import org.beetl.core.GroupTemplate; +import org.beetl.core.Template; +import org.beetl.core.resource.ClasspathResourceLoader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.IOException; +import java.util.Map; + +/** + * 发送邮件 + * Created by Panyoujie on 2019-06-19 04:07 + */ +@Service +public class EmailServiceImpl implements EmailService { + @Value("${spring.mail.username}") + private String formEmail; // 发件人 + @Autowired + private JavaMailSender mailSender; + + @Override + public void sendTextEmail(String title, String content, String[] toEmails) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom(formEmail); + message.setTo(toEmails); + message.setSubject(title); + message.setText(content); + mailSender.send(message); + } + + @Override + public void sendFullTextEmail(String title, String html, String[] toEmails) throws MessagingException { + MimeMessage mimeMessage = mailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom(formEmail); + helper.setTo(toEmails); + helper.setSubject(title); + // 发送邮件 + helper.setText(html, true); + mailSender.send(mimeMessage); + } + + @Override + public void sendHtmlEmail(String title, String htmlPath, Map map, String[] toEmails) throws MessagingException, IOException { + ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader("templates/"); + Configuration cfg = Configuration.defaultConfiguration(); + GroupTemplate gt = new GroupTemplate(resourceLoader, cfg); + Template t = gt.getTemplate(htmlPath); // 加载html模板 + t.binding(map); // 填充数据 + String html = t.render(); // 获得渲染后的html + sendFullTextEmail(title, html, toEmails); // 发送邮件 + } + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/LoginRecordServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/LoginRecordServiceImpl.java new file mode 100644 index 0000000..c527b2f --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/LoginRecordServiceImpl.java @@ -0,0 +1,59 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.utils.UserAgentGetter; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.LoginRecord; +import com.bomaos.common.system.mapper.LoginRecordMapper; +import com.bomaos.common.system.service.LoginRecordService; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** + * 登录日志服务实现类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Service +public class LoginRecordServiceImpl extends ServiceImpl implements LoginRecordService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + + @Override + public void saveAsync(String username, Integer type, String comments, HttpServletRequest request) { + LoginRecord loginRecord = new LoginRecord(); + loginRecord.setUsername(username); + loginRecord.setOperType(type); + loginRecord.setComments(comments); + UserAgentGetter agentGetter = new UserAgentGetter(request); + loginRecord.setOs(agentGetter.getOS()); + loginRecord.setDevice(agentGetter.getDevice()); + loginRecord.setBrowser(agentGetter.getBrowser()); + loginRecord.setIp(agentGetter.getIp()); + saveAsync(loginRecord); + } + + @Override + public void saveAsync(String username, HttpServletRequest request) { + saveAsync(username, LoginRecord.TYPE_LOGIN, null, request); + } + + @Async + public void saveAsync(LoginRecord loginRecord) { + baseMapper.insert(loginRecord); + } + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/MenuServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/MenuServiceImpl.java new file mode 100644 index 0000000..4eb437c --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/MenuServiceImpl.java @@ -0,0 +1,42 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.Menu; +import com.bomaos.common.system.mapper.MenuMapper; +import com.bomaos.common.system.service.MenuService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 菜单服务实现类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Service +public class MenuServiceImpl extends ServiceImpl implements MenuService { + @Override + public PageResult listPage(PageParam pageParam) { + return new PageResult<>(baseMapper.listPage(pageParam), pageParam.getTotal()); + } + + @Override + public List getUserMenu(Integer userId, Integer menuType) { + return baseMapper.listByUserId(userId, menuType); + } + + @Override + public List toMenuTree(List menus, Integer parentId) { + List list = new ArrayList<>(); + for (Menu menu : menus) { + if (parentId.equals(menu.getParentId())) { + menu.setChildren(toMenuTree(menus, menu.getMenuId())); + list.add(menu); + } + } + return list; + } + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/OperRecordServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/OperRecordServiceImpl.java new file mode 100644 index 0000000..afe68f5 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/OperRecordServiceImpl.java @@ -0,0 +1,39 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.OperRecord; +import com.bomaos.common.system.mapper.OperRecordMapper; +import com.bomaos.common.system.service.OperRecordService; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 操作日志服务实现类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Service +public class OperRecordServiceImpl extends ServiceImpl implements OperRecordService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + + @Async + @Override + public void saveAsync(OperRecord operRecord) { + baseMapper.insert(operRecord); + } + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/OrganizationServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/OrganizationServiceImpl.java new file mode 100644 index 0000000..e716bc6 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/OrganizationServiceImpl.java @@ -0,0 +1,32 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.Organization; +import com.bomaos.common.system.mapper.OrganizationMapper; +import com.bomaos.common.system.service.OrganizationService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 组织机构服务实现类 + * Created by Panyoujie on 2020-03-14 11:29:04 + */ +@Service +public class OrganizationServiceImpl extends ServiceImpl implements OrganizationService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/RoleMenuServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/RoleMenuServiceImpl.java new file mode 100644 index 0000000..8131fb5 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/RoleMenuServiceImpl.java @@ -0,0 +1,16 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.system.entity.RoleMenu; +import com.bomaos.common.system.mapper.RoleMenuMapper; +import com.bomaos.common.system.service.RoleMenuService; +import org.springframework.stereotype.Service; + +/** + * 角色菜单服务实现类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Service +public class RoleMenuServiceImpl extends ServiceImpl implements RoleMenuService { + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/RoleServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..e6c0ce9 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/RoleServiceImpl.java @@ -0,0 +1,16 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.system.entity.Role; +import com.bomaos.common.system.mapper.RoleMapper; +import com.bomaos.common.system.service.RoleService; +import org.springframework.stereotype.Service; + +/** + * 角色服务实现类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Service +public class RoleServiceImpl extends ServiceImpl implements RoleService { + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/SupplierServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/SupplierServiceImpl.java new file mode 100644 index 0000000..0051f99 --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/SupplierServiceImpl.java @@ -0,0 +1,31 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.Supplier; +import com.bomaos.common.system.mapper.SupplierMapper; +import com.bomaos.common.system.service.SupplierService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 供应商服务实现类 + */ +@Service +public class SupplierServiceImpl extends ServiceImpl implements SupplierService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/UserRoleServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/UserRoleServiceImpl.java new file mode 100644 index 0000000..92c35cc --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/UserRoleServiceImpl.java @@ -0,0 +1,29 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.system.entity.UserRole; +import com.bomaos.common.system.mapper.UserRoleMapper; +import com.bomaos.common.system.service.UserRoleService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户角色服务实现类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Service +public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { + + @Override + public Integer[] getRoleIds(String userId) { + List userRoles = baseMapper.selectList(new QueryWrapper().eq("user_id", userId)); + Integer[] roleIds = new Integer[userRoles.size()]; + for (int i = 0; i < userRoles.size(); i++) { + roleIds[i] = userRoles.get(i).getRoleId(); + } + return roleIds; + } + +} diff --git a/src/main/java/com/bomaos/common/system/service/impl/UserServiceImpl.java b/src/main/java/com/bomaos/common/system/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..8a335ee --- /dev/null +++ b/src/main/java/com/bomaos/common/system/service/impl/UserServiceImpl.java @@ -0,0 +1,168 @@ +package com.bomaos.common.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.exception.BusinessException; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.Menu; +import com.bomaos.common.system.entity.Role; +import com.bomaos.common.system.entity.User; +import com.bomaos.common.system.entity.UserRole; +import com.bomaos.common.system.mapper.MenuMapper; +import com.bomaos.common.system.mapper.UserMapper; +import com.bomaos.common.system.mapper.UserRoleMapper; +import com.bomaos.common.system.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.DigestUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 用户服务实现类 + * Created by Panyoujie on 2018-12-24 16:10 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + @Autowired + private UserRoleMapper userRoleMapper; + @Autowired + private MenuMapper menuMapper; + + @Override + public User getByUsername(String username) { + return baseMapper.selectOne(new QueryWrapper().eq("username", username)); + } + + @Override + public User getFullById(Integer userId) { + List userList = baseMapper.listAll(new PageParam().put("userId", userId).getNoPageParam()); + if (userList == null || userList.size() == 0) return null; + return selectRoleAndAuth(userList.get(0)); + } + + @Override + public User selectRoleAndAuth(User user) { + user.setRoles(userRoleMapper.listByUserId(user.getUserId())); + List menus = menuMapper.listByUserId(user.getUserId(), null); + List auths = new ArrayList<>(); + for (Menu menu : menus) { + auths.add(menu.getAuthority()); + } + user.setAuthorities(auths); + return user; + } + + @Override + public PageResult listPage(PageParam page) { + List users = baseMapper.listPage(page); + // 查询用户的角色 + selectUserRoles(users); + return new PageResult<>(users, page.getTotal()); + } + + @Override + public List listAll(Map page) { + List users = baseMapper.listAll(page); + // 查询用户的角色 + selectUserRoles(users); + return users; + } + + @Transactional + @Override + public boolean saveUser(User user) { + if (user.getUsername() != null && baseMapper.selectCount(new QueryWrapper() + .eq("username", user.getUsername())) > 0) { + throw new BusinessException("账号已存在"); + } + if (user.getPhone() != null && baseMapper.selectCount(new QueryWrapper() + .eq("phone", user.getPhone())) > 0) { + throw new BusinessException("手机号已存在"); + } + if (user.getEmail() != null && baseMapper.selectCount(new QueryWrapper() + .eq("email", user.getEmail())) > 0) { + throw new BusinessException("邮箱已存在"); + } + boolean result = baseMapper.insert(user) > 0; + if (result && user.getRoleIds() != null) { + addUserRoles(user.getUserId(), user.getRoleIds(), false); + } + return result; + } + + @Transactional + @Override + public boolean updateUser(User user) { + if (user.getUsername() != null && baseMapper.selectCount(new QueryWrapper() + .eq("username", user.getUsername()).ne("user_id", user.getUserId())) > 0) { + throw new BusinessException("账号已存在"); + } + if (user.getPhone() != null && baseMapper.selectCount(new QueryWrapper() + .eq("phone", user.getPhone()).ne("user_id", user.getUserId())) > 0) { + throw new BusinessException("手机号已存在"); + } + if (user.getEmail() != null && baseMapper.selectCount(new QueryWrapper() + .eq("email", user.getEmail()).ne("user_id", user.getUserId())) > 0) { + throw new BusinessException("邮箱已存在"); + } + boolean result = baseMapper.updateById(user) > 0; + if (result && user.getRoleIds() != null) { + addUserRoles(user.getUserId(), user.getRoleIds(), true); + } + return result; + } + + @Override + public boolean comparePsw(String dbPsw, String inputPsw) { + return dbPsw != null && dbPsw.equals(encodePsw(inputPsw)); + } + + @Override + public String encodePsw(String psw) { + if (psw == null) return null; + return DigestUtils.md5DigestAsHex(psw.getBytes()); + } + + /** + * 查询用户的角色 + */ + private void selectUserRoles(List users) { + if (users != null && users.size() > 0) { + List userIds = new ArrayList<>(); + for (User one : users) { + userIds.add(one.getUserId()); + } + List userRoles = userRoleMapper.listByUserIds(userIds); + for (User user : users) { + List roles = new ArrayList<>(); + for (Role userRole : userRoles) { + if (user.getUserId().equals(userRole.getUserId())) { + roles.add(userRole); + } + } + user.setRoles(roles); + } + } + } + + /** + * 添加用户角色 + */ + private void addUserRoles(Integer userId, List roleIds, boolean deleteOld) { + if (deleteOld) { + userRoleMapper.delete(new UpdateWrapper().eq("user_id", userId)); + } + if (roleIds.size() > 0) { + if (userRoleMapper.insertBatch(userId, roleIds) < roleIds.size()) { + throw new BusinessException("操作失败"); + } + } + } + +} diff --git a/src/main/java/com/bomaos/content/controller/ArticleController.java b/src/main/java/com/bomaos/content/controller/ArticleController.java new file mode 100644 index 0000000..cfa146e --- /dev/null +++ b/src/main/java/com/bomaos/content/controller/ArticleController.java @@ -0,0 +1,212 @@ +package com.bomaos.content.controller; + +import com.alibaba.fastjson.JSON; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.content.entity.Article; +import com.bomaos.content.service.ArticleService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 文章表管理 + * Created by Panyoujie on 2021-11-08 04:44:45 + */ +@Controller +@RequestMapping("/content/article") +public class ArticleController extends BaseController { + + @Autowired + private ArticleService articleService; + + @RequiresPermissions("content:article:view") + @RequestMapping() + public String view() { + return "content/article.html"; + } + + @RequiresPermissions("content:article:view") + @RequestMapping("/addArticle") + public String addView() { + return "content/add-article.html"; + } + + /** + * 分页查询文章表 + */ + @RequiresPermissions("content:article:list") + @OperLog(value = "文章表管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult
page(HttpServletRequest request) { + PageParam
pageParam = new PageParam<>(request); + return new PageResult<>(articleService.page(pageParam, pageParam.getWrapper()).getRecords(), pageParam.getTotal()); + } + + /** + * 查询全部文章表 + */ + @RequiresPermissions("content:article:list") + @OperLog(value = "文章表管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam
pageParam = new PageParam<>(request); + return JsonResult.ok().setData(articleService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询文章表 + */ + @RequiresPermissions("content:article:list") + @OperLog(value = "文章表管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(articleService.getById(id)); + } + + /** + * 添加文章表 + */ + @RequiresPermissions("content:article:save") + @OperLog(value = "文章表管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Article article) { + article.setUserId(getLoginUserId()); + if (articleService.save(article)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改文章表 + */ + @RequiresPermissions("content:article:update") + @OperLog(value = "文章表管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Article article) { + if (articleService.updateById(article)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 修改文章表 + */ + @RequiresPermissions("content:article:view") + @RequestMapping("/editArticle/{articleId}") + public String editArticle(Model model, @PathVariable("articleId") Integer articleId) { + Article article = articleService.getById(articleId); + model.addAttribute("article", JSON.toJSONString(article)); + return "content/edit-article.html"; + } + + /** + * 修改文章表 + */ + @OperLog(value = "文章表管理", desc = "点赞文章", param = false, result = true) + @ResponseBody + @RequestMapping("/updateLike") + public JsonResult updateLike(Integer articleId) { + Article articleEntity = articleService.getById(articleId); + Article article = new Article(); + article.setId(articleId); + article.setLikes(articleEntity.getLikes() + 1); + if (articleService.updateById(article)) { + return JsonResult.ok("点赞成功!"); + } + return JsonResult.error("哎呀!点赞失败了。"); + } + + /** + * 删除文章表 + */ + @RequiresPermissions("content:article:remove") + @OperLog(value = "文章表管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (articleService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加文章表 + */ + @RequiresPermissions("content:article:save") + @OperLog(value = "文章表管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List
list) { + if (articleService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改文章表 + */ + @RequiresPermissions("content:article:update") + @OperLog(value = "文章表管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam
batchParam) { + if (batchParam.update(articleService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除文章表 + */ + @RequiresPermissions("content:article:remove") + @OperLog(value = "文章表管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (articleService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 修改状态 + */ + @OperLog(value = "文章表管理", desc = "修改状态", result = true) + @RequiresPermissions("content:article:update") + @ResponseBody + @RequestMapping("/status/update") + public JsonResult updateStates(Integer id, Integer status) { + if (status == null || (status != 0 && status != 1)) { + return JsonResult.error("状态值不正确"); + } + Article article = new Article(); + article.setId(id); + article.setEnabled(status); + if (articleService.updateById(article)) { + return JsonResult.ok("启用成功"); + } + return JsonResult.error("启用失败"); + } + + +} diff --git a/src/main/java/com/bomaos/content/controller/CarouselController.java b/src/main/java/com/bomaos/content/controller/CarouselController.java new file mode 100644 index 0000000..82be659 --- /dev/null +++ b/src/main/java/com/bomaos/content/controller/CarouselController.java @@ -0,0 +1,175 @@ +package com.bomaos.content.controller; + +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.content.entity.Carousel; +import com.bomaos.content.service.CarouselService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; + +/** + * 轮播图管理管理 + * Created by Panyoujie on 2021-11-10 02:54:31 + */ +@Controller +@RequestMapping("/content/carousel") +public class CarouselController extends BaseController { + @Autowired + private CarouselService carouselService; + + @RequiresPermissions("content:carousel:view") + @RequestMapping() + public String view() { + return "content/carousel.html"; + } + + /** + * 分页查询轮播图管理 + */ + @RequiresPermissions("content:carousel:list") + @OperLog(value = "轮播图管理管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return new PageResult<>(carouselService.page(pageParam, pageParam.getWrapper()).getRecords(), pageParam.getTotal()); + } + + /** + * 查询全部轮播图管理 + */ + @RequiresPermissions("content:carousel:list") + @OperLog(value = "轮播图管理管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(carouselService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询轮播图管理 + */ + @RequiresPermissions("content:carousel:list") + @OperLog(value = "轮播图管理管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(carouselService.getById(id)); + } + + /** + * 添加轮播图管理 + */ + @RequiresPermissions("content:carousel:save") + @OperLog(value = "轮播图管理管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Carousel carousel) { + carousel.setCreateTime(new Date()); + carousel.setUpdateTime(new Date()); + if (carouselService.save(carousel)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改轮播图管理 + */ + @RequiresPermissions("content:carousel:update") + @OperLog(value = "轮播图管理管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Carousel carousel) { + if (carouselService.updateById(carousel)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除轮播图管理 + */ + @RequiresPermissions("content:carousel:remove") + @OperLog(value = "轮播图管理管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (carouselService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加轮播图管理 + */ + @RequiresPermissions("content:carousel:save") + @OperLog(value = "轮播图管理管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (carouselService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改轮播图管理 + */ + @RequiresPermissions("content:carousel:update") + @OperLog(value = "轮播图管理管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(carouselService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除轮播图管理 + */ + @RequiresPermissions("content:carousel:remove") + @OperLog(value = "轮播图管理管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (carouselService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 修改状态 + */ + @OperLog(value = "轮播图管理", desc = "修改状态", result = true) + @RequiresPermissions("content:carousel:update") + @ResponseBody + @RequestMapping("/status/update") + public JsonResult updateStates(Integer id, Integer status) { + if (status == null || (status != 0 && status != 1)) { + return JsonResult.error("状态值不正确"); + } + Carousel carousel = new Carousel(); + carousel.setId(id); + carousel.setEnabled(status); + if (carouselService.updateById(carousel)) { + return JsonResult.ok("启用成功"); + } + return JsonResult.error("启用失败"); + } + +} diff --git a/src/main/java/com/bomaos/content/entity/Article.java b/src/main/java/com/bomaos/content/entity/Article.java new file mode 100644 index 0000000..4bdf5f7 --- /dev/null +++ b/src/main/java/com/bomaos/content/entity/Article.java @@ -0,0 +1,78 @@ +package com.bomaos.content.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Date; + +/** + * 文章表 + * Created by Panyoujie on 2021-11-08 04:44:45 + */ +@ToString +@Data +@TableName("sys_article") +public class Article implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 文章图片 + */ + private String picture; + + /** + * 文章标题 + */ + private String title; + + /** + * 摘要 + */ + private String excerpt; + + /** + * 文章内容 + */ + private String content; + + /** + * 点赞数 + */ + private Integer likes; + + /** + * 查看数量 + */ + private Integer seeNumber; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 用户uid + */ + private Integer userId; + + /** + * 是否启用 + */ + private Integer enabled; + +} diff --git a/src/main/java/com/bomaos/content/entity/Carousel.java b/src/main/java/com/bomaos/content/entity/Carousel.java new file mode 100644 index 0000000..3177b02 --- /dev/null +++ b/src/main/java/com/bomaos/content/entity/Carousel.java @@ -0,0 +1,63 @@ +package com.bomaos.content.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Date; + +/** + * 轮播图管理 + * Created by Panyoujie on 2021-11-10 02:54:31 + */ +@Data +@ToString +@TableName("sys_carousel") +public class Carousel implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 标题 + */ + private String title; + + /** + * 对应的链接地址 + */ + private String link; + + /** + * 图片地址 + */ + private String imageLogo; + + /** + * 简介 + */ + private String summary; + + /** + * 是否启用 + */ + private Integer enabled; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + +} diff --git a/src/main/java/com/bomaos/content/mapper/ArticleMapper.java b/src/main/java/com/bomaos/content/mapper/ArticleMapper.java new file mode 100644 index 0000000..529f0ca --- /dev/null +++ b/src/main/java/com/bomaos/content/mapper/ArticleMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.content.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.content.entity.Article; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 文章表Mapper接口 + * Created by Panyoujie on 2021-11-08 04:44:45 + */ +public interface ArticleMapper extends BaseMapper
{ + + /** + * 分页查询 + */ + List
listPage(@Param("page") PageParam
page); + + /** + * 查询全部 + */ + List
listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/content/mapper/CarouselMapper.java b/src/main/java/com/bomaos/content/mapper/CarouselMapper.java new file mode 100644 index 0000000..9bf4677 --- /dev/null +++ b/src/main/java/com/bomaos/content/mapper/CarouselMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.content.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.content.entity.Carousel; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 轮播图管理Mapper接口 + * Created by Panyoujie on 2021-11-10 02:54:31 + */ +public interface CarouselMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/content/mapper/xml/ArticleMapper.xml b/src/main/java/com/bomaos/content/mapper/xml/ArticleMapper.xml new file mode 100644 index 0000000..1d9aeac --- /dev/null +++ b/src/main/java/com/bomaos/content/mapper/xml/ArticleMapper.xml @@ -0,0 +1,58 @@ + + + + + + + SELECT a.* + FROM sys_article a + + + + AND a.id = #{page.pageData.id} + + + AND a.title LIKE CONCAT('%', #{page.pageData.title}, '%') + + + AND a.excerpt LIKE CONCAT('%', #{page.pageData.excerpt}, '%') + + + AND a.content LIKE CONCAT('%', #{page.pageData.content}, '%') + + + AND a.likes = #{page.pageData.likes} + + + AND a.see_number = #{page.pageData.seeNumber} + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND a.user_id = #{page.pageData.userId} + + + AND a.picture LIKE CONCAT('%', #{page.pageData.picture}, '%') + + + AND a.enabled = #{page.pageData.enabled} + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/content/mapper/xml/CarouselMapper.xml b/src/main/java/com/bomaos/content/mapper/xml/CarouselMapper.xml new file mode 100644 index 0000000..2ffcda8 --- /dev/null +++ b/src/main/java/com/bomaos/content/mapper/xml/CarouselMapper.xml @@ -0,0 +1,49 @@ + + + + + + + SELECT a.* + FROM sys_carousel a + + + + AND a.id = #{page.pageData.id} + + + AND a.title LIKE CONCAT('%', #{page.pageData.title}, '%') + + + AND a.link LIKE CONCAT('%', #{page.pageData.link}, '%') + + + AND a.image_logo LIKE CONCAT('%', #{page.pageData.imageLogo}, '%') + + + AND a.summary LIKE CONCAT('%', #{page.pageData.summary}, '%') + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND a.enabled = #{page.pageData.enabled} + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/content/service/ArticleService.java b/src/main/java/com/bomaos/content/service/ArticleService.java new file mode 100644 index 0000000..2b338d1 --- /dev/null +++ b/src/main/java/com/bomaos/content/service/ArticleService.java @@ -0,0 +1,27 @@ +package com.bomaos.content.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.content.entity.Article; + +import java.util.List; +import java.util.Map; + +/** + * 文章表服务类 + * Created by Panyoujie on 2021-11-08 04:44:45 + */ +public interface ArticleService extends IService
{ + + /** + * 分页查询 + */ + PageResult
listPage(PageParam
page); + + /** + * 查询所有 + */ + List
listAll(Map page); + +} diff --git a/src/main/java/com/bomaos/content/service/CarouselService.java b/src/main/java/com/bomaos/content/service/CarouselService.java new file mode 100644 index 0000000..7916cbe --- /dev/null +++ b/src/main/java/com/bomaos/content/service/CarouselService.java @@ -0,0 +1,27 @@ +package com.bomaos.content.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.content.entity.Carousel; + +import java.util.List; +import java.util.Map; + +/** + * 轮播图管理服务类 + * Created by Panyoujie on 2021-11-10 02:54:31 + */ +public interface CarouselService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + +} diff --git a/src/main/java/com/bomaos/content/service/impl/ArticleServiceImpl.java b/src/main/java/com/bomaos/content/service/impl/ArticleServiceImpl.java new file mode 100644 index 0000000..282b92a --- /dev/null +++ b/src/main/java/com/bomaos/content/service/impl/ArticleServiceImpl.java @@ -0,0 +1,41 @@ +package com.bomaos.content.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.content.entity.Article; +import com.bomaos.content.mapper.ArticleMapper; +import com.bomaos.content.service.ArticleService; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 文章表服务实现类 + * Created by Panyoujie on 2021-11-08 04:44:45 + */ +@Service +public class ArticleServiceImpl extends ServiceImpl implements ArticleService { + + @Override + public PageResult
listPage(PageParam
page) { + List
records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List
listAll(Map page) { + return baseMapper.listAll(page); + } + + @Override + public boolean save(Article entity) { + entity.setCreateTime(new Date()); + entity.setUpdateTime(new Date()); + entity.setLikes(0); + entity.setSeeNumber(0); + return super.save(entity); + } +} diff --git a/src/main/java/com/bomaos/content/service/impl/CarouselServiceImpl.java b/src/main/java/com/bomaos/content/service/impl/CarouselServiceImpl.java new file mode 100644 index 0000000..a8d65f4 --- /dev/null +++ b/src/main/java/com/bomaos/content/service/impl/CarouselServiceImpl.java @@ -0,0 +1,32 @@ +package com.bomaos.content.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.content.entity.Carousel; +import com.bomaos.content.mapper.CarouselMapper; +import com.bomaos.content.service.CarouselService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 轮播图管理服务实现类 + * Created by Panyoujie on 2021-11-10 02:54:31 + */ +@Service +public class CarouselServiceImpl extends ServiceImpl implements CarouselService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + +} diff --git a/src/main/java/com/bomaos/dashboard/DashboardController.java b/src/main/java/com/bomaos/dashboard/DashboardController.java new file mode 100644 index 0000000..4a3e8c2 --- /dev/null +++ b/src/main/java/com/bomaos/dashboard/DashboardController.java @@ -0,0 +1,314 @@ +package com.bomaos.dashboard; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bomaos.common.core.enmu.*; +import com.bomaos.common.core.utils.DateUtil; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.orders.entity.Orders; +import com.bomaos.orders.service.OrdersService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +@Controller +@RequestMapping("/dashboard") +public class DashboardController extends BaseController { + + @Autowired + private OrdersService ordersService; + + @RequiresPermissions("dashboard:user:view") + @RequestMapping("/workplace") + public String view(Model model) throws ParseException { + + /** + * 今日订单 + */ + Map orderList = getOrderList(ordersService); + Integer count = (Integer) orderList.get("count");// 今日成功订单数量 + BigDecimal money = (BigDecimal) orderList.get("money"); // 今日成功金额 + model.addAttribute("count", count); + model.addAttribute("money", money); + + /** + * 昨日订单 + */ + Map yesterDayOrder = getYesterDayOrder(ordersService); + Integer YesterDayCount = (Integer) yesterDayOrder.get("YesterDayCount");// 昨天成功订单数量 + BigDecimal YesterDayMoney = (BigDecimal) yesterDayOrder.get("YesterDayMoney"); // 昨天成功金额 + model.addAttribute("YesterDayCount", YesterDayCount); + model.addAttribute("YesterDayMoney", YesterDayMoney); + + /** + * 近七天订单 + */ + Map sevenDaysOrder = getSevenDaysOrder(ordersService); + Integer SevenDaysCount = (Integer) sevenDaysOrder.get("SevenDaysCount");// 近七天成功订单数量 + BigDecimal SevenDaysMoney = (BigDecimal) sevenDaysOrder.get("SevenDaysMoney"); // 近七天成功金额 + model.addAttribute("SevenDaysCount", SevenDaysCount); + model.addAttribute("SevenDaysMoney", SevenDaysMoney); + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM-dd"); + List dayList = new ArrayList<>(); // 天 + List wxpayList = new ArrayList<>(); // 每天微信的总金额 + List alipayList = new ArrayList<>(); // 每天支付宝的总金额 + List paypalList = new ArrayList<>(); // 每天贝宝的总金额 + List qqpayList = new ArrayList<>(); // 每天qq钱包的总金额 + List usdtList = new ArrayList<>(); // 每天usdt的总金额 + + Integer wxpayAll = 0; // 七天微信的交易量 + Integer alipayAll = 0; // 七天支付宝的交易量 + Integer paypalAll = 0; // 七天贝宝的交易量 + Integer qqpayAll = 0; // 七天贝宝的交易量 + Integer usdtAll = 0; // 七天贝宝的交易量 + + for (int i = 0; i < 7; i++) { + Date startDayTime = DateStrUtil.getStartDayTime(-+i); + Date endDayTime = DateStrUtil.getEndDayTime(-+i); + Map timeDayList = getTimeDayList(startDayTime, endDayTime, ordersService); + String day = simpleDateFormat.format(DateUtil.getStartDayTime(-+i)); + BigDecimal wxpay = timeDayList.get("wxpay"); + BigDecimal alipay = timeDayList.get("alipay"); + BigDecimal paypal = timeDayList.get("paypal"); + BigDecimal qqpay = timeDayList.get("qqpay"); + BigDecimal usdt = timeDayList.get("usdt"); + + Map timeDayCount = getTimeDayCount(startDayTime, endDayTime, ordersService); + Integer wxpay1 = timeDayCount.get("wxpay"); + Integer alipay1 = timeDayCount.get("alipay"); + Integer paypal1 = timeDayCount.get("paypal"); + Integer qqpay1 = timeDayCount.get("qqpay"); + Integer usdt1 = timeDayCount.get("usdt"); + + wxpayAll += wxpay1; + alipayAll += alipay1; + paypalAll += paypal1; + qqpayAll += qqpay1; + usdtAll += usdt1; + + wxpayList.add(wxpay); + alipayList.add(alipay); + paypalList.add(paypal); + qqpayList.add(qqpay); + usdtList.add(usdt); + dayList.add(day); + } + + List mapList = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("value", wxpayAll.toString()); + map.put("name", "微信"); + mapList.add(map); + + Map map1 = new HashMap<>(); + map1.put("value", alipayAll.toString()); + map1.put("name", "支付宝"); + mapList.add(map1); + + Map map2 = new HashMap<>(); + map2.put("value", paypalAll.toString()); + map2.put("name", "Paypal"); + mapList.add(map2); + + Map map3 = new HashMap<>(); + map3.put("value", qqpayAll.toString()); + map3.put("name", "QQ钱包 "); + mapList.add(map3); + + Map map4 = new HashMap<>(); + map4.put("value", usdtAll.toString()); + map4.put("name", "USDT "); + mapList.add(map4); + + List ordersList = ordersService.list(new QueryWrapper().ge("status", 1)); + BigDecimal total_amount = new BigDecimal(0.00); // 获取今天成功交易的订单交易额 + for (Orders orders : ordersList) { + total_amount = total_amount.add(new BigDecimal(orders.getMoney().toString())); // 统计今天的交易额 + } + + model.addAttribute("mapList", JSON.toJSONString(mapList)); + model.addAttribute("dayList", JSON.toJSONString(dayList)); + model.addAttribute("wxpayList", JSON.toJSONString(wxpayList)); + model.addAttribute("alipayList", JSON.toJSONString(alipayList)); + model.addAttribute("paypalList", JSON.toJSONString(paypalList)); + model.addAttribute("qqpayList", JSON.toJSONString(qqpayList)); + model.addAttribute("usdtList", JSON.toJSONString(usdtList)); + model.addAttribute("total_amount", total_amount.toString()); + model.addAttribute("total_number", ordersService.count(Wrappers.lambdaQuery().eq(Orders::getStatus, 1))); + + model.addAttribute("user", getLoginUser()); + return "dashboard/workplace.html"; + } + + /** + * 获取今天的交易订单 + * + * @return + */ + public static Map getOrderList(OrdersService ordersService) { + QueryWrapper queryWrapper = getQueryWrapper(DateStrUtil.getDayBegin(), DateStrUtil.getDayEnd()); + queryWrapper.ge("status", 1); + List orderList = ordersService.list(queryWrapper); + Integer count = 0; // 获取今天成功交易的订单数量 + BigDecimal money = new BigDecimal(0.00); // 获取今天成功交易的订单交易额 + for (Orders orders : orderList) { + money = money.add(new BigDecimal(orders.getMoney().toString())); // 统计今天的交易额 + count++; // 统计成功交易的订单数量 + } + + Map map = new HashMap<>(); + map.put("count", count); + map.put("money", money.setScale(2, BigDecimal.ROUND_HALF_DOWN)); + + return map; + } + + /** + * 获取昨天的交易订单 + * + * @return + */ + public static Map getYesterDayOrder(OrdersService ordersService) { + QueryWrapper queryWrapper = getQueryWrapper(DateStrUtil.getStartDayTime(-1), DateStrUtil.getEndDayTime(-1)); + queryWrapper.ge("status", 1); + + List orderList = ordersService.list(queryWrapper); + Integer count = 0; // 获取昨天成功交易的订单数量 + BigDecimal money = new BigDecimal(0.00); // 获取今天成功交易的订单交易额 + for (Orders orders : orderList) { + money = money.add(new BigDecimal(orders.getMoney().toString())); // 统计今天的交易额 + count++; // 统计昨天成功交易的订单数量 + } + + Map map = new HashMap<>(); + map.put("YesterDayCount", count); + map.put("YesterDayMoney", money.setScale(2, BigDecimal.ROUND_HALF_DOWN)); + + return map; + } + + /** + * 获取昨天的交易订单 + * + * @return + */ + public static Map getSevenDaysOrder(OrdersService ordersService) { + + QueryWrapper queryWrapper = getQueryWrapper(DateStrUtil.getStartDayTime(-7), DateStrUtil.getEndDayTime(-0)); + queryWrapper.ge("status", 1); + + List orderList = ordersService.list(queryWrapper); + + Integer count = 0; // 获取近七天成功交易的订单数量 + BigDecimal money = new BigDecimal(0.00); // 获取今天成功交易的订单交易额 + for (Orders orders : orderList) { + money = money.add(new BigDecimal(orders.getMoney().toString())); // 统计今天的交易额 + count++; // 统计近七天成功交易的订单数量 + } + + Map map = new HashMap<>(); + map.put("SevenDaysCount", count); + map.put("SevenDaysMoney", money.setScale(2, BigDecimal.ROUND_HALF_DOWN)); + + return map; + } + + public static Map getTimeDayList(Date StartTime, Date EndTime, OrdersService ordersService) { + QueryWrapper queryWrapper = getQueryWrapper(StartTime, EndTime); + queryWrapper.ge("status", 1); + + //查询当天所有支付记录 + List ordersList = ordersService.list(queryWrapper); + BigDecimal bigWxpay = new BigDecimal(0.00); + BigDecimal bigAlipay = new BigDecimal(0.00); + BigDecimal bigPaypal = new BigDecimal(0.00); + BigDecimal bigQQPay = new BigDecimal(0.00); + BigDecimal bigUSDT = new BigDecimal(0.00); + for (Orders orders : ordersList) { + if (Wxpay.getByValue(orders.getPayType())) { // 微信 + bigWxpay = bigWxpay.add(new BigDecimal(orders.getMoney().toString())).setScale(2, BigDecimal.ROUND_HALF_DOWN); + } else if (Alipay.getByValue(orders.getPayType())) { // 支付宝 + bigAlipay = bigAlipay.add(new BigDecimal(orders.getMoney().toString())).setScale(2, BigDecimal.ROUND_HALF_DOWN); + } else if (Paypal.getByValue(orders.getPayType())) { + bigPaypal = bigPaypal.add(new BigDecimal(orders.getMoney().toString())).setScale(2, BigDecimal.ROUND_HALF_DOWN); + } else if (QQPay.getByValue(orders.getPayType())) { + bigQQPay = bigQQPay.add(new BigDecimal(orders.getMoney().toString())).setScale(2, BigDecimal.ROUND_HALF_DOWN); + } else if (USDT.getByValue(orders.getPayType())) { + bigUSDT = bigUSDT.add(new BigDecimal(orders.getMoney().toString())).setScale(2, BigDecimal.ROUND_HALF_DOWN); + } + } + + Map map = new HashMap<>(); + map.put("wxpay", bigWxpay); + map.put("alipay", bigAlipay); + map.put("paypal", bigPaypal); + map.put("qqpay", bigQQPay); + map.put("usdt", bigUSDT); + return map; + } + + public static Map getTimeDayCount(Date StartTime, Date EndTime, OrdersService ordersService) { + QueryWrapper queryWrapper = getQueryWrapper(StartTime, EndTime); + queryWrapper.ge("status", 1); + + //查询当天所有支付记录 + List ordersList = ordersService.list(queryWrapper); + Integer wxpay = 0; + Integer alipay = 0; + Integer paypal = 0; + Integer qqpay = 0; + Integer usdt = 0; + for (Orders orders : ordersList) { + if (Wxpay.getByValue(orders.getPayType())) { // 微信 + wxpay++; + } else if (Alipay.getByValue(orders.getPayType())) { // 支付宝 + alipay++; + } else if (Paypal.getByValue(orders.getPayType())) { + paypal++; + } else if (QQPay.getByValue(orders.getPayType())) { + qqpay++; + } else if (USDT.getByValue(orders.getPayType())) { + usdt++; + } + } + + Map map = new HashMap<>(); + map.put("wxpay", wxpay); + map.put("alipay", alipay); + map.put("paypal", paypal); + map.put("qqpay", qqpay); + map.put("usdt", usdt); + return map; + } + + /** + * 根据时间查询今天的数据 + * + * @param StartTime 今天开始的时间 + * @param EndTime 今天结束的时间 + * @return queryWrapper + */ + public static QueryWrapper getQueryWrapper(Date StartTime, Date EndTime) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String DayStartTime = formatter.format(StartTime); + String DayEndTime = formatter.format(EndTime); + + //查询条件为时间范围 + queryWrapper.apply("UNIX_TIMESTAMP(create_time) >= UNIX_TIMESTAMP('" + DayStartTime + "')"); + queryWrapper.apply("UNIX_TIMESTAMP(create_time) < UNIX_TIMESTAMP('" + DayEndTime + "')"); + + return queryWrapper; + } + +} diff --git a/src/main/java/com/bomaos/dashboard/DateStrUtil.java b/src/main/java/com/bomaos/dashboard/DateStrUtil.java new file mode 100644 index 0000000..8b4be31 --- /dev/null +++ b/src/main/java/com/bomaos/dashboard/DateStrUtil.java @@ -0,0 +1,44 @@ +package com.bomaos.dashboard; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class DateStrUtil { + + // 获取当天的开始时间 + public static Date getDayBegin() { + Calendar cal = new GregorianCalendar(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + // 获取当天的结束时间 + public static Date getDayEnd() { + Calendar cal = new GregorianCalendar(); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + return cal.getTime(); + } + + // 根据天数来获取当天开始时间 + public static Date getStartDayTime(Integer day) { + Calendar cal = new GregorianCalendar(); + cal.setTime(getDayBegin()); + cal.add(Calendar.DAY_OF_MONTH, day); + return cal.getTime(); + } + + // 根据天数来获取当天结束时间 + public static Date getEndDayTime(Integer day) { + Calendar cal = new GregorianCalendar(); + cal.setTime(getDayEnd()); + cal.add(Calendar.DAY_OF_MONTH, day); + return cal.getTime(); + } + +} diff --git a/src/main/java/com/bomaos/orders/controller/OrdersController.java b/src/main/java/com/bomaos/orders/controller/OrdersController.java new file mode 100644 index 0000000..b0c3282 --- /dev/null +++ b/src/main/java/com/bomaos/orders/controller/OrdersController.java @@ -0,0 +1,658 @@ +package com.bomaos.orders.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bomaos.carmi.entity.Cards; +import com.bomaos.carmi.service.CardsService; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.enmu.*; +import com.bomaos.common.core.utils.DateUtil; +import com.bomaos.common.core.utils.FormCheckUtil; +import com.bomaos.common.core.utils.RequestParamsUtil; +import com.bomaos.common.core.web.*; +import com.bomaos.common.system.service.EmailService; +import com.bomaos.orders.entity.Orders; +import com.bomaos.orders.service.OrdersService; +import com.bomaos.orders.vo.OrdersVo; +import com.bomaos.products.entity.Products; +import com.bomaos.products.service.ProductsService; +import com.bomaos.reception.dto.SearchDTO; +import com.bomaos.settings.entity.ShopSettings; +import com.bomaos.settings.service.ShopSettingsService; +import com.bomaos.website.entity.Website; +import com.bomaos.website.service.WebsiteService; +import com.zjiecode.wxpusher.client.WxPusher; +import com.zjiecode.wxpusher.client.bean.Message; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.mail.MessagingException; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * 订单表管理 + * Created by Panyoujie on 2021-03-29 16:24:28 + */ +@Controller +@Transactional +@RequestMapping("/orders/orders") +public class OrdersController extends BaseController { + + @Autowired + private OrdersService ordersService; + + @Autowired + private ProductsService productsService; + + @Autowired + private CardsService cardsService; + + @Autowired + private EmailService emailService; + + @Autowired + private WebsiteService websiteService; + + @Autowired + private ShopSettingsService shopSettingsService; + + @RequiresPermissions("orders:orders:view") + @RequestMapping() + public String view() { + return "orders/orders.html"; + } + + /** + * 分页查询订单表 + */ + @RequiresPermissions("orders:orders:list") + @OperLog(value = "订单表管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public JsonResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.setDefaultOrder(null, new String[]{"create_time"}); + // 供应商数据隔离 + Integer supplierId = getLoginUserSupplierId(); + if (supplierId != null) { + pageParam.put("supplierId", supplierId); + } + PageResult ordersPageResult = ordersService.listPage(pageParam); + List ordersVoList = ordersPageResult.getData().stream().map((orders) -> { + OrdersVo ordersVo = new OrdersVo(); + BeanUtils.copyProperties(orders, ordersVo); + + if (orders.getPayTime() != null) { + ordersVo.setPayTime(DateUtil.getSubDateMiao(orders.getPayTime())); + } else { + ordersVo.setPayTime(null); + } + + ordersVo.setMoney(orders.getMoney().toString()); + + if (!StringUtils.isEmpty(orders.getAttachInfo())) { + String attachInfo = orders.getAttachInfo(); + boolean contains = attachInfo.contains(","); + List> mapList = new ArrayList<>(); + if (contains) { + String[] split = attachInfo.split(","); + for (String s : split) { + String[] split1 = s.split("="); + Map map = new HashMap<>(); + map.put("name", split1[0]); + if (split1.length == 2) { + map.put("value", split1[1]); + } else { + map.put("value", ""); + } + mapList.add(map); + } + ordersVo.setAttachInfoList(mapList); + } else { + String[] split1 = attachInfo.split("="); + Map map = new HashMap<>(); + map.put("name", split1[0]); + if (split1.length == 2) { + map.put("value", split1[1]); + } else { + map.put("value", ""); + } + mapList.add(map); + ordersVo.setAttachInfoList(mapList); + } + } + + return ordersVo; + }).collect(Collectors.toList()); + + BigDecimal totalAmount = new BigDecimal(0.00); + for (OrdersVo ordersVo : ordersVoList) { + if (ordersVo.getStatus() >= 1) { + totalAmount = totalAmount.add(new BigDecimal(ordersVo.getMoney())).setScale(2, BigDecimal.ROUND_HALF_DOWN); + } + } + Map totalRow = new HashMap<>(); + totalRow.put("money", totalAmount.toString()); + + return JsonResult.ok("查询成功!").put("totalRow", totalRow).put("count", ordersPageResult.getCount()).setData(ordersVoList); + } + + /** + * 分页查询 + */ + @OperLog(value = "管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/pageAll") + public JsonResult pageall(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + + Map parameterMap = RequestParamsUtil.getParameterMap(request); + String contact = (String) parameterMap.get("contact"); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("contact", contact) + .or().eq("email", contact) + .or().eq("member", contact) + .or().eq("pay_no", contact) + .orderByDesc("create_time"); + + List ordersList = ordersService.page(pageParam, wrapper).getRecords(); + + AtomicInteger index = new AtomicInteger(0); + List orderVosList = ordersList.stream().map((orders) -> { + SearchDTO searchDTO = new SearchDTO(); + searchDTO.setId(orders.getId()); + Integer andIncrement = index.getAndIncrement(); + searchDTO.setAndIncrement(andIncrement); + searchDTO.setCreateTime(DateUtil.getSubDateMiao(orders.getCreateTime())); + searchDTO.setMoney(orders.getMoney().toString()); + + if (Alipay.getByValue(orders.getPayType())) { + searchDTO.setPayType("支付宝"); + } else if (Wxpay.getByValue(orders.getPayType())) { + searchDTO.setPayType("微信"); + } else if (Paypal.getByValue(orders.getPayType())) { + searchDTO.setPayType("Paypal"); + } else if (QQPay.getByValue(orders.getPayType())) { + searchDTO.setPayType("QQ钱包"); + } else if (USDT.getByValue(orders.getPayType())) { + searchDTO.setPayType("USDT"); + } + + switch (orders.getStatus()) { + case 1: + searchDTO.setStatus("已支付"); + break; + case 2: + searchDTO.setStatus("待发货"); + break; + case 3: + searchDTO.setStatus("已发货"); + break; + default: + searchDTO.setStatus("未付款"); + break; + } + searchDTO.setMember(orders.getMember()); + return searchDTO; + }).collect(Collectors.toList()); + return JsonResult.ok("查询成功!").setData(orderVosList); + } + + /** + * 查询全部订单表 + */ + @RequiresPermissions("orders:orders:list") + @OperLog(value = "订单表管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(ordersService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询订单表 + */ + @RequiresPermissions("orders:orders:list") + @OperLog(value = "订单表管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(ordersService.getById(id)); + } + + /** + * 添加订单表 + */ + @RequiresPermissions("orders:orders:save") + @OperLog(value = "订单表管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Orders orders) { + if (ordersService.save(orders)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改卡密 + */ + @RequiresPermissions("orders:orders:update") + @OperLog(value = "订单表管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/updateCards") + public JsonResult updateCards(Orders orders) { + if (ordersService.updateById(orders)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 修改订单表 + */ + @RequiresPermissions("orders:orders:update") + @OperLog(value = "订单表管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Orders orders) { + if (ordersService.updateById(orders)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除订单表 + */ + @RequiresPermissions("orders:orders:remove") + @OperLog(value = "订单表管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (ordersService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加订单表 + */ + @RequiresPermissions("orders:orders:save") + @OperLog(value = "订单表管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (ordersService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改订单表 + */ + @RequiresPermissions("orders:orders:update") + @OperLog(value = "订单表管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(ordersService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除订单表 + */ + @RequiresPermissions("orders:orders:remove") + @OperLog(value = "订单表管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (ordersService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量删除订单表 + */ + @RequiresPermissions("orders:orders:remove") + @OperLog(value = "订单表管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/clearRemove") + public JsonResult clearRemove() { + if (ordersService.clearRemove()) { + return JsonResult.ok("清理未支付的订单成功!"); + } + return JsonResult.error("没有可以清理的订单!"); + } + + /** + * 批量删除订单表 + */ + @RequiresPermissions("orders:orders:remove") + @OperLog(value = "订单表管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/clearAllRemove") + public JsonResult clearAllRemove() { + if (ordersService.clearAllRemove()) { + return JsonResult.ok("清理的订单成功!"); + } + return JsonResult.error("没有可以清理的订单!"); + } + + /** + * 删除订单表 + */ + @RequiresPermissions("orders:orders:remove") + @OperLog(value = "订单表管理", desc = "订单删除", result = true) + @ResponseBody + @RequestMapping("/deleteById") + public JsonResult deleteById(Integer id) { + if (ordersService.deleteById(id)) { + return JsonResult.ok("删除订单成功!"); + } + return JsonResult.error("没有可以删除的订单!"); + } + + /** + * @param id 商品id + * @param shipInfo 需要发货的内容 + * @return + */ + @OperLog(value = "商品列表管理", desc = "手动发货", result = true) + @RequiresPermissions("orders:orders:update") + @ResponseBody + @RequestMapping("/sendShip") + public JsonResult sendShip(Integer id, String shipInfo) throws MessagingException, IOException { + + /** + * 查出订单 + */ + Orders orders = ordersService.getById(id); + Products products = productsService.getById(orders.getProductId()); // 查出对应的商品 + + Cards cards = new Cards(); + cards.setCardInfo(shipInfo); + cards.setCreatedAt(new Date()); + cards.setProductId(products.getId()); + cards.setSupplierId(products.getSupplierId()); + cards.setStatus(1); // 默认已使用 + cards.setNumber(0); + cards.setSellNumber(1); + cards.setUpdatedAt(new Date()); + + Orders orders1 = new Orders(); + orders1.setId(orders.getId()); + orders1.setStatus(3); + orders1.setCardsInfo(shipInfo); + + Website website = websiteService.getById(1); + ShopSettings shopSettings = shopSettingsService.getById(1); + + if (ordersService.updateById(orders1)) { + cardsService.save(cards); + /** + * 邮件通知 + * 后台开启邮件通知, + * 这里会给下单用户的邮箱发送一条邮件 + */ + if (shopSettings.getIsEmail() == 1) { + if (FormCheckUtil.isEmail(orders.getEmail())) { + try { + Map map = new HashMap<>(); // 页面的动态数据 + map.put("title", website.getWebsiteName()); + map.put("member", orders.getMember()); + map.put("date", DateUtil.getDate()); + map.put("password", orders.getPassword()); + map.put("url", website.getWebsiteUrl() + "/search/order/" + orders.getMember()); + emailService.sendHtmlEmail(website.getWebsiteName() + "发货提醒", "email/sendShip.html", map, new String[]{orders.getEmail()}); + } catch (Exception e) { + e.printStackTrace(); + return JsonResult.error("发货成功、邮箱提醒用户失败、请检查邮箱系统配置。"); + } + } + } + return JsonResult.ok("手动发货成功!"); + } + return JsonResult.error("手动发货失败!"); + } + + /** + * 修改商品状态 + */ + @OperLog(value = "商品列表管理", desc = "商品手动补单", result = true) + @RequiresPermissions("orders:orders:update") + @ResponseBody + @RequestMapping("/status/update") + public JsonResult updateStates(Integer id, String payNo, Integer productId) { + + Orders member = ordersService.getById(id); + if (member == null) { + return JsonResult.error("没有找到相关订单"); // 本地没有这个订单 + } + + if (member.getStatus() > 0) { + return JsonResult.error("已经支付成功!自动发卡成功,补单失败"); // 本地没有这个订单 + } + + boolean empty = StringUtils.isEmpty(member.getCardsInfo()); + if (!empty) { + return JsonResult.ok("已经支付成功!自动发卡成功,补单失败"); + } + + Products products = productsService.getById(productId); + if (products == null) { + return JsonResult.error("该订单的商品找不到!"); // 商品没了 + } + + Website website = websiteService.getById(1); + ShopSettings shopSettings = shopSettingsService.getById(1); + + /** + * 更新订单 + */ + Orders orders = new Orders(); + orders.setId(member.getId()); + orders.setPayTime(new Date()); + orders.setPayNo(payNo); + orders.setPrice(member.getPrice()); + orders.setMoney(member.getMoney()); + + if (products.getShipType() == 0) { // 自动发货的商品 + if (products.getSellType() == 0) { // 一次性卡密类型 + /** + * 卡密信息列表 + * 通过商品购买数量来获取对应商品的卡密数量 + */ + List cardsList = cardsService.getBaseMapper().selectList(new QueryWrapper() + .eq("status", 0) + .eq("product_id", products.getId()) + .eq("sell_type", 0) + .orderBy(true, false, "rand()") + .last("LIMIT " + member.getNumber() + "")); + + if (cardsList == null) { + return JsonResult.error("卡密为空!请补充后再试。"); + } + + StringBuilder orderInfo = new StringBuilder(); // 订单关联的卡密信息 + List updateCardsList = new ArrayList<>(); + for (Cards cards : cardsList) { + orderInfo.append(cards.getCardInfo()).append("\n"); // 通过StringBuilder 来拼接卡密信息 + + /** + * 设置每条被购买的卡密的售出状态 + */ + Cards cards1 = new Cards(); + cards1.setId(cards.getId()); + cards1.setStatus(1); + cards1.setNumber(0); + cards1.setSellNumber(1); + cards1.setUpdatedAt(new Date()); + + updateCardsList.add(cards1); + } + + // 去除多余尾部的逗号 + String result = orderInfo.deleteCharAt(orderInfo.length() - 1).toString(); + + orders.setCardsInfo(result); + orders.setStatus(1); // 设置已售出 + + // 更新售出的订单 + if (ordersService.updateById(orders)) { + // 设置售出的卡密 + cardsService.updateBatchById(updateCardsList); + } else { + return JsonResult.error("补单失败。"); + } + } else if (products.getSellType() == 1) { // 重复销售的卡密 + StringBuilder orderInfo = new StringBuilder(); // 订单关联的卡密信息 + + Cards cards = cardsService.getOne(new QueryWrapper() + .eq("product_id", products.getId()) + .eq("status", 0) + .eq("sell_type", 1)); + + if (cards == null) { + return JsonResult.error("卡密为空!请补充后再试。"); + } + + /** + * 设置每条被购买的卡密的售出状态 + */ + Cards cards1 = new Cards(); + cards1.setId(cards.getId()); + cards1.setUpdatedAt(new Date()); + if (cards.getNumber() == 1) { // 还剩下一个卡密 + cards1.setSellNumber(cards.getSellNumber() + member.getNumber()); + cards1.setNumber(cards.getNumber() - member.getNumber()); // 减完之后等于0 + cards1.setStatus(1); // 设置状态为已全部售出 + } else { + cards1.setSellNumber(cards.getSellNumber() + member.getNumber()); + cards1.setNumber(cards.getNumber() - member.getNumber()); + } + + /** + * 看用户购买了多少个卡密 + * 正常重复的卡密不会购买1个以上 + * 这里做个以防万一呀(有钱谁不赚) + */ + for (int i = 0; i < member.getNumber(); i++) { + orderInfo.append(cards.getCardInfo()).append("\n"); + } + + orders.setStatus(1); // 设置已售出 + orders.setCardsInfo(cards.getCardInfo()); + + // 设置售出的商品 + if (ordersService.updateById(orders)) { + cardsService.updateById(cards1); + } else { + return JsonResult.error("补单失败。"); + } + } + + /** + * 微信的 wxpush 通知 + * 本通知只针对站长 + * 当用户购买成功后会给您设置的 + * wxpush 微信公众号发送订单购买成功后的通知 + */ + if (shopSettings.getIsWxpusher() == 1) { + Message message = new Message(); + message.setContent(website.getWebsiteName() + "新订单提醒
订单号:" + member.getMember() + "
商品名称:" + products.getName() + "
购买数量:" + member.getNumber() + "
订单金额:" + member.getMoney() + "
支付状态:成功
"); + message.setContentType(Message.CONTENT_TYPE_HTML); + message.setUid(shopSettings.getWxpushUid()); + message.setAppToken(shopSettings.getAppToken()); + WxPusher.send(message); + } + + /** + * 邮件通知 + * 后台开启邮件通知, + * 这里会给下单用户的邮箱发送一条邮件 + */ + if (shopSettings.getIsEmail() == 1) { + if (!StringUtils.isEmpty(member.getEmail())) { + if (FormCheckUtil.isEmail(member.getEmail())) { + Map map = new HashMap<>(); // 页面的动态数据 + map.put("title", website.getWebsiteName()); + map.put("member", member.getMember()); + map.put("date", DateUtil.getDate()); + map.put("password", member.getPassword()); + map.put("url", website.getWebsiteUrl() + "/search/order/" + member.getMember()); + try { + emailService.sendHtmlEmail(website.getWebsiteName() + "发货提醒", "email/sendShip.html", map, new String[]{member.getEmail()}); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } else { // 手动发货商品 + Products products1 = new Products(); + products1.setId(products.getId()); + products1.setInventory(products.getInventory() - 1); + products1.setSales(products.getSales() + 1); + + orders.setStatus(2); // 手动发货模式 为待处理 + if (ordersService.updateById(orders)) { + // 更新售出 + productsService.updateById(products1); + } else { + return JsonResult.error("补单失败。"); + } + + /** + * 微信的 wxpush 通知 + * 本通知只针对站长 + * 当用户购买成功后会给您设置的 + * wxpush 微信公众号发送订单购买成功后的通知 + */ + if (shopSettings.getIsWxpusher() == 1) { + Message message = new Message(); + message.setContent(website.getWebsiteName() + "新订单提醒
订单号:" + member.getMember() + "
商品名称:" + products.getName() + "
订单金额:" + member.getMoney() + "
支付状态:成功
"); + message.setContentType(Message.CONTENT_TYPE_HTML); + message.setUid(shopSettings.getWxpushUid()); + message.setAppToken(shopSettings.getAppToken()); + WxPusher.send(message); + } + + /** + * 邮件通知 + * 后台开启邮件通知, + * 这里会给下单用户的邮箱发送一条邮件 + */ + if (shopSettings.getIsEmail() == 1) { + if (FormCheckUtil.isEmail(member.getEmail())) { + try { + emailService.sendTextEmail("订单提醒", "您的订单号为:" + member.getMember() + " 本商品为手动发货,请耐心等待!", new String[]{member.getEmail()}); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + return JsonResult.ok("补单成功!!"); + } + +} diff --git a/src/main/java/com/bomaos/orders/entity/Orders.java b/src/main/java/com/bomaos/orders/entity/Orders.java new file mode 100644 index 0000000..aa23dad --- /dev/null +++ b/src/main/java/com/bomaos/orders/entity/Orders.java @@ -0,0 +1,154 @@ +package com.bomaos.orders.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单表 + * Created by Panyoujie on 2021-03-29 16:24:28 + */ +@Data +@ToString +@TableName("sys_orders") +public class Orders implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 订单号 + */ + private String member; + + /** + * 状态 + */ + private Integer status; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 买家联系方式 + */ + private String contact; + + /** + * 商品id + */ + private Integer productId; + + /** + * 商品名称 + */ + private String productName; + + /** + * 发货模式 + */ + private Integer shipType; + + /** + * 订单数量 + */ + private Integer number; + + /** + * 支付类型 + */ + private String payType; + + /** + * 支付用户的id(如果有) + */ + private Integer guestId; + + /** + * 购买设备 + */ + private String device; + + /** + * 买家ip + */ + private String ip; + + /** + * 流水号 + */ + private String payNo; + + /** + * 付款金额 + */ + private BigDecimal money; + + /** + * 提交金额 + */ + private BigDecimal price; + + /** + * 订单创建时间 + */ + private Date createTime; + + /** + * 云端id + */ + private String cloudPayid; + + /** + * 邮件通知 + */ + private String email; + + /** + * 标记为使用优惠券 + */ + private Integer isCoupon; + + /** + * 优惠券id + */ + private Integer couponId; + + + /** + * 订单密码 + */ + private String password; + + /** + * 卡密信息 + */ + private String cardsInfo; + + /** + * 附加信息 + */ + private String attachInfo; + + /** + * 手续费 + */ + private BigDecimal handlingFee; + + /** + * 供应商id + */ + private Integer supplierId; +} diff --git a/src/main/java/com/bomaos/orders/mapper/OrdersMapper.java b/src/main/java/com/bomaos/orders/mapper/OrdersMapper.java new file mode 100644 index 0000000..72cea32 --- /dev/null +++ b/src/main/java/com/bomaos/orders/mapper/OrdersMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.orders.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.orders.entity.Orders; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 订单表Mapper接口 + * Created by Panyoujie on 2021-03-29 16:24:28 + */ +public interface OrdersMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/orders/mapper/xml/OrdersMapper.xml b/src/main/java/com/bomaos/orders/mapper/xml/OrdersMapper.xml new file mode 100644 index 0000000..a447179 --- /dev/null +++ b/src/main/java/com/bomaos/orders/mapper/xml/OrdersMapper.xml @@ -0,0 +1,97 @@ + + + + + + + SELECT a.* + FROM sys_orders a + + + + AND a.id = #{page.pageData.id} + + + AND a.member LIKE CONCAT('%', #{page.pageData.member}, '%') + + + AND a.status = #{page.pageData.status} + + + AND a.pay_time LIKE CONCAT('%', #{page.pageData.payTime}, '%') + + + AND a.contact LIKE CONCAT('%', #{page.pageData.contact}, '%') + + + AND a.ip LIKE CONCAT('%', #{page.pageData.ip}, '%') + + + AND a.goods_id = #{page.pageData.goodsId} + + + AND a.ship_type = #{page.pageData.shipType} + + + AND a.product_name LIKE CONCAT('%', #{page.pageData.productName}, '%') + + + AND a.pay_type LIKE CONCAT('%', #{page.pageData.payType}, '%') + + + AND a.guest_id = #{page.pageData.guestId} + + + AND a.device LIKE CONCAT('%', #{page.pageData.device}, '%') + + + AND a.pay_no LIKE CONCAT('%', #{page.pageData.payNo}, '%') + + + AND a.money LIKE CONCAT('%', #{page.pageData.money}, '%') + + + AND a.price LIKE CONCAT('%', #{page.pageData.price}, '%') + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND a.is_coupon = #{page.pageData.isCoupon} + + + AND a.coupon_id = #{page.pageData.couponId} + + + AND a.password LIKE CONCAT('%', #{page.pageData.password}, '%') + + + AND a.cards_info LIKE CONCAT('%', #{page.pageData.cardsInfo}, '%') + + + AND a.attach_info LIKE CONCAT('%', #{page.pageData.attachInfo}, '%') + + + AND a.handling_fee = #{page.pageData.handlingFee} + + + AND a.supplier_id = #{page.pageData.supplierId} + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/orders/service/OrdersService.java b/src/main/java/com/bomaos/orders/service/OrdersService.java new file mode 100644 index 0000000..ad5e996 --- /dev/null +++ b/src/main/java/com/bomaos/orders/service/OrdersService.java @@ -0,0 +1,37 @@ +package com.bomaos.orders.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.orders.entity.Orders; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** + * 订单表服务类 + * Created by Panyoujie on 2021-03-29 16:24:28 + */ +public interface OrdersService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + + Map buy(Integer goodsId, Integer number, String contact, Integer couponId, String payType, String password, HttpServletRequest request); + + Orders selectByMember(String member); + + boolean clearRemove(); + + boolean clearAllRemove(); + + boolean deleteById(Integer id); +} diff --git a/src/main/java/com/bomaos/orders/service/impl/OrdersServiceImpl.java b/src/main/java/com/bomaos/orders/service/impl/OrdersServiceImpl.java new file mode 100644 index 0000000..21c2764 --- /dev/null +++ b/src/main/java/com/bomaos/orders/service/impl/OrdersServiceImpl.java @@ -0,0 +1,291 @@ +package com.bomaos.orders.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.utils.*; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.dashboard.DateStrUtil; +import com.bomaos.orders.entity.Orders; +import com.bomaos.orders.mapper.OrdersMapper; +import com.bomaos.orders.service.OrdersService; +import com.bomaos.products.entity.Products; +import com.bomaos.products.mapper.ProductsMapper; +import com.bomaos.settings.entity.Coupon; +import com.bomaos.settings.entity.Pays; +import com.bomaos.settings.mapper.CouponMapper; +import com.bomaos.settings.mapper.PaysMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 订单表服务实现类 + * Created by Panyoujie on 2021-03-29 16:24:28 + */ +@Service +@Transactional +public class OrdersServiceImpl extends ServiceImpl implements OrdersService { + + private static final Logger logger = LoggerFactory.getLogger(OrdersServiceImpl.class); + + @Resource + private ProductsMapper productsMapper; + + @Resource + private CouponMapper couponMapper; + + @Resource + private PaysMapper paysMapper; + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + + /** + * 创建订单 + * + * @param productId 商品id + * @param number 购买数量 + * @param payType 支付驱动 + * @param request + * @return + */ + @Override + public Map buy(Integer productId, Integer number, String contact, Integer couponId, String payType, String password, HttpServletRequest request) { + + // 记得 map 第二个泛型是数组 要取 第一个元素 即[0] + Map params = RequestParamsUtil.getParameterMap(request); + + Products products = productsMapper.selectById(productId); + + Map map = new HashMap<>(); + + Orders orders = new Orders(); + + /** + * 是否为附加信息 + */ + Integer isCustomize = products.getIsCustomize(); + if (isCustomize == 1) { + String customizeInput = products.getCustomizeInput(); + String[] customize = customizeInput.split("\\n"); + + StringBuilder attachInfo = new StringBuilder(); + for (String s : customize) { + String[] split = s.split("="); + String s1 = params.get(split[0]); // get到提交过来的字段内容 + attachInfo.append(split[1]).append("=").append(s1).append(","); + } + + // 去除多余尾部的逗号 + String result = attachInfo.deleteCharAt(attachInfo.length() - 1).toString(); + orders.setAttachInfo(result); + } + + orders.setPrice(products.getPrice()); + orders.setStatus(0); // 1 为支付,0未支付 + orders.setProductId(productId); + orders.setProductName(products.getName()); + orders.setShipType(products.getShipType()); + orders.setSupplierId(products.getSupplierId()); + orders.setPayType(payType); + orders.setNumber(number); // 订单数量 + orders.setContact(contact); + if (!StringUtils.isEmpty(password)) { // 不为空的时候 + orders.setPassword(password); + } + + // 得到商品的实际支付金额 + BigDecimal multiply = products.getPrice().multiply(new BigDecimal(number)); + + // 判断是不是批发商品 + if (products.getIsWholesale() == 1) { + String wholesale = products.getWholesale(); + String[] split = wholesale.split("\\n"); + for (String s : split) { + String[] split1 = s.split("="); + if (number >= Integer.parseInt(split1[0])) { + multiply = new BigDecimal(split1[1]).multiply(new BigDecimal(number)); + } + } + } + + if (!StringUtils.isEmpty(couponId)) { + orders.setIsCoupon(1); // 1 为使用优惠了 + orders.setCouponId(couponId); + + /** + * 查出对应的优惠券 + */ + Coupon coupon = couponMapper.selectById(couponId); + + if (coupon.getDiscountType() == 0) { // 满减优惠券 + if (multiply.compareTo(coupon.getFullReduction()) > -1) { // 判断实际支付金额是否满足满减的对滴金额 + // 得到满减后的价格 + BigDecimal bigDecimal = multiply.subtract(coupon.getDiscountVal()).setScale(2, BigDecimal.ROUND_HALF_DOWN); + orders.setMoney(bigDecimal); + } else { + orders.setMoney(multiply); + } + } else { // 折扣优惠券 + if (multiply.compareTo(coupon.getFullReduction()) > -1) { // 判断实际支付金额是否满足满减的对滴金额 + BigDecimal bigDecimal = multiply.multiply(toPoint(coupon.getDiscountVal().toString()).setScale(2, BigDecimal.ROUND_HALF_DOWN)).setScale(2, BigDecimal.ROUND_HALF_DOWN); + orders.setMoney(bigDecimal); + } else { + orders.setMoney(multiply); + } + } + + Coupon coupon1 = new Coupon(); + coupon1.setId(coupon.getId()); + + // 判断优惠券 是一次性还是重复 + if (coupon.getType() == 0) { // 一次性 + coupon1.setStatus(1); // 设置为已使用 + couponMapper.updateById(coupon1); + } else { // 重复使用 + if (coupon.getCountAll() != 1) { // 表示最后一次使用 + coupon1.setCountAll(coupon.getCountAll() - 1); + coupon1.setCountUsed(coupon.getCountUsed() + 1); + } else { + coupon1.setCountAll(coupon.getCountAll() - 1); + coupon1.setCountUsed(coupon.getCountUsed() + 1); + coupon1.setStatus(1); // 设置为已使用 + } + couponMapper.updateById(coupon1); + } + } else { + orders.setMoney(multiply); + orders.setIsCoupon(0); // 1 为使用优惠了 + } + + /** + * 计算手续费 + */ + Pays pays = paysMapper.selectOne(Wrappers.lambdaQuery().eq(Pays::getDriver, orders.getPayType())); + if (!Objects.isNull(pays.getIsHandlingFee())) { + if (pays.getIsHandlingFee() == 1 && !Objects.isNull(pays.getHandlingFee())) { + BigDecimal handlingFee = orders.getMoney().multiply(toPoint100(pays.getHandlingFee().toString())).setScale(2, BigDecimal.ROUND_HALF_DOWN); + BigDecimal decimal = orders.getMoney().add(handlingFee).setScale(2, BigDecimal.ROUND_HALF_DOWN); + orders.setMoney(decimal); + orders.setHandlingFee(handlingFee); + } else { + orders.setHandlingFee(new BigDecimal(0.00)); + } + } else { + orders.setHandlingFee(new BigDecimal(0.00)); + } + + logger.info("订单数:{}", number); + logger.info("总价:{}", multiply); + logger.info("实际支付价格:{}", orders.getMoney()); + + /** + * 判断下是不是电子邮件 + * 如果是测写入到email entity + */ + if (FormCheckUtil.isEmail(contact)) { + orders.setEmail(contact); + } + + orders.setMember("TUD" + DateUtil.subData() + StringUtil.getRandomString(6)); + orders.setCreateTime(new Date()); + + UserAgentGetter agentGetter = new UserAgentGetter(request); + orders.setIp(agentGetter.getIp()); + orders.setDevice(agentGetter.getDevice()); + + baseMapper.insert(orders); + + map.put("total_price", multiply.toString()); + map.put("money", orders.getMoney().toString()); + map.put("member", orders.getMember()); + map.put("handling_fee", orders.getHandlingFee().toString()); + + return map; + } + + public static BigDecimal toPoint(String percent) { + percent = percent.replace("%", ""); + Double f = Double.valueOf(percent) / 10; + // Float f = Float.valueOf(percent) / 10; + BigDecimal decimal = new BigDecimal(f); + return decimal; + } + + public static BigDecimal toPoint100(String percent) { + percent = percent.replace("%", ""); + Double f = Double.valueOf(percent) / 100; + // Float f = Float.valueOf(percent) / 100; + BigDecimal decimal = new BigDecimal(f); + return decimal; + } + + @Override + public Orders selectByMember(String member) { + Orders orders = baseMapper.selectOne(new QueryWrapper().eq("member", member)); + return orders; + } + + @Override + public boolean clearRemove() { + QueryWrapper status = new QueryWrapper<>(); + status.eq("status", 0); + return baseMapper.delete(status) >= 1; + } + + @Override + public boolean clearAllRemove() { + Date startDayTime = DateStrUtil.getStartDayTime(-+6); + QueryWrapper queryWrapper = getQueryWrapper(startDayTime); + + List list = this.list(queryWrapper); + List ids = new ArrayList<>(); + for (Orders orders : list) { + ids.add(orders.getId()); + } + + boolean removeByIds = this.removeByIds(ids); + return removeByIds; + } + + @Override + public boolean deleteById(Integer id) { + return this.removeById(id); + } + + /** + * 根据时间查询七天前的数据 + * + * @param StartTime 开始的时间 + * @return queryWrapper + */ + public static QueryWrapper getQueryWrapper(Date StartTime) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String DayStartTime = formatter.format(StartTime); + + //查询条件为时间范围 + queryWrapper.apply("UNIX_TIMESTAMP(create_time) <= UNIX_TIMESTAMP('" + DayStartTime + "')"); + + return queryWrapper; + } +} diff --git a/src/main/java/com/bomaos/orders/vo/OrderVos.java b/src/main/java/com/bomaos/orders/vo/OrderVos.java new file mode 100644 index 0000000..4bde3f3 --- /dev/null +++ b/src/main/java/com/bomaos/orders/vo/OrderVos.java @@ -0,0 +1,141 @@ +package com.bomaos.orders.vo; + +import lombok.Data; +import lombok.ToString; +import org.springframework.beans.factory.annotation.Autowired; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@ToString +public class OrderVos { + + /** + * id + */ + private Integer id; + + /** + * 订单号 + */ + private String member; + + /** + * 状态 + */ + private String status; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 买家联系方式 + */ + private String contact; + + /** + * 买家ip + */ + private String ip; + + /** + * 商品id + */ + private Integer productId; + + /** + * 订单数量 + */ + @Autowired + private Integer number; + + /** + * 支付类型 + */ + private String payType; + + /** + * 支付用户的id(如果有) + */ + private Integer guestId; + + /** + * 购买设备 + */ + private String device; + + /** + * 流水号 + */ + private String payNo; + + /** + * 付款金额 + */ + private BigDecimal money; + + /** + * 提交金额 + */ + private BigDecimal price; + + /** + * 订单创建时间 + */ + private String createTime; + + /** + * 云端id + */ + private String cloudPayid; + + /** + * 邮件通知 + */ + private String email; + + /** + * 索引 + */ + private Integer andIncrement; + + + /** + * 标记为使用优惠券 + */ + private Integer isCoupon; + + /** + * 优惠券id + */ + private Integer couponId; + + /** + * 发货类型(0-自动,1-手动) + */ + private Integer shipType; + + /** + * 订单密码 + */ + private String password; + + /** + * 是否为密码的方式查询 + */ + private Integer isPassword; + + /** + * 附加信息 + */ + private String attachInfo; + + + /** + * 手续费 + */ + private BigDecimal handlingFee; +} diff --git a/src/main/java/com/bomaos/orders/vo/OrdersVo.java b/src/main/java/com/bomaos/orders/vo/OrdersVo.java new file mode 100644 index 0000000..12ea77e --- /dev/null +++ b/src/main/java/com/bomaos/orders/vo/OrdersVo.java @@ -0,0 +1,147 @@ +package com.bomaos.orders.vo; + +import lombok.Data; +import lombok.ToString; +import org.springframework.beans.factory.annotation.Autowired; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Data +@ToString +public class OrdersVo { + + /** + * + */ + private Integer id; + + /** + * 订单号 + */ + private String member; + + /** + * 状态 + */ + private Integer status; + + /** + * 支付时间 + */ + private String payTime; + + /** + * 买家联系方式 + */ + private String contact; + + /** + * 买家ip + */ + private String ip; + + /** + * 商品id + */ + private Integer productId; + + /** + * 订单数量 + */ + @Autowired + private Integer number; + + /** + * 支付类型 + */ + private String payType; + + /** + * 支付用户的id(如果有) + */ + private Integer guestId; + + /** + * 购买设备 + */ + private String device; + + /** + * 流水号 + */ + private String payNo; + + /** + * 付款金额 + */ + private String money; + + /** + * 提交金额 + */ + private BigDecimal price; + + /** + * email 客户邮件 + */ + private String email; + + /** + * 订单创建时间 + */ + private Date createTime; + + /** + * 云端id + */ + private String cloudPayid; + + /** + * 商品名称 + */ + private String productName; + + /** + * 卡密列表 + */ + private List cardInfo; + + /** + * 卡密信息 + */ + private String cardsInfo; + + /** + * 标记为使用优惠券 + */ + private Integer isCoupon; + + /** + * 优惠券id + */ + private Integer couponId; + + /** + * 发货类型(0-自动,1-手动) + */ + private Integer shipType; + + + /** + * 订单密码 + */ + private String password; + + /** + * 附加信息 + */ + private List> attachInfoList; + + /** + * 手续费 + */ + private BigDecimal handlingFee; +} diff --git a/src/main/java/com/bomaos/products/controller/ClassifysController.java b/src/main/java/com/bomaos/products/controller/ClassifysController.java new file mode 100644 index 0000000..3ea0d82 --- /dev/null +++ b/src/main/java/com/bomaos/products/controller/ClassifysController.java @@ -0,0 +1,202 @@ +package com.bomaos.products.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.products.entity.Classifys; +import com.bomaos.products.entity.Products; +import com.bomaos.products.service.ClassifysService; +import com.bomaos.products.service.ProductsService; +import com.bomaos.products.vo.ClassifysVo; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 分类管理 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +@Controller +@RequestMapping("/products/classifys") +public class ClassifysController extends BaseController { + @Autowired + private ClassifysService classifysService; + + @Autowired + private ProductsService productsService; + + @RequiresPermissions("products:classifys:view") + @RequestMapping() + public String view() { + return "products/classifys.html"; + } + + /** + * 分页查询分类 + */ + @RequiresPermissions("products:classifys:list") + @OperLog(value = "分类管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.addOrderAsc("sort"); + + List records = classifysService.page(pageParam, pageParam.getWrapper()).getRecords(); + List classifysVoList = records.stream().map((classifys) -> { + ClassifysVo classifysVo = new ClassifysVo(); + BeanUtils.copyProperties(classifys, classifysVo); + // 获取商品的数量 + long count = productsService.count(new QueryWrapper().eq("classify_id", classifys.getId())); + classifysVo.setProductsMember(count); + return classifysVo; + }).collect(Collectors.toList()); + + return new PageResult<>(classifysVoList, pageParam.getTotal()); + } + + /** + * 查询全部分类 + */ + @RequiresPermissions("products:classifys:list") + @OperLog(value = "分类管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(classifysService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询分类 + */ + @RequiresPermissions("products:classifys:list") + @OperLog(value = "分类管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(classifysService.getById(id)); + } + + /** + * 添加分类 + */ + @RequiresPermissions("products:classifys:save") + @OperLog(value = "分类管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Classifys classifys) { + classifys.setCreatedAt(new Date()); + classifys.setUpdatedAt(new Date()); + if (classifysService.save(classifys)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改分类 + */ + @RequiresPermissions("products:classifys:update") + @OperLog(value = "分类管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Classifys classifys) { + if (classifysService.updateById(classifys)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除分类 + */ + @RequiresPermissions("products:classifys:remove") + @OperLog(value = "分类管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + + long count = productsService.count(new QueryWrapper().eq("classify_id", id)); + if (count >= 1) { + return JsonResult.error("该分类有商品存在,不允许删除"); + } + + if (classifysService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加分类 + */ + @RequiresPermissions("products:classifys:save") + @OperLog(value = "分类管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (classifysService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改分类 + */ + @RequiresPermissions("products:classifys:update") + @OperLog(value = "分类管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(classifysService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除分类 + */ + @RequiresPermissions("products:classifys:remove") + @OperLog(value = "分类管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (classifysService.removeByIds(ids)) { + return JsonResult.ok("删除分类成功"); + } + return JsonResult.error("删除分类失败!"); + } + + /** + * 修改商品状态 + */ + @OperLog(value = "分类列表管理", desc = "修改状态", result = true) + @RequiresPermissions("products:classifys:update") + @ResponseBody + @RequestMapping("/status/update") + public JsonResult updateStates(Integer id, Integer status) { + if (status == null || (status != 0 && status != 1)) { + return JsonResult.error("状态值不正确"); + } + Classifys classifys = new Classifys(); + classifys.setId(id); + classifys.setStatus(status); + if (classifysService.updateById(classifys)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + +} diff --git a/src/main/java/com/bomaos/products/controller/ProductsController.java b/src/main/java/com/bomaos/products/controller/ProductsController.java new file mode 100644 index 0000000..f592919 --- /dev/null +++ b/src/main/java/com/bomaos/products/controller/ProductsController.java @@ -0,0 +1,296 @@ +package com.bomaos.products.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bomaos.carmi.entity.Cards; +import com.bomaos.carmi.service.CardsService; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.utils.StringUtil; +import com.bomaos.common.core.web.*; +import com.bomaos.products.entity.Classifys; +import com.bomaos.products.entity.Products; +import com.bomaos.products.service.ClassifysService; +import com.bomaos.products.service.ProductsService; +import com.bomaos.products.vo.ProductsVo; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 商品管理 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +@Controller +@RequestMapping("/products/products") +public class ProductsController extends BaseController { + + @Autowired + private ProductsService productsService; + + @Autowired + private ClassifysService classifysService; + + @Autowired + private CardsService cardsService; + + @RequiresPermissions("products:products:view") + @RequestMapping() + public String view(Model model) { + List classifysList = classifysService.listAll(null); + model.addAttribute("classifysList", classifysList); + model.addAttribute("isSupplier", isSupplier()); + return "products/products.html"; + } + + @RequiresPermissions("products:products:view") + @RequestMapping("/addProduct") + public String addView(Model model) { + List classifysList = classifysService.listAll(null); + model.addAttribute("classifysList", classifysList); + return "products/add-product.html"; + } + + @RequiresPermissions("products:products:view") + @RequestMapping("/editProduct/{productId}") + public String editView(Model model, @PathVariable("productId") Integer productId) { + List classifysList = classifysService.listAll(null); + model.addAttribute("classifysList", classifysList); + + Products products = productsService.getById(productId); + model.addAttribute("products", JSON.toJSONString(products)); + model.addAttribute("productId", productId); + return "products/edit-product.html"; + } + + /** + * 分页查询商品 + */ + @RequiresPermissions("products:products:list") + @OperLog(value = "商品管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.addOrderAsc("sort"); + + // 供应商数据隔离 + Integer supplierId = getLoginUserSupplierId(); + if (supplierId != null) { + pageParam.put("supplierId", supplierId); + } + + List records = productsService.page(pageParam, pageParam.getWrapper()).getRecords(); + List productsVoList = records.stream().map((products) -> { + ProductsVo productsVo = new ProductsVo(); + BeanUtils.copyProperties(products, productsVo); + // 查出所属分类 + Classifys classifys = classifysService.getOne(new QueryWrapper().eq("id", products.getClassifyId())); + productsVo.setClassifyName(classifys.getName()); + + // 查出商品的卡密数量 + long count = cardsService.count(new QueryWrapper().eq("product_id", products.getId()).eq("status", 0).eq("sell_type", 0)); + productsVo.setCardMember(count); + + long sellCount = cardsService.count(new QueryWrapper().eq("product_id", products.getId()).eq("status", 1).eq("sell_type", 0)); + productsVo.setSellCardMember(sellCount); + + if (products.getSellType() == 1) { + Cards cards = cardsService.getOne(new QueryWrapper().eq("product_id", products.getId()).eq("sell_type", 1)); + if (!ObjectUtils.isEmpty(cards)) { + productsVo.setCardMember(cards.getNumber().longValue()); + productsVo.setSellCardMember(cards.getSellNumber().longValue()); + } else { + productsVo.setCardMember(0L); + productsVo.setSellCardMember(0L); + } + } + + productsVo.setPrice(products.getPrice().toString()); + return productsVo; + }).collect(Collectors.toList()); + + return new PageResult<>(productsVoList, pageParam.getTotal()); + } + + /** + * 查询全部商品 + */ + @RequiresPermissions("products:products:list") + @OperLog(value = "商品管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + // 供应商数据隔离 + Integer supplierId = getLoginUserSupplierId(); + if (supplierId != null) { + pageParam.put("supplierId", supplierId); + } + return JsonResult.ok().setData(productsService.list(pageParam.getOrderWrapper())); + } + + /** + * 工具分类ID查询商品 + */ + @RequiresPermissions("products:products:list") + @OperLog(value = "商品管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/getProductList") + public JsonResult getProductList(Integer id) { + QueryWrapper wrapper = new QueryWrapper().eq("classify_id", id); + // 供应商数据隔离 + Integer supplierId = getLoginUserSupplierId(); + if (supplierId != null) { + wrapper.eq("supplier_id", supplierId); + } + List productsList = productsService.list(wrapper); + return JsonResult.ok("查询商品成功!").setData(productsList); + } + + /** + * 根据id查询商品 + */ + @RequiresPermissions("products:products:list") + @OperLog(value = "商品管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(productsService.getById(id)); + } + + /** + * 添加商品 + */ + @RequiresPermissions("products:products:save") + @OperLog(value = "商品管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Products products) { + + if (products.getShipType() == null) { + return JsonResult.error("发货模式不能为空!"); + } + + // 供应商创建商品自动设置supplierId + Integer supplierId = getLoginUserSupplierId(); + if (supplierId != null) { + products.setSupplierId(supplierId); + } + + products.setCreatedAt(new Date()); + products.setUpdatedAt(new Date()); + products.setDeletedAt(new Date()); + products.setLink(StringUtil.getRandomString(16)); + if (productsService.save(products)) { + return JsonResult.ok("添加商品成功"); + } + return JsonResult.error("添加商品失败"); + } + + /** + * 修改商品 + */ + @RequiresPermissions("products:products:update") + @OperLog(value = "商品管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Products products) { + if (productsService.updateById(products)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除商品 + */ + @RequiresPermissions("products:products:remove") + @OperLog(value = "商品管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + long count = cardsService.count(new QueryWrapper().eq("product_id", id)); + if (count >= 1) { + return JsonResult.error("该商品下存在卡密,不允许删除"); + } + if (productsService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加商品 + */ + @RequiresPermissions("products:products:save") + @OperLog(value = "商品管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (productsService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改商品 + */ + @RequiresPermissions("products:products:update") + @OperLog(value = "商品管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(productsService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除商品 + */ + @RequiresPermissions("products:products:remove") + @OperLog(value = "商品管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (productsService.removeByIds(ids)) { + return JsonResult.ok("删除商品成功"); + } + return JsonResult.error("删除商品失败"); + } + + /** + * 修改商品状态 + */ + @OperLog(value = "分类列表管理", desc = "修改状态", result = true) + @RequiresPermissions("products:products:update") + @ResponseBody + @RequestMapping("/status/update") + public JsonResult updateStates(Integer id, Integer status) { + if (status == null || (status != 0 && status != 1)) { + return JsonResult.error("状态值不正确"); + } + Products products = new Products(); + products.setId(id); + products.setStatus(status); + if (productsService.updateById(products)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + +} diff --git a/src/main/java/com/bomaos/products/entity/Classifys.java b/src/main/java/com/bomaos/products/entity/Classifys.java new file mode 100644 index 0000000..df1ad19 --- /dev/null +++ b/src/main/java/com/bomaos/products/entity/Classifys.java @@ -0,0 +1,109 @@ +package com.bomaos.products.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.util.Date; + +/** + * 分类 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +@TableName("sys_classifys") +public class Classifys implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 自增ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 分类名称 + */ + private String name; + + /** + * 分类状态 + */ + private Integer status; + + /** + * 排序 + */ + private Integer sort; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新时间 + */ + private Date updatedAt; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public String toString() { + return "Classifys{" + + ", id=" + id + + ", name=" + name + + ", status=" + status + + ", sort=" + sort + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + + "}"; + } + +} diff --git a/src/main/java/com/bomaos/products/entity/Products.java b/src/main/java/com/bomaos/products/entity/Products.java new file mode 100644 index 0000000..02f9ccf --- /dev/null +++ b/src/main/java/com/bomaos/products/entity/Products.java @@ -0,0 +1,163 @@ +package com.bomaos.products.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 商品 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +@Data +@ToString +@TableName("sys_products") +public class Products implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 自增ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 商品名称 + */ + private String name; + + /** + * 商品金额 + */ + private BigDecimal price; + + /** + * 排序 + */ + private Integer sort; + + /** + * 商品链接 + */ + private String link; + + /** + * 商品状态 + */ + private Integer status; + + /** + * 商品详情 + */ + private String pdInfo; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新时间 + */ + private Date updatedAt; + + /** + * 删除时间 + */ + private Date deletedAt; + + /** + * 分类ID + */ + private Integer classifyId; + + /** + * 首页截图 + */ + private String indexLogo; + + /** + * 商品logo + */ + private String imageLogo; + + /** + * 批发功能 + */ + private Integer isWholesale; + + /** + * 批发配置 + */ + private String wholesale; + + /** + * 限制购买 + */ + private Integer restricts; + + /** + * 发货类型(0-自动,1-手动) + */ + private Integer shipType; + + /** + * 商品库存(人工发货类型生效) + */ + private Integer inventory; + + /** + * 销量 + */ + private Integer sales; + + /** + * 是否开启密码查询 + */ + private Integer isPassword; + + /** + * 是否开启自定义输入框 + */ + private Integer isCustomize; + + /** + * 自定义输入框 + */ + private String customizeInput; + + /** + * 售卡类型 + */ + private Integer sellType; + + /** + * 是否开启提示 + */ + private Integer componentEnabled; + + /** + * 提示类型 + */ + private Integer componentType; + + /** + * 提示语 + */ + private String componentPoint; + + /** + * 提示链接 + */ + private String componentUrl; + + /** + * 供应商id + */ + private Integer supplierId; +} diff --git a/src/main/java/com/bomaos/products/mapper/ClassifysMapper.java b/src/main/java/com/bomaos/products/mapper/ClassifysMapper.java new file mode 100644 index 0000000..5aba915 --- /dev/null +++ b/src/main/java/com/bomaos/products/mapper/ClassifysMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.products.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.products.entity.Classifys; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 分类Mapper接口 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +public interface ClassifysMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/products/mapper/ProductsMapper.java b/src/main/java/com/bomaos/products/mapper/ProductsMapper.java new file mode 100644 index 0000000..7a96dd8 --- /dev/null +++ b/src/main/java/com/bomaos/products/mapper/ProductsMapper.java @@ -0,0 +1,28 @@ +package com.bomaos.products.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.products.entity.Products; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 商品Mapper接口 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +public interface ProductsMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + + List getRandomProductList(int limit); +} diff --git a/src/main/java/com/bomaos/products/mapper/xml/ClassifysMapper.xml b/src/main/java/com/bomaos/products/mapper/xml/ClassifysMapper.xml new file mode 100644 index 0000000..3a45326 --- /dev/null +++ b/src/main/java/com/bomaos/products/mapper/xml/ClassifysMapper.xml @@ -0,0 +1,43 @@ + + + + + + + SELECT a.* + FROM sys_classifys a + + + + AND a.id = #{page.pageData.id} + + + AND a.name LIKE CONCAT('%', #{page.pageData.name}, '%') + + + AND a.status = #{page.pageData.status} + + + AND a.sort = #{page.pageData.sort} + + + AND a.created_at LIKE CONCAT('%', #{page.pageData.createdAt}, '%') + + + AND a.updated_at LIKE CONCAT('%', #{page.pageData.updatedAt}, '%') + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/products/mapper/xml/ProductsMapper.xml b/src/main/java/com/bomaos/products/mapper/xml/ProductsMapper.xml new file mode 100644 index 0000000..4d38e12 --- /dev/null +++ b/src/main/java/com/bomaos/products/mapper/xml/ProductsMapper.xml @@ -0,0 +1,116 @@ + + + + + + + SELECT a.* + FROM sys_products a + + + + AND a.id = #{page.pageData.id} + + + AND a.name LIKE CONCAT('%', #{page.pageData.name}, '%') + + + AND a.price LIKE CONCAT('%', #{page.pageData.price}, '%') + + + AND a.sort = #{page.pageData.sort} + + + AND a.link LIKE CONCAT('%', #{page.pageData.link}, '%') + + + AND a.status = #{page.pageData.status} + + + AND a.pd_info LIKE CONCAT('%', #{page.pageData.pdInfo}, '%') + + + AND a.created_at LIKE CONCAT('%', #{page.pageData.createdAt}, '%') + + + AND a.updated_at LIKE CONCAT('%', #{page.pageData.updatedAt}, '%') + + + AND a.deleted_at LIKE CONCAT('%', #{page.pageData.deletedAt}, '%') + + + AND a.index_logo LIKE CONCAT('%', #{page.pageData.indexLogo}, '%') + + + AND a.image_logo LIKE CONCAT('%', #{page.pageData.imageLogo}, '%') + + + AND a.is_wholesale LIKE CONCAT('%', #{page.pageData.isWholesale}, '%') + + + AND a.wholesale LIKE CONCAT('%', #{page.pageData.wholesale}, '%') + + + AND a.restricts LIKE CONCAT('%', #{page.pageData.restricts}, '%') + + + AND a.ship_type = #{page.pageData.shipType} + + + AND a.inventory = #{page.pageData.inventory} + + + AND a.sales = #{page.pageData.sales} + + + AND a.is_password = #{page.pageData.isPassword} + + + AND a.is_customize = #{page.pageData.isCustomize} + + + AND a.customize_input LIKE CONCAT('%', #{page.pageData.customizeInput}, '%') + + + AND a.sell_type = #{page.pageData.sellType} + + + AND a.component_type = #{page.pageData.componentType} + + + AND a.component_enabled = #{page.pageData.componentEnabled} + + + AND a.component_point LIKE CONCAT('%', #{page.pageData.componentPoint}, '%') + + + AND a.component_url LIKE CONCAT('%', #{page.pageData.componentUrl}, '%') + + + AND a.supplier_id = #{page.pageData.supplierId} + + + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/products/service/ClassifysService.java b/src/main/java/com/bomaos/products/service/ClassifysService.java new file mode 100644 index 0000000..2e40dde --- /dev/null +++ b/src/main/java/com/bomaos/products/service/ClassifysService.java @@ -0,0 +1,27 @@ +package com.bomaos.products.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.products.entity.Classifys; + +import java.util.List; +import java.util.Map; + +/** + * 分类服务类 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +public interface ClassifysService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + +} diff --git a/src/main/java/com/bomaos/products/service/ProductsService.java b/src/main/java/com/bomaos/products/service/ProductsService.java new file mode 100644 index 0000000..a2aa3cd --- /dev/null +++ b/src/main/java/com/bomaos/products/service/ProductsService.java @@ -0,0 +1,29 @@ +package com.bomaos.products.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.products.entity.Products; + +import java.util.List; +import java.util.Map; + +/** + * 商品服务类 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +public interface ProductsService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + + + List getRandomProductList(int limit); +} diff --git a/src/main/java/com/bomaos/products/service/impl/ClassifysServiceImpl.java b/src/main/java/com/bomaos/products/service/impl/ClassifysServiceImpl.java new file mode 100644 index 0000000..ae7da2d --- /dev/null +++ b/src/main/java/com/bomaos/products/service/impl/ClassifysServiceImpl.java @@ -0,0 +1,55 @@ +package com.bomaos.products.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.products.entity.Classifys; +import com.bomaos.products.entity.Products; +import com.bomaos.products.mapper.ClassifysMapper; +import com.bomaos.products.mapper.ProductsMapper; +import com.bomaos.products.service.ClassifysService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 分类服务实现类 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +@Service +@Transactional +public class ClassifysServiceImpl extends ServiceImpl implements ClassifysService { + + @Autowired + private ProductsMapper productsMapper; + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + + @Override + public boolean removeByIds(Collection idList) { + for (Object serializable : idList) { + long count = productsMapper.selectCount(new QueryWrapper().eq("classify_id", serializable)); + if (count > 0) { + return false; + } else { + baseMapper.deleteById((Serializable) serializable); + } + } + return true; + } +} diff --git a/src/main/java/com/bomaos/products/service/impl/ProductsServiceImpl.java b/src/main/java/com/bomaos/products/service/impl/ProductsServiceImpl.java new file mode 100644 index 0000000..fe01e43 --- /dev/null +++ b/src/main/java/com/bomaos/products/service/impl/ProductsServiceImpl.java @@ -0,0 +1,60 @@ +package com.bomaos.products.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.carmi.entity.Cards; +import com.bomaos.carmi.mapper.CardsMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.products.entity.Products; +import com.bomaos.products.mapper.ProductsMapper; +import com.bomaos.products.service.ProductsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 商品服务实现类 + * Created by Panyoujie on 2021-03-27 20:22:00 + */ +@Service +@Transactional +public class ProductsServiceImpl extends ServiceImpl implements ProductsService { + + @Autowired + private CardsMapper cardsMapper; + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + + @Override + public List getRandomProductList(int limit) { + return baseMapper.getRandomProductList(limit); + } + + @Override + public boolean removeByIds(Collection idList) { + for (Object serializable : idList) { + long count = cardsMapper.selectCount(new QueryWrapper().eq("product_id", serializable)); + if (count > 0) { + return false; + } else { + baseMapper.deleteById((Serializable) serializable); + } + } + return true; + } +} diff --git a/src/main/java/com/bomaos/products/vo/ClassifysVo.java b/src/main/java/com/bomaos/products/vo/ClassifysVo.java new file mode 100644 index 0000000..a9cd3a2 --- /dev/null +++ b/src/main/java/com/bomaos/products/vo/ClassifysVo.java @@ -0,0 +1,51 @@ +package com.bomaos.products.vo; + +import lombok.Data; +import lombok.ToString; + +import java.util.Date; + +@Data +@ToString +public class ClassifysVo { + + /** + * 自增ID + */ + private Integer id; + + /** + * 分类名称 + */ + private String name; + + /** + * 分类状态 + */ + private Integer status; + + /** + * 排序 + */ + private Integer sort; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新时间 + */ + private Date updatedAt; + + /** + * 商品数量 + */ + private Long productsMember; + + /** + * 索引 + */ + private Integer andIncrement; +} diff --git a/src/main/java/com/bomaos/products/vo/ProductsVo.java b/src/main/java/com/bomaos/products/vo/ProductsVo.java new file mode 100644 index 0000000..4831c24 --- /dev/null +++ b/src/main/java/com/bomaos/products/vo/ProductsVo.java @@ -0,0 +1,166 @@ +package com.bomaos.products.vo; + +import lombok.Data; +import lombok.ToString; + +import java.util.Date; + +@Data +@ToString +public class ProductsVo { + + /** + * 自增ID + */ + private Integer id; + + /** + * 商品名称 + */ + private String name; + + /** + * 商品名称 + */ + private String classifyName; + + /** + * 卡密数量 + */ + private Long cardMember; + + /** + * 出售卡密数量 + */ + private Long sellCardMember; + + /** + * 商品金额 + */ + private String price; + + /** + * 排序 + */ + private Integer sort; + + /** + * 商品链接 + */ + private String link; + + /** + * 商品状态 + */ + private Integer status; + + /** + * 商品详情 + */ + private String pdInfo; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新时间 + */ + private Date updatedAt; + + /** + * 删除时间 + */ + private Date deletedAt; + + /** + * 分类ID + */ + private Integer classifyId; + + /** + * 首页截图 + */ + private String indexLogo; + + /** + * 商品logo + */ + private String imageLogo; + + /** + * 批发功能 + */ + private Integer isWholesale; + + /** + * 批发配置 + */ + private String wholesale; + + /** + * 限制购买 + */ + private Integer restricts; + + /** + * 优惠券 + */ + private Integer isCoupon; + + /** + * 发货类型(0-自动,1-手动) + */ + private Integer shipType; + + /** + * 商品库存(人工发货类型生效) + */ + private Integer inventory; + + /** + * 销量 + */ + private Integer sales; + + /** + * 是否开启密码查询 + */ + private Integer isPassword; + + /** + * 是否开启自定义输入框 + */ + private Integer isCustomize; + + /** + * 自定义输入框 + */ + private String customizeInput; + + /** + * 售卡类型 + */ + private Integer sellType; + + /** + * 是否开启提示 + */ + private Integer componentEnabled; + + /** + * 提示类型 + */ + private Integer componentType; + + /** + * 提示语 + */ + private String componentPoint; + + /** + * 提示链接 + */ + private String componentUrl; +} diff --git a/src/main/java/com/bomaos/products/vo/ProductsVos.java b/src/main/java/com/bomaos/products/vo/ProductsVos.java new file mode 100644 index 0000000..62fa3c1 --- /dev/null +++ b/src/main/java/com/bomaos/products/vo/ProductsVos.java @@ -0,0 +1,161 @@ +package com.bomaos.products.vo; + +import lombok.Data; +import lombok.ToString; + +import java.util.Date; + +@Data +@ToString +public class ProductsVos { + + /** + * 自增ID + */ + private Integer id; + + /** + * 商品名称 + */ + private String name; + + /** + * 商品名称 + */ + private String classifyName; + + /** + * 卡密数量 + */ + private Integer cardMember; + + /** + * 商品金额 + */ + private String price; + + /** + * 排序 + */ + private Integer sort; + + /** + * 商品链接 + */ + private String link; + + /** + * 商品状态 + */ + private Integer status; + + /** + * 商品详情 + */ + private String pdInfo; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新时间 + */ + private Date updatedAt; + + /** + * 删除时间 + */ + private Date deletedAt; + + /** + * 分类ID + */ + private Integer classifyId; + + /** + * 卡密数量 + */ + private String cardsCount; + + /** + * 首页截图 + */ + private String indexLogo; + + /** + * 商品logo + */ + private String imageLogo; + + /** + * 批发功能 + */ + private Integer isWholesale; + + /** + * 批发配置 + */ + private String wholesale; + + /** + * 限制购买 + */ + private Integer restricts; + + /** + * 发货类型(0-自动,1-手动) + */ + private Integer shipType; + + /** + * 商品库存(人工发货类型生效) + */ + private Integer inventory; + + /** + * 销量 + */ + private Integer sales; + + /** + * 是否开启密码查询 + */ + private Integer isPassword; + + /** + * 是否开启自定义输入框 + */ + private Integer isCustomize; + + /** + * 自定义输入框 + */ + private String customizeInput; + + /** + * 售卡类型 + */ + private Integer sellType; + + /** + * 是否开启提示 + */ + private Integer componentEnabled; + + /** + * 提示类型 + */ + private Integer componentType; + + /** + * 提示语 + */ + private String componentPoint; + + /** + * 提示链接 + */ + private String componentUrl; +} diff --git a/src/main/java/com/bomaos/reception/common/PaysEnmu.java b/src/main/java/com/bomaos/reception/common/PaysEnmu.java new file mode 100644 index 0000000..f638eea --- /dev/null +++ b/src/main/java/com/bomaos/reception/common/PaysEnmu.java @@ -0,0 +1,47 @@ +package com.bomaos.reception.common; + +/** + * 支付接口枚举类 + * Created by Panyoujie on 2021-10-23 00:11:08 + */ +public enum PaysEnmu { + MQPAY_ALIPAY("mqpay_alipay"), + MQPAY_WXPAY("mqpay_wxpay"), + EPAY_ALIPAY("epay_alipay"), + EPAY_WXPAY("epay_wxpay"), + EPAY_QQPAY("epay_qqpay"), + BUDPAY_ALIPAY("budpay_alipay"), + BUDPAY_WECHAT("budpay_wechat"), + YUNGOUOS_WXPAY("yungouos_wxpay"), + YUNGOUOS_ALIPAY("yungouos_alipay"), + XUNHUPAY_WXPAY("xunhupay_wxpay"), + XUNHUPAY_ALIPAY("xunhupay_alipay"), + PAYJS_WXPAY("payjs_wxpay"), + PAYJS_ALIPAY("payjs_alipay"), + WXPAY("wxpay"), + ALIPAY("alipay"), + ALIPAY_PC("alipay_pc"), + WXPAU_H5("wxpay_h5"), + PAYPAL("paypal"), + EPUSDT("epusdt"); + + PaysEnmu(String code) { + this.code = code; + } + + private final String code; + + public String getCode() { + return code; + } + + public static PaysEnmu getByValue(String value) { + for (PaysEnmu paysEnmu : values()) { + if (paysEnmu.getCode().equals(value)) { + return paysEnmu; + } + } + return null; + } + +} diff --git a/src/main/java/com/bomaos/reception/controller/IndexController.java b/src/main/java/com/bomaos/reception/controller/IndexController.java new file mode 100644 index 0000000..d67dda2 --- /dev/null +++ b/src/main/java/com/bomaos/reception/controller/IndexController.java @@ -0,0 +1,712 @@ +package com.bomaos.reception.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bomaos.carmi.entity.Cards; +import com.bomaos.carmi.service.CardsService; +import com.bomaos.common.core.enmu.*; +import com.bomaos.common.core.utils.DateUtil; +import com.bomaos.common.core.utils.DeviceUtils; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.common.system.entity.User; +import com.bomaos.common.system.service.UserService; +import com.bomaos.content.entity.Article; +import com.bomaos.content.entity.Carousel; +import com.bomaos.content.service.ArticleService; +import com.bomaos.content.service.CarouselService; +import com.bomaos.orders.entity.Orders; +import com.bomaos.orders.service.OrdersService; +import com.bomaos.orders.vo.OrdersVo; +import com.bomaos.products.entity.Classifys; +import com.bomaos.products.entity.Products; +import com.bomaos.products.service.ClassifysService; +import com.bomaos.products.service.ProductsService; +import com.bomaos.products.vo.ClassifysVo; +import com.bomaos.products.vo.ProductsVos; +import com.bomaos.reception.dto.HotProductDTO; +import com.bomaos.reception.dto.ProductDTO; +import com.bomaos.reception.dto.ProductListDTO; +import com.bomaos.reception.dto.SearchDTO; +import com.bomaos.reception.util.ProductUtil; +import com.bomaos.reception.vo.ArticleVo; +import com.bomaos.settings.entity.Coupon; +import com.bomaos.settings.entity.Pays; +import com.bomaos.settings.entity.ShopSettings; +import com.bomaos.settings.service.CouponService; +import com.bomaos.settings.service.PaysService; +import com.bomaos.settings.service.ShopSettingsService; +import com.bomaos.settings.vo.PaysVo; +import com.bomaos.theme.entity.Theme; +import com.bomaos.theme.service.ThemeService; +import com.bomaos.website.entity.Website; +import com.bomaos.website.service.WebsiteService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +@Controller +public class IndexController { + + @Autowired + private ProductsService productsService; + + @Autowired + private ClassifysService classifysService; + + @Autowired + private CardsService cardsService; + + @Autowired + private PaysService paysService; + + @Autowired + private OrdersService ordersService; + + @Autowired + private WebsiteService websiteService; + + @Autowired + private CouponService couponService; + + @Autowired + private ThemeService themeService; + + @Autowired + private ShopSettingsService shopSettingsService; + + @Autowired + private ArticleService articleService; + + @Autowired + private UserService userService; + + @Autowired + private CarouselService carouselService; + + /** + * 首页 + * + * @param model + * @return + */ + @RequestMapping({"/", "/index"}) + public String IndexView(Model model) { + Website website = websiteService.getById(1); + model.addAttribute("website", website); + ShopSettings shopSettings = shopSettingsService.getById(1); + shopSettings.setWxpushUid(null); + model.addAttribute("isBackground", shopSettings.getIsBackground()); + model.addAttribute("shopSettings", JSON.toJSONString(shopSettings)); + model.addAttribute("shop", shopSettings); + Theme theme = themeService.getOne(Wrappers.lambdaQuery().eq(Theme::getEnable, 1)); + + /** + * 轮播图 + */ + List carouselList = carouselService.list(Wrappers.lambdaQuery().eq(Carousel::getEnabled, 1)); + model.addAttribute("carouselList", carouselList); + + /** + * 分类列表 + * 查询出所有上架的分类 + */ + List classifysList = classifysService.list(Wrappers.lambdaQuery().eq(Classifys::getStatus, 1).orderByAsc(Classifys::getSort)); + AtomicInteger index = new AtomicInteger(0); // 索引 + List classifysVoList = classifysList.stream().map((classifys) -> { + ClassifysVo classifysVo = new ClassifysVo(); + BeanUtils.copyProperties(classifys, classifysVo); + long count = productsService.count(Wrappers.lambdaQuery().eq(Products::getClassifyId, classifys.getId()).eq(Products::getStatus, 1)); + classifysVo.setProductsMember(count); + int andIncrement = index.getAndIncrement(); + classifysVo.setAndIncrement(andIncrement); // 索引 + return classifysVo; + }).collect(Collectors.toList()); + + if (shopSettings.getIsModel() == 1) { + model.addAttribute("classifysListJson", JSON.toJSONString(classifysVoList)); + return "theme/" + theme.getDriver() + "/index.html"; + } else if (shopSettings.getIsModel() == 0) { + /** + * 分类与分类下的商品 + */ + List productListDTOList = classifysList.stream().map((classifys -> { + ProductListDTO productListDTO = new ProductListDTO(); + productListDTO.setId(classifys.getId()); + productListDTO.setTitle(classifys.getName()); + productListDTO.setCreateTime(DateUtil.getSubDateMiao(classifys.getCreatedAt())); + productListDTO.setUpdateTime(DateUtil.getSubDateMiao(classifys.getUpdatedAt())); + long productCount = productsService.count(Wrappers.lambdaQuery().eq(Products::getClassifyId, classifys.getId()).eq(Products::getStatus, 1)); + productListDTO.setProductNum(productCount); + List productsList = productsService.list(Wrappers.lambdaQuery() + .eq(Products::getClassifyId, classifys.getId()) + .eq(Products::getStatus, 1) + .orderByAsc(Products::getSort)); + List productDTOS = getProductDTOList(productsList); + productListDTO.setProductDTOList(productDTOS); + return productListDTO; + })).collect(Collectors.toList()); + model.addAttribute("productListDTOList", productListDTOList); + return "theme/" + theme.getDriver() + "/index-list.html"; + } else { + /** + * 查出四个热门商品 + */ + List randomProductList = productsService.getRandomProductList(4); + List productDTOList = getProductDTOList(randomProductList); + List hotProductList = ProductUtil.getHotProductList(productDTOList); + model.addAttribute("hotProductList", hotProductList); + model.addAttribute("classifysListJson", JSON.toJSONString(classifysVoList)); + return "theme/" + theme.getDriver() + "/index-easy.html"; + } + } + + @RequestMapping("/article") + public String articleView(Model model) { + /** + * 查出四个热门商品 + */ + List randomProductList = productsService.getRandomProductList(4); + List productDTOList = getProductDTOList(randomProductList); + List hotProductList = ProductUtil.getHotProductList(productDTOList); + model.addAttribute("hotProductList", hotProductList); + + Website website = websiteService.getById(1); + model.addAttribute("website", website); + + ShopSettings shopSettings = shopSettingsService.getById(1); + model.addAttribute("isBackground", shopSettings.getIsBackground()); + model.addAttribute("shop", shopSettings); + Theme theme = themeService.getOne(Wrappers.lambdaQuery().eq(Theme::getEnable, 1)); + return "theme/" + theme.getDriver() + "/article.html"; + } + + /** + * 文章内页 + * + * @param model + * @return + */ + @RequestMapping("/article/{id}") + public String articleContentView(Model model, @PathVariable("id") Integer id) { + Article article = articleService.getById(id); + ArticleVo articleVo = new ArticleVo(); + BeanUtils.copyProperties(article, articleVo); + articleVo.setCreateTime(DateUtil.getSubDate(article.getCreateTime())); + articleVo.setUpdateTime(DateUtil.getSubDate(article.getUpdateTime())); + model.addAttribute("article", articleVo); + + /** + * 每次点击自动统计加一 + */ + Article article1 = new Article(); + article1.setId(article.getId()); + article1.setSeeNumber(article.getSeeNumber() + 1); + + articleService.updateById(article1); + + /** + * 查出四个热门商品 + */ + List randomProductList = productsService.getRandomProductList(4); + List productDTOList = getProductDTOList(randomProductList); + List hotProductList = ProductUtil.getHotProductList(productDTOList); + model.addAttribute("hotProductList", hotProductList); + + Website website = websiteService.getById(1); + model.addAttribute("website", website); + + ShopSettings shopSettings = shopSettingsService.getById(1); + model.addAttribute("isBackground", shopSettings.getIsBackground()); + model.addAttribute("shop", shopSettings); + Theme theme = themeService.getOne(Wrappers.lambdaQuery().eq(Theme::getEnable, 1)); + return "theme/" + theme.getDriver() + "/article-content.html"; + } + + /** + * 获取文章列表 + * + * @param request + * @return + */ + @ResponseBody + @RequestMapping("/getArticleList") + public PageResult getArticleList(HttpServletRequest request) { + PageParam
pageParam = new PageParam<>(request); + pageParam.put("enabled", 1); + List
articleList = articleService.page(pageParam, pageParam.getWrapper()).getRecords(); + List articleVoList = articleList.stream().map((article) -> { + ArticleVo articleVo = new ArticleVo(); + BeanUtils.copyProperties(article, articleVo); + User user = userService.getOne(new QueryWrapper().eq("user_id", article.getUserId())); + articleVo.setUserName(user.getNickName()); + articleVo.setUserHead(user.getAvatar()); + articleVo.setCreateTime(DateUtil.getSubDate(article.getCreateTime())); + articleVo.setUpdateTime(DateUtil.getSubDate(article.getUpdateTime())); + return articleVo; + }).collect(Collectors.toList()); + return new PageResult<>(articleVoList, pageParam.getTotal()); + } + + @ResponseBody + @RequestMapping("/getProductList") + public PageResult getProductList(Integer page, Integer limit, Integer classifyId, String name) { + if (ObjectUtils.isEmpty(classifyId)) return new PageResult<>(null, 0).setCode(1001).setMsg("商品内容为空"); + IPage productIPage = new Page<>(page, limit); + IPage productIPageList = productsService.page(productIPage, Wrappers.lambdaQuery() + .eq(Products::getStatus, 1) + .eq(Products::getClassifyId, classifyId) + .like(!StringUtils.isEmpty(name), Products::getName, name) + .orderByAsc(Products::getSort)); + List productDTOList = getProductDTOList(productIPageList.getRecords()); + if (ObjectUtils.isEmpty(productDTOList) && productIPage.getTotal() == 0) + return new PageResult<>(productDTOList, productIPageList.getTotal()).setCode(1000); + return new PageResult<>(productDTOList, productIPageList.getTotal()); + } + + /** + * 商品购买页面 + * + * @param model + * @param link + * @return + */ + @RequestMapping("/product/{link}") + public String product(Model model, @PathVariable("link") String link, HttpServletRequest request) { + Website website = websiteService.getById(1); + model.addAttribute("website", website); + ShopSettings shopSettings = shopSettingsService.getById(1); + model.addAttribute("isBackground", shopSettings.getIsBackground()); + model.addAttribute("shop", shopSettings); + Theme theme = themeService.getOne(Wrappers.lambdaQuery().eq(Theme::getEnable, 1)); + + // 查出商品 + Products products = productsService.getOne(new QueryWrapper().eq("link", link)); + + /** + * 商品为空 + * 直接返回商品找不到页面 + */ + if (ObjectUtils.isEmpty(products) || products.getStatus() == 0) { + return "theme/" + theme.getDriver() + "/product404.html"; + } + + // 查出分类 + Classifys classifys = classifysService.getById(products.getClassifyId()); + + boolean isMobile = DeviceUtils.isMobileDevice(request); + AtomicInteger index = new AtomicInteger(0); + if (isMobile) { + List paysVoList = getPaysVoList(paysService.list(new QueryWrapper().eq("is_mobile", 1)), index); + model.addAttribute("paysList", paysVoList); + } else { + List paysVoList = getPaysVoList(paysService.list(new QueryWrapper().eq("is_pc", 1)), index); + model.addAttribute("paysList", paysVoList); + } + + model.addAttribute("products", products); + model.addAttribute("productsJson", JSON.toJSONString(getProductById(products))); + model.addAttribute("classifyName", classifys.getName()); + + /** + * 批发参数遍历 + */ + if (products.getIsWholesale() == 1) { + String wholesale = products.getWholesale(); + String[] wholesales = wholesale.split("\\n"); + List> list = new ArrayList<>(); + AtomicInteger atomicInteger = new AtomicInteger(0); + for (String s : wholesales) { + String[] split = s.split("="); + Map map = new HashMap<>(); + Integer andIncrement = atomicInteger.getAndIncrement(); + map.put("id", andIncrement.toString()); + map.put("number", split[0]); + map.put("money", split[1]); + list.add(map); + } + model.addAttribute("wholesaleList", list); + } + + /** + * 该商品是否有优惠券 + */ + long isCoupon = couponService.count(new QueryWrapper().eq("product_id", products.getId())); + model.addAttribute("isCoupon", isCoupon); + + /** + * 是否启用自定义输入框 + */ + Integer isCustomize = products.getIsCustomize(); + model.addAttribute("isCustomize", isCustomize); + if (isCustomize == 1) { + if (!StringUtils.isEmpty(products.getCustomizeInput())) { + String customizeInput = products.getCustomizeInput(); + String[] customize = customizeInput.split("\\n"); + List> list = new ArrayList<>(); + for (String s : customize) { + String[] split = s.split("="); + Map map = new HashMap<>(); + map.put("field", split[0]); + map.put("name", split[1]); + map.put("switch", split[2]); + list.add(map); + } + model.addAttribute("customizeList", list); + } + } + + if (products.getShipType() == 0) { // 自动发货模式 + Integer count = getCardListCount(cardsService, products); // 计算卡密使用情况 + model.addAttribute("cardCount", count); + if (products.getSellType() == 1) { + Cards cards = cardsService.getOne(new QueryWrapper().eq("product_id", products.getId()).eq("status", 0).eq("sell_type", 1)); + if (!ObjectUtils.isEmpty(cards)) { + model.addAttribute("cardCount", cards.getNumber()); + } else { + model.addAttribute("cardCount", 0); + } + } + } else { // 手动发货模式 + model.addAttribute("cardCount", products.getInventory()); + } + + return "theme/" + theme.getDriver() + "/product.html"; + } + + public List getPaysVoList(List paysList, AtomicInteger index) { + List paysVoList = paysList.stream().map((pays) -> { + PaysVo paysVo = new PaysVo(); + BeanUtils.copyProperties(pays, paysVo); + int andIncrement = index.getAndIncrement(); + paysVo.setAndIncrement(andIncrement); // 索引 + return paysVo; + }).collect(Collectors.toList()); + return paysVoList; + } + + public ProductsVos getProductById(Products products) { + ProductsVos productsVos = new ProductsVos(); + BeanUtils.copyProperties(products, productsVos); + productsVos.setId(products.getId()); + productsVos.setPrice(products.getPrice().toString()); + + if (products.getShipType() == 0) { // 自动发货模式 + Integer count = getCardListCount(cardsService, products); // 计算卡密使用情况 + productsVos.setCardsCount(count.toString()); + } else { // 手动发货模式 + productsVos.setCardsCount(products.getInventory().toString()); + } + + if (products.getSellType() == 1) { + Cards cards = cardsService.getOne(new QueryWrapper().eq("product_id", products.getId()).eq("status", 0).eq("sell_type", 1)); + if (!ObjectUtils.isEmpty(cards)) { + productsVos.setCardsCount(cards.getNumber().toString()); + } else { + productsVos.setCardsCount("0"); + } + } + return productsVos; + } + + /** + * 计算卡密使用情况 + * + * @param cardsService + * @param products + * @return + */ + public static Integer getCardListCount(CardsService cardsService, Products products) { + List cardsList = cardsService.list(new QueryWrapper().eq("product_id", products.getId()).eq("sell_type", 0)); + Integer count = 0; + for (Cards cards : cardsList) { + if (cards.getStatus() == 0) { + count++; + } + } + return count; + } + + @RequestMapping("/search") + public String search(Model model, @CookieValue(name = "BROWSER_ORDERS_CACHE", required = false) String orderCache) { + if (!ObjectUtils.isEmpty(orderCache)) { + String[] split = orderCache.split("="); + List ordersList = new ArrayList<>(); + AtomicInteger index = new AtomicInteger(0); + for (String s : split) { + Orders member = ordersService.getOne(new QueryWrapper().eq("member", s)); + if (ObjectUtils.isEmpty(member)) continue; + SearchDTO searchDTO = new SearchDTO(); + searchDTO.setId(member.getId()); + Integer andIncrement = index.getAndIncrement(); + searchDTO.setAndIncrement(andIncrement); + searchDTO.setMember(member.getMember()); + searchDTO.setCreateTime(DateUtil.getSubDateMiao(member.getCreateTime())); + searchDTO.setMoney(member.getMoney().toString()); + if (Alipay.getByValue(member.getPayType())) { + searchDTO.setPayType("支付宝"); + } else if (Wxpay.getByValue(member.getPayType())) { + searchDTO.setPayType("微信"); + } else if (Paypal.getByValue(member.getPayType())) { + searchDTO.setPayType("Paypal"); + } else if (QQPay.getByValue(member.getPayType())) { + searchDTO.setPayType("QQ钱包"); + } else if (USDT.getByValue(member.getPayType())) { + searchDTO.setPayType("USDT"); + } + switch (member.getStatus()) { + case 1: + searchDTO.setStatus("已支付"); + break; + case 2: + searchDTO.setStatus("待发货"); + break; + case 3: + searchDTO.setStatus("已发货"); + break; + default: + searchDTO.setStatus("未付款"); + break; + } + ordersList.add(searchDTO); + } + model.addAttribute("ordersList", JSON.toJSONString(ordersList)); + } else { + List ordersList = new ArrayList<>(); + model.addAttribute("ordersList", JSON.toJSONString(ordersList)); + } + + Website website = websiteService.getById(1); + model.addAttribute("website", website); + ShopSettings shopSettings = shopSettingsService.getById(1); + model.addAttribute("isBackground", shopSettings.getIsBackground()); + model.addAttribute("shop", shopSettings); + Theme theme = themeService.getOne(Wrappers.lambdaQuery().eq(Theme::getEnable, 1)); + return "theme/" + theme.getDriver() + "/search.html"; + } + + @RequestMapping("/search/order/{order}") + public String searchOrder(Model model, @PathVariable("order") String order) { + Orders member = ordersService.getOne(Wrappers.lambdaQuery().eq(Orders::getMember, order)); + Products products = productsService.getById(member.getProductId()); + + Website website = websiteService.getById(1); + model.addAttribute("website", website); + ShopSettings shopSettings = shopSettingsService.getById(1); + model.addAttribute("isBackground", shopSettings.getIsBackground()); + model.addAttribute("shop", shopSettings); + model.addAttribute("orderId", member.getId()); + model.addAttribute("member", member.getMember()); + Theme theme = themeService.getOne(Wrappers.lambdaQuery().eq(Theme::getEnable, 1)); + + if (!StringUtils.isEmpty(products.getIsPassword())) { + if (products.getIsPassword() == 1) { + return "theme/" + theme.getDriver() + "/orderPass.html"; + } + } + Classifys classifys = classifysService.getById(products.getClassifyId()); + + List cardsList = new ArrayList<>(); + if (!StringUtils.isEmpty(member.getCardsInfo())) { + String[] cardsInfo = member.getCardsInfo().split("\n"); + for (String cardInfo : cardsInfo) { + StringBuilder cardInfoText = new StringBuilder(); + if (products.getShipType() == 0) { + cardInfoText.append(cardInfo).append("\n"); + cardsList.add(cardInfoText.toString()); + } else { + cardInfoText.append(cardInfo); + cardsList.add(cardInfoText.toString()); + } + } + } + + OrdersVo ordersVo = new OrdersVo(); + BeanUtils.copyProperties(member, ordersVo); + if (member.getPayTime() != null) { + ordersVo.setPayTime(DateUtil.getSubDateMiao(member.getPayTime())); + } else { + ordersVo.setPayTime(null); + } + ordersVo.setMoney(member.getMoney().toString()); + /** + * 发货模式 + */ + ordersVo.setShipType(products.getShipType()); + model.addAttribute("cardsList", cardsList); // 订单 + model.addAttribute("orders", ordersVo); // 订单 + model.addAttribute("goods", products); // 商品 + model.addAttribute("classify", classifys); // 分类 + return "theme/" + theme.getDriver() + "/order.html"; + } + + /** + * 支付状态 + * + * @param model + * @return + */ + @RequestMapping("/pay/state/{payId}") + public String payState(Model model, @PathVariable("payId") String payId) { + Orders orders = ordersService.getOne(new QueryWrapper().eq("member", payId)); + model.addAttribute("orderId", orders.getId()); + model.addAttribute("ordersMember", orders.getMember()); + + Website website = websiteService.getById(1); + model.addAttribute("website", website); + + ShopSettings shopSettings = shopSettingsService.getById(1); + model.addAttribute("isBackground", shopSettings.getIsBackground()); + model.addAttribute("shop", shopSettings); + Theme theme = themeService.getOne(Wrappers.lambdaQuery().eq(Theme::getEnable, 1)); + return "theme/" + theme.getDriver() + "/payState.html"; + } + + @ResponseBody + @GetMapping("/getProductSearchList") + public JsonResult getProductSearchList(String content) { + List productsList = productsService.list(Wrappers.lambdaQuery().eq(Products::getStatus, 1).like(Products::getName, content)); + List productDTOList = getProductDTOList(productsList); + return JsonResult.ok("查询成功!").setData(productDTOList); + } + + /** + * 获取购物须知 + * + * @return + */ + @ResponseBody + @RequestMapping("/getShoppingNotes") + public JsonResult getShoppingNotes() { + ShopSettings shopSettings = shopSettingsService.getById(1); + return JsonResult.ok().setData(shopSettings.getWindowText()); + } + + /* 拼接字符串 + * @author + * @param + * @return + */ + @RequestMapping("/exportCards") + public void exportCardsList(HttpServletResponse response, Integer orderId) { + Orders orders = ordersService.getById(orderId); + Products products = productsService.getById(orders.getProductId()); + StringBuffer text = new StringBuffer(); + if (!ObjectUtils.isEmpty(orders)) { + String[] split = orders.getCardsInfo().split("\n"); + for (String s : split) { + text.append(s).append("\n"); + } + } + exportTxt(response, products.getName() + "-" + orders.getMember(), text.toString()); + } + + /* + * 导出txt文件 + * @author Panyoujie + * @param response + * @param text 导出的字符串 + * @return + */ + public void exportTxt(HttpServletResponse response, String fileName, String text) { + response.setCharacterEncoding("utf-8"); + // 设置响应的内容类型 + response.setContentType("text/plain"); + // 设置文件的名称和格式 + response.addHeader("Content-Disposition", "attachment;filename=" + + genAttachmentFileName(fileName, "JSON_FOR_UCC_") //设置名称格式,没有这个中文名称无法显示 + + ".txt"); + BufferedOutputStream buff = null; + ServletOutputStream outStr = null; + try { + outStr = response.getOutputStream(); + buff = new BufferedOutputStream(outStr); + buff.write(text.getBytes(StandardCharsets.UTF_8)); + buff.flush(); + buff.close(); + } catch (Exception e) { + //LOGGER.error("导出文件文件出错:{}",e); + } finally { + try { + buff.close(); + outStr.close(); + } catch (Exception e) { + //LOGGER.error("关闭流对象出错 e:{}",e); + } + } + } + + /** + * 原文说这个方法能解决文件中文名乱码问题,但是我实际试了以后中文的文件名依然乱码(文件内容中的中文能正常显示),不知道为什么 + * 最后是由前端生成的中文名 + * + * @param cnName + * @param defaultName + * @return + */ + public String genAttachmentFileName(String cnName, String defaultName) { + try { + cnName = new String(cnName.getBytes("gb2312"), "ISO8859-1"); + } catch (Exception e) { + cnName = defaultName; + } + return cnName; + } + + /** + * 通用获取商品列表 + * 统计商品的卡密使用信息 + * + * @param productsList + * @return + */ + public List getProductDTOList(List productsList) { + List productDTOList = productsList.stream().map((products) -> { + ProductDTO productDTO = new ProductDTO(); + BeanUtils.copyProperties(products, productDTO); + long count = cardsService.count(new QueryWrapper().eq("product_id", products.getId()).eq("status", 0).eq("sell_type", 0)); + productDTO.setCardMember(count); + long count2 = cardsService.count(new QueryWrapper().eq("product_id", products.getId()).eq("status", 1).eq("sell_type", 0)); + productDTO.setSellCardMember(count2); + productDTO.setPrice(products.getPrice().toString()); + long count1 = couponService.count(new QueryWrapper().eq("product_id", products.getId())); + productDTO.setIsCoupon(count1); + if (products.getShipType() == 1) { + productDTO.setCardMember(products.getInventory().longValue()); + productDTO.setSellCardMember(products.getSales().longValue()); + } + if (products.getSellType() == 1) { + Cards cards = cardsService.getOne(new QueryWrapper().eq("product_id", products.getId()).eq("sell_type", 1)); + if (ObjectUtils.isEmpty(cards)) { // kon + productDTO.setCardMember(0L); + productDTO.setSellCardMember(0L); + } else { + productDTO.setCardMember(cards.getNumber().longValue()); + productDTO.setSellCardMember(cards.getSellNumber().longValue()); + } + } + return productDTO; + }).collect(Collectors.toList()); + return productDTOList; + } +} diff --git a/src/main/java/com/bomaos/reception/controller/NotifyController.java b/src/main/java/com/bomaos/reception/controller/NotifyController.java new file mode 100644 index 0000000..1b7b552 --- /dev/null +++ b/src/main/java/com/bomaos/reception/controller/NotifyController.java @@ -0,0 +1,1154 @@ +package com.bomaos.reception.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.alipay.easysdk.factory.Factory; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bomaos.carmi.entity.Cards; +import com.bomaos.carmi.service.CardsService; +import com.bomaos.common.core.pays.budpay.BudpayUtil; +import com.bomaos.common.core.pays.epay.EpayUtil; +import com.bomaos.common.core.pays.epusdt.entity.EpusdtNotify; +import com.bomaos.common.core.pays.epusdt.sendPay; +import com.bomaos.common.core.pays.mqpay.mqPay; +import com.bomaos.common.core.pays.payjs.SignUtil; +import com.bomaos.common.core.pays.paypal.PaypalSend; +import com.bomaos.common.core.pays.xunhupay.PayUtils; +import com.bomaos.common.core.utils.DateUtil; +import com.bomaos.common.core.utils.FormCheckUtil; +import com.bomaos.common.core.utils.RequestParamsUtil; +import com.bomaos.common.core.utils.StringUtil; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.system.service.EmailService; +import com.bomaos.orders.entity.Orders; +import com.bomaos.orders.service.OrdersService; +import com.bomaos.products.entity.Products; +import com.bomaos.products.service.ProductsService; +import com.bomaos.reception.dto.NotifyDTO; +import com.bomaos.reception.entity.XunhuNotIfy; +import com.bomaos.reception.result.Budpay; +import com.bomaos.reception.util.SynchronizedByKeyService; +import com.bomaos.settings.entity.Pays; +import com.bomaos.settings.entity.ShopSettings; +import com.bomaos.settings.service.PaysService; +import com.bomaos.settings.service.ShopSettingsService; +import com.bomaos.website.entity.Website; +import com.bomaos.website.service.WebsiteService; +import com.github.wxpay.sdk.WXPayUtil; +import com.google.common.collect.Maps; +import com.paypal.api.payments.Payment; +import com.paypal.api.payments.Transaction; +import com.paypal.base.rest.PayPalRESTException; +import com.zjiecode.wxpusher.client.WxPusher; +import com.zjiecode.wxpusher.client.bean.Message; +import lombok.SneakyThrows; +import org.apache.commons.codec.Charsets; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; + +@Controller +@Transactional +public class NotifyController { + + @Autowired + private PaysService paysService; + + @Autowired + private OrdersService ordersService; + + @Autowired + private ProductsService productsService; + + @Autowired + private CardsService cardsService; + + @Autowired + private EmailService emailService; + + @Autowired + private WebsiteService websiteService; + + @Autowired + private ShopSettingsService shopSettingsService; + + @Autowired + private SynchronizedByKeyService synchronizedByKeyService; + + /** + * 返回成功xml + */ + private final String WxpayresXml = ""; + + private final String WxpayH5resXml = ""; + + private final String resFailXml = ""; + + @RequestMapping("/budpay/notifyUrl") + @ResponseBody + public String budpayNotify(Budpay budpay) { + + System.out.println(budpay); + String driver = ""; + if (budpay.getPay_type().equals("wechat")) { + driver = "budpay_wechat"; + } else if (budpay.getPay_type().equals("alipay")) { + driver = "budpay_alipay"; + } + + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", driver)); + + /** + * 防止破解 + */ + Orders orders = ordersService.getOne(new QueryWrapper().eq("member", budpay.getOut_trade_no())); + System.out.println(orders); + if (!orders.getPayType().equals(pays.getDriver())) { + return "不要搞我啦!!"; + } + + Map mapTypes = JSON.parseObject(pays.getConfig()); + + // 你的key 在后台获取 + String secret_key = mapTypes.get("key").toString(); + String json = JSON.toJSONString(budpay); + Map map = JSON.parseObject(json, new TypeReference>() {}); + + String sign1 = BudpayUtil.createSign(map, secret_key).toUpperCase(); + System.out.println(sign1); + System.out.println(budpay.getSign()); + if (sign1.equals(budpay.getSign())) { + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(budpay.getOut_trade_no(), () -> { + String returnBig1 = returnBig(budpay.getAmount(), budpay.getAmount(), budpay.getOut_trade_no(), budpay.getTrade_no(), budpay.getName(), "success", "final"); + notifyText.set(returnBig1); + }); + return notifyText.get(); + } else { + return "签名错误!!"; + } + } + + /** + * 虎皮椒支付通知 + * + * @param request + * @return + */ + @RequestMapping("/budpay/returnUrl") + @ResponseBody + public void budpayReturnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException { + // 记得 map 第二个泛型是数组 要取 第一个元素 即[0] + Map params = RequestParamsUtil.getParameterMap(request); + String url = "/pay/state/" + params.get("out_trade_no"); + response.sendRedirect(url); + } + + @RequestMapping("/mqpay/notifyUrl") + @ResponseBody + public String notifyUrl(HttpServletRequest request) { + Map params = RequestParamsUtil.getParameterMap(request); + String param = params.get("param"); + String price = params.get("price"); + String money = params.get("reallyPrice"); + String sign = params.get("sign"); + String payId = params.get("payId"); + String type = params.get("type"); + String key = null; + Orders orders = ordersService.getOne(new QueryWrapper().eq("member", payId)); + if (Integer.parseInt(type) == 1) { // wxpay + Pays wxPays = paysService.getOne(new QueryWrapper().eq("driver", "mqpay_wxpay")); + + /** + * 防止破解 + */ + if (!orders.getPayType().equals(wxPays.getDriver())) { + return "不要搞我啦!!"; + } + + Map mapTypes = JSON.parseObject(wxPays.getConfig()); + key = mapTypes.get("key").toString(); + } else if (Integer.parseInt(type) == 2) { // alipay + Pays aliPays = paysService.getOne(new QueryWrapper().eq("driver", "mqpay_alipay")); + + /** + * 防止破解 + */ + if (!orders.getPayType().equals(aliPays.getDriver())) { + return "不要搞我啦!!"; + } + + Map mapTypes = JSON.parseObject(aliPays.getConfig()); + key = mapTypes.get("key").toString(); + } + + String mysign = mqPay.md5(payId + param + type + price + money + key); + + if (mysign.equals(sign)) { + String date = new SimpleDateFormat("yyyyMMdd").format(new Date()); + String seconds = new SimpleDateFormat("HHmmss").format(new Date()); + String number = StringUtil.getRandomNumber(6); + String payNo = date + seconds + number; + + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(payId, () -> { + String returnBig1 = returnBig(money, price, payId, payNo, param, "success", "fiald"); + notifyText.set(returnBig1); + }); + return notifyText.get(); + + } else { + return "fiald"; + } + } + + @RequestMapping("/mqpay/returnUrl") + public void returnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException { + + /** + *验证通知 处理自己的业务 + */ + Map params = RequestParamsUtil.getParameterMap(request); + String param = params.get("param"); + String price = params.get("price"); + String reallyPrice = params.get("reallyPrice"); + String sign = params.get("sign"); + String payId = params.get("payId"); + String type = params.get("type"); + + String key = null; + if (Integer.parseInt(type) == 1) { // wxpay + Pays wxPays = paysService.getOne(new QueryWrapper().eq("driver", "mqpay_wxpay")); + Map mapTypes = JSON.parseObject(wxPays.getConfig()); + key = mapTypes.get("key").toString(); + } else if (Integer.parseInt(type) == 2) { // alipay + Pays aliPays = paysService.getOne(new QueryWrapper().eq("driver", "mqpay_alipay")); + Map mapTypes = JSON.parseObject(aliPays.getConfig()); + key = mapTypes.get("key").toString(); + } + String mysign = mqPay.md5(payId + param + type + price + reallyPrice + key); + if (mysign.equals(sign)) { + String url = "/pay/state/" + payId; + response.sendRedirect(url); + } + } + + @RequestMapping("/epay/notifyUrl") + @ResponseBody + public String zlianpNotify(HttpServletRequest request) { + Map parameterMap = RequestParamsUtil.getParameterMap(request); + + String pid = parameterMap.get("pid"); + String type = parameterMap.get("type"); + String out_trade_no = parameterMap.get("out_trade_no"); + + String driver = ""; + if (type.equals("wxpay")) { + driver = "epay_wxpay"; + } else if (type.equals("alipay")) { + driver = "epay_alipay"; + } else if (type.equals("qqpay")) { + driver = "epay_qqpay"; + } + + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", driver)); + + /** + * 防止破解 + */ + Orders orders = ordersService.getOne(new QueryWrapper().eq("member", out_trade_no)); + if (!orders.getPayType().equals(pays.getDriver())) { + return "不要搞我啦!!"; + } + + Map mapTypes = JSON.parseObject(pays.getConfig()); + + // 你的key 在后台获取 + String secret_key = mapTypes.get("key").toString(); + String trade_no = parameterMap.get("trade_no"); + String name = parameterMap.get("name"); + String money = parameterMap.get("money"); + String trade_status = parameterMap.get("trade_status"); + String return_url = parameterMap.get("return_url"); + String notify_url = parameterMap.get("notify_url"); + String sign = parameterMap.get("sign"); + String sign_type = parameterMap.get("sign_type"); + + Map params = new HashMap<>(); + params.put("pid", pid); + params.put("trade_no", trade_no); + params.put("out_trade_no", out_trade_no); + params.put("type", type); + params.put("name", name); + params.put("money", money); + params.put("return_url", return_url); + params.put("notify_url", notify_url); + params.put("trade_status", trade_status); + + String sign1 = EpayUtil.createSign(params, secret_key); + + if (sign1.equals(sign)) { + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(out_trade_no, () -> { + String returnBig1 = returnBig(money, money, out_trade_no, trade_no, name, "success", "final"); + notifyText.set(returnBig1); + }); + return notifyText.get(); + } else { + return "签名错误!!"; + } + } + + @RequestMapping("/epay/returnUrl") + @ResponseBody + public void zlianpReturnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException { + + /** + *验证通知 处理自己的业务 + */ + Map parameterMap = RequestParamsUtil.getParameterMap(request); + + String pid = parameterMap.get("pid"); + String type = parameterMap.get("type"); + + String driver = ""; + if (type.equals("wxpay")) { + driver = "epay_wxpay"; + } else if (type.equals("alipay")) { + driver = "epay_alipay"; + } else if (type.equals("qqpay")) { + driver = "epay_qqpay"; + } + + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", driver)); + Map mapTypes = JSON.parseObject(pays.getConfig()); + + // 你的key 在后台获取 + String secret_key = mapTypes.get("key").toString(); + String trade_no = parameterMap.get("trade_no"); + String out_trade_no = parameterMap.get("out_trade_no"); + String name = parameterMap.get("name"); + String money = parameterMap.get("money"); + String trade_status = parameterMap.get("trade_status"); + String return_url = parameterMap.get("return_url"); + String notify_url = parameterMap.get("notify_url"); + String sign = parameterMap.get("sign"); + String sign_type = parameterMap.get("sign_type"); + + Map params = new HashMap<>(); + params.put("pid", pid); + params.put("trade_no", trade_no); + params.put("out_trade_no", out_trade_no); + params.put("type", type); + params.put("name", name); + params.put("money", money); + params.put("return_url", return_url); + params.put("notify_url", notify_url); + params.put("trade_status", trade_status); + + String sign1 = EpayUtil.createSign(params, secret_key); + + if (sign1.equals(sign)) { + String url = "/pay/state/" + out_trade_no; + response.sendRedirect(url); + } + } + + /** + * @param request + * @return + */ + @ResponseBody + @RequestMapping("/yungouos/notify") + public String notify(HttpServletRequest request) throws NoSuchAlgorithmException { + Map params = RequestParamsUtil.getParameterMap(request); + String payNo = params.get("payNo"); + String code = params.get("code"); + String mchId = params.get("mchId"); + String orderNo = params.get("orderNo"); + String money = params.get("money"); + String outTradeNo = params.get("outTradeNo"); + String sign = params.get("sign"); + String payChannel = params.get("payChannel"); + String attach = params.get("attach"); + + Map map = new HashMap<>(); + map.put("code", code); + map.put("orderNo", orderNo); + map.put("outTradeNo", outTradeNo); + map.put("payNo", payNo); + map.put("money", money); + map.put("mchId", mchId); + + String key = null; + Orders orders = ordersService.getOne(new QueryWrapper().eq("member", outTradeNo)); + switch (payChannel) { + //此处因为没启用独立密钥 支付密钥支付宝与微信支付是一样的 (密钥获取:登录 yungouos.com-》我的账户-》商户管理-》商户密钥) + case "wxpay": + Pays wxPays = paysService.getOne(new QueryWrapper().eq("driver", "yungouos_wxpay")); + + /** + * 防止恶意回调 + */ + if (!orders.getPayType().equals(wxPays.getDriver())) { + return "不要搞我啦!!"; + } + + Map wxMap = JSON.parseObject(wxPays.getConfig()); + key = wxMap.get("key").toString(); + break; + case "alipay": + Pays alipays = paysService.getOne(new QueryWrapper().eq("driver", "yungouos_alipay")); + + /** + * 防止恶意回调 + */ + if (!orders.getPayType().equals(alipays.getDriver())) { + return "不要搞我啦!!"; + } + + Map aliMap = JSON.parseObject(alipays.getConfig()); + key = aliMap.get("key").toString(); + break; + default: + break; + } + + String mySign = createSign(map, key); + if (mySign.equals(sign) && Integer.parseInt(code) == 1) { + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(outTradeNo, () -> { + String returnBig1 = returnBig(money, money, outTradeNo, payNo, attach, "SUCCESS", "FIALD"); + notifyText.set(returnBig1); + }); + return notifyText.get(); + } else { + //签名错误 + return "FIALD"; + } + } + + /** + * 虎皮椒支付通知 + * + * @return + */ + @RequestMapping("/xunhupay/notifyUrl") + @ResponseBody + public String xunhuNotifyUrl(XunhuNotIfy xunhuNotIfy) { + Orders orders = ordersService.getOne(new QueryWrapper().eq("member", xunhuNotIfy.getTrade_order_id())); + String key = null; + if (orders.getPayType().equals("xunhupay_wxpay")) { + Pays xunhuwxPays = paysService.getOne(new QueryWrapper().eq("driver", "xunhupay_wxpay")); + + /** + * 防止恶意回调 + */ + if (!orders.getPayType().equals(xunhuwxPays.getDriver())) { + return "不要搞我啦!!"; + } + + Map xunhuwxMap = JSON.parseObject(xunhuwxPays.getConfig()); + key = xunhuwxMap.get("appsecret").toString(); + } else if (orders.getPayType().equals("xunhupay_alipay")) { + Pays xunhualiPays = paysService.getOne(new QueryWrapper().eq("driver", "xunhupay_alipay")); + + /** + * 防止恶意回调 + */ + if (!orders.getPayType().equals(xunhualiPays.getDriver())) { + return "不要搞我啦!!"; + } + + Map xunhualiMap = JSON.parseObject(xunhualiPays.getConfig()); + key = xunhualiMap.get("appsecret").toString(); + } + + Map map = JSON.parseObject(JSON.toJSONString(xunhuNotIfy), Map.class); + + String sign = PayUtils.createSign(map, key); + if (sign.equals(xunhuNotIfy.getHash()) && "OD".equals(xunhuNotIfy.getStatus())) { + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(xunhuNotIfy.getTrade_order_id(), () -> { + String returnBig = returnBig(xunhuNotIfy.getTotal_fee().toString(), xunhuNotIfy.getTotal_fee().toString(), xunhuNotIfy.getTrade_order_id(), xunhuNotIfy.getTransaction_id(), xunhuNotIfy.getPlugins(), "success", "fiald"); + notifyText.set(returnBig); + }); + return notifyText.get(); + } else { + return "fiald"; + } + } + + /** + * 虎皮椒支付通知 + * + * @param request + * @return + */ + @RequestMapping("/xunhupay/returnUrl") + @ResponseBody + public void xunhuReturnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException { + // 记得 map 第二个泛型是数组 要取 第一个元素 即[0] + Map params = RequestParamsUtil.getParameterMap(request); + String url = "/pay/state/" + params.get("trade_order_id"); + response.sendRedirect(url); + } + + /** + * 异步通知 + * + * @param notifyDTO + * @return + */ + @RequestMapping("/payjs/notify") + @ResponseBody + public Object payjsNotify(NotifyDTO notifyDTO) { + Map notifyData = new HashMap<>(); + notifyData.put("return_code", notifyDTO.getReturn_code()); + notifyData.put("total_fee", notifyDTO.getTotal_fee()); + notifyData.put("out_trade_no", notifyDTO.getOut_trade_no()); + notifyData.put("payjs_order_id", notifyDTO.getPayjs_order_id()); + notifyData.put("transaction_id", notifyDTO.getTransaction_id()); + notifyData.put("time_end", notifyDTO.getTime_end()); + notifyData.put("openid", notifyDTO.getOpenid()); + notifyData.put("mchid", notifyDTO.getMchid()); + + // options + if (notifyDTO.getAttach() != null) { + notifyData.put("attach", notifyDTO.getAttach()); + } + if (notifyDTO.getType() != null) { + notifyData.put("type", notifyDTO.getType()); + } + Orders orders = ordersService.getOne(new QueryWrapper().eq("member", notifyDTO.getOut_trade_no())); + String key = null; + if (notifyDTO.getType() != null) { // 支付宝 + Pays aliPays = paysService.getOne(new QueryWrapper().eq("driver", "payjs_alipay")); + + /** + * 防止恶意回调 + */ + if (!orders.getPayType().equals(aliPays.getDriver())) { + return "不要搞我啦!!"; + } + + Map wxMap = JSON.parseObject(aliPays.getConfig()); + key = wxMap.get("key").toString(); + } else { // 微信 + Pays wxPays = paysService.getOne(new QueryWrapper().eq("driver", "payjs_wxpay")); + + /** + * 防止恶意回调 + */ + if (!orders.getPayType().equals(wxPays.getDriver())) { + return "不要搞我啦!!"; + } + + Map wxMap = JSON.parseObject(wxPays.getConfig()); + key = wxMap.get("key").toString(); + } + + String sign = SignUtil.sign(notifyData, key); + if (sign.equals(notifyDTO.getSign())) { + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(notifyDTO.getOut_trade_no(), () -> { + String returnBig = returnBig(notifyDTO.getTotal_fee(), notifyDTO.getTotal_fee(), notifyDTO.getOut_trade_no(), notifyDTO.getTransaction_id(), notifyDTO.getAttach(), "success", "failure"); + notifyText.set(returnBig); + }); + return notifyText.get(); + } else { + return "failure"; + } + } + + /** + * 微信官方异步通知 + * + * @param request + * @param response + * @return + */ + @RequestMapping("/wxpay/notify") + @ResponseBody + public String wxPayNotify(HttpServletRequest request, HttpServletResponse response) { + String resXml = ""; + InputStream inStream; + try { + inStream = request.getInputStream(); + ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = inStream.read(buffer)) != -1) { + outSteam.write(buffer, 0, len); + } + System.out.println("wxnotify:微信支付----start----"); + // 获取微信调用我们notify_url的返回信息 + String result = outSteam.toString(String.valueOf(StandardCharsets.UTF_8)); + System.out.println("wxnotify:微信支付----result----=" + result); + + // 关闭流 + outSteam.close(); + inStream.close(); + + // xml转换为map + Map resultMap = WXPayUtil.xmlToMap(result); + boolean isSuccess = false; + String result_code = resultMap.get("result_code"); + String out_trade_no = resultMap.get("out_trade_no");// 商户系统内部订单号 + if ("SUCCESS".equals(result_code)) { + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", "wxpay")); + + /** + * 防止恶意回调 + */ + Orders orders1 = ordersService.getOne(new QueryWrapper().eq("member", out_trade_no)); + if (!orders1.getPayType().equals(pays.getDriver())) { + return "不要搞我啦!!"; + } + + Map mapTypes = JSON.parseObject(pays.getConfig()); + String key = mapTypes.get("key").toString(); // 密钥 + + /** + * 签名成功 + */ + if (WXPayUtil.isSignatureValid(resultMap, key)) { + String total_fee = resultMap.get("total_fee");// 订单总金额,单位为分 + String transaction_id = resultMap.get("transaction_id");// 微信支付订单号 + String attach = resultMap.get("attach");// 商家数据包,原样返回 + String appid = resultMap.get("appid");// 微信分配的小程序ID + + BigDecimal bigDecimal = new BigDecimal(total_fee); + BigDecimal multiply = bigDecimal.divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_DOWN); + String money = new DecimalFormat("0.##").format(multiply); + Orders member = ordersService.getOne(new QueryWrapper().eq("member", out_trade_no)); + if (member.getPayType().equals("wxpay")) { + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(out_trade_no, () -> { + String returnBig = returnBig(money, money, out_trade_no, transaction_id, attach, WxpayresXml, resFailXml); + notifyText.set(returnBig); + }); + resXml = notifyText.get(); + } else { + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(out_trade_no, () -> { + String returnBig = returnBig(money, money, out_trade_no, transaction_id, attach, WxpayH5resXml, resFailXml); + notifyText.set(returnBig); + }); + resXml = notifyText.get(); + } + } else { + System.out.println("签名判断错误!!"); + } + } + } catch (Exception e) { + System.out.println("wxnotify:支付回调发布异常:" + e); + } finally { + try { + // 处理业务完毕 + BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream()); + out.write(resXml.getBytes()); + out.flush(); + out.close(); + } catch (IOException e) { + System.out.println("wxnotify:支付回调发布异常:out:" + e); + } + } + return resXml; + } + + /** + * 支付宝当面付 异步通知 + * + * @param request 接收 + * @return 返回 + */ + @RequestMapping("/alipay/notify") + @ResponseBody + @SneakyThrows(Exception.class) + public String alipayNotifyUrl(HttpServletRequest request) { + Map params = Maps.newHashMap(); + Map requestParams = request.getParameterMap(); + for (String name : requestParams.keySet()) { + String[] values = requestParams.get(name); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] + : valueStr + values[i] + ","; + } + //乱码解决,这段代码在出现乱码时使用 + valueStr = new String(valueStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + params.put(name, valueStr); + } + + String out_trade_no = params.get("out_trade_no");// 商户订单号 + Orders orders = ordersService.getOne(new QueryWrapper().eq("member", out_trade_no)); + + if ("alipay".equals(orders.getPayType())) { + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", "alipay")); + /** + * 防止恶意回调 + */ + if (!orders.getPayType().equals(pays.getDriver())) { + return "不要搞我啦!!"; + } + } else if ("alipay_pc".equals(orders.getPayType())) { + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", "alipay_pc")); + /** + * 防止恶意回调 + */ + if (!orders.getPayType().equals(pays.getDriver())) { + return "不要搞我啦!!"; + } + } + + Boolean verifyNotify = Factory.Payment.Common().verifyNotify(params); + if (verifyNotify) { + String total_amount = params.get("total_amount");// 付款金额 + String trade_no = params.get("trade_no");// 流水 + String receipt_amount = params.get("receipt_amount");// 实际支付金额 + String body = params.get("subject");// 状态 + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(out_trade_no, () -> { + String returnBig1 = returnBig(receipt_amount, total_amount, out_trade_no, trade_no, body, "success", "failure"); + notifyText.set(returnBig1); + }); + return notifyText.get(); + } else { + System.out.println("签名错误!!"); + return "failure"; + } + } + + /** + * 支付宝PC支付返回接口 + * + * @param request + * @param response + * @throws IOException + */ + @RequestMapping("/alipay/return_url") + @SneakyThrows(Exception.class) + public void alipayReturnUrl(HttpServletRequest request, HttpServletResponse response) { + Map params = Maps.newHashMap(); + Map requestParams = request.getParameterMap(); + for (String name : requestParams.keySet()) { + String[] values = requestParams.get(name); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] + : valueStr + values[i] + ","; + } + //乱码解决,这段代码在出现乱码时使用 + valueStr = new String(valueStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + params.put(name, valueStr); + } + Boolean verifyNotify = Factory.Payment.Common().verifyNotify(params); + // 验签成功 + if (verifyNotify) { + String pay_no = params.get("trade_no"); // 流水号 + String member = params.get("out_trade_no");// 商户订单号 + if (pay_no != null || pay_no != "") { + String url = "/search/order/" + member; + response.sendRedirect(url); + } + } else { + System.out.println("支付, 验签失败..."); + } + } + + /** + * 取消订单 + * + * @return + */ + @GetMapping("/paypal/cancel") + @ResponseBody + public String cancelPay() { + return "cancel"; + } + + /** + * 完成支付 + * + * @param paymentId + * @param payerId + * @param response + * @return + */ + @GetMapping("/paypal/success") + @ResponseBody + public String successPay(@RequestParam("paymentId") String paymentId, @RequestParam("PayerID") String payerId, HttpServletResponse response) { + try { + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", "paypal")); + Map mapTypes = JSON.parseObject(pays.getConfig()); + String clientId = mapTypes.get("clientId").toString(); + String clientSecret = mapTypes.get("clientSecret").toString(); + Payment payment = PaypalSend.executePayment(clientId, clientSecret, paymentId, payerId); + if (payment.getState().equals("approved")) { + String member = null; // 订单号 + String total = null; // 金额 + String pay_no = payment.getId(); + List transactions = payment.getTransactions(); + for (Transaction transaction : transactions) { + member = transaction.getDescription(); + total = transaction.getAmount().getTotal(); // 实际付款金额 + } + Orders orders = ordersService.getOne(new QueryWrapper().eq("member", member)); + /** + * 防止恶意回调 + */ + if (!orders.getPayType().equals(pays.getDriver())) { + return "不要搞我啦!!"; + } + String returnBig = returnBig(total, orders.getPrice().toString(), member, pay_no, orders.getProductId().toString(), "success", "failure"); + if (returnBig.equals("success")) { + response.sendRedirect("/search/order/" + member); + } else { + response.sendRedirect("/search/order/" + member); + } + } + } catch (PayPalRESTException | IOException e) { + e.printStackTrace(); + } + return "redirect:/"; + } + + /** + * epusdt + * + * @param epusdtNotify + * @return + */ + @PostMapping("/epusdt/notifyUrl") + @ResponseBody + public String epusdt(@RequestBody EpusdtNotify epusdtNotify) { + epusdtNotify.setAmount(epusdtNotify.getAmount().setScale(2, RoundingMode.HALF_UP).stripTrailingZeros().stripTrailingZeros()); + Orders orders = ordersService.getOne(Wrappers.lambdaQuery().eq(Orders::getMember, epusdtNotify.getOrder_id())); + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", "epusdt")); + if (!orders.getPayType().equals(pays.getDriver())) { + return "error!"; + } + Map mapTypes = JSON.parseObject(pays.getConfig()); + String key = mapTypes.get("key").toString(); + String sign = sendPay.createSign(epusdtNotify, key); + if (sign.equals(epusdtNotify.getSignature())) { + AtomicReference notifyText = new AtomicReference<>(); + synchronizedByKeyService.exec(epusdtNotify.getOrder_id(), () -> { + String returnBig = returnBig(orders.getMoney().toString(), orders.getMoney().toString(), epusdtNotify.getOrder_id(), + epusdtNotify.getTrade_id(), orders.getProductId().toString(), "ok", "fail"); + notifyText.set(returnBig); + }); + return notifyText.get(); + } + return "fail"; + } + + @RequestMapping("/epusdt/returnUrl") + @ResponseBody + public void epusdtReturnUrl(String order_id, HttpServletResponse response) throws IOException { + String url = "/pay/state/" + order_id; + response.sendRedirect(url); + } + + /** + * 业务处理 + * + * @param money 实收款金额 + * @param price 订单金额 + * @param payId 订单号 + * @param pay_no 流水号 + * @param param 自定义内容 + * @param success 返回成功 + * @param fiald 返回失败 + * @return this + */ + private String returnBig(String money, String price, String payId, String pay_no, String param, String success, String fiald) { + /** + * 通过订单号查询 + */ + Orders member = ordersService.getOne(new QueryWrapper().eq("member", payId)); + if (member == null) { + return "没有找到这个订单"; // 本地没有这个订单 + } + + if (member.getStatus() > 0) { + return success; + } + + boolean empty = StringUtils.isEmpty(member.getCardsInfo()); + if (!empty) { + return success; + } + + Products products = productsService.getById(param); + if (products == null) { + return "商品找不到了"; // 商品没了 + } + + Website website = websiteService.getById(1); + ShopSettings shopSettings = shopSettingsService.getById(1); + + Orders orders = new Orders(); + orders.setId(member.getId()); + orders.setPayTime(new Date()); + orders.setPayNo(pay_no); + orders.setPrice(new BigDecimal(price)); + orders.setMoney(new BigDecimal(money)); + + if (products.getShipType() == 0) { // 自动发货的商品 + + /** + * 卡密信息列表 + * 通过商品购买数量来获取对应商品的卡密数量 + */ + if (products.getSellType() == 0) { // 一次性卡密类型 + + List cardsList = cardsService.getBaseMapper().selectList(new QueryWrapper() + .eq("status", 0) + .eq("product_id", products.getId()) + .eq("sell_type", 0) + .orderBy(true, false, "rand()") + .last("LIMIT " + member.getNumber() + "")); + + if (cardsList == null) return fiald; // 空值的话直接返回错误提示 + + StringBuilder orderInfo = new StringBuilder(); // 订单关联的卡密信息 + List updateCardsList = new ArrayList<>(); + for (Cards cards : cardsList) { + orderInfo.append(cards.getCardInfo()).append("\n"); // 通过StringBuilder 来拼接卡密信息 + + /** + * 设置每条被购买的卡密的售出状态 + */ + Cards cards1 = new Cards(); + cards1.setId(cards.getId()); + cards1.setStatus(1); + cards1.setNumber(0); + cards1.setSellNumber(1); + cards1.setUpdatedAt(new Date()); + + updateCardsList.add(cards1); + } + + // 去除多余尾部的逗号 + String result = orderInfo.deleteCharAt(orderInfo.length() - 1).toString(); + + orders.setStatus(1); // 设置已售出 + orders.setCardsInfo(result); + + // 更新售出的订单 + if (ordersService.updateById(orders)) { + // 设置售出的卡密 + cardsService.updateBatchById(updateCardsList); + } else { + return fiald; + } + } else if (products.getSellType() == 1) { // 重复销售的卡密 + StringBuilder orderInfo = new StringBuilder(); // 订单关联的卡密信息 + + Cards cards = cardsService.getOne(new QueryWrapper().eq("product_id", products.getId()).eq("status", 0).eq("sell_type", 1)); + if (cards == null) { + return fiald; // 空值的话直接返回错误提示 + } + + /** + * 设置每条被购买的卡密的售出状态 + */ + Cards cards1 = new Cards(); + cards1.setId(cards.getId()); + cards1.setUpdatedAt(new Date()); + if (cards.getNumber() == 1) { // 还剩下一个卡密 + cards1.setSellNumber(cards.getSellNumber() + member.getNumber()); + cards1.setNumber(cards.getNumber() - member.getNumber()); // 减完之后等于0 + cards1.setStatus(1); // 设置状态为已全部售出 + } else { + cards1.setSellNumber(cards.getSellNumber() + member.getNumber()); + cards1.setNumber(cards.getNumber() - member.getNumber()); + } + + /** + * 看用户购买了多少个卡密 + * 正常重复的卡密不会购买1个以上 + * 这里做个以防万一呀(有钱谁不赚) + */ + for (int i = 0; i < member.getNumber(); i++) { + orderInfo.append(cards.getCardInfo()).append("\n"); + } + + // 去除多余尾部的逗号 + String result = orderInfo.deleteCharAt(orderInfo.length() - 1).toString(); + orders.setStatus(1); // 设置已售出 + orders.setCardsInfo(result); + + // 设置售出的商品 + if (ordersService.updateById(orders)) { + cardsService.updateById(cards1); + } else { + return fiald; + } + } + + /** + * 微信的 wxpush 通知 + * 本通知只针对站长 + * 当用户购买成功后会给您设置的 + * wxpush 微信公众号发送订单购买成功后的通知 + */ + if (shopSettings.getIsWxpusher() == 1) { + Message message = new Message(); + message.setContent(website.getWebsiteName() + "新订单提醒
订单号:" + member.getMember() + "
商品名称:" + products.getName() + "
购买数量:" + member.getNumber() + "
订单金额:" + member.getMoney() + "
支付状态:成功
"); + message.setContentType(Message.CONTENT_TYPE_HTML); + message.setUid(shopSettings.getWxpushUid()); + message.setAppToken(shopSettings.getAppToken()); + WxPusher.send(message); + } + + /** + * 邮件通知 + * 后台开启邮件通知, + * 这里会给下单用户的邮箱发送一条邮件 + */ + if (shopSettings.getIsEmail() == 1) { + if (!StringUtils.isEmpty(member.getEmail())) { + if (FormCheckUtil.isEmail(member.getEmail())) { + Map map = new HashMap<>(); // 页面的动态数据 + map.put("title", website.getWebsiteName()); + map.put("member", member.getMember()); + map.put("date", DateUtil.getDate()); + map.put("password", member.getPassword()); + map.put("url", website.getWebsiteUrl() + "/search/order/" + member.getMember()); + try { + emailService.sendHtmlEmail(website.getWebsiteName() + "发货提醒", "email/sendShip.html", map, new String[]{member.getEmail()}); + // emailService.sendTextEmail("卡密购买成功", "您的订单号为:" + member.getMember() + " 您的卡密:" + cards.getCardInfo(), new String[]{member.getEmail()}); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } else { // 手动发货商品 + Products products1 = new Products(); + products1.setId(products.getId()); + products1.setInventory(products.getInventory() - member.getNumber()); + products1.setSales(products.getSales() + member.getNumber()); + + orders.setStatus(2); // 手动发货模式 为待处理 + if (ordersService.updateById(orders)) { + // 更新售出 + productsService.updateById(products1); + } else { + return fiald; + } + + /** + * 微信的 wxpush 通知 + * 本通知只针对站长 + * 当用户购买成功后会给您设置的 + * wxpush 微信公众号发送订单购买成功后的通知 + */ + if (shopSettings.getIsWxpusher() == 1) { + Message message = new Message(); + message.setContent(website.getWebsiteName() + "新订单提醒
订单号:" + member.getMember() + "
商品名称:" + products.getName() + "
购买数量:" + member.getNumber() + "
订单金额:" + member.getMoney() + "
支付状态:成功
"); + message.setContentType(Message.CONTENT_TYPE_HTML); + message.setUid(shopSettings.getWxpushUid()); + message.setAppToken(shopSettings.getAppToken()); + WxPusher.send(message); + } + + /** + * 邮件通知 + * 后台开启邮件通知, + * 这里会给下单用户的邮箱发送一条邮件 + */ + if (shopSettings.getIsEmail() == 1) { + if (FormCheckUtil.isEmail(member.getEmail())) { + try { + emailService.sendTextEmail(website.getWebsiteName() + " 订单提醒", "您的订单号为:" + member.getMember() + " 本商品为手动发货,请耐心等待!", new String[]{member.getEmail()}); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + return success; + } + + @GetMapping("/order/state/{orderid}") + @ResponseBody + public JsonResult state(@PathVariable("orderid") String orderid) { + Orders orders = ordersService.getOne(new QueryWrapper().eq("id", orderid)); + if (!StringUtils.isEmpty(orders.getPayNo())) { + return JsonResult.ok().setCode(200).setData(1); + } else { + return JsonResult.ok().setData(0); + } + } + + + public static String packageSign(Map params, boolean urlEncoder) { + // 先将参数以其参数名的字典序升序进行排序 + TreeMap sortedParams = new TreeMap(params); + // 遍历排序后的字典,将所有参数按"key=value"格式拼接在一起 + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (Map.Entry param : sortedParams.entrySet()) { + String value = param.getValue(); + if (org.apache.commons.lang3.StringUtils.isBlank(value)) { + continue; + } + if (first) { + first = false; + } else { + sb.append("&"); + } + sb.append(param.getKey()).append("="); + if (urlEncoder) { + try { + value = urlEncode(value); + } catch (UnsupportedEncodingException e) { + } + } + sb.append(value); + } + return sb.toString(); + } + + public static String urlEncode(String src) throws UnsupportedEncodingException { + return URLEncoder.encode(src, Charsets.UTF_8.name()).replace("+", "%20"); + } + + public static String createSign(Map params, String partnerKey) throws NoSuchAlgorithmException { + // 生成签名前先去除sign + params.remove("sign"); + String stringA = packageSign(params, false); + String stringSignTemp = stringA + "&key=" + partnerKey; + + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update((stringSignTemp).getBytes()); + String mySign = new BigInteger(1, md.digest()).toString(16).toUpperCase(); + if (mySign.length() != 32) { + mySign = "0" + mySign; + } + return mySign; + } + +} diff --git a/src/main/java/com/bomaos/reception/controller/OrderController.java b/src/main/java/com/bomaos/reception/controller/OrderController.java new file mode 100644 index 0000000..17d0787 --- /dev/null +++ b/src/main/java/com/bomaos/reception/controller/OrderController.java @@ -0,0 +1,743 @@ +package com.bomaos.reception.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bomaos.carmi.entity.Cards; +import com.bomaos.carmi.service.CardsService; +import com.bomaos.common.core.Constants; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.pays.alipay.AlipayUtil; +import com.bomaos.common.core.pays.budpay.BudpayUtil; +import com.bomaos.common.core.pays.epay.EpayUtil; +import com.bomaos.common.core.pays.epusdt.entity.EpusdtEntity; +import com.bomaos.common.core.pays.epusdt.sendPay; +import com.bomaos.common.core.pays.mqpay.mqPay; +import com.bomaos.common.core.pays.payjs.sendPayjs; +import com.bomaos.common.core.pays.paypal.PaypalSend; +import com.bomaos.common.core.pays.paypal.config.PaypalPaymentIntent; +import com.bomaos.common.core.pays.paypal.config.PaypalPaymentMethod; +import com.bomaos.common.core.pays.wxpay.SendWxPay; +import com.bomaos.common.core.pays.xunhupay.PayUtils; +import com.bomaos.common.core.pays.yungouos.YunGouosConfig; +import com.bomaos.common.core.utils.*; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.common.system.service.EmailService; +import com.bomaos.dashboard.DateStrUtil; +import com.bomaos.orders.entity.Orders; +import com.bomaos.orders.service.OrdersService; +import com.bomaos.products.entity.Products; +import com.bomaos.products.service.ProductsService; +import com.bomaos.reception.common.PaysEnmu; +import com.bomaos.settings.entity.Coupon; +import com.bomaos.settings.entity.Pays; +import com.bomaos.settings.entity.ShopSettings; +import com.bomaos.settings.service.CouponService; +import com.bomaos.settings.service.PaysService; +import com.bomaos.settings.service.ShopSettingsService; +import com.bomaos.theme.entity.Theme; +import com.bomaos.theme.service.ThemeService; +import com.bomaos.website.entity.Website; +import com.bomaos.website.service.WebsiteService; +import com.paypal.api.payments.Links; +import com.paypal.api.payments.Payment; +import com.zjiecode.wxpusher.client.WxPusher; +import com.zjiecode.wxpusher.client.bean.Message; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.ui.Model; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.math.BigDecimal; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.*; + +import static com.bomaos.dashboard.DashboardController.getQueryWrapper; + +@Controller +@Transactional +public class OrderController extends BaseController { + + @Autowired + private OrdersService ordersService; + + @Autowired + private PaysService paysService; + + @Autowired + private ProductsService productsService; + + @Autowired + private CardsService cardsService; + + @Autowired + private WebsiteService websiteService; + + @Autowired + private CouponService couponService; + + @Autowired + private ThemeService themeService; + + @Autowired + private EmailService emailService; + + @Autowired + private ShopSettingsService shopSettingsService; + + /** + * 添加 + */ + @ResponseBody + @RequestMapping("/buy") + public JsonResult save(HttpServletResponse response, HttpServletRequest request) { + + // 记得 map 第二个泛型是数组 要取 第一个元素 即[0] + Map params = RequestParamsUtil.getParameterMap(request); + Integer goodsId = Integer.parseInt(params.get("goodsId")); + Integer number = Integer.parseInt(params.get("number")); + String contact = params.get("contact"); + String coupon = params.get("coupon"); + String payType = params.get("payType"); + String password = params.get("password"); + + if (StringUtils.isEmpty(goodsId)) { + return JsonResult.error("商品不能为空"); + } else if (StringUtils.isEmpty(contact)) { + return JsonResult.error("联系方式不能为空!"); + } else if (StringUtils.isEmpty(number)) { + return JsonResult.error("商品数量不能小于或等于0"); + } else if (StringUtils.isEmpty(payType)) { + return JsonResult.error("请选择付款方式!"); + } + + boolean isMobile = DeviceUtils.isMobileDevice(request); + if (isMobile) { + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", payType).eq("is_mobile", 1)); + if (ObjectUtils.isEmpty(pays)) { + return JsonResult.error("不要搞我啦!!"); + } + } else { + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", payType).eq("is_pc", 1)); + if (ObjectUtils.isEmpty(pays)) { + return JsonResult.error("不要搞我啦!!"); + } + } + + Products products = productsService.getById(goodsId); + + /** + * 检查附加内容是否为已填写 + */ + Integer isCustomize = products.getIsCustomize(); + if (isCustomize == 1) { + String customizeInput = products.getCustomizeInput(); + String[] customize = customizeInput.split("\\n"); + for (String s : customize) { + String[] split = s.split("="); + String s1 = params.get(split[0]); // get到提交过来的字段内容 + if ("true".equals(split[2])) { + if (StringUtils.isEmpty(s1)) { + return JsonResult.error(split[1] + "没有填写、请填写后再下单。"); + } + } + } + } + + UserAgentGetter agentGetter = new UserAgentGetter(request); + Integer restricts = products.getRestricts(); + // 判断是不是限购 + if (restricts >= 1) { + JsonResult jsonResult = restricts(goodsId, number, restricts, agentGetter.getIp()); + if (jsonResult != null) { + return jsonResult; + } + } + + if (!StringUtils.isEmpty(products.getIsPassword())) { + if (products.getIsPassword() == 1) { + if (StringUtils.isEmpty(password)) { + return JsonResult.error("商品查询密码不能为空!!"); + } + } + } + + if (products.getShipType() == 0) { // 自动发货模式 + long count = 0; + if (products.getSellType() == 1) { + Cards cards = cardsService.getOne(new QueryWrapper().eq("product_id", products.getId()).eq("status", 0).eq("sell_type", 1)); + if (ObjectUtils.isEmpty(cards)) { + count = 0; + } else { + count = cards.getNumber(); + } + } else { + count = cardsService.count(new QueryWrapper().eq("product_id", goodsId).eq("status", 0).eq("sell_type", 0)); + } + if (count == 0) { + return JsonResult.error("本商品已售空,请联系店长补货!"); + } else if (number > count) { + return JsonResult.error("商品购买数量不能大于商品剩余数量!"); + } + } else { // 手动发货模式 + if (products.getInventory() == 0) { + return JsonResult.error("本商品已售空,请联系店长补货!"); + } else if (number > products.getInventory()) { + return JsonResult.error("商品购买数量不能大于商品剩余数量!"); + } + } + + try { + Integer couponId = null; + if (!StringUtils.isEmpty(coupon)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("product_id", goodsId) // 商品id + .eq("coupon", coupon) // 优惠券代码 + .eq("status", 0); // 没有使用的 + + Coupon coupon1 = couponService.getOne(queryWrapper); + if (!ObjectUtils.isEmpty(coupon1)) { // 判断 coupon1 是否不为空 + /** + * 拿到优惠券 entity + */ + couponId = coupon1.getId(); + } else { + /** + * 给前端返回优惠券失效或者为空的信息 + */ + return JsonResult.error("该优惠券代码已被使用过,或不能使用在本商品,请核对后再试!"); + } + } + /** + * 处理订单业务 + */ + Map buy = ordersService.buy(goodsId, number, contact, couponId, payType, password, request); + + Cookie[] cookies = request.getCookies(); + if (ObjectUtils.isEmpty(cookies)) { + /** + * 创建 cookie + * 将订单信息保存到浏览器 + */ + Cookie cookie1 = new Cookie("BROWSER_ORDERS_CACHE", buy.get("member")); + cookie1.setMaxAge(24 * 60 * 60); // 1天过期 + // 将cookie对象加入response响应 + response.addCookie(cookie1); + } else { + for (Cookie cookie : cookies) { + String cookieName = cookie.getName(); + if ("BROWSER_ORDERS_CACHE".equals(cookieName)) { + String cookieValue = cookie.getValue(); + /** + * 创建 cookie + * 将订单信息保存到浏览器 + */ + Cookie cookie1 = new Cookie("BROWSER_ORDERS_CACHE", cookieValue + "=" + buy.get("member")); + cookie1.setMaxAge(24 * 60 * 60); // 1天过期 + // 将cookie对象加入response响应 + response.addCookie(cookie1); + break; + } else { + /** + * 创建 cookie + * 将订单信息保存到浏览器 + */ + Cookie cookie1 = new Cookie("BROWSER_ORDERS_CACHE", buy.get("member")); + cookie1.setMaxAge(24 * 60 * 60); // 1天过期 + // 将cookie对象加入response响应 + response.addCookie(cookie1); + } + } + } + + return JsonResult.ok("订单创建成功!").setCode(200).setData(buy); + } catch (Exception e) { + e.printStackTrace(); + return JsonResult.error("订单创建失败"); + } + } + + @OperLog(value = "支付", desc = "提交支付") + @ResponseBody + @RequestMapping(value = "/alipayPc/{member}", produces = "text/html") + public String payAlipayPc(@PathVariable("member") String member, HttpServletResponse response) throws IOException, NoSuchAlgorithmException { + Orders orders = ordersService.selectByMember(member); + Products products = productsService.getById(orders.getProductId()); + + String productDescription = products.getId().toString(); // 订单备注 + String ordersMember = orders.getMember(); // 订单号 + String goodsName = products.getName(); // 订单主题 + String price = orders.getMoney().toString(); + + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", orders.getPayType())); + + if (price.equals("0.00")) { // 0元商品 直接完成支付 + String currentTime = Long.toString(System.currentTimeMillis()); + boolean big = returnBig(price, price, orders.getMember(), currentTime, productDescription); + if (big) { + response.sendRedirect("/search/order/" + orders.getMember()); + return null; + } + } + /** + * 创建支付接口 + * 使用枚举加switch + */ + switch (Objects.requireNonNull(PaysEnmu.getByValue(orders.getPayType()))) { + case ALIPAY_PC: // 支付宝pc支付 + try { + String pcPage = AlipayUtil.getPcPage(pays, productDescription, ordersMember, price); + // String payAlipayPc = SendAlipay.payAlipayPc(pays, price, ordersMember, goodsName, productDescription); + return pcPage; + } catch (Exception e) { + e.printStackTrace(); + } + break; + default: + break; + } + return null; + } + + @OperLog(value = "支付", desc = "提交支付") + @RequestMapping(value = "/pay/{member}", produces = "text/html") + public String pay(Model model, @PathVariable("member") String member, HttpServletResponse response, HttpServletRequest request) throws IOException, NoSuchAlgorithmException { + Orders orders = ordersService.selectByMember(member); + Products products = productsService.getById(orders.getProductId()); + + String productDescription = products.getId().toString(); // 订单备注 + String ordersMember = orders.getMember(); // 订单号 + String goodsName = products.getName(); // 订单主题 + String cloudPayid = orders.getCloudPayid(); + String price = orders.getMoney().toString(); + UserAgentGetter agentGetter = new UserAgentGetter(request); + Pays pays = paysService.getOne(new QueryWrapper().eq("driver", orders.getPayType())); + + if ("0.00".equals(price)) { // 0元商品 直接完成支付 + String currentTime = Long.toString(System.currentTimeMillis()); + boolean big = returnBig(price, price, orders.getMember(), currentTime, productDescription); + if (big) { + response.sendRedirect("/search/order/" + orders.getMember()); + return null; + } else { + return null; + } + } + + model.addAttribute("goodsName", goodsName); + model.addAttribute("price", price); + model.addAttribute("ordersMember", ordersMember); + model.addAttribute("orderId", orders.getId()); + + Website website = websiteService.getById(1); + model.addAttribute("website", website); + ShopSettings shopSettings = shopSettingsService.getById(1); + model.addAttribute("isBackground", shopSettings.getIsBackground()); + model.addAttribute("shop", shopSettings); + Theme theme = themeService.getOne(Wrappers.lambdaQuery().eq(Theme::getEnable, 1)); + + /** + * 创建支付接口 + * 使用枚举加switch + */ + switch (Objects.requireNonNull(PaysEnmu.getByValue(orders.getPayType()))) { + case MQPAY_ALIPAY: // V免签支付宝接口 + case MQPAY_WXPAY: // V免签微信接口 + String createMqPay = mqPay.sendCreateMqPay(pays, price, ordersMember, cloudPayid, productDescription); + response.sendRedirect(createMqPay); + break; + case EPAY_ALIPAY: // 易支付支付宝 + case EPAY_QQPAY: // 易支付QQ钱包 + case EPAY_WXPAY: // 易支付微信 + String zlianSendPay = EpayUtil.epaySendPay(pays, price, ordersMember, productDescription); + response.sendRedirect(zlianSendPay); + break; + case BUDPAY_ALIPAY: // 易支付支付宝 + case BUDPAY_WECHAT: // 易支付微信 + String budpaySendPay = BudpayUtil.budpaySendPay(pays, price, ordersMember, productDescription); + response.sendRedirect(budpaySendPay); + break; + case YUNGOUOS_WXPAY: // yungouos微信 + case YUNGOUOS_ALIPAY: // yungouos支付宝 + String gouos = ""; + if (orders.getPayType().equals("yungouos_wxpay")) { + model.addAttribute("type", 1); + gouos = YunGouosConfig.yunGouosWxPay(pays, price, ordersMember, goodsName, productDescription); + } else if (orders.getPayType().equals("yungouos_alipay")) { + model.addAttribute("type", 2); + gouos = YunGouosConfig.yunGouosAliPay(pays, price, ordersMember, goodsName, productDescription); + } + model.addAttribute("result", JSON.toJSONString(gouos)); + return "theme/" + theme.getDriver() + "/yunpay.html"; + case XUNHUPAY_WXPAY: // 虎皮椒微信 + case XUNHUPAY_ALIPAY: // 虎皮椒支付宝 + Map pay = PayUtils.pay(getWebName(), pays, goodsName, price, ordersMember, productDescription); + if (pay != null) { + response.sendRedirect(pay.get("url1").toString()); + } else { + return "theme/" + theme.getDriver() + "/pay-error.html"; + } + break; + case PAYJS_WXPAY: // payjs 微信 + case PAYJS_ALIPAY: // payjs 支付宝 + String payjs = ""; + if (orders.getPayType().equals("payjs_wxpay")) { + model.addAttribute("type", 1); + payjs = sendPayjs.pay(pays, price, ordersMember, goodsName, productDescription); + } else if (orders.getPayType().equals("payjs_alipay")) { + model.addAttribute("type", 2); + payjs = sendPayjs.pay(pays, price, ordersMember, goodsName, productDescription); + } + model.addAttribute("result", JSON.toJSONString(payjs)); + return "theme/" + theme.getDriver() + "/yunpay.html"; + case WXPAY: // 微信官方扫码 + String payNattve = SendWxPay.payNattve(pays, price, ordersMember, goodsName, productDescription, agentGetter.getIp()); + model.addAttribute("type", 1); // 微信支付 + model.addAttribute("result", JSON.toJSONString(payNattve)); + return "theme/" + theme.getDriver() + "/yunpay.html"; + case ALIPAY: // 支付宝当面付 + String faceToFace = AlipayUtil.getFaceToFace(pays, productDescription, ordersMember, price); + model.addAttribute("type", 2); // 支付宝当面付 + model.addAttribute("result", JSON.toJSONString(faceToFace)); + return "theme/" + theme.getDriver() + "/yunpay.html"; + case WXPAU_H5: // 微信h5支付 + String payMweb = SendWxPay.payMweb(pays, price, ordersMember, goodsName, productDescription, agentGetter.getIp()); + response.sendRedirect(payMweb); + break; + case PAYPAL: // paypal贝宝国际化收款 + try { + Payment payment = PaypalSend.createPayment(pays, price, "USD", PaypalPaymentMethod.paypal, PaypalPaymentIntent.sale, ordersMember); + for (Links links : payment.getLinks()) { + if (links.getRel().equals("approval_url")) { + return "redirect:" + links.getHref(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + break; + case EPUSDT: + EpusdtEntity epusdtEntity = sendPay.createPayment(pays, price, ordersMember, productDescription); + model.addAttribute("title", "支付出错"); + model.addAttribute("msg", epusdtEntity.getMessage()); + switch (epusdtEntity.getStatus_code()) { + case 400: + case 401: + case 10002: + case 10003: + case 10004: + case 10005: + case 10006: + case 10007: + case 10008: + case 10009: + return "theme/" + theme.getDriver() + "/common/payError.html"; + case 200: + response.sendRedirect(epusdtEntity.getData().getPayment_url()); + } + break; + default: + break; + } + return null; + } + + /** + * 业务处理 + * + * @param money 实收款金额 + * @param price 订单金额 + * @param payId 订单号 + * @param pay_no 流水号 + * @param param 自定义内容 + * @return this + */ + private boolean returnBig(String money, String price, String payId, String pay_no, String param) { + + /** + * 通过订单号查询 + */ + Orders member = ordersService.getOne(new QueryWrapper().eq("member", payId)); + if (member == null) { + return false; // 本地没有这个订单 + } + + if (member.getStatus() > 0) { + return true; + } + + boolean empty = StringUtils.isEmpty(member.getCardsInfo()); + if (!empty) { + return true; + } + + Products products = productsService.getById(param); + if (products == null) { + return false; // 商品没了 + } + + Website website = websiteService.getById(1); + ShopSettings shopSettings = shopSettingsService.getById(1); + + Orders orders = new Orders(); + orders.setId(member.getId()); + orders.setPayTime(new Date()); + orders.setPayNo(pay_no); + orders.setPrice(new BigDecimal(price)); + orders.setMoney(new BigDecimal(money)); + + if (products.getShipType() == 0) { // 自动发货的商品 + + /** + * 卡密信息列表 + * 通过商品购买数量来获取对应商品的卡密数量 + */ + if (products.getSellType() == 0) { // 一次性卡密类型 + + List cardsList = cardsService.getBaseMapper().selectList(new QueryWrapper() + .eq("status", 0) + .eq("product_id", products.getId()) + .eq("sell_type", 0) + .orderBy(true, false, "rand()") + .last("LIMIT " + member.getNumber() + "")); + + if (cardsList == null) return false; // 空值的话直接返回错误提示 + + StringBuilder orderInfo = new StringBuilder(); // 订单关联的卡密信息 + List updateCardsList = new ArrayList<>(); + for (Cards cards : cardsList) { + orderInfo.append(cards.getCardInfo()).append("\n"); // 通过StringBuilder 来拼接卡密信息 + + /** + * 设置每条被购买的卡密的售出状态 + */ + Cards cards1 = new Cards(); + cards1.setId(cards.getId()); + cards1.setStatus(1); + cards1.setNumber(0); + cards1.setSellNumber(1); + cards1.setUpdatedAt(new Date()); + + updateCardsList.add(cards1); + } + + // 去除多余尾部的逗号 + String result = orderInfo.deleteCharAt(orderInfo.length() - 1).toString(); + + orders.setStatus(1); // 设置已售出 + orders.setCardsInfo(result); + + // 更新售出的订单 + if (ordersService.updateById(orders)) { + // 设置售出的卡密 + cardsService.updateBatchById(updateCardsList); + } else { + return false; + } + } else if (products.getSellType() == 1) { // 重复销售的卡密 + StringBuilder orderInfo = new StringBuilder(); // 订单关联的卡密信息 + + Cards cards = cardsService.getOne(new QueryWrapper().eq("product_id", products.getId()).eq("status", 0).eq("sell_type", 1)); + if (cards == null) { + return false; // 空值的话直接返回错误提示 + } + + /** + * 设置每条被购买的卡密的售出状态 + */ + Cards cards1 = new Cards(); + cards1.setId(cards.getId()); + cards1.setUpdatedAt(new Date()); + if (cards.getNumber() == 1) { // 还剩下一个卡密 + cards1.setSellNumber(cards.getSellNumber() + member.getNumber()); + cards1.setNumber(cards.getNumber() - member.getNumber()); // 减完之后等于0 + cards1.setStatus(1); // 设置状态为已全部售出 + } else { + cards1.setSellNumber(cards.getSellNumber() + member.getNumber()); + cards1.setNumber(cards.getNumber() - member.getNumber()); + } + + /** + * 看用户购买了多少个卡密 + * 正常重复的卡密不会购买1个以上 + * 这里做个以防万一呀(有钱谁不赚) + */ + for (int i = 0; i < member.getNumber(); i++) { + orderInfo.append(cards.getCardInfo()).append("\n"); + } + + // 去除多余尾部的逗号 + String result = orderInfo.deleteCharAt(orderInfo.length() - 1).toString(); + orders.setStatus(1); // 设置已售出 + orders.setCardsInfo(result); + + // 设置售出的商品 + if (ordersService.updateById(orders)) { + cardsService.updateById(cards1); + } else { + return false; + } + } + + /** + * 微信的 wxpush 通知 + * 本通知只针对站长 + * 当用户购买成功后会给您设置的 + * wxpush 微信公众号发送订单购买成功后的通知 + */ + if (shopSettings.getIsWxpusher() == 1) { + Message message = new Message(); + message.setContent(website.getWebsiteName() + "新订单提醒
订单号:" + member.getMember() + "
商品名称:" + products.getName() + "
购买数量:" + member.getNumber() + "
订单金额:" + member.getMoney() + "
支付状态:成功
"); + message.setContentType(Message.CONTENT_TYPE_HTML); + message.setUid(shopSettings.getWxpushUid()); + message.setAppToken(shopSettings.getAppToken()); + WxPusher.send(message); + } + + /** + * 邮件通知 + * 后台开启邮件通知, + * 这里会给下单用户的邮箱发送一条邮件 + */ + if (shopSettings.getIsEmail() == 1) { + if (!StringUtils.isEmpty(member.getEmail())) { + if (FormCheckUtil.isEmail(member.getEmail())) { + Map map = new HashMap<>(); // 页面的动态数据 + map.put("title", website.getWebsiteName()); + map.put("member", member.getMember()); + map.put("date", DateUtil.getDate()); + map.put("password", member.getPassword()); + map.put("url", website.getWebsiteUrl() + "/search/order/" + member.getMember()); + try { + emailService.sendHtmlEmail(website.getWebsiteName() + "发货提醒", "email/sendShip.html", map, new String[]{member.getEmail()}); + // emailService.sendTextEmail("卡密购买成功", "您的订单号为:" + member.getMember() + " 您的卡密:" + cards.getCardInfo(), new String[]{member.getEmail()}); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } else { // 手动发货商品 + Products products1 = new Products(); + products1.setId(products.getId()); + products1.setInventory(products.getInventory() - member.getNumber()); + products1.setSales(products.getSales() + member.getNumber()); + + orders.setStatus(2); // 手动发货模式 为待处理 + if (ordersService.updateById(orders)) { + // 更新售出 + productsService.updateById(products1); + } else { + return false; + } + + /** + * 微信的 wxpush 通知 + * 本通知只针对站长 + * 当用户购买成功后会给您设置的 + * wxpush 微信公众号发送订单购买成功后的通知 + */ + if (shopSettings.getIsWxpusher() == 1) { + Message message = new Message(); + message.setContent(website.getWebsiteName() + "新订单提醒
订单号:" + member.getMember() + "
商品名称:" + products.getName() + "
购买数量:" + member.getNumber() + "
订单金额:" + member.getMoney() + "
支付状态:成功
"); + message.setContentType(Message.CONTENT_TYPE_HTML); + message.setUid(shopSettings.getWxpushUid()); + message.setAppToken(shopSettings.getAppToken()); + WxPusher.send(message); + } + + /** + * 邮件通知 + * 后台开启邮件通知, + * 这里会给下单用户的邮箱发送一条邮件 + */ + if (shopSettings.getIsEmail() == 1) { + if (FormCheckUtil.isEmail(member.getEmail())) { + try { + emailService.sendTextEmail(website.getWebsiteName() + " 订单提醒", "您的订单号为:" + member.getMember() + " 本商品为手动发货,请耐心等待!", new String[]{member.getEmail()}); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + return true; + } + + /** + * 限制购买 + * + * @param goodsId 商品id + * @param number 用户购买数量 + * @param restricts 限制购买的数量 + * @param userIp 当前用户的ip + * @return + */ + public JsonResult restricts(Integer goodsId, Integer number, Integer restricts, String userIp) { + + /** + * 通过商品id和当前用户 + * 的ip来查询用户今天所购买的数量 + */ + QueryWrapper queryWrapper = getQueryWrapper(DateStrUtil.getDayBegin(), DateStrUtil.getDayEnd()); + queryWrapper.eq("product_id", goodsId); + queryWrapper.eq("ip", userIp); + List orderList = ordersService.list(queryWrapper); + + /* 统计已付款的商品数 */ + long payNumber = orderList.stream() + .filter(orders -> orders.getStatus() == 1) + .mapToLong(Orders::getNumber).sum(); + if (payNumber >= restricts) { + return JsonResult.error("已达到每天限购的" + restricts + "个,每天0点重置!"); + } + + /* 判断已付款 + 待购买商品数是不是大于限购数 */ + if ((number + payNumber) > restricts) { + long remain = restricts - payNumber; + return JsonResult.error("每天限购" + restricts + "个,当前还可购买" + remain + "个,每天0点重置!"); + } + + /* 统计待付款未超时商品数 */ + long waitPayNumber = orderList.stream() + .filter(order -> { + if (order.getStatus() == 0) { + return (System.currentTimeMillis() - order.getCreateTime().getTime()) < Constants.PAY_TIMEOUT_MINUTES * 60 * 1000; + } + return false; + }) + .mapToLong(Orders::getNumber).sum(); + /* 判断购买商品数+已购买数+等待付款数是不是大于限购数 */ + if ((number + payNumber + waitPayNumber) > restricts) { + long remain = restricts - payNumber; + long createTime = orderList.stream() + .filter(order -> { + if (order.getStatus() == 0) { + return (System.currentTimeMillis() - order.getCreateTime().getTime()) < Constants.PAY_TIMEOUT_MINUTES * 60 * 1000L; + } + return false; + }) + .mapToLong(orders -> orders.getCreateTime().getTime()) + .min().getAsLong(); + long expireTime = createTime + Constants.PAY_TIMEOUT_MINUTES * 60 * 1000L; + SimpleDateFormat dateFormat = new SimpleDateFormat("HH点mm分ss秒"); + String format = dateFormat.format(new Date(expireTime)); + + return JsonResult.error("每天限购" + restricts + "个,当天还剩" + remain + "个
" + + "等付款中的商品数为" + waitPayNumber + "个," + format + "后支付超时释放商品"); + } + return null; + } +} diff --git a/src/main/java/com/bomaos/reception/controller/SearchApiController.java b/src/main/java/com/bomaos/reception/controller/SearchApiController.java new file mode 100644 index 0000000..8f3e8ff --- /dev/null +++ b/src/main/java/com/bomaos/reception/controller/SearchApiController.java @@ -0,0 +1,40 @@ +package com.bomaos.reception.controller; + +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.orders.entity.Orders; +import com.bomaos.orders.service.OrdersService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.wf.jwtp.annotation.Ignore; +import org.wf.jwtp.provider.Token; +import org.wf.jwtp.provider.TokenStore; + +@RestController +@RequestMapping("/api") +public class SearchApiController { + + @Autowired + private TokenStore tokenStore; + + @Autowired + private OrdersService ordersService; + + /** + * 根据id查询订单投诉表 + */ + @Ignore + @RequestMapping("/getOrderToken") + public JsonResult get(Integer id, String password) { + if (StringUtils.isEmpty(id) || StringUtils.isEmpty(password)) return JsonResult.error("订单ID或查询密码不能为空!!"); + Orders orders = ordersService.getById(id); + if (ObjectUtils.isEmpty(orders)) return JsonResult.error("商品不存在!!"); + if (!password.equals(orders.getPassword())) return JsonResult.error("密码错误,请核对后再试!"); + Token token = tokenStore.createNewToken(String.valueOf(id), 60 * 60 * 24 * 30L); + String accessToken = token.getAccessToken(); + return JsonResult.ok("ok").setData(accessToken); + } + +} diff --git a/src/main/java/com/bomaos/reception/controller/SearchOrderController.java b/src/main/java/com/bomaos/reception/controller/SearchOrderController.java new file mode 100644 index 0000000..e407d22 --- /dev/null +++ b/src/main/java/com/bomaos/reception/controller/SearchOrderController.java @@ -0,0 +1,112 @@ +package com.bomaos.reception.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bomaos.common.core.utils.DateUtil; +import com.bomaos.common.core.web.BaseApiController; +import com.bomaos.orders.entity.Orders; +import com.bomaos.orders.service.OrdersService; +import com.bomaos.orders.vo.OrdersVo; +import com.bomaos.products.entity.Classifys; +import com.bomaos.products.entity.Products; +import com.bomaos.products.service.ClassifysService; +import com.bomaos.products.service.ProductsService; +import com.bomaos.settings.entity.ShopSettings; +import com.bomaos.settings.service.ShopSettingsService; +import com.bomaos.theme.entity.Theme; +import com.bomaos.theme.service.ThemeService; +import com.bomaos.website.entity.Website; +import com.bomaos.website.service.WebsiteService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +@Controller +@RequestMapping("/api") +public class SearchOrderController extends BaseApiController { + + @Autowired + private OrdersService ordersService; + + @Autowired + private ThemeService themeService; + + @Autowired + private ProductsService productsService; + + @Autowired + private ClassifysService classifysService; + + @Autowired + private ShopSettingsService shopSettingsService; + + @Autowired + private WebsiteService websiteService; + + @RequestMapping("/order") + public String Chat(Model model, HttpServletRequest request) { + Long orderId = getLoginUserId(request); + + Orders member = ordersService.getById(orderId); + + /** + * 商品没有找到 + */ + Theme theme = themeService.getOne(Wrappers.lambdaQuery().eq(Theme::getEnable, 1)); + if (ObjectUtils.isEmpty(member)) return "theme/" + theme.getDriver() + "/error.html"; + + Products products = productsService.getById(member.getProductId()); + Classifys classifys = classifysService.getById(products.getClassifyId()); + + List cardsList = new ArrayList<>(); + if (!StringUtils.isEmpty(member.getCardsInfo())) { + String[] cardsInfo = member.getCardsInfo().split("\n"); + for (String cardInfo : cardsInfo) { + StringBuilder cardInfoText = new StringBuilder(); + if (products.getShipType() == 0) { + cardInfoText.append(cardInfo).append("\n"); + cardsList.add(cardInfoText.toString()); + } else { + cardInfoText.append(cardInfo); + cardsList.add(cardInfoText.toString()); + } + } + } + + OrdersVo ordersVo = new OrdersVo(); + BeanUtils.copyProperties(member, ordersVo); + if (member.getPayTime() != null) { + ordersVo.setPayTime(DateUtil.getSubDateMiao(member.getPayTime())); + } else { + ordersVo.setPayTime(null); + } + + ordersVo.setMoney(member.getMoney().toString()); + + /** + * 发货模式 + */ + ordersVo.setShipType(products.getShipType()); + + Website website = websiteService.getById(1); + model.addAttribute("website", website); + + model.addAttribute("cardsList", cardsList); // 订单 + model.addAttribute("orders", ordersVo); // 订单 + model.addAttribute("goods", products); // 商品 + model.addAttribute("classify", classifys); // 分类 + + ShopSettings shopSettings = shopSettingsService.getById(1); + model.addAttribute("isBackground", shopSettings.getIsBackground()); + model.addAttribute("shop", shopSettings); + return "theme/" + theme.getDriver() + "/order.html"; + } + +} diff --git a/src/main/java/com/bomaos/reception/dto/HotProductDTO.java b/src/main/java/com/bomaos/reception/dto/HotProductDTO.java new file mode 100644 index 0000000..8b9d0cc --- /dev/null +++ b/src/main/java/com/bomaos/reception/dto/HotProductDTO.java @@ -0,0 +1,14 @@ +package com.bomaos.reception.dto; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class HotProductDTO { + private Integer id; + private String name; + private String image; + private String price; + private String link; +} diff --git a/src/main/java/com/bomaos/reception/dto/NotifyDTO.java b/src/main/java/com/bomaos/reception/dto/NotifyDTO.java new file mode 100644 index 0000000..97a2153 --- /dev/null +++ b/src/main/java/com/bomaos/reception/dto/NotifyDTO.java @@ -0,0 +1,36 @@ +package com.bomaos.reception.dto; + +import lombok.Data; +import lombok.ToString; + +/** + * @Author chengtianqi + * @create 2020/8/28 17:13 + */ +@Data +@ToString +public class NotifyDTO { + + // 1:支付成功 + private String return_code; + // 金额。单位:分 + private String total_fee; + // 用户端自主生成的订单号 + private String out_trade_no; + // PAYJS 订单号 + private String payjs_order_id; + // 微信用户手机显示订单号 + private String transaction_id; + // 支付成功时间 + private String time_end; + // + private String openid; + // 用户自定义数据 + private String attach; + // 商户号 + private String mchid; + // + private String type; + + private String sign; +} diff --git a/src/main/java/com/bomaos/reception/dto/ProductDTO.java b/src/main/java/com/bomaos/reception/dto/ProductDTO.java new file mode 100644 index 0000000..2ef3f3d --- /dev/null +++ b/src/main/java/com/bomaos/reception/dto/ProductDTO.java @@ -0,0 +1,70 @@ +package com.bomaos.reception.dto; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class ProductDTO { + private Integer id; + + /** + * 商品名称 + */ + private String name; + + /** + * 商品金额 + */ + private String price; + + /** + * 商品金额 + */ + private String link; + + /** + * 首页截图 + */ + private String imageLogo; + + /** + * 首页截图 + */ + private String indexLogo; + + /** + * 卡密数量 + */ + private Long cardMember; + + /** + * 出售卡密数量 + */ + private Long sellCardMember; + + /** + * 优惠券 + */ + private Long isCoupon; + + /** + * 限制购买 + */ + private Integer restricts; + + /** + * 批发功能 + */ + private Integer isWholesale; + + /** + * 发货类型(0-自动,1-手动) + */ + private Integer shipType; + + /** + * 售卡类型 + */ + private Integer sellType; +} diff --git a/src/main/java/com/bomaos/reception/dto/ProductListDTO.java b/src/main/java/com/bomaos/reception/dto/ProductListDTO.java new file mode 100644 index 0000000..780c20e --- /dev/null +++ b/src/main/java/com/bomaos/reception/dto/ProductListDTO.java @@ -0,0 +1,41 @@ +package com.bomaos.reception.dto; + +import lombok.Data; +import lombok.ToString; + +import java.util.List; + +@ToString +@Data +public class ProductListDTO { + + /** + * id + */ + private Integer id; + + /** + * 分类标题 + */ + private String title; + + /** + * 商品数量 + */ + private Long productNum; + + /** + * 创建时间 + */ + private String createTime; + + /** + * 更新时间 + */ + private String UpdateTime; + + /** + * 商品列表 + */ + private List productDTOList; +} diff --git a/src/main/java/com/bomaos/reception/dto/SearchDTO.java b/src/main/java/com/bomaos/reception/dto/SearchDTO.java new file mode 100644 index 0000000..378f864 --- /dev/null +++ b/src/main/java/com/bomaos/reception/dto/SearchDTO.java @@ -0,0 +1,18 @@ +package com.bomaos.reception.dto; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class SearchDTO { + + private Integer id; + private Integer andIncrement; + private String member; + private String createTime; + private String payType; + private String status; + private String money; + +} diff --git a/src/main/java/com/bomaos/reception/entity/XunhuNotIfy.java b/src/main/java/com/bomaos/reception/entity/XunhuNotIfy.java new file mode 100644 index 0000000..dcae071 --- /dev/null +++ b/src/main/java/com/bomaos/reception/entity/XunhuNotIfy.java @@ -0,0 +1,55 @@ +package com.bomaos.reception.entity; + +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; + +@Data +@ToString +public class XunhuNotIfy { + /** + * 商户订单号 + */ + private String trade_order_id; + /** + * 订单支付金额 + */ + private BigDecimal total_fee; + /** + * 交易号 + */ + private String transaction_id; + /** + * 虎皮椒内部订单号 + */ + private String open_order_id; + /** + * 订单标题 + */ + private String order_title; + /** + * 订单状态 + */ + private String status; + /** + * 插件ID + */ + private String plugins; + /** + * 支付渠道ID + */ + private String appid; + /** + * 时间戳 + */ + private String time; + /** + * 随即字符串 + */ + private String nonce_str; + /** + * 签名 + */ + private String hash; +} diff --git a/src/main/java/com/bomaos/reception/result/Budpay.java b/src/main/java/com/bomaos/reception/result/Budpay.java new file mode 100644 index 0000000..418fdfd --- /dev/null +++ b/src/main/java/com/bomaos/reception/result/Budpay.java @@ -0,0 +1,18 @@ +package com.bomaos.reception.result; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class Budpay { + private String mch_id; + private String trade_no; + private String out_trade_no; + private String amount; + private String pay_amount; + private String name; + private String status; + private String pay_type; + private String sign; +} diff --git a/src/main/java/com/bomaos/reception/util/ProductUtil.java b/src/main/java/com/bomaos/reception/util/ProductUtil.java new file mode 100644 index 0000000..729c9bf --- /dev/null +++ b/src/main/java/com/bomaos/reception/util/ProductUtil.java @@ -0,0 +1,30 @@ +package com.bomaos.reception.util; + +import com.bomaos.reception.dto.HotProductDTO; +import com.bomaos.reception.dto.ProductDTO; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class ProductUtil { + + public static List getHotProductList(List productsList) { + return productsList.stream() + .sorted(Comparator.comparingInt(productDTO -> (int) -(productDTO.getSellCardMember()))) + .limit(6) + .map(productDTO -> doToHotProductDTO(productDTO)) + .collect(Collectors.toList()); + } + + public static HotProductDTO doToHotProductDTO(ProductDTO productDTO) { + HotProductDTO hotProductDTO = new HotProductDTO(); + hotProductDTO.setId(productDTO.getId()); + hotProductDTO.setName(productDTO.getName()); + hotProductDTO.setPrice(productDTO.getPrice()); + hotProductDTO.setImage(productDTO.getImageLogo()); + hotProductDTO.setLink(productDTO.getLink()); + return hotProductDTO; + } + +} diff --git a/src/main/java/com/bomaos/reception/util/SynchronizedByKey.java b/src/main/java/com/bomaos/reception/util/SynchronizedByKey.java new file mode 100644 index 0000000..3f49e73 --- /dev/null +++ b/src/main/java/com/bomaos/reception/util/SynchronizedByKey.java @@ -0,0 +1,47 @@ +package com.bomaos.reception.util; + +import org.springframework.stereotype.Service; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantLock; + +/** + * author Panyoujie + * date 2022-03-23 + * 回调幂等处理 + * 以及并发的支持 + */ +@Service +public class SynchronizedByKey implements SynchronizedByKeyService { + + Map computeIfAbsent = new ConcurrentHashMap<>(); + + /** + * 主处理方法 + * + * @param key 传入的订单ID + * @param runnable + */ + public void exec(String key, Runnable runnable) { + ReentrantLock lock4Key = null; + ReentrantLock reentrantLock; + do { + if (lock4Key != null) { + lock4Key.unlock(); + } + lock4Key = computeIfAbsent.computeIfAbsent(key, k -> new ReentrantLock()); + lock4Key.lock(); + reentrantLock = computeIfAbsent.get(key); + } while (reentrantLock == null || lock4Key != reentrantLock); + + try { + runnable.run(); + } finally { + if (lock4Key.getQueueLength() == 0) { + computeIfAbsent.remove(key); + } + lock4Key.unlock(); + } + } +} diff --git a/src/main/java/com/bomaos/reception/util/SynchronizedByKeyService.java b/src/main/java/com/bomaos/reception/util/SynchronizedByKeyService.java new file mode 100644 index 0000000..0f8cca1 --- /dev/null +++ b/src/main/java/com/bomaos/reception/util/SynchronizedByKeyService.java @@ -0,0 +1,5 @@ +package com.bomaos.reception.util; + +public interface SynchronizedByKeyService { + void exec(String key, Runnable runnable); +} diff --git a/src/main/java/com/bomaos/reception/vo/ArticleVo.java b/src/main/java/com/bomaos/reception/vo/ArticleVo.java new file mode 100644 index 0000000..2d14217 --- /dev/null +++ b/src/main/java/com/bomaos/reception/vo/ArticleVo.java @@ -0,0 +1,66 @@ +package com.bomaos.reception.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class ArticleVo { + /** + * 自增id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 文章图片 + */ + private String picture; + + /** + * 文章标题 + */ + private String title; + + /** + * 摘要 + */ + private String excerpt; + + /** + * 文章内容 + */ + private String content; + + /** + * 点赞数 + */ + private Integer likes; + + /** + * 查看数量 + */ + private Integer seeNumber; + + /** + * 创建时间 + */ + private String createTime; + + /** + * 更新时间 + */ + private String updateTime; + + /** + * 用户名 + */ + private String userName; + + /** + * 用户头像 + */ + private String userHead; +} diff --git a/src/main/java/com/bomaos/settings/controller/CallBackController.java b/src/main/java/com/bomaos/settings/controller/CallBackController.java new file mode 100644 index 0000000..fcfc5f7 --- /dev/null +++ b/src/main/java/com/bomaos/settings/controller/CallBackController.java @@ -0,0 +1,70 @@ +package com.bomaos.settings.controller; + +import com.alibaba.fastjson.JSONObject; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.settings.entity.ShopSettings; +import com.bomaos.settings.service.ShopSettingsService; +import com.bomaos.website.entity.Website; +import com.bomaos.website.service.WebsiteService; +import com.zjiecode.wxpusher.client.WxPusher; +import com.zjiecode.wxpusher.client.bean.Message; +import com.zjiecode.wxpusher.client.bean.callback.AppSubscribeBean; +import com.zjiecode.wxpusher.client.bean.callback.BaseCallBackReq; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 说明:接收来自WxPusher服务的回调 + * 当用户扫码关注的时候会触发 + * 作者:zjiecode + * 时间:2019-10-05 + */ +@RestController +@RequestMapping("/wxpusher") +public class CallBackController extends BaseController { + + @Autowired + private ShopSettingsService shopSettingsService; + + @Autowired + private WebsiteService websiteService; + + @PostMapping("/callback") + public void callback(@RequestBody BaseCallBackReq callBackReq) { + if (BaseCallBackReq.ACTION_APP_SUBSCRIBE.equalsIgnoreCase(callBackReq.getAction())) { + AppSubscribeBean appSubscribeBean = JSONObject.parseObject(JSONObject.toJSONString(callBackReq.getData()), AppSubscribeBean.class); + if (!StringUtils.isEmpty(appSubscribeBean.getExtra())) { + ShopSettings shopSettings = shopSettingsService.getById(1); + Website website = websiteService.getById(1); + if (StringUtils.isEmpty(shopSettings.getWxpushUid())) { + ShopSettings shopSettings1 = new ShopSettings(); + shopSettings1.setId(1); + shopSettings1.setWxpushUid(appSubscribeBean.getUid()); + if (shopSettingsService.updateById(shopSettings1)) { + //扫码以后,发送一条消息给用户 + Message message = new Message(); + message.setContent("关注" + website.getWebsiteName() + "成功!您将在这里收到发卡平台订单交易是的实时通知!"); + message.setContentType(Message.CONTENT_TYPE_TEXT); + message.setUid(appSubscribeBean.getUid()); + message.setAppToken(shopSettings.getAppToken()); + WxPusher.send(message); + } + } else { + //扫码以后,发送一条消息给用户 + Message message = new Message(); + message.setContent("重新关注" + website.getWebsiteName() + "公众号、您将在这里收到发卡平台订单交易的实时通知!"); + message.setContentType(Message.CONTENT_TYPE_TEXT); + message.setUid(appSubscribeBean.getUid()); + message.setAppToken(shopSettings.getAppToken()); + WxPusher.send(message); + } + } else { + //无参数二维码(默认二维码) + } + } + } +} diff --git a/src/main/java/com/bomaos/settings/controller/CouponController.java b/src/main/java/com/bomaos/settings/controller/CouponController.java new file mode 100644 index 0000000..d51fb14 --- /dev/null +++ b/src/main/java/com/bomaos/settings/controller/CouponController.java @@ -0,0 +1,187 @@ +package com.bomaos.settings.controller; + +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.products.entity.Classifys; +import com.bomaos.products.entity.Products; +import com.bomaos.products.service.ClassifysService; +import com.bomaos.products.service.ProductsService; +import com.bomaos.settings.entity.Coupon; +import com.bomaos.settings.service.CouponService; +import com.bomaos.settings.vo.CouponVo; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 优惠券管理 + * Created by Panyoujie on 2021-06-23 07:43:23 + */ +@Controller +@RequestMapping("/settings/coupon") +public class CouponController extends BaseController { + @Autowired + private CouponService couponService; + + @Autowired + private ClassifysService classifysService; + + @Autowired + private ProductsService productsService; + + @RequiresPermissions("settings:coupon:view") + @RequestMapping() + public String view() { + return "settings/coupon.html"; + } + + @RequiresPermissions("settings:coupon:view") + @RequestMapping("/add") + public String view_add(Model model) { + List classifyList = classifysService.list(); + model.addAttribute("classifyList", classifyList); + return "settings/coupon_add.html"; + } + + /** + * 分页查询优惠券 + */ + @RequiresPermissions("settings:coupon:list") + @OperLog(value = "优惠券管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.addOrderDesc("create_time"); + List records = couponService.page(pageParam, pageParam.getWrapper()).getRecords(); + List couponVoList = records.stream().map((coupon) -> { + CouponVo couponVo = new CouponVo(); + BeanUtils.copyProperties(coupon, couponVo); + Products products = productsService.getById(coupon.getProductId()); + couponVo.setProductName(products.getName()); + return couponVo; + }).collect(Collectors.toList()); + return new PageResult<>(couponVoList, pageParam.getTotal()); + } + + /** + * 查询全部优惠券 + */ + @RequiresPermissions("settings:coupon:list") + @OperLog(value = "优惠券管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(couponService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询优惠券 + */ + @RequiresPermissions("settings:coupon:list") + @OperLog(value = "优惠券管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(couponService.getById(id)); + } + + /** + * 添加优惠券 + */ + @RequiresPermissions("settings:coupon:save") + @OperLog(value = "优惠券管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Coupon coupon) { + if (coupon.getDiscountType() == 1 && coupon.getDiscountVal().compareTo(new BigDecimal(10)) == 1) { + return JsonResult.error("折扣只能1-10之间的数字"); + } + if (couponService.save(coupon, getLoginUserId())) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改优惠券 + */ + @RequiresPermissions("settings:coupon:update") + @OperLog(value = "优惠券管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Coupon coupon) { + if (couponService.updateById(coupon)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除优惠券 + */ + @RequiresPermissions("settings:coupon:remove") + @OperLog(value = "优惠券管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (couponService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加优惠券 + */ + @RequiresPermissions("settings:coupon:save") + @OperLog(value = "优惠券管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (couponService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改优惠券 + */ + @RequiresPermissions("settings:coupon:update") + @OperLog(value = "优惠券管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(couponService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除优惠券 + */ + @RequiresPermissions("settings:coupon:remove") + @OperLog(value = "优惠券管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (couponService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + +} diff --git a/src/main/java/com/bomaos/settings/controller/PaysController.java b/src/main/java/com/bomaos/settings/controller/PaysController.java new file mode 100644 index 0000000..b90a993 --- /dev/null +++ b/src/main/java/com/bomaos/settings/controller/PaysController.java @@ -0,0 +1,401 @@ +package com.bomaos.settings.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.reception.common.PaysEnmu; +import com.bomaos.settings.entity.Pays; +import com.bomaos.settings.service.PaysService; +import com.bomaos.settings.vo.PaysVo; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 支付配置管理 + * Created by Panyoujie on 2021-03-29 11:06:11 + */ +@Controller +@RequestMapping("/settings/pays") +public class PaysController extends BaseController { + + @Autowired + private PaysService paysService; + + @RequiresPermissions("settings:pays:view") + @RequestMapping() + public String view() { + return "settings/pays.html"; + } + + /** + * 分页查询支付配置 + */ + @RequiresPermissions("settings:pays:list") + @OperLog(value = "支付配置管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + pageParam.addOrderDesc("created_at"); + + List paysList = paysService.page(pageParam, pageParam.getWrapper()).getRecords(); + List collect = paysList.stream().map((pays) -> { + PaysVo paysVo = new PaysVo(); + BeanUtils.copyProperties(pays, paysVo); + JSONObject configs = JSONObject.parseObject(pays.getConfig()); + + switch (Objects.requireNonNull(PaysEnmu.getByValue(pays.getDriver()))) { + case MQPAY_ALIPAY: + case MQPAY_WXPAY: + paysVo.setKey(configs.get("key").toString()); + paysVo.setCreateUrl(configs.get("create_url").toString()); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + case EPAY_ALIPAY: + case EPAY_QQPAY: + case EPAY_WXPAY: + paysVo.setAppid(configs.get("pid").toString()); + paysVo.setKey(configs.get("key").toString()); + paysVo.setCreateUrl(configs.get("create_url").toString()); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + case BUDPAY_ALIPAY: + case BUDPAY_WECHAT: + paysVo.setAppid(configs.get("pid").toString()); + paysVo.setKey(configs.get("key").toString()); + paysVo.setCreateUrl(configs.get("create_url").toString()); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + case YUNGOUOS_ALIPAY: + case YUNGOUOS_WXPAY: + paysVo.setAppid(configs.get("mchId").toString()); + paysVo.setKey(configs.get("key").toString()); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + case XUNHUPAY_ALIPAY: + case XUNHUPAY_WXPAY: + paysVo.setAppid(configs.get("appid").toString()); + paysVo.setKey(configs.get("appsecret").toString()); + paysVo.setCreateUrl(configs.containsKey("create_url") ? configs.get("create_url").toString() : ""); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + case PAYJS_ALIPAY: + case PAYJS_WXPAY: + paysVo.setAppid(configs.get("mchId").toString()); + paysVo.setKey(configs.get("key").toString()); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + case WXPAY: + paysVo.setAppid(configs.get("appId").toString()); + paysVo.setMchid(configs.get("mchId").toString()); + paysVo.setKey(configs.get("key").toString()); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + case WXPAU_H5: + paysVo.setAppid(configs.get("appId").toString()); + paysVo.setMchid(configs.get("mchId").toString()); + paysVo.setKey(configs.get("key").toString()); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + case ALIPAY: + case ALIPAY_PC: + paysVo.setAppid(configs.get("app_id").toString()); + paysVo.setKey(configs.get("private_key").toString()); + paysVo.setMpKey(configs.get("alipay_public_key").toString()); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + case PAYPAL: + paysVo.setMchid(configs.get("clientId").toString()); + paysVo.setKey(configs.get("clientSecret").toString()); + paysVo.setNotifyUrl(configs.get("return_url").toString()); + break; + case EPUSDT: + paysVo.setKey(configs.get("key").toString()); + paysVo.setCreateUrl(configs.get("create_url").toString()); + paysVo.setNotifyUrl(configs.get("notify_url").toString()); + break; + default: + break; + } + + return paysVo; + }).collect(Collectors.toList()); + return new PageResult<>(collect, pageParam.getTotal()); + } + + /** + * 查询全部支付配置 + */ + @RequiresPermissions("settings:pays:list") + @OperLog(value = "支付配置管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(paysService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询支付配置 + */ + @RequiresPermissions("settings:pays:list") + @OperLog(value = "支付配置管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(paysService.getById(id)); + } + + /** + * 添加支付配置 + */ + @RequiresPermissions("settings:pays:save") + @OperLog(value = "支付配置管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Pays pays) { + if (paysService.save(pays)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改支付配置 + */ + @RequiresPermissions("settings:pays:update") + @OperLog(value = "支付配置管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(PaysVo paysVo) { + Map map = new HashMap<>(); + switch (Objects.requireNonNull(PaysEnmu.getByValue(paysVo.getDriver()))) { + case MQPAY_ALIPAY: + case MQPAY_WXPAY: + map.put("key", paysVo.getKey()); + map.put("create_url", paysVo.getCreateUrl()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + case EPAY_ALIPAY: + case EPAY_QQPAY: + case EPAY_WXPAY: + map.put("pid", paysVo.getAppid()); + map.put("key", paysVo.getKey()); + map.put("create_url", paysVo.getCreateUrl()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + case BUDPAY_ALIPAY: + case BUDPAY_WECHAT: + map.put("pid", paysVo.getAppid()); + map.put("key", paysVo.getKey()); + map.put("create_url", paysVo.getCreateUrl()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + case YUNGOUOS_ALIPAY: + case YUNGOUOS_WXPAY: + map.put("mchId", paysVo.getAppid()); + map.put("key", paysVo.getKey()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + case XUNHUPAY_ALIPAY: + case XUNHUPAY_WXPAY: + map.put("appid", paysVo.getAppid()); + map.put("appsecret", paysVo.getKey()); + map.put("create_url", paysVo.getCreateUrl()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + case PAYJS_ALIPAY: + case PAYJS_WXPAY: + map.put("mchId", paysVo.getAppid()); + map.put("key", paysVo.getKey()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + case WXPAY: + map.put("appId", paysVo.getAppid()); + map.put("mchId", paysVo.getMchid()); + map.put("key", paysVo.getKey()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + case WXPAU_H5: + map.put("appId", paysVo.getAppid()); + map.put("mchId", paysVo.getMchid()); + map.put("key", paysVo.getKey()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + case ALIPAY: + case ALIPAY_PC: + map.put("app_id", paysVo.getAppid()); + map.put("private_key", paysVo.getKey()); + map.put("alipay_public_key", paysVo.getMpKey()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + case PAYPAL: + map.put("clientId", paysVo.getMchid()); + map.put("clientSecret", paysVo.getKey()); + map.put("return_url", paysVo.getNotifyUrl()); + break; + case EPUSDT: + map.put("key", paysVo.getKey()); + map.put("create_url", paysVo.getCreateUrl()); + map.put("notify_url", paysVo.getNotifyUrl()); + break; + default: + break; + } + String jsonString = JSON.toJSONString(map); + Pays pays = new Pays(); + BeanUtils.copyProperties(paysVo, pays); + pays.setConfig(jsonString); + if (paysService.updateById(pays)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除支付配置 + */ + @RequiresPermissions("settings:pays:remove") + @OperLog(value = "支付配置管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (paysService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加支付配置 + */ + @RequiresPermissions("settings:pays:save") + @OperLog(value = "支付配置管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (paysService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改支付配置 + */ + @RequiresPermissions("settings:pays:update") + @OperLog(value = "支付配置管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(paysService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除支付配置 + */ + @RequiresPermissions("settings:pays:remove") + @OperLog(value = "支付配置管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (paysService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 修改商品状态 + */ + @OperLog(value = "分类列表管理", desc = "修改移动端状态", result = true) + @RequiresPermissions("products:products:update") + @ResponseBody + @RequestMapping("/status/updateMobile") + public JsonResult updateIsMobileStates(Integer id, Integer enabled) { + if (enabled == null || (enabled != 0 && enabled != 1)) { + return JsonResult.error("状态值不正确"); + } + Pays pays = new Pays(); + pays.setId(id); + pays.setIsMobile(enabled); + if (paysService.updateById(pays)) { + return JsonResult.ok("移动端支付开启成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 修改商品状态 + */ + @OperLog(value = "分类列表管理", desc = "修改电脑端状态", result = true) + @RequiresPermissions("products:products:update") + @ResponseBody + @RequestMapping("/status/updatePc") + public JsonResult updateIsPcStates(Integer id, Integer enabled) { + if (enabled == null || (enabled != 0 && enabled != 1)) { + return JsonResult.error("状态值不正确"); + } + Pays pays = new Pays(); + pays.setId(id); + pays.setIsPc(enabled); + if (paysService.updateById(pays)) { + return JsonResult.ok("电脑端支付开启成功"); + } + return JsonResult.error("开启失败"); + } + + /** + * 修改商品状态 + */ + @OperLog(value = "分类列表管理", desc = "修改手续费标签状态", result = true) + @RequiresPermissions("products:products:update") + @ResponseBody + @RequestMapping("/handling/update") + public JsonResult updateIsHandling(Integer id, Integer enabled) { + if (enabled == null || (enabled != 0 && enabled != 1)) { + return JsonResult.error("状态值不正确"); + } + Pays pays = new Pays(); + pays.setId(id); + pays.setIsHandlingFee(enabled); + if (paysService.updateById(pays)) { + return JsonResult.ok("手续费标签开启成功"); + } + return JsonResult.error("开启失败"); + } + + /** + * 修改支付配置 + */ + @RequiresPermissions("settings:pays:update") + @OperLog(value = "支付配置管理", desc = "修改手续费", param = false, result = true) + @ResponseBody + @RequestMapping("/updateHandlingFee") + public JsonResult updateSort(PaysVo paysVo) { + Pays pays = new Pays(); + BeanUtils.copyProperties(paysVo, pays); + pays.setHandlingFee(paysVo.getHandlingFee()); + + if (paysService.updateById(pays)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } +} diff --git a/src/main/java/com/bomaos/settings/controller/ShopSettingsController.java b/src/main/java/com/bomaos/settings/controller/ShopSettingsController.java new file mode 100644 index 0000000..2b0e607 --- /dev/null +++ b/src/main/java/com/bomaos/settings/controller/ShopSettingsController.java @@ -0,0 +1,156 @@ +package com.bomaos.settings.controller; + +import com.alibaba.fastjson.JSON; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.settings.entity.ShopSettings; +import com.bomaos.settings.service.ShopSettingsService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 商店设置管理 + * Created by Panyoujie on 2021-07-04 03:54:31 + */ +@Controller +@RequestMapping("/settings/shopSettings") +public class ShopSettingsController extends BaseController { + @Autowired + private ShopSettingsService shopSettingsService; + + @RequiresPermissions("settings:shopSettings:view") + @RequestMapping() + public String view(Model model) { + ShopSettings shopSettings = shopSettingsService.getById(1); + model.addAttribute("shopSettings", JSON.toJSONString(shopSettings)); + return "settings/shopSettings.html"; + } + + /** + * 分页查询商店设置 + */ + @RequiresPermissions("settings:shopSettings:list") + @OperLog(value = "商店设置管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return new PageResult<>(shopSettingsService.page(pageParam, pageParam.getWrapper()).getRecords(), pageParam.getTotal()); + } + + /** + * 查询全部商店设置 + */ + @RequiresPermissions("settings:shopSettings:list") + @OperLog(value = "商店设置管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(shopSettingsService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询商店设置 + */ + @RequiresPermissions("settings:shopSettings:list") + @OperLog(value = "商店设置管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get() { + return JsonResult.ok().setData(shopSettingsService.getById(1)); + } + + /** + * 添加商店设置 + */ + @RequiresPermissions("settings:shopSettings:save") + @OperLog(value = "商店设置管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(ShopSettings shopSettings) { + if (shopSettingsService.save(shopSettings)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改商店设置 + */ + @RequiresPermissions("settings:shopSettings:update") + @OperLog(value = "商店设置管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(ShopSettings shopSettings) { + if (shopSettingsService.updateById(shopSettings)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除商店设置 + */ + @RequiresPermissions("settings:shopSettings:remove") + @OperLog(value = "商店设置管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (shopSettingsService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加商店设置 + */ + @RequiresPermissions("settings:shopSettings:save") + @OperLog(value = "商店设置管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (shopSettingsService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改商店设置 + */ + @RequiresPermissions("settings:shopSettings:update") + @OperLog(value = "商店设置管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(shopSettingsService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除商店设置 + */ + @RequiresPermissions("settings:shopSettings:remove") + @OperLog(value = "商店设置管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (shopSettingsService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + +} diff --git a/src/main/java/com/bomaos/settings/controller/WxPusherController.java b/src/main/java/com/bomaos/settings/controller/WxPusherController.java new file mode 100644 index 0000000..4c99198 --- /dev/null +++ b/src/main/java/com/bomaos/settings/controller/WxPusherController.java @@ -0,0 +1,101 @@ +package com.bomaos.settings.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bomaos.common.core.web.BaseController; +import com.bomaos.common.core.web.JsonResult; +import com.bomaos.settings.entity.ShopSettings; +import com.bomaos.settings.service.ShopSettingsService; +import com.zjiecode.wxpusher.client.HttpUtils; +import com.zjiecode.wxpusher.client.WxPusher; +import com.zjiecode.wxpusher.client.bean.CreateQrcodeReq; +import com.zjiecode.wxpusher.client.bean.CreateQrcodeResp; +import com.zjiecode.wxpusher.client.bean.Result; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.HashMap; +import java.util.Map; + +/** + * 微信订单通知 + * Created by Panyoujie on 2021-07-04 16:31:11 + */ +@Controller +@RequestMapping("/wxpusher") +public class WxPusherController extends BaseController { + + @Autowired + private ShopSettingsService shopSettingsService; + + @RequiresPermissions("settings:wxpusher:view") + @RequestMapping("/send") + public String view() { + return "settings/wxpusher.html"; + } + + @RequestMapping("/getWxpushCode") + @ResponseBody + public JsonResult getWxpushCode() { + + ShopSettings shopSettings = shopSettingsService.getById(1); + + if (StringUtils.isEmpty(shopSettings.getAppToken())) { + return JsonResult.error("您好,wxpusher 的 token为空!"); + } + + CreateQrcodeReq createQrcodeReq = new CreateQrcodeReq(); + createQrcodeReq.setAppToken(shopSettings.getAppToken()); // 必填,应用的appTOken + createQrcodeReq.setExtra(getLoginUserId().toString());// 必填,携带的参数 + createQrcodeReq.setValidTime(3600);// 可选,二维码有效时间,默认1800 s,最大30天,单位是s + Result tempQrcode = WxPusher.createAppTempQrcode(createQrcodeReq); + + if (tempQrcode.getCode() == 1000) { + // 根据查询指定UID用户 + Map params = new HashMap(); + params.put("appToken", shopSettings.getAppToken()); + params.put("page", 1); + params.put("pageSize", 1); + params.put("uid", shopSettings.getWxpushUid()); + params.put("type", 0); + + Result result = HttpUtils.get(params, "/api/fun/wxuser/v2"); + Map parseObject = JSON.parseObject(JSONObject.toJSONString(result.getData())); + Integer total = (Integer) parseObject.get("total"); // 0 未关注 1 已关注 + + if (total == 0) { + ShopSettings shopSettings1 = new ShopSettings(); + shopSettings1.setId(1); + shopSettings1.setWxpushUid(""); + shopSettingsService.updateById(shopSettings1); + } + + /** + * 这个情况是在扫码关注后 又取消关注,想再重新关注 生成的二维码 + */ + if (StringUtils.isEmpty(shopSettings.getWxpushUid()) || total == 0) { + Map map = new HashMap<>(); + map.put("code", "1"); + map.put("url", tempQrcode.getData().getUrl()); + return JsonResult.ok("成功").setData(map); + } else { + Object records = parseObject.get("records"); + String s = records.toString(); + String substring = s.substring(1, s.length() - 1); + Map jsonObject = JSON.parseObject(substring); + String headImg = jsonObject.get("headImg").toString(); // 头像 + + Map map = new HashMap<>(); + map.put("code", "2"); + map.put("headImg", headImg); + return JsonResult.ok("成功").setData(map); + } + } + return null; + } + +} diff --git a/src/main/java/com/bomaos/settings/entity/Coupon.java b/src/main/java/com/bomaos/settings/entity/Coupon.java new file mode 100644 index 0000000..3e7f264 --- /dev/null +++ b/src/main/java/com/bomaos/settings/entity/Coupon.java @@ -0,0 +1,94 @@ +package com.bomaos.settings.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 优惠券 + * Created by Panyoujie on 2021-06-23 07:43:23 + */ +@Data +@ToString +@TableName("sys_coupon") +public class Coupon implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 自增ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 分类id + */ + private Integer classifysId; + + /** + * 商品id + */ + private Integer productId; + + /** + * 类型-0一次性,1重复使用 + */ + private Integer type; + + /** + * 状态 + */ + private Integer status; + + /** + * 优惠券代码 + */ + private String coupon; + + /** + * 面额或者百分比 + */ + private Integer discountType; + + /** + * 面额、折扣 价格和百分比 + */ + private BigDecimal discountVal; + + /** + * 已使用次数 + */ + private Integer countUsed; + + /** + * 可用次数 + */ + private Integer countAll; + + /** + * 备注 + */ + private String remark; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 满减金额 + */ + private BigDecimal fullReduction; + +} diff --git a/src/main/java/com/bomaos/settings/entity/Pays.java b/src/main/java/com/bomaos/settings/entity/Pays.java new file mode 100644 index 0000000..b3e9bc0 --- /dev/null +++ b/src/main/java/com/bomaos/settings/entity/Pays.java @@ -0,0 +1,78 @@ +package com.bomaos.settings.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Date; + +/** + * 支付配置 + * Created by Panyoujie on 2021-03-29 11:06:11 + */ +@Data +@ToString +@TableName("sys_pays") +public class Pays implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 自增ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 名称 + */ + private String name; + + /** + * 驱动 + */ + private String driver; + + /** + * 配置 + */ + private String config; + + /** + * 说明 + */ + private String comment; + + /** + * 移动端显示开关 + */ + private Integer isMobile; + + /** + * 电脑端显示开关 + */ + private Integer isPc; + + /** + * 手续费tag + */ + private Integer isHandlingFee; + + /** + * 手续费 + */ + private Integer handlingFee; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新时间 + */ + private Date updatedAt; + +} diff --git a/src/main/java/com/bomaos/settings/entity/ShopSettings.java b/src/main/java/com/bomaos/settings/entity/ShopSettings.java new file mode 100644 index 0000000..c9139b9 --- /dev/null +++ b/src/main/java/com/bomaos/settings/entity/ShopSettings.java @@ -0,0 +1,92 @@ +package com.bomaos.settings.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; + +/** + * 商店设置 + * Created by Panyoujie on 2021-07-04 03:54:31 + */ +@Data +@ToString +@TableName("sys_shop_settings") +public class ShopSettings implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 自增id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 是否开启弹窗 + */ + private Integer isWindow; + + /** + * 弹窗内容 + */ + private String windowText; + + /** + * 全局背景图 + */ + private String isBackground; + + /** + * 商店详情 + */ + private String storeDetails; + + /** + * 是否开启微信通知 + */ + private Integer isWxpusher; + + /** + * wxpusher token + */ + private String appToken; + + /** + * wxpusher uid + */ + private String wxpushUid; + + /** + * 邮件通知 + */ + private Integer isEmail; + + /** + * 客服QQ号码 + */ + private String qqCustomerService; + + /** + * QQ群二维码 + */ + private String qqGroupQrcode; + + /** + * 是否开启在线客服 + */ + private Integer isClient; + + /** + * crisp密钥 + */ + private String crispKey; + + /** + * 首页模版 + */ + private Integer isModel; + +} diff --git a/src/main/java/com/bomaos/settings/mapper/CouponMapper.java b/src/main/java/com/bomaos/settings/mapper/CouponMapper.java new file mode 100644 index 0000000..94e204c --- /dev/null +++ b/src/main/java/com/bomaos/settings/mapper/CouponMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.settings.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.settings.entity.Coupon; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 优惠券Mapper接口 + * Created by Panyoujie on 2021-06-23 07:43:23 + */ +public interface CouponMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/settings/mapper/PaysMapper.java b/src/main/java/com/bomaos/settings/mapper/PaysMapper.java new file mode 100644 index 0000000..cfeadd4 --- /dev/null +++ b/src/main/java/com/bomaos/settings/mapper/PaysMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.settings.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.settings.entity.Pays; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 支付配置Mapper接口 + * Created by Panyoujie on 2021-03-29 11:06:11 + */ +public interface PaysMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/settings/mapper/ShopSettingsMapper.java b/src/main/java/com/bomaos/settings/mapper/ShopSettingsMapper.java new file mode 100644 index 0000000..111a50a --- /dev/null +++ b/src/main/java/com/bomaos/settings/mapper/ShopSettingsMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.settings.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.settings.entity.ShopSettings; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 商店设置Mapper接口 + * Created by Panyoujie on 2021-07-04 03:54:31 + */ +public interface ShopSettingsMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/settings/mapper/xml/CouponMapper.xml b/src/main/java/com/bomaos/settings/mapper/xml/CouponMapper.xml new file mode 100644 index 0000000..928100d --- /dev/null +++ b/src/main/java/com/bomaos/settings/mapper/xml/CouponMapper.xml @@ -0,0 +1,67 @@ + + + + + + + SELECT a.* + FROM sys_coupon a + + + + AND a.id = #{page.pageData.id} + + + AND a.classifys_id = #{page.pageData.classifysId} + + + AND a.product_id = #{page.pageData.productId} + + + AND a.type = #{page.pageData.type} + + + AND a.status = #{page.pageData.status} + + + AND a.coupon LIKE CONCAT('%', #{page.pageData.coupon}, '%') + + + AND a.discount_type = #{page.pageData.discountType} + + + AND a.discount_val LIKE CONCAT('%', #{page.pageData.discountVal}, '%') + + + AND a.count_used = #{page.pageData.countUsed} + + + AND a.count_all = #{page.pageData.countAll} + + + AND a.remark LIKE CONCAT('%', #{page.pageData.remark}, '%') + + + AND a.create_time >= #{page.pageData.createTimeStart} + + + AND a.create_time <= #{page.pageData.createTimeEnd} + + + AND a.full_reduction LIKE CONCAT('%', #{page.pageData.fullReduction}, '%') + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/settings/mapper/xml/PaysMapper.xml b/src/main/java/com/bomaos/settings/mapper/xml/PaysMapper.xml new file mode 100644 index 0000000..3e80f9d --- /dev/null +++ b/src/main/java/com/bomaos/settings/mapper/xml/PaysMapper.xml @@ -0,0 +1,55 @@ + + + + + + + SELECT a.* + FROM sys_pays a + + + + AND a.id = #{page.pageData.id} + + + AND a.driver LIKE CONCAT('%', #{page.pageData.driver}, '%') + + + AND a.config LIKE CONCAT('%', #{page.pageData.config}, '%') + + + AND a.comment LIKE CONCAT('%', #{page.pageData.comment}, '%') + + + AND a.is_mobile = #{page.pageData.isMobile} + + + AND a.is_pc = #{page.pageData.isPc} + + + AND a.is_handling_fee = #{page.pageData.isHandlingFee} + + + AND a.handling_fee = #{page.pageData.handlingFee} + + + AND a.created_at LIKE CONCAT('%', #{page.pageData.createdAt}, '%') + + + AND a.updated_at LIKE CONCAT('%', #{page.pageData.updatedAt}, '%') + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/settings/mapper/xml/ShopSettingsMapper.xml b/src/main/java/com/bomaos/settings/mapper/xml/ShopSettingsMapper.xml new file mode 100644 index 0000000..9ff4a12 --- /dev/null +++ b/src/main/java/com/bomaos/settings/mapper/xml/ShopSettingsMapper.xml @@ -0,0 +1,67 @@ + + + + + + + SELECT a.* + FROM sys_shop_settings a + + + + AND a.id = #{page.pageData.id} + + + AND a.is_window = #{page.pageData.isWindow} + + + AND a.window_text LIKE CONCAT('%', #{page.pageData.windowText}, '%') + + + AND a.is_background LIKE CONCAT('%', #{page.pageData.isBackground}, '%') + + + AND a.store_details LIKE CONCAT('%', #{page.pageData.storeDetails}, '%') + + + AND a.is_wxpusher = #{page.pageData.isWxpusher} + + + AND a.app_token LIKE CONCAT('%', #{page.pageData.appToken}, '%') + + + AND a.wxpush_uid LIKE CONCAT('%', #{page.pageData.wxpushUid}, '%') + + + AND a.is_email = #{page.pageData.isEmail} + + + AND a.qq_customer_service = #{page.pageData.qqCustomerService} + + + AND a.qq_group_qrcode = #{page.pageData.qqGroupQrcode} + + + AND a.is_client = #{page.pageData.isClient} + + + AND a.crisp_key = #{page.pageData.crispKey} + + + AND a.is_model = #{page.pageData.isModel} + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/settings/service/CouponService.java b/src/main/java/com/bomaos/settings/service/CouponService.java new file mode 100644 index 0000000..1f0b9e9 --- /dev/null +++ b/src/main/java/com/bomaos/settings/service/CouponService.java @@ -0,0 +1,35 @@ +package com.bomaos.settings.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.settings.entity.Coupon; + +import java.util.List; +import java.util.Map; + +/** + * 优惠券服务类 + * Created by Panyoujie on 2021-06-23 07:43:23 + */ +public interface CouponService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + + /** + * 添加优惠券 + * + * @param coupon + * @param userId + * @return + */ + boolean save(Coupon coupon, Integer userId); +} diff --git a/src/main/java/com/bomaos/settings/service/PaysService.java b/src/main/java/com/bomaos/settings/service/PaysService.java new file mode 100644 index 0000000..2efb3f2 --- /dev/null +++ b/src/main/java/com/bomaos/settings/service/PaysService.java @@ -0,0 +1,27 @@ +package com.bomaos.settings.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.settings.entity.Pays; + +import java.util.List; +import java.util.Map; + +/** + * 支付配置服务类 + * Created by Panyoujie on 2021-03-29 11:06:11 + */ +public interface PaysService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + +} diff --git a/src/main/java/com/bomaos/settings/service/ShopSettingsService.java b/src/main/java/com/bomaos/settings/service/ShopSettingsService.java new file mode 100644 index 0000000..18d6eb2 --- /dev/null +++ b/src/main/java/com/bomaos/settings/service/ShopSettingsService.java @@ -0,0 +1,27 @@ +package com.bomaos.settings.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.settings.entity.ShopSettings; + +import java.util.List; +import java.util.Map; + +/** + * 商店设置服务类 + * Created by Panyoujie on 2021-07-04 03:54:31 + */ +public interface ShopSettingsService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + +} diff --git a/src/main/java/com/bomaos/settings/service/impl/CouponServiceImpl.java b/src/main/java/com/bomaos/settings/service/impl/CouponServiceImpl.java new file mode 100644 index 0000000..4c0d669 --- /dev/null +++ b/src/main/java/com/bomaos/settings/service/impl/CouponServiceImpl.java @@ -0,0 +1,84 @@ +package com.bomaos.settings.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.settings.entity.Coupon; +import com.bomaos.settings.mapper.CouponMapper; +import com.bomaos.settings.service.CouponService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 优惠券服务实现类 + * Created by Panyoujie on 2021-06-23 07:43:23 + */ +@Service +public class CouponServiceImpl extends ServiceImpl implements CouponService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + + @Override + public boolean save(Coupon coupon, Integer userId) { + + coupon.setStatus(0); // 默认为未使用 + coupon.setCountUsed(0); // 使用次数默认为0 + coupon.setUpdateTime(new Date()); + coupon.setCreateTime(new Date()); + + // 等于0 的话就是表示为一次使用 + if (coupon.getType() == 0) { + List list = new ArrayList<>(); + for (int i = 0; i < coupon.getCountAll(); i++) { + Coupon coupon1 = new Coupon(); + BeanUtils.copyProperties(coupon, coupon1); + coupon1.setCountAll(1); // 一次性默认为1 + coupon1.setRemark("一次使用"); + coupon1.setCoupon(getRandomString(16).toUpperCase()); // 生成优惠券代码 + list.add(coupon1); + } + + /** + * 批量添加优惠券 + */ + return this.saveBatch(list); + } else if (coupon.getType() == 1) { // 等于1 重复使用 + + coupon.setRemark("重复使用"); + // 为空的话就系统给他生成一个优惠券代码 + if (coupon.getCoupon() == null || coupon.getCoupon() == "") { + coupon.setCoupon(getRandomString(16).toUpperCase()); // 生成优惠券代码 + } + + // 生成单卡优惠券 + return this.save(coupon); + } + + return false; + } + + public static String getRandomString(int length) { + String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < length; ++i) { + int number = random.nextInt(str.length()); + sb.append(str.charAt(number)); + } + + return sb.toString(); + } + +} diff --git a/src/main/java/com/bomaos/settings/service/impl/PaysServiceImpl.java b/src/main/java/com/bomaos/settings/service/impl/PaysServiceImpl.java new file mode 100644 index 0000000..4116057 --- /dev/null +++ b/src/main/java/com/bomaos/settings/service/impl/PaysServiceImpl.java @@ -0,0 +1,34 @@ +package com.bomaos.settings.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.settings.entity.Pays; +import com.bomaos.settings.mapper.PaysMapper; +import com.bomaos.settings.service.PaysService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * 支付配置服务实现类 + * Created by Panyoujie on 2021-03-29 11:06:11 + */ +@Service +@Transactional +public class PaysServiceImpl extends ServiceImpl implements PaysService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + +} diff --git a/src/main/java/com/bomaos/settings/service/impl/ShopSettingsServiceImpl.java b/src/main/java/com/bomaos/settings/service/impl/ShopSettingsServiceImpl.java new file mode 100644 index 0000000..113b43f --- /dev/null +++ b/src/main/java/com/bomaos/settings/service/impl/ShopSettingsServiceImpl.java @@ -0,0 +1,32 @@ +package com.bomaos.settings.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.settings.entity.ShopSettings; +import com.bomaos.settings.mapper.ShopSettingsMapper; +import com.bomaos.settings.service.ShopSettingsService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 商店设置服务实现类 + * Created by Panyoujie on 2021-07-04 03:54:31 + */ +@Service +public class ShopSettingsServiceImpl extends ServiceImpl implements ShopSettingsService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + +} diff --git a/src/main/java/com/bomaos/settings/vo/CouponVo.java b/src/main/java/com/bomaos/settings/vo/CouponVo.java new file mode 100644 index 0000000..2ea5a6b --- /dev/null +++ b/src/main/java/com/bomaos/settings/vo/CouponVo.java @@ -0,0 +1,85 @@ +package com.bomaos.settings.vo; + +import lombok.Data; +import lombok.ToString; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@ToString +public class CouponVo { + + private Integer id; + + /** + * 分类id + */ + private Integer classifysId; + + /** + * 商品id + */ + private Integer productId; + + /** + * 类型-0一次性,1重复使用 + */ + private Integer type; + + /** + * 状态 + */ + private Integer status; + + /** + * 优惠券代码 + */ + private String coupon; + + /** + * 面额或者百分比 + */ + private Integer discountType; + + /** + * 面额、折扣 价格和百分比 + */ + private BigDecimal discountVal; + + /** + * 已使用次数 + */ + private Integer countUsed; + + /** + * 可用次数 + */ + private Integer countAll; + + /** + * 备注 + */ + private String remark; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 满减金额 + */ + private BigDecimal fullReduction; + + /** + * 商品名称 + */ + private String productName; + +} diff --git a/src/main/java/com/bomaos/settings/vo/PaysVo.java b/src/main/java/com/bomaos/settings/vo/PaysVo.java new file mode 100644 index 0000000..24cfa2e --- /dev/null +++ b/src/main/java/com/bomaos/settings/vo/PaysVo.java @@ -0,0 +1,99 @@ +package com.bomaos.settings.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.ToString; + +import java.util.Date; + +@ToString +@Data +public class PaysVo { + /** + * 自增id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 支付类型名称 + */ + private String name; + + /** + * 支付驱动类型 + */ + private String driver; + + /** + * id + */ + private String appid; + + /** + * id + */ + private String mchid; + + /** + * 密钥 + */ + private String key; + + /** + * 支付宝官方密钥 + */ + private String mpKey; + + /** + * 通知地址 + */ + private String createUrl; + + /** + * 通知地址 + */ + private String notifyUrl; + + /** + * 说明 + */ + private String comment; + + /** + * 移动端显示开关 + */ + private Integer isMobile; + + /** + * 电脑端显示开关 + */ + private Integer isPc; + + /** + * 手续费tag + */ + private Integer isHandlingFee; + + /** + * 手续费 + */ + private Integer handlingFee; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新时间 + */ + private Date updatedAt; + + /** + * 索引 + */ + private Integer andIncrement; + +} diff --git a/src/main/java/com/bomaos/theme/controller/ThemeController.java b/src/main/java/com/bomaos/theme/controller/ThemeController.java new file mode 100644 index 0000000..11f4010 --- /dev/null +++ b/src/main/java/com/bomaos/theme/controller/ThemeController.java @@ -0,0 +1,181 @@ +package com.bomaos.theme.controller; + +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.theme.entity.Theme; +import com.bomaos.theme.service.ThemeService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 主题配置管理 + * Created by Panyoujie on 2021-06-28 00:36:29 + */ +@Controller +@RequestMapping("/theme/theme") +public class ThemeController extends BaseController { + @Autowired + private ThemeService themeService; + + @RequiresPermissions("theme:theme:view") + @RequestMapping() + public String view() { + return "theme/theme.html"; + } + + /** + * 分页查询主题配置 + */ + @RequiresPermissions("theme:theme:list") + @OperLog(value = "主题配置管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return new PageResult<>(themeService.page(pageParam, pageParam.getWrapper()).getRecords(), pageParam.getTotal()); + } + + /** + * 查询全部主题配置 + */ + @RequiresPermissions("theme:theme:list") + @OperLog(value = "主题配置管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(themeService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询主题配置 + */ + @RequiresPermissions("theme:theme:list") + @OperLog(value = "主题配置管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get(Integer id) { + return JsonResult.ok().setData(themeService.getById(id)); + } + + /** + * 添加主题配置 + */ + @RequiresPermissions("theme:theme:save") + @OperLog(value = "主题配置管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Theme theme) { + if (themeService.save(theme)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改主题配置 + */ + @RequiresPermissions("theme:theme:update") + @OperLog(value = "主题配置管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Theme theme) { + if (themeService.updateById(theme)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除主题配置 + */ + @RequiresPermissions("theme:theme:remove") + @OperLog(value = "主题配置管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (themeService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加主题配置 + */ + @RequiresPermissions("theme:theme:save") + @OperLog(value = "主题配置管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (themeService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改主题配置 + */ + @RequiresPermissions("theme:theme:update") + @OperLog(value = "主题配置管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(themeService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除主题配置 + */ + @RequiresPermissions("theme:theme:remove") + @OperLog(value = "主题配置管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (themeService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 修改状态 + */ + @OperLog(value = "主题配置管理", desc = "修改状态", result = true) + @RequiresPermissions("theme:theme:update") + @ResponseBody + @RequestMapping("/status/update") + public JsonResult updateStates(Integer id, Integer enabled) { + if (enabled == null || (enabled != 0 && enabled != 1)) { + return JsonResult.error("状态值不正确"); + } + + List list = themeService.list(); + List themeList = list.stream().map((theme) -> { + theme.setEnable(0); + return theme; + }).collect(Collectors.toList()); + themeService.updateBatchById(themeList); + + Theme theme = new Theme(); + theme.setId(id); + theme.setEnable(enabled); + if (themeService.updateById(theme)) { + return JsonResult.ok("主题切换成功!"); + } + return JsonResult.error("主题切换失败!"); + } + +} diff --git a/src/main/java/com/bomaos/theme/entity/Theme.java b/src/main/java/com/bomaos/theme/entity/Theme.java new file mode 100644 index 0000000..99074f9 --- /dev/null +++ b/src/main/java/com/bomaos/theme/entity/Theme.java @@ -0,0 +1,123 @@ +package com.bomaos.theme.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.util.Date; + +/** + * 主题配置 + * Created by Panyoujie on 2021-06-28 00:36:29 + */ +@TableName("sys_theme") +public class Theme implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 自增id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 主题名称 + */ + private String name; + + /** + * 说明 + */ + private String description; + + /** + * 主题驱动 + */ + private String driver; + + /** + * 是否设置 + */ + private Integer enable; + + /** + * 更新时间 + */ + private Date updateDate; + + /** + * 创建时间 + */ + private Date createDate; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDriver() { + return driver; + } + + public void setDriver(String driver) { + this.driver = driver; + } + + public Integer getEnable() { + return enable; + } + + public void setEnable(Integer enable) { + this.enable = enable; + } + + public Date getUpdateDate() { + return updateDate; + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + @Override + public String toString() { + return "Theme{" + + ", id=" + id + + ", name=" + name + + ", description=" + description + + ", driver=" + driver + + ", enable=" + enable + + ", updateDate=" + updateDate + + ", createDate=" + createDate + + "}"; + } + +} diff --git a/src/main/java/com/bomaos/theme/mapper/ThemeMapper.java b/src/main/java/com/bomaos/theme/mapper/ThemeMapper.java new file mode 100644 index 0000000..e448d24 --- /dev/null +++ b/src/main/java/com/bomaos/theme/mapper/ThemeMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.theme.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.theme.entity.Theme; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 主题配置Mapper接口 + * Created by Panyoujie on 2021-06-28 00:36:29 + */ +public interface ThemeMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/theme/mapper/xml/ThemeMapper.xml b/src/main/java/com/bomaos/theme/mapper/xml/ThemeMapper.xml new file mode 100644 index 0000000..0ea4cd2 --- /dev/null +++ b/src/main/java/com/bomaos/theme/mapper/xml/ThemeMapper.xml @@ -0,0 +1,46 @@ + + + + + + + SELECT a.* + FROM sys_theme a + + + + AND a.id = #{page.pageData.id} + + + AND a.name LIKE CONCAT('%', #{page.pageData.name}, '%') + + + AND a.description LIKE CONCAT('%', #{page.pageData.description}, '%') + + + AND a.driver LIKE CONCAT('%', #{page.pageData.driver}, '%') + + + AND a.enable = #{page.pageData.enable} + + + AND a.update_date LIKE CONCAT('%', #{page.pageData.updateDate}, '%') + + + AND a.create_date LIKE CONCAT('%', #{page.pageData.createDate}, '%') + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/theme/service/ThemeService.java b/src/main/java/com/bomaos/theme/service/ThemeService.java new file mode 100644 index 0000000..2a8be8c --- /dev/null +++ b/src/main/java/com/bomaos/theme/service/ThemeService.java @@ -0,0 +1,27 @@ +package com.bomaos.theme.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.theme.entity.Theme; + +import java.util.List; +import java.util.Map; + +/** + * 主题配置服务类 + * Created by Panyoujie on 2021-06-28 00:36:29 + */ +public interface ThemeService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + +} diff --git a/src/main/java/com/bomaos/theme/service/impl/ThemeServiceImpl.java b/src/main/java/com/bomaos/theme/service/impl/ThemeServiceImpl.java new file mode 100644 index 0000000..6036c27 --- /dev/null +++ b/src/main/java/com/bomaos/theme/service/impl/ThemeServiceImpl.java @@ -0,0 +1,32 @@ +package com.bomaos.theme.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.theme.entity.Theme; +import com.bomaos.theme.mapper.ThemeMapper; +import com.bomaos.theme.service.ThemeService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 主题配置服务实现类 + * Created by Panyoujie on 2021-06-28 00:36:29 + */ +@Service +public class ThemeServiceImpl extends ServiceImpl implements ThemeService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + +} diff --git a/src/main/java/com/bomaos/website/controller/WebsiteController.java b/src/main/java/com/bomaos/website/controller/WebsiteController.java new file mode 100644 index 0000000..33ec543 --- /dev/null +++ b/src/main/java/com/bomaos/website/controller/WebsiteController.java @@ -0,0 +1,157 @@ +package com.bomaos.website.controller; + +import com.alibaba.fastjson.JSON; +import com.bomaos.common.core.annotation.OperLog; +import com.bomaos.common.core.web.*; +import com.bomaos.website.entity.Website; +import com.bomaos.website.service.WebsiteService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 网站设置管理 + * Created by Panyoujie on 2021-06-06 02:14:54 + */ +@Controller +@RequestMapping("/website/website") +public class WebsiteController extends BaseController { + + @Autowired + private WebsiteService websiteService; + + @RequiresPermissions("website:website:view") + @RequestMapping() + public String view(Model model) { + Website website = websiteService.getById(1); + model.addAttribute("website", JSON.toJSONString(website)); + return "website/website.html"; + } + + /** + * 分页查询网站设置 + */ + @RequiresPermissions("website:website:list") + @OperLog(value = "网站设置管理", desc = "分页查询") + @ResponseBody + @RequestMapping("/page") + public PageResult page(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return new PageResult<>(websiteService.page(pageParam, pageParam.getWrapper()).getRecords(), pageParam.getTotal()); + } + + /** + * 查询全部网站设置 + */ + @RequiresPermissions("website:website:list") + @OperLog(value = "网站设置管理", desc = "查询全部") + @ResponseBody + @RequestMapping("/list") + public JsonResult list(HttpServletRequest request) { + PageParam pageParam = new PageParam<>(request); + return JsonResult.ok().setData(websiteService.list(pageParam.getOrderWrapper())); + } + + /** + * 根据id查询网站设置 + */ + @RequiresPermissions("website:website:list") + @OperLog(value = "网站设置管理", desc = "根据id查询") + @ResponseBody + @RequestMapping("/get") + public JsonResult get() { + return JsonResult.ok().setData(websiteService.getById(1)); + } + + /** + * 添加网站设置 + */ + @RequiresPermissions("website:website:save") + @OperLog(value = "网站设置管理", desc = "添加", param = false, result = true) + @ResponseBody + @RequestMapping("/save") + public JsonResult save(Website website) { + if (websiteService.save(website)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 修改网站设置 + */ + @RequiresPermissions("website:website:update") + @OperLog(value = "网站设置管理", desc = "修改", param = false, result = true) + @ResponseBody + @RequestMapping("/update") + public JsonResult update(Website website) { + if (websiteService.updateById(website)) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 删除网站设置 + */ + @RequiresPermissions("website:website:remove") + @OperLog(value = "网站设置管理", desc = "删除", result = true) + @ResponseBody + @RequestMapping("/remove") + public JsonResult remove(Integer id) { + if (websiteService.removeById(id)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + + /** + * 批量添加网站设置 + */ + @RequiresPermissions("website:website:save") + @OperLog(value = "网站设置管理", desc = "批量添加", param = false, result = true) + @ResponseBody + @RequestMapping("/saveBatch") + public JsonResult saveBatch(@RequestBody List list) { + if (websiteService.saveBatch(list)) { + return JsonResult.ok("添加成功"); + } + return JsonResult.error("添加失败"); + } + + /** + * 批量修改网站设置 + */ + @RequiresPermissions("website:website:update") + @OperLog(value = "网站设置管理", desc = "批量修改", result = true) + @ResponseBody + @RequestMapping("/updateBatch") + public JsonResult updateBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(websiteService, "id")) { + return JsonResult.ok("修改成功"); + } + return JsonResult.error("修改失败"); + } + + /** + * 批量删除网站设置 + */ + @RequiresPermissions("website:website:remove") + @OperLog(value = "网站设置管理", desc = "批量删除", result = true) + @ResponseBody + @RequestMapping("/removeBatch") + public JsonResult removeBatch(@RequestBody List ids) { + if (websiteService.removeByIds(ids)) { + return JsonResult.ok("删除成功"); + } + return JsonResult.error("删除失败"); + } + +} diff --git a/src/main/java/com/bomaos/website/entity/Website.java b/src/main/java/com/bomaos/website/entity/Website.java new file mode 100644 index 0000000..0d0b93f --- /dev/null +++ b/src/main/java/com/bomaos/website/entity/Website.java @@ -0,0 +1,67 @@ +package com.bomaos.website.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; + +/** + * 网站设置 + * Created by Panyoujie on 2021-06-06 02:14:54 + */ +@ToString +@Data +@TableName("sys_website") +public class Website implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 自增id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 网站名称 + */ + private String websiteName; + + /** + * 网站域名 + */ + private String websiteUrl; + + /** + * 网站logo + */ + private String websiteLogo; + + /** + * 联系方式 + */ + private String contact; + + /** + * 备案ICP + */ + private String beianIcp; + + /** + * 关键字 + */ + private String keywords; + + /** + * 网站描述 + */ + private String description; + + /** + * favicon + */ + private String favicon; + +} diff --git a/src/main/java/com/bomaos/website/mapper/WebsiteMapper.java b/src/main/java/com/bomaos/website/mapper/WebsiteMapper.java new file mode 100644 index 0000000..d8f0dc8 --- /dev/null +++ b/src/main/java/com/bomaos/website/mapper/WebsiteMapper.java @@ -0,0 +1,27 @@ +package com.bomaos.website.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.website.entity.Website; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 网站设置Mapper接口 + * Created by Panyoujie on 2021-06-06 02:14:54 + */ +public interface WebsiteMapper extends BaseMapper { + + /** + * 分页查询 + */ + List listPage(@Param("page") PageParam page); + + /** + * 查询全部 + */ + List listAll(@Param("page") Map page); + +} diff --git a/src/main/java/com/bomaos/website/mapper/xml/WebsiteMapper.xml b/src/main/java/com/bomaos/website/mapper/xml/WebsiteMapper.xml new file mode 100644 index 0000000..5c49ddc --- /dev/null +++ b/src/main/java/com/bomaos/website/mapper/xml/WebsiteMapper.xml @@ -0,0 +1,52 @@ + + + + + + + SELECT a.* + FROM sys_website a + + + + AND a.id = #{page.pageData.id} + + + AND a.website_name LIKE CONCAT('%', #{page.pageData.websiteName}, '%') + + + AND a.website_url LIKE CONCAT('%', #{page.pageData.websiteUrl}, '%') + + + AND a.website_logo LIKE CONCAT('%', #{page.pageData.websiteLogo}, '%') + + + AND a.contact LIKE CONCAT('%', #{page.pageData.contact}, '%') + + + AND a.beian_icp LIKE CONCAT('%', #{page.pageData.beianIcp}, '%') + + + AND a.keywords LIKE CONCAT('%', #{page.pageData.keywords}, '%') + + + AND a.description LIKE CONCAT('%', #{page.pageData.description}, '%') + + + AND a.favicon LIKE CONCAT('%', #{page.pageData.favicon}, '%') + + + + + + + + + + + + diff --git a/src/main/java/com/bomaos/website/service/WebsiteService.java b/src/main/java/com/bomaos/website/service/WebsiteService.java new file mode 100644 index 0000000..4bf9526 --- /dev/null +++ b/src/main/java/com/bomaos/website/service/WebsiteService.java @@ -0,0 +1,27 @@ +package com.bomaos.website.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.website.entity.Website; + +import java.util.List; +import java.util.Map; + +/** + * 网站设置服务类 + * Created by Panyoujie on 2021-06-06 02:14:54 + */ +public interface WebsiteService extends IService { + + /** + * 分页查询 + */ + PageResult listPage(PageParam page); + + /** + * 查询所有 + */ + List listAll(Map page); + +} diff --git a/src/main/java/com/bomaos/website/service/impl/WebsiteServiceImpl.java b/src/main/java/com/bomaos/website/service/impl/WebsiteServiceImpl.java new file mode 100644 index 0000000..3a791c9 --- /dev/null +++ b/src/main/java/com/bomaos/website/service/impl/WebsiteServiceImpl.java @@ -0,0 +1,32 @@ +package com.bomaos.website.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bomaos.common.core.web.PageParam; +import com.bomaos.common.core.web.PageResult; +import com.bomaos.website.entity.Website; +import com.bomaos.website.mapper.WebsiteMapper; +import com.bomaos.website.service.WebsiteService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 网站设置服务实现类 + * Created by Panyoujie on 2021-06-06 02:14:54 + */ +@Service +public class WebsiteServiceImpl extends ServiceImpl implements WebsiteService { + + @Override + public PageResult listPage(PageParam page) { + List records = baseMapper.listPage(page); + return new PageResult<>(records, page.getTotal()); + } + + @Override + public List listAll(Map page) { + return baseMapper.listAll(page); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..79c9d50 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,16 @@ +# 开发环境配置 + +# 数据源配置 +spring: + datasource: + url: jdbc:mysql://localhost:3307/bomaos-shop?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + +# 日志配置 +logging: + level: + com.bomaos: DEBUG + com.baomidou.mybatisplus: DEBUG diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 0000000..f3336ca --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,19 @@ +# 生产环境配置 + +# 数据源配置 +spring: + datasource: + url: jdbc:mysql://localhost:3306/root?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + +# 日志配置 +logging: + file: + name: bomaos-shop.log + level: + root: WARN + com.bomaos: ERROR + com.baomidou.mybatisplus: ERROR diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml new file mode 100644 index 0000000..c303815 --- /dev/null +++ b/src/main/resources/application-test.yml @@ -0,0 +1,18 @@ +# 测试环境配置 + +# 数据源配置 +spring: + datasource: + url: jdbc:mysql://localhost:3306/zlianweb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + +# 日志配置 +logging: + file: + name: bomaos-shop.log + level: + com.bomaos: DEBUG + com.baomidou.mybatisplus: DEBUG diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..810df3f --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,89 @@ +# 端口 +server: + port: 8085 + +# 多环境配置 +spring: + profiles: + active: dev + + # 连接池配置 + datasource: + druid: + initial-size: 5 + min-idle: 5 + max-active: 20 + max-wait: 30000 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + test-while-idle: true + test-on-borrow: true + test-on-return: false + remove-abandoned: true + remove-abandoned-timeout: 1800 + #pool-prepared-statements: false + #max-pool-prepared-statement-per-connection-size: 20 + filters: stat,wall + validation-query: SELECT 'x' + aop-patterns: com.bomaos.*.*.service.* + stat-view-servlet: + url-pattern: /druid/* + reset-enable: true + login-username: + login-password: + + # json时间格式设置 + jackson: + time-zone: GMT+8 + date-format: yyyy/MM/dd HH:mm:ss + + # 设置上传文件大小 + servlet: + multipart.max-file-size: 100MB + multipart.max-request-size: 100MB + + # 邮件服务器配置 + mail: + host: smtp.qq.com + username: xxxxxx@xxx.com + password: xxxxxxxx + default-encoding: UTF-8 + properties: + mail: + smtp: + auth: true + socketFactory: + class: javax.net.ssl.SSLSocketFactory + port: 465 + + thymeleaf: + cache: false + mode: HTML + encoding: UTF-8 + servlet: + content-type: text/html + + main: + allow-bean-definition-overriding: true + +# Mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath:com/bomaos/**/*Mapper.xml + typeAliasesPackage: com.bomaos.**.entity + global-config: + id-type: 0 + field-strategy: 1 + db-column-underline: true + logic-delete-value: 1 + logic-not-delete-value: 0 + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + +## 0是 redisTokenStore ,1是 jdbcTokenStore ,默认是0 +jwtp: + store-type: 1 + ## 拦截路径,默认是/** + path: /api/** + ## 单个用户最大token数,默认-1不限制 + max-token: 10 diff --git a/src/main/resources/cert/wxpay/apiclient_cert.p12 b/src/main/resources/cert/wxpay/apiclient_cert.p12 new file mode 100644 index 0000000..6970a08 Binary files /dev/null and b/src/main/resources/cert/wxpay/apiclient_cert.p12 differ diff --git a/src/main/resources/cert/wxpay/apiclient_cert.pem b/src/main/resources/cert/wxpay/apiclient_cert.pem new file mode 100644 index 0000000..2dbb78c --- /dev/null +++ b/src/main/resources/cert/wxpay/apiclient_cert.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID6TCCAtGgAwIBAgIUW9RbPKCmdzs4ifXyTVjBytKBFsQwDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMjEwNzAxMTgyMTA2WhcNMjYwNjMwMTgyMTA2WjB7MRMwEQYDVQQDDAox +NjAzNDM5MzMzMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM +HuiKnee9mOWMuueCs+S4ueaXpeeUqOeZvui0p+W6lzELMAkGA1UEBgwCQ04xETAP +BgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +5Tl0BuPxGmt/K6r23y56JeNpbGICI9fjRnwlAyczLeE/BaRllYrf07CknZvAGBDV +AChEQi7ncl+NaRe0aXCmQiGblhTcqh57CaAOBPGCvJBzgeklFjAuSiozIHvswoNS +Q3mtb12Sr2LpxdGfcvJ7ddxiT3NoGe1ipeSmxG0hrpF10IO0M+rQfKurQyW/s3K2 +8Tt7gS7OVbqUCXRUQlaqjcHyLahltOpIyTnX6jpFRyxu37Wsbu99bdie4YxARc02 ++bkgDAXFbwn/kT3yxbbAACV/shu6FDehd85L57BRXejv5+DQOP4Gw4l9hM3UbRS/ +9IIJFU6woNoXDVWuuf8n7QIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC +BPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1 +YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw +MUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQCsaXYZHJbVTLoc91Uiv5w9jrEV +uZpitCIrxm4fm3yslGAC2RxtBszR+HE+gURahJ41VS3gY92sh8l18jyE75v3IL9t +5PTEKkPDPVvhtg80I66+0OXTuxe8KrNbnT0oSnYkK9J86WZeMvksvDAKx4R2iq2b +GXQwu5toa6A7y1BPUaJZILiqJgajamIAhdcr3CWNKzUSRd14FS/kFK8ZK6SNUs3i +2313sO4YM0rWcozEK3En1PMCIBTEEMLA/vItnfBplbbRC4VJuv1yXRggXKiQETb8 +VyM7cPdTF29hx/AxHqGFZTm/CTaa+TVIzE5VCRacQ9aDafQm0MtrHTJHb99n +-----END CERTIFICATE----- diff --git a/src/main/resources/cert/wxpay/apiclient_key.pem b/src/main/resources/cert/wxpay/apiclient_key.pem new file mode 100644 index 0000000..7271e70 --- /dev/null +++ b/src/main/resources/cert/wxpay/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDlOXQG4/Eaa38r +qvbfLnol42lsYgIj1+NGfCUDJzMt4T8FpGWVit/TsKSdm8AYENUAKERCLudyX41p +F7RpcKZCIZuWFNyqHnsJoA4E8YK8kHOB6SUWMC5KKjMge+zCg1JDea1vXZKvYunF +0Z9y8nt13GJPc2gZ7WKl5KbEbSGukXXQg7Qz6tB8q6tDJb+zcrbxO3uBLs5VupQJ +dFRCVqqNwfItqGW06kjJOdfqOkVHLG7ftaxu731t2J7hjEBFzTb5uSAMBcVvCf+R +PfLFtsAAJX+yG7oUN6F3zkvnsFFd6O/n4NA4/gbDiX2EzdRtFL/0ggkVTrCg2hcN +Va65/yftAgMBAAECggEBAJAT+brvATfzA18GOd/0TbCM7VHDlMbExsUh+P2vYPrg +joVUXMmPHbroV7/9CtPVmJxdsvHKm42HQ9IfpTV1Kft9NlcyS7TeLcXSBZ3T07IE +NaYdTkNRC3dwaOxtGFb2xflFfN73+OAmkvvVE5zjjvh5Co4X4wIQ9KWDP9NNKROY +h4zTS714NmNq4Yf3gyJZNCOxuH+4xlKNp0mU95kwH07KRAO/duHBeRye6hTYVVTt +0SUMhJyVW2UVlyU2ROmKDmx296VVLOThyUjvOSRto60A4yRFRt+nvpmYNZCiqESQ +Xv733rR9w50tZXwprQAPHQ+CvHiPKh9Xgqpr456B8z0CgYEA/jUyvioViEEos43o +tuX9TRw0sSn/8RWvltJUhVDHbeRGCOJYVBrS0x55o3NJNR4FvPVGZct9UKm1mo2h +RQzuTJEp99n+epRbDleQdcOUGs7qubl0WIFwkVRVdFpTHqd5/zKNEpP6C7Hdfv65 +h/RBFMOi7aUnpKjG5xFHIXldKRMCgYEA5tcqDcrRIBzteX1JpK3i2a8bCVkezipJ +HJqjSMsRVmjtzVphXDavpqZ3/7D6SNlhBnRW/b8Ic4+JPX9hbPBgiOjobGyXGRMV +UkTOEjyUSSMOgv68QVg4Jj+ISM8VI81ke9b5W2OFzdhsJaQ4JmcW6qtujcX6pSNp +dyFcJDKViv8CgYB6Y6B/oAFn7X8sG5m8XTS8KGVSGteH+hnk8nURDphF107Evj0q +mROB471KrZnEgiTfGfP/1J4L9PljZOcNOLGOmaFsHD+CQuUoHY6GtFgdJBwsuRZD ++mX5AnJ2J3q3WojJDkyPckFD2im7F+a5hybCWYKbChXxF/VTkKT/f9ATkwKBgECA +DngcG6LlclVn9JPXInPAwcUy6bChkBw1+Tn1w7ppR0kB4AJsJVhjW1ROlyCT3NB4 +4XW1Ux83FBni5c4SvGaE7ayeCvouot6B6zKdSrHE4eEoXGHFzKqjRelSM431bgZM +YxBuFo0V0+IQqL/SPk0D6bgjgY1y/50R7TUQDUjxAoGBAIL7huSkepne49Cw3T+H +1B/BVegAFaeIwB3wSy0ANsWA+14s1KwoT/icEg0qKdHUCkB1tiH9P28Fss/oflGx +9XCkB4v5PEqZYPTyzS7OCgCsjH6w2wHakPBiKhmEjQpvypS/EZdL0Q5WH8/fVChy +LCiKO+WRo4vmBMX1EdllnP3C +-----END PRIVATE KEY----- diff --git a/src/main/resources/ehcache/ehcache-shiro.xml b/src/main/resources/ehcache/ehcache-shiro.xml new file mode 100644 index 0000000..7eee76e --- /dev/null +++ b/src/main/resources/ehcache/ehcache-shiro.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/src/main/resources/static/assets/css/workplace.css b/src/main/resources/static/assets/css/workplace.css new file mode 100644 index 0000000..983661b --- /dev/null +++ b/src/main/resources/static/assets/css/workplace.css @@ -0,0 +1,232 @@ +/** 应用快捷块样式 */ +.console-app-group { + padding: 16px; + border-radius: 4px; + text-align: center; + background-color: #fff; + cursor: pointer; + display: block; +} + +.console-app-group .console-app-icon { + width: 32px; + height: 32px; + line-height: 32px; + margin-bottom: 6px; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + font-size: 32px; + color: #69c0ff; +} + +.console-app-group:hover { + box-shadow: 0 0 15px rgba(0, 0, 0, .08); +} + +/** //应用快捷块样式 */ + +/** 小组成员 */ +.console-user-group { + position: relative; + padding: 10px 0 10px 60px; +} + +.console-user-group .console-user-group-head { + width: 32px; + height: 32px; + position: absolute; + top: 50%; + left: 12px; + margin-top: -16px; + border-radius: 50%; +} + +.console-user-group .layui-badge { + position: absolute; + top: 50%; + right: 8px; + margin-top: -10px; +} + +.console-user-group .console-user-group-name { + line-height: 1.2; +} + +.console-user-group .console-user-group-desc { + color: #8c8c8c; + line-height: 1; + font-size: 12px; + margin-top: 5px; +} + +/** 卡片轮播图样式 */ +.admin-carousel .layui-carousel-ind { + position: absolute; + top: -41px; + text-align: right; +} + +.admin-carousel .layui-carousel-ind ul { + background: 0 0; +} + +.admin-carousel .layui-carousel-ind li { + background-color: #e2e2e2; +} + +.admin-carousel .layui-carousel-ind li.layui-this { + background-color: #999; +} + +/** 广告位轮播图 */ +.admin-news .layui-carousel-ind { + height: 45px; +} + +.admin-news a { + display: block; + line-height: 70px; + text-align: center; +} + +/** 最新动态时间线 */ +.layui-timeline-dynamic .layui-timeline-item { + padding-bottom: 0; +} + +.layui-timeline-dynamic .layui-timeline-item:before { + top: 16px; +} + +.layui-timeline-dynamic .layui-timeline-axis { + width: 9px; + height: 9px; + left: 1px; + top: 7px; + background-color: #cbd0db; +} + +.layui-timeline-dynamic .layui-timeline-axis.active { + background-color: #0c64eb; + box-shadow: 0 0 0 2px rgba(12, 100, 235, .3); +} + +.dynamic-card-body { + box-sizing: border-box; + overflow: hidden; +} + +.dynamic-card-body:hover { + overflow-y: auto; + padding-right: 15px; +} + +/** 优先级徽章 */ +.layui-badge-priority { + border-radius: 50%; + width: 20px; + height: 20px; + padding: 0; + line-height: 18px; + border-width: 2px; + font-weight: 600; +} + +/* 用户信息 */ +.user-info-head { + width: 110px; + height: 110px; + line-height: 110px; + position: relative; + display: inline-block; + border: 2px solid #eee; + border-radius: 50%; + overflow: hidden; + cursor: pointer; + margin: 0 auto; +} + +.user-info-head:hover:after { + content: '\e681'; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + color: #fff; + background-color: rgba(0, 0, 0, 0.3); + font-size: 28px; + padding-top: 2px; + font-style: normal; + font-family: layui-icon; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.user-info-head img { + width: 110px; + height: 110px; +} + +.user-info-list-item { + position: relative; + padding-bottom: 8px; +} + +.user-info-list-item > .layui-icon { + position: absolute; +} + +.user-info-list-item > p { + padding-left: 30px; +} + +.layui-line-dash { + border-bottom: 1px dashed #ccc; + margin: 15px 0; +} + +/* 基本信息 */ +#userInfoForm .layui-form-item { + margin-bottom: 25px; +} + +/* 账号绑定 */ +.user-bd-list-item { + padding: 14px 60px 14px 10px; + border-bottom: 1px solid #e8e8e8; + position: relative; +} + +.user-bd-list-item .user-bd-list-lable { + color: #333; + margin-bottom: 4px; +} + +.user-bd-list-item .user-bd-list-oper { + position: absolute; + top: 50%; + right: 10px; + margin-top: -8px; + cursor: pointer; +} + +.user-bd-list-item .user-bd-list-img { + width: 48px; + height: 48px; + line-height: 48px; + position: absolute; + top: 50%; + left: 10px; + margin-top: -24px; +} + +.user-bd-list-item .user-bd-list-img + .user-bd-list-content { + margin-left: 68px; +} + +.btn-cloud { + width: 28%; +} diff --git a/src/main/resources/static/assets/file/用户导入模板.xlsx b/src/main/resources/static/assets/file/用户导入模板.xlsx new file mode 100644 index 0000000..3d9f2bd Binary files /dev/null and b/src/main/resources/static/assets/file/用户导入模板.xlsx differ diff --git a/src/main/resources/static/assets/images/error_ic_empty.png b/src/main/resources/static/assets/images/error_ic_empty.png new file mode 100644 index 0000000..c94265b Binary files /dev/null and b/src/main/resources/static/assets/images/error_ic_empty.png differ diff --git a/src/main/resources/static/assets/images/head.jpg b/src/main/resources/static/assets/images/head.jpg new file mode 100644 index 0000000..1d23eff Binary files /dev/null and b/src/main/resources/static/assets/images/head.jpg differ diff --git a/src/main/resources/static/assets/images/ic_403.png b/src/main/resources/static/assets/images/ic_403.png new file mode 100644 index 0000000..72221be Binary files /dev/null and b/src/main/resources/static/assets/images/ic_403.png differ diff --git a/src/main/resources/static/assets/images/ic_404.png b/src/main/resources/static/assets/images/ic_404.png new file mode 100644 index 0000000..e2eb683 Binary files /dev/null and b/src/main/resources/static/assets/images/ic_404.png differ diff --git a/src/main/resources/static/assets/images/ic_500.png b/src/main/resources/static/assets/images/ic_500.png new file mode 100644 index 0000000..b937e94 Binary files /dev/null and b/src/main/resources/static/assets/images/ic_500.png differ diff --git a/src/main/resources/static/assets/js/common.js b/src/main/resources/static/assets/js/common.js new file mode 100644 index 0000000..6fd385e --- /dev/null +++ b/src/main/resources/static/assets/js/common.js @@ -0,0 +1 @@ +layui.config({cacheTab:false,tabAutoRefresh:true,version:"318",base:getProjectUrl()+"assets/module/"}).extend({steps:"steps/steps",notice:"notice/notice",cascader:"cascader/cascader",dropdown:"dropdown/dropdown",fileChoose:"fileChoose/fileChoose",Split:"Split/Split",Cropper:"Cropper/Cropper",tagsInput:"tagsInput/tagsInput",citypicker:"city-picker/city-picker",introJs:"introJs/introJs",zTree:"zTree/zTree"}).use(["layer","admin"],function(){var c=layui.jquery;var b=layui.layer;var a=layui.admin});function getProjectUrl(){var c=layui.cache.dir;if(!c){var e=document.scripts,b=e.length-1,f;for(var a=b;a>0;a--){if(e[a].readyState==="interactive"){f=e[a].src;break}}var d=f||e[b].src;c=d.substring(0,d.lastIndexOf("/")+1)}return c.substring(0,c.indexOf("assets"))}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/jquery-3.5.1.min.js b/src/main/resources/static/assets/js/jquery-3.5.1.min.js new file mode 100644 index 0000000..d467083 --- /dev/null +++ b/src/main/resources/static/assets/js/jquery-3.5.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 01&&!f.isFunction(p)){v=f.extend({},b.defaults,v);if(typeof v.expires==="number"){var r=v.expires,u=v.expires=new Date();u.setMilliseconds(u.getMilliseconds()+r*86400000)}return(document.cookie=[d(q),"=",h(p),v.expires?"; expires="+v.expires.toUTCString():"",v.path?"; path="+v.path:"",v.domain?"; domain="+v.domain:"",v.secure?"; secure":""].join(""))}var w=q?undefined:{},s=document.cookie?document.cookie.split("; "):[],o=0,m=s.length;for(;o; + virtualIndex: number; + class: string; + autoplayDelay: string | null; + set zoom(val: boolean); + get zoom(): boolean; + private _zoom; + slideIndex: number; + get classNames(): string; + set classNames(val: string); + private _hasClass; + slideData: { + isActive: boolean; + isPrev: boolean; + isNext: boolean; + isVisible: boolean; + isDuplicate: boolean; + }; + private _classNames; + constructor(template: TemplateRef); + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵdir: i0.ɵɵDirectiveDeclaration; +} diff --git a/src/main/resources/static/assets/js/swiper/angular/angular/src/swiper.component.d.ts b/src/main/resources/static/assets/js/swiper/angular/angular/src/swiper.component.d.ts new file mode 100644 index 0000000..bf85023 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/angular/src/swiper.component.d.ts @@ -0,0 +1,252 @@ +import { ChangeDetectorRef, ElementRef, EventEmitter, NgZone, OnInit, QueryList, SimpleChanges } from '@angular/core'; +import Swiper from 'swiper'; +import { Observable, Subject } from 'rxjs'; +import { SwiperSlideDirective } from './swiper-slide.directive'; +import { SwiperOptions, SwiperEvents, NavigationOptions, PaginationOptions, ScrollbarOptions, VirtualOptions } from 'swiper/types'; +import * as i0 from "@angular/core"; +export declare class SwiperComponent implements OnInit { + private _ngZone; + private elementRef; + private _changeDetectorRef; + private _platformId; + enabled: SwiperOptions['enabled']; + direction: SwiperOptions['direction']; + touchEventsTarget: SwiperOptions['touchEventsTarget']; + initialSlide: SwiperOptions['initialSlide']; + speed: SwiperOptions['speed']; + cssMode: SwiperOptions['cssMode']; + updateOnWindowResize: SwiperOptions['updateOnWindowResize']; + resizeObserver: SwiperOptions['resizeObserver']; + nested: SwiperOptions['nested']; + focusableElements: SwiperOptions['focusableElements']; + width: SwiperOptions['width']; + height: SwiperOptions['height']; + preventInteractionOnTransition: SwiperOptions['preventInteractionOnTransition']; + userAgent: SwiperOptions['userAgent']; + url: SwiperOptions['url']; + edgeSwipeDetection: boolean | string; + edgeSwipeThreshold: number; + freeMode: SwiperOptions['freeMode']; + autoHeight: SwiperOptions['autoHeight']; + setWrapperSize: SwiperOptions['setWrapperSize']; + virtualTranslate: SwiperOptions['virtualTranslate']; + effect: SwiperOptions['effect']; + breakpoints: SwiperOptions['breakpoints']; + spaceBetween: SwiperOptions['spaceBetween']; + slidesPerView: SwiperOptions['slidesPerView']; + grid: SwiperOptions['grid']; + slidesPerGroup: SwiperOptions['slidesPerGroup']; + slidesPerGroupSkip: SwiperOptions['slidesPerGroupSkip']; + centeredSlides: SwiperOptions['centeredSlides']; + centeredSlidesBounds: SwiperOptions['centeredSlidesBounds']; + slidesOffsetBefore: SwiperOptions['slidesOffsetBefore']; + slidesOffsetAfter: SwiperOptions['slidesOffsetAfter']; + normalizeSlideIndex: SwiperOptions['normalizeSlideIndex']; + centerInsufficientSlides: SwiperOptions['centerInsufficientSlides']; + watchOverflow: SwiperOptions['watchOverflow']; + roundLengths: SwiperOptions['roundLengths']; + touchRatio: SwiperOptions['touchRatio']; + touchAngle: SwiperOptions['touchAngle']; + simulateTouch: SwiperOptions['simulateTouch']; + shortSwipes: SwiperOptions['shortSwipes']; + longSwipes: SwiperOptions['longSwipes']; + longSwipesRatio: SwiperOptions['longSwipesRatio']; + longSwipesMs: SwiperOptions['longSwipesMs']; + followFinger: SwiperOptions['followFinger']; + allowTouchMove: SwiperOptions['allowTouchMove']; + threshold: SwiperOptions['threshold']; + touchMoveStopPropagation: SwiperOptions['touchMoveStopPropagation']; + touchStartPreventDefault: SwiperOptions['touchStartPreventDefault']; + touchStartForcePreventDefault: SwiperOptions['touchStartForcePreventDefault']; + touchReleaseOnEdges: SwiperOptions['touchReleaseOnEdges']; + uniqueNavElements: SwiperOptions['uniqueNavElements']; + resistance: SwiperOptions['resistance']; + resistanceRatio: SwiperOptions['resistanceRatio']; + watchSlidesProgress: SwiperOptions['watchSlidesProgress']; + grabCursor: SwiperOptions['grabCursor']; + preventClicks: SwiperOptions['preventClicks']; + preventClicksPropagation: SwiperOptions['preventClicksPropagation']; + slideToClickedSlide: SwiperOptions['slideToClickedSlide']; + preloadImages: SwiperOptions['preloadImages']; + updateOnImagesReady: SwiperOptions['updateOnImagesReady']; + loop: SwiperOptions['loop']; + loopAdditionalSlides: SwiperOptions['loopAdditionalSlides']; + loopedSlides: SwiperOptions['loopedSlides']; + loopFillGroupWithBlank: SwiperOptions['loopFillGroupWithBlank']; + loopPreventsSlide: SwiperOptions['loopPreventsSlide']; + allowSlidePrev: SwiperOptions['allowSlidePrev']; + allowSlideNext: SwiperOptions['allowSlideNext']; + swipeHandler: SwiperOptions['swipeHandler']; + noSwiping: SwiperOptions['noSwiping']; + noSwipingClass: SwiperOptions['noSwipingClass']; + noSwipingSelector: SwiperOptions['noSwipingSelector']; + passiveListeners: SwiperOptions['passiveListeners']; + containerModifierClass: SwiperOptions['containerModifierClass']; + slideClass: SwiperOptions['slideClass']; + slideBlankClass: SwiperOptions['slideBlankClass']; + slideActiveClass: SwiperOptions['slideActiveClass']; + slideDuplicateActiveClass: SwiperOptions['slideDuplicateActiveClass']; + slideVisibleClass: SwiperOptions['slideVisibleClass']; + slideDuplicateClass: SwiperOptions['slideDuplicateClass']; + slideNextClass: SwiperOptions['slideNextClass']; + slideDuplicateNextClass: SwiperOptions['slideDuplicateNextClass']; + slidePrevClass: SwiperOptions['slidePrevClass']; + slideDuplicatePrevClass: SwiperOptions['slideDuplicatePrevClass']; + wrapperClass: SwiperOptions['wrapperClass']; + runCallbacksOnInit: SwiperOptions['runCallbacksOnInit']; + observeParents: SwiperOptions['observeParents']; + observeSlideChildren: SwiperOptions['observeSlideChildren']; + a11y: SwiperOptions['a11y']; + autoplay: SwiperOptions['autoplay']; + controller: SwiperOptions['controller']; + coverflowEffect: SwiperOptions['coverflowEffect']; + cubeEffect: SwiperOptions['cubeEffect']; + fadeEffect: SwiperOptions['fadeEffect']; + flipEffect: SwiperOptions['flipEffect']; + creativeEffect: SwiperOptions['creativeEffect']; + cardsEffect: SwiperOptions['cardsEffect']; + hashNavigation: SwiperOptions['hashNavigation']; + history: SwiperOptions['history']; + keyboard: SwiperOptions['keyboard']; + lazy: SwiperOptions['lazy']; + mousewheel: SwiperOptions['mousewheel']; + parallax: SwiperOptions['parallax']; + thumbs: SwiperOptions['thumbs']; + zoom: SwiperOptions['zoom']; + class: string; + id: string; + set navigation(val: boolean | "" | NavigationOptions); + get navigation(): boolean | "" | NavigationOptions; + private _navigation; + showNavigation: boolean; + set pagination(val: boolean | "" | PaginationOptions); + get pagination(): boolean | "" | PaginationOptions; + private _pagination; + showPagination: boolean; + set scrollbar(val: boolean | "" | ScrollbarOptions); + get scrollbar(): boolean | "" | ScrollbarOptions; + private _scrollbar; + showScrollbar: boolean; + set virtual(val: boolean | "" | VirtualOptions); + get virtual(): boolean | "" | VirtualOptions; + private _virtual; + set index(index: number); + set config(val: SwiperOptions); + s__beforeBreakpoint: EventEmitter; + s__containerClasses: EventEmitter; + s__slideClass: EventEmitter; + s__swiper: EventEmitter; + s_activeIndexChange: EventEmitter; + s_afterInit: EventEmitter; + s_autoplay: EventEmitter; + s_autoplayStart: EventEmitter; + s_autoplayStop: EventEmitter; + s_beforeDestroy: EventEmitter; + s_beforeInit: EventEmitter; + s_beforeLoopFix: EventEmitter; + s_beforeResize: EventEmitter; + s_beforeSlideChangeStart: EventEmitter; + s_beforeTransitionStart: EventEmitter; + s_breakpoint: EventEmitter; + s_changeDirection: EventEmitter; + s_click: EventEmitter; + s_doubleTap: EventEmitter; + s_doubleClick: EventEmitter; + s_destroy: EventEmitter; + s_fromEdge: EventEmitter; + s_hashChange: EventEmitter; + s_hashSet: EventEmitter; + s_imagesReady: EventEmitter; + s_init: EventEmitter; + s_keyPress: EventEmitter; + s_lazyImageLoad: EventEmitter; + s_lazyImageReady: EventEmitter; + s_loopFix: EventEmitter; + s_momentumBounce: EventEmitter; + s_navigationHide: EventEmitter; + s_navigationShow: EventEmitter; + s_observerUpdate: EventEmitter; + s_orientationchange: EventEmitter; + s_paginationHide: EventEmitter; + s_paginationRender: EventEmitter; + s_paginationShow: EventEmitter; + s_paginationUpdate: EventEmitter; + s_progress: EventEmitter; + s_reachBeginning: EventEmitter; + s_reachEnd: EventEmitter; + s_realIndexChange: EventEmitter; + s_resize: EventEmitter; + s_scroll: EventEmitter; + s_scrollbarDragEnd: EventEmitter; + s_scrollbarDragMove: EventEmitter; + s_scrollbarDragStart: EventEmitter; + s_setTransition: EventEmitter; + s_setTranslate: EventEmitter; + s_slideChange: EventEmitter; + s_slideChangeTransitionEnd: EventEmitter; + s_slideChangeTransitionStart: EventEmitter; + s_slideNextTransitionEnd: EventEmitter; + s_slideNextTransitionStart: EventEmitter; + s_slidePrevTransitionEnd: EventEmitter; + s_slidePrevTransitionStart: EventEmitter; + s_slideResetTransitionStart: EventEmitter; + s_slideResetTransitionEnd: EventEmitter; + s_sliderMove: EventEmitter; + s_sliderFirstMove: EventEmitter; + s_slidesLengthChange: EventEmitter; + s_slidesGridLengthChange: EventEmitter; + s_snapGridLengthChange: EventEmitter; + s_snapIndexChange: EventEmitter; + s_tap: EventEmitter; + s_toEdge: EventEmitter; + s_touchEnd: EventEmitter; + s_touchMove: EventEmitter; + s_touchMoveOpposite: EventEmitter; + s_touchStart: EventEmitter; + s_transitionEnd: EventEmitter; + s_transitionStart: EventEmitter; + s_update: EventEmitter; + s_zoomChange: EventEmitter; + s_swiper: EventEmitter; + indexChange: EventEmitter; + set prevElRef(el: ElementRef); + _prevElRef: ElementRef; + set nextElRef(el: ElementRef); + _nextElRef: ElementRef; + set scrollbarElRef(el: ElementRef); + _scrollbarElRef: ElementRef; + set paginationElRef(el: ElementRef); + _paginationElRef: ElementRef; + slidesEl: QueryList; + private slides; + prependSlides: Observable; + appendSlides: Observable; + swiperRef: Swiper; + readonly _activeSlides: Subject; + get activeSlides(): Observable; + get zoomContainerClass(): string; + containerClasses: string; + constructor(_ngZone: NgZone, elementRef: ElementRef, _changeDetectorRef: ChangeDetectorRef, _platformId: Object); + private _setElement; + ngOnInit(): void; + ngAfterViewInit(): void; + private childrenSlidesInit; + private slidesChanges; + get isSwiperActive(): boolean; + initSwiper(): void; + style: any; + currentVirtualData: any; + private updateVirtualSlides; + ngOnChanges(changedParams: SimpleChanges): void; + updateInitSwiper(changedParams: any): void; + updateSwiper(changedParams: SimpleChanges | any): void; + calcLoopedSlides(): number; + updateParameter(key: string, value: any): void; + /** + * @deprecated will be removed in upcoming versions + */ + setIndex(index: number, speed?: number, silent?: boolean): void; + ngOnDestroy(): void; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} diff --git a/src/main/resources/static/assets/js/swiper/angular/angular/src/swiper.module.d.ts b/src/main/resources/static/assets/js/swiper/angular/angular/src/swiper.module.d.ts new file mode 100644 index 0000000..9567f38 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/angular/src/swiper.module.d.ts @@ -0,0 +1,9 @@ +import * as i0 from "@angular/core"; +import * as i1 from "./swiper.component"; +import * as i2 from "./swiper-slide.directive"; +import * as i3 from "@angular/common"; +export declare class SwiperModule { + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵmod: i0.ɵɵNgModuleDeclaration; + static ɵinj: i0.ɵɵInjectorDeclaration; +} diff --git a/src/main/resources/static/assets/js/swiper/angular/angular/src/utils/get-params.d.ts b/src/main/resources/static/assets/js/swiper/angular/angular/src/utils/get-params.d.ts new file mode 100644 index 0000000..25ffc82 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/angular/src/utils/get-params.d.ts @@ -0,0 +1,6 @@ +export declare const allowedParams: string[]; +export declare function getParams(obj?: any): { + params: any; + passedParams: any; + rest: any; +}; diff --git a/src/main/resources/static/assets/js/swiper/angular/angular/src/utils/params-list.d.ts b/src/main/resources/static/assets/js/swiper/angular/angular/src/utils/params-list.d.ts new file mode 100644 index 0000000..7f2dc1d --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/angular/src/utils/params-list.d.ts @@ -0,0 +1 @@ +export declare const paramsList: string[]; diff --git a/src/main/resources/static/assets/js/swiper/angular/angular/src/utils/utils.d.ts b/src/main/resources/static/assets/js/swiper/angular/angular/src/utils/utils.d.ts new file mode 100644 index 0000000..a4ce4b0 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/angular/src/utils/utils.d.ts @@ -0,0 +1,6 @@ +export declare function isObject(o: any): boolean; +export declare function isShowEl(val: any, obj: any, el: any): boolean; +export declare function extend(target: any, src: any): void; +export declare function coerceBooleanProperty(value: any): boolean; +export declare const ignoreNgOnChanges: string[]; +export declare function setProperty(val: any, obj?: {}): {} | false; diff --git a/src/main/resources/static/assets/js/swiper/angular/bundles/swiper_angular.umd.js b/src/main/resources/static/assets/js/swiper/angular/bundles/swiper_angular.umd.js new file mode 100644 index 0000000..a6b110e --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/bundles/swiper_angular.umd.js @@ -0,0 +1,1830 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('swiper'), require('rxjs')) : + typeof define === 'function' && define.amd ? define('swiper_angular', ['exports', '@angular/core', '@angular/common', 'swiper', 'rxjs'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.swiper_angular = {}, global.ng.core, global.ng.common, global.Swiper, global.rxjs)); +}(this, (function (exports, i0, i1, Swiper, rxjs) { 'use strict'; + + function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + + function _interopNamespace(e) { + if (e && e.__esModule) return e; + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { + return e[k]; + } + }); + } + }); + } + n['default'] = e; + return Object.freeze(n); + } + + var i0__namespace = /*#__PURE__*/_interopNamespace(i0); + var i1__namespace = /*#__PURE__*/_interopNamespace(i1); + var Swiper__default = /*#__PURE__*/_interopDefaultLegacy(Swiper); + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) + if (Object.prototype.hasOwnProperty.call(b, p)) + d[p] = b[p]; }; + return extendStatics(d, b); + }; + function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + function __rest(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + } + function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") + r = Reflect.decorate(decorators, target, key, desc); + else + for (var i = decorators.length - 1; i >= 0; i--) + if (d = decorators[i]) + r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + } + function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); }; + } + function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") + return Reflect.metadata(metadataKey, metadataValue); + } + function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { + step(generator.next(value)); + } + catch (e) { + reject(e); + } } + function rejected(value) { try { + step(generator["throw"](value)); + } + catch (e) { + reject(e); + } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + function __generator(thisArg, body) { + var _ = { label: 0, sent: function () { if (t[0] & 1) + throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) + throw new TypeError("Generator is already executing."); + while (_) + try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) + return t; + if (y = 0, t) + op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) + _.ops.pop(); + _.trys.pop(); + continue; + } + op = body.call(thisArg, _); + } + catch (e) { + op = [6, e]; + y = 0; + } + finally { + f = t = 0; + } + if (op[0] & 5) + throw op[1]; + return { value: op[0] ? op[1] : void 0, done: true }; + } + } + var __createBinding = Object.create ? (function (o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } }); + }) : (function (o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + function __exportStar(m, o) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) + __createBinding(o, m, p); + } + function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) + return m.call(o); + if (o && typeof o.length === "number") + return { + next: function () { + if (o && i >= o.length) + o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + } + function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) + return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) + ar.push(r.value); + } + catch (error) { + e = { error: error }; + } + finally { + try { + if (r && !r.done && (m = i["return"])) + m.call(i); + } + finally { + if (e) + throw e.error; + } + } + return ar; + } + /** @deprecated */ + function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; + } + /** @deprecated */ + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + } + function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) + for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) + ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); + } + function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); + } + function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) + i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { + step(g[n](v)); + } + catch (e) { + settle(q[0][3], e); + } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) + resume(q[0][0], q[0][1]); } + } + function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } + } + function __asyncValues(o) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); } + } + function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { + Object.defineProperty(cooked, "raw", { value: raw }); + } + else { + cooked.raw = raw; + } + return cooked; + } + ; + var __setModuleDefault = Object.create ? (function (o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function (o, v) { + o["default"] = v; + }; + function __importStar(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + } + function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; + } + function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) + throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) + throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); + } + function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") + throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) + throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) + throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; + } + + function isObject(o) { + return (typeof o === 'object' && + o !== null && + o.constructor && + Object.prototype.toString.call(o).slice(8, -1) === 'Object'); + } + function isShowEl(val, obj, el) { + return ((coerceBooleanProperty(val) === true && obj && !obj.el) || + !(typeof obj !== 'boolean' && + obj.el !== (el === null || el === void 0 ? void 0 : el.nativeElement) && + (typeof obj.el === 'string' || typeof obj.el === 'object'))); + } + function extend(target, src) { + var noExtend = ['__proto__', 'constructor', 'prototype']; + Object.keys(src) + .filter(function (key) { return noExtend.indexOf(key) < 0; }) + .forEach(function (key) { + if (typeof target[key] === 'undefined') { + target[key] = src[key]; + return; + } + if (target[key] && !src[key]) { + return; + } + if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) { + if (src[key].__swiper__) + target[key] = src[key]; + else + extend(target[key], src[key]); + } + else { + target[key] = src[key]; + } + }); + } + function coerceBooleanProperty(value) { + return value != null && "" + value !== 'false'; + } + var ignoreNgOnChanges = ['pagination', 'navigation', 'scrollbar', 'virtual']; + function setProperty(val, obj) { + if (obj === void 0) { obj = {}; } + if (isObject(val)) { + return val; + } + if (coerceBooleanProperty(val) === true) { + return obj; + } + return false; + } + + /* underscore in name -> watch for changes */ + var paramsList = [ + 'init', + 'enabled', + '_direction', + 'touchEventsTarget', + 'initialSlide', + '_speed', + 'cssMode', + 'updateOnWindowResize', + 'resizeObserver', + 'nested', + 'focusableElements', + '_width', + '_height', + 'preventInteractionOnTransition', + 'userAgent', + 'url', + '_edgeSwipeDetection', + '_edgeSwipeThreshold', + '_freeMode', + '_autoHeight', + 'setWrapperSize', + 'virtualTranslate', + '_effect', + 'breakpoints', + '_spaceBetween', + '_slidesPerView', + '_grid', + '_slidesPerGroup', + '_slidesPerGroupSkip', + '_centeredSlides', + '_centeredSlidesBounds', + '_slidesOffsetBefore', + '_slidesOffsetAfter', + 'normalizeSlideIndex', + '_centerInsufficientSlides', + '_watchOverflow', + 'roundLengths', + 'touchRatio', + 'touchAngle', + 'simulateTouch', + '_shortSwipes', + '_longSwipes', + 'longSwipesRatio', + 'longSwipesMs', + '_followFinger', + 'allowTouchMove', + '_threshold', + 'touchMoveStopPropagation', + 'touchStartPreventDefault', + 'touchStartForcePreventDefault', + 'touchReleaseOnEdges', + 'uniqueNavElements', + '_resistance', + '_resistanceRatio', + '_watchSlidesProgress', + '_grabCursor', + 'preventClicks', + 'preventClicksPropagation', + '_slideToClickedSlide', + '_preloadImages', + 'updateOnImagesReady', + '_loop', + '_loopAdditionalSlides', + '_loopedSlides', + '_loopFillGroupWithBlank', + 'loopPreventsSlide', + '_allowSlidePrev', + '_allowSlideNext', + '_swipeHandler', + '_noSwiping', + 'noSwipingClass', + 'noSwipingSelector', + 'passiveListeners', + 'containerModifierClass', + 'slideClass', + 'slideBlankClass', + 'slideActiveClass', + 'slideDuplicateActiveClass', + 'slideVisibleClass', + 'slideDuplicateClass', + 'slideNextClass', + 'slideDuplicateNextClass', + 'slidePrevClass', + 'slideDuplicatePrevClass', + 'wrapperClass', + 'runCallbacksOnInit', + 'observer', + 'observeParents', + 'observeSlideChildren', + // modules + 'a11y', + 'autoplay', + '_controller', + 'coverflowEffect', + 'cubeEffect', + 'fadeEffect', + 'flipEffect', + 'creativeEffect', + 'cardsEffect', + 'hashNavigation', + 'history', + 'keyboard', + 'lazy', + 'mousewheel', + '_navigation', + '_pagination', + 'parallax', + '_scrollbar', + '_thumbs', + 'virtual', + 'zoom', + ]; + + // eslint-disable-next-line + var allowedParams = paramsList.map(function (key) { return key.replace(/_/, ''); }); + function getParams(obj) { + if (obj === void 0) { obj = {}; } + var params = { + on: {}, + }; + var passedParams = {}; + extend(params, Swiper__default['default'].defaults); + extend(params, Swiper__default['default'].extendedDefaults); + params._emitClasses = true; + var rest = {}; + Object.keys(obj).forEach(function (key) { + var _key = key.replace(/^_/, ''); + if (typeof obj[_key] === 'undefined') + return; + if (allowedParams.indexOf(_key) >= 0) { + if (isObject(obj[_key])) { + params[_key] = {}; + passedParams[_key] = {}; + extend(params[_key], obj[_key]); + extend(passedParams[_key], obj[_key]); + } + else { + params[_key] = obj[_key]; + passedParams[_key] = obj[_key]; + } + } + else { + rest[_key] = obj[_key]; + } + }); + return { params: params, passedParams: passedParams, rest: rest }; + } + + var SwiperSlideDirective = /** @class */ (function () { + function SwiperSlideDirective(template) { + this.template = template; + this.class = ''; + this.autoplayDelay = null; + this.slideData = { + isActive: false, + isPrev: false, + isNext: false, + isVisible: false, + isDuplicate: false, + }; + } + Object.defineProperty(SwiperSlideDirective.prototype, "zoom", { + get: function () { + return this._zoom; + }, + set: function (val) { + this._zoom = coerceBooleanProperty(val); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperSlideDirective.prototype, "classNames", { + get: function () { + return this._classNames; + }, + set: function (val) { + if (this._classNames === val) { + return; + } + this._classNames = val; + this.slideData = { + isActive: this._hasClass(['swiper-slide-active', 'swiper-slide-duplicate-active']), + isVisible: this._hasClass(['swiper-slide-visible']), + isDuplicate: this._hasClass(['swiper-slide-duplicate']), + isPrev: this._hasClass(['swiper-slide-prev', 'swiper-slide-duplicate-prev']), + isNext: this._hasClass(['swiper-slide-next', 'swiper-slide-duplicate-next']), + }; + }, + enumerable: false, + configurable: true + }); + SwiperSlideDirective.prototype._hasClass = function (classNames) { + var _this = this; + return classNames.some(function (className) { return _this._classNames.indexOf(className) >= 0; }); + }; + return SwiperSlideDirective; + }()); + SwiperSlideDirective.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0__namespace, type: SwiperSlideDirective, deps: [{ token: i0__namespace.TemplateRef }], target: i0__namespace.ɵɵFactoryTarget.Directive }); + SwiperSlideDirective.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.2", type: SwiperSlideDirective, selector: "ng-template[swiperSlide]", inputs: { virtualIndex: "virtualIndex", class: "class", autoplayDelay: ["data-swiper-autoplay", "autoplayDelay"], zoom: "zoom" }, ngImport: i0__namespace }); + i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0__namespace, type: SwiperSlideDirective, decorators: [{ + type: i0.Directive, + args: [{ + selector: 'ng-template[swiperSlide]', + }] + }], ctorParameters: function () { return [{ type: i0__namespace.TemplateRef }]; }, propDecorators: { virtualIndex: [{ + type: i0.Input + }], class: [{ + type: i0.Input + }], autoplayDelay: [{ + type: i0.Input, + args: ['data-swiper-autoplay'] + }], zoom: [{ + type: i0.Input + }] } }); + + var SwiperComponent = /** @class */ (function () { + function SwiperComponent(_ngZone, elementRef, _changeDetectorRef, _platformId) { + var _this = this; + this._ngZone = _ngZone; + this.elementRef = elementRef; + this._changeDetectorRef = _changeDetectorRef; + this._platformId = _platformId; + this.slideClass = 'swiper-slide'; + this.wrapperClass = 'swiper-wrapper'; + this.showNavigation = true; + this.showPagination = true; + this.showScrollbar = true; + // prettier-ignore + this.s__beforeBreakpoint = new i0.EventEmitter(); + // prettier-ignore + this.s__containerClasses = new i0.EventEmitter(); + // prettier-ignore + this.s__slideClass = new i0.EventEmitter(); + // prettier-ignore + this.s__swiper = new i0.EventEmitter(); + // prettier-ignore + this.s_activeIndexChange = new i0.EventEmitter(); + // prettier-ignore + this.s_afterInit = new i0.EventEmitter(); + // prettier-ignore + this.s_autoplay = new i0.EventEmitter(); + // prettier-ignore + this.s_autoplayStart = new i0.EventEmitter(); + // prettier-ignore + this.s_autoplayStop = new i0.EventEmitter(); + // prettier-ignore + this.s_beforeDestroy = new i0.EventEmitter(); + // prettier-ignore + this.s_beforeInit = new i0.EventEmitter(); + // prettier-ignore + this.s_beforeLoopFix = new i0.EventEmitter(); + // prettier-ignore + this.s_beforeResize = new i0.EventEmitter(); + // prettier-ignore + this.s_beforeSlideChangeStart = new i0.EventEmitter(); + // prettier-ignore + this.s_beforeTransitionStart = new i0.EventEmitter(); + // prettier-ignore + this.s_breakpoint = new i0.EventEmitter(); + // prettier-ignore + this.s_changeDirection = new i0.EventEmitter(); + // prettier-ignore + this.s_click = new i0.EventEmitter(); + // prettier-ignore + this.s_doubleTap = new i0.EventEmitter(); + // prettier-ignore + this.s_doubleClick = new i0.EventEmitter(); + // prettier-ignore + this.s_destroy = new i0.EventEmitter(); + // prettier-ignore + this.s_fromEdge = new i0.EventEmitter(); + // prettier-ignore + this.s_hashChange = new i0.EventEmitter(); + // prettier-ignore + this.s_hashSet = new i0.EventEmitter(); + // prettier-ignore + this.s_imagesReady = new i0.EventEmitter(); + // prettier-ignore + this.s_init = new i0.EventEmitter(); + // prettier-ignore + this.s_keyPress = new i0.EventEmitter(); + // prettier-ignore + this.s_lazyImageLoad = new i0.EventEmitter(); + // prettier-ignore + this.s_lazyImageReady = new i0.EventEmitter(); + // prettier-ignore + this.s_loopFix = new i0.EventEmitter(); + // prettier-ignore + this.s_momentumBounce = new i0.EventEmitter(); + // prettier-ignore + this.s_navigationHide = new i0.EventEmitter(); + // prettier-ignore + this.s_navigationShow = new i0.EventEmitter(); + // prettier-ignore + this.s_observerUpdate = new i0.EventEmitter(); + // prettier-ignore + this.s_orientationchange = new i0.EventEmitter(); + // prettier-ignore + this.s_paginationHide = new i0.EventEmitter(); + // prettier-ignore + this.s_paginationRender = new i0.EventEmitter(); + // prettier-ignore + this.s_paginationShow = new i0.EventEmitter(); + // prettier-ignore + this.s_paginationUpdate = new i0.EventEmitter(); + // prettier-ignore + this.s_progress = new i0.EventEmitter(); + // prettier-ignore + this.s_reachBeginning = new i0.EventEmitter(); + // prettier-ignore + this.s_reachEnd = new i0.EventEmitter(); + // prettier-ignore + this.s_realIndexChange = new i0.EventEmitter(); + // prettier-ignore + this.s_resize = new i0.EventEmitter(); + // prettier-ignore + this.s_scroll = new i0.EventEmitter(); + // prettier-ignore + this.s_scrollbarDragEnd = new i0.EventEmitter(); + // prettier-ignore + this.s_scrollbarDragMove = new i0.EventEmitter(); + // prettier-ignore + this.s_scrollbarDragStart = new i0.EventEmitter(); + // prettier-ignore + this.s_setTransition = new i0.EventEmitter(); + // prettier-ignore + this.s_setTranslate = new i0.EventEmitter(); + // prettier-ignore + this.s_slideChange = new i0.EventEmitter(); + // prettier-ignore + this.s_slideChangeTransitionEnd = new i0.EventEmitter(); + // prettier-ignore + this.s_slideChangeTransitionStart = new i0.EventEmitter(); + // prettier-ignore + this.s_slideNextTransitionEnd = new i0.EventEmitter(); + // prettier-ignore + this.s_slideNextTransitionStart = new i0.EventEmitter(); + // prettier-ignore + this.s_slidePrevTransitionEnd = new i0.EventEmitter(); + // prettier-ignore + this.s_slidePrevTransitionStart = new i0.EventEmitter(); + // prettier-ignore + this.s_slideResetTransitionStart = new i0.EventEmitter(); + // prettier-ignore + this.s_slideResetTransitionEnd = new i0.EventEmitter(); + // prettier-ignore + this.s_sliderMove = new i0.EventEmitter(); + // prettier-ignore + this.s_sliderFirstMove = new i0.EventEmitter(); + // prettier-ignore + this.s_slidesLengthChange = new i0.EventEmitter(); + // prettier-ignore + this.s_slidesGridLengthChange = new i0.EventEmitter(); + // prettier-ignore + this.s_snapGridLengthChange = new i0.EventEmitter(); + // prettier-ignore + this.s_snapIndexChange = new i0.EventEmitter(); + // prettier-ignore + this.s_tap = new i0.EventEmitter(); + // prettier-ignore + this.s_toEdge = new i0.EventEmitter(); + // prettier-ignore + this.s_touchEnd = new i0.EventEmitter(); + // prettier-ignore + this.s_touchMove = new i0.EventEmitter(); + // prettier-ignore + this.s_touchMoveOpposite = new i0.EventEmitter(); + // prettier-ignore + this.s_touchStart = new i0.EventEmitter(); + // prettier-ignore + this.s_transitionEnd = new i0.EventEmitter(); + // prettier-ignore + this.s_transitionStart = new i0.EventEmitter(); + // prettier-ignore + this.s_update = new i0.EventEmitter(); + // prettier-ignore + this.s_zoomChange = new i0.EventEmitter(); + // prettier-ignore + this.s_swiper = new i0.EventEmitter(); + this.indexChange = new i0.EventEmitter(); + this._activeSlides = new rxjs.Subject(); + this.containerClasses = 'swiper'; + this.slidesChanges = function (val) { + _this.slides = val.map(function (slide, index) { + slide.slideIndex = index; + slide.classNames = _this.slideClass || ''; + return slide; + }); + if (_this.loop && !_this.loopedSlides) { + _this.calcLoopedSlides(); + } + if (!_this.virtual) { + if (_this.loopedSlides) { + _this.prependSlides = rxjs.of(_this.slides.slice(_this.slides.length - _this.loopedSlides)); + _this.appendSlides = rxjs.of(_this.slides.slice(0, _this.loopedSlides)); + } + } + else if (_this.swiperRef && _this.swiperRef.virtual) { + _this._ngZone.runOutsideAngular(function () { + _this.swiperRef.virtual.slides = _this.slides; + _this.swiperRef.virtual.update(true); + }); + } + _this._changeDetectorRef.detectChanges(); + }; + this.style = null; + this.updateVirtualSlides = function (virtualData) { + var _d; + // TODO: type virtualData + if (!_this.swiperRef || + (_this.currentVirtualData && + _this.currentVirtualData.from === virtualData.from && + _this.currentVirtualData.to === virtualData.to && + _this.currentVirtualData.offset === virtualData.offset)) { + return; + } + _this.style = _this.swiperRef.isHorizontal() + ? (_d = {}, + _d[_this.swiperRef.rtlTranslate ? 'right' : 'left'] = virtualData.offset + "px", + _d) : { + top: virtualData.offset + "px", + }; + _this.currentVirtualData = virtualData; + _this._activeSlides.next(virtualData.slides); + _this._ngZone.run(function () { + _this._changeDetectorRef.detectChanges(); + }); + _this._ngZone.runOutsideAngular(function () { + _this.swiperRef.updateSlides(); + _this.swiperRef.updateProgress(); + _this.swiperRef.updateSlidesClasses(); + if (_this.swiperRef.lazy && _this.swiperRef.params.lazy['enabled']) { + _this.swiperRef.lazy.load(); + } + _this.swiperRef.virtual.update(true); + }); + return; + }; + } + Object.defineProperty(SwiperComponent.prototype, "navigation", { + get: function () { + return this._navigation; + }, + set: function (val) { + var _a, _b, _c; + var currentNext = typeof this._navigation !== 'boolean' && this._navigation !== '' + ? (_a = this._navigation) === null || _a === void 0 ? void 0 : _a.nextEl + : null; + var currentPrev = typeof this._navigation !== 'boolean' && this._navigation !== '' + ? (_b = this._navigation) === null || _b === void 0 ? void 0 : _b.prevEl + : null; + this._navigation = setProperty(val, { + nextEl: currentNext || null, + prevEl: currentPrev || null, + }); + this.showNavigation = !(coerceBooleanProperty(val) !== true || + (this._navigation && + typeof this._navigation !== 'boolean' && + this._navigation.prevEl !== ((_c = this._prevElRef) === null || _c === void 0 ? void 0 : _c.nativeElement) && + (this._navigation.prevEl !== null || this._navigation.nextEl !== null) && + (typeof this._navigation.nextEl === 'string' || + typeof this._navigation.prevEl === 'string' || + typeof this._navigation.nextEl === 'object' || + typeof this._navigation.prevEl === 'object'))); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "pagination", { + get: function () { + return this._pagination; + }, + set: function (val) { + var _a; + var current = typeof this._pagination !== 'boolean' && this._pagination !== '' + ? (_a = this._pagination) === null || _a === void 0 ? void 0 : _a.el + : null; + this._pagination = setProperty(val, { + el: current || null, + }); + this.showPagination = isShowEl(val, this._pagination, this._paginationElRef); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "scrollbar", { + get: function () { + return this._scrollbar; + }, + set: function (val) { + var _a; + var current = typeof this._scrollbar !== 'boolean' && this._scrollbar !== '' ? (_a = this._scrollbar) === null || _a === void 0 ? void 0 : _a.el : null; + this._scrollbar = setProperty(val, { + el: current || null, + }); + this.showScrollbar = isShowEl(val, this._scrollbar, this._scrollbarElRef); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "virtual", { + get: function () { + return this._virtual; + }, + set: function (val) { + this._virtual = setProperty(val); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "index", { + set: function (index) { + console.warn('`[(index)]` prop is deprecated and will be removed in upcoming versions'); + this.setIndex(index); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "config", { + set: function (val) { + this.updateSwiper(val); + var params = getParams(val).params; + Object.assign(this, params); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "prevElRef", { + set: function (el) { + this._prevElRef = el; + this._setElement(el, this.navigation, 'navigation', 'prevEl'); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "nextElRef", { + set: function (el) { + this._nextElRef = el; + this._setElement(el, this.navigation, 'navigation', 'nextEl'); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "scrollbarElRef", { + set: function (el) { + this._scrollbarElRef = el; + this._setElement(el, this.scrollbar, 'scrollbar'); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "paginationElRef", { + set: function (el) { + this._paginationElRef = el; + this._setElement(el, this.pagination, 'pagination'); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "activeSlides", { + get: function () { + if (this.virtual) { + return this._activeSlides; + } + return rxjs.of(this.slides); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(SwiperComponent.prototype, "zoomContainerClass", { + get: function () { + return this.zoom && typeof this.zoom !== 'boolean' + ? this.zoom.containerClass + : 'swiper-zoom-container'; + }, + enumerable: false, + configurable: true + }); + SwiperComponent.prototype._setElement = function (el, ref, update, key) { + if (key === void 0) { key = 'el'; } + if (!el || !ref) { + return; + } + if (ref && el.nativeElement) { + if (ref[key] === el.nativeElement) { + return; + } + ref[key] = el.nativeElement; + } + var updateObj = {}; + updateObj[update] = true; + this.updateInitSwiper(updateObj); + }; + SwiperComponent.prototype.ngOnInit = function () { + var params = getParams(this).params; + Object.assign(this, params); + }; + SwiperComponent.prototype.ngAfterViewInit = function () { + var _this = this; + this.childrenSlidesInit(); + this.initSwiper(); + this._changeDetectorRef.detectChanges(); + setTimeout(function () { + _this.s_swiper.emit(_this.swiperRef); + }); + }; + SwiperComponent.prototype.childrenSlidesInit = function () { + this.slidesChanges(this.slidesEl); + this.slidesEl.changes.subscribe(this.slidesChanges); + }; + Object.defineProperty(SwiperComponent.prototype, "isSwiperActive", { + get: function () { + return this.swiperRef && !this.swiperRef.destroyed; + }, + enumerable: false, + configurable: true + }); + SwiperComponent.prototype.initSwiper = function () { + var _this = this; + var _d = getParams(this), swiperParams = _d.params, passedParams = _d.passedParams; + Object.assign(this, swiperParams); + this._ngZone.runOutsideAngular(function () { + swiperParams.init = false; + if (!swiperParams.virtual) { + swiperParams.observer = true; + } + swiperParams.onAny = function (eventName) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var emitter = _this[('s_' + eventName)]; + if (emitter) { + emitter.emit.apply(emitter, __spreadArray([], __read(args))); + } + }; + var _slideClasses = function (_, updated) { + updated.forEach(function (_d, index) { + var slideEl = _d.slideEl, classNames = _d.classNames; + var dataIndex = slideEl.getAttribute('data-swiper-slide-index'); + var slideIndex = dataIndex ? parseInt(dataIndex) : index; + if (_this.virtual) { + var virtualSlide = _this.slides.find(function (item) { + return item.virtualIndex && item.virtualIndex === slideIndex; + }); + if (virtualSlide) { + virtualSlide.classNames = classNames; + return; + } + } + if (_this.slides[slideIndex]) { + _this.slides[slideIndex].classNames = classNames; + } + }); + _this._changeDetectorRef.detectChanges(); + }; + var _containerClasses = function (_, classes) { + setTimeout(function () { + _this.containerClasses = classes; + }); + }; + Object.assign(swiperParams.on, { + _containerClasses: _containerClasses, + _slideClasses: _slideClasses, + }); + var swiperRef = new Swiper__default['default'](swiperParams); + swiperRef.loopCreate = function () { }; + swiperRef.loopDestroy = function () { }; + if (swiperParams.loop) { + swiperRef.loopedSlides = _this.loopedSlides; + } + var isVirtualEnabled = typeof swiperRef.params.virtual !== 'undefined' && + typeof swiperRef.params.virtual !== 'boolean' && + swiperRef.params.virtual.enabled; + if (swiperRef.virtual && isVirtualEnabled) { + swiperRef.virtual.slides = _this.slides; + var extendWith = { + cache: false, + slides: _this.slides, + renderExternal: _this.updateVirtualSlides, + renderExternalUpdate: false, + }; + extend(swiperRef.params.virtual, extendWith); + extend(swiperRef.originalParams.virtual, extendWith); + } + if (i1.isPlatformBrowser(_this._platformId)) { + _this.swiperRef = swiperRef.init(_this.elementRef.nativeElement); + var isEnabled = typeof _this.swiperRef.params.virtual !== 'undefined' && + typeof _this.swiperRef.params.virtual !== 'boolean' && + _this.swiperRef.params.virtual.enabled; + if (_this.swiperRef.virtual && isEnabled) { + _this.swiperRef.virtual.update(true); + } + _this._changeDetectorRef.detectChanges(); + swiperRef.on('slideChange', function () { + _this.indexChange.emit(_this.swiperRef.realIndex); + }); + } + }); + }; + SwiperComponent.prototype.ngOnChanges = function (changedParams) { + this.updateSwiper(changedParams); + this._changeDetectorRef.detectChanges(); + }; + SwiperComponent.prototype.updateInitSwiper = function (changedParams) { + var _this = this; + if (!(changedParams && this.swiperRef && !this.swiperRef.destroyed)) { + return; + } + this._ngZone.runOutsideAngular(function () { + var _d = _this.swiperRef, currentParams = _d.params, pagination = _d.pagination, navigation = _d.navigation, scrollbar = _d.scrollbar, virtual = _d.virtual, thumbs = _d.thumbs; + if (changedParams.pagination) { + if (_this.pagination && + typeof _this.pagination !== 'boolean' && + _this.pagination.el && + pagination && + !pagination.el) { + _this.updateParameter('pagination', _this.pagination); + pagination.init(); + pagination.render(); + pagination.update(); + } + else { + pagination.destroy(); + pagination.el = null; + } + } + if (changedParams.scrollbar) { + if (_this.scrollbar && + typeof _this.scrollbar !== 'boolean' && + _this.scrollbar.el && + scrollbar && + !scrollbar.el) { + _this.updateParameter('scrollbar', _this.scrollbar); + scrollbar.init(); + scrollbar.updateSize(); + scrollbar.setTranslate(); + } + else { + scrollbar.destroy(); + scrollbar.el = null; + } + } + if (changedParams.navigation) { + if (_this.navigation && + typeof _this.navigation !== 'boolean' && + _this.navigation.prevEl && + _this.navigation.nextEl && + navigation && + !navigation.prevEl && + !navigation.nextEl) { + _this.updateParameter('navigation', _this.navigation); + navigation.init(); + navigation.update(); + } + else if (navigation.prevEl && navigation.nextEl) { + navigation.destroy(); + navigation.nextEl = null; + navigation.prevEl = null; + } + } + if (changedParams.thumbs && _this.thumbs && _this.thumbs.swiper) { + _this.updateParameter('thumbs', _this.thumbs); + var initialized = thumbs.init(); + if (initialized) + thumbs.update(true); + } + if (changedParams.controller && _this.controller && _this.controller.control) { + _this.swiperRef.controller.control = _this.controller.control; + } + _this.swiperRef.update(); + }); + }; + SwiperComponent.prototype.updateSwiper = function (changedParams) { + var _this = this; + this._ngZone.runOutsideAngular(function () { + var _a, _b; + if (changedParams.config) { + return; + } + if (!(changedParams && _this.swiperRef && !_this.swiperRef.destroyed)) { + return; + } + for (var key in changedParams) { + if (ignoreNgOnChanges.indexOf(key) >= 0) { + continue; + } + var newValue = (_b = (_a = changedParams[key]) === null || _a === void 0 ? void 0 : _a.currentValue) !== null && _b !== void 0 ? _b : changedParams[key]; + _this.updateParameter(key, newValue); + } + if (changedParams.allowSlideNext) { + _this.swiperRef.allowSlideNext = _this.allowSlideNext; + } + if (changedParams.allowSlidePrev) { + _this.swiperRef.allowSlidePrev = _this.allowSlidePrev; + } + if (changedParams.direction) { + _this.swiperRef.changeDirection(_this.direction, false); + } + if (changedParams.breakpoints) { + if (_this.loop && !_this.loopedSlides) { + _this.calcLoopedSlides(); + } + _this.swiperRef.currentBreakpoint = null; + _this.swiperRef.setBreakpoint(); + } + if (changedParams.thumbs || changedParams.controller) { + _this.updateInitSwiper(changedParams); + } + _this.swiperRef.update(); + }); + }; + SwiperComponent.prototype.calcLoopedSlides = function () { + if (!this.loop) { + return; + } + var slidesPerViewParams = this.slidesPerView; + if (this.breakpoints) { + var breakpoint = Swiper__default['default'].prototype.getBreakpoint(this.breakpoints); + var breakpointOnlyParams = breakpoint in this.breakpoints ? this.breakpoints[breakpoint] : undefined; + if (breakpointOnlyParams && breakpointOnlyParams.slidesPerView) { + slidesPerViewParams = breakpointOnlyParams.slidesPerView; + } + } + if (slidesPerViewParams === 'auto') { + this.loopedSlides = this.slides.length; + return this.slides.length; + } + var loopedSlides = this.loopedSlides || slidesPerViewParams; + if (!loopedSlides) { + // ? + return; + } + if (this.loopAdditionalSlides) { + loopedSlides += this.loopAdditionalSlides; + } + if (loopedSlides > this.slides.length) { + loopedSlides = this.slides.length; + } + this.loopedSlides = loopedSlides; + return loopedSlides; + }; + SwiperComponent.prototype.updateParameter = function (key, value) { + if (!(this.swiperRef && !this.swiperRef.destroyed)) { + return; + } + var _key = key.replace(/^_/, ''); + var isCurrentParamObj = isObject(this.swiperRef.params[_key]); + if (Object.keys(this.swiperRef.modules).indexOf(_key) >= 0) { + var defaultParams = this.swiperRef.modules[_key].params[_key]; + if (isCurrentParamObj) { + extend(this.swiperRef.params[_key], defaultParams); + } + else { + this.swiperRef.params[_key] = defaultParams; + } + } + if (_key === 'enabled') { + if (value === true) { + this.swiperRef.enable(); + } + else if (value === false) { + this.swiperRef.disable(); + } + return; + } + if (isCurrentParamObj && isObject(value)) { + extend(this.swiperRef.params[_key], value); + } + else { + this.swiperRef.params[_key] = value; + } + }; + /** + * @deprecated will be removed in upcoming versions + */ + SwiperComponent.prototype.setIndex = function (index, speed, silent) { + var _this = this; + if (!this.isSwiperActive) { + this.initialSlide = index; + return; + } + if (index === this.swiperRef.activeIndex) { + return; + } + this._ngZone.runOutsideAngular(function () { + if (_this.loop) { + _this.swiperRef.slideToLoop(index, speed, !silent); + } + else { + _this.swiperRef.slideTo(index, speed, !silent); + } + }); + }; + SwiperComponent.prototype.ngOnDestroy = function () { + var _this = this; + this._ngZone.runOutsideAngular(function () { + var _a; + (_a = _this.swiperRef) === null || _a === void 0 ? void 0 : _a.destroy(true, false); + }); + }; + return SwiperComponent; + }()); + SwiperComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0__namespace, type: SwiperComponent, deps: [{ token: i0__namespace.NgZone }, { token: i0__namespace.ElementRef }, { token: i0__namespace.ChangeDetectorRef }, { token: i0.PLATFORM_ID }], target: i0__namespace.ɵɵFactoryTarget.Component }); + SwiperComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.2", type: SwiperComponent, selector: "swiper, [swiper]", inputs: { enabled: "enabled", direction: "direction", touchEventsTarget: "touchEventsTarget", initialSlide: "initialSlide", speed: "speed", cssMode: "cssMode", updateOnWindowResize: "updateOnWindowResize", resizeObserver: "resizeObserver", nested: "nested", focusableElements: "focusableElements", width: "width", height: "height", preventInteractionOnTransition: "preventInteractionOnTransition", userAgent: "userAgent", url: "url", edgeSwipeDetection: "edgeSwipeDetection", edgeSwipeThreshold: "edgeSwipeThreshold", freeMode: "freeMode", autoHeight: "autoHeight", setWrapperSize: "setWrapperSize", virtualTranslate: "virtualTranslate", effect: "effect", breakpoints: "breakpoints", spaceBetween: "spaceBetween", slidesPerView: "slidesPerView", grid: "grid", slidesPerGroup: "slidesPerGroup", slidesPerGroupSkip: "slidesPerGroupSkip", centeredSlides: "centeredSlides", centeredSlidesBounds: "centeredSlidesBounds", slidesOffsetBefore: "slidesOffsetBefore", slidesOffsetAfter: "slidesOffsetAfter", normalizeSlideIndex: "normalizeSlideIndex", centerInsufficientSlides: "centerInsufficientSlides", watchOverflow: "watchOverflow", roundLengths: "roundLengths", touchRatio: "touchRatio", touchAngle: "touchAngle", simulateTouch: "simulateTouch", shortSwipes: "shortSwipes", longSwipes: "longSwipes", longSwipesRatio: "longSwipesRatio", longSwipesMs: "longSwipesMs", followFinger: "followFinger", allowTouchMove: "allowTouchMove", threshold: "threshold", touchMoveStopPropagation: "touchMoveStopPropagation", touchStartPreventDefault: "touchStartPreventDefault", touchStartForcePreventDefault: "touchStartForcePreventDefault", touchReleaseOnEdges: "touchReleaseOnEdges", uniqueNavElements: "uniqueNavElements", resistance: "resistance", resistanceRatio: "resistanceRatio", watchSlidesProgress: "watchSlidesProgress", grabCursor: "grabCursor", preventClicks: "preventClicks", preventClicksPropagation: "preventClicksPropagation", slideToClickedSlide: "slideToClickedSlide", preloadImages: "preloadImages", updateOnImagesReady: "updateOnImagesReady", loop: "loop", loopAdditionalSlides: "loopAdditionalSlides", loopedSlides: "loopedSlides", loopFillGroupWithBlank: "loopFillGroupWithBlank", loopPreventsSlide: "loopPreventsSlide", allowSlidePrev: "allowSlidePrev", allowSlideNext: "allowSlideNext", swipeHandler: "swipeHandler", noSwiping: "noSwiping", noSwipingClass: "noSwipingClass", noSwipingSelector: "noSwipingSelector", passiveListeners: "passiveListeners", containerModifierClass: "containerModifierClass", slideClass: "slideClass", slideBlankClass: "slideBlankClass", slideActiveClass: "slideActiveClass", slideDuplicateActiveClass: "slideDuplicateActiveClass", slideVisibleClass: "slideVisibleClass", slideDuplicateClass: "slideDuplicateClass", slideNextClass: "slideNextClass", slideDuplicateNextClass: "slideDuplicateNextClass", slidePrevClass: "slidePrevClass", slideDuplicatePrevClass: "slideDuplicatePrevClass", wrapperClass: "wrapperClass", runCallbacksOnInit: "runCallbacksOnInit", observeParents: "observeParents", observeSlideChildren: "observeSlideChildren", a11y: "a11y", autoplay: "autoplay", controller: "controller", coverflowEffect: "coverflowEffect", cubeEffect: "cubeEffect", fadeEffect: "fadeEffect", flipEffect: "flipEffect", creativeEffect: "creativeEffect", cardsEffect: "cardsEffect", hashNavigation: "hashNavigation", history: "history", keyboard: "keyboard", lazy: "lazy", mousewheel: "mousewheel", parallax: "parallax", thumbs: "thumbs", zoom: "zoom", class: "class", id: "id", navigation: "navigation", pagination: "pagination", scrollbar: "scrollbar", virtual: "virtual", index: "index", config: "config" }, outputs: { s__beforeBreakpoint: "_beforeBreakpoint", s__containerClasses: "_containerClasses", s__slideClass: "_slideClass", s__swiper: "_swiper", s_activeIndexChange: "activeIndexChange", s_afterInit: "afterInit", s_autoplay: "autoplay", s_autoplayStart: "autoplayStart", s_autoplayStop: "autoplayStop", s_beforeDestroy: "beforeDestroy", s_beforeInit: "beforeInit", s_beforeLoopFix: "beforeLoopFix", s_beforeResize: "beforeResize", s_beforeSlideChangeStart: "beforeSlideChangeStart", s_beforeTransitionStart: "beforeTransitionStart", s_breakpoint: "breakpoint", s_changeDirection: "changeDirection", s_click: "click", s_doubleTap: "doubleTap", s_doubleClick: "doubleClick", s_destroy: "destroy", s_fromEdge: "fromEdge", s_hashChange: "hashChange", s_hashSet: "hashSet", s_imagesReady: "imagesReady", s_init: "init", s_keyPress: "keyPress", s_lazyImageLoad: "lazyImageLoad", s_lazyImageReady: "lazyImageReady", s_loopFix: "loopFix", s_momentumBounce: "momentumBounce", s_navigationHide: "navigationHide", s_navigationShow: "navigationShow", s_observerUpdate: "observerUpdate", s_orientationchange: "orientationchange", s_paginationHide: "paginationHide", s_paginationRender: "paginationRender", s_paginationShow: "paginationShow", s_paginationUpdate: "paginationUpdate", s_progress: "progress", s_reachBeginning: "reachBeginning", s_reachEnd: "reachEnd", s_realIndexChange: "realIndexChange", s_resize: "resize", s_scroll: "scroll", s_scrollbarDragEnd: "scrollbarDragEnd", s_scrollbarDragMove: "scrollbarDragMove", s_scrollbarDragStart: "scrollbarDragStart", s_setTransition: "setTransition", s_setTranslate: "setTranslate", s_slideChange: "slideChange", s_slideChangeTransitionEnd: "slideChangeTransitionEnd", s_slideChangeTransitionStart: "slideChangeTransitionStart", s_slideNextTransitionEnd: "slideNextTransitionEnd", s_slideNextTransitionStart: "slideNextTransitionStart", s_slidePrevTransitionEnd: "slidePrevTransitionEnd", s_slidePrevTransitionStart: "slidePrevTransitionStart", s_slideResetTransitionStart: "slideResetTransitionStart", s_slideResetTransitionEnd: "slideResetTransitionEnd", s_sliderMove: "sliderMove", s_sliderFirstMove: "sliderFirstMove", s_slidesLengthChange: "slidesLengthChange", s_slidesGridLengthChange: "slidesGridLengthChange", s_snapGridLengthChange: "snapGridLengthChange", s_snapIndexChange: "snapIndexChange", s_tap: "tap", s_toEdge: "toEdge", s_touchEnd: "touchEnd", s_touchMove: "touchMove", s_touchMoveOpposite: "touchMoveOpposite", s_touchStart: "touchStart", s_transitionEnd: "transitionEnd", s_transitionStart: "transitionStart", s_update: "update", s_zoomChange: "zoomChange", s_swiper: "swiper", indexChange: "indexChange" }, host: { properties: { "class": "this.containerClasses" } }, queries: [{ propertyName: "slidesEl", predicate: SwiperSlideDirective }], viewQueries: [{ propertyName: "prevElRef", first: true, predicate: ["prevElRef"], descendants: true }, { propertyName: "nextElRef", first: true, predicate: ["nextElRef"], descendants: true }, { propertyName: "scrollbarElRef", first: true, predicate: ["scrollbarElRef"], descendants: true }, { propertyName: "paginationElRef", first: true, predicate: ["paginationElRef"], descendants: true }], usesOnChanges: true, ngImport: i0__namespace, template: "\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", styles: ["\n swiper {\n display: block;\n }\n "], directives: [{ type: i1__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1__namespace.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1__namespace.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i1__namespace.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i1__namespace.NgSwitchDefault, selector: "[ngSwitchDefault]" }], pipes: { "async": i1__namespace.AsyncPipe }, changeDetection: i0__namespace.ChangeDetectionStrategy.OnPush, encapsulation: i0__namespace.ViewEncapsulation.None }); + i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0__namespace, type: SwiperComponent, decorators: [{ + type: i0.Component, + args: [{ + selector: 'swiper, [swiper]', + templateUrl: './swiper.component.html', + changeDetection: i0.ChangeDetectionStrategy.OnPush, + encapsulation: i0.ViewEncapsulation.None, + styles: [ + "\n swiper {\n display: block;\n }\n ", + ], + }] + }], ctorParameters: function () { + return [{ type: i0__namespace.NgZone }, { type: i0__namespace.ElementRef }, { type: i0__namespace.ChangeDetectorRef }, { type: Object, decorators: [{ + type: i0.Inject, + args: [i0.PLATFORM_ID] + }] }]; + }, propDecorators: { enabled: [{ + type: i0.Input + }], direction: [{ + type: i0.Input + }], touchEventsTarget: [{ + type: i0.Input + }], initialSlide: [{ + type: i0.Input + }], speed: [{ + type: i0.Input + }], cssMode: [{ + type: i0.Input + }], updateOnWindowResize: [{ + type: i0.Input + }], resizeObserver: [{ + type: i0.Input + }], nested: [{ + type: i0.Input + }], focusableElements: [{ + type: i0.Input + }], width: [{ + type: i0.Input + }], height: [{ + type: i0.Input + }], preventInteractionOnTransition: [{ + type: i0.Input + }], userAgent: [{ + type: i0.Input + }], url: [{ + type: i0.Input + }], edgeSwipeDetection: [{ + type: i0.Input + }], edgeSwipeThreshold: [{ + type: i0.Input + }], freeMode: [{ + type: i0.Input + }], autoHeight: [{ + type: i0.Input + }], setWrapperSize: [{ + type: i0.Input + }], virtualTranslate: [{ + type: i0.Input + }], effect: [{ + type: i0.Input + }], breakpoints: [{ + type: i0.Input + }], spaceBetween: [{ + type: i0.Input + }], slidesPerView: [{ + type: i0.Input + }], grid: [{ + type: i0.Input + }], slidesPerGroup: [{ + type: i0.Input + }], slidesPerGroupSkip: [{ + type: i0.Input + }], centeredSlides: [{ + type: i0.Input + }], centeredSlidesBounds: [{ + type: i0.Input + }], slidesOffsetBefore: [{ + type: i0.Input + }], slidesOffsetAfter: [{ + type: i0.Input + }], normalizeSlideIndex: [{ + type: i0.Input + }], centerInsufficientSlides: [{ + type: i0.Input + }], watchOverflow: [{ + type: i0.Input + }], roundLengths: [{ + type: i0.Input + }], touchRatio: [{ + type: i0.Input + }], touchAngle: [{ + type: i0.Input + }], simulateTouch: [{ + type: i0.Input + }], shortSwipes: [{ + type: i0.Input + }], longSwipes: [{ + type: i0.Input + }], longSwipesRatio: [{ + type: i0.Input + }], longSwipesMs: [{ + type: i0.Input + }], followFinger: [{ + type: i0.Input + }], allowTouchMove: [{ + type: i0.Input + }], threshold: [{ + type: i0.Input + }], touchMoveStopPropagation: [{ + type: i0.Input + }], touchStartPreventDefault: [{ + type: i0.Input + }], touchStartForcePreventDefault: [{ + type: i0.Input + }], touchReleaseOnEdges: [{ + type: i0.Input + }], uniqueNavElements: [{ + type: i0.Input + }], resistance: [{ + type: i0.Input + }], resistanceRatio: [{ + type: i0.Input + }], watchSlidesProgress: [{ + type: i0.Input + }], grabCursor: [{ + type: i0.Input + }], preventClicks: [{ + type: i0.Input + }], preventClicksPropagation: [{ + type: i0.Input + }], slideToClickedSlide: [{ + type: i0.Input + }], preloadImages: [{ + type: i0.Input + }], updateOnImagesReady: [{ + type: i0.Input + }], loop: [{ + type: i0.Input + }], loopAdditionalSlides: [{ + type: i0.Input + }], loopedSlides: [{ + type: i0.Input + }], loopFillGroupWithBlank: [{ + type: i0.Input + }], loopPreventsSlide: [{ + type: i0.Input + }], allowSlidePrev: [{ + type: i0.Input + }], allowSlideNext: [{ + type: i0.Input + }], swipeHandler: [{ + type: i0.Input + }], noSwiping: [{ + type: i0.Input + }], noSwipingClass: [{ + type: i0.Input + }], noSwipingSelector: [{ + type: i0.Input + }], passiveListeners: [{ + type: i0.Input + }], containerModifierClass: [{ + type: i0.Input + }], slideClass: [{ + type: i0.Input + }], slideBlankClass: [{ + type: i0.Input + }], slideActiveClass: [{ + type: i0.Input + }], slideDuplicateActiveClass: [{ + type: i0.Input + }], slideVisibleClass: [{ + type: i0.Input + }], slideDuplicateClass: [{ + type: i0.Input + }], slideNextClass: [{ + type: i0.Input + }], slideDuplicateNextClass: [{ + type: i0.Input + }], slidePrevClass: [{ + type: i0.Input + }], slideDuplicatePrevClass: [{ + type: i0.Input + }], wrapperClass: [{ + type: i0.Input + }], runCallbacksOnInit: [{ + type: i0.Input + }], observeParents: [{ + type: i0.Input + }], observeSlideChildren: [{ + type: i0.Input + }], a11y: [{ + type: i0.Input + }], autoplay: [{ + type: i0.Input + }], controller: [{ + type: i0.Input + }], coverflowEffect: [{ + type: i0.Input + }], cubeEffect: [{ + type: i0.Input + }], fadeEffect: [{ + type: i0.Input + }], flipEffect: [{ + type: i0.Input + }], creativeEffect: [{ + type: i0.Input + }], cardsEffect: [{ + type: i0.Input + }], hashNavigation: [{ + type: i0.Input + }], history: [{ + type: i0.Input + }], keyboard: [{ + type: i0.Input + }], lazy: [{ + type: i0.Input + }], mousewheel: [{ + type: i0.Input + }], parallax: [{ + type: i0.Input + }], thumbs: [{ + type: i0.Input + }], zoom: [{ + type: i0.Input + }], class: [{ + type: i0.Input + }], id: [{ + type: i0.Input + }], navigation: [{ + type: i0.Input + }], pagination: [{ + type: i0.Input + }], scrollbar: [{ + type: i0.Input + }], virtual: [{ + type: i0.Input + }], index: [{ + type: i0.Input + }], config: [{ + type: i0.Input + }], s__beforeBreakpoint: [{ + type: i0.Output, + args: ['_beforeBreakpoint'] + }], s__containerClasses: [{ + type: i0.Output, + args: ['_containerClasses'] + }], s__slideClass: [{ + type: i0.Output, + args: ['_slideClass'] + }], s__swiper: [{ + type: i0.Output, + args: ['_swiper'] + }], s_activeIndexChange: [{ + type: i0.Output, + args: ['activeIndexChange'] + }], s_afterInit: [{ + type: i0.Output, + args: ['afterInit'] + }], s_autoplay: [{ + type: i0.Output, + args: ['autoplay'] + }], s_autoplayStart: [{ + type: i0.Output, + args: ['autoplayStart'] + }], s_autoplayStop: [{ + type: i0.Output, + args: ['autoplayStop'] + }], s_beforeDestroy: [{ + type: i0.Output, + args: ['beforeDestroy'] + }], s_beforeInit: [{ + type: i0.Output, + args: ['beforeInit'] + }], s_beforeLoopFix: [{ + type: i0.Output, + args: ['beforeLoopFix'] + }], s_beforeResize: [{ + type: i0.Output, + args: ['beforeResize'] + }], s_beforeSlideChangeStart: [{ + type: i0.Output, + args: ['beforeSlideChangeStart'] + }], s_beforeTransitionStart: [{ + type: i0.Output, + args: ['beforeTransitionStart'] + }], s_breakpoint: [{ + type: i0.Output, + args: ['breakpoint'] + }], s_changeDirection: [{ + type: i0.Output, + args: ['changeDirection'] + }], s_click: [{ + type: i0.Output, + args: ['click'] + }], s_doubleTap: [{ + type: i0.Output, + args: ['doubleTap'] + }], s_doubleClick: [{ + type: i0.Output, + args: ['doubleClick'] + }], s_destroy: [{ + type: i0.Output, + args: ['destroy'] + }], s_fromEdge: [{ + type: i0.Output, + args: ['fromEdge'] + }], s_hashChange: [{ + type: i0.Output, + args: ['hashChange'] + }], s_hashSet: [{ + type: i0.Output, + args: ['hashSet'] + }], s_imagesReady: [{ + type: i0.Output, + args: ['imagesReady'] + }], s_init: [{ + type: i0.Output, + args: ['init'] + }], s_keyPress: [{ + type: i0.Output, + args: ['keyPress'] + }], s_lazyImageLoad: [{ + type: i0.Output, + args: ['lazyImageLoad'] + }], s_lazyImageReady: [{ + type: i0.Output, + args: ['lazyImageReady'] + }], s_loopFix: [{ + type: i0.Output, + args: ['loopFix'] + }], s_momentumBounce: [{ + type: i0.Output, + args: ['momentumBounce'] + }], s_navigationHide: [{ + type: i0.Output, + args: ['navigationHide'] + }], s_navigationShow: [{ + type: i0.Output, + args: ['navigationShow'] + }], s_observerUpdate: [{ + type: i0.Output, + args: ['observerUpdate'] + }], s_orientationchange: [{ + type: i0.Output, + args: ['orientationchange'] + }], s_paginationHide: [{ + type: i0.Output, + args: ['paginationHide'] + }], s_paginationRender: [{ + type: i0.Output, + args: ['paginationRender'] + }], s_paginationShow: [{ + type: i0.Output, + args: ['paginationShow'] + }], s_paginationUpdate: [{ + type: i0.Output, + args: ['paginationUpdate'] + }], s_progress: [{ + type: i0.Output, + args: ['progress'] + }], s_reachBeginning: [{ + type: i0.Output, + args: ['reachBeginning'] + }], s_reachEnd: [{ + type: i0.Output, + args: ['reachEnd'] + }], s_realIndexChange: [{ + type: i0.Output, + args: ['realIndexChange'] + }], s_resize: [{ + type: i0.Output, + args: ['resize'] + }], s_scroll: [{ + type: i0.Output, + args: ['scroll'] + }], s_scrollbarDragEnd: [{ + type: i0.Output, + args: ['scrollbarDragEnd'] + }], s_scrollbarDragMove: [{ + type: i0.Output, + args: ['scrollbarDragMove'] + }], s_scrollbarDragStart: [{ + type: i0.Output, + args: ['scrollbarDragStart'] + }], s_setTransition: [{ + type: i0.Output, + args: ['setTransition'] + }], s_setTranslate: [{ + type: i0.Output, + args: ['setTranslate'] + }], s_slideChange: [{ + type: i0.Output, + args: ['slideChange'] + }], s_slideChangeTransitionEnd: [{ + type: i0.Output, + args: ['slideChangeTransitionEnd'] + }], s_slideChangeTransitionStart: [{ + type: i0.Output, + args: ['slideChangeTransitionStart'] + }], s_slideNextTransitionEnd: [{ + type: i0.Output, + args: ['slideNextTransitionEnd'] + }], s_slideNextTransitionStart: [{ + type: i0.Output, + args: ['slideNextTransitionStart'] + }], s_slidePrevTransitionEnd: [{ + type: i0.Output, + args: ['slidePrevTransitionEnd'] + }], s_slidePrevTransitionStart: [{ + type: i0.Output, + args: ['slidePrevTransitionStart'] + }], s_slideResetTransitionStart: [{ + type: i0.Output, + args: ['slideResetTransitionStart'] + }], s_slideResetTransitionEnd: [{ + type: i0.Output, + args: ['slideResetTransitionEnd'] + }], s_sliderMove: [{ + type: i0.Output, + args: ['sliderMove'] + }], s_sliderFirstMove: [{ + type: i0.Output, + args: ['sliderFirstMove'] + }], s_slidesLengthChange: [{ + type: i0.Output, + args: ['slidesLengthChange'] + }], s_slidesGridLengthChange: [{ + type: i0.Output, + args: ['slidesGridLengthChange'] + }], s_snapGridLengthChange: [{ + type: i0.Output, + args: ['snapGridLengthChange'] + }], s_snapIndexChange: [{ + type: i0.Output, + args: ['snapIndexChange'] + }], s_tap: [{ + type: i0.Output, + args: ['tap'] + }], s_toEdge: [{ + type: i0.Output, + args: ['toEdge'] + }], s_touchEnd: [{ + type: i0.Output, + args: ['touchEnd'] + }], s_touchMove: [{ + type: i0.Output, + args: ['touchMove'] + }], s_touchMoveOpposite: [{ + type: i0.Output, + args: ['touchMoveOpposite'] + }], s_touchStart: [{ + type: i0.Output, + args: ['touchStart'] + }], s_transitionEnd: [{ + type: i0.Output, + args: ['transitionEnd'] + }], s_transitionStart: [{ + type: i0.Output, + args: ['transitionStart'] + }], s_update: [{ + type: i0.Output, + args: ['update'] + }], s_zoomChange: [{ + type: i0.Output, + args: ['zoomChange'] + }], s_swiper: [{ + type: i0.Output, + args: ['swiper'] + }], indexChange: [{ + type: i0.Output + }], prevElRef: [{ + type: i0.ViewChild, + args: ['prevElRef', { static: false }] + }], nextElRef: [{ + type: i0.ViewChild, + args: ['nextElRef', { static: false }] + }], scrollbarElRef: [{ + type: i0.ViewChild, + args: ['scrollbarElRef', { static: false }] + }], paginationElRef: [{ + type: i0.ViewChild, + args: ['paginationElRef', { static: false }] + }], slidesEl: [{ + type: i0.ContentChildren, + args: [SwiperSlideDirective, { descendants: false, emitDistinctChangesOnly: true }] + }], containerClasses: [{ + type: i0.HostBinding, + args: ['class'] + }] } }); + + var SwiperModule = /** @class */ (function () { + function SwiperModule() { + } + return SwiperModule; + }()); + SwiperModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0__namespace, type: SwiperModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule }); + SwiperModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0__namespace, type: SwiperModule, declarations: [SwiperComponent, SwiperSlideDirective], imports: [i1.CommonModule], exports: [SwiperComponent, SwiperSlideDirective] }); + SwiperModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0__namespace, type: SwiperModule, imports: [[i1.CommonModule]] }); + i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0__namespace, type: SwiperModule, decorators: [{ + type: i0.NgModule, + args: [{ + declarations: [SwiperComponent, SwiperSlideDirective], + exports: [SwiperComponent, SwiperSlideDirective], + imports: [i1.CommonModule], + }] + }] }); + + /* + * Public API Surface of angular + */ + + /** + * Generated bundle index. Do not edit. + */ + + exports.SwiperComponent = SwiperComponent; + exports.SwiperModule = SwiperModule; + exports.SwiperSlideDirective = SwiperSlideDirective; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=swiper_angular.umd.js.map diff --git a/src/main/resources/static/assets/js/swiper/angular/bundles/swiper_angular.umd.js.map b/src/main/resources/static/assets/js/swiper/angular/bundles/swiper_angular.umd.js.map new file mode 100644 index 0000000..597e0fc --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/bundles/swiper_angular.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swiper_angular.umd.js","sources":["../../../node_modules/tslib/tslib.es6.js","../../../src/angular/src/utils/utils.ts","../../../src/angular/src/utils/params-list.ts","../../../src/angular/src/utils/get-params.ts","../../../src/angular/src/swiper-slide.directive.ts","../../../src/angular/src/swiper.component.ts","../../../src/angular/src/swiper.component.html","../../../src/angular/src/swiper.module.ts","../../../src/angular/src/public-api.ts","../../../src/swiper_angular.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export function isObject(o: any): boolean {\n return (\n typeof o === 'object' &&\n o !== null &&\n o.constructor &&\n Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n );\n}\n\nexport function isShowEl(val: any, obj: any, el: any): boolean {\n return (\n (coerceBooleanProperty(val) === true && obj && !obj.el) ||\n !(\n typeof obj !== 'boolean' &&\n obj.el !== el?.nativeElement &&\n (typeof obj.el === 'string' || typeof obj.el === 'object')\n )\n );\n}\n\nexport function extend(target: any, src: any) {\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n Object.keys(src)\n .filter((key) => noExtend.indexOf(key) < 0)\n .forEach((key) => {\n if (typeof target[key] === 'undefined') {\n target[key] = src[key];\n return;\n }\n if (target[key] && !src[key]) {\n return;\n }\n if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n if (src[key].__swiper__) target[key] = src[key];\n else extend(target[key], src[key]);\n } else {\n target[key] = src[key];\n }\n });\n}\n\nexport function coerceBooleanProperty(value: any): boolean {\n return value != null && `${value}` !== 'false';\n}\n\nexport const ignoreNgOnChanges = ['pagination', 'navigation', 'scrollbar', 'virtual'];\n\nexport function setProperty(val: any, obj = {}): {} | false {\n if (isObject(val)) {\n return val;\n }\n\n if (coerceBooleanProperty(val) === true) {\n return obj;\n }\n\n return false;\n}\n","/* underscore in name -> watch for changes */\nexport const paramsList = [\n 'init',\n 'enabled',\n '_direction',\n 'touchEventsTarget',\n 'initialSlide',\n '_speed',\n 'cssMode',\n 'updateOnWindowResize',\n 'resizeObserver',\n 'nested',\n 'focusableElements',\n '_width',\n '_height',\n 'preventInteractionOnTransition',\n 'userAgent',\n 'url',\n '_edgeSwipeDetection',\n '_edgeSwipeThreshold',\n '_freeMode',\n '_autoHeight',\n 'setWrapperSize',\n 'virtualTranslate',\n '_effect',\n 'breakpoints',\n '_spaceBetween',\n '_slidesPerView',\n '_grid',\n '_slidesPerGroup',\n '_slidesPerGroupSkip',\n '_centeredSlides',\n '_centeredSlidesBounds',\n '_slidesOffsetBefore',\n '_slidesOffsetAfter',\n 'normalizeSlideIndex',\n '_centerInsufficientSlides',\n '_watchOverflow',\n 'roundLengths',\n 'touchRatio',\n 'touchAngle',\n 'simulateTouch',\n '_shortSwipes',\n '_longSwipes',\n 'longSwipesRatio',\n 'longSwipesMs',\n '_followFinger',\n 'allowTouchMove',\n '_threshold',\n 'touchMoveStopPropagation',\n 'touchStartPreventDefault',\n 'touchStartForcePreventDefault',\n 'touchReleaseOnEdges',\n 'uniqueNavElements',\n '_resistance',\n '_resistanceRatio',\n '_watchSlidesProgress',\n '_grabCursor',\n 'preventClicks',\n 'preventClicksPropagation',\n '_slideToClickedSlide',\n '_preloadImages',\n 'updateOnImagesReady',\n '_loop',\n '_loopAdditionalSlides',\n '_loopedSlides',\n '_loopFillGroupWithBlank',\n 'loopPreventsSlide',\n '_allowSlidePrev',\n '_allowSlideNext',\n '_swipeHandler',\n '_noSwiping',\n 'noSwipingClass',\n 'noSwipingSelector',\n 'passiveListeners',\n 'containerModifierClass',\n 'slideClass',\n 'slideBlankClass',\n 'slideActiveClass',\n 'slideDuplicateActiveClass',\n 'slideVisibleClass',\n 'slideDuplicateClass',\n 'slideNextClass',\n 'slideDuplicateNextClass',\n 'slidePrevClass',\n 'slideDuplicatePrevClass',\n 'wrapperClass',\n 'runCallbacksOnInit',\n 'observer',\n 'observeParents',\n 'observeSlideChildren',\n\n // modules\n 'a11y',\n 'autoplay',\n '_controller',\n 'coverflowEffect',\n 'cubeEffect',\n 'fadeEffect',\n 'flipEffect',\n 'creativeEffect',\n 'cardsEffect',\n 'hashNavigation',\n 'history',\n 'keyboard',\n 'lazy',\n 'mousewheel',\n '_navigation',\n '_pagination',\n 'parallax',\n '_scrollbar',\n '_thumbs',\n 'virtual',\n 'zoom',\n];\n","// eslint-disable-next-line\nimport { isObject, extend } from './utils';\nimport { paramsList } from './params-list';\n// @ts-ignore\nimport Swiper from 'swiper';\n\nexport const allowedParams = paramsList.map((key) => key.replace(/_/, ''));\nexport function getParams(obj: any = {}) {\n const params: any = {\n on: {},\n };\n const passedParams: any = {};\n extend(params, Swiper.defaults);\n extend(params, Swiper.extendedDefaults);\n params._emitClasses = true;\n\n const rest: any = {};\n Object.keys(obj).forEach((key: string) => {\n const _key = key.replace(/^_/, '');\n if (typeof obj[_key] === 'undefined') return;\n if (allowedParams.indexOf(_key) >= 0) {\n if (isObject(obj[_key])) {\n params[_key] = {};\n passedParams[_key] = {};\n extend(params[_key], obj[_key]);\n extend(passedParams[_key], obj[_key]);\n } else {\n params[_key] = obj[_key];\n passedParams[_key] = obj[_key];\n }\n } else {\n rest[_key] = obj[_key];\n }\n });\n\n return { params, passedParams, rest };\n}\n","import { Directive, Input, TemplateRef } from '@angular/core';\nimport { coerceBooleanProperty } from './utils/utils';\n@Directive({\n selector: 'ng-template[swiperSlide]',\n})\nexport class SwiperSlideDirective {\n @Input() virtualIndex: number;\n @Input() class: string = '';\n @Input('data-swiper-autoplay') autoplayDelay: string | null = null;\n @Input()\n set zoom(val: boolean) {\n this._zoom = coerceBooleanProperty(val);\n }\n get zoom() {\n return this._zoom;\n }\n private _zoom: boolean;\n slideIndex: number;\n get classNames() {\n return this._classNames;\n }\n set classNames(val) {\n if (this._classNames === val) {\n return;\n }\n this._classNames = val;\n this.slideData = {\n isActive: this._hasClass(['swiper-slide-active', 'swiper-slide-duplicate-active']),\n isVisible: this._hasClass(['swiper-slide-visible']),\n isDuplicate: this._hasClass(['swiper-slide-duplicate']),\n isPrev: this._hasClass(['swiper-slide-prev', 'swiper-slide-duplicate-prev']),\n isNext: this._hasClass(['swiper-slide-next', 'swiper-slide-duplicate-next']),\n };\n }\n\n private _hasClass(classNames: string[]) {\n return classNames.some((className) => this._classNames.indexOf(className) >= 0);\n }\n slideData = {\n isActive: false,\n isPrev: false,\n isNext: false,\n isVisible: false,\n isDuplicate: false,\n };\n\n private _classNames: string;\n constructor(public template: TemplateRef) {}\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n NgZone,\n OnInit,\n Output,\n PLATFORM_ID,\n QueryList,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\n// @ts-ignore\nimport Swiper from 'swiper';\nimport { Observable, of, Subject } from 'rxjs';\nimport { getParams } from './utils/get-params';\nimport { SwiperSlideDirective } from './swiper-slide.directive';\nimport {\n extend,\n isObject,\n setProperty,\n ignoreNgOnChanges,\n coerceBooleanProperty,\n isShowEl,\n} from './utils/utils';\nimport {\n SwiperOptions,\n SwiperEvents,\n NavigationOptions,\n PaginationOptions,\n ScrollbarOptions,\n VirtualOptions,\n} from 'swiper/types';\nimport { isPlatformBrowser } from '@angular/common';\n@Component({\n selector: 'swiper, [swiper]',\n templateUrl: './swiper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styles: [\n `\n swiper {\n display: block;\n }\n `,\n ],\n})\nexport class SwiperComponent implements OnInit {\n @Input() enabled: SwiperOptions['enabled'];\n @Input() direction: SwiperOptions['direction'];\n @Input() touchEventsTarget: SwiperOptions['touchEventsTarget'];\n @Input() initialSlide: SwiperOptions['initialSlide'];\n @Input() speed: SwiperOptions['speed'];\n @Input() cssMode: SwiperOptions['cssMode'];\n @Input() updateOnWindowResize: SwiperOptions['updateOnWindowResize'];\n @Input() resizeObserver: SwiperOptions['resizeObserver'];\n @Input() nested: SwiperOptions['nested'];\n @Input() focusableElements: SwiperOptions['focusableElements'];\n @Input() width: SwiperOptions['width'];\n @Input() height: SwiperOptions['height'];\n @Input() preventInteractionOnTransition: SwiperOptions['preventInteractionOnTransition'];\n @Input() userAgent: SwiperOptions['userAgent'];\n @Input() url: SwiperOptions['url'];\n @Input() edgeSwipeDetection: boolean | string;\n @Input() edgeSwipeThreshold: number;\n @Input() freeMode: SwiperOptions['freeMode'];\n @Input() autoHeight: SwiperOptions['autoHeight'];\n @Input() setWrapperSize: SwiperOptions['setWrapperSize'];\n @Input() virtualTranslate: SwiperOptions['virtualTranslate'];\n @Input() effect: SwiperOptions['effect'];\n @Input() breakpoints: SwiperOptions['breakpoints'];\n @Input() spaceBetween: SwiperOptions['spaceBetween'];\n @Input() slidesPerView: SwiperOptions['slidesPerView'];\n @Input() grid: SwiperOptions['grid'];\n @Input() slidesPerGroup: SwiperOptions['slidesPerGroup'];\n @Input() slidesPerGroupSkip: SwiperOptions['slidesPerGroupSkip'];\n @Input() centeredSlides: SwiperOptions['centeredSlides'];\n @Input() centeredSlidesBounds: SwiperOptions['centeredSlidesBounds'];\n @Input() slidesOffsetBefore: SwiperOptions['slidesOffsetBefore'];\n @Input() slidesOffsetAfter: SwiperOptions['slidesOffsetAfter'];\n @Input() normalizeSlideIndex: SwiperOptions['normalizeSlideIndex'];\n @Input() centerInsufficientSlides: SwiperOptions['centerInsufficientSlides'];\n @Input() watchOverflow: SwiperOptions['watchOverflow'];\n @Input() roundLengths: SwiperOptions['roundLengths'];\n @Input() touchRatio: SwiperOptions['touchRatio'];\n @Input() touchAngle: SwiperOptions['touchAngle'];\n @Input() simulateTouch: SwiperOptions['simulateTouch'];\n @Input() shortSwipes: SwiperOptions['shortSwipes'];\n @Input() longSwipes: SwiperOptions['longSwipes'];\n @Input() longSwipesRatio: SwiperOptions['longSwipesRatio'];\n @Input() longSwipesMs: SwiperOptions['longSwipesMs'];\n @Input() followFinger: SwiperOptions['followFinger'];\n @Input() allowTouchMove: SwiperOptions['allowTouchMove'];\n @Input() threshold: SwiperOptions['threshold'];\n @Input() touchMoveStopPropagation: SwiperOptions['touchMoveStopPropagation'];\n @Input() touchStartPreventDefault: SwiperOptions['touchStartPreventDefault'];\n @Input() touchStartForcePreventDefault: SwiperOptions['touchStartForcePreventDefault'];\n @Input() touchReleaseOnEdges: SwiperOptions['touchReleaseOnEdges'];\n @Input() uniqueNavElements: SwiperOptions['uniqueNavElements'];\n @Input() resistance: SwiperOptions['resistance'];\n @Input() resistanceRatio: SwiperOptions['resistanceRatio'];\n @Input() watchSlidesProgress: SwiperOptions['watchSlidesProgress'];\n @Input() grabCursor: SwiperOptions['grabCursor'];\n @Input() preventClicks: SwiperOptions['preventClicks'];\n @Input() preventClicksPropagation: SwiperOptions['preventClicksPropagation'];\n @Input() slideToClickedSlide: SwiperOptions['slideToClickedSlide'];\n @Input() preloadImages: SwiperOptions['preloadImages'];\n @Input() updateOnImagesReady: SwiperOptions['updateOnImagesReady'];\n @Input() loop: SwiperOptions['loop'];\n @Input() loopAdditionalSlides: SwiperOptions['loopAdditionalSlides'];\n @Input() loopedSlides: SwiperOptions['loopedSlides'];\n @Input() loopFillGroupWithBlank: SwiperOptions['loopFillGroupWithBlank'];\n @Input() loopPreventsSlide: SwiperOptions['loopPreventsSlide'];\n @Input() allowSlidePrev: SwiperOptions['allowSlidePrev'];\n @Input() allowSlideNext: SwiperOptions['allowSlideNext'];\n @Input() swipeHandler: SwiperOptions['swipeHandler'];\n @Input() noSwiping: SwiperOptions['noSwiping'];\n @Input() noSwipingClass: SwiperOptions['noSwipingClass'];\n @Input() noSwipingSelector: SwiperOptions['noSwipingSelector'];\n @Input() passiveListeners: SwiperOptions['passiveListeners'];\n @Input() containerModifierClass: SwiperOptions['containerModifierClass'];\n @Input() slideClass: SwiperOptions['slideClass'] = 'swiper-slide';\n @Input() slideBlankClass: SwiperOptions['slideBlankClass'];\n @Input() slideActiveClass: SwiperOptions['slideActiveClass'];\n @Input() slideDuplicateActiveClass: SwiperOptions['slideDuplicateActiveClass'];\n @Input() slideVisibleClass: SwiperOptions['slideVisibleClass'];\n @Input() slideDuplicateClass: SwiperOptions['slideDuplicateClass'];\n @Input() slideNextClass: SwiperOptions['slideNextClass'];\n @Input() slideDuplicateNextClass: SwiperOptions['slideDuplicateNextClass'];\n @Input() slidePrevClass: SwiperOptions['slidePrevClass'];\n @Input() slideDuplicatePrevClass: SwiperOptions['slideDuplicatePrevClass'];\n @Input() wrapperClass: SwiperOptions['wrapperClass'] = 'swiper-wrapper';\n @Input() runCallbacksOnInit: SwiperOptions['runCallbacksOnInit'];\n @Input() observeParents: SwiperOptions['observeParents'];\n @Input() observeSlideChildren: SwiperOptions['observeSlideChildren'];\n @Input() a11y: SwiperOptions['a11y'];\n @Input() autoplay: SwiperOptions['autoplay'];\n @Input() controller: SwiperOptions['controller'];\n @Input() coverflowEffect: SwiperOptions['coverflowEffect'];\n @Input() cubeEffect: SwiperOptions['cubeEffect'];\n @Input() fadeEffect: SwiperOptions['fadeEffect'];\n @Input() flipEffect: SwiperOptions['flipEffect'];\n @Input() creativeEffect: SwiperOptions['creativeEffect'];\n @Input() cardsEffect: SwiperOptions['cardsEffect'];\n @Input() hashNavigation: SwiperOptions['hashNavigation'];\n @Input() history: SwiperOptions['history'];\n @Input() keyboard: SwiperOptions['keyboard'];\n @Input() lazy: SwiperOptions['lazy'];\n @Input() mousewheel: SwiperOptions['mousewheel'];\n @Input() parallax: SwiperOptions['parallax'];\n @Input() thumbs: SwiperOptions['thumbs'];\n @Input() zoom: SwiperOptions['zoom'];\n @Input() class: string;\n @Input() id: string;\n @Input()\n set navigation(val) {\n const currentNext =\n typeof this._navigation !== 'boolean' && this._navigation !== ''\n ? this._navigation?.nextEl\n : null;\n const currentPrev =\n typeof this._navigation !== 'boolean' && this._navigation !== ''\n ? this._navigation?.prevEl\n : null;\n this._navigation = setProperty(val, {\n nextEl: currentNext || null,\n prevEl: currentPrev || null,\n });\n this.showNavigation = !(\n coerceBooleanProperty(val) !== true ||\n (this._navigation &&\n typeof this._navigation !== 'boolean' &&\n this._navigation.prevEl !== this._prevElRef?.nativeElement &&\n (this._navigation.prevEl !== null || this._navigation.nextEl !== null) &&\n (typeof this._navigation.nextEl === 'string' ||\n typeof this._navigation.prevEl === 'string' ||\n typeof this._navigation.nextEl === 'object' ||\n typeof this._navigation.prevEl === 'object'))\n );\n }\n get navigation() {\n return this._navigation;\n }\n private _navigation: NavigationOptions | boolean | '';\n showNavigation: boolean = true;\n\n @Input()\n set pagination(val) {\n const current =\n typeof this._pagination !== 'boolean' && this._pagination !== ''\n ? this._pagination?.el\n : null;\n this._pagination = setProperty(val, {\n el: current || null,\n });\n this.showPagination = isShowEl(val, this._pagination, this._paginationElRef);\n }\n get pagination() {\n return this._pagination;\n }\n private _pagination: PaginationOptions | boolean | '';\n showPagination: boolean = true;\n\n @Input()\n set scrollbar(val) {\n const current =\n typeof this._scrollbar !== 'boolean' && this._scrollbar !== '' ? this._scrollbar?.el : null;\n this._scrollbar = setProperty(val, {\n el: current || null,\n });\n this.showScrollbar = isShowEl(val, this._scrollbar, this._scrollbarElRef);\n }\n get scrollbar() {\n return this._scrollbar;\n }\n private _scrollbar: ScrollbarOptions | boolean | '';\n showScrollbar: boolean = true;\n\n @Input()\n set virtual(val) {\n this._virtual = setProperty(val);\n }\n get virtual() {\n return this._virtual;\n }\n private _virtual: VirtualOptions | boolean | '';\n\n @Input()\n set index(index: number) {\n console.warn('`[(index)]` prop is deprecated and will be removed in upcoming versions');\n this.setIndex(index);\n }\n @Input()\n set config(val: SwiperOptions) {\n this.updateSwiper(val);\n const { params } = getParams(val);\n Object.assign(this, params);\n }\n // prettier-ignore\n @Output('_beforeBreakpoint') s__beforeBreakpoint: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('_containerClasses') s__containerClasses: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('_slideClass') s__slideClass: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('_swiper') s__swiper: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('activeIndexChange') s_activeIndexChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('afterInit') s_afterInit: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('autoplay') s_autoplay: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('autoplayStart') s_autoplayStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('autoplayStop') s_autoplayStop: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeDestroy') s_beforeDestroy: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeInit') s_beforeInit: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeLoopFix') s_beforeLoopFix: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeResize') s_beforeResize: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeSlideChangeStart') s_beforeSlideChangeStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeTransitionStart') s_beforeTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('breakpoint') s_breakpoint: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('changeDirection') s_changeDirection: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('click') s_click: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('doubleTap') s_doubleTap: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('doubleClick') s_doubleClick: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('destroy') s_destroy: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('fromEdge') s_fromEdge: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('hashChange') s_hashChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('hashSet') s_hashSet: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('imagesReady') s_imagesReady: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('init') s_init: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('keyPress') s_keyPress: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('lazyImageLoad') s_lazyImageLoad: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('lazyImageReady') s_lazyImageReady: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('loopFix') s_loopFix: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('momentumBounce') s_momentumBounce: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('navigationHide') s_navigationHide: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('navigationShow') s_navigationShow: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('observerUpdate') s_observerUpdate: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('orientationchange') s_orientationchange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('paginationHide') s_paginationHide: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('paginationRender') s_paginationRender: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('paginationShow') s_paginationShow: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('paginationUpdate') s_paginationUpdate: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('progress') s_progress: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('reachBeginning') s_reachBeginning: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('reachEnd') s_reachEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('realIndexChange') s_realIndexChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('resize') s_resize: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('scroll') s_scroll: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('scrollbarDragEnd') s_scrollbarDragEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('scrollbarDragMove') s_scrollbarDragMove: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('scrollbarDragStart') s_scrollbarDragStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('setTransition') s_setTransition: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('setTranslate') s_setTranslate: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideChange') s_slideChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideChangeTransitionEnd') s_slideChangeTransitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideChangeTransitionStart') s_slideChangeTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideNextTransitionEnd') s_slideNextTransitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideNextTransitionStart') s_slideNextTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slidePrevTransitionEnd') s_slidePrevTransitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slidePrevTransitionStart') s_slidePrevTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideResetTransitionStart') s_slideResetTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideResetTransitionEnd') s_slideResetTransitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('sliderMove') s_sliderMove: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('sliderFirstMove') s_sliderFirstMove: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slidesLengthChange') s_slidesLengthChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slidesGridLengthChange') s_slidesGridLengthChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('snapGridLengthChange') s_snapGridLengthChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('snapIndexChange') s_snapIndexChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('tap') s_tap: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('toEdge') s_toEdge: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('touchEnd') s_touchEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('touchMove') s_touchMove: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('touchMoveOpposite') s_touchMoveOpposite: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('touchStart') s_touchStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('transitionEnd') s_transitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('transitionStart') s_transitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('update') s_update: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('zoomChange') s_zoomChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('swiper') s_swiper: EventEmitter = new EventEmitter();\n\n @Output() indexChange = new EventEmitter();\n\n @ViewChild('prevElRef', { static: false })\n set prevElRef(el: ElementRef) {\n this._prevElRef = el;\n this._setElement(el, this.navigation, 'navigation', 'prevEl');\n }\n _prevElRef: ElementRef;\n @ViewChild('nextElRef', { static: false })\n set nextElRef(el: ElementRef) {\n this._nextElRef = el;\n this._setElement(el, this.navigation, 'navigation', 'nextEl');\n }\n _nextElRef: ElementRef;\n @ViewChild('scrollbarElRef', { static: false })\n set scrollbarElRef(el: ElementRef) {\n this._scrollbarElRef = el;\n this._setElement(el, this.scrollbar, 'scrollbar');\n }\n _scrollbarElRef: ElementRef;\n @ViewChild('paginationElRef', { static: false })\n set paginationElRef(el: ElementRef) {\n this._paginationElRef = el;\n this._setElement(el, this.pagination, 'pagination');\n }\n _paginationElRef: ElementRef;\n @ContentChildren(SwiperSlideDirective, { descendants: false, emitDistinctChangesOnly: true })\n slidesEl: QueryList;\n private slides: SwiperSlideDirective[];\n\n prependSlides: Observable;\n appendSlides: Observable;\n\n swiperRef: Swiper;\n readonly _activeSlides = new Subject();\n\n get activeSlides() {\n if (this.virtual) {\n return this._activeSlides;\n }\n return of(this.slides);\n }\n\n get zoomContainerClass() {\n return this.zoom && typeof this.zoom !== 'boolean'\n ? this.zoom.containerClass\n : 'swiper-zoom-container';\n }\n\n @HostBinding('class') containerClasses: string = 'swiper';\n constructor(\n private _ngZone: NgZone,\n private elementRef: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(PLATFORM_ID) private _platformId: Object,\n ) {}\n\n private _setElement(el: ElementRef, ref: any, update: string, key = 'el') {\n if (!el || !ref) {\n return;\n }\n if (ref && el.nativeElement) {\n if (ref[key] === el.nativeElement) {\n return;\n }\n ref[key] = el.nativeElement;\n }\n const updateObj: { [key: string]: boolean } = {};\n updateObj[update] = true;\n this.updateInitSwiper(updateObj);\n }\n ngOnInit(): void {\n const { params } = getParams(this);\n Object.assign(this, params);\n }\n ngAfterViewInit() {\n this.childrenSlidesInit();\n this.initSwiper();\n this._changeDetectorRef.detectChanges();\n setTimeout(() => {\n this.s_swiper.emit(this.swiperRef);\n });\n }\n\n private childrenSlidesInit() {\n this.slidesChanges(this.slidesEl);\n this.slidesEl.changes.subscribe(this.slidesChanges);\n }\n\n private slidesChanges = (val: QueryList) => {\n this.slides = val.map((slide: SwiperSlideDirective, index: number) => {\n slide.slideIndex = index;\n slide.classNames = this.slideClass || '';\n return slide;\n });\n if (this.loop && !this.loopedSlides) {\n this.calcLoopedSlides();\n }\n if (!this.virtual) {\n if (this.loopedSlides) {\n this.prependSlides = of(this.slides.slice(this.slides.length - this.loopedSlides));\n this.appendSlides = of(this.slides.slice(0, this.loopedSlides));\n }\n } else if (this.swiperRef && this.swiperRef.virtual) {\n this._ngZone.runOutsideAngular(() => {\n this.swiperRef.virtual.slides = this.slides;\n this.swiperRef.virtual.update(true);\n });\n }\n this._changeDetectorRef.detectChanges();\n };\n\n get isSwiperActive() {\n return this.swiperRef && !this.swiperRef.destroyed;\n }\n\n initSwiper() {\n const { params: swiperParams, passedParams } = getParams(this);\n Object.assign(this, swiperParams);\n this._ngZone.runOutsideAngular(() => {\n swiperParams.init = false;\n if (!swiperParams.virtual) {\n swiperParams.observer = true;\n }\n\n swiperParams.onAny = (eventName: keyof SwiperComponent, ...args: any[]) => {\n const emitter = this[('s_' + eventName) as keyof SwiperComponent] as EventEmitter;\n if (emitter) {\n emitter.emit(...args);\n }\n };\n const _slideClasses: SwiperEvents['_slideClasses'] = (_, updated) => {\n updated.forEach(({ slideEl, classNames }, index) => {\n const dataIndex = slideEl.getAttribute('data-swiper-slide-index');\n const slideIndex = dataIndex ? parseInt(dataIndex) : index;\n if (this.virtual) {\n const virtualSlide = this.slides.find((item) => {\n return item.virtualIndex && item.virtualIndex === slideIndex;\n });\n if (virtualSlide) {\n virtualSlide.classNames = classNames;\n return;\n }\n }\n\n if (this.slides[slideIndex]) {\n this.slides[slideIndex].classNames = classNames;\n }\n });\n this._changeDetectorRef.detectChanges();\n };\n const _containerClasses: SwiperEvents['_containerClasses'] = (_, classes) => {\n setTimeout(() => {\n this.containerClasses = classes;\n });\n };\n Object.assign(swiperParams.on, {\n _containerClasses,\n _slideClasses,\n });\n const swiperRef = new Swiper(swiperParams);\n swiperRef.loopCreate = () => {};\n swiperRef.loopDestroy = () => {};\n if (swiperParams.loop) {\n swiperRef.loopedSlides = this.loopedSlides;\n }\n const isVirtualEnabled =\n typeof swiperRef.params.virtual !== 'undefined' &&\n typeof swiperRef.params.virtual !== 'boolean' &&\n swiperRef.params.virtual.enabled;\n if (swiperRef.virtual && isVirtualEnabled) {\n swiperRef.virtual.slides = this.slides;\n const extendWith = {\n cache: false,\n slides: this.slides,\n renderExternal: this.updateVirtualSlides,\n renderExternalUpdate: false,\n };\n extend(swiperRef.params.virtual, extendWith);\n extend(swiperRef.originalParams.virtual, extendWith);\n }\n\n if (isPlatformBrowser(this._platformId)) {\n this.swiperRef = swiperRef.init(this.elementRef.nativeElement);\n const isEnabled =\n typeof this.swiperRef.params.virtual !== 'undefined' &&\n typeof this.swiperRef.params.virtual !== 'boolean' &&\n this.swiperRef.params.virtual.enabled;\n if (this.swiperRef.virtual && isEnabled) {\n this.swiperRef.virtual.update(true);\n }\n this._changeDetectorRef.detectChanges();\n swiperRef.on('slideChange', () => {\n this.indexChange.emit(this.swiperRef.realIndex);\n });\n }\n });\n }\n\n style: any = null;\n currentVirtualData: any; // TODO: type virtualData;\n private updateVirtualSlides = (virtualData: any) => {\n // TODO: type virtualData\n if (\n !this.swiperRef ||\n (this.currentVirtualData &&\n this.currentVirtualData.from === virtualData.from &&\n this.currentVirtualData.to === virtualData.to &&\n this.currentVirtualData.offset === virtualData.offset)\n ) {\n return;\n }\n this.style = this.swiperRef.isHorizontal()\n ? {\n [this.swiperRef.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px`,\n }\n : {\n top: `${virtualData.offset}px`,\n };\n this.currentVirtualData = virtualData;\n this._activeSlides.next(virtualData.slides);\n this._ngZone.run(() => {\n this._changeDetectorRef.detectChanges();\n });\n this._ngZone.runOutsideAngular(() => {\n this.swiperRef.updateSlides();\n this.swiperRef.updateProgress();\n this.swiperRef.updateSlidesClasses();\n if (this.swiperRef.lazy && this.swiperRef.params.lazy['enabled']) {\n this.swiperRef.lazy.load();\n }\n this.swiperRef.virtual.update(true);\n });\n return;\n };\n\n ngOnChanges(changedParams: SimpleChanges) {\n this.updateSwiper(changedParams);\n this._changeDetectorRef.detectChanges();\n }\n\n updateInitSwiper(changedParams: any) {\n if (!(changedParams && this.swiperRef && !this.swiperRef.destroyed)) {\n return;\n }\n\n this._ngZone.runOutsideAngular(() => {\n const {\n params: currentParams,\n pagination,\n navigation,\n scrollbar,\n virtual,\n thumbs,\n } = this.swiperRef;\n\n if (changedParams.pagination) {\n if (\n this.pagination &&\n typeof this.pagination !== 'boolean' &&\n this.pagination.el &&\n pagination &&\n !pagination.el\n ) {\n this.updateParameter('pagination', this.pagination);\n pagination.init();\n pagination.render();\n pagination.update();\n } else {\n pagination.destroy();\n pagination.el = null;\n }\n }\n\n if (changedParams.scrollbar) {\n if (\n this.scrollbar &&\n typeof this.scrollbar !== 'boolean' &&\n this.scrollbar.el &&\n scrollbar &&\n !scrollbar.el\n ) {\n this.updateParameter('scrollbar', this.scrollbar);\n scrollbar.init();\n scrollbar.updateSize();\n scrollbar.setTranslate();\n } else {\n scrollbar.destroy();\n scrollbar.el = null;\n }\n }\n\n if (changedParams.navigation) {\n if (\n this.navigation &&\n typeof this.navigation !== 'boolean' &&\n this.navigation.prevEl &&\n this.navigation.nextEl &&\n navigation &&\n !navigation.prevEl &&\n !navigation.nextEl\n ) {\n this.updateParameter('navigation', this.navigation);\n navigation.init();\n navigation.update();\n } else if (navigation.prevEl && navigation.nextEl) {\n navigation.destroy();\n navigation.nextEl = null;\n navigation.prevEl = null;\n }\n }\n if (changedParams.thumbs && this.thumbs && this.thumbs.swiper) {\n this.updateParameter('thumbs', this.thumbs);\n const initialized = thumbs.init();\n if (initialized) thumbs.update(true);\n }\n\n if (changedParams.controller && this.controller && this.controller.control) {\n this.swiperRef.controller.control = this.controller.control;\n }\n\n this.swiperRef.update();\n });\n }\n\n updateSwiper(changedParams: SimpleChanges | any) {\n this._ngZone.runOutsideAngular(() => {\n if (changedParams.config) {\n return;\n }\n if (!(changedParams && this.swiperRef && !this.swiperRef.destroyed)) {\n return;\n }\n for (const key in changedParams) {\n if (ignoreNgOnChanges.indexOf(key) >= 0) {\n continue;\n }\n const newValue = changedParams[key]?.currentValue ?? changedParams[key];\n this.updateParameter(key, newValue);\n }\n\n if (changedParams.allowSlideNext) {\n this.swiperRef.allowSlideNext = this.allowSlideNext;\n }\n if (changedParams.allowSlidePrev) {\n this.swiperRef.allowSlidePrev = this.allowSlidePrev;\n }\n if (changedParams.direction) {\n this.swiperRef.changeDirection(this.direction, false);\n }\n if (changedParams.breakpoints) {\n if (this.loop && !this.loopedSlides) {\n this.calcLoopedSlides();\n }\n this.swiperRef.currentBreakpoint = null;\n this.swiperRef.setBreakpoint();\n }\n\n if (changedParams.thumbs || changedParams.controller) {\n this.updateInitSwiper(changedParams);\n }\n this.swiperRef.update();\n });\n }\n\n calcLoopedSlides() {\n if (!this.loop) {\n return;\n }\n let slidesPerViewParams = this.slidesPerView;\n if (this.breakpoints) {\n const breakpoint = Swiper.prototype.getBreakpoint(this.breakpoints);\n const breakpointOnlyParams =\n breakpoint in this.breakpoints ? this.breakpoints[breakpoint] : undefined;\n if (breakpointOnlyParams && breakpointOnlyParams.slidesPerView) {\n slidesPerViewParams = breakpointOnlyParams.slidesPerView;\n }\n }\n if (slidesPerViewParams === 'auto') {\n this.loopedSlides = this.slides.length;\n return this.slides.length;\n }\n let loopedSlides = this.loopedSlides || slidesPerViewParams;\n if (!loopedSlides) {\n // ?\n return;\n }\n\n if (this.loopAdditionalSlides) {\n loopedSlides += this.loopAdditionalSlides;\n }\n if (loopedSlides > this.slides.length) {\n loopedSlides = this.slides.length;\n }\n this.loopedSlides = loopedSlides;\n return loopedSlides;\n }\n\n updateParameter(key: string, value: any) {\n if (!(this.swiperRef && !this.swiperRef.destroyed)) {\n return;\n }\n const _key = key.replace(/^_/, '');\n const isCurrentParamObj = isObject(this.swiperRef.params[_key]);\n\n if (Object.keys(this.swiperRef.modules).indexOf(_key) >= 0) {\n const defaultParams = this.swiperRef.modules[_key].params[_key];\n if (isCurrentParamObj) {\n extend(this.swiperRef.params[_key], defaultParams);\n } else {\n this.swiperRef.params[_key] = defaultParams;\n }\n }\n if (_key === 'enabled') {\n if (value === true) {\n this.swiperRef.enable();\n } else if (value === false) {\n this.swiperRef.disable();\n }\n return;\n }\n if (isCurrentParamObj && isObject(value)) {\n extend(this.swiperRef.params[_key], value);\n } else {\n this.swiperRef.params[_key] = value;\n }\n }\n /**\n * @deprecated will be removed in upcoming versions\n */\n setIndex(index: number, speed?: number, silent?: boolean): void {\n if (!this.isSwiperActive) {\n this.initialSlide = index;\n return;\n }\n if (index === this.swiperRef.activeIndex) {\n return;\n }\n this._ngZone.runOutsideAngular(() => {\n if (this.loop) {\n this.swiperRef.slideToLoop(index, speed, !silent);\n } else {\n this.swiperRef.slideTo(index, speed, !silent);\n }\n });\n }\n\n ngOnDestroy() {\n this._ngZone.runOutsideAngular(() => {\n this.swiperRef?.destroy(true, false);\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","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SwiperComponent } from './swiper.component';\nimport { SwiperSlideDirective } from './swiper-slide.directive';\n@NgModule({\n declarations: [SwiperComponent, SwiperSlideDirective],\n exports: [SwiperComponent, SwiperSlideDirective],\n imports: [CommonModule],\n})\nexport class SwiperModule {}\n","/*\n * Public API Surface of angular\n */\nexport * from './swiper.module';\nexport * from './swiper.component';\nexport * from './swiper-slide.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './swiper-angular';\n"],"names":["Swiper","Directive","Input","EventEmitter","Subject","of","isPlatformBrowser","PLATFORM_ID","Component","ChangeDetectionStrategy","ViewEncapsulation","Inject","Output","ViewChild","ContentChildren","HostBinding","CommonModule","NgModule"],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/public-api.js b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/public-api.js new file mode 100644 index 0000000..26852c4 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/public-api.js @@ -0,0 +1,7 @@ +/* + * Public API Surface of angular + */ +export * from './swiper.module'; +export * from './swiper.component'; +export * from './swiper-slide.directive'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hbmd1bGFyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFuZ3VsYXJcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9zd2lwZXIubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc3dpcGVyLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3N3aXBlci1zbGlkZS5kaXJlY3RpdmUnO1xuIl19 \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/swiper-slide.directive.js b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/swiper-slide.directive.js new file mode 100644 index 0000000..3e0244e --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/swiper-slide.directive.js @@ -0,0 +1,60 @@ +import { Directive, Input } from '@angular/core'; +import { coerceBooleanProperty } from './utils/utils'; +import * as i0 from "@angular/core"; +export class SwiperSlideDirective { + constructor(template) { + this.template = template; + this.class = ''; + this.autoplayDelay = null; + this.slideData = { + isActive: false, + isPrev: false, + isNext: false, + isVisible: false, + isDuplicate: false, + }; + } + set zoom(val) { + this._zoom = coerceBooleanProperty(val); + } + get zoom() { + return this._zoom; + } + get classNames() { + return this._classNames; + } + set classNames(val) { + if (this._classNames === val) { + return; + } + this._classNames = val; + this.slideData = { + isActive: this._hasClass(['swiper-slide-active', 'swiper-slide-duplicate-active']), + isVisible: this._hasClass(['swiper-slide-visible']), + isDuplicate: this._hasClass(['swiper-slide-duplicate']), + isPrev: this._hasClass(['swiper-slide-prev', 'swiper-slide-duplicate-prev']), + isNext: this._hasClass(['swiper-slide-next', 'swiper-slide-duplicate-next']), + }; + } + _hasClass(classNames) { + return classNames.some((className) => this._classNames.indexOf(className) >= 0); + } +} +SwiperSlideDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperSlideDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); +SwiperSlideDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.2", type: SwiperSlideDirective, selector: "ng-template[swiperSlide]", inputs: { virtualIndex: "virtualIndex", class: "class", autoplayDelay: ["data-swiper-autoplay", "autoplayDelay"], zoom: "zoom" }, ngImport: i0 }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperSlideDirective, decorators: [{ + type: Directive, + args: [{ + selector: 'ng-template[swiperSlide]', + }] + }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; }, propDecorators: { virtualIndex: [{ + type: Input + }], class: [{ + type: Input + }], autoplayDelay: [{ + type: Input, + args: ['data-swiper-autoplay'] + }], zoom: [{ + type: Input + }] } }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpcGVyLXNsaWRlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hbmd1bGFyL3NyYy9zd2lwZXItc2xpZGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFJdEQsTUFBTSxPQUFPLG9CQUFvQjtJQTBDL0IsWUFBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUF4Q3BDLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDRyxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUE4Qm5FLGNBQVMsR0FBRztZQUNWLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLEtBQUs7WUFDYixNQUFNLEVBQUUsS0FBSztZQUNiLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFdBQVcsRUFBRSxLQUFLO1NBQ25CLENBQUM7SUFHOEMsQ0FBQztJQXRDakQsSUFDSSxJQUFJLENBQUMsR0FBWTtRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUdELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsR0FBRztRQUNoQixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssR0FBRyxFQUFFO1lBQzVCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLCtCQUErQixDQUFDLENBQUM7WUFDbEYsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ25ELFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUN2RCxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLDZCQUE2QixDQUFDLENBQUM7WUFDNUUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1NBQzdFLENBQUM7SUFDSixDQUFDO0lBRU8sU0FBUyxDQUFDLFVBQW9CO1FBQ3BDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQzs7aUhBaENVLG9CQUFvQjtxR0FBcEIsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBSGhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtpQkFDckM7a0dBRVUsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ3lCLGFBQWE7c0JBQTNDLEtBQUs7dUJBQUMsc0JBQXNCO2dCQUV6QixJQUFJO3NCQURQLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnLi91dGlscy91dGlscyc7XG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtzd2lwZXJTbGlkZV0nLFxufSlcbmV4cG9ydCBjbGFzcyBTd2lwZXJTbGlkZURpcmVjdGl2ZSB7XG4gIEBJbnB1dCgpIHZpcnR1YWxJbmRleDogbnVtYmVyO1xuICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgnZGF0YS1zd2lwZXItYXV0b3BsYXknKSBhdXRvcGxheURlbGF5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KClcbiAgc2V0IHpvb20odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5fem9vbSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWwpO1xuICB9XG4gIGdldCB6b29tKCkge1xuICAgIHJldHVybiB0aGlzLl96b29tO1xuICB9XG4gIHByaXZhdGUgX3pvb206IGJvb2xlYW47XG4gIHNsaWRlSW5kZXg6IG51bWJlcjtcbiAgZ2V0IGNsYXNzTmFtZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzTmFtZXM7XG4gIH1cbiAgc2V0IGNsYXNzTmFtZXModmFsKSB7XG4gICAgaWYgKHRoaXMuX2NsYXNzTmFtZXMgPT09IHZhbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGFzc05hbWVzID0gdmFsO1xuICAgIHRoaXMuc2xpZGVEYXRhID0ge1xuICAgICAgaXNBY3RpdmU6IHRoaXMuX2hhc0NsYXNzKFsnc3dpcGVyLXNsaWRlLWFjdGl2ZScsICdzd2lwZXItc2xpZGUtZHVwbGljYXRlLWFjdGl2ZSddKSxcbiAgICAgIGlzVmlzaWJsZTogdGhpcy5faGFzQ2xhc3MoWydzd2lwZXItc2xpZGUtdmlzaWJsZSddKSxcbiAgICAgIGlzRHVwbGljYXRlOiB0aGlzLl9oYXNDbGFzcyhbJ3N3aXBlci1zbGlkZS1kdXBsaWNhdGUnXSksXG4gICAgICBpc1ByZXY6IHRoaXMuX2hhc0NsYXNzKFsnc3dpcGVyLXNsaWRlLXByZXYnLCAnc3dpcGVyLXNsaWRlLWR1cGxpY2F0ZS1wcmV2J10pLFxuICAgICAgaXNOZXh0OiB0aGlzLl9oYXNDbGFzcyhbJ3N3aXBlci1zbGlkZS1uZXh0JywgJ3N3aXBlci1zbGlkZS1kdXBsaWNhdGUtbmV4dCddKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFzQ2xhc3MoY2xhc3NOYW1lczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gY2xhc3NOYW1lcy5zb21lKChjbGFzc05hbWUpID0+IHRoaXMuX2NsYXNzTmFtZXMuaW5kZXhPZihjbGFzc05hbWUpID49IDApO1xuICB9XG4gIHNsaWRlRGF0YSA9IHtcbiAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgaXNQcmV2OiBmYWxzZSxcbiAgICBpc05leHQ6IGZhbHNlLFxuICAgIGlzVmlzaWJsZTogZmFsc2UsXG4gICAgaXNEdXBsaWNhdGU6IGZhbHNlLFxuICB9O1xuXG4gIHByaXZhdGUgX2NsYXNzTmFtZXM6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7fVxufVxuIl19 \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/swiper.component.js b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/swiper.component.js new file mode 100644 index 0000000..50f2dad --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/swiper.component.js @@ -0,0 +1,1126 @@ +import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewEncapsulation, } from '@angular/core'; +// @ts-ignore +import Swiper from 'swiper'; +import { of, Subject } from 'rxjs'; +import { getParams } from './utils/get-params'; +import { SwiperSlideDirective } from './swiper-slide.directive'; +import { extend, isObject, setProperty, ignoreNgOnChanges, coerceBooleanProperty, isShowEl, } from './utils/utils'; +import { isPlatformBrowser } from '@angular/common'; +import * as i0 from "@angular/core"; +import * as i1 from "@angular/common"; +export class SwiperComponent { + constructor(_ngZone, elementRef, _changeDetectorRef, _platformId) { + this._ngZone = _ngZone; + this.elementRef = elementRef; + this._changeDetectorRef = _changeDetectorRef; + this._platformId = _platformId; + this.slideClass = 'swiper-slide'; + this.wrapperClass = 'swiper-wrapper'; + this.showNavigation = true; + this.showPagination = true; + this.showScrollbar = true; + // prettier-ignore + this.s__beforeBreakpoint = new EventEmitter(); + // prettier-ignore + this.s__containerClasses = new EventEmitter(); + // prettier-ignore + this.s__slideClass = new EventEmitter(); + // prettier-ignore + this.s__swiper = new EventEmitter(); + // prettier-ignore + this.s_activeIndexChange = new EventEmitter(); + // prettier-ignore + this.s_afterInit = new EventEmitter(); + // prettier-ignore + this.s_autoplay = new EventEmitter(); + // prettier-ignore + this.s_autoplayStart = new EventEmitter(); + // prettier-ignore + this.s_autoplayStop = new EventEmitter(); + // prettier-ignore + this.s_beforeDestroy = new EventEmitter(); + // prettier-ignore + this.s_beforeInit = new EventEmitter(); + // prettier-ignore + this.s_beforeLoopFix = new EventEmitter(); + // prettier-ignore + this.s_beforeResize = new EventEmitter(); + // prettier-ignore + this.s_beforeSlideChangeStart = new EventEmitter(); + // prettier-ignore + this.s_beforeTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_breakpoint = new EventEmitter(); + // prettier-ignore + this.s_changeDirection = new EventEmitter(); + // prettier-ignore + this.s_click = new EventEmitter(); + // prettier-ignore + this.s_doubleTap = new EventEmitter(); + // prettier-ignore + this.s_doubleClick = new EventEmitter(); + // prettier-ignore + this.s_destroy = new EventEmitter(); + // prettier-ignore + this.s_fromEdge = new EventEmitter(); + // prettier-ignore + this.s_hashChange = new EventEmitter(); + // prettier-ignore + this.s_hashSet = new EventEmitter(); + // prettier-ignore + this.s_imagesReady = new EventEmitter(); + // prettier-ignore + this.s_init = new EventEmitter(); + // prettier-ignore + this.s_keyPress = new EventEmitter(); + // prettier-ignore + this.s_lazyImageLoad = new EventEmitter(); + // prettier-ignore + this.s_lazyImageReady = new EventEmitter(); + // prettier-ignore + this.s_loopFix = new EventEmitter(); + // prettier-ignore + this.s_momentumBounce = new EventEmitter(); + // prettier-ignore + this.s_navigationHide = new EventEmitter(); + // prettier-ignore + this.s_navigationShow = new EventEmitter(); + // prettier-ignore + this.s_observerUpdate = new EventEmitter(); + // prettier-ignore + this.s_orientationchange = new EventEmitter(); + // prettier-ignore + this.s_paginationHide = new EventEmitter(); + // prettier-ignore + this.s_paginationRender = new EventEmitter(); + // prettier-ignore + this.s_paginationShow = new EventEmitter(); + // prettier-ignore + this.s_paginationUpdate = new EventEmitter(); + // prettier-ignore + this.s_progress = new EventEmitter(); + // prettier-ignore + this.s_reachBeginning = new EventEmitter(); + // prettier-ignore + this.s_reachEnd = new EventEmitter(); + // prettier-ignore + this.s_realIndexChange = new EventEmitter(); + // prettier-ignore + this.s_resize = new EventEmitter(); + // prettier-ignore + this.s_scroll = new EventEmitter(); + // prettier-ignore + this.s_scrollbarDragEnd = new EventEmitter(); + // prettier-ignore + this.s_scrollbarDragMove = new EventEmitter(); + // prettier-ignore + this.s_scrollbarDragStart = new EventEmitter(); + // prettier-ignore + this.s_setTransition = new EventEmitter(); + // prettier-ignore + this.s_setTranslate = new EventEmitter(); + // prettier-ignore + this.s_slideChange = new EventEmitter(); + // prettier-ignore + this.s_slideChangeTransitionEnd = new EventEmitter(); + // prettier-ignore + this.s_slideChangeTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_slideNextTransitionEnd = new EventEmitter(); + // prettier-ignore + this.s_slideNextTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_slidePrevTransitionEnd = new EventEmitter(); + // prettier-ignore + this.s_slidePrevTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_slideResetTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_slideResetTransitionEnd = new EventEmitter(); + // prettier-ignore + this.s_sliderMove = new EventEmitter(); + // prettier-ignore + this.s_sliderFirstMove = new EventEmitter(); + // prettier-ignore + this.s_slidesLengthChange = new EventEmitter(); + // prettier-ignore + this.s_slidesGridLengthChange = new EventEmitter(); + // prettier-ignore + this.s_snapGridLengthChange = new EventEmitter(); + // prettier-ignore + this.s_snapIndexChange = new EventEmitter(); + // prettier-ignore + this.s_tap = new EventEmitter(); + // prettier-ignore + this.s_toEdge = new EventEmitter(); + // prettier-ignore + this.s_touchEnd = new EventEmitter(); + // prettier-ignore + this.s_touchMove = new EventEmitter(); + // prettier-ignore + this.s_touchMoveOpposite = new EventEmitter(); + // prettier-ignore + this.s_touchStart = new EventEmitter(); + // prettier-ignore + this.s_transitionEnd = new EventEmitter(); + // prettier-ignore + this.s_transitionStart = new EventEmitter(); + // prettier-ignore + this.s_update = new EventEmitter(); + // prettier-ignore + this.s_zoomChange = new EventEmitter(); + // prettier-ignore + this.s_swiper = new EventEmitter(); + this.indexChange = new EventEmitter(); + this._activeSlides = new Subject(); + this.containerClasses = 'swiper'; + this.slidesChanges = (val) => { + this.slides = val.map((slide, index) => { + slide.slideIndex = index; + slide.classNames = this.slideClass || ''; + return slide; + }); + if (this.loop && !this.loopedSlides) { + this.calcLoopedSlides(); + } + if (!this.virtual) { + if (this.loopedSlides) { + this.prependSlides = of(this.slides.slice(this.slides.length - this.loopedSlides)); + this.appendSlides = of(this.slides.slice(0, this.loopedSlides)); + } + } + else if (this.swiperRef && this.swiperRef.virtual) { + this._ngZone.runOutsideAngular(() => { + this.swiperRef.virtual.slides = this.slides; + this.swiperRef.virtual.update(true); + }); + } + this._changeDetectorRef.detectChanges(); + }; + this.style = null; + this.updateVirtualSlides = (virtualData) => { + // TODO: type virtualData + if (!this.swiperRef || + (this.currentVirtualData && + this.currentVirtualData.from === virtualData.from && + this.currentVirtualData.to === virtualData.to && + this.currentVirtualData.offset === virtualData.offset)) { + return; + } + this.style = this.swiperRef.isHorizontal() + ? { + [this.swiperRef.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px`, + } + : { + top: `${virtualData.offset}px`, + }; + this.currentVirtualData = virtualData; + this._activeSlides.next(virtualData.slides); + this._ngZone.run(() => { + this._changeDetectorRef.detectChanges(); + }); + this._ngZone.runOutsideAngular(() => { + this.swiperRef.updateSlides(); + this.swiperRef.updateProgress(); + this.swiperRef.updateSlidesClasses(); + if (this.swiperRef.lazy && this.swiperRef.params.lazy['enabled']) { + this.swiperRef.lazy.load(); + } + this.swiperRef.virtual.update(true); + }); + return; + }; + } + set navigation(val) { + var _a, _b, _c; + const currentNext = typeof this._navigation !== 'boolean' && this._navigation !== '' + ? (_a = this._navigation) === null || _a === void 0 ? void 0 : _a.nextEl + : null; + const currentPrev = typeof this._navigation !== 'boolean' && this._navigation !== '' + ? (_b = this._navigation) === null || _b === void 0 ? void 0 : _b.prevEl + : null; + this._navigation = setProperty(val, { + nextEl: currentNext || null, + prevEl: currentPrev || null, + }); + this.showNavigation = !(coerceBooleanProperty(val) !== true || + (this._navigation && + typeof this._navigation !== 'boolean' && + this._navigation.prevEl !== ((_c = this._prevElRef) === null || _c === void 0 ? void 0 : _c.nativeElement) && + (this._navigation.prevEl !== null || this._navigation.nextEl !== null) && + (typeof this._navigation.nextEl === 'string' || + typeof this._navigation.prevEl === 'string' || + typeof this._navigation.nextEl === 'object' || + typeof this._navigation.prevEl === 'object'))); + } + get navigation() { + return this._navigation; + } + set pagination(val) { + var _a; + const current = typeof this._pagination !== 'boolean' && this._pagination !== '' + ? (_a = this._pagination) === null || _a === void 0 ? void 0 : _a.el + : null; + this._pagination = setProperty(val, { + el: current || null, + }); + this.showPagination = isShowEl(val, this._pagination, this._paginationElRef); + } + get pagination() { + return this._pagination; + } + set scrollbar(val) { + var _a; + const current = typeof this._scrollbar !== 'boolean' && this._scrollbar !== '' ? (_a = this._scrollbar) === null || _a === void 0 ? void 0 : _a.el : null; + this._scrollbar = setProperty(val, { + el: current || null, + }); + this.showScrollbar = isShowEl(val, this._scrollbar, this._scrollbarElRef); + } + get scrollbar() { + return this._scrollbar; + } + set virtual(val) { + this._virtual = setProperty(val); + } + get virtual() { + return this._virtual; + } + set index(index) { + console.warn('`[(index)]` prop is deprecated and will be removed in upcoming versions'); + this.setIndex(index); + } + set config(val) { + this.updateSwiper(val); + const { params } = getParams(val); + Object.assign(this, params); + } + set prevElRef(el) { + this._prevElRef = el; + this._setElement(el, this.navigation, 'navigation', 'prevEl'); + } + set nextElRef(el) { + this._nextElRef = el; + this._setElement(el, this.navigation, 'navigation', 'nextEl'); + } + set scrollbarElRef(el) { + this._scrollbarElRef = el; + this._setElement(el, this.scrollbar, 'scrollbar'); + } + set paginationElRef(el) { + this._paginationElRef = el; + this._setElement(el, this.pagination, 'pagination'); + } + get activeSlides() { + if (this.virtual) { + return this._activeSlides; + } + return of(this.slides); + } + get zoomContainerClass() { + return this.zoom && typeof this.zoom !== 'boolean' + ? this.zoom.containerClass + : 'swiper-zoom-container'; + } + _setElement(el, ref, update, key = 'el') { + if (!el || !ref) { + return; + } + if (ref && el.nativeElement) { + if (ref[key] === el.nativeElement) { + return; + } + ref[key] = el.nativeElement; + } + const updateObj = {}; + updateObj[update] = true; + this.updateInitSwiper(updateObj); + } + ngOnInit() { + const { params } = getParams(this); + Object.assign(this, params); + } + ngAfterViewInit() { + this.childrenSlidesInit(); + this.initSwiper(); + this._changeDetectorRef.detectChanges(); + setTimeout(() => { + this.s_swiper.emit(this.swiperRef); + }); + } + childrenSlidesInit() { + this.slidesChanges(this.slidesEl); + this.slidesEl.changes.subscribe(this.slidesChanges); + } + get isSwiperActive() { + return this.swiperRef && !this.swiperRef.destroyed; + } + initSwiper() { + const { params: swiperParams, passedParams } = getParams(this); + Object.assign(this, swiperParams); + this._ngZone.runOutsideAngular(() => { + swiperParams.init = false; + if (!swiperParams.virtual) { + swiperParams.observer = true; + } + swiperParams.onAny = (eventName, ...args) => { + const emitter = this[('s_' + eventName)]; + if (emitter) { + emitter.emit(...args); + } + }; + const _slideClasses = (_, updated) => { + updated.forEach(({ slideEl, classNames }, index) => { + const dataIndex = slideEl.getAttribute('data-swiper-slide-index'); + const slideIndex = dataIndex ? parseInt(dataIndex) : index; + if (this.virtual) { + const virtualSlide = this.slides.find((item) => { + return item.virtualIndex && item.virtualIndex === slideIndex; + }); + if (virtualSlide) { + virtualSlide.classNames = classNames; + return; + } + } + if (this.slides[slideIndex]) { + this.slides[slideIndex].classNames = classNames; + } + }); + this._changeDetectorRef.detectChanges(); + }; + const _containerClasses = (_, classes) => { + setTimeout(() => { + this.containerClasses = classes; + }); + }; + Object.assign(swiperParams.on, { + _containerClasses, + _slideClasses, + }); + const swiperRef = new Swiper(swiperParams); + swiperRef.loopCreate = () => { }; + swiperRef.loopDestroy = () => { }; + if (swiperParams.loop) { + swiperRef.loopedSlides = this.loopedSlides; + } + const isVirtualEnabled = typeof swiperRef.params.virtual !== 'undefined' && + typeof swiperRef.params.virtual !== 'boolean' && + swiperRef.params.virtual.enabled; + if (swiperRef.virtual && isVirtualEnabled) { + swiperRef.virtual.slides = this.slides; + const extendWith = { + cache: false, + slides: this.slides, + renderExternal: this.updateVirtualSlides, + renderExternalUpdate: false, + }; + extend(swiperRef.params.virtual, extendWith); + extend(swiperRef.originalParams.virtual, extendWith); + } + if (isPlatformBrowser(this._platformId)) { + this.swiperRef = swiperRef.init(this.elementRef.nativeElement); + const isEnabled = typeof this.swiperRef.params.virtual !== 'undefined' && + typeof this.swiperRef.params.virtual !== 'boolean' && + this.swiperRef.params.virtual.enabled; + if (this.swiperRef.virtual && isEnabled) { + this.swiperRef.virtual.update(true); + } + this._changeDetectorRef.detectChanges(); + swiperRef.on('slideChange', () => { + this.indexChange.emit(this.swiperRef.realIndex); + }); + } + }); + } + ngOnChanges(changedParams) { + this.updateSwiper(changedParams); + this._changeDetectorRef.detectChanges(); + } + updateInitSwiper(changedParams) { + if (!(changedParams && this.swiperRef && !this.swiperRef.destroyed)) { + return; + } + this._ngZone.runOutsideAngular(() => { + const { params: currentParams, pagination, navigation, scrollbar, virtual, thumbs, } = this.swiperRef; + if (changedParams.pagination) { + if (this.pagination && + typeof this.pagination !== 'boolean' && + this.pagination.el && + pagination && + !pagination.el) { + this.updateParameter('pagination', this.pagination); + pagination.init(); + pagination.render(); + pagination.update(); + } + else { + pagination.destroy(); + pagination.el = null; + } + } + if (changedParams.scrollbar) { + if (this.scrollbar && + typeof this.scrollbar !== 'boolean' && + this.scrollbar.el && + scrollbar && + !scrollbar.el) { + this.updateParameter('scrollbar', this.scrollbar); + scrollbar.init(); + scrollbar.updateSize(); + scrollbar.setTranslate(); + } + else { + scrollbar.destroy(); + scrollbar.el = null; + } + } + if (changedParams.navigation) { + if (this.navigation && + typeof this.navigation !== 'boolean' && + this.navigation.prevEl && + this.navigation.nextEl && + navigation && + !navigation.prevEl && + !navigation.nextEl) { + this.updateParameter('navigation', this.navigation); + navigation.init(); + navigation.update(); + } + else if (navigation.prevEl && navigation.nextEl) { + navigation.destroy(); + navigation.nextEl = null; + navigation.prevEl = null; + } + } + if (changedParams.thumbs && this.thumbs && this.thumbs.swiper) { + this.updateParameter('thumbs', this.thumbs); + const initialized = thumbs.init(); + if (initialized) + thumbs.update(true); + } + if (changedParams.controller && this.controller && this.controller.control) { + this.swiperRef.controller.control = this.controller.control; + } + this.swiperRef.update(); + }); + } + updateSwiper(changedParams) { + this._ngZone.runOutsideAngular(() => { + var _a, _b; + if (changedParams.config) { + return; + } + if (!(changedParams && this.swiperRef && !this.swiperRef.destroyed)) { + return; + } + for (const key in changedParams) { + if (ignoreNgOnChanges.indexOf(key) >= 0) { + continue; + } + const newValue = (_b = (_a = changedParams[key]) === null || _a === void 0 ? void 0 : _a.currentValue) !== null && _b !== void 0 ? _b : changedParams[key]; + this.updateParameter(key, newValue); + } + if (changedParams.allowSlideNext) { + this.swiperRef.allowSlideNext = this.allowSlideNext; + } + if (changedParams.allowSlidePrev) { + this.swiperRef.allowSlidePrev = this.allowSlidePrev; + } + if (changedParams.direction) { + this.swiperRef.changeDirection(this.direction, false); + } + if (changedParams.breakpoints) { + if (this.loop && !this.loopedSlides) { + this.calcLoopedSlides(); + } + this.swiperRef.currentBreakpoint = null; + this.swiperRef.setBreakpoint(); + } + if (changedParams.thumbs || changedParams.controller) { + this.updateInitSwiper(changedParams); + } + this.swiperRef.update(); + }); + } + calcLoopedSlides() { + if (!this.loop) { + return; + } + let slidesPerViewParams = this.slidesPerView; + if (this.breakpoints) { + const breakpoint = Swiper.prototype.getBreakpoint(this.breakpoints); + const breakpointOnlyParams = breakpoint in this.breakpoints ? this.breakpoints[breakpoint] : undefined; + if (breakpointOnlyParams && breakpointOnlyParams.slidesPerView) { + slidesPerViewParams = breakpointOnlyParams.slidesPerView; + } + } + if (slidesPerViewParams === 'auto') { + this.loopedSlides = this.slides.length; + return this.slides.length; + } + let loopedSlides = this.loopedSlides || slidesPerViewParams; + if (!loopedSlides) { + // ? + return; + } + if (this.loopAdditionalSlides) { + loopedSlides += this.loopAdditionalSlides; + } + if (loopedSlides > this.slides.length) { + loopedSlides = this.slides.length; + } + this.loopedSlides = loopedSlides; + return loopedSlides; + } + updateParameter(key, value) { + if (!(this.swiperRef && !this.swiperRef.destroyed)) { + return; + } + const _key = key.replace(/^_/, ''); + const isCurrentParamObj = isObject(this.swiperRef.params[_key]); + if (Object.keys(this.swiperRef.modules).indexOf(_key) >= 0) { + const defaultParams = this.swiperRef.modules[_key].params[_key]; + if (isCurrentParamObj) { + extend(this.swiperRef.params[_key], defaultParams); + } + else { + this.swiperRef.params[_key] = defaultParams; + } + } + if (_key === 'enabled') { + if (value === true) { + this.swiperRef.enable(); + } + else if (value === false) { + this.swiperRef.disable(); + } + return; + } + if (isCurrentParamObj && isObject(value)) { + extend(this.swiperRef.params[_key], value); + } + else { + this.swiperRef.params[_key] = value; + } + } + /** + * @deprecated will be removed in upcoming versions + */ + setIndex(index, speed, silent) { + if (!this.isSwiperActive) { + this.initialSlide = index; + return; + } + if (index === this.swiperRef.activeIndex) { + return; + } + this._ngZone.runOutsideAngular(() => { + if (this.loop) { + this.swiperRef.slideToLoop(index, speed, !silent); + } + else { + this.swiperRef.slideTo(index, speed, !silent); + } + }); + } + ngOnDestroy() { + this._ngZone.runOutsideAngular(() => { + var _a; + (_a = this.swiperRef) === null || _a === void 0 ? void 0 : _a.destroy(true, false); + }); + } +} +SwiperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); +SwiperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.2", type: SwiperComponent, selector: "swiper, [swiper]", inputs: { enabled: "enabled", direction: "direction", touchEventsTarget: "touchEventsTarget", initialSlide: "initialSlide", speed: "speed", cssMode: "cssMode", updateOnWindowResize: "updateOnWindowResize", resizeObserver: "resizeObserver", nested: "nested", focusableElements: "focusableElements", width: "width", height: "height", preventInteractionOnTransition: "preventInteractionOnTransition", userAgent: "userAgent", url: "url", edgeSwipeDetection: "edgeSwipeDetection", edgeSwipeThreshold: "edgeSwipeThreshold", freeMode: "freeMode", autoHeight: "autoHeight", setWrapperSize: "setWrapperSize", virtualTranslate: "virtualTranslate", effect: "effect", breakpoints: "breakpoints", spaceBetween: "spaceBetween", slidesPerView: "slidesPerView", grid: "grid", slidesPerGroup: "slidesPerGroup", slidesPerGroupSkip: "slidesPerGroupSkip", centeredSlides: "centeredSlides", centeredSlidesBounds: "centeredSlidesBounds", slidesOffsetBefore: "slidesOffsetBefore", slidesOffsetAfter: "slidesOffsetAfter", normalizeSlideIndex: "normalizeSlideIndex", centerInsufficientSlides: "centerInsufficientSlides", watchOverflow: "watchOverflow", roundLengths: "roundLengths", touchRatio: "touchRatio", touchAngle: "touchAngle", simulateTouch: "simulateTouch", shortSwipes: "shortSwipes", longSwipes: "longSwipes", longSwipesRatio: "longSwipesRatio", longSwipesMs: "longSwipesMs", followFinger: "followFinger", allowTouchMove: "allowTouchMove", threshold: "threshold", touchMoveStopPropagation: "touchMoveStopPropagation", touchStartPreventDefault: "touchStartPreventDefault", touchStartForcePreventDefault: "touchStartForcePreventDefault", touchReleaseOnEdges: "touchReleaseOnEdges", uniqueNavElements: "uniqueNavElements", resistance: "resistance", resistanceRatio: "resistanceRatio", watchSlidesProgress: "watchSlidesProgress", grabCursor: "grabCursor", preventClicks: "preventClicks", preventClicksPropagation: "preventClicksPropagation", slideToClickedSlide: "slideToClickedSlide", preloadImages: "preloadImages", updateOnImagesReady: "updateOnImagesReady", loop: "loop", loopAdditionalSlides: "loopAdditionalSlides", loopedSlides: "loopedSlides", loopFillGroupWithBlank: "loopFillGroupWithBlank", loopPreventsSlide: "loopPreventsSlide", allowSlidePrev: "allowSlidePrev", allowSlideNext: "allowSlideNext", swipeHandler: "swipeHandler", noSwiping: "noSwiping", noSwipingClass: "noSwipingClass", noSwipingSelector: "noSwipingSelector", passiveListeners: "passiveListeners", containerModifierClass: "containerModifierClass", slideClass: "slideClass", slideBlankClass: "slideBlankClass", slideActiveClass: "slideActiveClass", slideDuplicateActiveClass: "slideDuplicateActiveClass", slideVisibleClass: "slideVisibleClass", slideDuplicateClass: "slideDuplicateClass", slideNextClass: "slideNextClass", slideDuplicateNextClass: "slideDuplicateNextClass", slidePrevClass: "slidePrevClass", slideDuplicatePrevClass: "slideDuplicatePrevClass", wrapperClass: "wrapperClass", runCallbacksOnInit: "runCallbacksOnInit", observeParents: "observeParents", observeSlideChildren: "observeSlideChildren", a11y: "a11y", autoplay: "autoplay", controller: "controller", coverflowEffect: "coverflowEffect", cubeEffect: "cubeEffect", fadeEffect: "fadeEffect", flipEffect: "flipEffect", creativeEffect: "creativeEffect", cardsEffect: "cardsEffect", hashNavigation: "hashNavigation", history: "history", keyboard: "keyboard", lazy: "lazy", mousewheel: "mousewheel", parallax: "parallax", thumbs: "thumbs", zoom: "zoom", class: "class", id: "id", navigation: "navigation", pagination: "pagination", scrollbar: "scrollbar", virtual: "virtual", index: "index", config: "config" }, outputs: { s__beforeBreakpoint: "_beforeBreakpoint", s__containerClasses: "_containerClasses", s__slideClass: "_slideClass", s__swiper: "_swiper", s_activeIndexChange: "activeIndexChange", s_afterInit: "afterInit", s_autoplay: "autoplay", s_autoplayStart: "autoplayStart", s_autoplayStop: "autoplayStop", s_beforeDestroy: "beforeDestroy", s_beforeInit: "beforeInit", s_beforeLoopFix: "beforeLoopFix", s_beforeResize: "beforeResize", s_beforeSlideChangeStart: "beforeSlideChangeStart", s_beforeTransitionStart: "beforeTransitionStart", s_breakpoint: "breakpoint", s_changeDirection: "changeDirection", s_click: "click", s_doubleTap: "doubleTap", s_doubleClick: "doubleClick", s_destroy: "destroy", s_fromEdge: "fromEdge", s_hashChange: "hashChange", s_hashSet: "hashSet", s_imagesReady: "imagesReady", s_init: "init", s_keyPress: "keyPress", s_lazyImageLoad: "lazyImageLoad", s_lazyImageReady: "lazyImageReady", s_loopFix: "loopFix", s_momentumBounce: "momentumBounce", s_navigationHide: "navigationHide", s_navigationShow: "navigationShow", s_observerUpdate: "observerUpdate", s_orientationchange: "orientationchange", s_paginationHide: "paginationHide", s_paginationRender: "paginationRender", s_paginationShow: "paginationShow", s_paginationUpdate: "paginationUpdate", s_progress: "progress", s_reachBeginning: "reachBeginning", s_reachEnd: "reachEnd", s_realIndexChange: "realIndexChange", s_resize: "resize", s_scroll: "scroll", s_scrollbarDragEnd: "scrollbarDragEnd", s_scrollbarDragMove: "scrollbarDragMove", s_scrollbarDragStart: "scrollbarDragStart", s_setTransition: "setTransition", s_setTranslate: "setTranslate", s_slideChange: "slideChange", s_slideChangeTransitionEnd: "slideChangeTransitionEnd", s_slideChangeTransitionStart: "slideChangeTransitionStart", s_slideNextTransitionEnd: "slideNextTransitionEnd", s_slideNextTransitionStart: "slideNextTransitionStart", s_slidePrevTransitionEnd: "slidePrevTransitionEnd", s_slidePrevTransitionStart: "slidePrevTransitionStart", s_slideResetTransitionStart: "slideResetTransitionStart", s_slideResetTransitionEnd: "slideResetTransitionEnd", s_sliderMove: "sliderMove", s_sliderFirstMove: "sliderFirstMove", s_slidesLengthChange: "slidesLengthChange", s_slidesGridLengthChange: "slidesGridLengthChange", s_snapGridLengthChange: "snapGridLengthChange", s_snapIndexChange: "snapIndexChange", s_tap: "tap", s_toEdge: "toEdge", s_touchEnd: "touchEnd", s_touchMove: "touchMove", s_touchMoveOpposite: "touchMoveOpposite", s_touchStart: "touchStart", s_transitionEnd: "transitionEnd", s_transitionStart: "transitionStart", s_update: "update", s_zoomChange: "zoomChange", s_swiper: "swiper", indexChange: "indexChange" }, host: { properties: { "class": "this.containerClasses" } }, queries: [{ propertyName: "slidesEl", predicate: SwiperSlideDirective }], viewQueries: [{ propertyName: "prevElRef", first: true, predicate: ["prevElRef"], descendants: true }, { propertyName: "nextElRef", first: true, predicate: ["nextElRef"], descendants: true }, { propertyName: "scrollbarElRef", first: true, predicate: ["scrollbarElRef"], descendants: true }, { propertyName: "paginationElRef", first: true, predicate: ["paginationElRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "\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", styles: ["\n swiper {\n display: block;\n }\n "], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }], pipes: { "async": i1.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperComponent, decorators: [{ + type: Component, + args: [{ + selector: 'swiper, [swiper]', + templateUrl: './swiper.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + styles: [ + ` + swiper { + display: block; + } + `, + ], + }] + }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: Object, decorators: [{ + type: Inject, + args: [PLATFORM_ID] + }] }]; }, propDecorators: { enabled: [{ + type: Input + }], direction: [{ + type: Input + }], touchEventsTarget: [{ + type: Input + }], initialSlide: [{ + type: Input + }], speed: [{ + type: Input + }], cssMode: [{ + type: Input + }], updateOnWindowResize: [{ + type: Input + }], resizeObserver: [{ + type: Input + }], nested: [{ + type: Input + }], focusableElements: [{ + type: Input + }], width: [{ + type: Input + }], height: [{ + type: Input + }], preventInteractionOnTransition: [{ + type: Input + }], userAgent: [{ + type: Input + }], url: [{ + type: Input + }], edgeSwipeDetection: [{ + type: Input + }], edgeSwipeThreshold: [{ + type: Input + }], freeMode: [{ + type: Input + }], autoHeight: [{ + type: Input + }], setWrapperSize: [{ + type: Input + }], virtualTranslate: [{ + type: Input + }], effect: [{ + type: Input + }], breakpoints: [{ + type: Input + }], spaceBetween: [{ + type: Input + }], slidesPerView: [{ + type: Input + }], grid: [{ + type: Input + }], slidesPerGroup: [{ + type: Input + }], slidesPerGroupSkip: [{ + type: Input + }], centeredSlides: [{ + type: Input + }], centeredSlidesBounds: [{ + type: Input + }], slidesOffsetBefore: [{ + type: Input + }], slidesOffsetAfter: [{ + type: Input + }], normalizeSlideIndex: [{ + type: Input + }], centerInsufficientSlides: [{ + type: Input + }], watchOverflow: [{ + type: Input + }], roundLengths: [{ + type: Input + }], touchRatio: [{ + type: Input + }], touchAngle: [{ + type: Input + }], simulateTouch: [{ + type: Input + }], shortSwipes: [{ + type: Input + }], longSwipes: [{ + type: Input + }], longSwipesRatio: [{ + type: Input + }], longSwipesMs: [{ + type: Input + }], followFinger: [{ + type: Input + }], allowTouchMove: [{ + type: Input + }], threshold: [{ + type: Input + }], touchMoveStopPropagation: [{ + type: Input + }], touchStartPreventDefault: [{ + type: Input + }], touchStartForcePreventDefault: [{ + type: Input + }], touchReleaseOnEdges: [{ + type: Input + }], uniqueNavElements: [{ + type: Input + }], resistance: [{ + type: Input + }], resistanceRatio: [{ + type: Input + }], watchSlidesProgress: [{ + type: Input + }], grabCursor: [{ + type: Input + }], preventClicks: [{ + type: Input + }], preventClicksPropagation: [{ + type: Input + }], slideToClickedSlide: [{ + type: Input + }], preloadImages: [{ + type: Input + }], updateOnImagesReady: [{ + type: Input + }], loop: [{ + type: Input + }], loopAdditionalSlides: [{ + type: Input + }], loopedSlides: [{ + type: Input + }], loopFillGroupWithBlank: [{ + type: Input + }], loopPreventsSlide: [{ + type: Input + }], allowSlidePrev: [{ + type: Input + }], allowSlideNext: [{ + type: Input + }], swipeHandler: [{ + type: Input + }], noSwiping: [{ + type: Input + }], noSwipingClass: [{ + type: Input + }], noSwipingSelector: [{ + type: Input + }], passiveListeners: [{ + type: Input + }], containerModifierClass: [{ + type: Input + }], slideClass: [{ + type: Input + }], slideBlankClass: [{ + type: Input + }], slideActiveClass: [{ + type: Input + }], slideDuplicateActiveClass: [{ + type: Input + }], slideVisibleClass: [{ + type: Input + }], slideDuplicateClass: [{ + type: Input + }], slideNextClass: [{ + type: Input + }], slideDuplicateNextClass: [{ + type: Input + }], slidePrevClass: [{ + type: Input + }], slideDuplicatePrevClass: [{ + type: Input + }], wrapperClass: [{ + type: Input + }], runCallbacksOnInit: [{ + type: Input + }], observeParents: [{ + type: Input + }], observeSlideChildren: [{ + type: Input + }], a11y: [{ + type: Input + }], autoplay: [{ + type: Input + }], controller: [{ + type: Input + }], coverflowEffect: [{ + type: Input + }], cubeEffect: [{ + type: Input + }], fadeEffect: [{ + type: Input + }], flipEffect: [{ + type: Input + }], creativeEffect: [{ + type: Input + }], cardsEffect: [{ + type: Input + }], hashNavigation: [{ + type: Input + }], history: [{ + type: Input + }], keyboard: [{ + type: Input + }], lazy: [{ + type: Input + }], mousewheel: [{ + type: Input + }], parallax: [{ + type: Input + }], thumbs: [{ + type: Input + }], zoom: [{ + type: Input + }], class: [{ + type: Input + }], id: [{ + type: Input + }], navigation: [{ + type: Input + }], pagination: [{ + type: Input + }], scrollbar: [{ + type: Input + }], virtual: [{ + type: Input + }], index: [{ + type: Input + }], config: [{ + type: Input + }], s__beforeBreakpoint: [{ + type: Output, + args: ['_beforeBreakpoint'] + }], s__containerClasses: [{ + type: Output, + args: ['_containerClasses'] + }], s__slideClass: [{ + type: Output, + args: ['_slideClass'] + }], s__swiper: [{ + type: Output, + args: ['_swiper'] + }], s_activeIndexChange: [{ + type: Output, + args: ['activeIndexChange'] + }], s_afterInit: [{ + type: Output, + args: ['afterInit'] + }], s_autoplay: [{ + type: Output, + args: ['autoplay'] + }], s_autoplayStart: [{ + type: Output, + args: ['autoplayStart'] + }], s_autoplayStop: [{ + type: Output, + args: ['autoplayStop'] + }], s_beforeDestroy: [{ + type: Output, + args: ['beforeDestroy'] + }], s_beforeInit: [{ + type: Output, + args: ['beforeInit'] + }], s_beforeLoopFix: [{ + type: Output, + args: ['beforeLoopFix'] + }], s_beforeResize: [{ + type: Output, + args: ['beforeResize'] + }], s_beforeSlideChangeStart: [{ + type: Output, + args: ['beforeSlideChangeStart'] + }], s_beforeTransitionStart: [{ + type: Output, + args: ['beforeTransitionStart'] + }], s_breakpoint: [{ + type: Output, + args: ['breakpoint'] + }], s_changeDirection: [{ + type: Output, + args: ['changeDirection'] + }], s_click: [{ + type: Output, + args: ['click'] + }], s_doubleTap: [{ + type: Output, + args: ['doubleTap'] + }], s_doubleClick: [{ + type: Output, + args: ['doubleClick'] + }], s_destroy: [{ + type: Output, + args: ['destroy'] + }], s_fromEdge: [{ + type: Output, + args: ['fromEdge'] + }], s_hashChange: [{ + type: Output, + args: ['hashChange'] + }], s_hashSet: [{ + type: Output, + args: ['hashSet'] + }], s_imagesReady: [{ + type: Output, + args: ['imagesReady'] + }], s_init: [{ + type: Output, + args: ['init'] + }], s_keyPress: [{ + type: Output, + args: ['keyPress'] + }], s_lazyImageLoad: [{ + type: Output, + args: ['lazyImageLoad'] + }], s_lazyImageReady: [{ + type: Output, + args: ['lazyImageReady'] + }], s_loopFix: [{ + type: Output, + args: ['loopFix'] + }], s_momentumBounce: [{ + type: Output, + args: ['momentumBounce'] + }], s_navigationHide: [{ + type: Output, + args: ['navigationHide'] + }], s_navigationShow: [{ + type: Output, + args: ['navigationShow'] + }], s_observerUpdate: [{ + type: Output, + args: ['observerUpdate'] + }], s_orientationchange: [{ + type: Output, + args: ['orientationchange'] + }], s_paginationHide: [{ + type: Output, + args: ['paginationHide'] + }], s_paginationRender: [{ + type: Output, + args: ['paginationRender'] + }], s_paginationShow: [{ + type: Output, + args: ['paginationShow'] + }], s_paginationUpdate: [{ + type: Output, + args: ['paginationUpdate'] + }], s_progress: [{ + type: Output, + args: ['progress'] + }], s_reachBeginning: [{ + type: Output, + args: ['reachBeginning'] + }], s_reachEnd: [{ + type: Output, + args: ['reachEnd'] + }], s_realIndexChange: [{ + type: Output, + args: ['realIndexChange'] + }], s_resize: [{ + type: Output, + args: ['resize'] + }], s_scroll: [{ + type: Output, + args: ['scroll'] + }], s_scrollbarDragEnd: [{ + type: Output, + args: ['scrollbarDragEnd'] + }], s_scrollbarDragMove: [{ + type: Output, + args: ['scrollbarDragMove'] + }], s_scrollbarDragStart: [{ + type: Output, + args: ['scrollbarDragStart'] + }], s_setTransition: [{ + type: Output, + args: ['setTransition'] + }], s_setTranslate: [{ + type: Output, + args: ['setTranslate'] + }], s_slideChange: [{ + type: Output, + args: ['slideChange'] + }], s_slideChangeTransitionEnd: [{ + type: Output, + args: ['slideChangeTransitionEnd'] + }], s_slideChangeTransitionStart: [{ + type: Output, + args: ['slideChangeTransitionStart'] + }], s_slideNextTransitionEnd: [{ + type: Output, + args: ['slideNextTransitionEnd'] + }], s_slideNextTransitionStart: [{ + type: Output, + args: ['slideNextTransitionStart'] + }], s_slidePrevTransitionEnd: [{ + type: Output, + args: ['slidePrevTransitionEnd'] + }], s_slidePrevTransitionStart: [{ + type: Output, + args: ['slidePrevTransitionStart'] + }], s_slideResetTransitionStart: [{ + type: Output, + args: ['slideResetTransitionStart'] + }], s_slideResetTransitionEnd: [{ + type: Output, + args: ['slideResetTransitionEnd'] + }], s_sliderMove: [{ + type: Output, + args: ['sliderMove'] + }], s_sliderFirstMove: [{ + type: Output, + args: ['sliderFirstMove'] + }], s_slidesLengthChange: [{ + type: Output, + args: ['slidesLengthChange'] + }], s_slidesGridLengthChange: [{ + type: Output, + args: ['slidesGridLengthChange'] + }], s_snapGridLengthChange: [{ + type: Output, + args: ['snapGridLengthChange'] + }], s_snapIndexChange: [{ + type: Output, + args: ['snapIndexChange'] + }], s_tap: [{ + type: Output, + args: ['tap'] + }], s_toEdge: [{ + type: Output, + args: ['toEdge'] + }], s_touchEnd: [{ + type: Output, + args: ['touchEnd'] + }], s_touchMove: [{ + type: Output, + args: ['touchMove'] + }], s_touchMoveOpposite: [{ + type: Output, + args: ['touchMoveOpposite'] + }], s_touchStart: [{ + type: Output, + args: ['touchStart'] + }], s_transitionEnd: [{ + type: Output, + args: ['transitionEnd'] + }], s_transitionStart: [{ + type: Output, + args: ['transitionStart'] + }], s_update: [{ + type: Output, + args: ['update'] + }], s_zoomChange: [{ + type: Output, + args: ['zoomChange'] + }], s_swiper: [{ + type: Output, + args: ['swiper'] + }], indexChange: [{ + type: Output + }], prevElRef: [{ + type: ViewChild, + args: ['prevElRef', { static: false }] + }], nextElRef: [{ + type: ViewChild, + args: ['nextElRef', { static: false }] + }], scrollbarElRef: [{ + type: ViewChild, + args: ['scrollbarElRef', { static: false }] + }], paginationElRef: [{ + type: ViewChild, + args: ['paginationElRef', { static: false }] + }], slidesEl: [{ + type: ContentChildren, + args: [SwiperSlideDirective, { descendants: false, emitDistinctChangesOnly: true }] + }], containerClasses: [{ + type: HostBinding, + args: ['class'] + }] } }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hbmd1bGFyL3NyYy9zd2lwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2FuZ3VsYXIvc3JjL3N3aXBlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixXQUFXLEVBR1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixhQUFhO0FBQ2IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFTdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQWNwRCxNQUFNLE9BQU8sZUFBZTtJQTBZMUIsWUFDVSxPQUFlLEVBQ2YsVUFBc0IsRUFDdEIsa0JBQXFDLEVBQ2hCLFdBQW1CO1FBSHhDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBbUI7UUFDaEIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFwVXpDLGVBQVUsR0FBZ0MsY0FBYyxDQUFDO1FBVXpELGlCQUFZLEdBQWtD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RTtnQkFPckMsU0FBUztzQkFEWixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT3JDLGNBQWM7c0JBRGpCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU8xQyxlQUFlO3NCQURsQixTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFPL0MsUUFBUTtzQkFEUCxlQUFlO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUU7Z0JBdUJ0RSxnQkFBZ0I7c0JBQXJDLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFBMQVRGT1JNX0lELFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IFN3aXBlciBmcm9tICdzd2lwZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGdldFBhcmFtcyB9IGZyb20gJy4vdXRpbHMvZ2V0LXBhcmFtcyc7XG5pbXBvcnQgeyBTd2lwZXJTbGlkZURpcmVjdGl2ZSB9IGZyb20gJy4vc3dpcGVyLXNsaWRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBleHRlbmQsXG4gIGlzT2JqZWN0LFxuICBzZXRQcm9wZXJ0eSxcbiAgaWdub3JlTmdPbkNoYW5nZXMsXG4gIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSxcbiAgaXNTaG93RWwsXG59IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHtcbiAgU3dpcGVyT3B0aW9ucyxcbiAgU3dpcGVyRXZlbnRzLFxuICBOYXZpZ2F0aW9uT3B0aW9ucyxcbiAgUGFnaW5hdGlvbk9wdGlvbnMsXG4gIFNjcm9sbGJhck9wdGlvbnMsXG4gIFZpcnR1YWxPcHRpb25zLFxufSBmcm9tICdzd2lwZXIvdHlwZXMnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3dpcGVyLCBbc3dpcGVyXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zd2lwZXIuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgc3dpcGVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU3dpcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZW5hYmxlZDogU3dpcGVyT3B0aW9uc1snZW5hYmxlZCddO1xuICBASW5wdXQoKSBkaXJlY3Rpb246IFN3aXBlck9wdGlvbnNbJ2RpcmVjdGlvbiddO1xuICBASW5wdXQoKSB0b3VjaEV2ZW50c1RhcmdldDogU3dpcGVyT3B0aW9uc1sndG91Y2hFdmVudHNUYXJnZXQnXTtcbiAgQElucHV0KCkgaW5pdGlhbFNsaWRlOiBTd2lwZXJPcHRpb25zWydpbml0aWFsU2xpZGUnXTtcbiAgQElucHV0KCkgc3BlZWQ6IFN3aXBlck9wdGlvbnNbJ3NwZWVkJ107XG4gIEBJbnB1dCgpIGNzc01vZGU6IFN3aXBlck9wdGlvbnNbJ2Nzc01vZGUnXTtcbiAgQElucHV0KCkgdXBkYXRlT25XaW5kb3dSZXNpemU6IFN3aXBlck9wdGlvbnNbJ3VwZGF0ZU9uV2luZG93UmVzaXplJ107XG4gIEBJbnB1dCgpIHJlc2l6ZU9ic2VydmVyOiBTd2lwZXJPcHRpb25zWydyZXNpemVPYnNlcnZlciddO1xuICBASW5wdXQoKSBuZXN0ZWQ6IFN3aXBlck9wdGlvbnNbJ25lc3RlZCddO1xuICBASW5wdXQoKSBmb2N1c2FibGVFbGVtZW50czogU3dpcGVyT3B0aW9uc1snZm9jdXNhYmxlRWxlbWVudHMnXTtcbiAgQElucHV0KCkgd2lkdGg6IFN3aXBlck9wdGlvbnNbJ3dpZHRoJ107XG4gIEBJbnB1dCgpIGhlaWdodDogU3dpcGVyT3B0aW9uc1snaGVpZ2h0J107XG4gIEBJbnB1dCgpIHByZXZlbnRJbnRlcmFjdGlvbk9uVHJhbnNpdGlvbjogU3dpcGVyT3B0aW9uc1sncHJldmVudEludGVyYWN0aW9uT25UcmFuc2l0aW9uJ107XG4gIEBJbnB1dCgpIHVzZXJBZ2VudDogU3dpcGVyT3B0aW9uc1sndXNlckFnZW50J107XG4gIEBJbnB1dCgpIHVybDogU3dpcGVyT3B0aW9uc1sndXJsJ107XG4gIEBJbnB1dCgpIGVkZ2VTd2lwZURldGVjdGlvbjogYm9vbGVhbiB8IHN0cmluZztcbiAgQElucHV0KCkgZWRnZVN3aXBlVGhyZXNob2xkOiBudW1iZXI7XG4gIEBJbnB1dCgpIGZyZWVNb2RlOiBTd2lwZXJPcHRpb25zWydmcmVlTW9kZSddO1xuICBASW5wdXQoKSBhdXRvSGVpZ2h0OiBTd2lwZXJPcHRpb25zWydhdXRvSGVpZ2h0J107XG4gIEBJbnB1dCgpIHNldFdyYXBwZXJTaXplOiBTd2lwZXJPcHRpb25zWydzZXRXcmFwcGVyU2l6ZSddO1xuICBASW5wdXQoKSB2aXJ0dWFsVHJhbnNsYXRlOiBTd2lwZXJPcHRpb25zWyd2aXJ0dWFsVHJhbnNsYXRlJ107XG4gIEBJbnB1dCgpIGVmZmVjdDogU3dpcGVyT3B0aW9uc1snZWZmZWN0J107XG4gIEBJbnB1dCgpIGJyZWFrcG9pbnRzOiBTd2lwZXJPcHRpb25zWydicmVha3BvaW50cyddO1xuICBASW5wdXQoKSBzcGFjZUJldHdlZW46IFN3aXBlck9wdGlvbnNbJ3NwYWNlQmV0d2VlbiddO1xuICBASW5wdXQoKSBzbGlkZXNQZXJWaWV3OiBTd2lwZXJPcHRpb25zWydzbGlkZXNQZXJWaWV3J107XG4gIEBJbnB1dCgpIGdyaWQ6IFN3aXBlck9wdGlvbnNbJ2dyaWQnXTtcbiAgQElucHV0KCkgc2xpZGVzUGVyR3JvdXA6IFN3aXBlck9wdGlvbnNbJ3NsaWRlc1Blckdyb3VwJ107XG4gIEBJbnB1dCgpIHNsaWRlc1Blckdyb3VwU2tpcDogU3dpcGVyT3B0aW9uc1snc2xpZGVzUGVyR3JvdXBTa2lwJ107XG4gIEBJbnB1dCgpIGNlbnRlcmVkU2xpZGVzOiBTd2lwZXJPcHRpb25zWydjZW50ZXJlZFNsaWRlcyddO1xuICBASW5wdXQoKSBjZW50ZXJlZFNsaWRlc0JvdW5kczogU3dpcGVyT3B0aW9uc1snY2VudGVyZWRTbGlkZXNCb3VuZHMnXTtcbiAgQElucHV0KCkgc2xpZGVzT2Zmc2V0QmVmb3JlOiBTd2lwZXJPcHRpb25zWydzbGlkZXNPZmZzZXRCZWZvcmUnXTtcbiAgQElucHV0KCkgc2xpZGVzT2Zmc2V0QWZ0ZXI6IFN3aXBlck9wdGlvbnNbJ3NsaWRlc09mZnNldEFmdGVyJ107XG4gIEBJbnB1dCgpIG5vcm1hbGl6ZVNsaWRlSW5kZXg6IFN3aXBlck9wdGlvbnNbJ25vcm1hbGl6ZVNsaWRlSW5kZXgnXTtcbiAgQElucHV0KCkgY2VudGVySW5zdWZmaWNpZW50U2xpZGVzOiBTd2lwZXJPcHRpb25zWydjZW50ZXJJbnN1ZmZpY2llbnRTbGlkZXMnXTtcbiAgQElucHV0KCkgd2F0Y2hPdmVyZmxvdzogU3dpcGVyT3B0aW9uc1snd2F0Y2hPdmVyZmxvdyddO1xuICBASW5wdXQoKSByb3VuZExlbmd0aHM6IFN3aXBlck9wdGlvbnNbJ3JvdW5kTGVuZ3RocyddO1xuICBASW5wdXQoKSB0b3VjaFJhdGlvOiBTd2lwZXJPcHRpb25zWyd0b3VjaFJhdGlvJ107XG4gIEBJbnB1dCgpIHRvdWNoQW5nbGU6IFN3aXBlck9wdGlvbnNbJ3RvdWNoQW5nbGUnXTtcbiAgQElucHV0KCkgc2ltdWxhdGVUb3VjaDogU3dpcGVyT3B0aW9uc1snc2ltdWxhdGVUb3VjaCddO1xuICBASW5wdXQoKSBzaG9ydFN3aXBlczogU3dpcGVyT3B0aW9uc1snc2hvcnRTd2lwZXMnXTtcbiAgQElucHV0KCkgbG9uZ1N3aXBlczogU3dpcGVyT3B0aW9uc1snbG9uZ1N3aXBlcyddO1xuICBASW5wdXQoKSBsb25nU3dpcGVzUmF0aW86IFN3aXBlck9wdGlvbnNbJ2xvbmdTd2lwZXNSYXRpbyddO1xuICBASW5wdXQoKSBsb25nU3dpcGVzTXM6IFN3aXBlck9wdGlvbnNbJ2xvbmdTd2lwZXNNcyddO1xuICBASW5wdXQoKSBmb2xsb3dGaW5nZXI6IFN3aXBlck9wdGlvbnNbJ2ZvbGxvd0ZpbmdlciddO1xuICBASW5wdXQoKSBhbGxvd1RvdWNoTW92ZTogU3dpcGVyT3B0aW9uc1snYWxsb3dUb3VjaE1vdmUnXTtcbiAgQElucHV0KCkgdGhyZXNob2xkOiBTd2lwZXJPcHRpb25zWyd0aHJlc2hvbGQnXTtcbiAgQElucHV0KCkgdG91Y2hNb3ZlU3RvcFByb3BhZ2F0aW9uOiBTd2lwZXJPcHRpb25zWyd0b3VjaE1vdmVTdG9wUHJvcGFnYXRpb24nXTtcbiAgQElucHV0KCkgdG91Y2hTdGFydFByZXZlbnREZWZhdWx0OiBTd2lwZXJPcHRpb25zWyd0b3VjaFN0YXJ0UHJldmVudERlZmF1bHQnXTtcbiAgQElucHV0KCkgdG91Y2hTdGFydEZvcmNlUHJldmVudERlZmF1bHQ6IFN3aXBlck9wdGlvbnNbJ3RvdWNoU3RhcnRGb3JjZVByZXZlbnREZWZhdWx0J107XG4gIEBJbnB1dCgpIHRvdWNoUmVsZWFzZU9uRWRnZXM6IFN3aXBlck9wdGlvbnNbJ3RvdWNoUmVsZWFzZU9uRWRnZXMnXTtcbiAgQElucHV0KCkgdW5pcXVlTmF2RWxlbWVudHM6IFN3aXBlck9wdGlvbnNbJ3VuaXF1ZU5hdkVsZW1lbnRzJ107XG4gIEBJbnB1dCgpIHJlc2lzdGFuY2U6IFN3aXBlck9wdGlvbnNbJ3Jlc2lzdGFuY2UnXTtcbiAgQElucHV0KCkgcmVzaXN0YW5jZVJhdGlvOiBTd2lwZXJPcHRpb25zWydyZXNpc3RhbmNlUmF0aW8nXTtcbiAgQElucHV0KCkgd2F0Y2hTbGlkZXNQcm9ncmVzczogU3dpcGVyT3B0aW9uc1snd2F0Y2hTbGlkZXNQcm9ncmVzcyddO1xuICBASW5wdXQoKSBncmFiQ3Vyc29yOiBTd2lwZXJPcHRpb25zWydncmFiQ3Vyc29yJ107XG4gIEBJbnB1dCgpIHByZXZlbnRDbGlja3M6IFN3aXBlck9wdGlvbnNbJ3ByZXZlbnRDbGlja3MnXTtcbiAgQElucHV0KCkgcHJldmVudENsaWNrc1Byb3BhZ2F0aW9uOiBTd2lwZXJPcHRpb25zWydwcmV2ZW50Q2xpY2tzUHJvcGFnYXRpb24nXTtcbiAgQElucHV0KCkgc2xpZGVUb0NsaWNrZWRTbGlkZTogU3dpcGVyT3B0aW9uc1snc2xpZGVUb0NsaWNrZWRTbGlkZSddO1xuICBASW5wdXQoKSBwcmVsb2FkSW1hZ2VzOiBTd2lwZXJPcHRpb25zWydwcmVsb2FkSW1hZ2VzJ107XG4gIEBJbnB1dCgpIHVwZGF0ZU9uSW1hZ2VzUmVhZHk6IFN3aXBlck9wdGlvbnNbJ3VwZGF0ZU9uSW1hZ2VzUmVhZHknXTtcbiAgQElucHV0KCkgbG9vcDogU3dpcGVyT3B0aW9uc1snbG9vcCddO1xuICBASW5wdXQoKSBsb29wQWRkaXRpb25hbFNsaWRlczogU3dpcGVyT3B0aW9uc1snbG9vcEFkZGl0aW9uYWxTbGlkZXMnXTtcbiAgQElucHV0KCkgbG9vcGVkU2xpZGVzOiBTd2lwZXJPcHRpb25zWydsb29wZWRTbGlkZXMnXTtcbiAgQElucHV0KCkgbG9vcEZpbGxHcm91cFdpdGhCbGFuazogU3dpcGVyT3B0aW9uc1snbG9vcEZpbGxHcm91cFdpdGhCbGFuayddO1xuICBASW5wdXQoKSBsb29wUHJldmVudHNTbGlkZTogU3dpcGVyT3B0aW9uc1snbG9vcFByZXZlbnRzU2xpZGUnXTtcbiAgQElucHV0KCkgYWxsb3dTbGlkZVByZXY6IFN3aXBlck9wdGlvbnNbJ2FsbG93U2xpZGVQcmV2J107XG4gIEBJbnB1dCgpIGFsbG93U2xpZGVOZXh0OiBTd2lwZXJPcHRpb25zWydhbGxvd1NsaWRlTmV4dCddO1xuICBASW5wdXQoKSBzd2lwZUhhbmRsZXI6IFN3aXBlck9wdGlvbnNbJ3N3aXBlSGFuZGxlciddO1xuICBASW5wdXQoKSBub1N3aXBpbmc6IFN3aXBlck9wdGlvbnNbJ25vU3dpcGluZyddO1xuICBASW5wdXQoKSBub1N3aXBpbmdDbGFzczogU3dpcGVyT3B0aW9uc1snbm9Td2lwaW5nQ2xhc3MnXTtcbiAgQElucHV0KCkgbm9Td2lwaW5nU2VsZWN0b3I6IFN3aXBlck9wdGlvbnNbJ25vU3dpcGluZ1NlbGVjdG9yJ107XG4gIEBJbnB1dCgpIHBhc3NpdmVMaXN0ZW5lcnM6IFN3aXBlck9wdGlvbnNbJ3Bhc3NpdmVMaXN0ZW5lcnMnXTtcbiAgQElucHV0KCkgY29udGFpbmVyTW9kaWZpZXJDbGFzczogU3dpcGVyT3B0aW9uc1snY29udGFpbmVyTW9kaWZpZXJDbGFzcyddO1xuICBASW5wdXQoKSBzbGlkZUNsYXNzOiBTd2lwZXJPcHRpb25zWydzbGlkZUNsYXNzJ10gPSAnc3dpcGVyLXNsaWRlJztcbiAgQElucHV0KCkgc2xpZGVCbGFua0NsYXNzOiBTd2lwZXJPcHRpb25zWydzbGlkZUJsYW5rQ2xhc3MnXTtcbiAgQElucHV0KCkgc2xpZGVBY3RpdmVDbGFzczogU3dpcGVyT3B0aW9uc1snc2xpZGVBY3RpdmVDbGFzcyddO1xuICBASW5wdXQoKSBzbGlkZUR1cGxpY2F0ZUFjdGl2ZUNsYXNzOiBTd2lwZXJPcHRpb25zWydzbGlkZUR1cGxpY2F0ZUFjdGl2ZUNsYXNzJ107XG4gIEBJbnB1dCgpIHNsaWRlVmlzaWJsZUNsYXNzOiBTd2lwZXJPcHRpb25zWydzbGlkZVZpc2libGVDbGFzcyddO1xuICBASW5wdXQoKSBzbGlkZUR1cGxpY2F0ZUNsYXNzOiBTd2lwZXJPcHRpb25zWydzbGlkZUR1cGxpY2F0ZUNsYXNzJ107XG4gIEBJbnB1dCgpIHNsaWRlTmV4dENsYXNzOiBTd2lwZXJPcHRpb25zWydzbGlkZU5leHRDbGFzcyddO1xuICBASW5wdXQoKSBzbGlkZUR1cGxpY2F0ZU5leHRDbGFzczogU3dpcGVyT3B0aW9uc1snc2xpZGVEdXBsaWNhdGVOZXh0Q2xhc3MnXTtcbiAgQElucHV0KCkgc2xpZGVQcmV2Q2xhc3M6IFN3aXBlck9wdGlvbnNbJ3NsaWRlUHJldkNsYXNzJ107XG4gIEBJbnB1dCgpIHNsaWRlRHVwbGljYXRlUHJldkNsYXNzOiBTd2lwZXJPcHRpb25zWydzbGlkZUR1cGxpY2F0ZVByZXZDbGFzcyddO1xuICBASW5wdXQoKSB3cmFwcGVyQ2xhc3M6IFN3aXBlck9wdGlvbnNbJ3dyYXBwZXJDbGFzcyddID0gJ3N3aXBlci13cmFwcGVyJztcbiAgQElucHV0KCkgcnVuQ2FsbGJhY2tzT25Jbml0OiBTd2lwZXJPcHRpb25zWydydW5DYWxsYmFja3NPbkluaXQnXTtcbiAgQElucHV0KCkgb2JzZXJ2ZVBhcmVudHM6IFN3aXBlck9wdGlvbnNbJ29ic2VydmVQYXJlbnRzJ107XG4gIEBJbnB1dCgpIG9ic2VydmVTbGlkZUNoaWxkcmVuOiBTd2lwZXJPcHRpb25zWydvYnNlcnZlU2xpZGVDaGlsZHJlbiddO1xuICBASW5wdXQoKSBhMTF5OiBTd2lwZXJPcHRpb25zWydhMTF5J107XG4gIEBJbnB1dCgpIGF1dG9wbGF5OiBTd2lwZXJPcHRpb25zWydhdXRvcGxheSddO1xuICBASW5wdXQoKSBjb250cm9sbGVyOiBTd2lwZXJPcHRpb25zWydjb250cm9sbGVyJ107XG4gIEBJbnB1dCgpIGNvdmVyZmxvd0VmZmVjdDogU3dpcGVyT3B0aW9uc1snY292ZXJmbG93RWZmZWN0J107XG4gIEBJbnB1dCgpIGN1YmVFZmZlY3Q6IFN3aXBlck9wdGlvbnNbJ2N1YmVFZmZlY3QnXTtcbiAgQElucHV0KCkgZmFkZUVmZmVjdDogU3dpcGVyT3B0aW9uc1snZmFkZUVmZmVjdCddO1xuICBASW5wdXQoKSBmbGlwRWZmZWN0OiBTd2lwZXJPcHRpb25zWydmbGlwRWZmZWN0J107XG4gIEBJbnB1dCgpIGNyZWF0aXZlRWZmZWN0OiBTd2lwZXJPcHRpb25zWydjcmVhdGl2ZUVmZmVjdCddO1xuICBASW5wdXQoKSBjYXJkc0VmZmVjdDogU3dpcGVyT3B0aW9uc1snY2FyZHNFZmZlY3QnXTtcbiAgQElucHV0KCkgaGFzaE5hdmlnYXRpb246IFN3aXBlck9wdGlvbnNbJ2hhc2hOYXZpZ2F0aW9uJ107XG4gIEBJbnB1dCgpIGhpc3Rvcnk6IFN3aXBlck9wdGlvbnNbJ2hpc3RvcnknXTtcbiAgQElucHV0KCkga2V5Ym9hcmQ6IFN3aXBlck9wdGlvbnNbJ2tleWJvYXJkJ107XG4gIEBJbnB1dCgpIGxhenk6IFN3aXBlck9wdGlvbnNbJ2xhenknXTtcbiAgQElucHV0KCkgbW91c2V3aGVlbDogU3dpcGVyT3B0aW9uc1snbW91c2V3aGVlbCddO1xuICBASW5wdXQoKSBwYXJhbGxheDogU3dpcGVyT3B0aW9uc1sncGFyYWxsYXgnXTtcbiAgQElucHV0KCkgdGh1bWJzOiBTd2lwZXJPcHRpb25zWyd0aHVtYnMnXTtcbiAgQElucHV0KCkgem9vbTogU3dpcGVyT3B0aW9uc1snem9vbSddO1xuICBASW5wdXQoKSBjbGFzczogc3RyaW5nO1xuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuICBASW5wdXQoKVxuICBzZXQgbmF2aWdhdGlvbih2YWwpIHtcbiAgICBjb25zdCBjdXJyZW50TmV4dCA9XG4gICAgICB0eXBlb2YgdGhpcy5fbmF2aWdhdGlvbiAhPT0gJ2Jvb2xlYW4nICYmIHRoaXMuX25hdmlnYXRpb24gIT09ICcnXG4gICAgICAgID8gdGhpcy5fbmF2aWdhdGlvbj8ubmV4dEVsXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBjdXJyZW50UHJldiA9XG4gICAgICB0eXBlb2YgdGhpcy5fbmF2aWdhdGlvbiAhPT0gJ2Jvb2xlYW4nICYmIHRoaXMuX25hdmlnYXRpb24gIT09ICcnXG4gICAgICAgID8gdGhpcy5fbmF2aWdhdGlvbj8ucHJldkVsXG4gICAgICAgIDogbnVsbDtcbiAgICB0aGlzLl9uYXZpZ2F0aW9uID0gc2V0UHJvcGVydHkodmFsLCB7XG4gICAgICBuZXh0RWw6IGN1cnJlbnROZXh0IHx8IG51bGwsXG4gICAgICBwcmV2RWw6IGN1cnJlbnRQcmV2IHx8IG51bGwsXG4gICAgfSk7XG4gICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9ICEoXG4gICAgICBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsKSAhPT0gdHJ1ZSB8fFxuICAgICAgKHRoaXMuX25hdmlnYXRpb24gJiZcbiAgICAgICAgdHlwZW9mIHRoaXMuX25hdmlnYXRpb24gIT09ICdib29sZWFuJyAmJlxuICAgICAgICB0aGlzLl9uYXZpZ2F0aW9uLnByZXZFbCAhPT0gdGhpcy5fcHJldkVsUmVmPy5uYXRpdmVFbGVtZW50ICYmXG4gICAgICAgICh0aGlzLl9uYXZpZ2F0aW9uLnByZXZFbCAhPT0gbnVsbCB8fCB0aGlzLl9uYXZpZ2F0aW9uLm5leHRFbCAhPT0gbnVsbCkgJiZcbiAgICAgICAgKHR5cGVvZiB0aGlzLl9uYXZpZ2F0aW9uLm5leHRFbCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICB0eXBlb2YgdGhpcy5fbmF2aWdhdGlvbi5wcmV2RWwgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgdHlwZW9mIHRoaXMuX25hdmlnYXRpb24ubmV4dEVsID09PSAnb2JqZWN0JyB8fFxuICAgICAgICAgIHR5cGVvZiB0aGlzLl9uYXZpZ2F0aW9uLnByZXZFbCA9PT0gJ29iamVjdCcpKVxuICAgICk7XG4gIH1cbiAgZ2V0IG5hdmlnYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb247XG4gIH1cbiAgcHJpdmF0ZSBfbmF2aWdhdGlvbjogTmF2aWdhdGlvbk9wdGlvbnMgfCBib29sZWFuIHwgJyc7XG4gIHNob3dOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzZXQgcGFnaW5hdGlvbih2YWwpIHtcbiAgICBjb25zdCBjdXJyZW50ID1cbiAgICAgIHR5cGVvZiB0aGlzLl9wYWdpbmF0aW9uICE9PSAnYm9vbGVhbicgJiYgdGhpcy5fcGFnaW5hdGlvbiAhPT0gJydcbiAgICAgICAgPyB0aGlzLl9wYWdpbmF0aW9uPy5lbFxuICAgICAgICA6IG51bGw7XG4gICAgdGhpcy5fcGFnaW5hdGlvbiA9IHNldFByb3BlcnR5KHZhbCwge1xuICAgICAgZWw6IGN1cnJlbnQgfHwgbnVsbCxcbiAgICB9KTtcbiAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gaXNTaG93RWwodmFsLCB0aGlzLl9wYWdpbmF0aW9uLCB0aGlzLl9wYWdpbmF0aW9uRWxSZWYpO1xuICB9XG4gIGdldCBwYWdpbmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdpbmF0aW9uO1xuICB9XG4gIHByaXZhdGUgX3BhZ2luYXRpb246IFBhZ2luYXRpb25PcHRpb25zIHwgYm9vbGVhbiB8ICcnO1xuICBzaG93UGFnaW5hdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2V0IHNjcm9sbGJhcih2YWwpIHtcbiAgICBjb25zdCBjdXJyZW50ID1cbiAgICAgIHR5cGVvZiB0aGlzLl9zY3JvbGxiYXIgIT09ICdib29sZWFuJyAmJiB0aGlzLl9zY3JvbGxiYXIgIT09ICcnID8gdGhpcy5fc2Nyb2xsYmFyPy5lbCA6IG51bGw7XG4gICAgdGhpcy5fc2Nyb2xsYmFyID0gc2V0UHJvcGVydHkodmFsLCB7XG4gICAgICBlbDogY3VycmVudCB8fCBudWxsLFxuICAgIH0pO1xuICAgIHRoaXMuc2hvd1Njcm9sbGJhciA9IGlzU2hvd0VsKHZhbCwgdGhpcy5fc2Nyb2xsYmFyLCB0aGlzLl9zY3JvbGxiYXJFbFJlZik7XG4gIH1cbiAgZ2V0IHNjcm9sbGJhcigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2Nyb2xsYmFyO1xuICB9XG4gIHByaXZhdGUgX3Njcm9sbGJhcjogU2Nyb2xsYmFyT3B0aW9ucyB8IGJvb2xlYW4gfCAnJztcbiAgc2hvd1Njcm9sbGJhcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2V0IHZpcnR1YWwodmFsKSB7XG4gICAgdGhpcy5fdmlydHVhbCA9IHNldFByb3BlcnR5KHZhbCk7XG4gIH1cbiAgZ2V0IHZpcnR1YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpcnR1YWw7XG4gIH1cbiAgcHJpdmF0ZSBfdmlydHVhbDogVmlydHVhbE9wdGlvbnMgfCBib29sZWFuIHwgJyc7XG5cbiAgQElucHV0KClcbiAgc2V0IGluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zb2xlLndhcm4oJ2BbKGluZGV4KV1gIHByb3AgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHVwY29taW5nIHZlcnNpb25zJyk7XG4gICAgdGhpcy5zZXRJbmRleChpbmRleCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGNvbmZpZyh2YWw6IFN3aXBlck9wdGlvbnMpIHtcbiAgICB0aGlzLnVwZGF0ZVN3aXBlcih2YWwpO1xuICAgIGNvbnN0IHsgcGFyYW1zIH0gPSBnZXRQYXJhbXModmFsKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIHBhcmFtcyk7XG4gIH1cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ19iZWZvcmVCcmVha3BvaW50Jykgc19fYmVmb3JlQnJlYWtwb2ludDogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snX2JlZm9yZUJyZWFrcG9pbnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ19jb250YWluZXJDbGFzc2VzJykgc19fY29udGFpbmVyQ2xhc3NlczogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snX2NvbnRhaW5lckNsYXNzZXMnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ19zbGlkZUNsYXNzJykgc19fc2xpZGVDbGFzczogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snX3NsaWRlQ2xhc3MnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ19zd2lwZXInKSBzX19zd2lwZXI6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ19zd2lwZXInXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2FjdGl2ZUluZGV4Q2hhbmdlJykgc19hY3RpdmVJbmRleENoYW5nZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snYWN0aXZlSW5kZXhDaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2FmdGVySW5pdCcpIHNfYWZ0ZXJJbml0OiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydhZnRlckluaXQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2F1dG9wbGF5Jykgc19hdXRvcGxheTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snYXV0b3BsYXknXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2F1dG9wbGF5U3RhcnQnKSBzX2F1dG9wbGF5U3RhcnQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2F1dG9wbGF5U3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2F1dG9wbGF5U3RvcCcpIHNfYXV0b3BsYXlTdG9wOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydhdXRvcGxheVN0b3AnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2JlZm9yZURlc3Ryb3knKSBzX2JlZm9yZURlc3Ryb3k6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2JlZm9yZURlc3Ryb3knXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2JlZm9yZUluaXQnKSBzX2JlZm9yZUluaXQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2JlZm9yZUluaXQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2JlZm9yZUxvb3BGaXgnKSBzX2JlZm9yZUxvb3BGaXg6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2JlZm9yZUxvb3BGaXgnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2JlZm9yZVJlc2l6ZScpIHNfYmVmb3JlUmVzaXplOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydiZWZvcmVSZXNpemUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2JlZm9yZVNsaWRlQ2hhbmdlU3RhcnQnKSBzX2JlZm9yZVNsaWRlQ2hhbmdlU3RhcnQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2JlZm9yZVNsaWRlQ2hhbmdlU3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2JlZm9yZVRyYW5zaXRpb25TdGFydCcpIHNfYmVmb3JlVHJhbnNpdGlvblN0YXJ0OiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydiZWZvcmVUcmFuc2l0aW9uU3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2JyZWFrcG9pbnQnKSBzX2JyZWFrcG9pbnQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2JyZWFrcG9pbnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2NoYW5nZURpcmVjdGlvbicpIHNfY2hhbmdlRGlyZWN0aW9uOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydjaGFuZ2VEaXJlY3Rpb24nXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2NsaWNrJykgc19jbGljazogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snY2xpY2snXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2RvdWJsZVRhcCcpIHNfZG91YmxlVGFwOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydkb3VibGVUYXAnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2RvdWJsZUNsaWNrJykgc19kb3VibGVDbGljazogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snZG91YmxlQ2xpY2snXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2Rlc3Ryb3knKSBzX2Rlc3Ryb3k6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2Rlc3Ryb3knXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2Zyb21FZGdlJykgc19mcm9tRWRnZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snZnJvbUVkZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2hhc2hDaGFuZ2UnKSBzX2hhc2hDaGFuZ2U6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2hhc2hDaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2hhc2hTZXQnKSBzX2hhc2hTZXQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2hhc2hTZXQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2ltYWdlc1JlYWR5Jykgc19pbWFnZXNSZWFkeTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snaW1hZ2VzUmVhZHknXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2luaXQnKSBzX2luaXQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2luaXQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2tleVByZXNzJykgc19rZXlQcmVzczogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1sna2V5UHJlc3MnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2xhenlJbWFnZUxvYWQnKSBzX2xhenlJbWFnZUxvYWQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2xhenlJbWFnZUxvYWQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2xhenlJbWFnZVJlYWR5Jykgc19sYXp5SW1hZ2VSZWFkeTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snbGF6eUltYWdlUmVhZHknXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ2xvb3BGaXgnKSBzX2xvb3BGaXg6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ2xvb3BGaXgnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ21vbWVudHVtQm91bmNlJykgc19tb21lbnR1bUJvdW5jZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snbW9tZW50dW1Cb3VuY2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ25hdmlnYXRpb25IaWRlJykgc19uYXZpZ2F0aW9uSGlkZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snbmF2aWdhdGlvbkhpZGUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ25hdmlnYXRpb25TaG93Jykgc19uYXZpZ2F0aW9uU2hvdzogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snbmF2aWdhdGlvblNob3cnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ29ic2VydmVyVXBkYXRlJykgc19vYnNlcnZlclVwZGF0ZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snb2JzZXJ2ZXJVcGRhdGUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ29yaWVudGF0aW9uY2hhbmdlJykgc19vcmllbnRhdGlvbmNoYW5nZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snb3JpZW50YXRpb25jaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3BhZ2luYXRpb25IaWRlJykgc19wYWdpbmF0aW9uSGlkZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1sncGFnaW5hdGlvbkhpZGUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3BhZ2luYXRpb25SZW5kZXInKSBzX3BhZ2luYXRpb25SZW5kZXI6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3BhZ2luYXRpb25SZW5kZXInXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3BhZ2luYXRpb25TaG93Jykgc19wYWdpbmF0aW9uU2hvdzogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1sncGFnaW5hdGlvblNob3cnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3BhZ2luYXRpb25VcGRhdGUnKSBzX3BhZ2luYXRpb25VcGRhdGU6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3BhZ2luYXRpb25VcGRhdGUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3Byb2dyZXNzJykgc19wcm9ncmVzczogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1sncHJvZ3Jlc3MnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3JlYWNoQmVnaW5uaW5nJykgc19yZWFjaEJlZ2lubmluZzogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1sncmVhY2hCZWdpbm5pbmcnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3JlYWNoRW5kJykgc19yZWFjaEVuZDogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1sncmVhY2hFbmQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3JlYWxJbmRleENoYW5nZScpIHNfcmVhbEluZGV4Q2hhbmdlOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydyZWFsSW5kZXhDaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3Jlc2l6ZScpIHNfcmVzaXplOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydyZXNpemUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3Njcm9sbCcpIHNfc2Nyb2xsOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydzY3JvbGwnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3Njcm9sbGJhckRyYWdFbmQnKSBzX3Njcm9sbGJhckRyYWdFbmQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3Njcm9sbGJhckRyYWdFbmQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3Njcm9sbGJhckRyYWdNb3ZlJykgc19zY3JvbGxiYXJEcmFnTW92ZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snc2Nyb2xsYmFyRHJhZ01vdmUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3Njcm9sbGJhckRyYWdTdGFydCcpIHNfc2Nyb2xsYmFyRHJhZ1N0YXJ0OiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydzY3JvbGxiYXJEcmFnU3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NldFRyYW5zaXRpb24nKSBzX3NldFRyYW5zaXRpb246IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3NldFRyYW5zaXRpb24nXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NldFRyYW5zbGF0ZScpIHNfc2V0VHJhbnNsYXRlOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydzZXRUcmFuc2xhdGUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlQ2hhbmdlJykgc19zbGlkZUNoYW5nZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snc2xpZGVDaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlQ2hhbmdlVHJhbnNpdGlvbkVuZCcpIHNfc2xpZGVDaGFuZ2VUcmFuc2l0aW9uRW5kOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydzbGlkZUNoYW5nZVRyYW5zaXRpb25FbmQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlQ2hhbmdlVHJhbnNpdGlvblN0YXJ0Jykgc19zbGlkZUNoYW5nZVRyYW5zaXRpb25TdGFydDogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snc2xpZGVDaGFuZ2VUcmFuc2l0aW9uU3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlTmV4dFRyYW5zaXRpb25FbmQnKSBzX3NsaWRlTmV4dFRyYW5zaXRpb25FbmQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3NsaWRlTmV4dFRyYW5zaXRpb25FbmQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlTmV4dFRyYW5zaXRpb25TdGFydCcpIHNfc2xpZGVOZXh0VHJhbnNpdGlvblN0YXJ0OiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydzbGlkZU5leHRUcmFuc2l0aW9uU3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlUHJldlRyYW5zaXRpb25FbmQnKSBzX3NsaWRlUHJldlRyYW5zaXRpb25FbmQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3NsaWRlUHJldlRyYW5zaXRpb25FbmQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlUHJldlRyYW5zaXRpb25TdGFydCcpIHNfc2xpZGVQcmV2VHJhbnNpdGlvblN0YXJ0OiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydzbGlkZVByZXZUcmFuc2l0aW9uU3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlUmVzZXRUcmFuc2l0aW9uU3RhcnQnKSBzX3NsaWRlUmVzZXRUcmFuc2l0aW9uU3RhcnQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3NsaWRlUmVzZXRUcmFuc2l0aW9uU3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlUmVzZXRUcmFuc2l0aW9uRW5kJykgc19zbGlkZVJlc2V0VHJhbnNpdGlvbkVuZDogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snc2xpZGVSZXNldFRyYW5zaXRpb25FbmQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlck1vdmUnKSBzX3NsaWRlck1vdmU6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3NsaWRlck1vdmUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlckZpcnN0TW92ZScpIHNfc2xpZGVyRmlyc3RNb3ZlOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydzbGlkZXJGaXJzdE1vdmUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlc0xlbmd0aENoYW5nZScpIHNfc2xpZGVzTGVuZ3RoQ2hhbmdlOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydzbGlkZXNMZW5ndGhDaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NsaWRlc0dyaWRMZW5ndGhDaGFuZ2UnKSBzX3NsaWRlc0dyaWRMZW5ndGhDaGFuZ2U6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3NsaWRlc0dyaWRMZW5ndGhDaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NuYXBHcmlkTGVuZ3RoQ2hhbmdlJykgc19zbmFwR3JpZExlbmd0aENoYW5nZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1snc25hcEdyaWRMZW5ndGhDaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3NuYXBJbmRleENoYW5nZScpIHNfc25hcEluZGV4Q2hhbmdlOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWydzbmFwSW5kZXhDaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3RhcCcpIHNfdGFwOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWyd0YXAnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3RvRWRnZScpIHNfdG9FZGdlOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWyd0b0VkZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3RvdWNoRW5kJykgc190b3VjaEVuZDogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1sndG91Y2hFbmQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3RvdWNoTW92ZScpIHNfdG91Y2hNb3ZlOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWyd0b3VjaE1vdmUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3RvdWNoTW92ZU9wcG9zaXRlJykgc190b3VjaE1vdmVPcHBvc2l0ZTogRXZlbnRFbWl0dGVyPFN3aXBlckV2ZW50c1sndG91Y2hNb3ZlT3Bwb3NpdGUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3RvdWNoU3RhcnQnKSBzX3RvdWNoU3RhcnQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3RvdWNoU3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3RyYW5zaXRpb25FbmQnKSBzX3RyYW5zaXRpb25FbmQ6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3RyYW5zaXRpb25FbmQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3RyYW5zaXRpb25TdGFydCcpIHNfdHJhbnNpdGlvblN0YXJ0OiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWyd0cmFuc2l0aW9uU3RhcnQnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3VwZGF0ZScpIHNfdXBkYXRlOiBFdmVudEVtaXR0ZXI8U3dpcGVyRXZlbnRzWyd1cGRhdGUnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3pvb21DaGFuZ2UnKSBzX3pvb21DaGFuZ2U6IEV2ZW50RW1pdHRlcjxTd2lwZXJFdmVudHNbJ3pvb21DaGFuZ2UnXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIEBPdXRwdXQoJ3N3aXBlcicpIHNfc3dpcGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKSBpbmRleENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3ByZXZFbFJlZicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBzZXQgcHJldkVsUmVmKGVsOiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5fcHJldkVsUmVmID0gZWw7XG4gICAgdGhpcy5fc2V0RWxlbWVudChlbCwgdGhpcy5uYXZpZ2F0aW9uLCAnbmF2aWdhdGlvbicsICdwcmV2RWwnKTtcbiAgfVxuICBfcHJldkVsUmVmOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCduZXh0RWxSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IG5leHRFbFJlZihlbDogRWxlbWVudFJlZikge1xuICAgIHRoaXMuX25leHRFbFJlZiA9IGVsO1xuICAgIHRoaXMuX3NldEVsZW1lbnQoZWwsIHRoaXMubmF2aWdhdGlvbiwgJ25hdmlnYXRpb24nLCAnbmV4dEVsJyk7XG4gIH1cbiAgX25leHRFbFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsYmFyRWxSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHNjcm9sbGJhckVsUmVmKGVsOiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5fc2Nyb2xsYmFyRWxSZWYgPSBlbDtcbiAgICB0aGlzLl9zZXRFbGVtZW50KGVsLCB0aGlzLnNjcm9sbGJhciwgJ3Njcm9sbGJhcicpO1xuICB9XG4gIF9zY3JvbGxiYXJFbFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncGFnaW5hdGlvbkVsUmVmJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHNldCBwYWdpbmF0aW9uRWxSZWYoZWw6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLl9wYWdpbmF0aW9uRWxSZWYgPSBlbDtcbiAgICB0aGlzLl9zZXRFbGVtZW50KGVsLCB0aGlzLnBhZ2luYXRpb24sICdwYWdpbmF0aW9uJyk7XG4gIH1cbiAgX3BhZ2luYXRpb25FbFJlZjogRWxlbWVudFJlZjtcbiAgQENvbnRlbnRDaGlsZHJlbihTd2lwZXJTbGlkZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIGVtaXREaXN0aW5jdENoYW5nZXNPbmx5OiB0cnVlIH0pXG4gIHNsaWRlc0VsOiBRdWVyeUxpc3Q8U3dpcGVyU2xpZGVEaXJlY3RpdmU+O1xuICBwcml2YXRlIHNsaWRlczogU3dpcGVyU2xpZGVEaXJlY3RpdmVbXTtcblxuICBwcmVwZW5kU2xpZGVzOiBPYnNlcnZhYmxlPFN3aXBlclNsaWRlRGlyZWN0aXZlW10+O1xuICBhcHBlbmRTbGlkZXM6IE9ic2VydmFibGU8U3dpcGVyU2xpZGVEaXJlY3RpdmVbXT47XG5cbiAgc3dpcGVyUmVmOiBTd2lwZXI7XG4gIHJlYWRvbmx5IF9hY3RpdmVTbGlkZXMgPSBuZXcgU3ViamVjdDxTd2lwZXJTbGlkZURpcmVjdGl2ZVtdPigpO1xuXG4gIGdldCBhY3RpdmVTbGlkZXMoKSB7XG4gICAgaWYgKHRoaXMudmlydHVhbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVNsaWRlcztcbiAgICB9XG4gICAgcmV0dXJuIG9mKHRoaXMuc2xpZGVzKTtcbiAgfVxuXG4gIGdldCB6b29tQ29udGFpbmVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuem9vbSAmJiB0eXBlb2YgdGhpcy56b29tICE9PSAnYm9vbGVhbidcbiAgICAgID8gdGhpcy56b29tLmNvbnRhaW5lckNsYXNzXG4gICAgICA6ICdzd2lwZXItem9vbS1jb250YWluZXInO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGNvbnRhaW5lckNsYXNzZXM6IHN0cmluZyA9ICdzd2lwZXInO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgX3BsYXRmb3JtSWQ6IE9iamVjdCxcbiAgKSB7fVxuXG4gIHByaXZhdGUgX3NldEVsZW1lbnQoZWw6IEVsZW1lbnRSZWYsIHJlZjogYW55LCB1cGRhdGU6IHN0cmluZywga2V5ID0gJ2VsJykge1xuICAgIGlmICghZWwgfHwgIXJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVmICYmIGVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGlmIChyZWZba2V5XSA9PT0gZWwubmF0aXZlRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZWZba2V5XSA9IGVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZU9iajogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICB1cGRhdGVPYmpbdXBkYXRlXSA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVJbml0U3dpcGVyKHVwZGF0ZU9iaik7XG4gIH1cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgeyBwYXJhbXMgfSA9IGdldFBhcmFtcyh0aGlzKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIHBhcmFtcyk7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2hpbGRyZW5TbGlkZXNJbml0KCk7XG4gICAgdGhpcy5pbml0U3dpcGVyKCk7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zX3N3aXBlci5lbWl0KHRoaXMuc3dpcGVyUmVmKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hpbGRyZW5TbGlkZXNJbml0KCkge1xuICAgIHRoaXMuc2xpZGVzQ2hhbmdlcyh0aGlzLnNsaWRlc0VsKTtcbiAgICB0aGlzLnNsaWRlc0VsLmNoYW5nZXMuc3Vic2NyaWJlKHRoaXMuc2xpZGVzQ2hhbmdlcyk7XG4gIH1cblxuICBwcml2YXRlIHNsaWRlc0NoYW5nZXMgPSAodmFsOiBRdWVyeUxpc3Q8U3dpcGVyU2xpZGVEaXJlY3RpdmU+KSA9PiB7XG4gICAgdGhpcy5zbGlkZXMgPSB2YWwubWFwKChzbGlkZTogU3dpcGVyU2xpZGVEaXJlY3RpdmUsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHNsaWRlLnNsaWRlSW5kZXggPSBpbmRleDtcbiAgICAgIHNsaWRlLmNsYXNzTmFtZXMgPSB0aGlzLnNsaWRlQ2xhc3MgfHwgJyc7XG4gICAgICByZXR1cm4gc2xpZGU7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMubG9vcCAmJiAhdGhpcy5sb29wZWRTbGlkZXMpIHtcbiAgICAgIHRoaXMuY2FsY0xvb3BlZFNsaWRlcygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudmlydHVhbCkge1xuICAgICAgaWYgKHRoaXMubG9vcGVkU2xpZGVzKSB7XG4gICAgICAgIHRoaXMucHJlcGVuZFNsaWRlcyA9IG9mKHRoaXMuc2xpZGVzLnNsaWNlKHRoaXMuc2xpZGVzLmxlbmd0aCAtIHRoaXMubG9vcGVkU2xpZGVzKSk7XG4gICAgICAgIHRoaXMuYXBwZW5kU2xpZGVzID0gb2YodGhpcy5zbGlkZXMuc2xpY2UoMCwgdGhpcy5sb29wZWRTbGlkZXMpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3dpcGVyUmVmICYmIHRoaXMuc3dpcGVyUmVmLnZpcnR1YWwpIHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuc3dpcGVyUmVmLnZpcnR1YWwuc2xpZGVzID0gdGhpcy5zbGlkZXM7XG4gICAgICAgIHRoaXMuc3dpcGVyUmVmLnZpcnR1YWwudXBkYXRlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfTtcblxuICBnZXQgaXNTd2lwZXJBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3dpcGVyUmVmICYmICF0aGlzLnN3aXBlclJlZi5kZXN0cm95ZWQ7XG4gIH1cblxuICBpbml0U3dpcGVyKCkge1xuICAgIGNvbnN0IHsgcGFyYW1zOiBzd2lwZXJQYXJhbXMsIHBhc3NlZFBhcmFtcyB9ID0gZ2V0UGFyYW1zKHRoaXMpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgc3dpcGVyUGFyYW1zKTtcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgc3dpcGVyUGFyYW1zLmluaXQgPSBmYWxzZTtcbiAgICAgIGlmICghc3dpcGVyUGFyYW1zLnZpcnR1YWwpIHtcbiAgICAgICAgc3dpcGVyUGFyYW1zLm9ic2VydmVyID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc3dpcGVyUGFyYW1zLm9uQW55ID0gKGV2ZW50TmFtZToga2V5b2YgU3dpcGVyQ29tcG9uZW50LCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbWl0dGVyID0gdGhpc1soJ3NfJyArIGV2ZW50TmFtZSkgYXMga2V5b2YgU3dpcGVyQ29tcG9uZW50XSBhcyBFdmVudEVtaXR0ZXI8YW55PjtcbiAgICAgICAgaWYgKGVtaXR0ZXIpIHtcbiAgICAgICAgICBlbWl0dGVyLmVtaXQoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBfc2xpZGVDbGFzc2VzOiBTd2lwZXJFdmVudHNbJ19zbGlkZUNsYXNzZXMnXSA9IChfLCB1cGRhdGVkKSA9PiB7XG4gICAgICAgIHVwZGF0ZWQuZm9yRWFjaCgoeyBzbGlkZUVsLCBjbGFzc05hbWVzIH0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gc2xpZGVFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4Jyk7XG4gICAgICAgICAgY29uc3Qgc2xpZGVJbmRleCA9IGRhdGFJbmRleCA/IHBhcnNlSW50KGRhdGFJbmRleCkgOiBpbmRleDtcbiAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsKSB7XG4gICAgICAgICAgICBjb25zdCB2aXJ0dWFsU2xpZGUgPSB0aGlzLnNsaWRlcy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtLnZpcnR1YWxJbmRleCAmJiBpdGVtLnZpcnR1YWxJbmRleCA9PT0gc2xpZGVJbmRleDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHZpcnR1YWxTbGlkZSkge1xuICAgICAgICAgICAgICB2aXJ0dWFsU2xpZGUuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zbGlkZXNbc2xpZGVJbmRleF0pIHtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVzW3NsaWRlSW5kZXhdLmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBfY29udGFpbmVyQ2xhc3NlczogU3dpcGVyRXZlbnRzWydfY29udGFpbmVyQ2xhc3NlcyddID0gKF8sIGNsYXNzZXMpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXJDbGFzc2VzID0gY2xhc3NlcztcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmFzc2lnbihzd2lwZXJQYXJhbXMub24sIHtcbiAgICAgICAgX2NvbnRhaW5lckNsYXNzZXMsXG4gICAgICAgIF9zbGlkZUNsYXNzZXMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN3aXBlclJlZiA9IG5ldyBTd2lwZXIoc3dpcGVyUGFyYW1zKTtcbiAgICAgIHN3aXBlclJlZi5sb29wQ3JlYXRlID0gKCkgPT4ge307XG4gICAgICBzd2lwZXJSZWYubG9vcERlc3Ryb3kgPSAoKSA9PiB7fTtcbiAgICAgIGlmIChzd2lwZXJQYXJhbXMubG9vcCkge1xuICAgICAgICBzd2lwZXJSZWYubG9vcGVkU2xpZGVzID0gdGhpcy5sb29wZWRTbGlkZXM7XG4gICAgICB9XG4gICAgICBjb25zdCBpc1ZpcnR1YWxFbmFibGVkID1cbiAgICAgICAgdHlwZW9mIHN3aXBlclJlZi5wYXJhbXMudmlydHVhbCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIHN3aXBlclJlZi5wYXJhbXMudmlydHVhbCAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICAgIHN3aXBlclJlZi5wYXJhbXMudmlydHVhbC5lbmFibGVkO1xuICAgICAgaWYgKHN3aXBlclJlZi52aXJ0dWFsICYmIGlzVmlydHVhbEVuYWJsZWQpIHtcbiAgICAgICAgc3dpcGVyUmVmLnZpcnR1YWwuc2xpZGVzID0gdGhpcy5zbGlkZXM7XG4gICAgICAgIGNvbnN0IGV4dGVuZFdpdGggPSB7XG4gICAgICAgICAgY2FjaGU6IGZhbHNlLFxuICAgICAgICAgIHNsaWRlczogdGhpcy5zbGlkZXMsXG4gICAgICAgICAgcmVuZGVyRXh0ZXJuYWw6IHRoaXMudXBkYXRlVmlydHVhbFNsaWRlcyxcbiAgICAgICAgICByZW5kZXJFeHRlcm5hbFVwZGF0ZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIGV4dGVuZChzd2lwZXJSZWYucGFyYW1zLnZpcnR1YWwsIGV4dGVuZFdpdGgpO1xuICAgICAgICBleHRlbmQoc3dpcGVyUmVmLm9yaWdpbmFsUGFyYW1zLnZpcnR1YWwsIGV4dGVuZFdpdGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5fcGxhdGZvcm1JZCkpIHtcbiAgICAgICAgdGhpcy5zd2lwZXJSZWYgPSBzd2lwZXJSZWYuaW5pdCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGlzRW5hYmxlZCA9XG4gICAgICAgICAgdHlwZW9mIHRoaXMuc3dpcGVyUmVmLnBhcmFtcy52aXJ0dWFsICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgIHR5cGVvZiB0aGlzLnN3aXBlclJlZi5wYXJhbXMudmlydHVhbCAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICAgICAgdGhpcy5zd2lwZXJSZWYucGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcbiAgICAgICAgaWYgKHRoaXMuc3dpcGVyUmVmLnZpcnR1YWwgJiYgaXNFbmFibGVkKSB7XG4gICAgICAgICAgdGhpcy5zd2lwZXJSZWYudmlydHVhbC51cGRhdGUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBzd2lwZXJSZWYub24oJ3NsaWRlQ2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnN3aXBlclJlZi5yZWFsSW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0eWxlOiBhbnkgPSBudWxsO1xuICBjdXJyZW50VmlydHVhbERhdGE6IGFueTsgLy8gVE9ETzogdHlwZSB2aXJ0dWFsRGF0YTtcbiAgcHJpdmF0ZSB1cGRhdGVWaXJ0dWFsU2xpZGVzID0gKHZpcnR1YWxEYXRhOiBhbnkpID0+IHtcbiAgICAvLyBUT0RPOiB0eXBlIHZpcnR1YWxEYXRhXG4gICAgaWYgKFxuICAgICAgIXRoaXMuc3dpcGVyUmVmIHx8XG4gICAgICAodGhpcy5jdXJyZW50VmlydHVhbERhdGEgJiZcbiAgICAgICAgdGhpcy5jdXJyZW50VmlydHVhbERhdGEuZnJvbSA9PT0gdmlydHVhbERhdGEuZnJvbSAmJlxuICAgICAgICB0aGlzLmN1cnJlbnRWaXJ0dWFsRGF0YS50byA9PT0gdmlydHVhbERhdGEudG8gJiZcbiAgICAgICAgdGhpcy5jdXJyZW50VmlydHVhbERhdGEub2Zmc2V0ID09PSB2aXJ0dWFsRGF0YS5vZmZzZXQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3R5bGUgPSB0aGlzLnN3aXBlclJlZi5pc0hvcml6b250YWwoKVxuICAgICAgPyB7XG4gICAgICAgICAgW3RoaXMuc3dpcGVyUmVmLnJ0bFRyYW5zbGF0ZSA/ICdyaWdodCcgOiAnbGVmdCddOiBgJHt2aXJ0dWFsRGF0YS5vZmZzZXR9cHhgLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICB0b3A6IGAke3ZpcnR1YWxEYXRhLm9mZnNldH1weGAsXG4gICAgICAgIH07XG4gICAgdGhpcy5jdXJyZW50VmlydHVhbERhdGEgPSB2aXJ0dWFsRGF0YTtcbiAgICB0aGlzLl9hY3RpdmVTbGlkZXMubmV4dCh2aXJ0dWFsRGF0YS5zbGlkZXMpO1xuICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnN3aXBlclJlZi51cGRhdGVTbGlkZXMoKTtcbiAgICAgIHRoaXMuc3dpcGVyUmVmLnVwZGF0ZVByb2dyZXNzKCk7XG4gICAgICB0aGlzLnN3aXBlclJlZi51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgICBpZiAodGhpcy5zd2lwZXJSZWYubGF6eSAmJiB0aGlzLnN3aXBlclJlZi5wYXJhbXMubGF6eVsnZW5hYmxlZCddKSB7XG4gICAgICAgIHRoaXMuc3dpcGVyUmVmLmxhenkubG9hZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zd2lwZXJSZWYudmlydHVhbC51cGRhdGUodHJ1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZWRQYXJhbXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLnVwZGF0ZVN3aXBlcihjaGFuZ2VkUGFyYW1zKTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICB1cGRhdGVJbml0U3dpcGVyKGNoYW5nZWRQYXJhbXM6IGFueSkge1xuICAgIGlmICghKGNoYW5nZWRQYXJhbXMgJiYgdGhpcy5zd2lwZXJSZWYgJiYgIXRoaXMuc3dpcGVyUmVmLmRlc3Ryb3llZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBwYXJhbXM6IGN1cnJlbnRQYXJhbXMsXG4gICAgICAgIHBhZ2luYXRpb24sXG4gICAgICAgIG5hdmlnYXRpb24sXG4gICAgICAgIHNjcm9sbGJhcixcbiAgICAgICAgdmlydHVhbCxcbiAgICAgICAgdGh1bWJzLFxuICAgICAgfSA9IHRoaXMuc3dpcGVyUmVmO1xuXG4gICAgICBpZiAoY2hhbmdlZFBhcmFtcy5wYWdpbmF0aW9uKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICAgICB0eXBlb2YgdGhpcy5wYWdpbmF0aW9uICE9PSAnYm9vbGVhbicgJiZcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb24uZWwgJiZcbiAgICAgICAgICBwYWdpbmF0aW9uICYmXG4gICAgICAgICAgIXBhZ2luYXRpb24uZWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYXJhbWV0ZXIoJ3BhZ2luYXRpb24nLCB0aGlzLnBhZ2luYXRpb24pO1xuICAgICAgICAgIHBhZ2luYXRpb24uaW5pdCgpO1xuICAgICAgICAgIHBhZ2luYXRpb24ucmVuZGVyKCk7XG4gICAgICAgICAgcGFnaW5hdGlvbi51cGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYWdpbmF0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgICBwYWdpbmF0aW9uLmVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZFBhcmFtcy5zY3JvbGxiYXIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuc2Nyb2xsYmFyICYmXG4gICAgICAgICAgdHlwZW9mIHRoaXMuc2Nyb2xsYmFyICE9PSAnYm9vbGVhbicgJiZcbiAgICAgICAgICB0aGlzLnNjcm9sbGJhci5lbCAmJlxuICAgICAgICAgIHNjcm9sbGJhciAmJlxuICAgICAgICAgICFzY3JvbGxiYXIuZWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYXJhbWV0ZXIoJ3Njcm9sbGJhcicsIHRoaXMuc2Nyb2xsYmFyKTtcbiAgICAgICAgICBzY3JvbGxiYXIuaW5pdCgpO1xuICAgICAgICAgIHNjcm9sbGJhci51cGRhdGVTaXplKCk7XG4gICAgICAgICAgc2Nyb2xsYmFyLnNldFRyYW5zbGF0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjcm9sbGJhci5kZXN0cm95KCk7XG4gICAgICAgICAgc2Nyb2xsYmFyLmVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZFBhcmFtcy5uYXZpZ2F0aW9uKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb24gJiZcbiAgICAgICAgICB0eXBlb2YgdGhpcy5uYXZpZ2F0aW9uICE9PSAnYm9vbGVhbicgJiZcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucHJldkVsICYmXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLm5leHRFbCAmJlxuICAgICAgICAgIG5hdmlnYXRpb24gJiZcbiAgICAgICAgICAhbmF2aWdhdGlvbi5wcmV2RWwgJiZcbiAgICAgICAgICAhbmF2aWdhdGlvbi5uZXh0RWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYXJhbWV0ZXIoJ25hdmlnYXRpb24nLCB0aGlzLm5hdmlnYXRpb24pO1xuICAgICAgICAgIG5hdmlnYXRpb24uaW5pdCgpO1xuICAgICAgICAgIG5hdmlnYXRpb24udXBkYXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAobmF2aWdhdGlvbi5wcmV2RWwgJiYgbmF2aWdhdGlvbi5uZXh0RWwpIHtcbiAgICAgICAgICBuYXZpZ2F0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgICBuYXZpZ2F0aW9uLm5leHRFbCA9IG51bGw7XG4gICAgICAgICAgbmF2aWdhdGlvbi5wcmV2RWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlZFBhcmFtcy50aHVtYnMgJiYgdGhpcy50aHVtYnMgJiYgdGhpcy50aHVtYnMuc3dpcGVyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFyYW1ldGVyKCd0aHVtYnMnLCB0aGlzLnRodW1icyk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxpemVkID0gdGh1bWJzLmluaXQoKTtcbiAgICAgICAgaWYgKGluaXRpYWxpemVkKSB0aHVtYnMudXBkYXRlKHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZFBhcmFtcy5jb250cm9sbGVyICYmIHRoaXMuY29udHJvbGxlciAmJiB0aGlzLmNvbnRyb2xsZXIuY29udHJvbCkge1xuICAgICAgICB0aGlzLnN3aXBlclJlZi5jb250cm9sbGVyLmNvbnRyb2wgPSB0aGlzLmNvbnRyb2xsZXIuY29udHJvbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zd2lwZXJSZWYudXBkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVTd2lwZXIoY2hhbmdlZFBhcmFtczogU2ltcGxlQ2hhbmdlcyB8IGFueSkge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlZFBhcmFtcy5jb25maWcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCEoY2hhbmdlZFBhcmFtcyAmJiB0aGlzLnN3aXBlclJlZiAmJiAhdGhpcy5zd2lwZXJSZWYuZGVzdHJveWVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGFuZ2VkUGFyYW1zKSB7XG4gICAgICAgIGlmIChpZ25vcmVOZ09uQ2hhbmdlcy5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY2hhbmdlZFBhcmFtc1trZXldPy5jdXJyZW50VmFsdWUgPz8gY2hhbmdlZFBhcmFtc1trZXldO1xuICAgICAgICB0aGlzLnVwZGF0ZVBhcmFtZXRlcihrZXksIG5ld1ZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZWRQYXJhbXMuYWxsb3dTbGlkZU5leHQpIHtcbiAgICAgICAgdGhpcy5zd2lwZXJSZWYuYWxsb3dTbGlkZU5leHQgPSB0aGlzLmFsbG93U2xpZGVOZXh0O1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZWRQYXJhbXMuYWxsb3dTbGlkZVByZXYpIHtcbiAgICAgICAgdGhpcy5zd2lwZXJSZWYuYWxsb3dTbGlkZVByZXYgPSB0aGlzLmFsbG93U2xpZGVQcmV2O1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZWRQYXJhbXMuZGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuc3dpcGVyUmVmLmNoYW5nZURpcmVjdGlvbih0aGlzLmRpcmVjdGlvbiwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZWRQYXJhbXMuYnJlYWtwb2ludHMpIHtcbiAgICAgICAgaWYgKHRoaXMubG9vcCAmJiAhdGhpcy5sb29wZWRTbGlkZXMpIHtcbiAgICAgICAgICB0aGlzLmNhbGNMb29wZWRTbGlkZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN3aXBlclJlZi5jdXJyZW50QnJlYWtwb2ludCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3dpcGVyUmVmLnNldEJyZWFrcG9pbnQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZWRQYXJhbXMudGh1bWJzIHx8IGNoYW5nZWRQYXJhbXMuY29udHJvbGxlcikge1xuICAgICAgICB0aGlzLnVwZGF0ZUluaXRTd2lwZXIoY2hhbmdlZFBhcmFtcyk7XG4gICAgICB9XG4gICAgICB0aGlzLnN3aXBlclJlZi51cGRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGNMb29wZWRTbGlkZXMoKSB7XG4gICAgaWYgKCF0aGlzLmxvb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNsaWRlc1BlclZpZXdQYXJhbXMgPSB0aGlzLnNsaWRlc1BlclZpZXc7XG4gICAgaWYgKHRoaXMuYnJlYWtwb2ludHMpIHtcbiAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBTd2lwZXIucHJvdG90eXBlLmdldEJyZWFrcG9pbnQodGhpcy5icmVha3BvaW50cyk7XG4gICAgICBjb25zdCBicmVha3BvaW50T25seVBhcmFtcyA9XG4gICAgICAgIGJyZWFrcG9pbnQgaW4gdGhpcy5icmVha3BvaW50cyA/IHRoaXMuYnJlYWtwb2ludHNbYnJlYWtwb2ludF0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoYnJlYWtwb2ludE9ubHlQYXJhbXMgJiYgYnJlYWtwb2ludE9ubHlQYXJhbXMuc2xpZGVzUGVyVmlldykge1xuICAgICAgICBzbGlkZXNQZXJWaWV3UGFyYW1zID0gYnJlYWtwb2ludE9ubHlQYXJhbXMuc2xpZGVzUGVyVmlldztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNsaWRlc1BlclZpZXdQYXJhbXMgPT09ICdhdXRvJykge1xuICAgICAgdGhpcy5sb29wZWRTbGlkZXMgPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gdGhpcy5zbGlkZXMubGVuZ3RoO1xuICAgIH1cbiAgICBsZXQgbG9vcGVkU2xpZGVzID0gdGhpcy5sb29wZWRTbGlkZXMgfHwgc2xpZGVzUGVyVmlld1BhcmFtcztcbiAgICBpZiAoIWxvb3BlZFNsaWRlcykge1xuICAgICAgLy8gP1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxvb3BBZGRpdGlvbmFsU2xpZGVzKSB7XG4gICAgICBsb29wZWRTbGlkZXMgKz0gdGhpcy5sb29wQWRkaXRpb25hbFNsaWRlcztcbiAgICB9XG4gICAgaWYgKGxvb3BlZFNsaWRlcyA+IHRoaXMuc2xpZGVzLmxlbmd0aCkge1xuICAgICAgbG9vcGVkU2xpZGVzID0gdGhpcy5zbGlkZXMubGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLmxvb3BlZFNsaWRlcyA9IGxvb3BlZFNsaWRlcztcbiAgICByZXR1cm4gbG9vcGVkU2xpZGVzO1xuICB9XG5cbiAgdXBkYXRlUGFyYW1ldGVyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCEodGhpcy5zd2lwZXJSZWYgJiYgIXRoaXMuc3dpcGVyUmVmLmRlc3Ryb3llZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgX2tleSA9IGtleS5yZXBsYWNlKC9eXy8sICcnKTtcbiAgICBjb25zdCBpc0N1cnJlbnRQYXJhbU9iaiA9IGlzT2JqZWN0KHRoaXMuc3dpcGVyUmVmLnBhcmFtc1tfa2V5XSk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zd2lwZXJSZWYubW9kdWxlcykuaW5kZXhPZihfa2V5KSA+PSAwKSB7XG4gICAgICBjb25zdCBkZWZhdWx0UGFyYW1zID0gdGhpcy5zd2lwZXJSZWYubW9kdWxlc1tfa2V5XS5wYXJhbXNbX2tleV07XG4gICAgICBpZiAoaXNDdXJyZW50UGFyYW1PYmopIHtcbiAgICAgICAgZXh0ZW5kKHRoaXMuc3dpcGVyUmVmLnBhcmFtc1tfa2V5XSwgZGVmYXVsdFBhcmFtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN3aXBlclJlZi5wYXJhbXNbX2tleV0gPSBkZWZhdWx0UGFyYW1zO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoX2tleSA9PT0gJ2VuYWJsZWQnKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5zd2lwZXJSZWYuZW5hYmxlKCk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnN3aXBlclJlZi5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0N1cnJlbnRQYXJhbU9iaiAmJiBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGV4dGVuZCh0aGlzLnN3aXBlclJlZi5wYXJhbXNbX2tleV0sIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zd2lwZXJSZWYucGFyYW1zW19rZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnNcbiAgICovXG4gIHNldEluZGV4KGluZGV4OiBudW1iZXIsIHNwZWVkPzogbnVtYmVyLCBzaWxlbnQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzU3dpcGVyQWN0aXZlKSB7XG4gICAgICB0aGlzLmluaXRpYWxTbGlkZSA9IGluZGV4O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuc3dpcGVyUmVmLmFjdGl2ZUluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb29wKSB7XG4gICAgICAgIHRoaXMuc3dpcGVyUmVmLnNsaWRlVG9Mb29wKGluZGV4LCBzcGVlZCwgIXNpbGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN3aXBlclJlZi5zbGlkZVRvKGluZGV4LCBzcGVlZCwgIXNpbGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5zd2lwZXJSZWY/LmRlc3Ryb3kodHJ1ZSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJbc2xvdD1jb250YWluZXItc3RhcnRdXCI+PC9uZy1jb250ZW50PlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hdmlnYXRpb24gJiYgc2hvd05hdmlnYXRpb25cIj5cbiAgPGRpdiBjbGFzcz1cInN3aXBlci1idXR0b24tcHJldlwiICNwcmV2RWxSZWY+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzd2lwZXItYnV0dG9uLW5leHRcIiAjbmV4dEVsUmVmPjwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48ZGl2ICpuZ0lmPVwic2Nyb2xsYmFyICYmIHNob3dTY3JvbGxiYXJcIiBjbGFzcz1cInN3aXBlci1zY3JvbGxiYXJcIiAjc2Nyb2xsYmFyRWxSZWY+PC9kaXY+XG48ZGl2ICpuZ0lmPVwicGFnaW5hdGlvbiAmJiBzaG93UGFnaW5hdGlvblwiIGNsYXNzPVwic3dpcGVyLXBhZ2luYXRpb25cIiAjcGFnaW5hdGlvbkVsUmVmPjwvZGl2PlxuPGRpdiBbbmdDbGFzc109XCJ3cmFwcGVyQ2xhc3NcIiBbYXR0ci5pZF09XCJpZFwiPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbc2xvdD13cmFwcGVyLXN0YXJ0XVwiPjwvbmctY29udGVudD5cbiAgPG5nLXRlbXBsYXRlXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgIHNsaWRlc1RlbXBsYXRlO1xuICAgICAgY29udGV4dDoge1xuICAgICAgICBsb29wU2xpZGVzOiBwcmVwZW5kU2xpZGVzLFxuICAgICAgICBrZXk6ICdwcmVwZW5kJ1xuICAgICAgfVxuICAgIFwiXG4gID48L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGVcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgc2xpZGVzVGVtcGxhdGU7XG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIGxvb3BTbGlkZXM6IGFjdGl2ZVNsaWRlcyxcbiAgICAgICAga2V5OiAnJ1xuICAgICAgfVxuICAgIFwiXG4gID48L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGVcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgc2xpZGVzVGVtcGxhdGU7XG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIGxvb3BTbGlkZXM6IGFwcGVuZFNsaWRlcyxcbiAgICAgICAga2V5OiAnYXBwZW5kJ1xuICAgICAgfVxuICAgIFwiXG4gID48L25nLXRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbc2xvdD13cmFwcGVyLWVuZF1cIj48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbjxuZy1jb250ZW50IHNlbGVjdD1cIltzbG90PWNvbnRhaW5lci1lbmRdXCI+PC9uZy1jb250ZW50PlxuXG48bmctdGVtcGxhdGUgI3NsaWRlc1RlbXBsYXRlIGxldC1sb29wU2xpZGVzPVwibG9vcFNsaWRlc1wiIGxldC1zbGlkZUtleT1cImtleVwiPlxuICA8ZGl2XG4gICAgKm5nRm9yPVwibGV0IHNsaWRlIG9mIGxvb3BTbGlkZXMgfCBhc3luY1wiXG4gICAgW25nQ2xhc3NdPVwiXG4gICAgICAoc2xpZGUuY2xhc3MgPyBzbGlkZS5jbGFzcyArICcgJyA6ICcnKSArXG4gICAgICBzbGlkZUNsYXNzICtcbiAgICAgIChzbGlkZUtleSAhPT0gJycgPyAnICcgKyBzbGlkZUR1cGxpY2F0ZUNsYXNzIDogJycpXG4gICAgXCJcbiAgICBbYXR0ci5kYXRhLXN3aXBlci1zbGlkZS1pbmRleF09XCJzbGlkZS52aXJ0dWFsSW5kZXggPyBzbGlkZS52aXJ0dWFsSW5kZXggOiBzbGlkZS5zbGlkZUluZGV4XCJcbiAgICBbYXR0ci5kYXRhLXN3aXBlci1hdXRvcGxheV09XCJzbGlkZS5hdXRvcGxheURlbGF5XCJcbiAgICBbc3R5bGVdPVwic3R5bGVcIlxuICAgIFtuZ1N3aXRjaF09XCJzbGlkZS56b29tXCJcbiAgPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cInRydWVcIiBbbmdDbGFzc109XCJ6b29tQ29udGFpbmVyQ2xhc3NcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzbGlkZS50ZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgJGltcGxpY2l0OiBzbGlkZS5zbGlkZURhdGFcbiAgICAgICAgfVwiXG4gICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2xpZGUudGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICRpbXBsaWNpdDogc2xpZGUuc2xpZGVEYXRhXG4gICAgICAgIH1cIlxuICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ== \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/swiper.module.js b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/swiper.module.js new file mode 100644 index 0000000..b4fa3a0 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/swiper.module.js @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SwiperComponent } from './swiper.component'; +import { SwiperSlideDirective } from './swiper-slide.directive'; +import * as i0 from "@angular/core"; +export class SwiperModule { +} +SwiperModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); +SwiperModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperModule, declarations: [SwiperComponent, SwiperSlideDirective], imports: [CommonModule], exports: [SwiperComponent, SwiperSlideDirective] }); +SwiperModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperModule, imports: [[CommonModule]] }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperModule, decorators: [{ + type: NgModule, + args: [{ + declarations: [SwiperComponent, SwiperSlideDirective], + exports: [SwiperComponent, SwiperSlideDirective], + imports: [CommonModule], + }] + }] }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpcGVyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hbmd1bGFyL3NyYy9zd2lwZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFNaEUsTUFBTSxPQUFPLFlBQVk7O3lHQUFaLFlBQVk7MEdBQVosWUFBWSxpQkFKUixlQUFlLEVBQUUsb0JBQW9CLGFBRTFDLFlBQVksYUFEWixlQUFlLEVBQUUsb0JBQW9COzBHQUdwQyxZQUFZLFlBRmQsQ0FBQyxZQUFZLENBQUM7MkZBRVosWUFBWTtrQkFMeEIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLENBQUM7b0JBQ3JELE9BQU8sRUFBRSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQztvQkFDaEQsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3dpcGVyQ29tcG9uZW50IH0gZnJvbSAnLi9zd2lwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN3aXBlclNsaWRlRGlyZWN0aXZlIH0gZnJvbSAnLi9zd2lwZXItc2xpZGUuZGlyZWN0aXZlJztcbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1N3aXBlckNvbXBvbmVudCwgU3dpcGVyU2xpZGVEaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbU3dpcGVyQ29tcG9uZW50LCBTd2lwZXJTbGlkZURpcmVjdGl2ZV0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBTd2lwZXJNb2R1bGUge31cbiJdfQ== \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/utils/get-params.js b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/utils/get-params.js new file mode 100644 index 0000000..9279259 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/utils/get-params.js @@ -0,0 +1,38 @@ +// eslint-disable-next-line +import { isObject, extend } from './utils'; +import { paramsList } from './params-list'; +// @ts-ignore +import Swiper from 'swiper'; +export const allowedParams = paramsList.map((key) => key.replace(/_/, '')); +export function getParams(obj = {}) { + const params = { + on: {}, + }; + const passedParams = {}; + extend(params, Swiper.defaults); + extend(params, Swiper.extendedDefaults); + params._emitClasses = true; + const rest = {}; + Object.keys(obj).forEach((key) => { + const _key = key.replace(/^_/, ''); + if (typeof obj[_key] === 'undefined') + return; + if (allowedParams.indexOf(_key) >= 0) { + if (isObject(obj[_key])) { + params[_key] = {}; + passedParams[_key] = {}; + extend(params[_key], obj[_key]); + extend(passedParams[_key], obj[_key]); + } + else { + params[_key] = obj[_key]; + passedParams[_key] = obj[_key]; + } + } + else { + rest[_key] = obj[_key]; + } + }); + return { params, passedParams, rest }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXBhcmFtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hbmd1bGFyL3NyYy91dGlscy9nZXQtcGFyYW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLGFBQWE7QUFDYixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0UsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFXLEVBQUU7SUFDckMsTUFBTSxNQUFNLEdBQVE7UUFDbEIsRUFBRSxFQUFFLEVBQUU7S0FDUCxDQUFDO0lBQ0YsTUFBTSxZQUFZLEdBQVEsRUFBRSxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDeEMsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFFM0IsTUFBTSxJQUFJLEdBQVEsRUFBRSxDQUFDO0lBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxXQUFXO1lBQUUsT0FBTztRQUM3QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3ZDO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEM7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuaW1wb3J0IHsgaXNPYmplY3QsIGV4dGVuZCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgcGFyYW1zTGlzdCB9IGZyb20gJy4vcGFyYW1zLWxpc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IFN3aXBlciBmcm9tICdzd2lwZXInO1xuXG5leHBvcnQgY29uc3QgYWxsb3dlZFBhcmFtcyA9IHBhcmFtc0xpc3QubWFwKChrZXkpID0+IGtleS5yZXBsYWNlKC9fLywgJycpKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJhbXMob2JqOiBhbnkgPSB7fSkge1xuICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICBvbjoge30sXG4gIH07XG4gIGNvbnN0IHBhc3NlZFBhcmFtczogYW55ID0ge307XG4gIGV4dGVuZChwYXJhbXMsIFN3aXBlci5kZWZhdWx0cyk7XG4gIGV4dGVuZChwYXJhbXMsIFN3aXBlci5leHRlbmRlZERlZmF1bHRzKTtcbiAgcGFyYW1zLl9lbWl0Q2xhc3NlcyA9IHRydWU7XG5cbiAgY29uc3QgcmVzdDogYW55ID0ge307XG4gIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBfa2V5ID0ga2V5LnJlcGxhY2UoL15fLywgJycpO1xuICAgIGlmICh0eXBlb2Ygb2JqW19rZXldID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIGlmIChhbGxvd2VkUGFyYW1zLmluZGV4T2YoX2tleSkgPj0gMCkge1xuICAgICAgaWYgKGlzT2JqZWN0KG9ialtfa2V5XSkpIHtcbiAgICAgICAgcGFyYW1zW19rZXldID0ge307XG4gICAgICAgIHBhc3NlZFBhcmFtc1tfa2V5XSA9IHt9O1xuICAgICAgICBleHRlbmQocGFyYW1zW19rZXldLCBvYmpbX2tleV0pO1xuICAgICAgICBleHRlbmQocGFzc2VkUGFyYW1zW19rZXldLCBvYmpbX2tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zW19rZXldID0gb2JqW19rZXldO1xuICAgICAgICBwYXNzZWRQYXJhbXNbX2tleV0gPSBvYmpbX2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RbX2tleV0gPSBvYmpbX2tleV07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBwYXJhbXMsIHBhc3NlZFBhcmFtcywgcmVzdCB9O1xufVxuIl19 \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/utils/params-list.js b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/utils/params-list.js new file mode 100644 index 0000000..f80626c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/utils/params-list.js @@ -0,0 +1,115 @@ +/* underscore in name -> watch for changes */ +export const paramsList = [ + 'init', + 'enabled', + '_direction', + 'touchEventsTarget', + 'initialSlide', + '_speed', + 'cssMode', + 'updateOnWindowResize', + 'resizeObserver', + 'nested', + 'focusableElements', + '_width', + '_height', + 'preventInteractionOnTransition', + 'userAgent', + 'url', + '_edgeSwipeDetection', + '_edgeSwipeThreshold', + '_freeMode', + '_autoHeight', + 'setWrapperSize', + 'virtualTranslate', + '_effect', + 'breakpoints', + '_spaceBetween', + '_slidesPerView', + '_grid', + '_slidesPerGroup', + '_slidesPerGroupSkip', + '_centeredSlides', + '_centeredSlidesBounds', + '_slidesOffsetBefore', + '_slidesOffsetAfter', + 'normalizeSlideIndex', + '_centerInsufficientSlides', + '_watchOverflow', + 'roundLengths', + 'touchRatio', + 'touchAngle', + 'simulateTouch', + '_shortSwipes', + '_longSwipes', + 'longSwipesRatio', + 'longSwipesMs', + '_followFinger', + 'allowTouchMove', + '_threshold', + 'touchMoveStopPropagation', + 'touchStartPreventDefault', + 'touchStartForcePreventDefault', + 'touchReleaseOnEdges', + 'uniqueNavElements', + '_resistance', + '_resistanceRatio', + '_watchSlidesProgress', + '_grabCursor', + 'preventClicks', + 'preventClicksPropagation', + '_slideToClickedSlide', + '_preloadImages', + 'updateOnImagesReady', + '_loop', + '_loopAdditionalSlides', + '_loopedSlides', + '_loopFillGroupWithBlank', + 'loopPreventsSlide', + '_allowSlidePrev', + '_allowSlideNext', + '_swipeHandler', + '_noSwiping', + 'noSwipingClass', + 'noSwipingSelector', + 'passiveListeners', + 'containerModifierClass', + 'slideClass', + 'slideBlankClass', + 'slideActiveClass', + 'slideDuplicateActiveClass', + 'slideVisibleClass', + 'slideDuplicateClass', + 'slideNextClass', + 'slideDuplicateNextClass', + 'slidePrevClass', + 'slideDuplicatePrevClass', + 'wrapperClass', + 'runCallbacksOnInit', + 'observer', + 'observeParents', + 'observeSlideChildren', + // modules + 'a11y', + 'autoplay', + '_controller', + 'coverflowEffect', + 'cubeEffect', + 'fadeEffect', + 'flipEffect', + 'creativeEffect', + 'cardsEffect', + 'hashNavigation', + 'history', + 'keyboard', + 'lazy', + 'mousewheel', + '_navigation', + '_pagination', + 'parallax', + '_scrollbar', + '_thumbs', + 'virtual', + 'zoom', +]; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1zLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYW5ndWxhci9zcmMvdXRpbHMvcGFyYW1zLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixNQUFNO0lBQ04sU0FBUztJQUNULFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLFFBQVE7SUFDUixTQUFTO0lBQ1Qsc0JBQXNCO0lBQ3RCLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixTQUFTO0lBQ1QsZ0NBQWdDO0lBQ2hDLFdBQVc7SUFDWCxLQUFLO0lBQ0wscUJBQXFCO0lBQ3JCLHFCQUFxQjtJQUNyQixXQUFXO0lBQ1gsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixrQkFBa0I7SUFDbEIsU0FBUztJQUNULGFBQWE7SUFDYixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLE9BQU87SUFDUCxpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsMkJBQTJCO0lBQzNCLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QsWUFBWTtJQUNaLFlBQVk7SUFDWixlQUFlO0lBQ2YsY0FBYztJQUNkLGFBQWE7SUFDYixpQkFBaUI7SUFDakIsY0FBYztJQUNkLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLDBCQUEwQjtJQUMxQiwwQkFBMEI7SUFDMUIsK0JBQStCO0lBQy9CLHFCQUFxQjtJQUNyQixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixzQkFBc0I7SUFDdEIsYUFBYTtJQUNiLGVBQWU7SUFDZiwwQkFBMEI7SUFDMUIsc0JBQXNCO0lBQ3RCLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsT0FBTztJQUNQLHVCQUF1QjtJQUN2QixlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsd0JBQXdCO0lBQ3hCLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLDJCQUEyQjtJQUMzQixtQkFBbUI7SUFDbkIscUJBQXFCO0lBQ3JCLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsZ0JBQWdCO0lBQ2hCLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBRXRCLFVBQVU7SUFDVixNQUFNO0lBQ04sVUFBVTtJQUNWLGFBQWE7SUFDYixpQkFBaUI7SUFDakIsWUFBWTtJQUNaLFlBQVk7SUFDWixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsU0FBUztJQUNULFVBQVU7SUFDVixNQUFNO0lBQ04sWUFBWTtJQUNaLGFBQWE7SUFDYixhQUFhO0lBQ2IsVUFBVTtJQUNWLFlBQVk7SUFDWixTQUFTO0lBQ1QsU0FBUztJQUNULE1BQU07Q0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdW5kZXJzY29yZSBpbiBuYW1lIC0+IHdhdGNoIGZvciBjaGFuZ2VzICovXG5leHBvcnQgY29uc3QgcGFyYW1zTGlzdCA9IFtcbiAgJ2luaXQnLFxuICAnZW5hYmxlZCcsXG4gICdfZGlyZWN0aW9uJyxcbiAgJ3RvdWNoRXZlbnRzVGFyZ2V0JyxcbiAgJ2luaXRpYWxTbGlkZScsXG4gICdfc3BlZWQnLFxuICAnY3NzTW9kZScsXG4gICd1cGRhdGVPbldpbmRvd1Jlc2l6ZScsXG4gICdyZXNpemVPYnNlcnZlcicsXG4gICduZXN0ZWQnLFxuICAnZm9jdXNhYmxlRWxlbWVudHMnLFxuICAnX3dpZHRoJyxcbiAgJ19oZWlnaHQnLFxuICAncHJldmVudEludGVyYWN0aW9uT25UcmFuc2l0aW9uJyxcbiAgJ3VzZXJBZ2VudCcsXG4gICd1cmwnLFxuICAnX2VkZ2VTd2lwZURldGVjdGlvbicsXG4gICdfZWRnZVN3aXBlVGhyZXNob2xkJyxcbiAgJ19mcmVlTW9kZScsXG4gICdfYXV0b0hlaWdodCcsXG4gICdzZXRXcmFwcGVyU2l6ZScsXG4gICd2aXJ0dWFsVHJhbnNsYXRlJyxcbiAgJ19lZmZlY3QnLFxuICAnYnJlYWtwb2ludHMnLFxuICAnX3NwYWNlQmV0d2VlbicsXG4gICdfc2xpZGVzUGVyVmlldycsXG4gICdfZ3JpZCcsXG4gICdfc2xpZGVzUGVyR3JvdXAnLFxuICAnX3NsaWRlc1Blckdyb3VwU2tpcCcsXG4gICdfY2VudGVyZWRTbGlkZXMnLFxuICAnX2NlbnRlcmVkU2xpZGVzQm91bmRzJyxcbiAgJ19zbGlkZXNPZmZzZXRCZWZvcmUnLFxuICAnX3NsaWRlc09mZnNldEFmdGVyJyxcbiAgJ25vcm1hbGl6ZVNsaWRlSW5kZXgnLFxuICAnX2NlbnRlckluc3VmZmljaWVudFNsaWRlcycsXG4gICdfd2F0Y2hPdmVyZmxvdycsXG4gICdyb3VuZExlbmd0aHMnLFxuICAndG91Y2hSYXRpbycsXG4gICd0b3VjaEFuZ2xlJyxcbiAgJ3NpbXVsYXRlVG91Y2gnLFxuICAnX3Nob3J0U3dpcGVzJyxcbiAgJ19sb25nU3dpcGVzJyxcbiAgJ2xvbmdTd2lwZXNSYXRpbycsXG4gICdsb25nU3dpcGVzTXMnLFxuICAnX2ZvbGxvd0ZpbmdlcicsXG4gICdhbGxvd1RvdWNoTW92ZScsXG4gICdfdGhyZXNob2xkJyxcbiAgJ3RvdWNoTW92ZVN0b3BQcm9wYWdhdGlvbicsXG4gICd0b3VjaFN0YXJ0UHJldmVudERlZmF1bHQnLFxuICAndG91Y2hTdGFydEZvcmNlUHJldmVudERlZmF1bHQnLFxuICAndG91Y2hSZWxlYXNlT25FZGdlcycsXG4gICd1bmlxdWVOYXZFbGVtZW50cycsXG4gICdfcmVzaXN0YW5jZScsXG4gICdfcmVzaXN0YW5jZVJhdGlvJyxcbiAgJ193YXRjaFNsaWRlc1Byb2dyZXNzJyxcbiAgJ19ncmFiQ3Vyc29yJyxcbiAgJ3ByZXZlbnRDbGlja3MnLFxuICAncHJldmVudENsaWNrc1Byb3BhZ2F0aW9uJyxcbiAgJ19zbGlkZVRvQ2xpY2tlZFNsaWRlJyxcbiAgJ19wcmVsb2FkSW1hZ2VzJyxcbiAgJ3VwZGF0ZU9uSW1hZ2VzUmVhZHknLFxuICAnX2xvb3AnLFxuICAnX2xvb3BBZGRpdGlvbmFsU2xpZGVzJyxcbiAgJ19sb29wZWRTbGlkZXMnLFxuICAnX2xvb3BGaWxsR3JvdXBXaXRoQmxhbmsnLFxuICAnbG9vcFByZXZlbnRzU2xpZGUnLFxuICAnX2FsbG93U2xpZGVQcmV2JyxcbiAgJ19hbGxvd1NsaWRlTmV4dCcsXG4gICdfc3dpcGVIYW5kbGVyJyxcbiAgJ19ub1N3aXBpbmcnLFxuICAnbm9Td2lwaW5nQ2xhc3MnLFxuICAnbm9Td2lwaW5nU2VsZWN0b3InLFxuICAncGFzc2l2ZUxpc3RlbmVycycsXG4gICdjb250YWluZXJNb2RpZmllckNsYXNzJyxcbiAgJ3NsaWRlQ2xhc3MnLFxuICAnc2xpZGVCbGFua0NsYXNzJyxcbiAgJ3NsaWRlQWN0aXZlQ2xhc3MnLFxuICAnc2xpZGVEdXBsaWNhdGVBY3RpdmVDbGFzcycsXG4gICdzbGlkZVZpc2libGVDbGFzcycsXG4gICdzbGlkZUR1cGxpY2F0ZUNsYXNzJyxcbiAgJ3NsaWRlTmV4dENsYXNzJyxcbiAgJ3NsaWRlRHVwbGljYXRlTmV4dENsYXNzJyxcbiAgJ3NsaWRlUHJldkNsYXNzJyxcbiAgJ3NsaWRlRHVwbGljYXRlUHJldkNsYXNzJyxcbiAgJ3dyYXBwZXJDbGFzcycsXG4gICdydW5DYWxsYmFja3NPbkluaXQnLFxuICAnb2JzZXJ2ZXInLFxuICAnb2JzZXJ2ZVBhcmVudHMnLFxuICAnb2JzZXJ2ZVNsaWRlQ2hpbGRyZW4nLFxuXG4gIC8vIG1vZHVsZXNcbiAgJ2ExMXknLFxuICAnYXV0b3BsYXknLFxuICAnX2NvbnRyb2xsZXInLFxuICAnY292ZXJmbG93RWZmZWN0JyxcbiAgJ2N1YmVFZmZlY3QnLFxuICAnZmFkZUVmZmVjdCcsXG4gICdmbGlwRWZmZWN0JyxcbiAgJ2NyZWF0aXZlRWZmZWN0JyxcbiAgJ2NhcmRzRWZmZWN0JyxcbiAgJ2hhc2hOYXZpZ2F0aW9uJyxcbiAgJ2hpc3RvcnknLFxuICAna2V5Ym9hcmQnLFxuICAnbGF6eScsXG4gICdtb3VzZXdoZWVsJyxcbiAgJ19uYXZpZ2F0aW9uJyxcbiAgJ19wYWdpbmF0aW9uJyxcbiAgJ3BhcmFsbGF4JyxcbiAgJ19zY3JvbGxiYXInLFxuICAnX3RodW1icycsXG4gICd2aXJ0dWFsJyxcbiAgJ3pvb20nLFxuXTtcbiJdfQ== \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/utils/utils.js b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/utils/utils.js new file mode 100644 index 0000000..a0b22cc --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/esm2015/angular/src/utils/utils.js @@ -0,0 +1,49 @@ +export function isObject(o) { + return (typeof o === 'object' && + o !== null && + o.constructor && + Object.prototype.toString.call(o).slice(8, -1) === 'Object'); +} +export function isShowEl(val, obj, el) { + return ((coerceBooleanProperty(val) === true && obj && !obj.el) || + !(typeof obj !== 'boolean' && + obj.el !== (el === null || el === void 0 ? void 0 : el.nativeElement) && + (typeof obj.el === 'string' || typeof obj.el === 'object'))); +} +export function extend(target, src) { + const noExtend = ['__proto__', 'constructor', 'prototype']; + Object.keys(src) + .filter((key) => noExtend.indexOf(key) < 0) + .forEach((key) => { + if (typeof target[key] === 'undefined') { + target[key] = src[key]; + return; + } + if (target[key] && !src[key]) { + return; + } + if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) { + if (src[key].__swiper__) + target[key] = src[key]; + else + extend(target[key], src[key]); + } + else { + target[key] = src[key]; + } + }); +} +export function coerceBooleanProperty(value) { + return value != null && `${value}` !== 'false'; +} +export const ignoreNgOnChanges = ['pagination', 'navigation', 'scrollbar', 'virtual']; +export function setProperty(val, obj = {}) { + if (isObject(val)) { + return val; + } + if (coerceBooleanProperty(val) === true) { + return obj; + } + return false; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYW5ndWxhci9zcmMvdXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFFBQVEsQ0FBQyxDQUFNO0lBQzdCLE9BQU8sQ0FDTCxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQ3JCLENBQUMsS0FBSyxJQUFJO1FBQ1YsQ0FBQyxDQUFDLFdBQVc7UUFDYixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FDNUQsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQVEsRUFBRSxHQUFRLEVBQUUsRUFBTztJQUNsRCxPQUFPLENBQ0wsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxDQUFDLENBQ0MsT0FBTyxHQUFHLEtBQUssU0FBUztZQUN4QixHQUFHLENBQUMsRUFBRSxNQUFLLEVBQUUsYUFBRixFQUFFLHVCQUFGLEVBQUUsQ0FBRSxhQUFhLENBQUE7WUFDNUIsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FDM0QsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNLENBQUMsTUFBVyxFQUFFLEdBQVE7SUFDMUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ2IsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMxQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNmLElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssV0FBVyxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsT0FBTztTQUNSO1FBQ0QsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDNUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuRixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVO2dCQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O2dCQUMzQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3BDO2FBQU07WUFDTCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQVU7SUFDOUMsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLEtBQUssT0FBTyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRXRGLE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBUSxFQUFFLEdBQUcsR0FBRyxFQUFFO0lBQzVDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN2QyxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KG86IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJlxuICAgIG8gIT09IG51bGwgJiZcbiAgICBvLmNvbnN0cnVjdG9yICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKSA9PT0gJ09iamVjdCdcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2hvd0VsKHZhbDogYW55LCBvYmo6IGFueSwgZWw6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIChjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsKSA9PT0gdHJ1ZSAmJiBvYmogJiYgIW9iai5lbCkgfHxcbiAgICAhKFxuICAgICAgdHlwZW9mIG9iaiAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICBvYmouZWwgIT09IGVsPy5uYXRpdmVFbGVtZW50ICYmXG4gICAgICAodHlwZW9mIG9iai5lbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9iai5lbCA9PT0gJ29iamVjdCcpXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHRhcmdldDogYW55LCBzcmM6IGFueSkge1xuICBjb25zdCBub0V4dGVuZCA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICBPYmplY3Qua2V5cyhzcmMpXG4gICAgLmZpbHRlcigoa2V5KSA9PiBub0V4dGVuZC5pbmRleE9mKGtleSkgPCAwKVxuICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc3JjW2tleV07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXRba2V5XSAmJiAhc3JjW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHNyY1trZXldKSAmJiBpc09iamVjdCh0YXJnZXRba2V5XSkgJiYgT2JqZWN0LmtleXMoc3JjW2tleV0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHNyY1trZXldLl9fc3dpcGVyX18pIHRhcmdldFtrZXldID0gc3JjW2tleV07XG4gICAgICAgIGVsc2UgZXh0ZW5kKHRhcmdldFtrZXldLCBzcmNba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgYCR7dmFsdWV9YCAhPT0gJ2ZhbHNlJztcbn1cblxuZXhwb3J0IGNvbnN0IGlnbm9yZU5nT25DaGFuZ2VzID0gWydwYWdpbmF0aW9uJywgJ25hdmlnYXRpb24nLCAnc2Nyb2xsYmFyJywgJ3ZpcnR1YWwnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3BlcnR5KHZhbDogYW55LCBvYmogPSB7fSk6IHt9IHwgZmFsc2Uge1xuICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBpZiAoY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbCkgPT09IHRydWUpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19 \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/esm2015/swiper-angular.js b/src/main/resources/static/assets/js/swiper/angular/esm2015/swiper-angular.js new file mode 100644 index 0000000..96e42d6 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/esm2015/swiper-angular.js @@ -0,0 +1,2 @@ +export * from './angular/src/public-api'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpcGVyLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3dpcGVyLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywwQkFBMEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYW5ndWxhci9zcmMvcHVibGljLWFwaSc7XG4iXX0= \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/esm2015/swiper_angular.js b/src/main/resources/static/assets/js/swiper/angular/esm2015/swiper_angular.js new file mode 100644 index 0000000..5105204 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/esm2015/swiper_angular.js @@ -0,0 +1,5 @@ +/** + * Generated bundle index. Do not edit. + */ +export * from './swiper-angular'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpcGVyX2FuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3dpcGVyX2FuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3N3aXBlci1hbmd1bGFyJztcbiJdfQ== \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/fesm2015/swiper_angular.js b/src/main/resources/static/assets/js/swiper/angular/fesm2015/swiper_angular.js new file mode 100644 index 0000000..af4a317 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/fesm2015/swiper_angular.js @@ -0,0 +1,1402 @@ +import * as i0 from '@angular/core'; +import { Directive, Input, EventEmitter, PLATFORM_ID, Component, ChangeDetectionStrategy, ViewEncapsulation, Inject, Output, ViewChild, ContentChildren, HostBinding, NgModule } from '@angular/core'; +import * as i1 from '@angular/common'; +import { isPlatformBrowser, CommonModule } from '@angular/common'; +import Swiper from 'swiper'; +import { Subject, of } from 'rxjs'; + +function isObject(o) { + return (typeof o === 'object' && + o !== null && + o.constructor && + Object.prototype.toString.call(o).slice(8, -1) === 'Object'); +} +function isShowEl(val, obj, el) { + return ((coerceBooleanProperty(val) === true && obj && !obj.el) || + !(typeof obj !== 'boolean' && + obj.el !== (el === null || el === void 0 ? void 0 : el.nativeElement) && + (typeof obj.el === 'string' || typeof obj.el === 'object'))); +} +function extend(target, src) { + const noExtend = ['__proto__', 'constructor', 'prototype']; + Object.keys(src) + .filter((key) => noExtend.indexOf(key) < 0) + .forEach((key) => { + if (typeof target[key] === 'undefined') { + target[key] = src[key]; + return; + } + if (target[key] && !src[key]) { + return; + } + if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) { + if (src[key].__swiper__) + target[key] = src[key]; + else + extend(target[key], src[key]); + } + else { + target[key] = src[key]; + } + }); +} +function coerceBooleanProperty(value) { + return value != null && `${value}` !== 'false'; +} +const ignoreNgOnChanges = ['pagination', 'navigation', 'scrollbar', 'virtual']; +function setProperty(val, obj = {}) { + if (isObject(val)) { + return val; + } + if (coerceBooleanProperty(val) === true) { + return obj; + } + return false; +} + +/* underscore in name -> watch for changes */ +const paramsList = [ + 'init', + 'enabled', + '_direction', + 'touchEventsTarget', + 'initialSlide', + '_speed', + 'cssMode', + 'updateOnWindowResize', + 'resizeObserver', + 'nested', + 'focusableElements', + '_width', + '_height', + 'preventInteractionOnTransition', + 'userAgent', + 'url', + '_edgeSwipeDetection', + '_edgeSwipeThreshold', + '_freeMode', + '_autoHeight', + 'setWrapperSize', + 'virtualTranslate', + '_effect', + 'breakpoints', + '_spaceBetween', + '_slidesPerView', + '_grid', + '_slidesPerGroup', + '_slidesPerGroupSkip', + '_centeredSlides', + '_centeredSlidesBounds', + '_slidesOffsetBefore', + '_slidesOffsetAfter', + 'normalizeSlideIndex', + '_centerInsufficientSlides', + '_watchOverflow', + 'roundLengths', + 'touchRatio', + 'touchAngle', + 'simulateTouch', + '_shortSwipes', + '_longSwipes', + 'longSwipesRatio', + 'longSwipesMs', + '_followFinger', + 'allowTouchMove', + '_threshold', + 'touchMoveStopPropagation', + 'touchStartPreventDefault', + 'touchStartForcePreventDefault', + 'touchReleaseOnEdges', + 'uniqueNavElements', + '_resistance', + '_resistanceRatio', + '_watchSlidesProgress', + '_grabCursor', + 'preventClicks', + 'preventClicksPropagation', + '_slideToClickedSlide', + '_preloadImages', + 'updateOnImagesReady', + '_loop', + '_loopAdditionalSlides', + '_loopedSlides', + '_loopFillGroupWithBlank', + 'loopPreventsSlide', + '_allowSlidePrev', + '_allowSlideNext', + '_swipeHandler', + '_noSwiping', + 'noSwipingClass', + 'noSwipingSelector', + 'passiveListeners', + 'containerModifierClass', + 'slideClass', + 'slideBlankClass', + 'slideActiveClass', + 'slideDuplicateActiveClass', + 'slideVisibleClass', + 'slideDuplicateClass', + 'slideNextClass', + 'slideDuplicateNextClass', + 'slidePrevClass', + 'slideDuplicatePrevClass', + 'wrapperClass', + 'runCallbacksOnInit', + 'observer', + 'observeParents', + 'observeSlideChildren', + // modules + 'a11y', + 'autoplay', + '_controller', + 'coverflowEffect', + 'cubeEffect', + 'fadeEffect', + 'flipEffect', + 'creativeEffect', + 'cardsEffect', + 'hashNavigation', + 'history', + 'keyboard', + 'lazy', + 'mousewheel', + '_navigation', + '_pagination', + 'parallax', + '_scrollbar', + '_thumbs', + 'virtual', + 'zoom', +]; + +// eslint-disable-next-line +const allowedParams = paramsList.map((key) => key.replace(/_/, '')); +function getParams(obj = {}) { + const params = { + on: {}, + }; + const passedParams = {}; + extend(params, Swiper.defaults); + extend(params, Swiper.extendedDefaults); + params._emitClasses = true; + const rest = {}; + Object.keys(obj).forEach((key) => { + const _key = key.replace(/^_/, ''); + if (typeof obj[_key] === 'undefined') + return; + if (allowedParams.indexOf(_key) >= 0) { + if (isObject(obj[_key])) { + params[_key] = {}; + passedParams[_key] = {}; + extend(params[_key], obj[_key]); + extend(passedParams[_key], obj[_key]); + } + else { + params[_key] = obj[_key]; + passedParams[_key] = obj[_key]; + } + } + else { + rest[_key] = obj[_key]; + } + }); + return { params, passedParams, rest }; +} + +class SwiperSlideDirective { + constructor(template) { + this.template = template; + this.class = ''; + this.autoplayDelay = null; + this.slideData = { + isActive: false, + isPrev: false, + isNext: false, + isVisible: false, + isDuplicate: false, + }; + } + set zoom(val) { + this._zoom = coerceBooleanProperty(val); + } + get zoom() { + return this._zoom; + } + get classNames() { + return this._classNames; + } + set classNames(val) { + if (this._classNames === val) { + return; + } + this._classNames = val; + this.slideData = { + isActive: this._hasClass(['swiper-slide-active', 'swiper-slide-duplicate-active']), + isVisible: this._hasClass(['swiper-slide-visible']), + isDuplicate: this._hasClass(['swiper-slide-duplicate']), + isPrev: this._hasClass(['swiper-slide-prev', 'swiper-slide-duplicate-prev']), + isNext: this._hasClass(['swiper-slide-next', 'swiper-slide-duplicate-next']), + }; + } + _hasClass(classNames) { + return classNames.some((className) => this._classNames.indexOf(className) >= 0); + } +} +SwiperSlideDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperSlideDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); +SwiperSlideDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.2", type: SwiperSlideDirective, selector: "ng-template[swiperSlide]", inputs: { virtualIndex: "virtualIndex", class: "class", autoplayDelay: ["data-swiper-autoplay", "autoplayDelay"], zoom: "zoom" }, ngImport: i0 }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperSlideDirective, decorators: [{ + type: Directive, + args: [{ + selector: 'ng-template[swiperSlide]', + }] + }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; }, propDecorators: { virtualIndex: [{ + type: Input + }], class: [{ + type: Input + }], autoplayDelay: [{ + type: Input, + args: ['data-swiper-autoplay'] + }], zoom: [{ + type: Input + }] } }); + +class SwiperComponent { + constructor(_ngZone, elementRef, _changeDetectorRef, _platformId) { + this._ngZone = _ngZone; + this.elementRef = elementRef; + this._changeDetectorRef = _changeDetectorRef; + this._platformId = _platformId; + this.slideClass = 'swiper-slide'; + this.wrapperClass = 'swiper-wrapper'; + this.showNavigation = true; + this.showPagination = true; + this.showScrollbar = true; + // prettier-ignore + this.s__beforeBreakpoint = new EventEmitter(); + // prettier-ignore + this.s__containerClasses = new EventEmitter(); + // prettier-ignore + this.s__slideClass = new EventEmitter(); + // prettier-ignore + this.s__swiper = new EventEmitter(); + // prettier-ignore + this.s_activeIndexChange = new EventEmitter(); + // prettier-ignore + this.s_afterInit = new EventEmitter(); + // prettier-ignore + this.s_autoplay = new EventEmitter(); + // prettier-ignore + this.s_autoplayStart = new EventEmitter(); + // prettier-ignore + this.s_autoplayStop = new EventEmitter(); + // prettier-ignore + this.s_beforeDestroy = new EventEmitter(); + // prettier-ignore + this.s_beforeInit = new EventEmitter(); + // prettier-ignore + this.s_beforeLoopFix = new EventEmitter(); + // prettier-ignore + this.s_beforeResize = new EventEmitter(); + // prettier-ignore + this.s_beforeSlideChangeStart = new EventEmitter(); + // prettier-ignore + this.s_beforeTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_breakpoint = new EventEmitter(); + // prettier-ignore + this.s_changeDirection = new EventEmitter(); + // prettier-ignore + this.s_click = new EventEmitter(); + // prettier-ignore + this.s_doubleTap = new EventEmitter(); + // prettier-ignore + this.s_doubleClick = new EventEmitter(); + // prettier-ignore + this.s_destroy = new EventEmitter(); + // prettier-ignore + this.s_fromEdge = new EventEmitter(); + // prettier-ignore + this.s_hashChange = new EventEmitter(); + // prettier-ignore + this.s_hashSet = new EventEmitter(); + // prettier-ignore + this.s_imagesReady = new EventEmitter(); + // prettier-ignore + this.s_init = new EventEmitter(); + // prettier-ignore + this.s_keyPress = new EventEmitter(); + // prettier-ignore + this.s_lazyImageLoad = new EventEmitter(); + // prettier-ignore + this.s_lazyImageReady = new EventEmitter(); + // prettier-ignore + this.s_loopFix = new EventEmitter(); + // prettier-ignore + this.s_momentumBounce = new EventEmitter(); + // prettier-ignore + this.s_navigationHide = new EventEmitter(); + // prettier-ignore + this.s_navigationShow = new EventEmitter(); + // prettier-ignore + this.s_observerUpdate = new EventEmitter(); + // prettier-ignore + this.s_orientationchange = new EventEmitter(); + // prettier-ignore + this.s_paginationHide = new EventEmitter(); + // prettier-ignore + this.s_paginationRender = new EventEmitter(); + // prettier-ignore + this.s_paginationShow = new EventEmitter(); + // prettier-ignore + this.s_paginationUpdate = new EventEmitter(); + // prettier-ignore + this.s_progress = new EventEmitter(); + // prettier-ignore + this.s_reachBeginning = new EventEmitter(); + // prettier-ignore + this.s_reachEnd = new EventEmitter(); + // prettier-ignore + this.s_realIndexChange = new EventEmitter(); + // prettier-ignore + this.s_resize = new EventEmitter(); + // prettier-ignore + this.s_scroll = new EventEmitter(); + // prettier-ignore + this.s_scrollbarDragEnd = new EventEmitter(); + // prettier-ignore + this.s_scrollbarDragMove = new EventEmitter(); + // prettier-ignore + this.s_scrollbarDragStart = new EventEmitter(); + // prettier-ignore + this.s_setTransition = new EventEmitter(); + // prettier-ignore + this.s_setTranslate = new EventEmitter(); + // prettier-ignore + this.s_slideChange = new EventEmitter(); + // prettier-ignore + this.s_slideChangeTransitionEnd = new EventEmitter(); + // prettier-ignore + this.s_slideChangeTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_slideNextTransitionEnd = new EventEmitter(); + // prettier-ignore + this.s_slideNextTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_slidePrevTransitionEnd = new EventEmitter(); + // prettier-ignore + this.s_slidePrevTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_slideResetTransitionStart = new EventEmitter(); + // prettier-ignore + this.s_slideResetTransitionEnd = new EventEmitter(); + // prettier-ignore + this.s_sliderMove = new EventEmitter(); + // prettier-ignore + this.s_sliderFirstMove = new EventEmitter(); + // prettier-ignore + this.s_slidesLengthChange = new EventEmitter(); + // prettier-ignore + this.s_slidesGridLengthChange = new EventEmitter(); + // prettier-ignore + this.s_snapGridLengthChange = new EventEmitter(); + // prettier-ignore + this.s_snapIndexChange = new EventEmitter(); + // prettier-ignore + this.s_tap = new EventEmitter(); + // prettier-ignore + this.s_toEdge = new EventEmitter(); + // prettier-ignore + this.s_touchEnd = new EventEmitter(); + // prettier-ignore + this.s_touchMove = new EventEmitter(); + // prettier-ignore + this.s_touchMoveOpposite = new EventEmitter(); + // prettier-ignore + this.s_touchStart = new EventEmitter(); + // prettier-ignore + this.s_transitionEnd = new EventEmitter(); + // prettier-ignore + this.s_transitionStart = new EventEmitter(); + // prettier-ignore + this.s_update = new EventEmitter(); + // prettier-ignore + this.s_zoomChange = new EventEmitter(); + // prettier-ignore + this.s_swiper = new EventEmitter(); + this.indexChange = new EventEmitter(); + this._activeSlides = new Subject(); + this.containerClasses = 'swiper'; + this.slidesChanges = (val) => { + this.slides = val.map((slide, index) => { + slide.slideIndex = index; + slide.classNames = this.slideClass || ''; + return slide; + }); + if (this.loop && !this.loopedSlides) { + this.calcLoopedSlides(); + } + if (!this.virtual) { + if (this.loopedSlides) { + this.prependSlides = of(this.slides.slice(this.slides.length - this.loopedSlides)); + this.appendSlides = of(this.slides.slice(0, this.loopedSlides)); + } + } + else if (this.swiperRef && this.swiperRef.virtual) { + this._ngZone.runOutsideAngular(() => { + this.swiperRef.virtual.slides = this.slides; + this.swiperRef.virtual.update(true); + }); + } + this._changeDetectorRef.detectChanges(); + }; + this.style = null; + this.updateVirtualSlides = (virtualData) => { + // TODO: type virtualData + if (!this.swiperRef || + (this.currentVirtualData && + this.currentVirtualData.from === virtualData.from && + this.currentVirtualData.to === virtualData.to && + this.currentVirtualData.offset === virtualData.offset)) { + return; + } + this.style = this.swiperRef.isHorizontal() + ? { + [this.swiperRef.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px`, + } + : { + top: `${virtualData.offset}px`, + }; + this.currentVirtualData = virtualData; + this._activeSlides.next(virtualData.slides); + this._ngZone.run(() => { + this._changeDetectorRef.detectChanges(); + }); + this._ngZone.runOutsideAngular(() => { + this.swiperRef.updateSlides(); + this.swiperRef.updateProgress(); + this.swiperRef.updateSlidesClasses(); + if (this.swiperRef.lazy && this.swiperRef.params.lazy['enabled']) { + this.swiperRef.lazy.load(); + } + this.swiperRef.virtual.update(true); + }); + return; + }; + } + set navigation(val) { + var _a, _b, _c; + const currentNext = typeof this._navigation !== 'boolean' && this._navigation !== '' + ? (_a = this._navigation) === null || _a === void 0 ? void 0 : _a.nextEl + : null; + const currentPrev = typeof this._navigation !== 'boolean' && this._navigation !== '' + ? (_b = this._navigation) === null || _b === void 0 ? void 0 : _b.prevEl + : null; + this._navigation = setProperty(val, { + nextEl: currentNext || null, + prevEl: currentPrev || null, + }); + this.showNavigation = !(coerceBooleanProperty(val) !== true || + (this._navigation && + typeof this._navigation !== 'boolean' && + this._navigation.prevEl !== ((_c = this._prevElRef) === null || _c === void 0 ? void 0 : _c.nativeElement) && + (this._navigation.prevEl !== null || this._navigation.nextEl !== null) && + (typeof this._navigation.nextEl === 'string' || + typeof this._navigation.prevEl === 'string' || + typeof this._navigation.nextEl === 'object' || + typeof this._navigation.prevEl === 'object'))); + } + get navigation() { + return this._navigation; + } + set pagination(val) { + var _a; + const current = typeof this._pagination !== 'boolean' && this._pagination !== '' + ? (_a = this._pagination) === null || _a === void 0 ? void 0 : _a.el + : null; + this._pagination = setProperty(val, { + el: current || null, + }); + this.showPagination = isShowEl(val, this._pagination, this._paginationElRef); + } + get pagination() { + return this._pagination; + } + set scrollbar(val) { + var _a; + const current = typeof this._scrollbar !== 'boolean' && this._scrollbar !== '' ? (_a = this._scrollbar) === null || _a === void 0 ? void 0 : _a.el : null; + this._scrollbar = setProperty(val, { + el: current || null, + }); + this.showScrollbar = isShowEl(val, this._scrollbar, this._scrollbarElRef); + } + get scrollbar() { + return this._scrollbar; + } + set virtual(val) { + this._virtual = setProperty(val); + } + get virtual() { + return this._virtual; + } + set index(index) { + console.warn('`[(index)]` prop is deprecated and will be removed in upcoming versions'); + this.setIndex(index); + } + set config(val) { + this.updateSwiper(val); + const { params } = getParams(val); + Object.assign(this, params); + } + set prevElRef(el) { + this._prevElRef = el; + this._setElement(el, this.navigation, 'navigation', 'prevEl'); + } + set nextElRef(el) { + this._nextElRef = el; + this._setElement(el, this.navigation, 'navigation', 'nextEl'); + } + set scrollbarElRef(el) { + this._scrollbarElRef = el; + this._setElement(el, this.scrollbar, 'scrollbar'); + } + set paginationElRef(el) { + this._paginationElRef = el; + this._setElement(el, this.pagination, 'pagination'); + } + get activeSlides() { + if (this.virtual) { + return this._activeSlides; + } + return of(this.slides); + } + get zoomContainerClass() { + return this.zoom && typeof this.zoom !== 'boolean' + ? this.zoom.containerClass + : 'swiper-zoom-container'; + } + _setElement(el, ref, update, key = 'el') { + if (!el || !ref) { + return; + } + if (ref && el.nativeElement) { + if (ref[key] === el.nativeElement) { + return; + } + ref[key] = el.nativeElement; + } + const updateObj = {}; + updateObj[update] = true; + this.updateInitSwiper(updateObj); + } + ngOnInit() { + const { params } = getParams(this); + Object.assign(this, params); + } + ngAfterViewInit() { + this.childrenSlidesInit(); + this.initSwiper(); + this._changeDetectorRef.detectChanges(); + setTimeout(() => { + this.s_swiper.emit(this.swiperRef); + }); + } + childrenSlidesInit() { + this.slidesChanges(this.slidesEl); + this.slidesEl.changes.subscribe(this.slidesChanges); + } + get isSwiperActive() { + return this.swiperRef && !this.swiperRef.destroyed; + } + initSwiper() { + const { params: swiperParams, passedParams } = getParams(this); + Object.assign(this, swiperParams); + this._ngZone.runOutsideAngular(() => { + swiperParams.init = false; + if (!swiperParams.virtual) { + swiperParams.observer = true; + } + swiperParams.onAny = (eventName, ...args) => { + const emitter = this[('s_' + eventName)]; + if (emitter) { + emitter.emit(...args); + } + }; + const _slideClasses = (_, updated) => { + updated.forEach(({ slideEl, classNames }, index) => { + const dataIndex = slideEl.getAttribute('data-swiper-slide-index'); + const slideIndex = dataIndex ? parseInt(dataIndex) : index; + if (this.virtual) { + const virtualSlide = this.slides.find((item) => { + return item.virtualIndex && item.virtualIndex === slideIndex; + }); + if (virtualSlide) { + virtualSlide.classNames = classNames; + return; + } + } + if (this.slides[slideIndex]) { + this.slides[slideIndex].classNames = classNames; + } + }); + this._changeDetectorRef.detectChanges(); + }; + const _containerClasses = (_, classes) => { + setTimeout(() => { + this.containerClasses = classes; + }); + }; + Object.assign(swiperParams.on, { + _containerClasses, + _slideClasses, + }); + const swiperRef = new Swiper(swiperParams); + swiperRef.loopCreate = () => { }; + swiperRef.loopDestroy = () => { }; + if (swiperParams.loop) { + swiperRef.loopedSlides = this.loopedSlides; + } + const isVirtualEnabled = typeof swiperRef.params.virtual !== 'undefined' && + typeof swiperRef.params.virtual !== 'boolean' && + swiperRef.params.virtual.enabled; + if (swiperRef.virtual && isVirtualEnabled) { + swiperRef.virtual.slides = this.slides; + const extendWith = { + cache: false, + slides: this.slides, + renderExternal: this.updateVirtualSlides, + renderExternalUpdate: false, + }; + extend(swiperRef.params.virtual, extendWith); + extend(swiperRef.originalParams.virtual, extendWith); + } + if (isPlatformBrowser(this._platformId)) { + this.swiperRef = swiperRef.init(this.elementRef.nativeElement); + const isEnabled = typeof this.swiperRef.params.virtual !== 'undefined' && + typeof this.swiperRef.params.virtual !== 'boolean' && + this.swiperRef.params.virtual.enabled; + if (this.swiperRef.virtual && isEnabled) { + this.swiperRef.virtual.update(true); + } + this._changeDetectorRef.detectChanges(); + swiperRef.on('slideChange', () => { + this.indexChange.emit(this.swiperRef.realIndex); + }); + } + }); + } + ngOnChanges(changedParams) { + this.updateSwiper(changedParams); + this._changeDetectorRef.detectChanges(); + } + updateInitSwiper(changedParams) { + if (!(changedParams && this.swiperRef && !this.swiperRef.destroyed)) { + return; + } + this._ngZone.runOutsideAngular(() => { + const { params: currentParams, pagination, navigation, scrollbar, virtual, thumbs, } = this.swiperRef; + if (changedParams.pagination) { + if (this.pagination && + typeof this.pagination !== 'boolean' && + this.pagination.el && + pagination && + !pagination.el) { + this.updateParameter('pagination', this.pagination); + pagination.init(); + pagination.render(); + pagination.update(); + } + else { + pagination.destroy(); + pagination.el = null; + } + } + if (changedParams.scrollbar) { + if (this.scrollbar && + typeof this.scrollbar !== 'boolean' && + this.scrollbar.el && + scrollbar && + !scrollbar.el) { + this.updateParameter('scrollbar', this.scrollbar); + scrollbar.init(); + scrollbar.updateSize(); + scrollbar.setTranslate(); + } + else { + scrollbar.destroy(); + scrollbar.el = null; + } + } + if (changedParams.navigation) { + if (this.navigation && + typeof this.navigation !== 'boolean' && + this.navigation.prevEl && + this.navigation.nextEl && + navigation && + !navigation.prevEl && + !navigation.nextEl) { + this.updateParameter('navigation', this.navigation); + navigation.init(); + navigation.update(); + } + else if (navigation.prevEl && navigation.nextEl) { + navigation.destroy(); + navigation.nextEl = null; + navigation.prevEl = null; + } + } + if (changedParams.thumbs && this.thumbs && this.thumbs.swiper) { + this.updateParameter('thumbs', this.thumbs); + const initialized = thumbs.init(); + if (initialized) + thumbs.update(true); + } + if (changedParams.controller && this.controller && this.controller.control) { + this.swiperRef.controller.control = this.controller.control; + } + this.swiperRef.update(); + }); + } + updateSwiper(changedParams) { + this._ngZone.runOutsideAngular(() => { + var _a, _b; + if (changedParams.config) { + return; + } + if (!(changedParams && this.swiperRef && !this.swiperRef.destroyed)) { + return; + } + for (const key in changedParams) { + if (ignoreNgOnChanges.indexOf(key) >= 0) { + continue; + } + const newValue = (_b = (_a = changedParams[key]) === null || _a === void 0 ? void 0 : _a.currentValue) !== null && _b !== void 0 ? _b : changedParams[key]; + this.updateParameter(key, newValue); + } + if (changedParams.allowSlideNext) { + this.swiperRef.allowSlideNext = this.allowSlideNext; + } + if (changedParams.allowSlidePrev) { + this.swiperRef.allowSlidePrev = this.allowSlidePrev; + } + if (changedParams.direction) { + this.swiperRef.changeDirection(this.direction, false); + } + if (changedParams.breakpoints) { + if (this.loop && !this.loopedSlides) { + this.calcLoopedSlides(); + } + this.swiperRef.currentBreakpoint = null; + this.swiperRef.setBreakpoint(); + } + if (changedParams.thumbs || changedParams.controller) { + this.updateInitSwiper(changedParams); + } + this.swiperRef.update(); + }); + } + calcLoopedSlides() { + if (!this.loop) { + return; + } + let slidesPerViewParams = this.slidesPerView; + if (this.breakpoints) { + const breakpoint = Swiper.prototype.getBreakpoint(this.breakpoints); + const breakpointOnlyParams = breakpoint in this.breakpoints ? this.breakpoints[breakpoint] : undefined; + if (breakpointOnlyParams && breakpointOnlyParams.slidesPerView) { + slidesPerViewParams = breakpointOnlyParams.slidesPerView; + } + } + if (slidesPerViewParams === 'auto') { + this.loopedSlides = this.slides.length; + return this.slides.length; + } + let loopedSlides = this.loopedSlides || slidesPerViewParams; + if (!loopedSlides) { + // ? + return; + } + if (this.loopAdditionalSlides) { + loopedSlides += this.loopAdditionalSlides; + } + if (loopedSlides > this.slides.length) { + loopedSlides = this.slides.length; + } + this.loopedSlides = loopedSlides; + return loopedSlides; + } + updateParameter(key, value) { + if (!(this.swiperRef && !this.swiperRef.destroyed)) { + return; + } + const _key = key.replace(/^_/, ''); + const isCurrentParamObj = isObject(this.swiperRef.params[_key]); + if (Object.keys(this.swiperRef.modules).indexOf(_key) >= 0) { + const defaultParams = this.swiperRef.modules[_key].params[_key]; + if (isCurrentParamObj) { + extend(this.swiperRef.params[_key], defaultParams); + } + else { + this.swiperRef.params[_key] = defaultParams; + } + } + if (_key === 'enabled') { + if (value === true) { + this.swiperRef.enable(); + } + else if (value === false) { + this.swiperRef.disable(); + } + return; + } + if (isCurrentParamObj && isObject(value)) { + extend(this.swiperRef.params[_key], value); + } + else { + this.swiperRef.params[_key] = value; + } + } + /** + * @deprecated will be removed in upcoming versions + */ + setIndex(index, speed, silent) { + if (!this.isSwiperActive) { + this.initialSlide = index; + return; + } + if (index === this.swiperRef.activeIndex) { + return; + } + this._ngZone.runOutsideAngular(() => { + if (this.loop) { + this.swiperRef.slideToLoop(index, speed, !silent); + } + else { + this.swiperRef.slideTo(index, speed, !silent); + } + }); + } + ngOnDestroy() { + this._ngZone.runOutsideAngular(() => { + var _a; + (_a = this.swiperRef) === null || _a === void 0 ? void 0 : _a.destroy(true, false); + }); + } +} +SwiperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); +SwiperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.2", type: SwiperComponent, selector: "swiper, [swiper]", inputs: { enabled: "enabled", direction: "direction", touchEventsTarget: "touchEventsTarget", initialSlide: "initialSlide", speed: "speed", cssMode: "cssMode", updateOnWindowResize: "updateOnWindowResize", resizeObserver: "resizeObserver", nested: "nested", focusableElements: "focusableElements", width: "width", height: "height", preventInteractionOnTransition: "preventInteractionOnTransition", userAgent: "userAgent", url: "url", edgeSwipeDetection: "edgeSwipeDetection", edgeSwipeThreshold: "edgeSwipeThreshold", freeMode: "freeMode", autoHeight: "autoHeight", setWrapperSize: "setWrapperSize", virtualTranslate: "virtualTranslate", effect: "effect", breakpoints: "breakpoints", spaceBetween: "spaceBetween", slidesPerView: "slidesPerView", grid: "grid", slidesPerGroup: "slidesPerGroup", slidesPerGroupSkip: "slidesPerGroupSkip", centeredSlides: "centeredSlides", centeredSlidesBounds: "centeredSlidesBounds", slidesOffsetBefore: "slidesOffsetBefore", slidesOffsetAfter: "slidesOffsetAfter", normalizeSlideIndex: "normalizeSlideIndex", centerInsufficientSlides: "centerInsufficientSlides", watchOverflow: "watchOverflow", roundLengths: "roundLengths", touchRatio: "touchRatio", touchAngle: "touchAngle", simulateTouch: "simulateTouch", shortSwipes: "shortSwipes", longSwipes: "longSwipes", longSwipesRatio: "longSwipesRatio", longSwipesMs: "longSwipesMs", followFinger: "followFinger", allowTouchMove: "allowTouchMove", threshold: "threshold", touchMoveStopPropagation: "touchMoveStopPropagation", touchStartPreventDefault: "touchStartPreventDefault", touchStartForcePreventDefault: "touchStartForcePreventDefault", touchReleaseOnEdges: "touchReleaseOnEdges", uniqueNavElements: "uniqueNavElements", resistance: "resistance", resistanceRatio: "resistanceRatio", watchSlidesProgress: "watchSlidesProgress", grabCursor: "grabCursor", preventClicks: "preventClicks", preventClicksPropagation: "preventClicksPropagation", slideToClickedSlide: "slideToClickedSlide", preloadImages: "preloadImages", updateOnImagesReady: "updateOnImagesReady", loop: "loop", loopAdditionalSlides: "loopAdditionalSlides", loopedSlides: "loopedSlides", loopFillGroupWithBlank: "loopFillGroupWithBlank", loopPreventsSlide: "loopPreventsSlide", allowSlidePrev: "allowSlidePrev", allowSlideNext: "allowSlideNext", swipeHandler: "swipeHandler", noSwiping: "noSwiping", noSwipingClass: "noSwipingClass", noSwipingSelector: "noSwipingSelector", passiveListeners: "passiveListeners", containerModifierClass: "containerModifierClass", slideClass: "slideClass", slideBlankClass: "slideBlankClass", slideActiveClass: "slideActiveClass", slideDuplicateActiveClass: "slideDuplicateActiveClass", slideVisibleClass: "slideVisibleClass", slideDuplicateClass: "slideDuplicateClass", slideNextClass: "slideNextClass", slideDuplicateNextClass: "slideDuplicateNextClass", slidePrevClass: "slidePrevClass", slideDuplicatePrevClass: "slideDuplicatePrevClass", wrapperClass: "wrapperClass", runCallbacksOnInit: "runCallbacksOnInit", observeParents: "observeParents", observeSlideChildren: "observeSlideChildren", a11y: "a11y", autoplay: "autoplay", controller: "controller", coverflowEffect: "coverflowEffect", cubeEffect: "cubeEffect", fadeEffect: "fadeEffect", flipEffect: "flipEffect", creativeEffect: "creativeEffect", cardsEffect: "cardsEffect", hashNavigation: "hashNavigation", history: "history", keyboard: "keyboard", lazy: "lazy", mousewheel: "mousewheel", parallax: "parallax", thumbs: "thumbs", zoom: "zoom", class: "class", id: "id", navigation: "navigation", pagination: "pagination", scrollbar: "scrollbar", virtual: "virtual", index: "index", config: "config" }, outputs: { s__beforeBreakpoint: "_beforeBreakpoint", s__containerClasses: "_containerClasses", s__slideClass: "_slideClass", s__swiper: "_swiper", s_activeIndexChange: "activeIndexChange", s_afterInit: "afterInit", s_autoplay: "autoplay", s_autoplayStart: "autoplayStart", s_autoplayStop: "autoplayStop", s_beforeDestroy: "beforeDestroy", s_beforeInit: "beforeInit", s_beforeLoopFix: "beforeLoopFix", s_beforeResize: "beforeResize", s_beforeSlideChangeStart: "beforeSlideChangeStart", s_beforeTransitionStart: "beforeTransitionStart", s_breakpoint: "breakpoint", s_changeDirection: "changeDirection", s_click: "click", s_doubleTap: "doubleTap", s_doubleClick: "doubleClick", s_destroy: "destroy", s_fromEdge: "fromEdge", s_hashChange: "hashChange", s_hashSet: "hashSet", s_imagesReady: "imagesReady", s_init: "init", s_keyPress: "keyPress", s_lazyImageLoad: "lazyImageLoad", s_lazyImageReady: "lazyImageReady", s_loopFix: "loopFix", s_momentumBounce: "momentumBounce", s_navigationHide: "navigationHide", s_navigationShow: "navigationShow", s_observerUpdate: "observerUpdate", s_orientationchange: "orientationchange", s_paginationHide: "paginationHide", s_paginationRender: "paginationRender", s_paginationShow: "paginationShow", s_paginationUpdate: "paginationUpdate", s_progress: "progress", s_reachBeginning: "reachBeginning", s_reachEnd: "reachEnd", s_realIndexChange: "realIndexChange", s_resize: "resize", s_scroll: "scroll", s_scrollbarDragEnd: "scrollbarDragEnd", s_scrollbarDragMove: "scrollbarDragMove", s_scrollbarDragStart: "scrollbarDragStart", s_setTransition: "setTransition", s_setTranslate: "setTranslate", s_slideChange: "slideChange", s_slideChangeTransitionEnd: "slideChangeTransitionEnd", s_slideChangeTransitionStart: "slideChangeTransitionStart", s_slideNextTransitionEnd: "slideNextTransitionEnd", s_slideNextTransitionStart: "slideNextTransitionStart", s_slidePrevTransitionEnd: "slidePrevTransitionEnd", s_slidePrevTransitionStart: "slidePrevTransitionStart", s_slideResetTransitionStart: "slideResetTransitionStart", s_slideResetTransitionEnd: "slideResetTransitionEnd", s_sliderMove: "sliderMove", s_sliderFirstMove: "sliderFirstMove", s_slidesLengthChange: "slidesLengthChange", s_slidesGridLengthChange: "slidesGridLengthChange", s_snapGridLengthChange: "snapGridLengthChange", s_snapIndexChange: "snapIndexChange", s_tap: "tap", s_toEdge: "toEdge", s_touchEnd: "touchEnd", s_touchMove: "touchMove", s_touchMoveOpposite: "touchMoveOpposite", s_touchStart: "touchStart", s_transitionEnd: "transitionEnd", s_transitionStart: "transitionStart", s_update: "update", s_zoomChange: "zoomChange", s_swiper: "swiper", indexChange: "indexChange" }, host: { properties: { "class": "this.containerClasses" } }, queries: [{ propertyName: "slidesEl", predicate: SwiperSlideDirective }], viewQueries: [{ propertyName: "prevElRef", first: true, predicate: ["prevElRef"], descendants: true }, { propertyName: "nextElRef", first: true, predicate: ["nextElRef"], descendants: true }, { propertyName: "scrollbarElRef", first: true, predicate: ["scrollbarElRef"], descendants: true }, { propertyName: "paginationElRef", first: true, predicate: ["paginationElRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "\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", styles: ["\n swiper {\n display: block;\n }\n "], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }], pipes: { "async": i1.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperComponent, decorators: [{ + type: Component, + args: [{ + selector: 'swiper, [swiper]', + templateUrl: './swiper.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + styles: [ + ` + swiper { + display: block; + } + `, + ], + }] + }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: Object, decorators: [{ + type: Inject, + args: [PLATFORM_ID] + }] }]; }, propDecorators: { enabled: [{ + type: Input + }], direction: [{ + type: Input + }], touchEventsTarget: [{ + type: Input + }], initialSlide: [{ + type: Input + }], speed: [{ + type: Input + }], cssMode: [{ + type: Input + }], updateOnWindowResize: [{ + type: Input + }], resizeObserver: [{ + type: Input + }], nested: [{ + type: Input + }], focusableElements: [{ + type: Input + }], width: [{ + type: Input + }], height: [{ + type: Input + }], preventInteractionOnTransition: [{ + type: Input + }], userAgent: [{ + type: Input + }], url: [{ + type: Input + }], edgeSwipeDetection: [{ + type: Input + }], edgeSwipeThreshold: [{ + type: Input + }], freeMode: [{ + type: Input + }], autoHeight: [{ + type: Input + }], setWrapperSize: [{ + type: Input + }], virtualTranslate: [{ + type: Input + }], effect: [{ + type: Input + }], breakpoints: [{ + type: Input + }], spaceBetween: [{ + type: Input + }], slidesPerView: [{ + type: Input + }], grid: [{ + type: Input + }], slidesPerGroup: [{ + type: Input + }], slidesPerGroupSkip: [{ + type: Input + }], centeredSlides: [{ + type: Input + }], centeredSlidesBounds: [{ + type: Input + }], slidesOffsetBefore: [{ + type: Input + }], slidesOffsetAfter: [{ + type: Input + }], normalizeSlideIndex: [{ + type: Input + }], centerInsufficientSlides: [{ + type: Input + }], watchOverflow: [{ + type: Input + }], roundLengths: [{ + type: Input + }], touchRatio: [{ + type: Input + }], touchAngle: [{ + type: Input + }], simulateTouch: [{ + type: Input + }], shortSwipes: [{ + type: Input + }], longSwipes: [{ + type: Input + }], longSwipesRatio: [{ + type: Input + }], longSwipesMs: [{ + type: Input + }], followFinger: [{ + type: Input + }], allowTouchMove: [{ + type: Input + }], threshold: [{ + type: Input + }], touchMoveStopPropagation: [{ + type: Input + }], touchStartPreventDefault: [{ + type: Input + }], touchStartForcePreventDefault: [{ + type: Input + }], touchReleaseOnEdges: [{ + type: Input + }], uniqueNavElements: [{ + type: Input + }], resistance: [{ + type: Input + }], resistanceRatio: [{ + type: Input + }], watchSlidesProgress: [{ + type: Input + }], grabCursor: [{ + type: Input + }], preventClicks: [{ + type: Input + }], preventClicksPropagation: [{ + type: Input + }], slideToClickedSlide: [{ + type: Input + }], preloadImages: [{ + type: Input + }], updateOnImagesReady: [{ + type: Input + }], loop: [{ + type: Input + }], loopAdditionalSlides: [{ + type: Input + }], loopedSlides: [{ + type: Input + }], loopFillGroupWithBlank: [{ + type: Input + }], loopPreventsSlide: [{ + type: Input + }], allowSlidePrev: [{ + type: Input + }], allowSlideNext: [{ + type: Input + }], swipeHandler: [{ + type: Input + }], noSwiping: [{ + type: Input + }], noSwipingClass: [{ + type: Input + }], noSwipingSelector: [{ + type: Input + }], passiveListeners: [{ + type: Input + }], containerModifierClass: [{ + type: Input + }], slideClass: [{ + type: Input + }], slideBlankClass: [{ + type: Input + }], slideActiveClass: [{ + type: Input + }], slideDuplicateActiveClass: [{ + type: Input + }], slideVisibleClass: [{ + type: Input + }], slideDuplicateClass: [{ + type: Input + }], slideNextClass: [{ + type: Input + }], slideDuplicateNextClass: [{ + type: Input + }], slidePrevClass: [{ + type: Input + }], slideDuplicatePrevClass: [{ + type: Input + }], wrapperClass: [{ + type: Input + }], runCallbacksOnInit: [{ + type: Input + }], observeParents: [{ + type: Input + }], observeSlideChildren: [{ + type: Input + }], a11y: [{ + type: Input + }], autoplay: [{ + type: Input + }], controller: [{ + type: Input + }], coverflowEffect: [{ + type: Input + }], cubeEffect: [{ + type: Input + }], fadeEffect: [{ + type: Input + }], flipEffect: [{ + type: Input + }], creativeEffect: [{ + type: Input + }], cardsEffect: [{ + type: Input + }], hashNavigation: [{ + type: Input + }], history: [{ + type: Input + }], keyboard: [{ + type: Input + }], lazy: [{ + type: Input + }], mousewheel: [{ + type: Input + }], parallax: [{ + type: Input + }], thumbs: [{ + type: Input + }], zoom: [{ + type: Input + }], class: [{ + type: Input + }], id: [{ + type: Input + }], navigation: [{ + type: Input + }], pagination: [{ + type: Input + }], scrollbar: [{ + type: Input + }], virtual: [{ + type: Input + }], index: [{ + type: Input + }], config: [{ + type: Input + }], s__beforeBreakpoint: [{ + type: Output, + args: ['_beforeBreakpoint'] + }], s__containerClasses: [{ + type: Output, + args: ['_containerClasses'] + }], s__slideClass: [{ + type: Output, + args: ['_slideClass'] + }], s__swiper: [{ + type: Output, + args: ['_swiper'] + }], s_activeIndexChange: [{ + type: Output, + args: ['activeIndexChange'] + }], s_afterInit: [{ + type: Output, + args: ['afterInit'] + }], s_autoplay: [{ + type: Output, + args: ['autoplay'] + }], s_autoplayStart: [{ + type: Output, + args: ['autoplayStart'] + }], s_autoplayStop: [{ + type: Output, + args: ['autoplayStop'] + }], s_beforeDestroy: [{ + type: Output, + args: ['beforeDestroy'] + }], s_beforeInit: [{ + type: Output, + args: ['beforeInit'] + }], s_beforeLoopFix: [{ + type: Output, + args: ['beforeLoopFix'] + }], s_beforeResize: [{ + type: Output, + args: ['beforeResize'] + }], s_beforeSlideChangeStart: [{ + type: Output, + args: ['beforeSlideChangeStart'] + }], s_beforeTransitionStart: [{ + type: Output, + args: ['beforeTransitionStart'] + }], s_breakpoint: [{ + type: Output, + args: ['breakpoint'] + }], s_changeDirection: [{ + type: Output, + args: ['changeDirection'] + }], s_click: [{ + type: Output, + args: ['click'] + }], s_doubleTap: [{ + type: Output, + args: ['doubleTap'] + }], s_doubleClick: [{ + type: Output, + args: ['doubleClick'] + }], s_destroy: [{ + type: Output, + args: ['destroy'] + }], s_fromEdge: [{ + type: Output, + args: ['fromEdge'] + }], s_hashChange: [{ + type: Output, + args: ['hashChange'] + }], s_hashSet: [{ + type: Output, + args: ['hashSet'] + }], s_imagesReady: [{ + type: Output, + args: ['imagesReady'] + }], s_init: [{ + type: Output, + args: ['init'] + }], s_keyPress: [{ + type: Output, + args: ['keyPress'] + }], s_lazyImageLoad: [{ + type: Output, + args: ['lazyImageLoad'] + }], s_lazyImageReady: [{ + type: Output, + args: ['lazyImageReady'] + }], s_loopFix: [{ + type: Output, + args: ['loopFix'] + }], s_momentumBounce: [{ + type: Output, + args: ['momentumBounce'] + }], s_navigationHide: [{ + type: Output, + args: ['navigationHide'] + }], s_navigationShow: [{ + type: Output, + args: ['navigationShow'] + }], s_observerUpdate: [{ + type: Output, + args: ['observerUpdate'] + }], s_orientationchange: [{ + type: Output, + args: ['orientationchange'] + }], s_paginationHide: [{ + type: Output, + args: ['paginationHide'] + }], s_paginationRender: [{ + type: Output, + args: ['paginationRender'] + }], s_paginationShow: [{ + type: Output, + args: ['paginationShow'] + }], s_paginationUpdate: [{ + type: Output, + args: ['paginationUpdate'] + }], s_progress: [{ + type: Output, + args: ['progress'] + }], s_reachBeginning: [{ + type: Output, + args: ['reachBeginning'] + }], s_reachEnd: [{ + type: Output, + args: ['reachEnd'] + }], s_realIndexChange: [{ + type: Output, + args: ['realIndexChange'] + }], s_resize: [{ + type: Output, + args: ['resize'] + }], s_scroll: [{ + type: Output, + args: ['scroll'] + }], s_scrollbarDragEnd: [{ + type: Output, + args: ['scrollbarDragEnd'] + }], s_scrollbarDragMove: [{ + type: Output, + args: ['scrollbarDragMove'] + }], s_scrollbarDragStart: [{ + type: Output, + args: ['scrollbarDragStart'] + }], s_setTransition: [{ + type: Output, + args: ['setTransition'] + }], s_setTranslate: [{ + type: Output, + args: ['setTranslate'] + }], s_slideChange: [{ + type: Output, + args: ['slideChange'] + }], s_slideChangeTransitionEnd: [{ + type: Output, + args: ['slideChangeTransitionEnd'] + }], s_slideChangeTransitionStart: [{ + type: Output, + args: ['slideChangeTransitionStart'] + }], s_slideNextTransitionEnd: [{ + type: Output, + args: ['slideNextTransitionEnd'] + }], s_slideNextTransitionStart: [{ + type: Output, + args: ['slideNextTransitionStart'] + }], s_slidePrevTransitionEnd: [{ + type: Output, + args: ['slidePrevTransitionEnd'] + }], s_slidePrevTransitionStart: [{ + type: Output, + args: ['slidePrevTransitionStart'] + }], s_slideResetTransitionStart: [{ + type: Output, + args: ['slideResetTransitionStart'] + }], s_slideResetTransitionEnd: [{ + type: Output, + args: ['slideResetTransitionEnd'] + }], s_sliderMove: [{ + type: Output, + args: ['sliderMove'] + }], s_sliderFirstMove: [{ + type: Output, + args: ['sliderFirstMove'] + }], s_slidesLengthChange: [{ + type: Output, + args: ['slidesLengthChange'] + }], s_slidesGridLengthChange: [{ + type: Output, + args: ['slidesGridLengthChange'] + }], s_snapGridLengthChange: [{ + type: Output, + args: ['snapGridLengthChange'] + }], s_snapIndexChange: [{ + type: Output, + args: ['snapIndexChange'] + }], s_tap: [{ + type: Output, + args: ['tap'] + }], s_toEdge: [{ + type: Output, + args: ['toEdge'] + }], s_touchEnd: [{ + type: Output, + args: ['touchEnd'] + }], s_touchMove: [{ + type: Output, + args: ['touchMove'] + }], s_touchMoveOpposite: [{ + type: Output, + args: ['touchMoveOpposite'] + }], s_touchStart: [{ + type: Output, + args: ['touchStart'] + }], s_transitionEnd: [{ + type: Output, + args: ['transitionEnd'] + }], s_transitionStart: [{ + type: Output, + args: ['transitionStart'] + }], s_update: [{ + type: Output, + args: ['update'] + }], s_zoomChange: [{ + type: Output, + args: ['zoomChange'] + }], s_swiper: [{ + type: Output, + args: ['swiper'] + }], indexChange: [{ + type: Output + }], prevElRef: [{ + type: ViewChild, + args: ['prevElRef', { static: false }] + }], nextElRef: [{ + type: ViewChild, + args: ['nextElRef', { static: false }] + }], scrollbarElRef: [{ + type: ViewChild, + args: ['scrollbarElRef', { static: false }] + }], paginationElRef: [{ + type: ViewChild, + args: ['paginationElRef', { static: false }] + }], slidesEl: [{ + type: ContentChildren, + args: [SwiperSlideDirective, { descendants: false, emitDistinctChangesOnly: true }] + }], containerClasses: [{ + type: HostBinding, + args: ['class'] + }] } }); + +class SwiperModule { +} +SwiperModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); +SwiperModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperModule, declarations: [SwiperComponent, SwiperSlideDirective], imports: [CommonModule], exports: [SwiperComponent, SwiperSlideDirective] }); +SwiperModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperModule, imports: [[CommonModule]] }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.2", ngImport: i0, type: SwiperModule, decorators: [{ + type: NgModule, + args: [{ + declarations: [SwiperComponent, SwiperSlideDirective], + exports: [SwiperComponent, SwiperSlideDirective], + imports: [CommonModule], + }] + }] }); + +/* + * Public API Surface of angular + */ + +/** + * Generated bundle index. Do not edit. + */ + +export { SwiperComponent, SwiperModule, SwiperSlideDirective }; +//# sourceMappingURL=swiper_angular.js.map diff --git a/src/main/resources/static/assets/js/swiper/angular/fesm2015/swiper_angular.js.map b/src/main/resources/static/assets/js/swiper/angular/fesm2015/swiper_angular.js.map new file mode 100644 index 0000000..56b5f76 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/fesm2015/swiper_angular.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swiper_angular.js","sources":["../../../src/angular/src/utils/utils.ts","../../../src/angular/src/utils/params-list.ts","../../../src/angular/src/utils/get-params.ts","../../../src/angular/src/swiper-slide.directive.ts","../../../src/angular/src/swiper.component.ts","../../../src/angular/src/swiper.component.html","../../../src/angular/src/swiper.module.ts","../../../src/angular/src/public-api.ts","../../../src/swiper_angular.ts"],"sourcesContent":["export function isObject(o: any): boolean {\n return (\n typeof o === 'object' &&\n o !== null &&\n o.constructor &&\n Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n );\n}\n\nexport function isShowEl(val: any, obj: any, el: any): boolean {\n return (\n (coerceBooleanProperty(val) === true && obj && !obj.el) ||\n !(\n typeof obj !== 'boolean' &&\n obj.el !== el?.nativeElement &&\n (typeof obj.el === 'string' || typeof obj.el === 'object')\n )\n );\n}\n\nexport function extend(target: any, src: any) {\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n Object.keys(src)\n .filter((key) => noExtend.indexOf(key) < 0)\n .forEach((key) => {\n if (typeof target[key] === 'undefined') {\n target[key] = src[key];\n return;\n }\n if (target[key] && !src[key]) {\n return;\n }\n if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n if (src[key].__swiper__) target[key] = src[key];\n else extend(target[key], src[key]);\n } else {\n target[key] = src[key];\n }\n });\n}\n\nexport function coerceBooleanProperty(value: any): boolean {\n return value != null && `${value}` !== 'false';\n}\n\nexport const ignoreNgOnChanges = ['pagination', 'navigation', 'scrollbar', 'virtual'];\n\nexport function setProperty(val: any, obj = {}): {} | false {\n if (isObject(val)) {\n return val;\n }\n\n if (coerceBooleanProperty(val) === true) {\n return obj;\n }\n\n return false;\n}\n","/* underscore in name -> watch for changes */\nexport const paramsList = [\n 'init',\n 'enabled',\n '_direction',\n 'touchEventsTarget',\n 'initialSlide',\n '_speed',\n 'cssMode',\n 'updateOnWindowResize',\n 'resizeObserver',\n 'nested',\n 'focusableElements',\n '_width',\n '_height',\n 'preventInteractionOnTransition',\n 'userAgent',\n 'url',\n '_edgeSwipeDetection',\n '_edgeSwipeThreshold',\n '_freeMode',\n '_autoHeight',\n 'setWrapperSize',\n 'virtualTranslate',\n '_effect',\n 'breakpoints',\n '_spaceBetween',\n '_slidesPerView',\n '_grid',\n '_slidesPerGroup',\n '_slidesPerGroupSkip',\n '_centeredSlides',\n '_centeredSlidesBounds',\n '_slidesOffsetBefore',\n '_slidesOffsetAfter',\n 'normalizeSlideIndex',\n '_centerInsufficientSlides',\n '_watchOverflow',\n 'roundLengths',\n 'touchRatio',\n 'touchAngle',\n 'simulateTouch',\n '_shortSwipes',\n '_longSwipes',\n 'longSwipesRatio',\n 'longSwipesMs',\n '_followFinger',\n 'allowTouchMove',\n '_threshold',\n 'touchMoveStopPropagation',\n 'touchStartPreventDefault',\n 'touchStartForcePreventDefault',\n 'touchReleaseOnEdges',\n 'uniqueNavElements',\n '_resistance',\n '_resistanceRatio',\n '_watchSlidesProgress',\n '_grabCursor',\n 'preventClicks',\n 'preventClicksPropagation',\n '_slideToClickedSlide',\n '_preloadImages',\n 'updateOnImagesReady',\n '_loop',\n '_loopAdditionalSlides',\n '_loopedSlides',\n '_loopFillGroupWithBlank',\n 'loopPreventsSlide',\n '_allowSlidePrev',\n '_allowSlideNext',\n '_swipeHandler',\n '_noSwiping',\n 'noSwipingClass',\n 'noSwipingSelector',\n 'passiveListeners',\n 'containerModifierClass',\n 'slideClass',\n 'slideBlankClass',\n 'slideActiveClass',\n 'slideDuplicateActiveClass',\n 'slideVisibleClass',\n 'slideDuplicateClass',\n 'slideNextClass',\n 'slideDuplicateNextClass',\n 'slidePrevClass',\n 'slideDuplicatePrevClass',\n 'wrapperClass',\n 'runCallbacksOnInit',\n 'observer',\n 'observeParents',\n 'observeSlideChildren',\n\n // modules\n 'a11y',\n 'autoplay',\n '_controller',\n 'coverflowEffect',\n 'cubeEffect',\n 'fadeEffect',\n 'flipEffect',\n 'creativeEffect',\n 'cardsEffect',\n 'hashNavigation',\n 'history',\n 'keyboard',\n 'lazy',\n 'mousewheel',\n '_navigation',\n '_pagination',\n 'parallax',\n '_scrollbar',\n '_thumbs',\n 'virtual',\n 'zoom',\n];\n","// eslint-disable-next-line\nimport { isObject, extend } from './utils';\nimport { paramsList } from './params-list';\n// @ts-ignore\nimport Swiper from 'swiper';\n\nexport const allowedParams = paramsList.map((key) => key.replace(/_/, ''));\nexport function getParams(obj: any = {}) {\n const params: any = {\n on: {},\n };\n const passedParams: any = {};\n extend(params, Swiper.defaults);\n extend(params, Swiper.extendedDefaults);\n params._emitClasses = true;\n\n const rest: any = {};\n Object.keys(obj).forEach((key: string) => {\n const _key = key.replace(/^_/, '');\n if (typeof obj[_key] === 'undefined') return;\n if (allowedParams.indexOf(_key) >= 0) {\n if (isObject(obj[_key])) {\n params[_key] = {};\n passedParams[_key] = {};\n extend(params[_key], obj[_key]);\n extend(passedParams[_key], obj[_key]);\n } else {\n params[_key] = obj[_key];\n passedParams[_key] = obj[_key];\n }\n } else {\n rest[_key] = obj[_key];\n }\n });\n\n return { params, passedParams, rest };\n}\n","import { Directive, Input, TemplateRef } from '@angular/core';\nimport { coerceBooleanProperty } from './utils/utils';\n@Directive({\n selector: 'ng-template[swiperSlide]',\n})\nexport class SwiperSlideDirective {\n @Input() virtualIndex: number;\n @Input() class: string = '';\n @Input('data-swiper-autoplay') autoplayDelay: string | null = null;\n @Input()\n set zoom(val: boolean) {\n this._zoom = coerceBooleanProperty(val);\n }\n get zoom() {\n return this._zoom;\n }\n private _zoom: boolean;\n slideIndex: number;\n get classNames() {\n return this._classNames;\n }\n set classNames(val) {\n if (this._classNames === val) {\n return;\n }\n this._classNames = val;\n this.slideData = {\n isActive: this._hasClass(['swiper-slide-active', 'swiper-slide-duplicate-active']),\n isVisible: this._hasClass(['swiper-slide-visible']),\n isDuplicate: this._hasClass(['swiper-slide-duplicate']),\n isPrev: this._hasClass(['swiper-slide-prev', 'swiper-slide-duplicate-prev']),\n isNext: this._hasClass(['swiper-slide-next', 'swiper-slide-duplicate-next']),\n };\n }\n\n private _hasClass(classNames: string[]) {\n return classNames.some((className) => this._classNames.indexOf(className) >= 0);\n }\n slideData = {\n isActive: false,\n isPrev: false,\n isNext: false,\n isVisible: false,\n isDuplicate: false,\n };\n\n private _classNames: string;\n constructor(public template: TemplateRef) {}\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n NgZone,\n OnInit,\n Output,\n PLATFORM_ID,\n QueryList,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\n// @ts-ignore\nimport Swiper from 'swiper';\nimport { Observable, of, Subject } from 'rxjs';\nimport { getParams } from './utils/get-params';\nimport { SwiperSlideDirective } from './swiper-slide.directive';\nimport {\n extend,\n isObject,\n setProperty,\n ignoreNgOnChanges,\n coerceBooleanProperty,\n isShowEl,\n} from './utils/utils';\nimport {\n SwiperOptions,\n SwiperEvents,\n NavigationOptions,\n PaginationOptions,\n ScrollbarOptions,\n VirtualOptions,\n} from 'swiper/types';\nimport { isPlatformBrowser } from '@angular/common';\n@Component({\n selector: 'swiper, [swiper]',\n templateUrl: './swiper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styles: [\n `\n swiper {\n display: block;\n }\n `,\n ],\n})\nexport class SwiperComponent implements OnInit {\n @Input() enabled: SwiperOptions['enabled'];\n @Input() direction: SwiperOptions['direction'];\n @Input() touchEventsTarget: SwiperOptions['touchEventsTarget'];\n @Input() initialSlide: SwiperOptions['initialSlide'];\n @Input() speed: SwiperOptions['speed'];\n @Input() cssMode: SwiperOptions['cssMode'];\n @Input() updateOnWindowResize: SwiperOptions['updateOnWindowResize'];\n @Input() resizeObserver: SwiperOptions['resizeObserver'];\n @Input() nested: SwiperOptions['nested'];\n @Input() focusableElements: SwiperOptions['focusableElements'];\n @Input() width: SwiperOptions['width'];\n @Input() height: SwiperOptions['height'];\n @Input() preventInteractionOnTransition: SwiperOptions['preventInteractionOnTransition'];\n @Input() userAgent: SwiperOptions['userAgent'];\n @Input() url: SwiperOptions['url'];\n @Input() edgeSwipeDetection: boolean | string;\n @Input() edgeSwipeThreshold: number;\n @Input() freeMode: SwiperOptions['freeMode'];\n @Input() autoHeight: SwiperOptions['autoHeight'];\n @Input() setWrapperSize: SwiperOptions['setWrapperSize'];\n @Input() virtualTranslate: SwiperOptions['virtualTranslate'];\n @Input() effect: SwiperOptions['effect'];\n @Input() breakpoints: SwiperOptions['breakpoints'];\n @Input() spaceBetween: SwiperOptions['spaceBetween'];\n @Input() slidesPerView: SwiperOptions['slidesPerView'];\n @Input() grid: SwiperOptions['grid'];\n @Input() slidesPerGroup: SwiperOptions['slidesPerGroup'];\n @Input() slidesPerGroupSkip: SwiperOptions['slidesPerGroupSkip'];\n @Input() centeredSlides: SwiperOptions['centeredSlides'];\n @Input() centeredSlidesBounds: SwiperOptions['centeredSlidesBounds'];\n @Input() slidesOffsetBefore: SwiperOptions['slidesOffsetBefore'];\n @Input() slidesOffsetAfter: SwiperOptions['slidesOffsetAfter'];\n @Input() normalizeSlideIndex: SwiperOptions['normalizeSlideIndex'];\n @Input() centerInsufficientSlides: SwiperOptions['centerInsufficientSlides'];\n @Input() watchOverflow: SwiperOptions['watchOverflow'];\n @Input() roundLengths: SwiperOptions['roundLengths'];\n @Input() touchRatio: SwiperOptions['touchRatio'];\n @Input() touchAngle: SwiperOptions['touchAngle'];\n @Input() simulateTouch: SwiperOptions['simulateTouch'];\n @Input() shortSwipes: SwiperOptions['shortSwipes'];\n @Input() longSwipes: SwiperOptions['longSwipes'];\n @Input() longSwipesRatio: SwiperOptions['longSwipesRatio'];\n @Input() longSwipesMs: SwiperOptions['longSwipesMs'];\n @Input() followFinger: SwiperOptions['followFinger'];\n @Input() allowTouchMove: SwiperOptions['allowTouchMove'];\n @Input() threshold: SwiperOptions['threshold'];\n @Input() touchMoveStopPropagation: SwiperOptions['touchMoveStopPropagation'];\n @Input() touchStartPreventDefault: SwiperOptions['touchStartPreventDefault'];\n @Input() touchStartForcePreventDefault: SwiperOptions['touchStartForcePreventDefault'];\n @Input() touchReleaseOnEdges: SwiperOptions['touchReleaseOnEdges'];\n @Input() uniqueNavElements: SwiperOptions['uniqueNavElements'];\n @Input() resistance: SwiperOptions['resistance'];\n @Input() resistanceRatio: SwiperOptions['resistanceRatio'];\n @Input() watchSlidesProgress: SwiperOptions['watchSlidesProgress'];\n @Input() grabCursor: SwiperOptions['grabCursor'];\n @Input() preventClicks: SwiperOptions['preventClicks'];\n @Input() preventClicksPropagation: SwiperOptions['preventClicksPropagation'];\n @Input() slideToClickedSlide: SwiperOptions['slideToClickedSlide'];\n @Input() preloadImages: SwiperOptions['preloadImages'];\n @Input() updateOnImagesReady: SwiperOptions['updateOnImagesReady'];\n @Input() loop: SwiperOptions['loop'];\n @Input() loopAdditionalSlides: SwiperOptions['loopAdditionalSlides'];\n @Input() loopedSlides: SwiperOptions['loopedSlides'];\n @Input() loopFillGroupWithBlank: SwiperOptions['loopFillGroupWithBlank'];\n @Input() loopPreventsSlide: SwiperOptions['loopPreventsSlide'];\n @Input() allowSlidePrev: SwiperOptions['allowSlidePrev'];\n @Input() allowSlideNext: SwiperOptions['allowSlideNext'];\n @Input() swipeHandler: SwiperOptions['swipeHandler'];\n @Input() noSwiping: SwiperOptions['noSwiping'];\n @Input() noSwipingClass: SwiperOptions['noSwipingClass'];\n @Input() noSwipingSelector: SwiperOptions['noSwipingSelector'];\n @Input() passiveListeners: SwiperOptions['passiveListeners'];\n @Input() containerModifierClass: SwiperOptions['containerModifierClass'];\n @Input() slideClass: SwiperOptions['slideClass'] = 'swiper-slide';\n @Input() slideBlankClass: SwiperOptions['slideBlankClass'];\n @Input() slideActiveClass: SwiperOptions['slideActiveClass'];\n @Input() slideDuplicateActiveClass: SwiperOptions['slideDuplicateActiveClass'];\n @Input() slideVisibleClass: SwiperOptions['slideVisibleClass'];\n @Input() slideDuplicateClass: SwiperOptions['slideDuplicateClass'];\n @Input() slideNextClass: SwiperOptions['slideNextClass'];\n @Input() slideDuplicateNextClass: SwiperOptions['slideDuplicateNextClass'];\n @Input() slidePrevClass: SwiperOptions['slidePrevClass'];\n @Input() slideDuplicatePrevClass: SwiperOptions['slideDuplicatePrevClass'];\n @Input() wrapperClass: SwiperOptions['wrapperClass'] = 'swiper-wrapper';\n @Input() runCallbacksOnInit: SwiperOptions['runCallbacksOnInit'];\n @Input() observeParents: SwiperOptions['observeParents'];\n @Input() observeSlideChildren: SwiperOptions['observeSlideChildren'];\n @Input() a11y: SwiperOptions['a11y'];\n @Input() autoplay: SwiperOptions['autoplay'];\n @Input() controller: SwiperOptions['controller'];\n @Input() coverflowEffect: SwiperOptions['coverflowEffect'];\n @Input() cubeEffect: SwiperOptions['cubeEffect'];\n @Input() fadeEffect: SwiperOptions['fadeEffect'];\n @Input() flipEffect: SwiperOptions['flipEffect'];\n @Input() creativeEffect: SwiperOptions['creativeEffect'];\n @Input() cardsEffect: SwiperOptions['cardsEffect'];\n @Input() hashNavigation: SwiperOptions['hashNavigation'];\n @Input() history: SwiperOptions['history'];\n @Input() keyboard: SwiperOptions['keyboard'];\n @Input() lazy: SwiperOptions['lazy'];\n @Input() mousewheel: SwiperOptions['mousewheel'];\n @Input() parallax: SwiperOptions['parallax'];\n @Input() thumbs: SwiperOptions['thumbs'];\n @Input() zoom: SwiperOptions['zoom'];\n @Input() class: string;\n @Input() id: string;\n @Input()\n set navigation(val) {\n const currentNext =\n typeof this._navigation !== 'boolean' && this._navigation !== ''\n ? this._navigation?.nextEl\n : null;\n const currentPrev =\n typeof this._navigation !== 'boolean' && this._navigation !== ''\n ? this._navigation?.prevEl\n : null;\n this._navigation = setProperty(val, {\n nextEl: currentNext || null,\n prevEl: currentPrev || null,\n });\n this.showNavigation = !(\n coerceBooleanProperty(val) !== true ||\n (this._navigation &&\n typeof this._navigation !== 'boolean' &&\n this._navigation.prevEl !== this._prevElRef?.nativeElement &&\n (this._navigation.prevEl !== null || this._navigation.nextEl !== null) &&\n (typeof this._navigation.nextEl === 'string' ||\n typeof this._navigation.prevEl === 'string' ||\n typeof this._navigation.nextEl === 'object' ||\n typeof this._navigation.prevEl === 'object'))\n );\n }\n get navigation() {\n return this._navigation;\n }\n private _navigation: NavigationOptions | boolean | '';\n showNavigation: boolean = true;\n\n @Input()\n set pagination(val) {\n const current =\n typeof this._pagination !== 'boolean' && this._pagination !== ''\n ? this._pagination?.el\n : null;\n this._pagination = setProperty(val, {\n el: current || null,\n });\n this.showPagination = isShowEl(val, this._pagination, this._paginationElRef);\n }\n get pagination() {\n return this._pagination;\n }\n private _pagination: PaginationOptions | boolean | '';\n showPagination: boolean = true;\n\n @Input()\n set scrollbar(val) {\n const current =\n typeof this._scrollbar !== 'boolean' && this._scrollbar !== '' ? this._scrollbar?.el : null;\n this._scrollbar = setProperty(val, {\n el: current || null,\n });\n this.showScrollbar = isShowEl(val, this._scrollbar, this._scrollbarElRef);\n }\n get scrollbar() {\n return this._scrollbar;\n }\n private _scrollbar: ScrollbarOptions | boolean | '';\n showScrollbar: boolean = true;\n\n @Input()\n set virtual(val) {\n this._virtual = setProperty(val);\n }\n get virtual() {\n return this._virtual;\n }\n private _virtual: VirtualOptions | boolean | '';\n\n @Input()\n set index(index: number) {\n console.warn('`[(index)]` prop is deprecated and will be removed in upcoming versions');\n this.setIndex(index);\n }\n @Input()\n set config(val: SwiperOptions) {\n this.updateSwiper(val);\n const { params } = getParams(val);\n Object.assign(this, params);\n }\n // prettier-ignore\n @Output('_beforeBreakpoint') s__beforeBreakpoint: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('_containerClasses') s__containerClasses: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('_slideClass') s__slideClass: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('_swiper') s__swiper: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('activeIndexChange') s_activeIndexChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('afterInit') s_afterInit: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('autoplay') s_autoplay: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('autoplayStart') s_autoplayStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('autoplayStop') s_autoplayStop: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeDestroy') s_beforeDestroy: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeInit') s_beforeInit: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeLoopFix') s_beforeLoopFix: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeResize') s_beforeResize: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeSlideChangeStart') s_beforeSlideChangeStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('beforeTransitionStart') s_beforeTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('breakpoint') s_breakpoint: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('changeDirection') s_changeDirection: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('click') s_click: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('doubleTap') s_doubleTap: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('doubleClick') s_doubleClick: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('destroy') s_destroy: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('fromEdge') s_fromEdge: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('hashChange') s_hashChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('hashSet') s_hashSet: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('imagesReady') s_imagesReady: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('init') s_init: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('keyPress') s_keyPress: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('lazyImageLoad') s_lazyImageLoad: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('lazyImageReady') s_lazyImageReady: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('loopFix') s_loopFix: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('momentumBounce') s_momentumBounce: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('navigationHide') s_navigationHide: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('navigationShow') s_navigationShow: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('observerUpdate') s_observerUpdate: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('orientationchange') s_orientationchange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('paginationHide') s_paginationHide: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('paginationRender') s_paginationRender: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('paginationShow') s_paginationShow: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('paginationUpdate') s_paginationUpdate: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('progress') s_progress: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('reachBeginning') s_reachBeginning: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('reachEnd') s_reachEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('realIndexChange') s_realIndexChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('resize') s_resize: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('scroll') s_scroll: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('scrollbarDragEnd') s_scrollbarDragEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('scrollbarDragMove') s_scrollbarDragMove: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('scrollbarDragStart') s_scrollbarDragStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('setTransition') s_setTransition: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('setTranslate') s_setTranslate: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideChange') s_slideChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideChangeTransitionEnd') s_slideChangeTransitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideChangeTransitionStart') s_slideChangeTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideNextTransitionEnd') s_slideNextTransitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideNextTransitionStart') s_slideNextTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slidePrevTransitionEnd') s_slidePrevTransitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slidePrevTransitionStart') s_slidePrevTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideResetTransitionStart') s_slideResetTransitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slideResetTransitionEnd') s_slideResetTransitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('sliderMove') s_sliderMove: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('sliderFirstMove') s_sliderFirstMove: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slidesLengthChange') s_slidesLengthChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('slidesGridLengthChange') s_slidesGridLengthChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('snapGridLengthChange') s_snapGridLengthChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('snapIndexChange') s_snapIndexChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('tap') s_tap: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('toEdge') s_toEdge: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('touchEnd') s_touchEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('touchMove') s_touchMove: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('touchMoveOpposite') s_touchMoveOpposite: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('touchStart') s_touchStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('transitionEnd') s_transitionEnd: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('transitionStart') s_transitionStart: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('update') s_update: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('zoomChange') s_zoomChange: EventEmitter = new EventEmitter();\n // prettier-ignore\n @Output('swiper') s_swiper: EventEmitter = new EventEmitter();\n\n @Output() indexChange = new EventEmitter();\n\n @ViewChild('prevElRef', { static: false })\n set prevElRef(el: ElementRef) {\n this._prevElRef = el;\n this._setElement(el, this.navigation, 'navigation', 'prevEl');\n }\n _prevElRef: ElementRef;\n @ViewChild('nextElRef', { static: false })\n set nextElRef(el: ElementRef) {\n this._nextElRef = el;\n this._setElement(el, this.navigation, 'navigation', 'nextEl');\n }\n _nextElRef: ElementRef;\n @ViewChild('scrollbarElRef', { static: false })\n set scrollbarElRef(el: ElementRef) {\n this._scrollbarElRef = el;\n this._setElement(el, this.scrollbar, 'scrollbar');\n }\n _scrollbarElRef: ElementRef;\n @ViewChild('paginationElRef', { static: false })\n set paginationElRef(el: ElementRef) {\n this._paginationElRef = el;\n this._setElement(el, this.pagination, 'pagination');\n }\n _paginationElRef: ElementRef;\n @ContentChildren(SwiperSlideDirective, { descendants: false, emitDistinctChangesOnly: true })\n slidesEl: QueryList;\n private slides: SwiperSlideDirective[];\n\n prependSlides: Observable;\n appendSlides: Observable;\n\n swiperRef: Swiper;\n readonly _activeSlides = new Subject();\n\n get activeSlides() {\n if (this.virtual) {\n return this._activeSlides;\n }\n return of(this.slides);\n }\n\n get zoomContainerClass() {\n return this.zoom && typeof this.zoom !== 'boolean'\n ? this.zoom.containerClass\n : 'swiper-zoom-container';\n }\n\n @HostBinding('class') containerClasses: string = 'swiper';\n constructor(\n private _ngZone: NgZone,\n private elementRef: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(PLATFORM_ID) private _platformId: Object,\n ) {}\n\n private _setElement(el: ElementRef, ref: any, update: string, key = 'el') {\n if (!el || !ref) {\n return;\n }\n if (ref && el.nativeElement) {\n if (ref[key] === el.nativeElement) {\n return;\n }\n ref[key] = el.nativeElement;\n }\n const updateObj: { [key: string]: boolean } = {};\n updateObj[update] = true;\n this.updateInitSwiper(updateObj);\n }\n ngOnInit(): void {\n const { params } = getParams(this);\n Object.assign(this, params);\n }\n ngAfterViewInit() {\n this.childrenSlidesInit();\n this.initSwiper();\n this._changeDetectorRef.detectChanges();\n setTimeout(() => {\n this.s_swiper.emit(this.swiperRef);\n });\n }\n\n private childrenSlidesInit() {\n this.slidesChanges(this.slidesEl);\n this.slidesEl.changes.subscribe(this.slidesChanges);\n }\n\n private slidesChanges = (val: QueryList) => {\n this.slides = val.map((slide: SwiperSlideDirective, index: number) => {\n slide.slideIndex = index;\n slide.classNames = this.slideClass || '';\n return slide;\n });\n if (this.loop && !this.loopedSlides) {\n this.calcLoopedSlides();\n }\n if (!this.virtual) {\n if (this.loopedSlides) {\n this.prependSlides = of(this.slides.slice(this.slides.length - this.loopedSlides));\n this.appendSlides = of(this.slides.slice(0, this.loopedSlides));\n }\n } else if (this.swiperRef && this.swiperRef.virtual) {\n this._ngZone.runOutsideAngular(() => {\n this.swiperRef.virtual.slides = this.slides;\n this.swiperRef.virtual.update(true);\n });\n }\n this._changeDetectorRef.detectChanges();\n };\n\n get isSwiperActive() {\n return this.swiperRef && !this.swiperRef.destroyed;\n }\n\n initSwiper() {\n const { params: swiperParams, passedParams } = getParams(this);\n Object.assign(this, swiperParams);\n this._ngZone.runOutsideAngular(() => {\n swiperParams.init = false;\n if (!swiperParams.virtual) {\n swiperParams.observer = true;\n }\n\n swiperParams.onAny = (eventName: keyof SwiperComponent, ...args: any[]) => {\n const emitter = this[('s_' + eventName) as keyof SwiperComponent] as EventEmitter;\n if (emitter) {\n emitter.emit(...args);\n }\n };\n const _slideClasses: SwiperEvents['_slideClasses'] = (_, updated) => {\n updated.forEach(({ slideEl, classNames }, index) => {\n const dataIndex = slideEl.getAttribute('data-swiper-slide-index');\n const slideIndex = dataIndex ? parseInt(dataIndex) : index;\n if (this.virtual) {\n const virtualSlide = this.slides.find((item) => {\n return item.virtualIndex && item.virtualIndex === slideIndex;\n });\n if (virtualSlide) {\n virtualSlide.classNames = classNames;\n return;\n }\n }\n\n if (this.slides[slideIndex]) {\n this.slides[slideIndex].classNames = classNames;\n }\n });\n this._changeDetectorRef.detectChanges();\n };\n const _containerClasses: SwiperEvents['_containerClasses'] = (_, classes) => {\n setTimeout(() => {\n this.containerClasses = classes;\n });\n };\n Object.assign(swiperParams.on, {\n _containerClasses,\n _slideClasses,\n });\n const swiperRef = new Swiper(swiperParams);\n swiperRef.loopCreate = () => {};\n swiperRef.loopDestroy = () => {};\n if (swiperParams.loop) {\n swiperRef.loopedSlides = this.loopedSlides;\n }\n const isVirtualEnabled =\n typeof swiperRef.params.virtual !== 'undefined' &&\n typeof swiperRef.params.virtual !== 'boolean' &&\n swiperRef.params.virtual.enabled;\n if (swiperRef.virtual && isVirtualEnabled) {\n swiperRef.virtual.slides = this.slides;\n const extendWith = {\n cache: false,\n slides: this.slides,\n renderExternal: this.updateVirtualSlides,\n renderExternalUpdate: false,\n };\n extend(swiperRef.params.virtual, extendWith);\n extend(swiperRef.originalParams.virtual, extendWith);\n }\n\n if (isPlatformBrowser(this._platformId)) {\n this.swiperRef = swiperRef.init(this.elementRef.nativeElement);\n const isEnabled =\n typeof this.swiperRef.params.virtual !== 'undefined' &&\n typeof this.swiperRef.params.virtual !== 'boolean' &&\n this.swiperRef.params.virtual.enabled;\n if (this.swiperRef.virtual && isEnabled) {\n this.swiperRef.virtual.update(true);\n }\n this._changeDetectorRef.detectChanges();\n swiperRef.on('slideChange', () => {\n this.indexChange.emit(this.swiperRef.realIndex);\n });\n }\n });\n }\n\n style: any = null;\n currentVirtualData: any; // TODO: type virtualData;\n private updateVirtualSlides = (virtualData: any) => {\n // TODO: type virtualData\n if (\n !this.swiperRef ||\n (this.currentVirtualData &&\n this.currentVirtualData.from === virtualData.from &&\n this.currentVirtualData.to === virtualData.to &&\n this.currentVirtualData.offset === virtualData.offset)\n ) {\n return;\n }\n this.style = this.swiperRef.isHorizontal()\n ? {\n [this.swiperRef.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px`,\n }\n : {\n top: `${virtualData.offset}px`,\n };\n this.currentVirtualData = virtualData;\n this._activeSlides.next(virtualData.slides);\n this._ngZone.run(() => {\n this._changeDetectorRef.detectChanges();\n });\n this._ngZone.runOutsideAngular(() => {\n this.swiperRef.updateSlides();\n this.swiperRef.updateProgress();\n this.swiperRef.updateSlidesClasses();\n if (this.swiperRef.lazy && this.swiperRef.params.lazy['enabled']) {\n this.swiperRef.lazy.load();\n }\n this.swiperRef.virtual.update(true);\n });\n return;\n };\n\n ngOnChanges(changedParams: SimpleChanges) {\n this.updateSwiper(changedParams);\n this._changeDetectorRef.detectChanges();\n }\n\n updateInitSwiper(changedParams: any) {\n if (!(changedParams && this.swiperRef && !this.swiperRef.destroyed)) {\n return;\n }\n\n this._ngZone.runOutsideAngular(() => {\n const {\n params: currentParams,\n pagination,\n navigation,\n scrollbar,\n virtual,\n thumbs,\n } = this.swiperRef;\n\n if (changedParams.pagination) {\n if (\n this.pagination &&\n typeof this.pagination !== 'boolean' &&\n this.pagination.el &&\n pagination &&\n !pagination.el\n ) {\n this.updateParameter('pagination', this.pagination);\n pagination.init();\n pagination.render();\n pagination.update();\n } else {\n pagination.destroy();\n pagination.el = null;\n }\n }\n\n if (changedParams.scrollbar) {\n if (\n this.scrollbar &&\n typeof this.scrollbar !== 'boolean' &&\n this.scrollbar.el &&\n scrollbar &&\n !scrollbar.el\n ) {\n this.updateParameter('scrollbar', this.scrollbar);\n scrollbar.init();\n scrollbar.updateSize();\n scrollbar.setTranslate();\n } else {\n scrollbar.destroy();\n scrollbar.el = null;\n }\n }\n\n if (changedParams.navigation) {\n if (\n this.navigation &&\n typeof this.navigation !== 'boolean' &&\n this.navigation.prevEl &&\n this.navigation.nextEl &&\n navigation &&\n !navigation.prevEl &&\n !navigation.nextEl\n ) {\n this.updateParameter('navigation', this.navigation);\n navigation.init();\n navigation.update();\n } else if (navigation.prevEl && navigation.nextEl) {\n navigation.destroy();\n navigation.nextEl = null;\n navigation.prevEl = null;\n }\n }\n if (changedParams.thumbs && this.thumbs && this.thumbs.swiper) {\n this.updateParameter('thumbs', this.thumbs);\n const initialized = thumbs.init();\n if (initialized) thumbs.update(true);\n }\n\n if (changedParams.controller && this.controller && this.controller.control) {\n this.swiperRef.controller.control = this.controller.control;\n }\n\n this.swiperRef.update();\n });\n }\n\n updateSwiper(changedParams: SimpleChanges | any) {\n this._ngZone.runOutsideAngular(() => {\n if (changedParams.config) {\n return;\n }\n if (!(changedParams && this.swiperRef && !this.swiperRef.destroyed)) {\n return;\n }\n for (const key in changedParams) {\n if (ignoreNgOnChanges.indexOf(key) >= 0) {\n continue;\n }\n const newValue = changedParams[key]?.currentValue ?? changedParams[key];\n this.updateParameter(key, newValue);\n }\n\n if (changedParams.allowSlideNext) {\n this.swiperRef.allowSlideNext = this.allowSlideNext;\n }\n if (changedParams.allowSlidePrev) {\n this.swiperRef.allowSlidePrev = this.allowSlidePrev;\n }\n if (changedParams.direction) {\n this.swiperRef.changeDirection(this.direction, false);\n }\n if (changedParams.breakpoints) {\n if (this.loop && !this.loopedSlides) {\n this.calcLoopedSlides();\n }\n this.swiperRef.currentBreakpoint = null;\n this.swiperRef.setBreakpoint();\n }\n\n if (changedParams.thumbs || changedParams.controller) {\n this.updateInitSwiper(changedParams);\n }\n this.swiperRef.update();\n });\n }\n\n calcLoopedSlides() {\n if (!this.loop) {\n return;\n }\n let slidesPerViewParams = this.slidesPerView;\n if (this.breakpoints) {\n const breakpoint = Swiper.prototype.getBreakpoint(this.breakpoints);\n const breakpointOnlyParams =\n breakpoint in this.breakpoints ? this.breakpoints[breakpoint] : undefined;\n if (breakpointOnlyParams && breakpointOnlyParams.slidesPerView) {\n slidesPerViewParams = breakpointOnlyParams.slidesPerView;\n }\n }\n if (slidesPerViewParams === 'auto') {\n this.loopedSlides = this.slides.length;\n return this.slides.length;\n }\n let loopedSlides = this.loopedSlides || slidesPerViewParams;\n if (!loopedSlides) {\n // ?\n return;\n }\n\n if (this.loopAdditionalSlides) {\n loopedSlides += this.loopAdditionalSlides;\n }\n if (loopedSlides > this.slides.length) {\n loopedSlides = this.slides.length;\n }\n this.loopedSlides = loopedSlides;\n return loopedSlides;\n }\n\n updateParameter(key: string, value: any) {\n if (!(this.swiperRef && !this.swiperRef.destroyed)) {\n return;\n }\n const _key = key.replace(/^_/, '');\n const isCurrentParamObj = isObject(this.swiperRef.params[_key]);\n\n if (Object.keys(this.swiperRef.modules).indexOf(_key) >= 0) {\n const defaultParams = this.swiperRef.modules[_key].params[_key];\n if (isCurrentParamObj) {\n extend(this.swiperRef.params[_key], defaultParams);\n } else {\n this.swiperRef.params[_key] = defaultParams;\n }\n }\n if (_key === 'enabled') {\n if (value === true) {\n this.swiperRef.enable();\n } else if (value === false) {\n this.swiperRef.disable();\n }\n return;\n }\n if (isCurrentParamObj && isObject(value)) {\n extend(this.swiperRef.params[_key], value);\n } else {\n this.swiperRef.params[_key] = value;\n }\n }\n /**\n * @deprecated will be removed in upcoming versions\n */\n setIndex(index: number, speed?: number, silent?: boolean): void {\n if (!this.isSwiperActive) {\n this.initialSlide = index;\n return;\n }\n if (index === this.swiperRef.activeIndex) {\n return;\n }\n this._ngZone.runOutsideAngular(() => {\n if (this.loop) {\n this.swiperRef.slideToLoop(index, speed, !silent);\n } else {\n this.swiperRef.slideTo(index, speed, !silent);\n }\n });\n }\n\n ngOnDestroy() {\n this._ngZone.runOutsideAngular(() => {\n this.swiperRef?.destroy(true, false);\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","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SwiperComponent } from './swiper.component';\nimport { SwiperSlideDirective } from './swiper-slide.directive';\n@NgModule({\n declarations: [SwiperComponent, SwiperSlideDirective],\n exports: [SwiperComponent, SwiperSlideDirective],\n imports: [CommonModule],\n})\nexport class SwiperModule {}\n","/*\n * Public API Surface of angular\n */\nexport * from './swiper.module';\nexport * from './swiper.component';\nexport * from './swiper-slide.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './swiper-angular';\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/package.json b/src/main/resources/static/assets/js/swiper/angular/package.json new file mode 100644 index 0000000..04ad3ce --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/package.json @@ -0,0 +1,19 @@ +{ + "name": "swiper_angular", + "version": "0.0.1", + "private": "true", + "peerDependencies": { + "@angular/common": "^12.2.0", + "@angular/core": "^12.2.0" + }, + "dependencies": { + "tslib": "^2.3.0" + }, + "main": "bundles/swiper_angular.umd.js", + "module": "fesm2015/swiper_angular.js", + "es2015": "fesm2015/swiper_angular.js", + "esm2015": "esm2015/swiper_angular.js", + "fesm2015": "fesm2015/swiper_angular.js", + "typings": "swiper_angular.d.ts", + "sideEffects": false +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/angular/swiper-angular.d.ts b/src/main/resources/static/assets/js/swiper/angular/swiper-angular.d.ts new file mode 100644 index 0000000..7075866 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/swiper-angular.d.ts @@ -0,0 +1 @@ +export * from './angular/src/public-api'; diff --git a/src/main/resources/static/assets/js/swiper/angular/swiper_angular.d.ts b/src/main/resources/static/assets/js/swiper/angular/swiper_angular.d.ts new file mode 100644 index 0000000..a94e51b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/angular/swiper_angular.d.ts @@ -0,0 +1,5 @@ +/** + * Generated bundle index. Do not edit. + */ +/// +export * from './swiper-angular'; diff --git a/src/main/resources/static/assets/js/swiper/core/breakpoints/getBreakpoint.js b/src/main/resources/static/assets/js/swiper/core/breakpoints/getBreakpoint.js new file mode 100644 index 0000000..34311b3 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/breakpoints/getBreakpoint.js @@ -0,0 +1,40 @@ +import { getWindow } from 'ssr-window'; +export default function getBreakpoint(breakpoints, base = 'window', containerEl) { + if (!breakpoints || base === 'container' && !containerEl) return undefined; + let breakpoint = false; + const window = getWindow(); + const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight; + const points = Object.keys(breakpoints).map(point => { + if (typeof point === 'string' && point.indexOf('@') === 0) { + const minRatio = parseFloat(point.substr(1)); + const value = currentHeight * minRatio; + return { + value, + point + }; + } + + return { + value: point, + point + }; + }); + points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10)); + + for (let i = 0; i < points.length; i += 1) { + const { + point, + value + } = points[i]; + + if (base === 'window') { + if (window.matchMedia(`(min-width: ${value}px)`).matches) { + breakpoint = point; + } + } else if (value <= containerEl.clientWidth) { + breakpoint = point; + } + } + + return breakpoint || 'max'; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/breakpoints/index.js b/src/main/resources/static/assets/js/swiper/core/breakpoints/index.js new file mode 100644 index 0000000..341d640 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/breakpoints/index.js @@ -0,0 +1,6 @@ +import setBreakpoint from './setBreakpoint.js'; +import getBreakpoint from './getBreakpoint.js'; +export default { + setBreakpoint, + getBreakpoint +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/breakpoints/setBreakpoint.js b/src/main/resources/static/assets/js/swiper/core/breakpoints/setBreakpoint.js new file mode 100644 index 0000000..aa6455b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/breakpoints/setBreakpoint.js @@ -0,0 +1,72 @@ +import { extend } from '../../shared/utils.js'; + +const isGridEnabled = (swiper, params) => { + return swiper.grid && params.grid && params.grid.rows > 1; +}; + +export default function setBreakpoint() { + const swiper = this; + const { + activeIndex, + initialized, + loopedSlides = 0, + params, + $el + } = swiper; + const breakpoints = params.breakpoints; + if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters + + const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el); + if (!breakpoint || swiper.currentBreakpoint === breakpoint) return; + const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined; + const breakpointParams = breakpointOnlyParams || swiper.originalParams; + const wasMultiRow = isGridEnabled(swiper, params); + const isMultiRow = isGridEnabled(swiper, breakpointParams); + const wasEnabled = params.enabled; + + if (wasMultiRow && !isMultiRow) { + $el.removeClass(`${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`); + swiper.emitContainerClasses(); + } else if (!wasMultiRow && isMultiRow) { + $el.addClass(`${params.containerModifierClass}grid`); + + if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') { + $el.addClass(`${params.containerModifierClass}grid-column`); + } + + swiper.emitContainerClasses(); + } + + const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; + const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); + + if (directionChanged && initialized) { + swiper.changeDirection(); + } + + extend(swiper.params, breakpointParams); + const isEnabled = swiper.params.enabled; + Object.assign(swiper, { + allowTouchMove: swiper.params.allowTouchMove, + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev + }); + + if (wasEnabled && !isEnabled) { + swiper.disable(); + } else if (!wasEnabled && isEnabled) { + swiper.enable(); + } + + swiper.currentBreakpoint = breakpoint; + swiper.emit('_beforeBreakpoint', breakpointParams); + + if (needsReLoop && initialized) { + swiper.loopDestroy(); + swiper.loopCreate(); + swiper.updateSlides(); + swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false); + } + + swiper.emit('breakpoint', breakpointParams); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/check-overflow/index.js b/src/main/resources/static/assets/js/swiper/core/check-overflow/index.js new file mode 100644 index 0000000..d21f522 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/check-overflow/index.js @@ -0,0 +1,38 @@ +function checkOverflow() { + const swiper = this; + const { + isLocked: wasLocked, + params + } = swiper; + const { + slidesOffsetBefore + } = params; + + if (slidesOffsetBefore) { + const lastSlideIndex = swiper.slides.length - 1; + const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2; + swiper.isLocked = swiper.size > lastSlideRightEdge; + } else { + swiper.isLocked = swiper.snapGrid.length === 1; + } + + if (params.allowSlideNext === true) { + swiper.allowSlideNext = !swiper.isLocked; + } + + if (params.allowSlidePrev === true) { + swiper.allowSlidePrev = !swiper.isLocked; + } + + if (wasLocked && wasLocked !== swiper.isLocked) { + swiper.isEnd = false; + } + + if (wasLocked !== swiper.isLocked) { + swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); + } +} + +export default { + checkOverflow +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/classes/addClasses.js b/src/main/resources/static/assets/js/swiper/core/classes/addClasses.js new file mode 100644 index 0000000..3475b3e --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/classes/addClasses.js @@ -0,0 +1,52 @@ +function prepareClasses(entries, prefix) { + const resultClasses = []; + entries.forEach(item => { + if (typeof item === 'object') { + Object.keys(item).forEach(classNames => { + if (item[classNames]) { + resultClasses.push(prefix + classNames); + } + }); + } else if (typeof item === 'string') { + resultClasses.push(prefix + item); + } + }); + return resultClasses; +} + +export default function addClasses() { + const swiper = this; + const { + classNames, + params, + rtl, + $el, + device, + support + } = swiper; // prettier-ignore + + const suffixes = prepareClasses(['initialized', params.direction, { + 'pointer-events': !support.touch + }, { + 'free-mode': swiper.params.freeMode && params.freeMode.enabled + }, { + 'autoheight': params.autoHeight + }, { + 'rtl': rtl + }, { + 'grid': params.grid && params.grid.rows > 1 + }, { + 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' + }, { + 'android': device.android + }, { + 'ios': device.ios + }, { + 'css-mode': params.cssMode + }, { + 'centered': params.cssMode && params.centeredSlides + }], params.containerModifierClass); + classNames.push(...suffixes); + $el.addClass([...classNames].join(' ')); + swiper.emitContainerClasses(); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/classes/index.js b/src/main/resources/static/assets/js/swiper/core/classes/index.js new file mode 100644 index 0000000..27cd28c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/classes/index.js @@ -0,0 +1,6 @@ +import addClasses from './addClasses.js'; +import removeClasses from './removeClasses.js'; +export default { + addClasses, + removeClasses +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/classes/removeClasses.js b/src/main/resources/static/assets/js/swiper/core/classes/removeClasses.js new file mode 100644 index 0000000..bd168b1 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/classes/removeClasses.js @@ -0,0 +1,9 @@ +export default function removeClasses() { + const swiper = this; + const { + $el, + classNames + } = swiper; + $el.removeClass(classNames.join(' ')); + swiper.emitContainerClasses(); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/core.js b/src/main/resources/static/assets/js/swiper/core/core.js new file mode 100644 index 0000000..9f65769 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/core.js @@ -0,0 +1,610 @@ +/* eslint no-param-reassign: "off" */ +import { getDocument } from 'ssr-window'; +import $ from '../shared/dom.js'; +import { extend, now, deleteProps } from '../shared/utils.js'; +import { getSupport } from '../shared/get-support.js'; +import { getDevice } from '../shared/get-device.js'; +import { getBrowser } from '../shared/get-browser.js'; +import Resize from './modules/resize/resize.js'; +import Observer from './modules/observer/observer.js'; +import eventsEmitter from './events-emitter.js'; +import update from './update/index.js'; +import translate from './translate/index.js'; +import transition from './transition/index.js'; +import slide from './slide/index.js'; +import loop from './loop/index.js'; +import grabCursor from './grab-cursor/index.js'; +import events from './events/index.js'; +import breakpoints from './breakpoints/index.js'; +import classes from './classes/index.js'; +import images from './images/index.js'; +import checkOverflow from './check-overflow/index.js'; +import defaults from './defaults.js'; +import moduleExtendParams from './moduleExtendParams.js'; +const prototypes = { + eventsEmitter, + update, + translate, + transition, + slide, + loop, + grabCursor, + events, + breakpoints, + checkOverflow, + classes, + images +}; +const extendedDefaults = {}; + +class Swiper { + constructor(...args) { + let el; + let params; + + if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') { + params = args[0]; + } else { + [el, params] = args; + } + + if (!params) params = {}; + params = extend({}, params); + if (el && !params.el) params.el = el; + + if (params.el && $(params.el).length > 1) { + const swipers = []; + $(params.el).each(containerEl => { + const newParams = extend({}, params, { + el: containerEl + }); + swipers.push(new Swiper(newParams)); + }); + return swipers; + } // Swiper Instance + + + const swiper = this; + swiper.__swiper__ = true; + swiper.support = getSupport(); + swiper.device = getDevice({ + userAgent: params.userAgent + }); + swiper.browser = getBrowser(); + swiper.eventsListeners = {}; + swiper.eventsAnyListeners = []; + swiper.modules = [...swiper.__modules__]; + + if (params.modules && Array.isArray(params.modules)) { + swiper.modules.push(...params.modules); + } + + const allModulesParams = {}; + swiper.modules.forEach(mod => { + mod({ + swiper, + extendParams: moduleExtendParams(params, allModulesParams), + on: swiper.on.bind(swiper), + once: swiper.once.bind(swiper), + off: swiper.off.bind(swiper), + emit: swiper.emit.bind(swiper) + }); + }); // Extend defaults with modules params + + const swiperParams = extend({}, defaults, allModulesParams); // Extend defaults with passed params + + swiper.params = extend({}, swiperParams, extendedDefaults, params); + swiper.originalParams = extend({}, swiper.params); + swiper.passedParams = extend({}, params); // add event listeners + + if (swiper.params && swiper.params.on) { + Object.keys(swiper.params.on).forEach(eventName => { + swiper.on(eventName, swiper.params.on[eventName]); + }); + } + + if (swiper.params && swiper.params.onAny) { + swiper.onAny(swiper.params.onAny); + } // Save Dom lib + + + swiper.$ = $; // Extend Swiper + + Object.assign(swiper, { + enabled: swiper.params.enabled, + el, + // Classes + classNames: [], + // Slides + slides: $(), + slidesGrid: [], + snapGrid: [], + slidesSizesGrid: [], + + // isDirection + isHorizontal() { + return swiper.params.direction === 'horizontal'; + }, + + isVertical() { + return swiper.params.direction === 'vertical'; + }, + + // Indexes + activeIndex: 0, + realIndex: 0, + // + isBeginning: true, + isEnd: false, + // Props + translate: 0, + previousTranslate: 0, + progress: 0, + velocity: 0, + animating: false, + // Locks + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + // Touch Events + touchEvents: function touchEvents() { + const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel']; + const desktop = ['pointerdown', 'pointermove', 'pointerup']; + swiper.touchEventsTouch = { + start: touch[0], + move: touch[1], + end: touch[2], + cancel: touch[3] + }; + swiper.touchEventsDesktop = { + start: desktop[0], + move: desktop[1], + end: desktop[2] + }; + return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop; + }(), + touchEventsData: { + isTouched: undefined, + isMoved: undefined, + allowTouchCallbacks: undefined, + touchStartTime: undefined, + isScrolling: undefined, + currentTranslate: undefined, + startTranslate: undefined, + allowThresholdMove: undefined, + // Form elements to match + focusableElements: swiper.params.focusableElements, + // Last click time + lastClickTime: now(), + clickTimeout: undefined, + // Velocities + velocities: [], + allowMomentumBounce: undefined, + isTouchEvent: undefined, + startMoving: undefined + }, + // Clicks + allowClick: true, + // Touches + allowTouchMove: swiper.params.allowTouchMove, + touches: { + startX: 0, + startY: 0, + currentX: 0, + currentY: 0, + diff: 0 + }, + // Images + imagesToLoad: [], + imagesLoaded: 0 + }); + swiper.emit('_swiper'); // Init + + if (swiper.params.init) { + swiper.init(); + } // Return app instance + + + return swiper; + } + + enable() { + const swiper = this; + if (swiper.enabled) return; + swiper.enabled = true; + + if (swiper.params.grabCursor) { + swiper.setGrabCursor(); + } + + swiper.emit('enable'); + } + + disable() { + const swiper = this; + if (!swiper.enabled) return; + swiper.enabled = false; + + if (swiper.params.grabCursor) { + swiper.unsetGrabCursor(); + } + + swiper.emit('disable'); + } + + setProgress(progress, speed) { + const swiper = this; + progress = Math.min(Math.max(progress, 0), 1); + const min = swiper.minTranslate(); + const max = swiper.maxTranslate(); + const current = (max - min) * progress + min; + swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + emitContainerClasses() { + const swiper = this; + if (!swiper.params._emitClasses || !swiper.el) return; + const cls = swiper.el.className.split(' ').filter(className => { + return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0; + }); + swiper.emit('_containerClasses', cls.join(' ')); + } + + getSlideClasses(slideEl) { + const swiper = this; + return slideEl.className.split(' ').filter(className => { + return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0; + }).join(' '); + } + + emitSlidesClasses() { + const swiper = this; + if (!swiper.params._emitClasses || !swiper.el) return; + const updates = []; + swiper.slides.each(slideEl => { + const classNames = swiper.getSlideClasses(slideEl); + updates.push({ + slideEl, + classNames + }); + swiper.emit('_slideClass', slideEl, classNames); + }); + swiper.emit('_slideClasses', updates); + } + + slidesPerViewDynamic(view = 'current', exact = false) { + const swiper = this; + const { + params, + slides, + slidesGrid, + slidesSizesGrid, + size: swiperSize, + activeIndex + } = swiper; + let spv = 1; + + if (params.centeredSlides) { + let slideSize = slides[activeIndex].swiperSlideSize; + let breakLoop; + + for (let i = activeIndex + 1; i < slides.length; i += 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + + for (let i = activeIndex - 1; i >= 0; i -= 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + } else { + // eslint-disable-next-line + if (view === 'current') { + for (let i = activeIndex + 1; i < slides.length; i += 1) { + const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize; + + if (slideInView) { + spv += 1; + } + } + } else { + // previous + for (let i = activeIndex - 1; i >= 0; i -= 1) { + const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize; + + if (slideInView) { + spv += 1; + } + } + } + } + + return spv; + } + + update() { + const swiper = this; + if (!swiper || swiper.destroyed) return; + const { + snapGrid, + params + } = swiper; // Breakpoints + + if (params.breakpoints) { + swiper.setBreakpoint(); + } + + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + function setTranslate() { + const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; + const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + let translated; + + if (swiper.params.freeMode && swiper.params.freeMode.enabled) { + setTranslate(); + + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { + translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + translated = swiper.slideTo(swiper.activeIndex, 0, false, true); + } + + if (!translated) { + setTranslate(); + } + } + + if (params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + + swiper.emit('update'); + } + + changeDirection(newDirection, needUpdate = true) { + const swiper = this; + const currentDirection = swiper.params.direction; + + if (!newDirection) { + // eslint-disable-next-line + newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal'; + } + + if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') { + return swiper; + } + + swiper.$el.removeClass(`${swiper.params.containerModifierClass}${currentDirection}`).addClass(`${swiper.params.containerModifierClass}${newDirection}`); + swiper.emitContainerClasses(); + swiper.params.direction = newDirection; + swiper.slides.each(slideEl => { + if (newDirection === 'vertical') { + slideEl.style.width = ''; + } else { + slideEl.style.height = ''; + } + }); + swiper.emit('changeDirection'); + if (needUpdate) swiper.update(); + return swiper; + } + + mount(el) { + const swiper = this; + if (swiper.mounted) return true; // Find el + + const $el = $(el || swiper.params.el); + el = $el[0]; + + if (!el) { + return false; + } + + el.swiper = swiper; + + const getWrapperSelector = () => { + return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`; + }; + + const getWrapper = () => { + if (el && el.shadowRoot && el.shadowRoot.querySelector) { + const res = $(el.shadowRoot.querySelector(getWrapperSelector())); // Children needs to return slot items + + res.children = options => $el.children(options); + + return res; + } + + return $el.children(getWrapperSelector()); + }; // Find Wrapper + + + let $wrapperEl = getWrapper(); + + if ($wrapperEl.length === 0 && swiper.params.createElements) { + const document = getDocument(); + const wrapper = document.createElement('div'); + $wrapperEl = $(wrapper); + wrapper.className = swiper.params.wrapperClass; + $el.append(wrapper); + $el.children(`.${swiper.params.slideClass}`).each(slideEl => { + $wrapperEl.append(slideEl); + }); + } + + Object.assign(swiper, { + $el, + el, + $wrapperEl, + wrapperEl: $wrapperEl[0], + mounted: true, + // RTL + rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl', + rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), + wrongRTL: $wrapperEl.css('display') === '-webkit-box' + }); + return true; + } + + init(el) { + const swiper = this; + if (swiper.initialized) return swiper; + const mounted = swiper.mount(el); + if (mounted === false) return swiper; + swiper.emit('beforeInit'); // Set breakpoint + + if (swiper.params.breakpoints) { + swiper.setBreakpoint(); + } // Add Classes + + + swiper.addClasses(); // Create loop + + if (swiper.params.loop) { + swiper.loopCreate(); + } // Update size + + + swiper.updateSize(); // Update slides + + swiper.updateSlides(); + + if (swiper.params.watchOverflow) { + swiper.checkOverflow(); + } // Set Grab Cursor + + + if (swiper.params.grabCursor && swiper.enabled) { + swiper.setGrabCursor(); + } + + if (swiper.params.preloadImages) { + swiper.preloadImages(); + } // Slide To Initial Slide + + + if (swiper.params.loop) { + swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit, false, true); + } else { + swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true); + } // Attach events + + + swiper.attachEvents(); // Init Flag + + swiper.initialized = true; // Emit + + swiper.emit('init'); + swiper.emit('afterInit'); + return swiper; + } + + destroy(deleteInstance = true, cleanStyles = true) { + const swiper = this; + const { + params, + $el, + $wrapperEl, + slides + } = swiper; + + if (typeof swiper.params === 'undefined' || swiper.destroyed) { + return null; + } + + swiper.emit('beforeDestroy'); // Init Flag + + swiper.initialized = false; // Detach events + + swiper.detachEvents(); // Destroy loop + + if (params.loop) { + swiper.loopDestroy(); + } // Cleanup styles + + + if (cleanStyles) { + swiper.removeClasses(); + $el.removeAttr('style'); + $wrapperEl.removeAttr('style'); + + if (slides && slides.length) { + slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index'); + } + } + + swiper.emit('destroy'); // Detach emitter events + + Object.keys(swiper.eventsListeners).forEach(eventName => { + swiper.off(eventName); + }); + + if (deleteInstance !== false) { + swiper.$el[0].swiper = null; + deleteProps(swiper); + } + + swiper.destroyed = true; + return null; + } + + static extendDefaults(newDefaults) { + extend(extendedDefaults, newDefaults); + } + + static get extendedDefaults() { + return extendedDefaults; + } + + static get defaults() { + return defaults; + } + + static installModule(mod) { + if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = []; + const modules = Swiper.prototype.__modules__; + + if (typeof mod === 'function' && modules.indexOf(mod) < 0) { + modules.push(mod); + } + } + + static use(module) { + if (Array.isArray(module)) { + module.forEach(m => Swiper.installModule(m)); + return Swiper; + } + + Swiper.installModule(module); + return Swiper; + } + +} + +Object.keys(prototypes).forEach(prototypeGroup => { + Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => { + Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; + }); +}); +Swiper.use([Resize, Observer]); +export default Swiper; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/defaults.js b/src/main/resources/static/assets/js/swiper/core/defaults.js new file mode 100644 index 0000000..cc324a8 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/defaults.js @@ -0,0 +1,120 @@ +export default { + init: true, + direction: 'horizontal', + touchEventsTarget: 'wrapper', + initialSlide: 0, + speed: 300, + cssMode: false, + updateOnWindowResize: true, + resizeObserver: true, + nested: false, + createElements: false, + enabled: true, + focusableElements: 'input, select, option, textarea, button, video, label', + // Overrides + width: null, + height: null, + // + preventInteractionOnTransition: false, + // ssr + userAgent: null, + url: null, + // To support iOS's swipe-to-go-back gesture (when being used in-app). + edgeSwipeDetection: false, + edgeSwipeThreshold: 20, + // Autoheight + autoHeight: false, + // Set wrapper width + setWrapperSize: false, + // Virtual Translate + virtualTranslate: false, + // Effects + effect: 'slide', + // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' + // Breakpoints + breakpoints: undefined, + breakpointsBase: 'window', + // Slides grid + spaceBetween: 0, + slidesPerView: 1, + slidesPerGroup: 1, + slidesPerGroupSkip: 0, + slidesPerGroupAuto: false, + centeredSlides: false, + centeredSlidesBounds: false, + slidesOffsetBefore: 0, + // in px + slidesOffsetAfter: 0, + // in px + normalizeSlideIndex: true, + centerInsufficientSlides: false, + // Disable swiper and hide navigation when container not overflow + watchOverflow: true, + // Round length + roundLengths: false, + // Touches + touchRatio: 1, + touchAngle: 45, + simulateTouch: true, + shortSwipes: true, + longSwipes: true, + longSwipesRatio: 0.5, + longSwipesMs: 300, + followFinger: true, + allowTouchMove: true, + threshold: 0, + touchMoveStopPropagation: false, + touchStartPreventDefault: true, + touchStartForcePreventDefault: false, + touchReleaseOnEdges: false, + // Unique Navigation Elements + uniqueNavElements: true, + // Resistance + resistance: true, + resistanceRatio: 0.85, + // Progress + watchSlidesProgress: false, + // Cursor + grabCursor: false, + // Clicks + preventClicks: true, + preventClicksPropagation: true, + slideToClickedSlide: false, + // Images + preloadImages: true, + updateOnImagesReady: true, + // loop + loop: false, + loopAdditionalSlides: 0, + loopedSlides: null, + loopFillGroupWithBlank: false, + loopPreventsSlide: true, + // Swiping/no swiping + allowSlidePrev: true, + allowSlideNext: true, + swipeHandler: null, + // '.swipe-handler', + noSwiping: true, + noSwipingClass: 'swiper-no-swiping', + noSwipingSelector: null, + // Passive Listeners + passiveListeners: true, + // NS + containerModifierClass: 'swiper-', + // NEW + slideClass: 'swiper-slide', + slideBlankClass: 'swiper-slide-invisible-blank', + slideActiveClass: 'swiper-slide-active', + slideDuplicateActiveClass: 'swiper-slide-duplicate-active', + slideVisibleClass: 'swiper-slide-visible', + slideDuplicateClass: 'swiper-slide-duplicate', + slideNextClass: 'swiper-slide-next', + slideDuplicateNextClass: 'swiper-slide-duplicate-next', + slidePrevClass: 'swiper-slide-prev', + slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', + wrapperClass: 'swiper-wrapper', + // Callbacks + runCallbacksOnInit: true, + // Internals + _emitClasses: false +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/events-emitter.js b/src/main/resources/static/assets/js/swiper/core/events-emitter.js new file mode 100644 index 0000000..ea577a9 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/events-emitter.js @@ -0,0 +1,108 @@ +/* eslint-disable no-underscore-dangle */ +export default { + on(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + const method = priority ? 'unshift' : 'push'; + events.split(' ').forEach(event => { + if (!self.eventsListeners[event]) self.eventsListeners[event] = []; + self.eventsListeners[event][method](handler); + }); + return self; + }, + + once(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + + function onceHandler(...args) { + self.off(events, onceHandler); + + if (onceHandler.__emitterProxy) { + delete onceHandler.__emitterProxy; + } + + handler.apply(self, args); + } + + onceHandler.__emitterProxy = handler; + return self.on(events, onceHandler, priority); + }, + + onAny(handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + const method = priority ? 'unshift' : 'push'; + + if (self.eventsAnyListeners.indexOf(handler) < 0) { + self.eventsAnyListeners[method](handler); + } + + return self; + }, + + offAny(handler) { + const self = this; + if (!self.eventsAnyListeners) return self; + const index = self.eventsAnyListeners.indexOf(handler); + + if (index >= 0) { + self.eventsAnyListeners.splice(index, 1); + } + + return self; + }, + + off(events, handler) { + const self = this; + if (!self.eventsListeners) return self; + events.split(' ').forEach(event => { + if (typeof handler === 'undefined') { + self.eventsListeners[event] = []; + } else if (self.eventsListeners[event]) { + self.eventsListeners[event].forEach((eventHandler, index) => { + if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) { + self.eventsListeners[event].splice(index, 1); + } + }); + } + }); + return self; + }, + + emit(...args) { + const self = this; + if (!self.eventsListeners) return self; + let events; + let data; + let context; + + if (typeof args[0] === 'string' || Array.isArray(args[0])) { + events = args[0]; + data = args.slice(1, args.length); + context = self; + } else { + events = args[0].events; + data = args[0].data; + context = args[0].context || self; + } + + data.unshift(context); + const eventsArray = Array.isArray(events) ? events : events.split(' '); + eventsArray.forEach(event => { + if (self.eventsAnyListeners && self.eventsAnyListeners.length) { + self.eventsAnyListeners.forEach(eventHandler => { + eventHandler.apply(context, [event, ...data]); + }); + } + + if (self.eventsListeners && self.eventsListeners[event]) { + self.eventsListeners[event].forEach(eventHandler => { + eventHandler.apply(context, data); + }); + } + }); + return self; + } + +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/events/index.js b/src/main/resources/static/assets/js/swiper/core/events/index.js new file mode 100644 index 0000000..8b5c83b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/events/index.js @@ -0,0 +1,97 @@ +import { getDocument } from 'ssr-window'; +import onTouchStart from './onTouchStart.js'; +import onTouchMove from './onTouchMove.js'; +import onTouchEnd from './onTouchEnd.js'; +import onResize from './onResize.js'; +import onClick from './onClick.js'; +import onScroll from './onScroll.js'; +let dummyEventAttached = false; + +function dummyEventListener() {} + +const events = (swiper, method) => { + const document = getDocument(); + const { + params, + touchEvents, + el, + wrapperEl, + device, + support + } = swiper; + const capture = !!params.nested; + const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener'; + const swiperMethod = method; // Touch Events + + if (!support.touch) { + el[domMethod](touchEvents.start, swiper.onTouchStart, false); + document[domMethod](touchEvents.move, swiper.onTouchMove, capture); + document[domMethod](touchEvents.end, swiper.onTouchEnd, false); + } else { + const passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? { + passive: true, + capture: false + } : false; + el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener); + el[domMethod](touchEvents.move, swiper.onTouchMove, support.passiveListener ? { + passive: false, + capture + } : capture); + el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener); + + if (touchEvents.cancel) { + el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener); + } + } // Prevent Links Clicks + + + if (params.preventClicks || params.preventClicksPropagation) { + el[domMethod]('click', swiper.onClick, true); + } + + if (params.cssMode) { + wrapperEl[domMethod]('scroll', swiper.onScroll); + } // Resize handler + + + if (params.updateOnWindowResize) { + swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true); + } else { + swiper[swiperMethod]('observerUpdate', onResize, true); + } +}; + +function attachEvents() { + const swiper = this; + const document = getDocument(); + const { + params, + support + } = swiper; + swiper.onTouchStart = onTouchStart.bind(swiper); + swiper.onTouchMove = onTouchMove.bind(swiper); + swiper.onTouchEnd = onTouchEnd.bind(swiper); + + if (params.cssMode) { + swiper.onScroll = onScroll.bind(swiper); + } + + swiper.onClick = onClick.bind(swiper); + + if (support.touch && !dummyEventAttached) { + document.addEventListener('touchstart', dummyEventListener); + dummyEventAttached = true; + } + + events(swiper, 'on'); +} + +function detachEvents() { + const swiper = this; + events(swiper, 'off'); +} + +export default { + attachEvents, + detachEvents +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/events/onClick.js b/src/main/resources/static/assets/js/swiper/core/events/onClick.js new file mode 100644 index 0000000..71f8da0 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/events/onClick.js @@ -0,0 +1,13 @@ +export default function onClick(e) { + const swiper = this; + if (!swiper.enabled) return; + + if (!swiper.allowClick) { + if (swiper.params.preventClicks) e.preventDefault(); + + if (swiper.params.preventClicksPropagation && swiper.animating) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/events/onResize.js b/src/main/resources/static/assets/js/swiper/core/events/onResize.js new file mode 100644 index 0000000..85ac871 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/events/onResize.js @@ -0,0 +1,43 @@ +export default function onResize() { + const swiper = this; + const { + params, + el + } = swiper; + if (el && el.offsetWidth === 0) return; // Breakpoints + + if (params.breakpoints) { + swiper.setBreakpoint(); + } // Save locks + + + const { + allowSlideNext, + allowSlidePrev, + snapGrid + } = swiper; // Disable locks on resize + + swiper.allowSlideNext = true; + swiper.allowSlidePrev = true; + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateSlidesClasses(); + + if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) { + swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + swiper.slideTo(swiper.activeIndex, 0, false, true); + } + + if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { + swiper.autoplay.run(); + } // Return locks after resize + + + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + + if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/events/onScroll.js b/src/main/resources/static/assets/js/swiper/core/events/onScroll.js new file mode 100644 index 0000000..738aea8 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/events/onScroll.js @@ -0,0 +1,35 @@ +export default function onScroll() { + const swiper = this; + const { + wrapperEl, + rtlTranslate, + enabled + } = swiper; + if (!enabled) return; + swiper.previousTranslate = swiper.translate; + + if (swiper.isHorizontal()) { + swiper.translate = -wrapperEl.scrollLeft; + } else { + swiper.translate = -wrapperEl.scrollTop; + } // eslint-disable-next-line + + + if (swiper.translate === -0) swiper.translate = 0; + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff; + } + + if (newProgress !== swiper.progress) { + swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate); + } + + swiper.emit('setTranslate', swiper.translate, false); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/events/onTouchEnd.js b/src/main/resources/static/assets/js/swiper/core/events/onTouchEnd.js new file mode 100644 index 0000000..4ed79f0 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/events/onTouchEnd.js @@ -0,0 +1,143 @@ +import { now, nextTick } from '../../shared/utils.js'; +export default function onTouchEnd(event) { + const swiper = this; + const data = swiper.touchEventsData; + const { + params, + touches, + rtlTranslate: rtl, + slidesGrid, + enabled + } = swiper; + if (!enabled) return; + let e = event; + if (e.originalEvent) e = e.originalEvent; + + if (data.allowTouchCallbacks) { + swiper.emit('touchEnd', e); + } + + data.allowTouchCallbacks = false; + + if (!data.isTouched) { + if (data.isMoved && params.grabCursor) { + swiper.setGrabCursor(false); + } + + data.isMoved = false; + data.startMoving = false; + return; + } // Return Grab Cursor + + + if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(false); + } // Time diff + + + const touchEndTime = now(); + const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click + + if (swiper.allowClick) { + swiper.updateClickedSlide(e); + swiper.emit('tap click', e); + + if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) { + swiper.emit('doubleTap doubleClick', e); + } + } + + data.lastClickTime = now(); + nextTick(() => { + if (!swiper.destroyed) swiper.allowClick = true; + }); + + if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) { + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + return; + } + + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + let currentPos; + + if (params.followFinger) { + currentPos = rtl ? swiper.translate : -swiper.translate; + } else { + currentPos = -data.currentTranslate; + } + + if (params.cssMode) { + return; + } + + if (swiper.params.freeMode && params.freeMode.enabled) { + swiper.freeMode.onTouchEnd({ + currentPos + }); + return; + } // Find current slide + + + let stopIndex = 0; + let groupSize = swiper.slidesSizesGrid[0]; + + for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) { + const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; + + if (typeof slidesGrid[i + increment] !== 'undefined') { + if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) { + stopIndex = i; + groupSize = slidesGrid[i + increment] - slidesGrid[i]; + } + } else if (currentPos >= slidesGrid[i]) { + stopIndex = i; + groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; + } + } // Find current slide size + + + const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; + const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; + + if (timeDiff > params.longSwipesMs) { + // Long touches + if (!params.longSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + + if (swiper.swipeDirection === 'next') { + if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex); + } + + if (swiper.swipeDirection === 'prev') { + if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex); + } + } else { + // Short swipes + if (!params.shortSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + + const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl); + + if (!isNavButtonTarget) { + if (swiper.swipeDirection === 'next') { + swiper.slideTo(stopIndex + increment); + } + + if (swiper.swipeDirection === 'prev') { + swiper.slideTo(stopIndex); + } + } else if (e.target === swiper.navigation.nextEl) { + swiper.slideTo(stopIndex + increment); + } else { + swiper.slideTo(stopIndex); + } + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/events/onTouchMove.js b/src/main/resources/static/assets/js/swiper/core/events/onTouchMove.js new file mode 100644 index 0000000..015107d --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/events/onTouchMove.js @@ -0,0 +1,222 @@ +import { getDocument } from 'ssr-window'; +import $ from '../../shared/dom.js'; +import { now } from '../../shared/utils.js'; +export default function onTouchMove(event) { + const document = getDocument(); + const swiper = this; + const data = swiper.touchEventsData; + const { + params, + touches, + rtlTranslate: rtl, + enabled + } = swiper; + if (!enabled) return; + let e = event; + if (e.originalEvent) e = e.originalEvent; + + if (!data.isTouched) { + if (data.startMoving && data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + + return; + } + + if (data.isTouchEvent && e.type !== 'touchmove') return; + const targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]); + const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX; + const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY; + + if (e.preventedByNestedSwiper) { + touches.startX = pageX; + touches.startY = pageY; + return; + } + + if (!swiper.allowTouchMove) { + // isMoved = true; + swiper.allowClick = false; + + if (data.isTouched) { + Object.assign(touches, { + startX: pageX, + startY: pageY, + currentX: pageX, + currentY: pageY + }); + data.touchStartTime = now(); + } + + return; + } + + if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) { + if (swiper.isVertical()) { + // Vertical + if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) { + data.isTouched = false; + data.isMoved = false; + return; + } + } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) { + return; + } + } + + if (data.isTouchEvent && document.activeElement) { + if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) { + data.isMoved = true; + swiper.allowClick = false; + return; + } + } + + if (data.allowTouchCallbacks) { + swiper.emit('touchMove', e); + } + + if (e.targetTouches && e.targetTouches.length > 1) return; + touches.currentX = pageX; + touches.currentY = pageY; + const diffX = touches.currentX - touches.startX; + const diffY = touches.currentY - touches.startY; + if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return; + + if (typeof data.isScrolling === 'undefined') { + let touchAngle; + + if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) { + data.isScrolling = false; + } else { + // eslint-disable-next-line + if (diffX * diffX + diffY * diffY >= 25) { + touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI; + data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle; + } + } + } + + if (data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + + if (typeof data.startMoving === 'undefined') { + if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { + data.startMoving = true; + } + } + + if (data.isScrolling) { + data.isTouched = false; + return; + } + + if (!data.startMoving) { + return; + } + + swiper.allowClick = false; + + if (!params.cssMode && e.cancelable) { + e.preventDefault(); + } + + if (params.touchMoveStopPropagation && !params.nested) { + e.stopPropagation(); + } + + if (!data.isMoved) { + if (params.loop && !params.cssMode) { + swiper.loopFix(); + } + + data.startTranslate = swiper.getTranslate(); + swiper.setTransition(0); + + if (swiper.animating) { + swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend'); + } + + data.allowMomentumBounce = false; // Grab Cursor + + if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(true); + } + + swiper.emit('sliderFirstMove', e); + } + + swiper.emit('sliderMove', e); + data.isMoved = true; + let diff = swiper.isHorizontal() ? diffX : diffY; + touches.diff = diff; + diff *= params.touchRatio; + if (rtl) diff = -diff; + swiper.swipeDirection = diff > 0 ? 'prev' : 'next'; + data.currentTranslate = diff + data.startTranslate; + let disableParentSwiper = true; + let resistanceRatio = params.resistanceRatio; + + if (params.touchReleaseOnEdges) { + resistanceRatio = 0; + } + + if (diff > 0 && data.currentTranslate > swiper.minTranslate()) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio; + } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio; + } + + if (disableParentSwiper) { + e.preventedByNestedSwiper = true; + } // Directions locks + + + if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + + if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + + if (!swiper.allowSlidePrev && !swiper.allowSlideNext) { + data.currentTranslate = data.startTranslate; + } // Threshold + + + if (params.threshold > 0) { + if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { + if (!data.allowThresholdMove) { + data.allowThresholdMove = true; + touches.startX = touches.currentX; + touches.startY = touches.currentY; + data.currentTranslate = data.startTranslate; + touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; + return; + } + } else { + data.currentTranslate = data.startTranslate; + return; + } + } + + if (!params.followFinger || params.cssMode) return; // Update active index in free mode + + if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) { + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) { + swiper.freeMode.onTouchMove(); + } // Update progress + + + swiper.updateProgress(data.currentTranslate); // Update translate + + swiper.setTranslate(data.currentTranslate); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/events/onTouchStart.js b/src/main/resources/static/assets/js/swiper/core/events/onTouchStart.js new file mode 100644 index 0000000..cc5a257 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/events/onTouchStart.js @@ -0,0 +1,114 @@ +import { getWindow, getDocument } from 'ssr-window'; +import $ from '../../shared/dom.js'; +import { now } from '../../shared/utils.js'; // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd + +function closestElement(selector, base = this) { + function __closestFrom(el) { + if (!el || el === getDocument() || el === getWindow()) return null; + if (el.assignedSlot) el = el.assignedSlot; + const found = el.closest(selector); + return found || __closestFrom(el.getRootNode().host); + } + + return __closestFrom(base); +} + +export default function onTouchStart(event) { + const swiper = this; + const document = getDocument(); + const window = getWindow(); + const data = swiper.touchEventsData; + const { + params, + touches, + enabled + } = swiper; + if (!enabled) return; + + if (swiper.animating && params.preventInteractionOnTransition) { + return; + } + + if (!swiper.animating && params.cssMode && params.loop) { + swiper.loopFix(); + } + + let e = event; + if (e.originalEvent) e = e.originalEvent; + let $targetEl = $(e.target); + + if (params.touchEventsTarget === 'wrapper') { + if (!$targetEl.closest(swiper.wrapperEl).length) return; + } + + data.isTouchEvent = e.type === 'touchstart'; + if (!data.isTouchEvent && 'which' in e && e.which === 3) return; + if (!data.isTouchEvent && 'button' in e && e.button > 0) return; + if (data.isTouched && data.isMoved) return; // change target el for shadow root component + + const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== ''; + + if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) { + $targetEl = $(event.path[0]); + } + + const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`; + const isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element + + if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, e.target) : $targetEl.closest(noSwipingSelector)[0])) { + swiper.allowClick = true; + return; + } + + if (params.swipeHandler) { + if (!$targetEl.closest(params.swipeHandler)[0]) return; + } + + touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + const startX = touches.currentX; + const startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore + + const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; + const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; + + if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) { + if (edgeSwipeDetection === 'prevent') { + event.preventDefault(); + } else { + return; + } + } + + Object.assign(data, { + isTouched: true, + isMoved: false, + allowTouchCallbacks: true, + isScrolling: undefined, + startMoving: undefined + }); + touches.startX = startX; + touches.startY = startY; + data.touchStartTime = now(); + swiper.allowClick = true; + swiper.updateSize(); + swiper.swipeDirection = undefined; + if (params.threshold > 0) data.allowThresholdMove = false; + + if (e.type !== 'touchstart') { + let preventDefault = true; + if ($targetEl.is(data.focusableElements)) preventDefault = false; + + if (document.activeElement && $(document.activeElement).is(data.focusableElements) && document.activeElement !== $targetEl[0]) { + document.activeElement.blur(); + } + + const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; + + if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) { + e.preventDefault(); + } + } + + swiper.emit('touchStart', e); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/grab-cursor/index.js b/src/main/resources/static/assets/js/swiper/core/grab-cursor/index.js new file mode 100644 index 0000000..ac4bdcf --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/grab-cursor/index.js @@ -0,0 +1,6 @@ +import setGrabCursor from './setGrabCursor.js'; +import unsetGrabCursor from './unsetGrabCursor.js'; +export default { + setGrabCursor, + unsetGrabCursor +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/grab-cursor/setGrabCursor.js b/src/main/resources/static/assets/js/swiper/core/grab-cursor/setGrabCursor.js new file mode 100644 index 0000000..96e6227 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/grab-cursor/setGrabCursor.js @@ -0,0 +1,9 @@ +export default function setGrabCursor(moving) { + const swiper = this; + if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return; + const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl; + el.style.cursor = 'move'; + el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab'; + el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab'; + el.style.cursor = moving ? 'grabbing' : 'grab'; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/grab-cursor/unsetGrabCursor.js b/src/main/resources/static/assets/js/swiper/core/grab-cursor/unsetGrabCursor.js new file mode 100644 index 0000000..923e23d --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/grab-cursor/unsetGrabCursor.js @@ -0,0 +1,9 @@ +export default function unsetGrabCursor() { + const swiper = this; + + if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) { + return; + } + + swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = ''; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/images/index.js b/src/main/resources/static/assets/js/swiper/core/images/index.js new file mode 100644 index 0000000..ee01026 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/images/index.js @@ -0,0 +1,6 @@ +import loadImage from './loadImage.js'; +import preloadImages from './preloadImages.js'; +export default { + loadImage, + preloadImages +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/images/loadImage.js b/src/main/resources/static/assets/js/swiper/core/images/loadImage.js new file mode 100644 index 0000000..0811b4c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/images/loadImage.js @@ -0,0 +1,37 @@ +import { getWindow } from 'ssr-window'; +import $ from '../../shared/dom.js'; +export default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) { + const window = getWindow(); + let image; + + function onReady() { + if (callback) callback(); + } + + const isPicture = $(imageEl).parent('picture')[0]; + + if (!isPicture && (!imageEl.complete || !checkForComplete)) { + if (src) { + image = new window.Image(); + image.onload = onReady; + image.onerror = onReady; + + if (sizes) { + image.sizes = sizes; + } + + if (srcset) { + image.srcset = srcset; + } + + if (src) { + image.src = src; + } + } else { + onReady(); + } + } else { + // image already loaded... + onReady(); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/images/preloadImages.js b/src/main/resources/static/assets/js/swiper/core/images/preloadImages.js new file mode 100644 index 0000000..464d9a7 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/images/preloadImages.js @@ -0,0 +1,19 @@ +export default function preloadImages() { + const swiper = this; + swiper.imagesToLoad = swiper.$el.find('img'); + + function onReady() { + if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return; + if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1; + + if (swiper.imagesLoaded === swiper.imagesToLoad.length) { + if (swiper.params.updateOnImagesReady) swiper.update(); + swiper.emit('imagesReady'); + } + } + + for (let i = 0; i < swiper.imagesToLoad.length; i += 1) { + const imageEl = swiper.imagesToLoad[i]; + swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/loop/index.js b/src/main/resources/static/assets/js/swiper/core/loop/index.js new file mode 100644 index 0000000..428da41 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/loop/index.js @@ -0,0 +1,8 @@ +import loopCreate from './loopCreate.js'; +import loopFix from './loopFix.js'; +import loopDestroy from './loopDestroy.js'; +export default { + loopCreate, + loopFix, + loopDestroy +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/loop/loopCreate.js b/src/main/resources/static/assets/js/swiper/core/loop/loopCreate.js new file mode 100644 index 0000000..69edf0a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/loop/loopCreate.js @@ -0,0 +1,59 @@ +import { getDocument } from 'ssr-window'; +import $ from '../../shared/dom.js'; +export default function loopCreate() { + const swiper = this; + const document = getDocument(); + const { + params, + $wrapperEl + } = swiper; // Remove duplicated slides + + const $selector = $($wrapperEl.children()[0].parentNode); + $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove(); + let slides = $selector.children(`.${params.slideClass}`); + + if (params.loopFillGroupWithBlank) { + const blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup; + + if (blankSlidesNum !== params.slidesPerGroup) { + for (let i = 0; i < blankSlidesNum; i += 1) { + const blankNode = $(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`); + $selector.append(blankNode); + } + + slides = $selector.children(`.${params.slideClass}`); + } + } + + if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length; + swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10)); + swiper.loopedSlides += params.loopAdditionalSlides; + + if (swiper.loopedSlides > slides.length) { + swiper.loopedSlides = slides.length; + } + + const prependSlides = []; + const appendSlides = []; + slides.each((el, index) => { + const slide = $(el); + + if (index < swiper.loopedSlides) { + appendSlides.push(el); + } + + if (index < slides.length && index >= slides.length - swiper.loopedSlides) { + prependSlides.push(el); + } + + slide.attr('data-swiper-slide-index', index); + }); + + for (let i = 0; i < appendSlides.length; i += 1) { + $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } + + for (let i = prependSlides.length - 1; i >= 0; i -= 1) { + $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/loop/loopDestroy.js b/src/main/resources/static/assets/js/swiper/core/loop/loopDestroy.js new file mode 100644 index 0000000..4c77968 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/loop/loopDestroy.js @@ -0,0 +1,10 @@ +export default function loopDestroy() { + const swiper = this; + const { + $wrapperEl, + params, + slides + } = swiper; + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove(); + slides.removeAttr('data-swiper-slide-index'); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/loop/loopFix.js b/src/main/resources/static/assets/js/swiper/core/loop/loopFix.js new file mode 100644 index 0000000..16f332e --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/loop/loopFix.js @@ -0,0 +1,41 @@ +export default function loopFix() { + const swiper = this; + swiper.emit('beforeLoopFix'); + const { + activeIndex, + slides, + loopedSlides, + allowSlidePrev, + allowSlideNext, + snapGrid, + rtlTranslate: rtl + } = swiper; + let newIndex; + swiper.allowSlidePrev = true; + swiper.allowSlideNext = true; + const snapTranslate = -snapGrid[activeIndex]; + const diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding + + if (activeIndex < loopedSlides) { + newIndex = slides.length - loopedSlides * 3 + activeIndex; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } else if (activeIndex >= slides.length - loopedSlides) { + // Fix For Positive Oversliding + newIndex = -slides.length + activeIndex + loopedSlides; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } + + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + swiper.emit('loopFix'); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/moduleExtendParams.js b/src/main/resources/static/assets/js/swiper/core/moduleExtendParams.js new file mode 100644 index 0000000..82cb57a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/moduleExtendParams.js @@ -0,0 +1,38 @@ +import { extend } from '../shared/utils.js'; +export default function moduleExtendParams(params, allModulesParams) { + return function extendParams(obj = {}) { + const moduleParamName = Object.keys(obj)[0]; + const moduleParams = obj[moduleParamName]; + + if (typeof moduleParams !== 'object' || moduleParams === null) { + extend(allModulesParams, obj); + return; + } + + if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) { + params[moduleParamName] = { + auto: true + }; + } + + if (!(moduleParamName in params && 'enabled' in moduleParams)) { + extend(allModulesParams, obj); + return; + } + + if (params[moduleParamName] === true) { + params[moduleParamName] = { + enabled: true + }; + } + + if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) { + params[moduleParamName].enabled = true; + } + + if (!params[moduleParamName]) params[moduleParamName] = { + enabled: false + }; + extend(allModulesParams, obj); + }; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/modules/observer/observer.js b/src/main/resources/static/assets/js/swiper/core/modules/observer/observer.js new file mode 100644 index 0000000..66a6374 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/modules/observer/observer.js @@ -0,0 +1,75 @@ +import { getWindow } from 'ssr-window'; +export default function Observer({ + swiper, + extendParams, + on, + emit +}) { + const observers = []; + const window = getWindow(); + + const attach = (target, options = {}) => { + const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver; + const observer = new ObserverFunc(mutations => { + // The observerUpdate event should only be triggered + // once despite the number of mutations. Additional + // triggers are redundant and are very costly + if (mutations.length === 1) { + emit('observerUpdate', mutations[0]); + return; + } + + const observerUpdate = function observerUpdate() { + emit('observerUpdate', mutations[0]); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(observerUpdate); + } else { + window.setTimeout(observerUpdate, 0); + } + }); + observer.observe(target, { + attributes: typeof options.attributes === 'undefined' ? true : options.attributes, + childList: typeof options.childList === 'undefined' ? true : options.childList, + characterData: typeof options.characterData === 'undefined' ? true : options.characterData + }); + observers.push(observer); + }; + + const init = () => { + if (!swiper.params.observer) return; + + if (swiper.params.observeParents) { + const containerParents = swiper.$el.parents(); + + for (let i = 0; i < containerParents.length; i += 1) { + attach(containerParents[i]); + } + } // Observe container + + + attach(swiper.$el[0], { + childList: swiper.params.observeSlideChildren + }); // Observe wrapper + + attach(swiper.$wrapperEl[0], { + attributes: false + }); + }; + + const destroy = () => { + observers.forEach(observer => { + observer.disconnect(); + }); + observers.splice(0, observers.length); + }; + + extendParams({ + observer: false, + observeParents: false, + observeSlideChildren: false + }); + on('init', init); + on('destroy', destroy); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/modules/resize/resize.js b/src/main/resources/static/assets/js/swiper/core/modules/resize/resize.js new file mode 100644 index 0000000..7538804 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/modules/resize/resize.js @@ -0,0 +1,68 @@ +import { getWindow } from 'ssr-window'; +export default function Resize({ + swiper, + on, + emit +}) { + const window = getWindow(); + let observer = null; + + const resizeHandler = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + emit('beforeResize'); + emit('resize'); + }; + + const createObserver = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + observer = new ResizeObserver(entries => { + const { + width, + height + } = swiper; + let newWidth = width; + let newHeight = height; + entries.forEach(({ + contentBoxSize, + contentRect, + target + }) => { + if (target && target !== swiper.el) return; + newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize; + newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize; + }); + + if (newWidth !== width || newHeight !== height) { + resizeHandler(); + } + }); + observer.observe(swiper.el); + }; + + const removeObserver = () => { + if (observer && observer.unobserve && swiper.el) { + observer.unobserve(swiper.el); + observer = null; + } + }; + + const orientationChangeHandler = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + emit('orientationchange'); + }; + + on('init', () => { + if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') { + createObserver(); + return; + } + + window.addEventListener('resize', resizeHandler); + window.addEventListener('orientationchange', orientationChangeHandler); + }); + on('destroy', () => { + removeObserver(); + window.removeEventListener('resize', resizeHandler); + window.removeEventListener('orientationchange', orientationChangeHandler); + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/slide/index.js b/src/main/resources/static/assets/js/swiper/core/slide/index.js new file mode 100644 index 0000000..105c438 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/slide/index.js @@ -0,0 +1,16 @@ +import slideTo from './slideTo.js'; +import slideToLoop from './slideToLoop.js'; +import slideNext from './slideNext.js'; +import slidePrev from './slidePrev.js'; +import slideReset from './slideReset.js'; +import slideToClosest from './slideToClosest.js'; +import slideToClickedSlide from './slideToClickedSlide.js'; +export default { + slideTo, + slideToLoop, + slideNext, + slidePrev, + slideReset, + slideToClosest, + slideToClickedSlide +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/slide/slideNext.js b/src/main/resources/static/assets/js/swiper/core/slide/slideNext.js new file mode 100644 index 0000000..b96bf6a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/slide/slideNext.js @@ -0,0 +1,26 @@ +/* eslint no-unused-vars: "off" */ +export default function slideNext(speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { + animating, + enabled, + params + } = swiper; + if (!enabled) return swiper; + let perGroup = params.slidesPerGroup; + + if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { + perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1); + } + + const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup; + + if (params.loop) { + if (animating && params.loopPreventsSlide) return false; + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + + return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/slide/slidePrev.js b/src/main/resources/static/assets/js/swiper/core/slide/slidePrev.js new file mode 100644 index 0000000..17f3225 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/slide/slidePrev.js @@ -0,0 +1,59 @@ +/* eslint no-unused-vars: "off" */ +export default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { + params, + animating, + snapGrid, + slidesGrid, + rtlTranslate, + enabled + } = swiper; + if (!enabled) return swiper; + + if (params.loop) { + if (animating && params.loopPreventsSlide) return false; + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + + const translate = rtlTranslate ? swiper.translate : -swiper.translate; + + function normalize(val) { + if (val < 0) return -Math.floor(Math.abs(val)); + return Math.floor(val); + } + + const normalizedTranslate = normalize(translate); + const normalizedSnapGrid = snapGrid.map(val => normalize(val)); + let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; + + if (typeof prevSnap === 'undefined' && params.cssMode) { + let prevSnapIndex; + snapGrid.forEach((snap, snapIndex) => { + if (normalizedTranslate >= snap) { + // prevSnap = snap; + prevSnapIndex = snapIndex; + } + }); + + if (typeof prevSnapIndex !== 'undefined') { + prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex]; + } + } + + let prevIndex = 0; + + if (typeof prevSnap !== 'undefined') { + prevIndex = slidesGrid.indexOf(prevSnap); + if (prevIndex < 0) prevIndex = swiper.activeIndex - 1; + + if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { + prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1; + prevIndex = Math.max(prevIndex, 0); + } + } + + return swiper.slideTo(prevIndex, speed, runCallbacks, internal); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/slide/slideReset.js b/src/main/resources/static/assets/js/swiper/core/slide/slideReset.js new file mode 100644 index 0000000..d7c430a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/slide/slideReset.js @@ -0,0 +1,5 @@ +/* eslint no-unused-vars: "off" */ +export default function slideReset(speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/slide/slideTo.js b/src/main/resources/static/assets/js/swiper/core/slide/slideTo.js new file mode 100644 index 0000000..73a41cf --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/slide/slideTo.js @@ -0,0 +1,189 @@ +import { animateCSSModeScroll } from '../../shared/utils.js'; +export default function slideTo(index = 0, speed = this.params.speed, runCallbacks = true, internal, initial) { + if (typeof index !== 'number' && typeof index !== 'string') { + throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`); + } + + if (typeof index === 'string') { + /** + * The `index` argument converted from `string` to `number`. + * @type {number} + */ + const indexAsNumber = parseInt(index, 10); + /** + * Determines whether the `index` argument is a valid `number` + * after being converted from the `string` type. + * @type {boolean} + */ + + const isValidNumber = isFinite(indexAsNumber); + + if (!isValidNumber) { + throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`); + } // Knowing that the converted `index` is a valid number, + // we can update the original argument's value. + + + index = indexAsNumber; + } + + const swiper = this; + let slideIndex = index; + if (slideIndex < 0) slideIndex = 0; + const { + params, + snapGrid, + slidesGrid, + previousIndex, + activeIndex, + rtlTranslate: rtl, + wrapperEl, + enabled + } = swiper; + + if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) { + return false; + } + + const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex); + let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup); + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) { + swiper.emit('beforeSlideChangeStart'); + } + + const translate = -snapGrid[snapIndex]; // Update progress + + swiper.updateProgress(translate); // Normalize slideIndex + + if (params.normalizeSlideIndex) { + for (let i = 0; i < slidesGrid.length; i += 1) { + const normalizedTranslate = -Math.floor(translate * 100); + const normalizedGrid = Math.floor(slidesGrid[i] * 100); + const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100); + + if (typeof slidesGrid[i + 1] !== 'undefined') { + if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) { + slideIndex = i; + } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) { + slideIndex = i + 1; + } + } else if (normalizedTranslate >= normalizedGrid) { + slideIndex = i; + } + } + } // Directions locks + + + if (swiper.initialized && slideIndex !== activeIndex) { + if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) { + return false; + } + + if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) { + if ((activeIndex || 0) !== slideIndex) return false; + } + } + + let direction; + if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index + + if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) { + swiper.updateActiveIndex(slideIndex); // Update Height + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + swiper.updateSlidesClasses(); + + if (params.effect !== 'slide') { + swiper.setTranslate(translate); + } + + if (direction !== 'reset') { + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } + + return false; + } + + if (params.cssMode) { + const isH = swiper.isHorizontal(); + const t = rtl ? translate : -translate; + + if (speed === 0) { + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + + if (isVirtual) { + swiper.wrapperEl.style.scrollSnapType = 'none'; + swiper._immediateVirtual = true; + } + + wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t; + + if (isVirtual) { + requestAnimationFrame(() => { + swiper.wrapperEl.style.scrollSnapType = ''; + swiper._swiperImmediateVirtual = false; + }); + } + } else { + if (!swiper.support.smoothScroll) { + animateCSSModeScroll({ + swiper, + targetPosition: t, + side: isH ? 'left' : 'top' + }); + return true; + } + + wrapperEl.scrollTo({ + [isH ? 'left' : 'top']: t, + behavior: 'smooth' + }); + } + + return true; + } + + if (speed === 0) { + swiper.setTransition(0); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } else { + swiper.setTransition(speed); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + + if (!swiper.animating) { + swiper.animating = true; + + if (!swiper.onSlideToWrapperTransitionEnd) { + swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + swiper.onSlideToWrapperTransitionEnd = null; + delete swiper.onSlideToWrapperTransitionEnd; + swiper.transitionEnd(runCallbacks, direction); + }; + } + + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + } + } + + return true; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/slide/slideToClickedSlide.js b/src/main/resources/static/assets/js/swiper/core/slide/slideToClickedSlide.js new file mode 100644 index 0000000..cda7da8 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/slide/slideToClickedSlide.js @@ -0,0 +1,39 @@ +import $ from '../../shared/dom.js'; +import { nextTick } from '../../shared/utils.js'; +export default function slideToClickedSlide() { + const swiper = this; + const { + params, + $wrapperEl + } = swiper; + const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView; + let slideToIndex = swiper.clickedIndex; + let realIndex; + + if (params.loop) { + if (swiper.animating) return; + realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10); + + if (params.centeredSlides) { + if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) { + swiper.loopFix(); + slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`).eq(0).index(); + nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else if (slideToIndex > swiper.slides.length - slidesPerView) { + swiper.loopFix(); + slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`).eq(0).index(); + nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else { + swiper.slideTo(slideToIndex); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/slide/slideToClosest.js b/src/main/resources/static/assets/js/swiper/core/slide/slideToClosest.js new file mode 100644 index 0000000..bebfd22 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/slide/slideToClosest.js @@ -0,0 +1,32 @@ +/* eslint no-unused-vars: "off" */ +export default function slideToClosest(speed = this.params.speed, runCallbacks = true, internal, threshold = 0.5) { + const swiper = this; + let index = swiper.activeIndex; + const skip = Math.min(swiper.params.slidesPerGroupSkip, index); + const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup); + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + + if (translate >= swiper.snapGrid[snapIndex]) { + // The current translate is on or after the current snap index, so the choice + // is between the current index and the one after it. + const currentSnap = swiper.snapGrid[snapIndex]; + const nextSnap = swiper.snapGrid[snapIndex + 1]; + + if (translate - currentSnap > (nextSnap - currentSnap) * threshold) { + index += swiper.params.slidesPerGroup; + } + } else { + // The current translate is before the current snap index, so the choice + // is between the current index and the one before it. + const prevSnap = swiper.snapGrid[snapIndex - 1]; + const currentSnap = swiper.snapGrid[snapIndex]; + + if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) { + index -= swiper.params.slidesPerGroup; + } + } + + index = Math.max(index, 0); + index = Math.min(index, swiper.slidesGrid.length - 1); + return swiper.slideTo(index, speed, runCallbacks, internal); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/slide/slideToLoop.js b/src/main/resources/static/assets/js/swiper/core/slide/slideToLoop.js new file mode 100644 index 0000000..916522c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/slide/slideToLoop.js @@ -0,0 +1,10 @@ +export default function slideToLoop(index = 0, speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + let newIndex = index; + + if (swiper.params.loop) { + newIndex += swiper.loopedSlides; + } + + return swiper.slideTo(newIndex, speed, runCallbacks, internal); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/transition/index.js b/src/main/resources/static/assets/js/swiper/core/transition/index.js new file mode 100644 index 0000000..212e4ed --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/transition/index.js @@ -0,0 +1,8 @@ +import setTransition from './setTransition.js'; +import transitionStart from './transitionStart.js'; +import transitionEnd from './transitionEnd.js'; +export default { + setTransition, + transitionStart, + transitionEnd +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/transition/setTransition.js b/src/main/resources/static/assets/js/swiper/core/transition/setTransition.js new file mode 100644 index 0000000..df4afeb --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/transition/setTransition.js @@ -0,0 +1,9 @@ +export default function setTransition(duration, byController) { + const swiper = this; + + if (!swiper.params.cssMode) { + swiper.$wrapperEl.transition(duration); + } + + swiper.emit('setTransition', duration, byController); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/transition/transitionEmit.js b/src/main/resources/static/assets/js/swiper/core/transition/transitionEmit.js new file mode 100644 index 0000000..089b8fe --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/transition/transitionEmit.js @@ -0,0 +1,33 @@ +export default function transitionEmit({ + swiper, + runCallbacks, + direction, + step +}) { + const { + activeIndex, + previousIndex + } = swiper; + let dir = direction; + + if (!dir) { + if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset'; + } + + swiper.emit(`transition${step}`); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === 'reset') { + swiper.emit(`slideResetTransition${step}`); + return; + } + + swiper.emit(`slideChangeTransition${step}`); + + if (dir === 'next') { + swiper.emit(`slideNextTransition${step}`); + } else { + swiper.emit(`slidePrevTransition${step}`); + } + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/transition/transitionEnd.js b/src/main/resources/static/assets/js/swiper/core/transition/transitionEnd.js new file mode 100644 index 0000000..b34fbc5 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/transition/transitionEnd.js @@ -0,0 +1,16 @@ +import transitionEmit from './transitionEmit.js'; +export default function transitionEnd(runCallbacks = true, direction) { + const swiper = this; + const { + params + } = swiper; + swiper.animating = false; + if (params.cssMode) return; + swiper.setTransition(0); + transitionEmit({ + swiper, + runCallbacks, + direction, + step: 'End' + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/transition/transitionStart.js b/src/main/resources/static/assets/js/swiper/core/transition/transitionStart.js new file mode 100644 index 0000000..aa31112 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/transition/transitionStart.js @@ -0,0 +1,19 @@ +import transitionEmit from './transitionEmit.js'; +export default function transitionStart(runCallbacks = true, direction) { + const swiper = this; + const { + params + } = swiper; + if (params.cssMode) return; + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + transitionEmit({ + swiper, + runCallbacks, + direction, + step: 'Start' + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/translate/getTranslate.js b/src/main/resources/static/assets/js/swiper/core/translate/getTranslate.js new file mode 100644 index 0000000..4ade9fa --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/translate/getTranslate.js @@ -0,0 +1,22 @@ +import { getTranslate } from '../../shared/utils.js'; +export default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') { + const swiper = this; + const { + params, + rtlTranslate: rtl, + translate, + $wrapperEl + } = swiper; + + if (params.virtualTranslate) { + return rtl ? -translate : translate; + } + + if (params.cssMode) { + return translate; + } + + let currentTranslate = getTranslate($wrapperEl[0], axis); + if (rtl) currentTranslate = -currentTranslate; + return currentTranslate || 0; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/translate/index.js b/src/main/resources/static/assets/js/swiper/core/translate/index.js new file mode 100644 index 0000000..5e962ec --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/translate/index.js @@ -0,0 +1,12 @@ +import getTranslate from './getTranslate.js'; +import setTranslate from './setTranslate.js'; +import minTranslate from './minTranslate.js'; +import maxTranslate from './maxTranslate.js'; +import translateTo from './translateTo.js'; +export default { + getTranslate, + setTranslate, + minTranslate, + maxTranslate, + translateTo +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/translate/maxTranslate.js b/src/main/resources/static/assets/js/swiper/core/translate/maxTranslate.js new file mode 100644 index 0000000..4f2bbb9 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/translate/maxTranslate.js @@ -0,0 +1,3 @@ +export default function maxTranslate() { + return -this.snapGrid[this.snapGrid.length - 1]; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/translate/minTranslate.js b/src/main/resources/static/assets/js/swiper/core/translate/minTranslate.js new file mode 100644 index 0000000..db06141 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/translate/minTranslate.js @@ -0,0 +1,3 @@ +export default function minTranslate() { + return -this.snapGrid[0]; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/translate/setTranslate.js b/src/main/resources/static/assets/js/swiper/core/translate/setTranslate.js new file mode 100644 index 0000000..c4c1fb5 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/translate/setTranslate.js @@ -0,0 +1,48 @@ +export default function setTranslate(translate, byController) { + const swiper = this; + const { + rtlTranslate: rtl, + params, + $wrapperEl, + wrapperEl, + progress + } = swiper; + let x = 0; + let y = 0; + const z = 0; + + if (swiper.isHorizontal()) { + x = rtl ? -translate : translate; + } else { + y = translate; + } + + if (params.roundLengths) { + x = Math.floor(x); + y = Math.floor(y); + } + + if (params.cssMode) { + wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y; + } else if (!params.virtualTranslate) { + $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`); + } + + swiper.previousTranslate = swiper.translate; + swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress + + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (translate - swiper.minTranslate()) / translatesDiff; + } + + if (newProgress !== progress) { + swiper.updateProgress(translate); + } + + swiper.emit('setTranslate', swiper.translate, byController); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/translate/translateTo.js b/src/main/resources/static/assets/js/swiper/core/translate/translateTo.js new file mode 100644 index 0000000..f7fae30 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/translate/translateTo.js @@ -0,0 +1,85 @@ +import { animateCSSModeScroll } from '../../shared/utils.js'; +export default function translateTo(translate = 0, speed = this.params.speed, runCallbacks = true, translateBounds = true, internal) { + const swiper = this; + const { + params, + wrapperEl + } = swiper; + + if (swiper.animating && params.preventInteractionOnTransition) { + return false; + } + + const minTranslate = swiper.minTranslate(); + const maxTranslate = swiper.maxTranslate(); + let newTranslate; + if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress + + swiper.updateProgress(newTranslate); + + if (params.cssMode) { + const isH = swiper.isHorizontal(); + + if (speed === 0) { + wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate; + } else { + if (!swiper.support.smoothScroll) { + animateCSSModeScroll({ + swiper, + targetPosition: -newTranslate, + side: isH ? 'left' : 'top' + }); + return true; + } + + wrapperEl.scrollTo({ + [isH ? 'left' : 'top']: -newTranslate, + behavior: 'smooth' + }); + } + + return true; + } + + if (speed === 0) { + swiper.setTransition(0); + swiper.setTranslate(newTranslate); + + if (runCallbacks) { + swiper.emit('beforeTransitionStart', speed, internal); + swiper.emit('transitionEnd'); + } + } else { + swiper.setTransition(speed); + swiper.setTranslate(newTranslate); + + if (runCallbacks) { + swiper.emit('beforeTransitionStart', speed, internal); + swiper.emit('transitionStart'); + } + + if (!swiper.animating) { + swiper.animating = true; + + if (!swiper.onTranslateToWrapperTransitionEnd) { + swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd); + swiper.onTranslateToWrapperTransitionEnd = null; + delete swiper.onTranslateToWrapperTransitionEnd; + + if (runCallbacks) { + swiper.emit('transitionEnd'); + } + }; + } + + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd); + } + } + + return true; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/index.js b/src/main/resources/static/assets/js/swiper/core/update/index.js new file mode 100644 index 0000000..3191727 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/index.js @@ -0,0 +1,20 @@ +import updateSize from './updateSize.js'; +import updateSlides from './updateSlides.js'; +import updateAutoHeight from './updateAutoHeight.js'; +import updateSlidesOffset from './updateSlidesOffset.js'; +import updateSlidesProgress from './updateSlidesProgress.js'; +import updateProgress from './updateProgress.js'; +import updateSlidesClasses from './updateSlidesClasses.js'; +import updateActiveIndex from './updateActiveIndex.js'; +import updateClickedSlide from './updateClickedSlide.js'; +export default { + updateSize, + updateSlides, + updateAutoHeight, + updateSlidesOffset, + updateSlidesProgress, + updateProgress, + updateSlidesClasses, + updateActiveIndex, + updateClickedSlide +}; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/updateActiveIndex.js b/src/main/resources/static/assets/js/swiper/core/update/updateActiveIndex.js new file mode 100644 index 0000000..3f5b7f5 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/updateActiveIndex.js @@ -0,0 +1,70 @@ +export default function updateActiveIndex(newActiveIndex) { + const swiper = this; + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + const { + slidesGrid, + snapGrid, + params, + activeIndex: previousIndex, + realIndex: previousRealIndex, + snapIndex: previousSnapIndex + } = swiper; + let activeIndex = newActiveIndex; + let snapIndex; + + if (typeof activeIndex === 'undefined') { + for (let i = 0; i < slidesGrid.length; i += 1) { + if (typeof slidesGrid[i + 1] !== 'undefined') { + if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) { + activeIndex = i; + } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) { + activeIndex = i + 1; + } + } else if (translate >= slidesGrid[i]) { + activeIndex = i; + } + } // Normalize slideIndex + + + if (params.normalizeSlideIndex) { + if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0; + } + } + + if (snapGrid.indexOf(translate) >= 0) { + snapIndex = snapGrid.indexOf(translate); + } else { + const skip = Math.min(params.slidesPerGroupSkip, activeIndex); + snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup); + } + + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if (activeIndex === previousIndex) { + if (snapIndex !== previousSnapIndex) { + swiper.snapIndex = snapIndex; + swiper.emit('snapIndexChange'); + } + + return; + } // Get real index + + + const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10); + Object.assign(swiper, { + snapIndex, + realIndex, + previousIndex, + activeIndex + }); + swiper.emit('activeIndexChange'); + swiper.emit('snapIndexChange'); + + if (previousRealIndex !== realIndex) { + swiper.emit('realIndexChange'); + } + + if (swiper.initialized || swiper.params.runCallbacksOnInit) { + swiper.emit('slideChange'); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/updateAutoHeight.js b/src/main/resources/static/assets/js/swiper/core/update/updateAutoHeight.js new file mode 100644 index 0000000..eaa53c9 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/updateAutoHeight.js @@ -0,0 +1,49 @@ +export default function updateAutoHeight(speed) { + const swiper = this; + const activeSlides = []; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let newHeight = 0; + let i; + + if (typeof speed === 'number') { + swiper.setTransition(speed); + } else if (speed === true) { + swiper.setTransition(swiper.params.speed); + } + + const getSlideByIndex = index => { + if (isVirtual) { + return swiper.slides.filter(el => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index)[0]; + } + + return swiper.slides.eq(index)[0]; + }; // Find slides currently in view + + + if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) { + if (swiper.params.centeredSlides) { + swiper.visibleSlides.each(slide => { + activeSlides.push(slide); + }); + } else { + for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { + const index = swiper.activeIndex + i; + if (index > swiper.slides.length && !isVirtual) break; + activeSlides.push(getSlideByIndex(index)); + } + } + } else { + activeSlides.push(getSlideByIndex(swiper.activeIndex)); + } // Find new height from highest slide in view + + + for (i = 0; i < activeSlides.length; i += 1) { + if (typeof activeSlides[i] !== 'undefined') { + const height = activeSlides[i].offsetHeight; + newHeight = height > newHeight ? height : newHeight; + } + } // Update Height + + + if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/updateClickedSlide.js b/src/main/resources/static/assets/js/swiper/core/update/updateClickedSlide.js new file mode 100644 index 0000000..6e910bd --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/updateClickedSlide.js @@ -0,0 +1,36 @@ +import $ from '../../shared/dom.js'; +export default function updateClickedSlide(e) { + const swiper = this; + const params = swiper.params; + const slide = $(e.target).closest(`.${params.slideClass}`)[0]; + let slideFound = false; + let slideIndex; + + if (slide) { + for (let i = 0; i < swiper.slides.length; i += 1) { + if (swiper.slides[i] === slide) { + slideFound = true; + slideIndex = i; + break; + } + } + } + + if (slide && slideFound) { + swiper.clickedSlide = slide; + + if (swiper.virtual && swiper.params.virtual.enabled) { + swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10); + } else { + swiper.clickedIndex = slideIndex; + } + } else { + swiper.clickedSlide = undefined; + swiper.clickedIndex = undefined; + return; + } + + if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) { + swiper.slideToClickedSlide(); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/updateProgress.js b/src/main/resources/static/assets/js/swiper/core/update/updateProgress.js new file mode 100644 index 0000000..4c06eac --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/updateProgress.js @@ -0,0 +1,50 @@ +export default function updateProgress(translate) { + const swiper = this; + + if (typeof translate === 'undefined') { + const multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line + + translate = swiper && swiper.translate && swiper.translate * multiplier || 0; + } + + const params = swiper.params; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + let { + progress, + isBeginning, + isEnd + } = swiper; + const wasBeginning = isBeginning; + const wasEnd = isEnd; + + if (translatesDiff === 0) { + progress = 0; + isBeginning = true; + isEnd = true; + } else { + progress = (translate - swiper.minTranslate()) / translatesDiff; + isBeginning = progress <= 0; + isEnd = progress >= 1; + } + + Object.assign(swiper, { + progress, + isBeginning, + isEnd + }); + if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate); + + if (isBeginning && !wasBeginning) { + swiper.emit('reachBeginning toEdge'); + } + + if (isEnd && !wasEnd) { + swiper.emit('reachEnd toEdge'); + } + + if (wasBeginning && !isBeginning || wasEnd && !isEnd) { + swiper.emit('fromEdge'); + } + + swiper.emit('progress', progress); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/updateSize.js b/src/main/resources/static/assets/js/swiper/core/update/updateSize.js new file mode 100644 index 0000000..2e24aa8 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/updateSize.js @@ -0,0 +1,33 @@ +export default function updateSize() { + const swiper = this; + let width; + let height; + const $el = swiper.$el; + + if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) { + width = swiper.params.width; + } else { + width = $el[0].clientWidth; + } + + if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) { + height = swiper.params.height; + } else { + height = $el[0].clientHeight; + } + + if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) { + return; + } // Subtract paddings + + + width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10); + height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10); + if (Number.isNaN(width)) width = 0; + if (Number.isNaN(height)) height = 0; + Object.assign(swiper, { + width, + height, + size: swiper.isHorizontal() ? width : height + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/updateSlides.js b/src/main/resources/static/assets/js/swiper/core/update/updateSlides.js new file mode 100644 index 0000000..1d9bb70 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/updateSlides.js @@ -0,0 +1,309 @@ +import { setCSSProperty } from '../../shared/utils.js'; +export default function updateSlides() { + const swiper = this; + + function getDirectionLabel(property) { + if (swiper.isHorizontal()) { + return property; + } // prettier-ignore + + + return { + 'width': 'height', + 'margin-top': 'margin-left', + 'margin-bottom ': 'margin-right', + 'margin-left': 'margin-top', + 'margin-right': 'margin-bottom', + 'padding-left': 'padding-top', + 'padding-right': 'padding-bottom', + 'marginRight': 'marginBottom' + }[property]; + } + + function getDirectionPropertyValue(node, label) { + return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0); + } + + const params = swiper.params; + const { + $wrapperEl, + size: swiperSize, + rtlTranslate: rtl, + wrongRTL + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; + const slides = $wrapperEl.children(`.${swiper.params.slideClass}`); + const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; + let snapGrid = []; + const slidesGrid = []; + const slidesSizesGrid = []; + let offsetBefore = params.slidesOffsetBefore; + + if (typeof offsetBefore === 'function') { + offsetBefore = params.slidesOffsetBefore.call(swiper); + } + + let offsetAfter = params.slidesOffsetAfter; + + if (typeof offsetAfter === 'function') { + offsetAfter = params.slidesOffsetAfter.call(swiper); + } + + const previousSnapGridLength = swiper.snapGrid.length; + const previousSlidesGridLength = swiper.slidesGrid.length; + let spaceBetween = params.spaceBetween; + let slidePosition = -offsetBefore; + let prevSlideSize = 0; + let index = 0; + + if (typeof swiperSize === 'undefined') { + return; + } + + if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { + spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize; + } + + swiper.virtualSize = -spaceBetween; // reset margins + + if (rtl) slides.css({ + marginLeft: '', + marginBottom: '', + marginTop: '' + });else slides.css({ + marginRight: '', + marginBottom: '', + marginTop: '' + }); // reset cssMode offsets + + if (params.centeredSlides && params.cssMode) { + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', ''); + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', ''); + } + + const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid; + + if (gridEnabled) { + swiper.grid.initSlides(slidesLength); + } // Calc slides + + + let slideSize; + const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => { + return typeof params.breakpoints[key].slidesPerView !== 'undefined'; + }).length > 0; + + for (let i = 0; i < slidesLength; i += 1) { + slideSize = 0; + const slide = slides.eq(i); + + if (gridEnabled) { + swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel); + } + + if (slide.css('display') === 'none') continue; // eslint-disable-line + + if (params.slidesPerView === 'auto') { + if (shouldResetSlideSize) { + slides[i].style[getDirectionLabel('width')] = ``; + } + + const slideStyles = getComputedStyle(slide[0]); + const currentTransform = slide[0].style.transform; + const currentWebKitTransform = slide[0].style.webkitTransform; + + if (currentTransform) { + slide[0].style.transform = 'none'; + } + + if (currentWebKitTransform) { + slide[0].style.webkitTransform = 'none'; + } + + if (params.roundLengths) { + slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true); + } else { + // eslint-disable-next-line + const width = getDirectionPropertyValue(slideStyles, 'width'); + const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left'); + const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right'); + const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left'); + const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right'); + const boxSizing = slideStyles.getPropertyValue('box-sizing'); + + if (boxSizing && boxSizing === 'border-box') { + slideSize = width + marginLeft + marginRight; + } else { + const { + clientWidth, + offsetWidth + } = slide[0]; + slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth); + } + } + + if (currentTransform) { + slide[0].style.transform = currentTransform; + } + + if (currentWebKitTransform) { + slide[0].style.webkitTransform = currentWebKitTransform; + } + + if (params.roundLengths) slideSize = Math.floor(slideSize); + } else { + slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView; + if (params.roundLengths) slideSize = Math.floor(slideSize); + + if (slides[i]) { + slides[i].style[getDirectionLabel('width')] = `${slideSize}px`; + } + } + + if (slides[i]) { + slides[i].swiperSlideSize = slideSize; + } + + slidesSizesGrid.push(slideSize); + + if (params.centeredSlides) { + slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; + if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; + if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; + if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + } else { + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + slidePosition = slidePosition + slideSize + spaceBetween; + } + + swiper.virtualSize += slideSize + spaceBetween; + prevSlideSize = slideSize; + index += 1; + } + + swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; + + if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) { + $wrapperEl.css({ + width: `${swiper.virtualSize + params.spaceBetween}px` + }); + } + + if (params.setWrapperSize) { + $wrapperEl.css({ + [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px` + }); + } + + if (gridEnabled) { + swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel); + } // Remove last grid elements depending on width + + + if (!params.centeredSlides) { + const newSlidesGrid = []; + + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); + + if (snapGrid[i] <= swiper.virtualSize - swiperSize) { + newSlidesGrid.push(slidesGridItem); + } + } + + snapGrid = newSlidesGrid; + + if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { + snapGrid.push(swiper.virtualSize - swiperSize); + } + } + + if (snapGrid.length === 0) snapGrid = [0]; + + if (params.spaceBetween !== 0) { + const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight'); + slides.filter((_, slideIndex) => { + if (!params.cssMode) return true; + + if (slideIndex === slides.length - 1) { + return false; + } + + return true; + }).css({ + [key]: `${spaceBetween}px` + }); + } + + if (params.centeredSlides && params.centeredSlidesBounds) { + let allSlidesSize = 0; + slidesSizesGrid.forEach(slideSizeValue => { + allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + const maxSnap = allSlidesSize - swiperSize; + snapGrid = snapGrid.map(snap => { + if (snap < 0) return -offsetBefore; + if (snap > maxSnap) return maxSnap + offsetAfter; + return snap; + }); + } + + if (params.centerInsufficientSlides) { + let allSlidesSize = 0; + slidesSizesGrid.forEach(slideSizeValue => { + allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + + if (allSlidesSize < swiperSize) { + const allSlidesOffset = (swiperSize - allSlidesSize) / 2; + snapGrid.forEach((snap, snapIndex) => { + snapGrid[snapIndex] = snap - allSlidesOffset; + }); + slidesGrid.forEach((snap, snapIndex) => { + slidesGrid[snapIndex] = snap + allSlidesOffset; + }); + } + } + + Object.assign(swiper, { + slides, + snapGrid, + slidesGrid, + slidesSizesGrid + }); + + if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) { + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`); + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`); + const addToSnapGrid = -swiper.snapGrid[0]; + const addToSlidesGrid = -swiper.slidesGrid[0]; + swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid); + swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid); + } + + if (slidesLength !== previousSlidesLength) { + swiper.emit('slidesLengthChange'); + } + + if (snapGrid.length !== previousSnapGridLength) { + if (swiper.params.watchOverflow) swiper.checkOverflow(); + swiper.emit('snapGridLengthChange'); + } + + if (slidesGrid.length !== previousSlidesGridLength) { + swiper.emit('slidesGridLengthChange'); + } + + if (params.watchSlidesProgress) { + swiper.updateSlidesOffset(); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/updateSlidesClasses.js b/src/main/resources/static/assets/js/swiper/core/update/updateSlidesClasses.js new file mode 100644 index 0000000..06166d3 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/updateSlidesClasses.js @@ -0,0 +1,64 @@ +export default function updateSlidesClasses() { + const swiper = this; + const { + slides, + params, + $wrapperEl, + activeIndex, + realIndex + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`); + let activeSlide; + + if (isVirtual) { + activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index="${activeIndex}"]`); + } else { + activeSlide = slides.eq(activeIndex); + } // Active classes + + + activeSlide.addClass(params.slideActiveClass); + + if (params.loop) { + // Duplicate to all looped slides + if (activeSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${realIndex}"]`).addClass(params.slideDuplicateActiveClass); + } else { + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${realIndex}"]`).addClass(params.slideDuplicateActiveClass); + } + } // Next Slide + + + let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass); + + if (params.loop && nextSlide.length === 0) { + nextSlide = slides.eq(0); + nextSlide.addClass(params.slideNextClass); + } // Prev Slide + + + let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass); + + if (params.loop && prevSlide.length === 0) { + prevSlide = slides.eq(-1); + prevSlide.addClass(params.slidePrevClass); + } + + if (params.loop) { + // Duplicate to all looped slides + if (nextSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicateNextClass); + } else { + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicateNextClass); + } + + if (prevSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicatePrevClass); + } else { + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicatePrevClass); + } + } + + swiper.emitSlidesClasses(); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/updateSlidesOffset.js b/src/main/resources/static/assets/js/swiper/core/update/updateSlidesOffset.js new file mode 100644 index 0000000..8856e95 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/updateSlidesOffset.js @@ -0,0 +1,8 @@ +export default function updateSlidesOffset() { + const swiper = this; + const slides = swiper.slides; + + for (let i = 0; i < slides.length; i += 1) { + slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop; + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/core/update/updateSlidesProgress.js b/src/main/resources/static/assets/js/swiper/core/update/updateSlidesProgress.js new file mode 100644 index 0000000..f8bc772 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/core/update/updateSlidesProgress.js @@ -0,0 +1,44 @@ +import $ from '../../shared/dom.js'; +export default function updateSlidesProgress(translate = this && this.translate || 0) { + const swiper = this; + const params = swiper.params; + const { + slides, + rtlTranslate: rtl, + snapGrid + } = swiper; + if (slides.length === 0) return; + if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset(); + let offsetCenter = -translate; + if (rtl) offsetCenter = translate; // Visible Slides + + slides.removeClass(params.slideVisibleClass); + swiper.visibleSlidesIndexes = []; + swiper.visibleSlides = []; + + for (let i = 0; i < slides.length; i += 1) { + const slide = slides[i]; + let slideOffset = slide.swiperSlideOffset; + + if (params.cssMode && params.centeredSlides) { + slideOffset -= slides[0].swiperSlideOffset; + } + + const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween); + const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween); + const slideBefore = -(offsetCenter - slideOffset); + const slideAfter = slideBefore + swiper.slidesSizesGrid[i]; + const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size; + + if (isVisible) { + swiper.visibleSlides.push(slide); + swiper.visibleSlidesIndexes.push(i); + slides.eq(i).addClass(params.slideVisibleClass); + } + + slide.progress = rtl ? -slideProgress : slideProgress; + slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress; + } + + swiper.visibleSlides = $(swiper.visibleSlides); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.js b/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.js new file mode 100644 index 0000000..b8d6402 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.js @@ -0,0 +1,283 @@ +import classesToSelector from '../../shared/classes-to-selector.js'; +import $ from '../../shared/dom.js'; +export default function A11y({ + swiper, + extendParams, + on +}) { + extendParams({ + a11y: { + enabled: true, + notificationClass: 'swiper-notification', + prevSlideMessage: 'Previous slide', + nextSlideMessage: 'Next slide', + firstSlideMessage: 'This is the first slide', + lastSlideMessage: 'This is the last slide', + paginationBulletMessage: 'Go to slide {{index}}', + slideLabelMessage: '{{index}} / {{slidesLength}}', + containerMessage: null, + containerRoleDescriptionMessage: null, + itemRoleDescriptionMessage: null, + slideRole: 'group' + } + }); + let liveRegion = null; + + function notify(message) { + const notification = liveRegion; + if (notification.length === 0) return; + notification.html(''); + notification.html(message); + } + + function getRandomNumber(size = 16) { + const randomChar = () => Math.round(16 * Math.random()).toString(16); + + return 'x'.repeat(size).replace(/x/g, randomChar); + } + + function makeElFocusable($el) { + $el.attr('tabIndex', '0'); + } + + function makeElNotFocusable($el) { + $el.attr('tabIndex', '-1'); + } + + function addElRole($el, role) { + $el.attr('role', role); + } + + function addElRoleDescription($el, description) { + $el.attr('aria-roledescription', description); + } + + function addElControls($el, controls) { + $el.attr('aria-controls', controls); + } + + function addElLabel($el, label) { + $el.attr('aria-label', label); + } + + function addElId($el, id) { + $el.attr('id', id); + } + + function addElLive($el, live) { + $el.attr('aria-live', live); + } + + function disableEl($el) { + $el.attr('aria-disabled', true); + } + + function enableEl($el) { + $el.attr('aria-disabled', false); + } + + function onEnterOrSpaceKey(e) { + if (e.keyCode !== 13 && e.keyCode !== 32) return; + const params = swiper.params.a11y; + const $targetEl = $(e.target); + + if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) { + if (!(swiper.isEnd && !swiper.params.loop)) { + swiper.slideNext(); + } + + if (swiper.isEnd) { + notify(params.lastSlideMessage); + } else { + notify(params.nextSlideMessage); + } + } + + if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) { + if (!(swiper.isBeginning && !swiper.params.loop)) { + swiper.slidePrev(); + } + + if (swiper.isBeginning) { + notify(params.firstSlideMessage); + } else { + notify(params.prevSlideMessage); + } + } + + if (swiper.pagination && $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))) { + $targetEl[0].click(); + } + } + + function updateNavigation() { + if (swiper.params.loop || !swiper.navigation) return; + const { + $nextEl, + $prevEl + } = swiper.navigation; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + disableEl($prevEl); + makeElNotFocusable($prevEl); + } else { + enableEl($prevEl); + makeElFocusable($prevEl); + } + } + + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + disableEl($nextEl); + makeElNotFocusable($nextEl); + } else { + enableEl($nextEl); + makeElFocusable($nextEl); + } + } + } + + function hasPagination() { + return swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length; + } + + function updatePagination() { + const params = swiper.params.a11y; + + if (hasPagination()) { + swiper.pagination.bullets.each(bulletEl => { + const $bulletEl = $(bulletEl); + makeElFocusable($bulletEl); + + if (!swiper.params.pagination.renderBullet) { + addElRole($bulletEl, 'button'); + addElLabel($bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, $bulletEl.index() + 1)); + } + }); + } + } + + const initNavEl = ($el, wrapperId, message) => { + makeElFocusable($el); + + if ($el[0].tagName !== 'BUTTON') { + addElRole($el, 'button'); + $el.on('keydown', onEnterOrSpaceKey); + } + + addElLabel($el, message); + addElControls($el, wrapperId); + }; + + function init() { + const params = swiper.params.a11y; + swiper.$el.append(liveRegion); // Container + + const $containerEl = swiper.$el; + + if (params.containerRoleDescriptionMessage) { + addElRoleDescription($containerEl, params.containerRoleDescriptionMessage); + } + + if (params.containerMessage) { + addElLabel($containerEl, params.containerMessage); + } // Wrapper + + + const $wrapperEl = swiper.$wrapperEl; + const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`; + const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite'; + addElId($wrapperEl, wrapperId); + addElLive($wrapperEl, live); // Slide + + if (params.itemRoleDescriptionMessage) { + addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage); + } + + addElRole($(swiper.slides), params.slideRole); + const slidesLength = swiper.params.loop ? swiper.slides.filter(el => !el.classList.contains(swiper.params.slideDuplicateClass)).length : swiper.slides.length; + swiper.slides.each((slideEl, index) => { + const $slideEl = $(slideEl); + const slideIndex = swiper.params.loop ? parseInt($slideEl.attr('data-swiper-slide-index'), 10) : index; + const ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength); + addElLabel($slideEl, ariaLabelMessage); + }); // Navigation + + let $nextEl; + let $prevEl; + + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + + if ($nextEl && $nextEl.length) { + initNavEl($nextEl, wrapperId, params.nextSlideMessage); + } + + if ($prevEl && $prevEl.length) { + initNavEl($prevEl, wrapperId, params.prevSlideMessage); + } // Pagination + + + if (hasPagination()) { + swiper.pagination.$el.on('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey); + } + } + + function destroy() { + if (liveRegion && liveRegion.length > 0) liveRegion.remove(); + let $nextEl; + let $prevEl; + + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + + if ($nextEl) { + $nextEl.off('keydown', onEnterOrSpaceKey); + } + + if ($prevEl) { + $prevEl.off('keydown', onEnterOrSpaceKey); + } // Pagination + + + if (hasPagination()) { + swiper.pagination.$el.off('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey); + } + } + + on('beforeInit', () => { + liveRegion = $(``); + }); + on('afterInit', () => { + if (!swiper.params.a11y.enabled) return; + init(); + updateNavigation(); + }); + on('toEdge', () => { + if (!swiper.params.a11y.enabled) return; + updateNavigation(); + }); + on('fromEdge', () => { + if (!swiper.params.a11y.enabled) return; + updateNavigation(); + }); + on('paginationUpdate', () => { + if (!swiper.params.a11y.enabled) return; + updatePagination(); + }); + on('destroy', () => { + if (!swiper.params.a11y.enabled) return; + destroy(); + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.less b/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.less new file mode 100644 index 0000000..c5f9eec --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.less @@ -0,0 +1,9 @@ +/* a11y */ +.swiper .swiper-notification { + position: absolute; + left: 0; + top: 0; + pointer-events: none; + opacity: 0; + z-index: -1000; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.min.css b/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.min.css new file mode 100644 index 0000000..78c39d5 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.min.css @@ -0,0 +1 @@ +.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.scss b/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.scss new file mode 100644 index 0000000..c5f9eec --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/a11y/a11y.scss @@ -0,0 +1,9 @@ +/* a11y */ +.swiper .swiper-notification { + position: absolute; + left: 0; + top: 0; + pointer-events: none; + opacity: 0; + z-index: -1000; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/autoplay/autoplay.js b/src/main/resources/static/assets/js/swiper/modules/autoplay/autoplay.js new file mode 100644 index 0000000..0d7cd34 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/autoplay/autoplay.js @@ -0,0 +1,222 @@ +/* eslint no-underscore-dangle: "off" */ + +/* eslint no-use-before-define: "off" */ +import { getDocument } from 'ssr-window'; +import { nextTick } from '../../shared/utils.js'; +export default function Autoplay({ + swiper, + extendParams, + on, + emit +}) { + let timeout; + swiper.autoplay = { + running: false, + paused: false + }; + extendParams({ + autoplay: { + enabled: false, + delay: 3000, + waitForTransition: true, + disableOnInteraction: true, + stopOnLastSlide: false, + reverseDirection: false, + pauseOnMouseEnter: false + } + }); + + function run() { + const $activeSlideEl = swiper.slides.eq(swiper.activeIndex); + let delay = swiper.params.autoplay.delay; + + if ($activeSlideEl.attr('data-swiper-autoplay')) { + delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay; + } + + clearTimeout(timeout); + timeout = nextTick(() => { + let autoplayResult; + + if (swiper.params.autoplay.reverseDirection) { + if (swiper.params.loop) { + swiper.loopFix(); + autoplayResult = swiper.slidePrev(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.isBeginning) { + autoplayResult = swiper.slidePrev(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true); + emit('autoplay'); + } else { + stop(); + } + } else if (swiper.params.loop) { + swiper.loopFix(); + autoplayResult = swiper.slideNext(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.isEnd) { + autoplayResult = swiper.slideNext(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true); + emit('autoplay'); + } else { + stop(); + } + + if (swiper.params.cssMode && swiper.autoplay.running) run();else if (autoplayResult === false) { + run(); + } + }, delay); + } + + function start() { + if (typeof timeout !== 'undefined') return false; + if (swiper.autoplay.running) return false; + swiper.autoplay.running = true; + emit('autoplayStart'); + run(); + return true; + } + + function stop() { + if (!swiper.autoplay.running) return false; + if (typeof timeout === 'undefined') return false; + + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + + swiper.autoplay.running = false; + emit('autoplayStop'); + return true; + } + + function pause(speed) { + if (!swiper.autoplay.running) return; + if (swiper.autoplay.paused) return; + if (timeout) clearTimeout(timeout); + swiper.autoplay.paused = true; + + if (speed === 0 || !swiper.params.autoplay.waitForTransition) { + swiper.autoplay.paused = false; + run(); + } else { + ['transitionend', 'webkitTransitionEnd'].forEach(event => { + swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd); + }); + } + } + + function onVisibilityChange() { + const document = getDocument(); + + if (document.visibilityState === 'hidden' && swiper.autoplay.running) { + pause(); + } + + if (document.visibilityState === 'visible' && swiper.autoplay.paused) { + run(); + swiper.autoplay.paused = false; + } + } + + function onTransitionEnd(e) { + if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return; + if (e.target !== swiper.$wrapperEl[0]) return; + ['transitionend', 'webkitTransitionEnd'].forEach(event => { + swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd); + }); + swiper.autoplay.paused = false; + + if (!swiper.autoplay.running) { + stop(); + } else { + run(); + } + } + + function onMouseEnter() { + if (swiper.params.autoplay.disableOnInteraction) { + stop(); + } else { + pause(); + } + + ['transitionend', 'webkitTransitionEnd'].forEach(event => { + swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd); + }); + } + + function onMouseLeave() { + if (swiper.params.autoplay.disableOnInteraction) { + return; + } + + swiper.autoplay.paused = false; + run(); + } + + function attachMouseEvents() { + if (swiper.params.autoplay.pauseOnMouseEnter) { + swiper.$el.on('mouseenter', onMouseEnter); + swiper.$el.on('mouseleave', onMouseLeave); + } + } + + function detachMouseEvents() { + swiper.$el.off('mouseenter', onMouseEnter); + swiper.$el.off('mouseleave', onMouseLeave); + } + + on('init', () => { + if (swiper.params.autoplay.enabled) { + start(); + const document = getDocument(); + document.addEventListener('visibilitychange', onVisibilityChange); + attachMouseEvents(); + } + }); + on('beforeTransitionStart', (_s, speed, internal) => { + if (swiper.autoplay.running) { + if (internal || !swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.pause(speed); + } else { + stop(); + } + } + }); + on('sliderFirstMove', () => { + if (swiper.autoplay.running) { + if (swiper.params.autoplay.disableOnInteraction) { + stop(); + } else { + pause(); + } + } + }); + on('touchEnd', () => { + if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) { + run(); + } + }); + on('destroy', () => { + detachMouseEvents(); + + if (swiper.autoplay.running) { + stop(); + } + + const document = getDocument(); + document.removeEventListener('visibilitychange', onVisibilityChange); + }); + Object.assign(swiper.autoplay, { + pause, + run, + start, + stop + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/autoplay/autoplay.less b/src/main/resources/static/assets/js/swiper/modules/autoplay/autoplay.less new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/autoplay/autoplay.min.css b/src/main/resources/static/assets/js/swiper/modules/autoplay/autoplay.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/autoplay/autoplay.scss b/src/main/resources/static/assets/js/swiper/modules/autoplay/autoplay.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/controller/controller.js b/src/main/resources/static/assets/js/swiper/modules/controller/controller.js new file mode 100644 index 0000000..55b32f2 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/controller/controller.js @@ -0,0 +1,191 @@ +/* eslint no-bitwise: ["error", { "allow": [">>"] }] */ +import { nextTick } from '../../shared/utils.js'; +export default function Controller({ + swiper, + extendParams, + on +}) { + extendParams({ + controller: { + control: undefined, + inverse: false, + by: 'slide' // or 'container' + + } + }); + swiper.controller = { + control: undefined + }; + + function LinearSpline(x, y) { + const binarySearch = function search() { + let maxIndex; + let minIndex; + let guess; + return (array, val) => { + minIndex = -1; + maxIndex = array.length; + + while (maxIndex - minIndex > 1) { + guess = maxIndex + minIndex >> 1; + + if (array[guess] <= val) { + minIndex = guess; + } else { + maxIndex = guess; + } + } + + return maxIndex; + }; + }(); + + this.x = x; + this.y = y; + this.lastIndex = x.length - 1; // Given an x value (x2), return the expected y2 value: + // (x1,y1) is the known point before given value, + // (x3,y3) is the known point after given value. + + let i1; + let i3; + + this.interpolate = function interpolate(x2) { + if (!x2) return 0; // Get the indexes of x1 and x3 (the array indexes before and after given x2): + + i3 = binarySearch(this.x, x2); + i1 = i3 - 1; // We have our indexes i1 & i3, so we can calculate already: + // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1 + + return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1]; + }; + + return this; + } // xxx: for now i will just save one spline function to to + + + function getInterpolateFunction(c) { + if (!swiper.controller.spline) { + swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid); + } + } + + function setTranslate(_t, byController) { + const controlled = swiper.controller.control; + let multiplier; + let controlledTranslate; + const Swiper = swiper.constructor; + + function setControlledTranslate(c) { + // this will create an Interpolate function based on the snapGrids + // x is the Grid of the scrolled scroller and y will be the controlled scroller + // it makes sense to create this only once and recall it for the interpolation + // the function does a lot of value caching for performance + const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate; + + if (swiper.params.controller.by === 'slide') { + getInterpolateFunction(c); // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid + // but it did not work out + + controlledTranslate = -swiper.controller.spline.interpolate(-translate); + } + + if (!controlledTranslate || swiper.params.controller.by === 'container') { + multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate()); + controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate(); + } + + if (swiper.params.controller.inverse) { + controlledTranslate = c.maxTranslate() - controlledTranslate; + } + + c.updateProgress(controlledTranslate); + c.setTranslate(controlledTranslate, swiper); + c.updateActiveIndex(); + c.updateSlidesClasses(); + } + + if (Array.isArray(controlled)) { + for (let i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTranslate(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTranslate(controlled); + } + } + + function setTransition(duration, byController) { + const Swiper = swiper.constructor; + const controlled = swiper.controller.control; + let i; + + function setControlledTransition(c) { + c.setTransition(duration, swiper); + + if (duration !== 0) { + c.transitionStart(); + + if (c.params.autoHeight) { + nextTick(() => { + c.updateAutoHeight(); + }); + } + + c.$wrapperEl.transitionEnd(() => { + if (!controlled) return; + + if (c.params.loop && swiper.params.controller.by === 'slide') { + c.loopFix(); + } + + c.transitionEnd(); + }); + } + } + + if (Array.isArray(controlled)) { + for (i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTransition(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTransition(controlled); + } + } + + function removeSpline() { + if (!swiper.controller.control) return; + + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + } + + on('beforeInit', () => { + swiper.controller.control = swiper.params.controller.control; + }); + on('update', () => { + removeSpline(); + }); + on('resize', () => { + removeSpline(); + }); + on('observerUpdate', () => { + removeSpline(); + }); + on('setTranslate', (_s, translate, byController) => { + if (!swiper.controller.control) return; + swiper.controller.setTranslate(translate, byController); + }); + on('setTransition', (_s, duration, byController) => { + if (!swiper.controller.control) return; + swiper.controller.setTransition(duration, byController); + }); + Object.assign(swiper.controller, { + setTranslate, + setTransition + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/controller/controller.less b/src/main/resources/static/assets/js/swiper/modules/controller/controller.less new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/controller/controller.min.css b/src/main/resources/static/assets/js/swiper/modules/controller/controller.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/controller/controller.scss b/src/main/resources/static/assets/js/swiper/modules/controller/controller.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.js b/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.js new file mode 100644 index 0000000..7709bed --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.js @@ -0,0 +1,125 @@ +import createShadow from '../../shared/create-shadow.js'; +import effectInit from '../../shared/effect-init.js'; +import effectTarget from '../../shared/effect-target.js'; +import effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js'; +export default function EffectCards({ + swiper, + extendParams, + on +}) { + extendParams({ + cardsEffect: { + slideShadows: true, + transformEl: null + } + }); + + const setTranslate = () => { + const { + slides, + activeIndex + } = swiper; + const params = swiper.params.cardsEffect; + const { + startTranslate, + isTouched + } = swiper.touchEventsData; + const currentTranslate = swiper.translate; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + const slideProgress = $slideEl[0].progress; + const progress = Math.min(Math.max(slideProgress, -4), 4); + let offset = $slideEl[0].swiperSlideOffset; + + if (swiper.params.centeredSlides && !swiper.params.cssMode) { + swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`); + } + + if (swiper.params.centeredSlides && swiper.params.cssMode) { + offset -= slides[0].swiperSlideOffset; + } + + let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset; + let tY = 0; + const tZ = -100 * Math.abs(progress); + let scale = 1; + let rotate = -2 * progress; + let tXAdd = 8 - Math.abs(progress) * 0.75; + const isSwipeToNext = (i === activeIndex || i === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate; + const isSwipeToPrev = (i === activeIndex || i === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate; + + if (isSwipeToNext || isSwipeToPrev) { + const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5; + rotate += -28 * progress * subProgress; + scale += -0.5 * subProgress; + tXAdd += 96 * subProgress; + tY = `${-25 * subProgress * Math.abs(progress)}%`; + } + + if (progress < 0) { + // next + tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`; + } else if (progress > 0) { + // prev + tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`; + } else { + tX = `${tX}px`; + } + + if (!swiper.isHorizontal()) { + const prevY = tY; + tY = tX; + tX = prevY; + } + + const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`; + const transform = ` + translate3d(${tX}, ${tY}, ${tZ}px) + rotateZ(${rotate}deg) + scale(${scaleString}) + `; + + if (params.slideShadows) { + // Set shadows + let $shadowEl = $slideEl.find('.swiper-slide-shadow'); + + if ($shadowEl.length === 0) { + $shadowEl = createShadow(params, $slideEl); + } + + if ($shadowEl.length) $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1); + } + + $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform); + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.cardsEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl + }); + }; + + effectInit({ + effect: 'cards', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + watchSlidesProgress: true, + virtualTranslate: !swiper.params.cssMode + }) + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.less b/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.less new file mode 100644 index 0000000..ab90342 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.less @@ -0,0 +1,8 @@ +.swiper-cards { + overflow: visible; + .swiper-slide { + transform-origin: center bottom; + backface-visibility: hidden; + overflow: hidden; + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.min.css b/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.min.css new file mode 100644 index 0000000..1769ef2 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.min.css @@ -0,0 +1 @@ +.swiper-cards{overflow:visible}.swiper-cards .swiper-slide{transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.scss b/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.scss new file mode 100644 index 0000000..32c4489 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-cards/effect-cards.scss @@ -0,0 +1,7 @@ +.swiper-cards { + overflow: visible; + .swiper-slide { + transform-origin: center bottom; + backface-visibility: hidden; + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.js b/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.js new file mode 100644 index 0000000..7f182bb --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.js @@ -0,0 +1,103 @@ +import createShadow from '../../shared/create-shadow.js'; +import effectInit from '../../shared/effect-init.js'; +import effectTarget from '../../shared/effect-target.js'; +export default function EffectCoverflow({ + swiper, + extendParams, + on +}) { + extendParams({ + coverflowEffect: { + rotate: 50, + stretch: 0, + depth: 100, + scale: 1, + modifier: 1, + slideShadows: true, + transformEl: null + } + }); + + const setTranslate = () => { + const { + width: swiperWidth, + height: swiperHeight, + slides, + slidesSizesGrid + } = swiper; + const params = swiper.params.coverflowEffect; + const isHorizontal = swiper.isHorizontal(); + const transform = swiper.translate; + const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2; + const rotate = isHorizontal ? params.rotate : -params.rotate; + const translate = params.depth; // Each slide offset from center + + for (let i = 0, length = slides.length; i < length; i += 1) { + const $slideEl = slides.eq(i); + const slideSize = slidesSizesGrid[i]; + const slideOffset = $slideEl[0].swiperSlideOffset; + const offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * params.modifier; + let rotateY = isHorizontal ? rotate * offsetMultiplier : 0; + let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; // var rotateZ = 0 + + let translateZ = -translate * Math.abs(offsetMultiplier); + let stretch = params.stretch; // Allow percentage to make a relative stretch for responsive sliders + + if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) { + stretch = parseFloat(params.stretch) / 100 * slideSize; + } + + let translateY = isHorizontal ? 0 : stretch * offsetMultiplier; + let translateX = isHorizontal ? stretch * offsetMultiplier : 0; + let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier); // Fix for ultra small values + + if (Math.abs(translateX) < 0.001) translateX = 0; + if (Math.abs(translateY) < 0.001) translateY = 0; + if (Math.abs(translateZ) < 0.001) translateZ = 0; + if (Math.abs(rotateY) < 0.001) rotateY = 0; + if (Math.abs(rotateX) < 0.001) rotateX = 0; + if (Math.abs(scale) < 0.001) scale = 0; + const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(slideTransform); + $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; + + if (params.slideShadows) { + // Set shadows + let $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + + if ($shadowBeforeEl.length === 0) { + $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top'); + } + + if ($shadowAfterEl.length === 0) { + $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom'); + } + + if ($shadowBeforeEl.length) $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; + if ($shadowAfterEl.length) $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0; + } + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.coverflowEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + }; + + effectInit({ + effect: 'coverflow', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + watchSlidesProgress: true + }) + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.less b/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.less new file mode 100644 index 0000000..ac504bf --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.less @@ -0,0 +1,2 @@ +.swiper-coverflow { +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.min.css b/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.scss b/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.scss new file mode 100644 index 0000000..ac504bf --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-coverflow/effect-coverflow.scss @@ -0,0 +1,2 @@ +.swiper-coverflow { +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.js b/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.js new file mode 100644 index 0000000..cc0542b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.js @@ -0,0 +1,154 @@ +import createShadow from '../../shared/create-shadow.js'; +import effectInit from '../../shared/effect-init.js'; +import effectTarget from '../../shared/effect-target.js'; +import effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js'; +export default function EffectCreative({ + swiper, + extendParams, + on +}) { + extendParams({ + creativeEffect: { + transformEl: null, + limitProgress: 1, + shadowPerProgress: false, + progressMultiplier: 1, + perspective: true, + prev: { + translate: [0, 0, 0], + rotate: [0, 0, 0], + opacity: 1, + scale: 1 + }, + next: { + translate: [0, 0, 0], + rotate: [0, 0, 0], + opacity: 1, + scale: 1 + } + } + }); + + const getTranslateValue = value => { + if (typeof value === 'string') return value; + return `${value}px`; + }; + + const setTranslate = () => { + const { + slides, + $wrapperEl, + slidesSizesGrid + } = swiper; + const params = swiper.params.creativeEffect; + const { + progressMultiplier: multiplier + } = params; + const isCenteredSlides = swiper.params.centeredSlides; + + if (isCenteredSlides) { + const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0; + $wrapperEl.transform(`translateX(calc(50% - ${margin}px))`); + } + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + const slideProgress = $slideEl[0].progress; + const progress = Math.min(Math.max($slideEl[0].progress, -params.limitProgress), params.limitProgress); + let originalProgress = progress; + + if (!isCenteredSlides) { + originalProgress = Math.min(Math.max($slideEl[0].originalProgress, -params.limitProgress), params.limitProgress); + } + + const offset = $slideEl[0].swiperSlideOffset; + const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0]; + const r = [0, 0, 0]; + let custom = false; + + if (!swiper.isHorizontal()) { + t[1] = t[0]; + t[0] = 0; + } + + let data = { + translate: [0, 0, 0], + rotate: [0, 0, 0], + scale: 1, + opacity: 1 + }; + + if (progress < 0) { + data = params.next; + custom = true; + } else if (progress > 0) { + data = params.prev; + custom = true; + } // set translate + + + t.forEach((value, index) => { + t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`; + }); // set rotates + + r.forEach((value, index) => { + r[index] = data.rotate[index] * Math.abs(progress * multiplier); + }); + $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length; + const translateString = t.join(', '); + const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`; + const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`; + const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier; + const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`; // Set shadows + + if (custom && data.shadow || !custom) { + let $shadowEl = $slideEl.children('.swiper-slide-shadow'); + + if ($shadowEl.length === 0 && data.shadow) { + $shadowEl = createShadow(params, $slideEl); + } + + if ($shadowEl.length) { + const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress; + $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1); + } + } + + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform).css({ + opacity: opacityString + }); + + if (data.origin) { + $targetEl.css('transform-origin', data.origin); + } + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.creativeEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides: true + }); + }; + + effectInit({ + effect: 'creative', + swiper, + on, + setTranslate, + setTransition, + perspective: () => swiper.params.creativeEffect.perspective, + overwriteParams: () => ({ + watchSlidesProgress: true, + virtualTranslate: !swiper.params.cssMode + }) + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.less b/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.less new file mode 100644 index 0000000..b893cad --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.less @@ -0,0 +1,7 @@ +.swiper-creative { + .swiper-slide { + backface-visibility: hidden; + overflow: hidden; + transition-property: transform, opacity, height; + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.min.css b/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.min.css new file mode 100644 index 0000000..404da2c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.min.css @@ -0,0 +1 @@ +.swiper-creative .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.scss b/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.scss new file mode 100644 index 0000000..b893cad --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-creative/effect-creative.scss @@ -0,0 +1,7 @@ +.swiper-creative { + .swiper-slide { + backface-visibility: hidden; + overflow: hidden; + transition-property: transform, opacity, height; + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.js b/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.js new file mode 100644 index 0000000..f153893 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.js @@ -0,0 +1,180 @@ +import $ from '../../shared/dom.js'; +import effectInit from '../../shared/effect-init.js'; +export default function EffectCube({ + swiper, + extendParams, + on +}) { + extendParams({ + cubeEffect: { + slideShadows: true, + shadow: true, + shadowOffset: 20, + shadowScale: 0.94 + } + }); + + const setTranslate = () => { + const { + $el, + $wrapperEl, + slides, + width: swiperWidth, + height: swiperHeight, + rtlTranslate: rtl, + size: swiperSize, + browser + } = swiper; + const params = swiper.params.cubeEffect; + const isHorizontal = swiper.isHorizontal(); + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let wrapperRotate = 0; + let $cubeShadowEl; + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow'); + + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
'); + $wrapperEl.append($cubeShadowEl); + } + + $cubeShadowEl.css({ + height: `${swiperWidth}px` + }); + } else { + $cubeShadowEl = $el.find('.swiper-cube-shadow'); + + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
'); + $el.append($cubeShadowEl); + } + } + } + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let slideIndex = i; + + if (isVirtual) { + slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10); + } + + let slideAngle = slideIndex * 90; + let round = Math.floor(slideAngle / 360); + + if (rtl) { + slideAngle = -slideAngle; + round = Math.floor(-slideAngle / 360); + } + + const progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + let tx = 0; + let ty = 0; + let tz = 0; + + if (slideIndex % 4 === 0) { + tx = -round * 4 * swiperSize; + tz = 0; + } else if ((slideIndex - 1) % 4 === 0) { + tx = 0; + tz = -round * 4 * swiperSize; + } else if ((slideIndex - 2) % 4 === 0) { + tx = swiperSize + round * 4 * swiperSize; + tz = swiperSize; + } else if ((slideIndex - 3) % 4 === 0) { + tx = -swiperSize; + tz = 3 * swiperSize + swiperSize * 4 * round; + } + + if (rtl) { + tx = -tx; + } + + if (!isHorizontal) { + ty = tx; + tx = 0; + } + + const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${isHorizontal ? slideAngle : 0}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`; + + if (progress <= 1 && progress > -1) { + wrapperRotate = slideIndex * 90 + progress * 90; + if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90; + } + + $slideEl.transform(transform); + + if (params.slideShadows) { + // Set shadows + let shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + + if (shadowBefore.length === 0) { + shadowBefore = $(`
`); + $slideEl.append(shadowBefore); + } + + if (shadowAfter.length === 0) { + shadowAfter = $(`
`); + $slideEl.append(shadowAfter); + } + + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + } + + $wrapperEl.css({ + '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`, + 'transform-origin': `50% 50% -${swiperSize / 2}px` + }); + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl.transform(`translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`); + } else { + const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90; + const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2); + const scale1 = params.shadowScale; + const scale2 = params.shadowScale / multiplier; + const offset = params.shadowOffset; + $cubeShadowEl.transform(`scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-90deg)`); + } + } + + const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0; + $wrapperEl.transform(`translate3d(0px,0,${zFactor}px) rotateX(${swiper.isHorizontal() ? 0 : wrapperRotate}deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`); + }; + + const setTransition = duration => { + const { + $el, + slides + } = swiper; + slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + + if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) { + $el.find('.swiper-cube-shadow').transition(duration); + } + }; + + effectInit({ + effect: 'cube', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + resistanceRatio: 0, + spaceBetween: 0, + centeredSlides: false, + virtualTranslate: true + }) + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.less b/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.less new file mode 100644 index 0000000..ae4c92c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.less @@ -0,0 +1,59 @@ +.swiper-cube { + overflow: visible; + .swiper-slide { + pointer-events: none; + backface-visibility: hidden; + z-index: 1; + visibility: hidden; + transform-origin: 0 0; + width: 100%; + height: 100%; + .swiper-slide { + pointer-events: none; + } + } + &.swiper-rtl .swiper-slide { + transform-origin: 100% 0; + } + .swiper-slide-active { + &, + & .swiper-slide-active { + pointer-events: auto; + } + } + .swiper-slide-active, + .swiper-slide-next, + .swiper-slide-prev, + .swiper-slide-next + .swiper-slide { + pointer-events: auto; + visibility: visible; + } + .swiper-slide-shadow-top, + .swiper-slide-shadow-bottom, + .swiper-slide-shadow-left, + .swiper-slide-shadow-right { + z-index: 0; + backface-visibility: hidden; + } + .swiper-cube-shadow { + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 100%; + opacity: 0.6; + z-index: 0; + + &:before { + content: ''; + background: #000; + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + -webkit-filter: blur(50px); + filter: blur(50px); + } + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.min.css b/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.min.css new file mode 100644 index 0000000..103dcee --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.min.css @@ -0,0 +1 @@ +.swiper-cube{overflow:visible}.swiper-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-cube.swiper-rtl .swiper-slide{transform-origin:100% 0}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-next,.swiper-cube .swiper-slide-next+.swiper-slide,.swiper-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-cube .swiper-slide-shadow-bottom,.swiper-cube .swiper-slide-shadow-left,.swiper-cube .swiper-slide-shadow-right,.swiper-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.scss b/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.scss new file mode 100644 index 0000000..ae4c92c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-cube/effect-cube.scss @@ -0,0 +1,59 @@ +.swiper-cube { + overflow: visible; + .swiper-slide { + pointer-events: none; + backface-visibility: hidden; + z-index: 1; + visibility: hidden; + transform-origin: 0 0; + width: 100%; + height: 100%; + .swiper-slide { + pointer-events: none; + } + } + &.swiper-rtl .swiper-slide { + transform-origin: 100% 0; + } + .swiper-slide-active { + &, + & .swiper-slide-active { + pointer-events: auto; + } + } + .swiper-slide-active, + .swiper-slide-next, + .swiper-slide-prev, + .swiper-slide-next + .swiper-slide { + pointer-events: auto; + visibility: visible; + } + .swiper-slide-shadow-top, + .swiper-slide-shadow-bottom, + .swiper-slide-shadow-left, + .swiper-slide-shadow-right { + z-index: 0; + backface-visibility: hidden; + } + .swiper-cube-shadow { + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 100%; + opacity: 0.6; + z-index: 0; + + &:before { + content: ''; + background: #000; + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + -webkit-filter: blur(50px); + filter: blur(50px); + } + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.js b/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.js new file mode 100644 index 0000000..5ac9bcb --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.js @@ -0,0 +1,70 @@ +import effectInit from '../../shared/effect-init.js'; +import effectTarget from '../../shared/effect-target.js'; +import effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js'; +export default function EffectFade({ + swiper, + extendParams, + on +}) { + extendParams({ + fadeEffect: { + crossFade: false, + transformEl: null + } + }); + + const setTranslate = () => { + const { + slides + } = swiper; + const params = swiper.params.fadeEffect; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = swiper.slides.eq(i); + const offset = $slideEl[0].swiperSlideOffset; + let tx = -offset; + if (!swiper.params.virtualTranslate) tx -= swiper.translate; + let ty = 0; + + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + } + + const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs($slideEl[0].progress), 0) : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0); + const $targetEl = effectTarget(params, $slideEl); + $targetEl.css({ + opacity: slideOpacity + }).transform(`translate3d(${tx}px, ${ty}px, 0px)`); + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.fadeEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides: true + }); + }; + + effectInit({ + effect: 'fade', + swiper, + on, + setTranslate, + setTransition, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: !swiper.params.cssMode + }) + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.less b/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.less new file mode 100644 index 0000000..bb059dd --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.less @@ -0,0 +1,20 @@ +.swiper-fade { + &.swiper-free-mode { + .swiper-slide { + transition-timing-function: ease-out; + } + } + .swiper-slide { + pointer-events: none; + transition-property: opacity; + .swiper-slide { + pointer-events: none; + } + } + .swiper-slide-active { + &, + & .swiper-slide-active { + pointer-events: auto; + } + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.min.css b/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.min.css new file mode 100644 index 0000000..ec1d7bf --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.min.css @@ -0,0 +1 @@ +.swiper-fade.swiper-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-fade .swiper-slide-active,.swiper-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.scss b/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.scss new file mode 100644 index 0000000..bb059dd --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-fade/effect-fade.scss @@ -0,0 +1,20 @@ +.swiper-fade { + &.swiper-free-mode { + .swiper-slide { + transition-timing-function: ease-out; + } + } + .swiper-slide { + pointer-events: none; + transition-property: opacity; + .swiper-slide { + pointer-events: none; + } + } + .swiper-slide-active { + &, + & .swiper-slide-active { + pointer-events: auto; + } + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.js b/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.js new file mode 100644 index 0000000..e923008 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.js @@ -0,0 +1,102 @@ +import createShadow from '../../shared/create-shadow.js'; +import effectInit from '../../shared/effect-init.js'; +import effectTarget from '../../shared/effect-target.js'; +import effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js'; +export default function EffectFlip({ + swiper, + extendParams, + on +}) { + extendParams({ + flipEffect: { + slideShadows: true, + limitRotation: true, + transformEl: null + } + }); + + const setTranslate = () => { + const { + slides, + rtlTranslate: rtl + } = swiper; + const params = swiper.params.flipEffect; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let progress = $slideEl[0].progress; + + if (swiper.params.flipEffect.limitRotation) { + progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + } + + const offset = $slideEl[0].swiperSlideOffset; + const rotate = -180 * progress; + let rotateY = rotate; + let rotateX = 0; + let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset; + let ty = 0; + + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + rotateX = -rotateY; + rotateY = 0; + } else if (rtl) { + rotateY = -rotateY; + } + + $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length; + + if (params.slideShadows) { + // Set shadows + let shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + + if (shadowBefore.length === 0) { + shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top'); + } + + if (shadowAfter.length === 0) { + shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom'); + } + + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + + const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform); + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.flipEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl + }); + }; + + effectInit({ + effect: 'flip', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: !swiper.params.cssMode + }) + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.less b/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.less new file mode 100644 index 0000000..f200173 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.less @@ -0,0 +1,24 @@ +.swiper-flip { + overflow: visible; + .swiper-slide { + pointer-events: none; + backface-visibility: hidden; + z-index: 1; + .swiper-slide { + pointer-events: none; + } + } + .swiper-slide-active { + &, + & .swiper-slide-active { + pointer-events: auto; + } + } + .swiper-slide-shadow-top, + .swiper-slide-shadow-bottom, + .swiper-slide-shadow-left, + .swiper-slide-shadow-right { + z-index: 0; + backface-visibility: hidden; + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.min.css b/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.min.css new file mode 100644 index 0000000..ae2ed65 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.min.css @@ -0,0 +1 @@ +.swiper-flip{overflow:visible}.swiper-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-flip .swiper-slide-active,.swiper-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-flip .swiper-slide-shadow-bottom,.swiper-flip .swiper-slide-shadow-left,.swiper-flip .swiper-slide-shadow-right,.swiper-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.scss b/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.scss new file mode 100644 index 0000000..f200173 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/effect-flip/effect-flip.scss @@ -0,0 +1,24 @@ +.swiper-flip { + overflow: visible; + .swiper-slide { + pointer-events: none; + backface-visibility: hidden; + z-index: 1; + .swiper-slide { + pointer-events: none; + } + } + .swiper-slide-active { + &, + & .swiper-slide-active { + pointer-events: auto; + } + } + .swiper-slide-shadow-top, + .swiper-slide-shadow-bottom, + .swiper-slide-shadow-left, + .swiper-slide-shadow-right { + z-index: 0; + backface-visibility: hidden; + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.js b/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.js new file mode 100644 index 0000000..83b00af --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.js @@ -0,0 +1,245 @@ +import { now } from '../../shared/utils.js'; +export default function freeMode({ + swiper, + extendParams, + emit, + once +}) { + extendParams({ + freeMode: { + enabled: false, + momentum: true, + momentumRatio: 1, + momentumBounce: true, + momentumBounceRatio: 1, + momentumVelocityRatio: 1, + sticky: false, + minimumVelocity: 0.02 + } + }); + + function onTouchMove() { + const { + touchEventsData: data, + touches + } = swiper; // Velocity + + if (data.velocities.length === 0) { + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'startX' : 'startY'], + time: data.touchStartTime + }); + } + + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'], + time: now() + }); + } + + function onTouchEnd({ + currentPos + }) { + const { + params, + $wrapperEl, + rtlTranslate: rtl, + snapGrid, + touchEventsData: data + } = swiper; // Time diff + + const touchEndTime = now(); + const timeDiff = touchEndTime - data.touchStartTime; + + if (currentPos < -swiper.minTranslate()) { + swiper.slideTo(swiper.activeIndex); + return; + } + + if (currentPos > -swiper.maxTranslate()) { + if (swiper.slides.length < snapGrid.length) { + swiper.slideTo(snapGrid.length - 1); + } else { + swiper.slideTo(swiper.slides.length - 1); + } + + return; + } + + if (params.freeMode.momentum) { + if (data.velocities.length > 1) { + const lastMoveEvent = data.velocities.pop(); + const velocityEvent = data.velocities.pop(); + const distance = lastMoveEvent.position - velocityEvent.position; + const time = lastMoveEvent.time - velocityEvent.time; + swiper.velocity = distance / time; + swiper.velocity /= 2; + + if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) { + swiper.velocity = 0; + } // this implies that the user stopped moving a finger then released. + // There would be no events with distance zero, so the last event is stale. + + + if (time > 150 || now() - lastMoveEvent.time > 300) { + swiper.velocity = 0; + } + } else { + swiper.velocity = 0; + } + + swiper.velocity *= params.freeMode.momentumVelocityRatio; + data.velocities.length = 0; + let momentumDuration = 1000 * params.freeMode.momentumRatio; + const momentumDistance = swiper.velocity * momentumDuration; + let newPosition = swiper.translate + momentumDistance; + if (rtl) newPosition = -newPosition; + let doBounce = false; + let afterBouncePosition; + const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio; + let needsLoopFix; + + if (newPosition < swiper.maxTranslate()) { + if (params.freeMode.momentumBounce) { + if (newPosition + swiper.maxTranslate() < -bounceAmount) { + newPosition = swiper.maxTranslate() - bounceAmount; + } + + afterBouncePosition = swiper.maxTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.maxTranslate(); + } + + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (newPosition > swiper.minTranslate()) { + if (params.freeMode.momentumBounce) { + if (newPosition - swiper.minTranslate() > bounceAmount) { + newPosition = swiper.minTranslate() + bounceAmount; + } + + afterBouncePosition = swiper.minTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.minTranslate(); + } + + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (params.freeMode.sticky) { + let nextSlide; + + for (let j = 0; j < snapGrid.length; j += 1) { + if (snapGrid[j] > -newPosition) { + nextSlide = j; + break; + } + } + + if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') { + newPosition = snapGrid[nextSlide]; + } else { + newPosition = snapGrid[nextSlide - 1]; + } + + newPosition = -newPosition; + } + + if (needsLoopFix) { + once('transitionEnd', () => { + swiper.loopFix(); + }); + } // Fix duration + + + if (swiper.velocity !== 0) { + if (rtl) { + momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity); + } else { + momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity); + } + + if (params.freeMode.sticky) { + // If freeMode.sticky is active and the user ends a swipe with a slow-velocity + // event, then durations can be 20+ seconds to slide one (or zero!) slides. + // It's easy to see this when simulating touch with mouse events. To fix this, + // limit single-slide swipes to the default slide duration. This also has the + // nice side effect of matching slide speed if the user stopped moving before + // lifting finger or mouse vs. moving slowly before lifting the finger/mouse. + // For faster swipes, also apply limits (albeit higher ones). + const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate); + const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex]; + + if (moveDistance < currentSlideSize) { + momentumDuration = params.speed; + } else if (moveDistance < 2 * currentSlideSize) { + momentumDuration = params.speed * 1.5; + } else { + momentumDuration = params.speed * 2.5; + } + } + } else if (params.freeMode.sticky) { + swiper.slideToClosest(); + return; + } + + if (params.freeMode.momentumBounce && doBounce) { + swiper.updateProgress(afterBouncePosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return; + emit('momentumBounce'); + swiper.setTransition(params.speed); + setTimeout(() => { + swiper.setTranslate(afterBouncePosition); + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + }, 0); + }); + } else if (swiper.velocity) { + emit('_freeModeNoMomentumRelease'); + swiper.updateProgress(newPosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + + if (!swiper.animating) { + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + } + } else { + swiper.updateProgress(newPosition); + } + + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } else if (params.freeMode.sticky) { + swiper.slideToClosest(); + return; + } else if (params.freeMode) { + emit('_freeModeNoMomentumRelease'); + } + + if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) { + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + } + + Object.assign(swiper, { + freeMode: { + onTouchMove, + onTouchEnd + } + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.less b/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.less new file mode 100644 index 0000000..9c289eb --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.less @@ -0,0 +1,4 @@ +.swiper-free-mode > .swiper-wrapper { + transition-timing-function: ease-out; + margin: 0 auto; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.min.css b/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.min.css new file mode 100644 index 0000000..ecc8120 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.min.css @@ -0,0 +1 @@ +.swiper-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.scss b/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.scss new file mode 100644 index 0000000..9c289eb --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/free-mode/free-mode.scss @@ -0,0 +1,4 @@ +.swiper-free-mode > .swiper-wrapper { + transition-timing-function: ease-out; + margin: 0 auto; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/grid/grid.js b/src/main/resources/static/assets/js/swiper/modules/grid/grid.js new file mode 100644 index 0000000..853cb9b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/grid/grid.js @@ -0,0 +1,116 @@ +export default function Grid({ + swiper, + extendParams +}) { + extendParams({ + grid: { + rows: 1, + fill: 'column' + } + }); + let slidesNumberEvenToRows; + let slidesPerRow; + let numFullColumns; + + const initSlides = slidesLength => { + const { + slidesPerView + } = swiper.params; + const { + rows, + fill + } = swiper.params.grid; + slidesPerRow = slidesNumberEvenToRows / rows; + numFullColumns = Math.floor(slidesLength / rows); + + if (Math.floor(slidesLength / rows) === slidesLength / rows) { + slidesNumberEvenToRows = slidesLength; + } else { + slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows; + } + + if (slidesPerView !== 'auto' && fill === 'row') { + slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows); + } + }; + + const updateSlide = (i, slide, slidesLength, getDirectionLabel) => { + const { + slidesPerGroup, + spaceBetween + } = swiper.params; + const { + rows, + fill + } = swiper.params.grid; // Set slides order + + let newSlideOrderIndex; + let column; + let row; + + if (fill === 'row' && slidesPerGroup > 1) { + const groupIndex = Math.floor(i / (slidesPerGroup * rows)); + const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex; + const columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup); + row = Math.floor(slideIndexInGroup / columnsInGroup); + column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup; + newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows; + slide.css({ + '-webkit-order': newSlideOrderIndex, + order: newSlideOrderIndex + }); + } else if (fill === 'column') { + column = Math.floor(i / rows); + row = i - column * rows; + + if (column > numFullColumns || column === numFullColumns && row === rows - 1) { + row += 1; + + if (row >= rows) { + row = 0; + column += 1; + } + } + } else { + row = Math.floor(i / slidesPerRow); + column = i - row * slidesPerRow; + } + + slide.css(getDirectionLabel('margin-top'), row !== 0 ? spaceBetween && `${spaceBetween}px` : ''); + }; + + const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => { + const { + spaceBetween, + centeredSlides, + roundLengths + } = swiper.params; + const { + rows + } = swiper.params.grid; + swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows; + swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween; + swiper.$wrapperEl.css({ + [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px` + }); + + if (centeredSlides) { + snapGrid.splice(0, snapGrid.length); + const newSlidesGrid = []; + + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (roundLengths) slidesGridItem = Math.floor(slidesGridItem); + if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem); + } + + snapGrid.push(...newSlidesGrid); + } + }; + + swiper.grid = { + initSlides, + updateSlide, + updateWrapperSize + }; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/grid/grid.less b/src/main/resources/static/assets/js/swiper/modules/grid/grid.less new file mode 100644 index 0000000..136cb65 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/grid/grid.less @@ -0,0 +1,7 @@ +.swiper-grid > .swiper-wrapper { + flex-wrap: wrap; +} +.swiper-grid-column > .swiper-wrapper { + flex-wrap: wrap; + flex-direction: column; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/grid/grid.min.css b/src/main/resources/static/assets/js/swiper/modules/grid/grid.min.css new file mode 100644 index 0000000..7d5f8f9 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/grid/grid.min.css @@ -0,0 +1 @@ +.swiper-grid>.swiper-wrapper{flex-wrap:wrap}.swiper-grid-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/grid/grid.scss b/src/main/resources/static/assets/js/swiper/modules/grid/grid.scss new file mode 100644 index 0000000..136cb65 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/grid/grid.scss @@ -0,0 +1,7 @@ +.swiper-grid > .swiper-wrapper { + flex-wrap: wrap; +} +.swiper-grid-column > .swiper-wrapper { + flex-wrap: wrap; + flex-direction: column; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.js b/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.js new file mode 100644 index 0000000..50556c7 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.js @@ -0,0 +1,96 @@ +import { getWindow, getDocument } from 'ssr-window'; +import $ from '../../shared/dom.js'; +export default function HashNavigation({ + swiper, + extendParams, + emit, + on +}) { + let initialized = false; + const document = getDocument(); + const window = getWindow(); + extendParams({ + hashNavigation: { + enabled: false, + replaceState: false, + watchState: false + } + }); + + const onHashChange = () => { + emit('hashChange'); + const newHash = document.location.hash.replace('#', ''); + const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash'); + + if (newHash !== activeSlideHash) { + const newIndex = swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-hash="${newHash}"]`).index(); + if (typeof newIndex === 'undefined') return; + swiper.slideTo(newIndex); + } + }; + + const setHash = () => { + if (!initialized || !swiper.params.hashNavigation.enabled) return; + + if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) { + window.history.replaceState(null, null, `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || ''); + emit('hashSet'); + } else { + const slide = swiper.slides.eq(swiper.activeIndex); + const hash = slide.attr('data-hash') || slide.attr('data-history'); + document.location.hash = hash || ''; + emit('hashSet'); + } + }; + + const init = () => { + if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return; + initialized = true; + const hash = document.location.hash.replace('#', ''); + + if (hash) { + const speed = 0; + + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHash = slide.attr('data-hash') || slide.attr('data-history'); + + if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true); + } + } + } + + if (swiper.params.hashNavigation.watchState) { + $(window).on('hashchange', onHashChange); + } + }; + + const destroy = () => { + if (swiper.params.hashNavigation.watchState) { + $(window).off('hashchange', onHashChange); + } + }; + + on('init', () => { + if (swiper.params.hashNavigation.enabled) { + init(); + } + }); + on('destroy', () => { + if (swiper.params.hashNavigation.enabled) { + destroy(); + } + }); + on('transitionEnd _freeModeNoMomentumRelease', () => { + if (initialized) { + setHash(); + } + }); + on('slideChange', () => { + if (initialized && swiper.params.cssMode) { + setHash(); + } + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.less b/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.less new file mode 100644 index 0000000..eafcdd6 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.less @@ -0,0 +1,2 @@ +@import url('../../swiper-vars.less'); + diff --git a/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.min.css b/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.scss b/src/main/resources/static/assets/js/swiper/modules/hash-navigation/hash-navigation.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/history/history.js b/src/main/resources/static/assets/js/swiper/modules/history/history.js new file mode 100644 index 0000000..84c59dd --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/history/history.js @@ -0,0 +1,150 @@ +import { getWindow } from 'ssr-window'; +export default function History({ + swiper, + extendParams, + on +}) { + extendParams({ + history: { + enabled: false, + root: '', + replaceState: false, + key: 'slides' + } + }); + let initialized = false; + let paths = {}; + + const slugify = text => { + return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, ''); + }; + + const getPathValues = urlOverride => { + const window = getWindow(); + let location; + + if (urlOverride) { + location = new URL(urlOverride); + } else { + location = window.location; + } + + const pathArray = location.pathname.slice(1).split('/').filter(part => part !== ''); + const total = pathArray.length; + const key = pathArray[total - 2]; + const value = pathArray[total - 1]; + return { + key, + value + }; + }; + + const setHistory = (key, index) => { + const window = getWindow(); + if (!initialized || !swiper.params.history.enabled) return; + let location; + + if (swiper.params.url) { + location = new URL(swiper.params.url); + } else { + location = window.location; + } + + const slide = swiper.slides.eq(index); + let value = slugify(slide.attr('data-history')); + + if (swiper.params.history.root.length > 0) { + let root = swiper.params.history.root; + if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1); + value = `${root}/${key}/${value}`; + } else if (!location.pathname.includes(key)) { + value = `${key}/${value}`; + } + + const currentState = window.history.state; + + if (currentState && currentState.value === value) { + return; + } + + if (swiper.params.history.replaceState) { + window.history.replaceState({ + value + }, null, value); + } else { + window.history.pushState({ + value + }, null, value); + } + }; + + const scrollToSlide = (speed, value, runCallbacks) => { + if (value) { + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHistory = slugify(slide.attr('data-history')); + + if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, runCallbacks); + } + } + } else { + swiper.slideTo(0, speed, runCallbacks); + } + }; + + const setHistoryPopState = () => { + paths = getPathValues(swiper.params.url); + scrollToSlide(swiper.params.speed, swiper.paths.value, false); + }; + + const init = () => { + const window = getWindow(); + if (!swiper.params.history) return; + + if (!window.history || !window.history.pushState) { + swiper.params.history.enabled = false; + swiper.params.hashNavigation.enabled = true; + return; + } + + initialized = true; + paths = getPathValues(swiper.params.url); + if (!paths.key && !paths.value) return; + scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit); + + if (!swiper.params.history.replaceState) { + window.addEventListener('popstate', setHistoryPopState); + } + }; + + const destroy = () => { + const window = getWindow(); + + if (!swiper.params.history.replaceState) { + window.removeEventListener('popstate', setHistoryPopState); + } + }; + + on('init', () => { + if (swiper.params.history.enabled) { + init(); + } + }); + on('destroy', () => { + if (swiper.params.history.enabled) { + destroy(); + } + }); + on('transitionEnd _freeModeNoMomentumRelease', () => { + if (initialized) { + setHistory(swiper.params.history.key, swiper.activeIndex); + } + }); + on('slideChange', () => { + if (initialized && swiper.params.cssMode) { + setHistory(swiper.params.history.key, swiper.activeIndex); + } + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/history/history.less b/src/main/resources/static/assets/js/swiper/modules/history/history.less new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/history/history.min.css b/src/main/resources/static/assets/js/swiper/modules/history/history.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/history/history.scss b/src/main/resources/static/assets/js/swiper/modules/history/history.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/keyboard/keyboard.js b/src/main/resources/static/assets/js/swiper/modules/keyboard/keyboard.js new file mode 100644 index 0000000..bb24e7e --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/keyboard/keyboard.js @@ -0,0 +1,131 @@ +/* eslint-disable consistent-return */ +import { getWindow, getDocument } from 'ssr-window'; +import $ from '../../shared/dom.js'; +export default function Keyboard({ + swiper, + extendParams, + on, + emit +}) { + const document = getDocument(); + const window = getWindow(); + swiper.keyboard = { + enabled: false + }; + extendParams({ + keyboard: { + enabled: false, + onlyInViewport: true, + pageUpDown: true + } + }); + + function handle(event) { + if (!swiper.enabled) return; + const { + rtlTranslate: rtl + } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; // jquery fix + + const kc = e.keyCode || e.charCode; + const pageUpDown = swiper.params.keyboard.pageUpDown; + const isPageUp = pageUpDown && kc === 33; + const isPageDown = pageUpDown && kc === 34; + const isArrowLeft = kc === 37; + const isArrowRight = kc === 39; + const isArrowUp = kc === 38; + const isArrowDown = kc === 40; // Directions locks + + if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) { + return false; + } + + if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) { + return false; + } + + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { + return undefined; + } + + if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) { + return undefined; + } + + if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) { + let inView = false; // Check that swiper should be inside of visible area of window + + if (swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 && swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0) { + return undefined; + } + + const $el = swiper.$el; + const swiperWidth = $el[0].clientWidth; + const swiperHeight = $el[0].clientHeight; + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + const swiperOffset = swiper.$el.offset(); + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]]; + + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + + if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) { + if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line + + inView = true; + } + } + + if (!inView) return undefined; + } + + if (swiper.isHorizontal()) { + if (isPageUp || isPageDown || isArrowLeft || isArrowRight) { + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + } + + if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext(); + if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev(); + } else { + if (isPageUp || isPageDown || isArrowUp || isArrowDown) { + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + } + + if (isPageDown || isArrowDown) swiper.slideNext(); + if (isPageUp || isArrowUp) swiper.slidePrev(); + } + + emit('keyPress', kc); + return undefined; + } + + function enable() { + if (swiper.keyboard.enabled) return; + $(document).on('keydown', handle); + swiper.keyboard.enabled = true; + } + + function disable() { + if (!swiper.keyboard.enabled) return; + $(document).off('keydown', handle); + swiper.keyboard.enabled = false; + } + + on('init', () => { + if (swiper.params.keyboard.enabled) { + enable(); + } + }); + on('destroy', () => { + if (swiper.keyboard.enabled) { + disable(); + } + }); + Object.assign(swiper.keyboard, { + enable, + disable + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/keyboard/keyboard.less b/src/main/resources/static/assets/js/swiper/modules/keyboard/keyboard.less new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/keyboard/keyboard.min.css b/src/main/resources/static/assets/js/swiper/modules/keyboard/keyboard.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/keyboard/keyboard.scss b/src/main/resources/static/assets/js/swiper/modules/keyboard/keyboard.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.js b/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.js new file mode 100644 index 0000000..cfba311 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.js @@ -0,0 +1,283 @@ +import { getWindow } from 'ssr-window'; +import $ from '../../shared/dom.js'; +export default function Lazy({ + swiper, + extendParams, + on, + emit +}) { + extendParams({ + lazy: { + checkInView: false, + enabled: false, + loadPrevNext: false, + loadPrevNextAmount: 1, + loadOnTransitionStart: false, + scrollingElement: '', + elementClass: 'swiper-lazy', + loadingClass: 'swiper-lazy-loading', + loadedClass: 'swiper-lazy-loaded', + preloaderClass: 'swiper-lazy-preloader' + } + }); + swiper.lazy = {}; + let scrollHandlerAttached = false; + let initialImageLoaded = false; + + function loadInSlide(index, loadInDuplicate = true) { + const params = swiper.params.lazy; + if (typeof index === 'undefined') return; + if (swiper.slides.length === 0) return; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + const $slideEl = isVirtual ? swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-swiper-slide-index="${index}"]`) : swiper.slides.eq(index); + const $images = $slideEl.find(`.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`); + + if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) { + $images.push($slideEl[0]); + } + + if ($images.length === 0) return; + $images.each(imageEl => { + const $imageEl = $(imageEl); + $imageEl.addClass(params.loadingClass); + const background = $imageEl.attr('data-background'); + const src = $imageEl.attr('data-src'); + const srcset = $imageEl.attr('data-srcset'); + const sizes = $imageEl.attr('data-sizes'); + const $pictureEl = $imageEl.parent('picture'); + swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => { + if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper && !swiper.params || swiper.destroyed) return; + + if (background) { + $imageEl.css('background-image', `url("${background}")`); + $imageEl.removeAttr('data-background'); + } else { + if (srcset) { + $imageEl.attr('srcset', srcset); + $imageEl.removeAttr('data-srcset'); + } + + if (sizes) { + $imageEl.attr('sizes', sizes); + $imageEl.removeAttr('data-sizes'); + } + + if ($pictureEl.length) { + $pictureEl.children('source').each(sourceEl => { + const $source = $(sourceEl); + + if ($source.attr('data-srcset')) { + $source.attr('srcset', $source.attr('data-srcset')); + $source.removeAttr('data-srcset'); + } + }); + } + + if (src) { + $imageEl.attr('src', src); + $imageEl.removeAttr('data-src'); + } + } + + $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass); + $slideEl.find(`.${params.preloaderClass}`).remove(); + + if (swiper.params.loop && loadInDuplicate) { + const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index'); + + if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) { + const originalSlide = swiper.$wrapperEl.children(`[data-swiper-slide-index="${slideOriginalIndex}"]:not(.${swiper.params.slideDuplicateClass})`); + loadInSlide(originalSlide.index(), false); + } else { + const duplicatedSlide = swiper.$wrapperEl.children(`.${swiper.params.slideDuplicateClass}[data-swiper-slide-index="${slideOriginalIndex}"]`); + loadInSlide(duplicatedSlide.index(), false); + } + } + + emit('lazyImageReady', $slideEl[0], $imageEl[0]); + + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + }); + emit('lazyImageLoad', $slideEl[0], $imageEl[0]); + }); + } + + function load() { + const { + $wrapperEl, + params: swiperParams, + slides, + activeIndex + } = swiper; + const isVirtual = swiper.virtual && swiperParams.virtual.enabled; + const params = swiperParams.lazy; + let slidesPerView = swiperParams.slidesPerView; + + if (slidesPerView === 'auto') { + slidesPerView = 0; + } + + function slideExist(index) { + if (isVirtual) { + if ($wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index="${index}"]`).length) { + return true; + } + } else if (slides[index]) return true; + + return false; + } + + function slideIndex(slideEl) { + if (isVirtual) { + return $(slideEl).attr('data-swiper-slide-index'); + } + + return $(slideEl).index(); + } + + if (!initialImageLoaded) initialImageLoaded = true; + + if (swiper.params.watchSlidesProgress) { + $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each(slideEl => { + const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index(); + loadInSlide(index); + }); + } else if (slidesPerView > 1) { + for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) { + if (slideExist(i)) loadInSlide(i); + } + } else { + loadInSlide(activeIndex); + } + + if (params.loadPrevNext) { + if (slidesPerView > 1 || params.loadPrevNextAmount && params.loadPrevNextAmount > 1) { + const amount = params.loadPrevNextAmount; + const spv = slidesPerView; + const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length); + const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); // Next Slides + + for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) { + if (slideExist(i)) loadInSlide(i); + } // Prev Slides + + + for (let i = minIndex; i < activeIndex; i += 1) { + if (slideExist(i)) loadInSlide(i); + } + } else { + const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`); + if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide)); + const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`); + if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide)); + } + } + } + + function checkInViewOnLoad() { + const window = getWindow(); + if (!swiper || swiper.destroyed) return; + const $scrollElement = swiper.params.lazy.scrollingElement ? $(swiper.params.lazy.scrollingElement) : $(window); + const isWindow = $scrollElement[0] === window; + const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth; + const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight; + const swiperOffset = swiper.$el.offset(); + const { + rtlTranslate: rtl + } = swiper; + let inView = false; + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiper.width, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiper.height], [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height]]; + + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + + if (point[0] >= 0 && point[0] <= scrollElementWidth && point[1] >= 0 && point[1] <= scrollElementHeight) { + if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line + + inView = true; + } + } + + const passiveListener = swiper.touchEvents.start === 'touchstart' && swiper.support.passiveListener && swiper.params.passiveListeners ? { + passive: true, + capture: false + } : false; + + if (inView) { + load(); + $scrollElement.off('scroll', checkInViewOnLoad, passiveListener); + } else if (!scrollHandlerAttached) { + scrollHandlerAttached = true; + $scrollElement.on('scroll', checkInViewOnLoad, passiveListener); + } + } + + on('beforeInit', () => { + if (swiper.params.lazy.enabled && swiper.params.preloadImages) { + swiper.params.preloadImages = false; + } + }); + on('init', () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on('scroll', () => { + if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.freeMode.sticky) { + load(); + } + }); + on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on('transitionStart', () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.loadOnTransitionStart || !swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + } + }); + on('transitionEnd', () => { + if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on('slideChange', () => { + const { + lazy, + cssMode, + watchSlidesProgress, + touchReleaseOnEdges, + resistanceRatio + } = swiper.params; + + if (lazy.enabled && (cssMode || watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0))) { + load(); + } + }); + Object.assign(swiper.lazy, { + load, + loadInSlide + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.less b/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.less new file mode 100644 index 0000000..caaf125 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.less @@ -0,0 +1,34 @@ +/* Preloader */ +:root { + /* + --swiper-preloader-color: var(--swiper-theme-color); + */ +} +.swiper-lazy-preloader { + width: 42px; + height: 42px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -21px; + margin-top: -21px; + z-index: 10; + transform-origin: 50%; + animation: swiper-preloader-spin 1s infinite linear; + box-sizing: border-box; + border: 4px solid var(--swiper-preloader-color, var(--swiper-theme-color)); + border-radius: 50%; + border-top-color: transparent; +} + +.swiper-lazy-preloader-white { + --swiper-preloader-color: #fff; +} +.swiper-lazy-preloader-black { + --swiper-preloader-color: #000; +} +@keyframes swiper-preloader-spin { + 100% { + transform: rotate(360deg); + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.min.css b/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.min.css new file mode 100644 index 0000000..e73cca0 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.min.css @@ -0,0 +1 @@ +.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;animation:swiper-preloader-spin 1s infinite linear;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.scss b/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.scss new file mode 100644 index 0000000..caaf125 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/lazy/lazy.scss @@ -0,0 +1,34 @@ +/* Preloader */ +:root { + /* + --swiper-preloader-color: var(--swiper-theme-color); + */ +} +.swiper-lazy-preloader { + width: 42px; + height: 42px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -21px; + margin-top: -21px; + z-index: 10; + transform-origin: 50%; + animation: swiper-preloader-spin 1s infinite linear; + box-sizing: border-box; + border: 4px solid var(--swiper-preloader-color, var(--swiper-theme-color)); + border-radius: 50%; + border-top-color: transparent; +} + +.swiper-lazy-preloader-white { + --swiper-preloader-color: #fff; +} +.swiper-lazy-preloader-black { + --swiper-preloader-color: #000; +} +@keyframes swiper-preloader-spin { + 100% { + transform: rotate(360deg); + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/manipulation/manipulation.js b/src/main/resources/static/assets/js/swiper/modules/manipulation/manipulation.js new file mode 100644 index 0000000..c4b176b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/manipulation/manipulation.js @@ -0,0 +1,16 @@ +import appendSlide from './methods/appendSlide.js'; +import prependSlide from './methods/prependSlide.js'; +import addSlide from './methods/addSlide.js'; +import removeSlide from './methods/removeSlide.js'; +import removeAllSlides from './methods/removeAllSlides.js'; +export default function Manipulation({ + swiper +}) { + Object.assign(swiper, { + appendSlide: appendSlide.bind(swiper), + prependSlide: prependSlide.bind(swiper), + addSlide: addSlide.bind(swiper), + removeSlide: removeSlide.bind(swiper), + removeAllSlides: removeAllSlides.bind(swiper) + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/manipulation/manipulation.less b/src/main/resources/static/assets/js/swiper/modules/manipulation/manipulation.less new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/manipulation/manipulation.min.css b/src/main/resources/static/assets/js/swiper/modules/manipulation/manipulation.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/manipulation/manipulation.scss b/src/main/resources/static/assets/js/swiper/modules/manipulation/manipulation.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/addSlide.js b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/addSlide.js new file mode 100644 index 0000000..6b83008 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/addSlide.js @@ -0,0 +1,64 @@ +export default function addSlide(index, slides) { + const swiper = this; + const { + $wrapperEl, + params, + activeIndex + } = swiper; + let activeIndexBuffer = activeIndex; + + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + + const baseLength = swiper.slides.length; + + if (index <= 0) { + swiper.prependSlide(slides); + return; + } + + if (index >= baseLength) { + swiper.appendSlide(slides); + return; + } + + let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer; + const slidesBuffer = []; + + for (let i = baseLength - 1; i >= index; i -= 1) { + const currentSlide = swiper.slides.eq(i); + currentSlide.remove(); + slidesBuffer.unshift(currentSlide); + } + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + + newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer; + } else { + $wrapperEl.append(slides); + } + + for (let i = 0; i < slidesBuffer.length; i += 1) { + $wrapperEl.append(slidesBuffer[i]); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/appendSlide.js b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/appendSlide.js new file mode 100644 index 0000000..9a649af --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/appendSlide.js @@ -0,0 +1,27 @@ +export default function appendSlide(slides) { + const swiper = this; + const { + $wrapperEl, + params + } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + } else { + $wrapperEl.append(slides); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/prependSlide.js b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/prependSlide.js new file mode 100644 index 0000000..2195621 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/prependSlide.js @@ -0,0 +1,34 @@ +export default function prependSlide(slides) { + const swiper = this; + const { + params, + $wrapperEl, + activeIndex + } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + + let newActiveIndex = activeIndex + 1; + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.prepend(slides[i]); + } + + newActiveIndex = activeIndex + slides.length; + } else { + $wrapperEl.prepend(slides); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + swiper.slideTo(newActiveIndex, 0, false); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/removeAllSlides.js b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/removeAllSlides.js new file mode 100644 index 0000000..f24e494 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/removeAllSlides.js @@ -0,0 +1,10 @@ +export default function removeAllSlides() { + const swiper = this; + const slidesIndexes = []; + + for (let i = 0; i < swiper.slides.length; i += 1) { + slidesIndexes.push(i); + } + + swiper.removeSlide(slidesIndexes); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/removeSlide.js b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/removeSlide.js new file mode 100644 index 0000000..2cf6373 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/manipulation/methods/removeSlide.js @@ -0,0 +1,47 @@ +export default function removeSlide(slidesIndexes) { + const swiper = this; + const { + params, + $wrapperEl, + activeIndex + } = swiper; + let activeIndexBuffer = activeIndex; + + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + + let newActiveIndex = activeIndexBuffer; + let indexToRemove; + + if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) { + for (let i = 0; i < slidesIndexes.length; i += 1) { + indexToRemove = slidesIndexes[i]; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + } + + newActiveIndex = Math.max(newActiveIndex, 0); + } else { + indexToRemove = slidesIndexes; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + newActiveIndex = Math.max(newActiveIndex, 0); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/mousewheel/mousewheel.js b/src/main/resources/static/assets/js/swiper/modules/mousewheel/mousewheel.js new file mode 100644 index 0000000..4907c56 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/mousewheel/mousewheel.js @@ -0,0 +1,422 @@ +/* eslint-disable consistent-return */ +import { getWindow } from 'ssr-window'; +import $ from '../../shared/dom.js'; +import { now, nextTick } from '../../shared/utils.js'; +export default function Mousewheel({ + swiper, + extendParams, + on, + emit +}) { + const window = getWindow(); + extendParams({ + mousewheel: { + enabled: false, + releaseOnEdges: false, + invert: false, + forceToAxis: false, + sensitivity: 1, + eventsTarget: 'container', + thresholdDelta: null, + thresholdTime: null + } + }); + swiper.mousewheel = { + enabled: false + }; + let timeout; + let lastScrollTime = now(); + let lastEventBeforeSnap; + const recentWheelEvents = []; + + function normalize(e) { + // Reasonable defaults + const PIXEL_STEP = 10; + const LINE_HEIGHT = 40; + const PAGE_HEIGHT = 800; + let sX = 0; + let sY = 0; // spinX, spinY + + let pX = 0; + let pY = 0; // pixelX, pixelY + // Legacy + + if ('detail' in e) { + sY = e.detail; + } + + if ('wheelDelta' in e) { + sY = -e.wheelDelta / 120; + } + + if ('wheelDeltaY' in e) { + sY = -e.wheelDeltaY / 120; + } + + if ('wheelDeltaX' in e) { + sX = -e.wheelDeltaX / 120; + } // side scrolling on FF with DOMMouseScroll + + + if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) { + sX = sY; + sY = 0; + } + + pX = sX * PIXEL_STEP; + pY = sY * PIXEL_STEP; + + if ('deltaY' in e) { + pY = e.deltaY; + } + + if ('deltaX' in e) { + pX = e.deltaX; + } + + if (e.shiftKey && !pX) { + // if user scrolls with shift he wants horizontal scroll + pX = pY; + pY = 0; + } + + if ((pX || pY) && e.deltaMode) { + if (e.deltaMode === 1) { + // delta in LINE units + pX *= LINE_HEIGHT; + pY *= LINE_HEIGHT; + } else { + // delta in PAGE units + pX *= PAGE_HEIGHT; + pY *= PAGE_HEIGHT; + } + } // Fall-back if spin cannot be determined + + + if (pX && !sX) { + sX = pX < 1 ? -1 : 1; + } + + if (pY && !sY) { + sY = pY < 1 ? -1 : 1; + } + + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY + }; + } + + function handleMouseEnter() { + if (!swiper.enabled) return; + swiper.mouseEntered = true; + } + + function handleMouseLeave() { + if (!swiper.enabled) return; + swiper.mouseEntered = false; + } + + function animateSlider(newEvent) { + if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) { + // Prevent if delta of wheel scroll delta is below configured threshold + return false; + } + + if (swiper.params.mousewheel.thresholdTime && now() - lastScrollTime < swiper.params.mousewheel.thresholdTime) { + // Prevent if time between scrolls is below configured threshold + return false; + } // If the movement is NOT big enough and + // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider): + // Don't go any further (avoid insignificant scroll movement). + + + if (newEvent.delta >= 6 && now() - lastScrollTime < 60) { + // Return false as a default + return true; + } // If user is scrolling towards the end: + // If the slider hasn't hit the latest slide or + // if the slider is a loop and + // if the slider isn't moving right now: + // Go to next slide and + // emit a scroll event. + // Else (the user is scrolling towards the beginning) and + // if the slider hasn't hit the first slide or + // if the slider is a loop and + // if the slider isn't moving right now: + // Go to prev slide and + // emit a scroll event. + + + if (newEvent.direction < 0) { + if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) { + swiper.slideNext(); + emit('scroll', newEvent.raw); + } + } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) { + swiper.slidePrev(); + emit('scroll', newEvent.raw); + } // If you got here is because an animation has been triggered so store the current time + + + lastScrollTime = new window.Date().getTime(); // Return false as a default + + return false; + } + + function releaseScroll(newEvent) { + const params = swiper.params.mousewheel; + + if (newEvent.direction < 0) { + if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) { + // Return true to animate scroll on edges + return true; + } + } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) { + // Return true to animate scroll on edges + return true; + } + + return false; + } + + function handle(event) { + let e = event; + let disableParentSwiper = true; + if (!swiper.enabled) return; + const params = swiper.params.mousewheel; + + if (swiper.params.cssMode) { + e.preventDefault(); + } + + let target = swiper.$el; + + if (swiper.params.mousewheel.eventsTarget !== 'container') { + target = $(swiper.params.mousewheel.eventsTarget); + } + + if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) return true; + if (e.originalEvent) e = e.originalEvent; // jquery fix + + let delta = 0; + const rtlFactor = swiper.rtlTranslate ? -1 : 1; + const data = normalize(e); + + if (params.forceToAxis) { + if (swiper.isHorizontal()) { + if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true; + } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true; + } else { + delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY; + } + + if (delta === 0) return true; + if (params.invert) delta = -delta; // Get the scroll positions + + let positions = swiper.getTranslate() + delta * params.sensitivity; + if (positions >= swiper.minTranslate()) positions = swiper.minTranslate(); + if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); // When loop is true: + // the disableParentSwiper will be true. + // When loop is false: + // if the scroll positions is not on edge, + // then the disableParentSwiper will be true. + // if the scroll on edge positions, + // then the disableParentSwiper will be false. + + disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate()); + if (disableParentSwiper && swiper.params.nested) e.stopPropagation(); + + if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) { + // Register the new event in a variable which stores the relevant data + const newEvent = { + time: now(), + delta: Math.abs(delta), + direction: Math.sign(delta), + raw: event + }; // Keep the most recent events + + if (recentWheelEvents.length >= 2) { + recentWheelEvents.shift(); // only store the last N events + } + + const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined; + recentWheelEvents.push(newEvent); // If there is at least one previous recorded event: + // If direction has changed or + // if the scroll is quicker than the previous one: + // Animate the slider. + // Else (this is the first time the wheel is moved): + // Animate the slider. + + if (prevEvent) { + if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) { + animateSlider(newEvent); + } + } else { + animateSlider(newEvent); + } // If it's time to release the scroll: + // Return now so you don't hit the preventDefault. + + + if (releaseScroll(newEvent)) { + return true; + } + } else { + // Freemode or scrollContainer: + // If we recently snapped after a momentum scroll, then ignore wheel events + // to give time for the deceleration to finish. Stop ignoring after 500 msecs + // or if it's a new scroll (larger delta or inverse sign as last event before + // an end-of-momentum snap). + const newEvent = { + time: now(), + delta: Math.abs(delta), + direction: Math.sign(delta) + }; + const ignoreWheelEvents = lastEventBeforeSnap && newEvent.time < lastEventBeforeSnap.time + 500 && newEvent.delta <= lastEventBeforeSnap.delta && newEvent.direction === lastEventBeforeSnap.direction; + + if (!ignoreWheelEvents) { + lastEventBeforeSnap = undefined; + + if (swiper.params.loop) { + swiper.loopFix(); + } + + let position = swiper.getTranslate() + delta * params.sensitivity; + const wasBeginning = swiper.isBeginning; + const wasEnd = swiper.isEnd; + if (position >= swiper.minTranslate()) position = swiper.minTranslate(); + if (position <= swiper.maxTranslate()) position = swiper.maxTranslate(); + swiper.setTransition(0); + swiper.setTranslate(position); + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) { + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeMode.sticky) { + // When wheel scrolling starts with sticky (aka snap) enabled, then detect + // the end of a momentum scroll by storing recent (N=15?) wheel events. + // 1. do all N events have decreasing or same (absolute value) delta? + // 2. did all N events arrive in the last M (M=500?) msecs? + // 3. does the earliest event have an (absolute value) delta that's + // at least P (P=1?) larger than the most recent event's delta? + // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels? + // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration. + // Snap immediately and ignore remaining wheel events in this scroll. + // See comment above for "remaining wheel events in this scroll" determination. + // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event. + clearTimeout(timeout); + timeout = undefined; + + if (recentWheelEvents.length >= 15) { + recentWheelEvents.shift(); // only store the last N events + } + + const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined; + const firstEvent = recentWheelEvents[0]; + recentWheelEvents.push(newEvent); + + if (prevEvent && (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)) { + // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log. + recentWheelEvents.splice(0); + } else if (recentWheelEvents.length >= 15 && newEvent.time - firstEvent.time < 500 && firstEvent.delta - newEvent.delta >= 1 && newEvent.delta <= 6) { + // We're at the end of the deceleration of a momentum scroll, so there's no need + // to wait for more events. Snap ASAP on the next tick. + // Also, because there's some remaining momentum we'll bias the snap in the + // direction of the ongoing scroll because it's better UX for the scroll to snap + // in the same direction as the scroll instead of reversing to snap. Therefore, + // if it's already scrolled more than 20% in the current direction, keep going. + const snapToThreshold = delta > 0 ? 0.8 : 0.2; + lastEventBeforeSnap = newEvent; + recentWheelEvents.splice(0); + timeout = nextTick(() => { + swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold); + }, 0); // no delay; move on next tick + } + + if (!timeout) { + // if we get here, then we haven't detected the end of a momentum scroll, so + // we'll consider a scroll "complete" when there haven't been any wheel events + // for 500ms. + timeout = nextTick(() => { + const snapToThreshold = 0.5; + lastEventBeforeSnap = newEvent; + recentWheelEvents.splice(0); + swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold); + }, 500); + } + } // Emit event + + + if (!ignoreWheelEvents) emit('scroll', e); // Stop autoplay + + if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); // Return page scroll on edge positions + + if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true; + } + } + + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + return false; + } + + function events(method) { + let target = swiper.$el; + + if (swiper.params.mousewheel.eventsTarget !== 'container') { + target = $(swiper.params.mousewheel.eventsTarget); + } + + target[method]('mouseenter', handleMouseEnter); + target[method]('mouseleave', handleMouseLeave); + target[method]('wheel', handle); + } + + function enable() { + if (swiper.params.cssMode) { + swiper.wrapperEl.removeEventListener('wheel', handle); + return true; + } + + if (swiper.mousewheel.enabled) return false; + events('on'); + swiper.mousewheel.enabled = true; + return true; + } + + function disable() { + if (swiper.params.cssMode) { + swiper.wrapperEl.addEventListener(event, handle); + return true; + } + + if (!swiper.mousewheel.enabled) return false; + events('off'); + swiper.mousewheel.enabled = false; + return true; + } + + on('init', () => { + if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) { + disable(); + } + + if (swiper.params.mousewheel.enabled) enable(); + }); + on('destroy', () => { + if (swiper.params.cssMode) { + enable(); + } + + if (swiper.mousewheel.enabled) disable(); + }); + Object.assign(swiper.mousewheel, { + enable, + disable + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/mousewheel/mousewheel.less b/src/main/resources/static/assets/js/swiper/modules/mousewheel/mousewheel.less new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/mousewheel/mousewheel.min.css b/src/main/resources/static/assets/js/swiper/modules/mousewheel/mousewheel.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/mousewheel/mousewheel.scss b/src/main/resources/static/assets/js/swiper/modules/mousewheel/mousewheel.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.js b/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.js new file mode 100644 index 0000000..bfe9880 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.js @@ -0,0 +1,185 @@ +import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js'; +import $ from '../../shared/dom.js'; +export default function Navigation({ + swiper, + extendParams, + on, + emit +}) { + extendParams({ + navigation: { + nextEl: null, + prevEl: null, + hideOnClick: false, + disabledClass: 'swiper-button-disabled', + hiddenClass: 'swiper-button-hidden', + lockClass: 'swiper-button-lock' + } + }); + swiper.navigation = { + nextEl: null, + $nextEl: null, + prevEl: null, + $prevEl: null + }; + + function getEl(el) { + let $el; + + if (el) { + $el = $(el); + + if (swiper.params.uniqueNavElements && typeof el === 'string' && $el.length > 1 && swiper.$el.find(el).length === 1) { + $el = swiper.$el.find(el); + } + } + + return $el; + } + + function toggleEl($el, disabled) { + const params = swiper.params.navigation; + + if ($el && $el.length > 0) { + $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass); + if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled; + + if (swiper.params.watchOverflow && swiper.enabled) { + $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + } + } + + function update() { + // Update Navigation Buttons + if (swiper.params.loop) return; + const { + $nextEl, + $prevEl + } = swiper.navigation; + toggleEl($prevEl, swiper.isBeginning); + toggleEl($nextEl, swiper.isEnd); + } + + function onPrevClick(e) { + e.preventDefault(); + if (swiper.isBeginning && !swiper.params.loop) return; + swiper.slidePrev(); + } + + function onNextClick(e) { + e.preventDefault(); + if (swiper.isEnd && !swiper.params.loop) return; + swiper.slideNext(); + } + + function init() { + const params = swiper.params.navigation; + swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, { + nextEl: 'swiper-button-next', + prevEl: 'swiper-button-prev' + }); + if (!(params.nextEl || params.prevEl)) return; + const $nextEl = getEl(params.nextEl); + const $prevEl = getEl(params.prevEl); + + if ($nextEl && $nextEl.length > 0) { + $nextEl.on('click', onNextClick); + } + + if ($prevEl && $prevEl.length > 0) { + $prevEl.on('click', onPrevClick); + } + + Object.assign(swiper.navigation, { + $nextEl, + nextEl: $nextEl && $nextEl[0], + $prevEl, + prevEl: $prevEl && $prevEl[0] + }); + + if (!swiper.enabled) { + if ($nextEl) $nextEl.addClass(params.lockClass); + if ($prevEl) $prevEl.addClass(params.lockClass); + } + } + + function destroy() { + const { + $nextEl, + $prevEl + } = swiper.navigation; + + if ($nextEl && $nextEl.length) { + $nextEl.off('click', onNextClick); + $nextEl.removeClass(swiper.params.navigation.disabledClass); + } + + if ($prevEl && $prevEl.length) { + $prevEl.off('click', onPrevClick); + $prevEl.removeClass(swiper.params.navigation.disabledClass); + } + } + + on('init', () => { + init(); + update(); + }); + on('toEdge fromEdge lock unlock', () => { + update(); + }); + on('destroy', () => { + destroy(); + }); + on('enable disable', () => { + const { + $nextEl, + $prevEl + } = swiper.navigation; + + if ($nextEl) { + $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass); + } + + if ($prevEl) { + $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass); + } + }); + on('click', (_s, e) => { + const { + $nextEl, + $prevEl + } = swiper.navigation; + const targetEl = e.target; + + if (swiper.params.navigation.hideOnClick && !$(targetEl).is($prevEl) && !$(targetEl).is($nextEl)) { + if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return; + let isHidden; + + if ($nextEl) { + isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass); + } else if ($prevEl) { + isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass); + } + + if (isHidden === true) { + emit('navigationShow'); + } else { + emit('navigationHide'); + } + + if ($nextEl) { + $nextEl.toggleClass(swiper.params.navigation.hiddenClass); + } + + if ($prevEl) { + $prevEl.toggleClass(swiper.params.navigation.hiddenClass); + } + } + }); + Object.assign(swiper.navigation, { + update, + init, + destroy + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.less b/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.less new file mode 100644 index 0000000..84c535f --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.less @@ -0,0 +1,55 @@ +@import url('../../swiper-vars.less'); + +:root { + --swiper-navigation-size: 44px; + /* + --swiper-navigation-color: var(--swiper-theme-color); + */ +} +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + width: calc(var(--swiper-navigation-size) / 44 * 27); + height: var(--swiper-navigation-size); + margin-top: calc(0px - (var(--swiper-navigation-size) / 2)); + z-index: 10; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--swiper-navigation-color, var(--swiper-theme-color)); + &.swiper-button-disabled { + opacity: 0.35; + cursor: auto; + pointer-events: none; + } + &:after { + font-family: swiper-icons; + font-size: var(--swiper-navigation-size); + text-transform: none !important; + letter-spacing: 0; + text-transform: none; + font-variant: initial; + line-height: 1; + } +} +.swiper-button-prev, +.swiper-rtl .swiper-button-next { + &:after { + content: 'prev'; + } + left: 10px; + right: auto; +} +.swiper-button-next, +.swiper-rtl .swiper-button-prev { + &:after { + content: 'next'; + } + right: 10px; + left: auto; +} +.swiper-button-lock { + display: none; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.min.css b/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.min.css new file mode 100644 index 0000000..41446eb --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.min.css @@ -0,0 +1 @@ +:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(0px - (var(--swiper-navigation-size)/ 2));z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;text-transform:none;font-variant:initial;line-height:1}.swiper-button-prev,.swiper-rtl .swiper-button-next{left:10px;right:auto}.swiper-button-prev:after,.swiper-rtl .swiper-button-next:after{content:'prev'}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:10px;left:auto}.swiper-button-next:after,.swiper-rtl .swiper-button-prev:after{content:'next'}.swiper-button-lock{display:none} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.scss b/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.scss new file mode 100644 index 0000000..b84d59c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/navigation/navigation.scss @@ -0,0 +1,56 @@ +@import '../../swiper-vars.scss'; + +:root { + --swiper-navigation-size: 44px; + /* + --swiper-navigation-color: var(--swiper-theme-color); + */ +} +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + width: calc(var(--swiper-navigation-size) / 44 * 27); + height: var(--swiper-navigation-size); + margin-top: calc(0px - (var(--swiper-navigation-size) / 2)); + z-index: 10; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--swiper-navigation-color, var(--swiper-theme-color)); + &.swiper-button-disabled { + opacity: 0.35; + cursor: auto; + pointer-events: none; + } + &:after { + font-family: swiper-icons; + font-size: var(--swiper-navigation-size); + text-transform: none !important; + letter-spacing: 0; + text-transform: none; + font-variant: initial; + line-height: 1; + } +} +.swiper-button-prev, +.swiper-rtl .swiper-button-next { + &:after { + content: 'prev'; + } + left: 10px; + right: auto; +} +.swiper-button-next, +.swiper-rtl .swiper-button-prev { + &:after { + content: 'next'; + } + right: 10px; + left: auto; +} + +.swiper-button-lock { + display: none; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.js b/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.js new file mode 100644 index 0000000..58c2873 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.js @@ -0,0 +1,410 @@ +import $ from '../../shared/dom.js'; +import classesToSelector from '../../shared/classes-to-selector.js'; +import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js'; +export default function Pagination({ + swiper, + extendParams, + on, + emit +}) { + const pfx = 'swiper-pagination'; + extendParams({ + pagination: { + el: null, + bulletElement: 'span', + clickable: false, + hideOnClick: false, + renderBullet: null, + renderProgressbar: null, + renderFraction: null, + renderCustom: null, + progressbarOpposite: false, + type: 'bullets', + // 'bullets' or 'progressbar' or 'fraction' or 'custom' + dynamicBullets: false, + dynamicMainBullets: 1, + formatFractionCurrent: number => number, + formatFractionTotal: number => number, + bulletClass: `${pfx}-bullet`, + bulletActiveClass: `${pfx}-bullet-active`, + modifierClass: `${pfx}-`, + currentClass: `${pfx}-current`, + totalClass: `${pfx}-total`, + hiddenClass: `${pfx}-hidden`, + progressbarFillClass: `${pfx}-progressbar-fill`, + progressbarOppositeClass: `${pfx}-progressbar-opposite`, + clickableClass: `${pfx}-clickable`, + lockClass: `${pfx}-lock`, + horizontalClass: `${pfx}-horizontal`, + verticalClass: `${pfx}-vertical` + } + }); + swiper.pagination = { + el: null, + $el: null, + bullets: [] + }; + let bulletSize; + let dynamicBulletIndex = 0; + + function isPaginationDisabled() { + return !swiper.params.pagination.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0; + } + + function setSideBullets($bulletEl, position) { + const { + bulletActiveClass + } = swiper.params.pagination; + $bulletEl[position]().addClass(`${bulletActiveClass}-${position}`)[position]().addClass(`${bulletActiveClass}-${position}-${position}`); + } + + function update() { + // Render || Update Pagination bullets/items + const rtl = swiper.rtl; + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + const $el = swiper.pagination.$el; // Current/Total + + let current; + const total = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + + if (swiper.params.loop) { + current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup); + + if (current > slidesLength - 1 - swiper.loopedSlides * 2) { + current -= slidesLength - swiper.loopedSlides * 2; + } + + if (current > total - 1) current -= total; + if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current; + } else if (typeof swiper.snapIndex !== 'undefined') { + current = swiper.snapIndex; + } else { + current = swiper.activeIndex || 0; + } // Types + + + if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) { + const bullets = swiper.pagination.bullets; + let firstIndex; + let lastIndex; + let midIndex; + + if (params.dynamicBullets) { + bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true); + $el.css(swiper.isHorizontal() ? 'width' : 'height', `${bulletSize * (params.dynamicMainBullets + 4)}px`); + + if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) { + dynamicBulletIndex += current - swiper.previousIndex; + + if (dynamicBulletIndex > params.dynamicMainBullets - 1) { + dynamicBulletIndex = params.dynamicMainBullets - 1; + } else if (dynamicBulletIndex < 0) { + dynamicBulletIndex = 0; + } + } + + firstIndex = current - dynamicBulletIndex; + lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1); + midIndex = (lastIndex + firstIndex) / 2; + } + + bullets.removeClass(['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`).join(' ')); + + if ($el.length > 1) { + bullets.each(bullet => { + const $bullet = $(bullet); + const bulletIndex = $bullet.index(); + + if (bulletIndex === current) { + $bullet.addClass(params.bulletActiveClass); + } + + if (params.dynamicBullets) { + if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { + $bullet.addClass(`${params.bulletActiveClass}-main`); + } + + if (bulletIndex === firstIndex) { + setSideBullets($bullet, 'prev'); + } + + if (bulletIndex === lastIndex) { + setSideBullets($bullet, 'next'); + } + } + }); + } else { + const $bullet = bullets.eq(current); + const bulletIndex = $bullet.index(); + $bullet.addClass(params.bulletActiveClass); + + if (params.dynamicBullets) { + const $firstDisplayedBullet = bullets.eq(firstIndex); + const $lastDisplayedBullet = bullets.eq(lastIndex); + + for (let i = firstIndex; i <= lastIndex; i += 1) { + bullets.eq(i).addClass(`${params.bulletActiveClass}-main`); + } + + if (swiper.params.loop) { + if (bulletIndex >= bullets.length - params.dynamicMainBullets) { + for (let i = params.dynamicMainBullets; i >= 0; i -= 1) { + bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`); + } + + bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(`${params.bulletActiveClass}-prev`); + } else { + setSideBullets($firstDisplayedBullet, 'prev'); + setSideBullets($lastDisplayedBullet, 'next'); + } + } else { + setSideBullets($firstDisplayedBullet, 'prev'); + setSideBullets($lastDisplayedBullet, 'next'); + } + } + } + + if (params.dynamicBullets) { + const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4); + const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize; + const offsetProp = rtl ? 'right' : 'left'; + bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`); + } + } + + if (params.type === 'fraction') { + $el.find(classesToSelector(params.currentClass)).text(params.formatFractionCurrent(current + 1)); + $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total)); + } + + if (params.type === 'progressbar') { + let progressbarDirection; + + if (params.progressbarOpposite) { + progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal'; + } else { + progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical'; + } + + const scale = (current + 1) / total; + let scaleX = 1; + let scaleY = 1; + + if (progressbarDirection === 'horizontal') { + scaleX = scale; + } else { + scaleY = scale; + } + + $el.find(classesToSelector(params.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`).transition(swiper.params.speed); + } + + if (params.type === 'custom' && params.renderCustom) { + $el.html(params.renderCustom(swiper, current + 1, total)); + emit('paginationRender', $el[0]); + } else { + emit('paginationUpdate', $el[0]); + } + + if (swiper.params.watchOverflow && swiper.enabled) { + $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + } + + function render() { + // Render Container + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + const $el = swiper.pagination.$el; + let paginationHTML = ''; + + if (params.type === 'bullets') { + let numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + + if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.loop && numberOfBullets > slidesLength) { + numberOfBullets = slidesLength; + } + + for (let i = 0; i < numberOfBullets; i += 1) { + if (params.renderBullet) { + paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass); + } else { + paginationHTML += `<${params.bulletElement} class="${params.bulletClass}">`; + } + } + + $el.html(paginationHTML); + swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass)); + } + + if (params.type === 'fraction') { + if (params.renderFraction) { + paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass); + } else { + paginationHTML = `` + ' / ' + ``; + } + + $el.html(paginationHTML); + } + + if (params.type === 'progressbar') { + if (params.renderProgressbar) { + paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass); + } else { + paginationHTML = ``; + } + + $el.html(paginationHTML); + } + + if (params.type !== 'custom') { + emit('paginationRender', swiper.pagination.$el[0]); + } + } + + function init() { + swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, { + el: 'swiper-pagination' + }); + const params = swiper.params.pagination; + if (!params.el) return; + let $el = $(params.el); + if ($el.length === 0) return; + + if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) { + $el = swiper.$el.find(params.el); // check if it belongs to another nested Swiper + + if ($el.length > 1) { + $el = $el.filter(el => { + if ($(el).parents('.swiper')[0] !== swiper.el) return false; + return true; + }); + } + } + + if (params.type === 'bullets' && params.clickable) { + $el.addClass(params.clickableClass); + } + + $el.addClass(params.modifierClass + params.type); + $el.addClass(params.modifierClass + swiper.params.direction); + + if (params.type === 'bullets' && params.dynamicBullets) { + $el.addClass(`${params.modifierClass}${params.type}-dynamic`); + dynamicBulletIndex = 0; + + if (params.dynamicMainBullets < 1) { + params.dynamicMainBullets = 1; + } + } + + if (params.type === 'progressbar' && params.progressbarOpposite) { + $el.addClass(params.progressbarOppositeClass); + } + + if (params.clickable) { + $el.on('click', classesToSelector(params.bulletClass), function onClick(e) { + e.preventDefault(); + let index = $(this).index() * swiper.params.slidesPerGroup; + if (swiper.params.loop) index += swiper.loopedSlides; + swiper.slideTo(index); + }); + } + + Object.assign(swiper.pagination, { + $el, + el: $el[0] + }); + + if (!swiper.enabled) { + $el.addClass(params.lockClass); + } + } + + function destroy() { + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const $el = swiper.pagination.$el; + $el.removeClass(params.hiddenClass); + $el.removeClass(params.modifierClass + params.type); + $el.removeClass(params.modifierClass + swiper.params.direction); + if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass) swiper.pagination.bullets.removeClass(params.bulletActiveClass); + + if (params.clickable) { + $el.off('click', classesToSelector(params.bulletClass)); + } + } + + on('init', () => { + init(); + render(); + update(); + }); + on('activeIndexChange', () => { + if (swiper.params.loop) { + update(); + } else if (typeof swiper.snapIndex === 'undefined') { + update(); + } + }); + on('snapIndexChange', () => { + if (!swiper.params.loop) { + update(); + } + }); + on('slidesLengthChange', () => { + if (swiper.params.loop) { + render(); + update(); + } + }); + on('snapGridLengthChange', () => { + if (!swiper.params.loop) { + render(); + update(); + } + }); + on('destroy', () => { + destroy(); + }); + on('enable disable', () => { + const { + $el + } = swiper.pagination; + + if ($el) { + $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass); + } + }); + on('lock unlock', () => { + update(); + }); + on('click', (_s, e) => { + const targetEl = e.target; + const { + $el + } = swiper.pagination; + + if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && $el.length > 0 && !$(targetEl).hasClass(swiper.params.pagination.bulletClass)) { + if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return; + const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass); + + if (isHidden === true) { + emit('paginationShow'); + } else { + emit('paginationHide'); + } + + $el.toggleClass(swiper.params.pagination.hiddenClass); + } + }); + Object.assign(swiper.pagination, { + render, + update, + init, + destroy + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.less b/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.less new file mode 100644 index 0000000..b245ae6 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.less @@ -0,0 +1,163 @@ +@import url('../../swiper-vars.less'); + +:root { + /* + --swiper-pagination-color: var(--swiper-theme-color); + --swiper-pagination-bullet-size: 8px; + --swiper-pagination-bullet-width: 8px; + --swiper-pagination-bullet-height: 8px; + --swiper-pagination-bullet-inactive-color: #000; + --swiper-pagination-bullet-inactive-opacity: 0.2; + --swiper-pagination-bullet-opacity: 1; + --swiper-pagination-bullet-horizontal-gap: 4px; + --swiper-pagination-bullet-vertical-gap: 6px; + */ +} +.swiper-pagination { + position: absolute; + text-align: center; + transition: 300ms opacity; + transform: translate3d(0, 0, 0); + z-index: 10; + &.swiper-pagination-hidden { + opacity: 0; + } +} +/* Common Styles */ +.swiper-pagination-fraction, +.swiper-pagination-custom, +.swiper-horizontal > .swiper-pagination-bullets, +.swiper-pagination-bullets.swiper-pagination-horizontal { + bottom: 10px; + left: 0; + width: 100%; +} +/* Bullets */ +.swiper-pagination-bullets-dynamic { + overflow: hidden; + font-size: 0; + .swiper-pagination-bullet { + transform: scale(0.33); + position: relative; + } + .swiper-pagination-bullet-active { + transform: scale(1); + } + .swiper-pagination-bullet-active-main { + transform: scale(1); + } + .swiper-pagination-bullet-active-prev { + transform: scale(0.66); + } + .swiper-pagination-bullet-active-prev-prev { + transform: scale(0.33); + } + .swiper-pagination-bullet-active-next { + transform: scale(0.66); + } + .swiper-pagination-bullet-active-next-next { + transform: scale(0.33); + } +} +.swiper-pagination-bullet { + width: var(--swiper-pagination-bullet-width, var(--swiper-pagination-bullet-size, 8px)); + height: var(--swiper-pagination-bullet-height, var(--swiper-pagination-bullet-size, 8px)); + display: inline-block; + border-radius: 50%; + background: var(--swiper-pagination-bullet-inactive-color, #000); + opacity: var(--swiper-pagination-bullet-inactive-opacity, 0.2); + button& { + border: none; + margin: 0; + padding: 0; + box-shadow: none; + appearance: none; + } + .swiper-pagination-clickable & { + cursor: pointer; + } + + &:only-child { + display: none !important; + } +} +.swiper-pagination-bullet-active { + opacity: var(--swiper-pagination-bullet-opacity, 1); + background: var(--swiper-pagination-color, var(--swiper-theme-color)); +} + +.swiper-vertical > .swiper-pagination-bullets, +.swiper-pagination-vertical.swiper-pagination-bullets { + right: 10px; + top: 50%; + transform: translate3d(0px, -50%, 0); + .swiper-pagination-bullet { + margin: var(--swiper-pagination-bullet-vertical-gap, 6px) 0; + display: block; + } + &.swiper-pagination-bullets-dynamic { + top: 50%; + transform: translateY(-50%); + width: 8px; + .swiper-pagination-bullet { + display: inline-block; + transition: 200ms transform, 200ms top; + } + } +} +.swiper-horizontal > .swiper-pagination-bullets, +.swiper-pagination-horizontal.swiper-pagination-bullets { + .swiper-pagination-bullet { + margin: 0 var(--swiper-pagination-bullet-horizontal-gap, 4px); + } + &.swiper-pagination-bullets-dynamic { + left: 50%; + transform: translateX(-50%); + white-space: nowrap; + .swiper-pagination-bullet { + transition: 200ms transform, 200ms left; + } + } +} +.swiper-horizontal.swiper-rtl > .swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + transition: 200ms transform, 200ms right; +} +/* Progress */ +.swiper-pagination-progressbar { + background: rgba(0, 0, 0, 0.25); + position: absolute; + .swiper-pagination-progressbar-fill { + background: var(--swiper-pagination-color, var(--swiper-theme-color)); + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + transform: scale(0); + transform-origin: left top; + } + .swiper-rtl & .swiper-pagination-progressbar-fill { + transform-origin: right top; + } + .swiper-horizontal > &, + &.swiper-pagination-horizontal, + .swiper-vertical > &.swiper-pagination-progressbar-opposite, + &.swiper-pagination-vertical.swiper-pagination-progressbar-opposite { + width: 100%; + height: 4px; + left: 0; + top: 0; + } + .swiper-vertical > &, + &.swiper-pagination-vertical, + .swiper-horizontal > &.swiper-pagination-progressbar-opposite, + &.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite { + width: 4px; + height: 100%; + left: 0; + top: 0; + } +} +.swiper-pagination-lock { + display: none; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.min.css b/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.min.css new file mode 100644 index 0000000..cb5e95b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.min.css @@ -0,0 +1 @@ +.swiper-pagination{position:absolute;text-align:center;transition:.3s opacity;transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));display:inline-block;border-radius:50%;background:var(--swiper-pagination-bullet-inactive-color,#000);opacity:var(--swiper-pagination-bullet-inactive-opacity, .2)}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{opacity:var(--swiper-pagination-bullet-opacity, 1);background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{right:10px;top:50%;transform:translate3d(0px,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0;display:block}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:.2s transform,.2s top}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s left}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s right}.swiper-pagination-progressbar{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:4px;left:0;top:0}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{width:4px;height:100%;left:0;top:0}.swiper-pagination-lock{display:none} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.scss b/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.scss new file mode 100644 index 0000000..e24b29a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/pagination/pagination.scss @@ -0,0 +1,163 @@ +@import '../../swiper-vars.scss'; + +:root { + /* + --swiper-pagination-color: var(--swiper-theme-color); + --swiper-pagination-bullet-size: 8px; + --swiper-pagination-bullet-width: 8px; + --swiper-pagination-bullet-height: 8px; + --swiper-pagination-bullet-inactive-color: #000; + --swiper-pagination-bullet-inactive-opacity: 0.2; + --swiper-pagination-bullet-opacity: 1; + --swiper-pagination-bullet-horizontal-gap: 4px; + --swiper-pagination-bullet-vertical-gap: 6px; + */ +} +.swiper-pagination { + position: absolute; + text-align: center; + transition: 300ms opacity; + transform: translate3d(0, 0, 0); + z-index: 10; + &.swiper-pagination-hidden { + opacity: 0; + } +} +/* Common Styles */ +.swiper-pagination-fraction, +.swiper-pagination-custom, +.swiper-horizontal > .swiper-pagination-bullets, +.swiper-pagination-bullets.swiper-pagination-horizontal { + bottom: 10px; + left: 0; + width: 100%; +} +/* Bullets */ +.swiper-pagination-bullets-dynamic { + overflow: hidden; + font-size: 0; + .swiper-pagination-bullet { + transform: scale(0.33); + position: relative; + } + .swiper-pagination-bullet-active { + transform: scale(1); + } + .swiper-pagination-bullet-active-main { + transform: scale(1); + } + .swiper-pagination-bullet-active-prev { + transform: scale(0.66); + } + .swiper-pagination-bullet-active-prev-prev { + transform: scale(0.33); + } + .swiper-pagination-bullet-active-next { + transform: scale(0.66); + } + .swiper-pagination-bullet-active-next-next { + transform: scale(0.33); + } +} +.swiper-pagination-bullet { + width: var(--swiper-pagination-bullet-width, var(--swiper-pagination-bullet-size, 8px)); + height: var(--swiper-pagination-bullet-height, var(--swiper-pagination-bullet-size, 8px)); + display: inline-block; + border-radius: 50%; + background: var(--swiper-pagination-bullet-inactive-color, #000); + opacity: var(--swiper-pagination-bullet-inactive-opacity, 0.2); + @at-root button#{&} { + border: none; + margin: 0; + padding: 0; + box-shadow: none; + appearance: none; + } + .swiper-pagination-clickable & { + cursor: pointer; + } + + &:only-child { + display: none !important; + } +} +.swiper-pagination-bullet-active { + opacity: var(--swiper-pagination-bullet-opacity, 1); + background: var(--swiper-pagination-color, var(--swiper-theme-color)); +} + +.swiper-vertical > .swiper-pagination-bullets, +.swiper-pagination-vertical.swiper-pagination-bullets { + right: 10px; + top: 50%; + transform: translate3d(0px, -50%, 0); + .swiper-pagination-bullet { + margin: var(--swiper-pagination-bullet-vertical-gap, 6px) 0; + display: block; + } + &.swiper-pagination-bullets-dynamic { + top: 50%; + transform: translateY(-50%); + width: 8px; + .swiper-pagination-bullet { + display: inline-block; + transition: 200ms transform, 200ms top; + } + } +} +.swiper-horizontal > .swiper-pagination-bullets, +.swiper-pagination-horizontal.swiper-pagination-bullets { + .swiper-pagination-bullet { + margin: 0 var(--swiper-pagination-bullet-horizontal-gap, 4px); + } + &.swiper-pagination-bullets-dynamic { + left: 50%; + transform: translateX(-50%); + white-space: nowrap; + .swiper-pagination-bullet { + transition: 200ms transform, 200ms left; + } + } +} +.swiper-horizontal.swiper-rtl > .swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + transition: 200ms transform, 200ms right; +} +/* Progress */ +.swiper-pagination-progressbar { + background: rgba(0, 0, 0, 0.25); + position: absolute; + .swiper-pagination-progressbar-fill { + background: var(--swiper-pagination-color, var(--swiper-theme-color)); + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + transform: scale(0); + transform-origin: left top; + } + .swiper-rtl & .swiper-pagination-progressbar-fill { + transform-origin: right top; + } + .swiper-horizontal > &, + &.swiper-pagination-horizontal, + .swiper-vertical > &.swiper-pagination-progressbar-opposite, + &.swiper-pagination-vertical.swiper-pagination-progressbar-opposite { + width: 100%; + height: 4px; + left: 0; + top: 0; + } + .swiper-vertical > &, + &.swiper-pagination-vertical, + .swiper-horizontal > &.swiper-pagination-progressbar-opposite, + &.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite { + width: 4px; + height: 100%; + left: 0; + top: 0; + } +} +.swiper-pagination-lock { + display: none; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/parallax/parallax.js b/src/main/resources/static/assets/js/swiper/modules/parallax/parallax.js new file mode 100644 index 0000000..05b2bc8 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/parallax/parallax.js @@ -0,0 +1,114 @@ +import $ from '../../shared/dom.js'; +export default function Parallax({ + swiper, + extendParams, + on +}) { + extendParams({ + parallax: { + enabled: false + } + }); + + const setTransform = (el, progress) => { + const { + rtl + } = swiper; + const $el = $(el); + const rtlFactor = rtl ? -1 : 1; + const p = $el.attr('data-swiper-parallax') || '0'; + let x = $el.attr('data-swiper-parallax-x'); + let y = $el.attr('data-swiper-parallax-y'); + const scale = $el.attr('data-swiper-parallax-scale'); + const opacity = $el.attr('data-swiper-parallax-opacity'); + + if (x || y) { + x = x || '0'; + y = y || '0'; + } else if (swiper.isHorizontal()) { + x = p; + y = '0'; + } else { + y = p; + x = '0'; + } + + if (x.indexOf('%') >= 0) { + x = `${parseInt(x, 10) * progress * rtlFactor}%`; + } else { + x = `${x * progress * rtlFactor}px`; + } + + if (y.indexOf('%') >= 0) { + y = `${parseInt(y, 10) * progress}%`; + } else { + y = `${y * progress}px`; + } + + if (typeof opacity !== 'undefined' && opacity !== null) { + const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress)); + $el[0].style.opacity = currentOpacity; + } + + if (typeof scale === 'undefined' || scale === null) { + $el.transform(`translate3d(${x}, ${y}, 0px)`); + } else { + const currentScale = scale - (scale - 1) * (1 - Math.abs(progress)); + $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`); + } + }; + + const setTranslate = () => { + const { + $el, + slides, + progress, + snapGrid + } = swiper; + $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(el => { + setTransform(el, progress); + }); + slides.each((slideEl, slideIndex) => { + let slideProgress = slideEl.progress; + + if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') { + slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1); + } + + slideProgress = Math.min(Math.max(slideProgress, -1), 1); + $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(el => { + setTransform(el, slideProgress); + }); + }); + }; + + const setTransition = (duration = swiper.params.speed) => { + const { + $el + } = swiper; + $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(parallaxEl => { + const $parallaxEl = $(parallaxEl); + let parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration; + if (duration === 0) parallaxDuration = 0; + $parallaxEl.transition(parallaxDuration); + }); + }; + + on('beforeInit', () => { + if (!swiper.params.parallax.enabled) return; + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }); + on('init', () => { + if (!swiper.params.parallax.enabled) return; + setTranslate(); + }); + on('setTranslate', () => { + if (!swiper.params.parallax.enabled) return; + setTranslate(); + }); + on('setTransition', (_swiper, duration) => { + if (!swiper.params.parallax.enabled) return; + setTransition(duration); + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/parallax/parallax.less b/src/main/resources/static/assets/js/swiper/modules/parallax/parallax.less new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/parallax/parallax.min.css b/src/main/resources/static/assets/js/swiper/modules/parallax/parallax.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/parallax/parallax.scss b/src/main/resources/static/assets/js/swiper/modules/parallax/parallax.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.js b/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.js new file mode 100644 index 0000000..9d1cd01 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.js @@ -0,0 +1,361 @@ +import { getDocument } from 'ssr-window'; +import $ from '../../shared/dom.js'; +import { nextTick } from '../../shared/utils.js'; +import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js'; +export default function Scrollbar({ + swiper, + extendParams, + on, + emit +}) { + const document = getDocument(); + let isTouched = false; + let timeout = null; + let dragTimeout = null; + let dragStartPos; + let dragSize; + let trackSize; + let divider; + extendParams({ + scrollbar: { + el: null, + dragSize: 'auto', + hide: false, + draggable: false, + snapOnRelease: true, + lockClass: 'swiper-scrollbar-lock', + dragClass: 'swiper-scrollbar-drag' + } + }); + swiper.scrollbar = { + el: null, + dragEl: null, + $el: null, + $dragEl: null + }; + + function setTranslate() { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { + scrollbar, + rtlTranslate: rtl, + progress + } = swiper; + const { + $dragEl, + $el + } = scrollbar; + const params = swiper.params.scrollbar; + let newSize = dragSize; + let newPos = (trackSize - dragSize) * progress; + + if (rtl) { + newPos = -newPos; + + if (newPos > 0) { + newSize = dragSize - newPos; + newPos = 0; + } else if (-newPos + dragSize > trackSize) { + newSize = trackSize + newPos; + } + } else if (newPos < 0) { + newSize = dragSize + newPos; + newPos = 0; + } else if (newPos + dragSize > trackSize) { + newSize = trackSize - newPos; + } + + if (swiper.isHorizontal()) { + $dragEl.transform(`translate3d(${newPos}px, 0, 0)`); + $dragEl[0].style.width = `${newSize}px`; + } else { + $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`); + $dragEl[0].style.height = `${newSize}px`; + } + + if (params.hide) { + clearTimeout(timeout); + $el[0].style.opacity = 1; + timeout = setTimeout(() => { + $el[0].style.opacity = 0; + $el.transition(400); + }, 1000); + } + } + + function setTransition(duration) { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + swiper.scrollbar.$dragEl.transition(duration); + } + + function updateSize() { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { + scrollbar + } = swiper; + const { + $dragEl, + $el + } = scrollbar; + $dragEl[0].style.width = ''; + $dragEl[0].style.height = ''; + trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight; + divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0)); + + if (swiper.params.scrollbar.dragSize === 'auto') { + dragSize = trackSize * divider; + } else { + dragSize = parseInt(swiper.params.scrollbar.dragSize, 10); + } + + if (swiper.isHorizontal()) { + $dragEl[0].style.width = `${dragSize}px`; + } else { + $dragEl[0].style.height = `${dragSize}px`; + } + + if (divider >= 1) { + $el[0].style.display = 'none'; + } else { + $el[0].style.display = ''; + } + + if (swiper.params.scrollbar.hide) { + $el[0].style.opacity = 0; + } + + if (swiper.params.watchOverflow && swiper.enabled) { + scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass); + } + } + + function getPointerPosition(e) { + if (swiper.isHorizontal()) { + return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientX : e.clientX; + } + + return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientY : e.clientY; + } + + function setDragPosition(e) { + const { + scrollbar, + rtlTranslate: rtl + } = swiper; + const { + $el + } = scrollbar; + let positionRatio; + positionRatio = (getPointerPosition(e) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize); + positionRatio = Math.max(Math.min(positionRatio, 1), 0); + + if (rtl) { + positionRatio = 1 - positionRatio; + } + + const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio; + swiper.updateProgress(position); + swiper.setTranslate(position); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + function onDragStart(e) { + const params = swiper.params.scrollbar; + const { + scrollbar, + $wrapperEl + } = swiper; + const { + $el, + $dragEl + } = scrollbar; + isTouched = true; + dragStartPos = e.target === $dragEl[0] || e.target === $dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null; + e.preventDefault(); + e.stopPropagation(); + $wrapperEl.transition(100); + $dragEl.transition(100); + setDragPosition(e); + clearTimeout(dragTimeout); + $el.transition(0); + + if (params.hide) { + $el.css('opacity', 1); + } + + if (swiper.params.cssMode) { + swiper.$wrapperEl.css('scroll-snap-type', 'none'); + } + + emit('scrollbarDragStart', e); + } + + function onDragMove(e) { + const { + scrollbar, + $wrapperEl + } = swiper; + const { + $el, + $dragEl + } = scrollbar; + if (!isTouched) return; + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + setDragPosition(e); + $wrapperEl.transition(0); + $el.transition(0); + $dragEl.transition(0); + emit('scrollbarDragMove', e); + } + + function onDragEnd(e) { + const params = swiper.params.scrollbar; + const { + scrollbar, + $wrapperEl + } = swiper; + const { + $el + } = scrollbar; + if (!isTouched) return; + isTouched = false; + + if (swiper.params.cssMode) { + swiper.$wrapperEl.css('scroll-snap-type', ''); + $wrapperEl.transition(''); + } + + if (params.hide) { + clearTimeout(dragTimeout); + dragTimeout = nextTick(() => { + $el.css('opacity', 0); + $el.transition(400); + }, 1000); + } + + emit('scrollbarDragEnd', e); + + if (params.snapOnRelease) { + swiper.slideToClosest(); + } + } + + function events(method) { + const { + scrollbar, + touchEventsTouch, + touchEventsDesktop, + params, + support + } = swiper; + const $el = scrollbar.$el; + const target = $el[0]; + const activeListener = support.passiveListener && params.passiveListeners ? { + passive: false, + capture: false + } : false; + const passiveListener = support.passiveListener && params.passiveListeners ? { + passive: true, + capture: false + } : false; + if (!target) return; + const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener'; + + if (!support.touch) { + target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener); + document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener); + document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener); + } else { + target[eventMethod](touchEventsTouch.start, onDragStart, activeListener); + target[eventMethod](touchEventsTouch.move, onDragMove, activeListener); + target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener); + } + } + + function enableDraggable() { + if (!swiper.params.scrollbar.el) return; + events('on'); + } + + function disableDraggable() { + if (!swiper.params.scrollbar.el) return; + events('off'); + } + + function init() { + const { + scrollbar, + $el: $swiperEl + } = swiper; + swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, { + el: 'swiper-scrollbar' + }); + const params = swiper.params.scrollbar; + if (!params.el) return; + let $el = $(params.el); + + if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) { + $el = $swiperEl.find(params.el); + } + + let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`); + + if ($dragEl.length === 0) { + $dragEl = $(`
`); + $el.append($dragEl); + } + + Object.assign(scrollbar, { + $el, + el: $el[0], + $dragEl, + dragEl: $dragEl[0] + }); + + if (params.draggable) { + enableDraggable(); + } + + if ($el) { + $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass); + } + } + + function destroy() { + disableDraggable(); + } + + on('init', () => { + init(); + updateSize(); + setTranslate(); + }); + on('update resize observerUpdate lock unlock', () => { + updateSize(); + }); + on('setTranslate', () => { + setTranslate(); + }); + on('setTransition', (_s, duration) => { + setTransition(duration); + }); + on('enable disable', () => { + const { + $el + } = swiper.scrollbar; + + if ($el) { + $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass); + } + }); + on('destroy', () => { + destroy(); + }); + Object.assign(swiper.scrollbar, { + updateSize, + setTranslate, + init, + destroy + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.less b/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.less new file mode 100644 index 0000000..e6f133b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.less @@ -0,0 +1,38 @@ +/* Scrollbar */ +.swiper-scrollbar { + border-radius: 10px; + position: relative; + -ms-touch-action: none; + background: rgba(0, 0, 0, 0.1); + .swiper-horizontal > & { + position: absolute; + left: 1%; + bottom: 3px; + z-index: 50; + height: 5px; + width: 98%; + } + .swiper-vertical > & { + position: absolute; + right: 3px; + top: 1%; + z-index: 50; + width: 5px; + height: 98%; + } +} +.swiper-scrollbar-drag { + height: 100%; + width: 100%; + position: relative; + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; + left: 0; + top: 0; +} +.swiper-scrollbar-cursor-drag { + cursor: move; +} +.swiper-scrollbar-lock { + display: none; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.min.css b/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.min.css new file mode 100644 index 0000000..09c1fba --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.min.css @@ -0,0 +1 @@ +.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.scss b/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.scss new file mode 100644 index 0000000..e6f133b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/scrollbar/scrollbar.scss @@ -0,0 +1,38 @@ +/* Scrollbar */ +.swiper-scrollbar { + border-radius: 10px; + position: relative; + -ms-touch-action: none; + background: rgba(0, 0, 0, 0.1); + .swiper-horizontal > & { + position: absolute; + left: 1%; + bottom: 3px; + z-index: 50; + height: 5px; + width: 98%; + } + .swiper-vertical > & { + position: absolute; + right: 3px; + top: 1%; + z-index: 50; + width: 5px; + height: 98%; + } +} +.swiper-scrollbar-drag { + height: 100%; + width: 100%; + position: relative; + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; + left: 0; + top: 0; +} +.swiper-scrollbar-cursor-drag { + cursor: move; +} +.swiper-scrollbar-lock { + display: none; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.js b/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.js new file mode 100644 index 0000000..75e6b82 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.js @@ -0,0 +1,204 @@ +import { isObject } from '../../shared/utils.js'; +import $ from '../../shared/dom.js'; +export default function Thumb({ + swiper, + extendParams, + on +}) { + extendParams({ + thumbs: { + swiper: null, + multipleActiveThumbs: true, + autoScrollOffset: 0, + slideThumbActiveClass: 'swiper-slide-thumb-active', + thumbsContainerClass: 'swiper-thumbs' + } + }); + let initialized = false; + let swiperCreated = false; + swiper.thumbs = { + swiper: null + }; + + function onThumbClick() { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const clickedIndex = thumbsSwiper.clickedIndex; + const clickedSlide = thumbsSwiper.clickedSlide; + if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) return; + if (typeof clickedIndex === 'undefined' || clickedIndex === null) return; + let slideToIndex; + + if (thumbsSwiper.params.loop) { + slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10); + } else { + slideToIndex = clickedIndex; + } + + if (swiper.params.loop) { + let currentIndex = swiper.activeIndex; + + if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) { + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + currentIndex = swiper.activeIndex; + } + + const prevIndex = swiper.slides.eq(currentIndex).prevAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + const nextIndex = swiper.slides.eq(currentIndex).nextAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;else slideToIndex = prevIndex; + } + + swiper.slideTo(slideToIndex); + } + + function init() { + const { + thumbs: thumbsParams + } = swiper.params; + if (initialized) return false; + initialized = true; + const SwiperClass = swiper.constructor; + + if (thumbsParams.swiper instanceof SwiperClass) { + swiper.thumbs.swiper = thumbsParams.swiper; + Object.assign(swiper.thumbs.swiper.originalParams, { + watchSlidesProgress: true, + slideToClickedSlide: false + }); + Object.assign(swiper.thumbs.swiper.params, { + watchSlidesProgress: true, + slideToClickedSlide: false + }); + } else if (isObject(thumbsParams.swiper)) { + const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper); + Object.assign(thumbsSwiperParams, { + watchSlidesProgress: true, + slideToClickedSlide: false + }); + swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams); + swiperCreated = true; + } + + swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass); + swiper.thumbs.swiper.on('tap', onThumbClick); + return true; + } + + function update(initial) { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView; + const autoScrollOffset = swiper.params.thumbs.autoScrollOffset; + const useOffset = autoScrollOffset && !thumbsSwiper.params.loop; + + if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) { + let currentThumbsIndex = thumbsSwiper.activeIndex; + let newThumbsIndex; + let direction; + + if (thumbsSwiper.params.loop) { + if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) { + thumbsSwiper.loopFix(); // eslint-disable-next-line + + thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft; + currentThumbsIndex = thumbsSwiper.activeIndex; + } // Find actual thumbs index to slide to + + + const prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + const nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + + if (typeof prevThumbsIndex === 'undefined') { + newThumbsIndex = nextThumbsIndex; + } else if (typeof nextThumbsIndex === 'undefined') { + newThumbsIndex = prevThumbsIndex; + } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { + newThumbsIndex = thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex; + } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { + newThumbsIndex = nextThumbsIndex; + } else { + newThumbsIndex = prevThumbsIndex; + } + + direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev'; + } else { + newThumbsIndex = swiper.realIndex; + direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev'; + } + + if (useOffset) { + newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset; + } + + if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) { + if (thumbsSwiper.params.centeredSlides) { + if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1; + } else { + newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1; + } + } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) {// newThumbsIndex = newThumbsIndex - slidesPerView + 1; + } + + thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined); + } + } // Activate thumbs + + + let thumbsToActivate = 1; + const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass; + + if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) { + thumbsToActivate = swiper.params.slidesPerView; + } + + if (!swiper.params.thumbs.multipleActiveThumbs) { + thumbsToActivate = 1; + } + + thumbsToActivate = Math.floor(thumbsToActivate); + thumbsSwiper.slides.removeClass(thumbActiveClass); + + if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.$wrapperEl.children(`[data-swiper-slide-index="${swiper.realIndex + i}"]`).addClass(thumbActiveClass); + } + } else { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass); + } + } + } + + on('beforeInit', () => { + const { + thumbs + } = swiper.params; + if (!thumbs || !thumbs.swiper) return; + init(); + update(true); + }); + on('slideChange update resize observerUpdate', () => { + if (!swiper.thumbs.swiper) return; + update(); + }); + on('setTransition', (_s, duration) => { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + thumbsSwiper.setTransition(duration); + }); + on('beforeDestroy', () => { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + + if (swiperCreated && thumbsSwiper) { + thumbsSwiper.destroy(); + } + }); + Object.assign(swiper.thumbs, { + init, + update + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.less b/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.less new file mode 100644 index 0000000..9eaa1b3 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.less @@ -0,0 +1,5 @@ +.swiper-thumbs { + .swiper-slide-thumb-active { + // Styles for active thumb slide + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.min.css b/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.min.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.scss b/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.scss new file mode 100644 index 0000000..9eaa1b3 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/thumbs/thumbs.scss @@ -0,0 +1,5 @@ +.swiper-thumbs { + .swiper-slide-thumb-active { + // Styles for active thumb slide + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.js b/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.js new file mode 100644 index 0000000..15dd1d7 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.js @@ -0,0 +1,291 @@ +import $ from '../../shared/dom.js'; +import { setCSSProperty } from '../../shared/utils.js'; +export default function Virtual({ + swiper, + extendParams, + on +}) { + extendParams({ + virtual: { + enabled: false, + slides: [], + cache: true, + renderSlide: null, + renderExternal: null, + renderExternalUpdate: true, + addSlidesBefore: 0, + addSlidesAfter: 0 + } + }); + let cssModeTimeout; + swiper.virtual = { + cache: {}, + from: undefined, + to: undefined, + slides: [], + offset: 0, + slidesGrid: [] + }; + + function renderSlide(slide, index) { + const params = swiper.params.virtual; + + if (params.cache && swiper.virtual.cache[index]) { + return swiper.virtual.cache[index]; + } + + const $slideEl = params.renderSlide ? $(params.renderSlide.call(swiper, slide, index)) : $(`
${slide}
`); + if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index); + if (params.cache) swiper.virtual.cache[index] = $slideEl; + return $slideEl; + } + + function update(force) { + const { + slidesPerView, + slidesPerGroup, + centeredSlides + } = swiper.params; + const { + addSlidesBefore, + addSlidesAfter + } = swiper.params.virtual; + const { + from: previousFrom, + to: previousTo, + slides, + slidesGrid: previousSlidesGrid, + offset: previousOffset + } = swiper.virtual; + + if (!swiper.params.cssMode) { + swiper.updateActiveIndex(); + } + + const activeIndex = swiper.activeIndex || 0; + let offsetProp; + if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top'; + let slidesAfter; + let slidesBefore; + + if (centeredSlides) { + slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter; + slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore; + } else { + slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter; + slidesBefore = slidesPerGroup + addSlidesBefore; + } + + const from = Math.max((activeIndex || 0) - slidesBefore, 0); + const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1); + const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0); + Object.assign(swiper.virtual, { + from, + to, + offset, + slidesGrid: swiper.slidesGrid + }); + + function onRendered() { + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + if (swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + } + + if (previousFrom === from && previousTo === to && !force) { + if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) { + swiper.slides.css(offsetProp, `${offset}px`); + } + + swiper.updateProgress(); + return; + } + + if (swiper.params.virtual.renderExternal) { + swiper.params.virtual.renderExternal.call(swiper, { + offset, + from, + to, + slides: function getSlides() { + const slidesToRender = []; + + for (let i = from; i <= to; i += 1) { + slidesToRender.push(slides[i]); + } + + return slidesToRender; + }() + }); + + if (swiper.params.virtual.renderExternalUpdate) { + onRendered(); + } + + return; + } + + const prependIndexes = []; + const appendIndexes = []; + + if (force) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove(); + } else { + for (let i = previousFrom; i <= previousTo; i += 1) { + if (i < from || i > to) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}[data-swiper-slide-index="${i}"]`).remove(); + } + } + } + + for (let i = 0; i < slides.length; i += 1) { + if (i >= from && i <= to) { + if (typeof previousTo === 'undefined' || force) { + appendIndexes.push(i); + } else { + if (i > previousTo) appendIndexes.push(i); + if (i < previousFrom) prependIndexes.push(i); + } + } + } + + appendIndexes.forEach(index => { + swiper.$wrapperEl.append(renderSlide(slides[index], index)); + }); + prependIndexes.sort((a, b) => b - a).forEach(index => { + swiper.$wrapperEl.prepend(renderSlide(slides[index], index)); + }); + swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`); + onRendered(); + } + + function appendSlide(slides) { + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.push(slides[i]); + } + } else { + swiper.virtual.slides.push(slides); + } + + update(true); + } + + function prependSlide(slides) { + const activeIndex = swiper.activeIndex; + let newActiveIndex = activeIndex + 1; + let numberOfNewSlides = 1; + + if (Array.isArray(slides)) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.unshift(slides[i]); + } + + newActiveIndex = activeIndex + slides.length; + numberOfNewSlides = slides.length; + } else { + swiper.virtual.slides.unshift(slides); + } + + if (swiper.params.virtual.cache) { + const cache = swiper.virtual.cache; + const newCache = {}; + Object.keys(cache).forEach(cachedIndex => { + const $cachedEl = cache[cachedIndex]; + const cachedElIndex = $cachedEl.attr('data-swiper-slide-index'); + + if (cachedElIndex) { + $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides); + } + + newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl; + }); + swiper.virtual.cache = newCache; + } + + update(true); + swiper.slideTo(newActiveIndex, 0); + } + + function removeSlide(slidesIndexes) { + if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return; + let activeIndex = swiper.activeIndex; + + if (Array.isArray(slidesIndexes)) { + for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) { + swiper.virtual.slides.splice(slidesIndexes[i], 1); + + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes[i]]; + } + + if (slidesIndexes[i] < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + } else { + swiper.virtual.slides.splice(slidesIndexes, 1); + + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes]; + } + + if (slidesIndexes < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + + update(true); + swiper.slideTo(activeIndex, 0); + } + + function removeAllSlides() { + swiper.virtual.slides = []; + + if (swiper.params.virtual.cache) { + swiper.virtual.cache = {}; + } + + update(true); + swiper.slideTo(0, 0); + } + + on('beforeInit', () => { + if (!swiper.params.virtual.enabled) return; + swiper.virtual.slides = swiper.params.virtual.slides; + swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`); + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + + if (!swiper.params.initialSlide) { + update(); + } + }); + on('setTranslate', () => { + if (!swiper.params.virtual.enabled) return; + + if (swiper.params.cssMode && !swiper._immediateVirtual) { + clearTimeout(cssModeTimeout); + cssModeTimeout = setTimeout(() => { + update(); + }, 100); + } else { + update(); + } + }); + on('init update resize', () => { + if (!swiper.params.virtual.enabled) return; + + if (swiper.params.cssMode) { + setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`); + } + }); + Object.assign(swiper.virtual, { + appendSlide, + prependSlide, + removeSlide, + removeAllSlides, + update + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.less b/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.less new file mode 100644 index 0000000..e209999 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.less @@ -0,0 +1,17 @@ +.swiper-virtual.swiper-css-mode { + .swiper-wrapper::after { + content: ''; + position: absolute; + left: 0; + top: 0; + pointer-events: none; + } + &.swiper-horizontal .swiper-wrapper::after { + height: 1px; + width: var(--swiper-virtual-size); + } + &.swiper-vertical .swiper-wrapper::after { + width: 1px; + height: var(--swiper-virtual-size); + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.min.css b/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.min.css new file mode 100644 index 0000000..f6bde73 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.min.css @@ -0,0 +1 @@ +.swiper-virtual.swiper-css-mode .swiper-wrapper::after{content:'';position:absolute;left:0;top:0;pointer-events:none}.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after{height:1px;width:var(--swiper-virtual-size)}.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after{width:1px;height:var(--swiper-virtual-size)} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.scss b/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.scss new file mode 100644 index 0000000..e209999 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/virtual/virtual.scss @@ -0,0 +1,17 @@ +.swiper-virtual.swiper-css-mode { + .swiper-wrapper::after { + content: ''; + position: absolute; + left: 0; + top: 0; + pointer-events: none; + } + &.swiper-horizontal .swiper-wrapper::after { + height: 1px; + width: var(--swiper-virtual-size); + } + &.swiper-vertical .swiper-wrapper::after { + width: 1px; + height: var(--swiper-virtual-size); + } +} diff --git a/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.js b/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.js new file mode 100644 index 0000000..2c352ef --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.js @@ -0,0 +1,612 @@ +import { getWindow } from 'ssr-window'; +import $ from '../../shared/dom.js'; +import { getTranslate } from '../../shared/utils.js'; +export default function Zoom({ + swiper, + extendParams, + on, + emit +}) { + const window = getWindow(); + extendParams({ + zoom: { + enabled: false, + maxRatio: 3, + minRatio: 1, + toggle: true, + containerClass: 'swiper-zoom-container', + zoomedSlideClass: 'swiper-slide-zoomed' + } + }); + swiper.zoom = { + enabled: false + }; + let currentScale = 1; + let isScaling = false; + let gesturesEnabled; + let fakeGestureTouched; + let fakeGestureMoved; + const gesture = { + $slideEl: undefined, + slideWidth: undefined, + slideHeight: undefined, + $imageEl: undefined, + $imageWrapEl: undefined, + maxRatio: 3 + }; + const image = { + isTouched: undefined, + isMoved: undefined, + currentX: undefined, + currentY: undefined, + minX: undefined, + minY: undefined, + maxX: undefined, + maxY: undefined, + width: undefined, + height: undefined, + startX: undefined, + startY: undefined, + touchesStart: {}, + touchesCurrent: {} + }; + const velocity = { + x: undefined, + y: undefined, + prevPositionX: undefined, + prevPositionY: undefined, + prevTime: undefined + }; + let scale = 1; + Object.defineProperty(swiper.zoom, 'scale', { + get() { + return scale; + }, + + set(value) { + if (scale !== value) { + const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined; + const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined; + emit('zoomChange', value, imageEl, slideEl); + } + + scale = value; + } + + }); + + function getDistanceBetweenTouches(e) { + if (e.targetTouches.length < 2) return 1; + const x1 = e.targetTouches[0].pageX; + const y1 = e.targetTouches[0].pageY; + const x2 = e.targetTouches[1].pageX; + const y2 = e.targetTouches[1].pageY; + const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); + return distance; + } // Events + + + function onGestureStart(e) { + const support = swiper.support; + const params = swiper.params.zoom; + fakeGestureTouched = false; + fakeGestureMoved = false; + + if (!support.gestures) { + if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) { + return; + } + + fakeGestureTouched = true; + gesture.scaleStart = getDistanceBetweenTouches(e); + } + + if (!gesture.$slideEl || !gesture.$slideEl.length) { + gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`); + if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('img, svg, canvas, picture, .swiper-zoom-target'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + + if (gesture.$imageWrapEl.length === 0) { + gesture.$imageEl = undefined; + return; + } + } + + if (gesture.$imageEl) { + gesture.$imageEl.transition(0); + } + + isScaling = true; + } + + function onGestureChange(e) { + const support = swiper.support; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + + if (!support.gestures) { + if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) { + return; + } + + fakeGestureMoved = true; + gesture.scaleMove = getDistanceBetweenTouches(e); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { + if (e.type === 'gesturechange') onGestureStart(e); + return; + } + + if (support.gestures) { + zoom.scale = e.scale * currentScale; + } else { + zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale; + } + + if (zoom.scale > gesture.maxRatio) { + zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5; + } + + if (zoom.scale < params.minRatio) { + zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5; + } + + gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`); + } + + function onGestureEnd(e) { + const device = swiper.device; + const support = swiper.support; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + + if (!support.gestures) { + if (!fakeGestureTouched || !fakeGestureMoved) { + return; + } + + if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2 && !device.android) { + return; + } + + fakeGestureTouched = false; + fakeGestureMoved = false; + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio); + gesture.$imageEl.transition(swiper.params.speed).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + currentScale = zoom.scale; + isScaling = false; + if (zoom.scale === 1) gesture.$slideEl = undefined; + } + + function onTouchStart(e) { + const device = swiper.device; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (image.isTouched) return; + if (device.android && e.cancelable) e.preventDefault(); + image.isTouched = true; + image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + } + + function onTouchMove(e) { + const zoom = swiper.zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + swiper.allowClick = false; + if (!image.isTouched || !gesture.$slideEl) return; + + if (!image.isMoved) { + image.width = gesture.$imageEl[0].offsetWidth; + image.height = gesture.$imageEl[0].offsetHeight; + image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0; + image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0; + gesture.slideWidth = gesture.$slideEl[0].offsetWidth; + gesture.slideHeight = gesture.$slideEl[0].offsetHeight; + gesture.$imageWrapEl.transition(0); + } // Define if we need image drag + + + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return; + image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); + image.maxX = -image.minX; + image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); + image.maxY = -image.minY; + image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (!image.isMoved && !isScaling) { + if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) { + image.isTouched = false; + return; + } + + if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) { + image.isTouched = false; + return; + } + } + + if (e.cancelable) { + e.preventDefault(); + } + + e.stopPropagation(); + image.isMoved = true; + image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX; + image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY; + + if (image.currentX < image.minX) { + image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8; + } + + if (image.currentX > image.maxX) { + image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8; + } + + if (image.currentY < image.minY) { + image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8; + } + + if (image.currentY > image.maxY) { + image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8; + } // Velocity + + + if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x; + if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y; + if (!velocity.prevTime) velocity.prevTime = Date.now(); + velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2; + velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2; + if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0; + if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0; + velocity.prevPositionX = image.touchesCurrent.x; + velocity.prevPositionY = image.touchesCurrent.y; + velocity.prevTime = Date.now(); + gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + } + + function onTouchEnd() { + const zoom = swiper.zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + + if (!image.isTouched || !image.isMoved) { + image.isTouched = false; + image.isMoved = false; + return; + } + + image.isTouched = false; + image.isMoved = false; + let momentumDurationX = 300; + let momentumDurationY = 300; + const momentumDistanceX = velocity.x * momentumDurationX; + const newPositionX = image.currentX + momentumDistanceX; + const momentumDistanceY = velocity.y * momentumDurationY; + const newPositionY = image.currentY + momentumDistanceY; // Fix duration + + if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); + if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); + const momentumDuration = Math.max(momentumDurationX, momentumDurationY); + image.currentX = newPositionX; + image.currentY = newPositionY; // Define if we need image drag + + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); + image.maxX = -image.minX; + image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); + image.maxY = -image.minY; + image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX); + image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY); + gesture.$imageWrapEl.transition(momentumDuration).transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + } + + function onTransitionEnd() { + const zoom = swiper.zoom; + + if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) { + if (gesture.$imageEl) { + gesture.$imageEl.transform('translate3d(0,0,0) scale(1)'); + } + + if (gesture.$imageWrapEl) { + gesture.$imageWrapEl.transform('translate3d(0,0,0)'); + } + + zoom.scale = 1; + currentScale = 1; + gesture.$slideEl = undefined; + gesture.$imageEl = undefined; + gesture.$imageWrapEl = undefined; + } + } + + function zoomIn(e) { + const zoom = swiper.zoom; + const params = swiper.params.zoom; + + if (!gesture.$slideEl) { + if (e && e.target) { + gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`); + } + + if (!gesture.$slideEl) { + if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) { + gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`); + } else { + gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + } + } + + gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('img, svg, canvas, picture, .swiper-zoom-target'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return; + + if (swiper.params.cssMode) { + swiper.wrapperEl.style.overflow = 'hidden'; + swiper.wrapperEl.style.touchAction = 'none'; + } + + gesture.$slideEl.addClass(`${params.zoomedSlideClass}`); + let touchX; + let touchY; + let offsetX; + let offsetY; + let diffX; + let diffY; + let translateX; + let translateY; + let imageWidth; + let imageHeight; + let scaledWidth; + let scaledHeight; + let translateMinX; + let translateMinY; + let translateMaxX; + let translateMaxY; + let slideWidth; + let slideHeight; + + if (typeof image.touchesStart.x === 'undefined' && e) { + touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX; + touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY; + } else { + touchX = image.touchesStart.x; + touchY = image.touchesStart.y; + } + + zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + + if (e) { + slideWidth = gesture.$slideEl[0].offsetWidth; + slideHeight = gesture.$slideEl[0].offsetHeight; + offsetX = gesture.$slideEl.offset().left + window.scrollX; + offsetY = gesture.$slideEl.offset().top + window.scrollY; + diffX = offsetX + slideWidth / 2 - touchX; + diffY = offsetY + slideHeight / 2 - touchY; + imageWidth = gesture.$imageEl[0].offsetWidth; + imageHeight = gesture.$imageEl[0].offsetHeight; + scaledWidth = imageWidth * zoom.scale; + scaledHeight = imageHeight * zoom.scale; + translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0); + translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0); + translateMaxX = -translateMinX; + translateMaxY = -translateMinY; + translateX = diffX * zoom.scale; + translateY = diffY * zoom.scale; + + if (translateX < translateMinX) { + translateX = translateMinX; + } + + if (translateX > translateMaxX) { + translateX = translateMaxX; + } + + if (translateY < translateMinY) { + translateY = translateMinY; + } + + if (translateY > translateMaxY) { + translateY = translateMaxY; + } + } else { + translateX = 0; + translateY = 0; + } + + gesture.$imageWrapEl.transition(300).transform(`translate3d(${translateX}px, ${translateY}px,0)`); + gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + } + + function zoomOut() { + const zoom = swiper.zoom; + const params = swiper.params.zoom; + + if (!gesture.$slideEl) { + if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) { + gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`); + } else { + gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + } + + gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('img, svg, canvas, picture, .swiper-zoom-target'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return; + + if (swiper.params.cssMode) { + swiper.wrapperEl.style.overflow = ''; + swiper.wrapperEl.style.touchAction = ''; + } + + zoom.scale = 1; + currentScale = 1; + gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)'); + gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)'); + gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`); + gesture.$slideEl = undefined; + } // Toggle Zoom + + + function zoomToggle(e) { + const zoom = swiper.zoom; + + if (zoom.scale && zoom.scale !== 1) { + // Zoom Out + zoomOut(); + } else { + // Zoom In + zoomIn(e); + } + } + + function getListeners() { + const support = swiper.support; + const passiveListener = swiper.touchEvents.start === 'touchstart' && support.passiveListener && swiper.params.passiveListeners ? { + passive: true, + capture: false + } : false; + const activeListenerWithCapture = support.passiveListener ? { + passive: false, + capture: true + } : true; + return { + passiveListener, + activeListenerWithCapture + }; + } + + function getSlideSelector() { + return `.${swiper.params.slideClass}`; + } + + function toggleGestures(method) { + const { + passiveListener + } = getListeners(); + const slideSelector = getSlideSelector(); + swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener); + swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener); + swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener); + } + + function enableGestures() { + if (gesturesEnabled) return; + gesturesEnabled = true; + toggleGestures('on'); + } + + function disableGestures() { + if (!gesturesEnabled) return; + gesturesEnabled = false; + toggleGestures('off'); + } // Attach/Detach Events + + + function enable() { + const zoom = swiper.zoom; + if (zoom.enabled) return; + zoom.enabled = true; + const support = swiper.support; + const { + passiveListener, + activeListenerWithCapture + } = getListeners(); + const slideSelector = getSlideSelector(); // Scale image + + if (support.gestures) { + swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, onGestureStart, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, onGestureChange, activeListenerWithCapture); + swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener); + + if (swiper.touchEvents.cancel) { + swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, onGestureEnd, passiveListener); + } + } // Move image + + + swiper.$wrapperEl.on(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, onTouchMove, activeListenerWithCapture); + } + + function disable() { + const zoom = swiper.zoom; + if (!zoom.enabled) return; + const support = swiper.support; + zoom.enabled = false; + const { + passiveListener, + activeListenerWithCapture + } = getListeners(); + const slideSelector = getSlideSelector(); // Scale image + + if (support.gestures) { + swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, onGestureStart, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, onGestureChange, activeListenerWithCapture); + swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener); + + if (swiper.touchEvents.cancel) { + swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, onGestureEnd, passiveListener); + } + } // Move image + + + swiper.$wrapperEl.off(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, onTouchMove, activeListenerWithCapture); + } + + on('init', () => { + if (swiper.params.zoom.enabled) { + enable(); + } + }); + on('destroy', () => { + disable(); + }); + on('touchStart', (_s, e) => { + if (!swiper.zoom.enabled) return; + onTouchStart(e); + }); + on('touchEnd', (_s, e) => { + if (!swiper.zoom.enabled) return; + onTouchEnd(e); + }); + on('doubleTap', (_s, e) => { + if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) { + zoomToggle(e); + } + }); + on('transitionEnd', () => { + if (swiper.zoom.enabled && swiper.params.zoom.enabled) { + onTransitionEnd(); + } + }); + on('slideChange', () => { + if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) { + onTransitionEnd(); + } + }); + Object.assign(swiper.zoom, { + enable, + disable, + in: zoomIn, + out: zoomOut, + toggle: zoomToggle + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.less b/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.less new file mode 100644 index 0000000..fdbea05 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.less @@ -0,0 +1,20 @@ +.swiper-zoom-container { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + text-align: center; + + > img, + > svg, + > canvas { + max-width: 100%; + max-height: 100%; + object-fit: contain; + } +} + +.swiper-slide-zoomed { + cursor: move; +} diff --git a/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.min.css b/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.min.css new file mode 100644 index 0000000..f40e581 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.min.css @@ -0,0 +1 @@ +.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.scss b/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.scss new file mode 100644 index 0000000..fdbea05 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/modules/zoom/zoom.scss @@ -0,0 +1,20 @@ +.swiper-zoom-container { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + text-align: center; + + > img, + > svg, + > canvas { + max-width: 100%; + max-height: 100%; + object-fit: contain; + } +} + +.swiper-slide-zoomed { + cursor: move; +} diff --git a/src/main/resources/static/assets/js/swiper/node_modules/dom7/LICENSE b/src/main/resources/static/assets/js/swiper/node_modules/dom7/LICENSE new file mode 100644 index 0000000..e7e872c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/dom7/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Vladimir Kharlampidi + +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/src/main/resources/static/assets/js/swiper/node_modules/dom7/README.md b/src/main/resources/static/assets/js/swiper/node_modules/dom7/README.md new file mode 100644 index 0000000..8b28ad2 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/dom7/README.md @@ -0,0 +1,47 @@ +# Dom7 + +### Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API + +Dom7 - is the default DOM manipulation library built-in [Framework7](https://framework7.io). It utilizes most edge and high-performance methods for DOM manipulation. You don’t need to learn something new, its usage is very simple because it has the same syntax as well known jQuery library with support of the most popular and widely used methods and jQuery-like chaining. + +See [Framework7 Dom7](https://framework7.io/docs/dom7.html) documentation for usage examples and available methods. + +## Installation + +Dom7 can be installed with NPM: + +``` +npm install dom7 --save +``` + +## Usage + +```js +// import Dom7 and methods you need +import { $, addClass, removeClass, toggleClass, on } from 'dom7'; + +// install methods +$.fn.addClass = addClass; +$.fn.removeClass = removeClass; +$.fn.toggleClass = toggleClass; +$.fn.on = on; + +// use +$('p').addClass('custom-paragraph'); + +$('p').on('click', function() { + $(this).toggleClass('custom-paragraph'); +}); +``` + +## Documentation + +See [full documenation here](https://framework7.io/docs/dom7.html) + +## Contribution + +Yes please! See the [contributing guidelines](https://github.com/nolimits4web/dom7/blob/master/CONTRIBUTING.md) for details. + +## Licence + +This project is licensed under the terms of the [MIT license](https://github.com/nolimits4web/dom7/blob/master/LICENSE). diff --git a/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.d.ts b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.d.ts new file mode 100644 index 0000000..1815f3d --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.d.ts @@ -0,0 +1,628 @@ +export interface Dom7Array { + /* ====== DEFAULT ARRAY METHODS ====== */ + /** + * Gets or sets the length of the array. This is a number one higher than the highest element defined in an array. + */ + length: number; + + /** + * Removes the last element from an array and returns it. + */ + pop(): Element | undefined; + /** + * Appends new elements to an array, and returns the new length of the array. + * @param items New elements of the Array. + */ + push(...items: Element[]): number; + /** + * Combines two or more arrays. + * @param items Additional items to add to the end of array1. + */ + concat(...items: ConcatArray[]): Element[]; + /** + * Combines two or more arrays. + * @param items Additional items to add to the end of array1. + */ + concat(...items: (Element | ConcatArray)[]): Element[]; + /** + * Adds all the elements of an array separated by the specified separator string. + * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma. + */ + join(separator?: string): string; + /** + * Reverses the elements in an Array. + */ + reverse(): Element[]; + /** + * Removes the first element from an array and returns it. + */ + shift(): Element | undefined; + /** + * Returns a section of an array. + * @param start The beginning of the specified portion of the array. + * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'. + */ + slice(start?: number, end?: number): Element[]; + /** + * Sorts an array. + * @param compareFn Function used to determine the order of the elements. It is expected to return + * a negative value if first argument is less than second argument, zero if they're equal and a positive + * value otherwise. If omitted, the elements are sorted in ascending, ASCII character order. + * ```ts + * [11,2,22,1].sort((a, b) => a - b) + * ``` + */ + sort(compareFn?: (a: Element, b: Element) => number): this; + /** + * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements. + * @param start The zero-based location in the array from which to start removing elements. + * @param deleteCount The number of elements to remove. + */ + splice(start: number, deleteCount?: number): Element[]; + /** + * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements. + * @param start The zero-based location in the array from which to start removing elements. + * @param deleteCount The number of elements to remove. + * @param items Elements to insert into the array in place of the deleted elements. + */ + splice(start: number, deleteCount: number, ...items: Element[]): Element[]; + /** + * Inserts new elements at the start of an array. + * @param items Elements to insert at the start of the Array. + */ + unshift(...items: Element[]): number; + /** + * Returns the index of the first occurrence of a value in an array. + * @param searchElement The value to locate in the array. + * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0. + */ + indexOf(searchElement: Element, fromIndex?: number): number; + /** + * Returns the index of the last occurrence of a specified value in an array. + * @param searchElement The value to locate in the array. + * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array. + */ + lastIndexOf(searchElement: Element, fromIndex?: number): number; + /** + * Determines whether all the members of an array satisfy the specified test. + * @param callbackfn A function that accepts up to three arguments. The every method calls + * the callbackfn function for each element in the array until the callbackfn returns a value + * which is coercible to the Boolean value false, or until the end of the array. + * @param thisArg An object to which the this keyword can refer in the callbackfn function. + * If thisArg is omitted, undefined is used as the this value. + */ + every( + callbackfn: (value: Element, index: number, array: Element[]) => unknown, + thisArg?: any, + ): boolean; + /** + * Determines whether the specified callback function returns true for any element of an array. + * @param callbackfn A function that accepts up to three arguments. The some method calls + * the callbackfn function for each element in the array until the callbackfn returns a value + * which is coercible to the Boolean value true, or until the end of the array. + * @param thisArg An object to which the this keyword can refer in the callbackfn function. + * If thisArg is omitted, undefined is used as the this value. + */ + some( + callbackfn: (value: Element, index: number, array: Element[]) => unknown, + thisArg?: any, + ): boolean; + /** + * Performs the specified action for each element in an array. + * @param callbackfn A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array. + * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value. + */ + forEach( + callbackfn: (value: Element, index: number, array: Element[]) => void, + thisArg?: any, + ): void; + /** + * Calls a defined callback function on each element of an array, and returns an array that contains the results. + * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array. + * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value. + */ + map( + callbackfn: (value: Element, index: number, array: Element[]) => U, + thisArg?: any, + ): U[]; + + /* ====== DOM7 ARRAY METHODS ====== */ + + /** Retrieve one of the elements matched by the Dom7Array object (jQuery syntax). **/ + [index: number]: Element; + + // CLASSES + /** Add class to elements */ + addClass(className: string): Dom7Array; + /** Remove specified class */ + removeClass(className: string): Dom7Array; + /** Determine whether any of the matched elements are assigned the given class */ + hasClass(className: string): Dom7Array; + /** Remove (if class is present) or add (if not) one or more classes from each element in the set of matched elements */ + toggleClass(className: string): Dom7Array; + + // ATTRIBUTES AND PROPERTIES + /** Get property value */ + prop(propName: string): any; + /** Set single property value */ + prop(propName: string, propValue: any): Dom7Array; + /** Set multiple properties */ + prop(propertiesObject: any): Dom7Array; + /** Get attribute value */ + attr(attrName: string): string; + /** Set single attribute value */ + attr(attrName: string, attrValue: string): Dom7Array; + /** Set multiple attributes */ + attr(attributesObject: any): Dom7Array; + /** Remove specified attribute */ + removeAttr(attrName: string): Dom7Array; + /** Get the current value of the first element in the set of matched elements */ + val(): any; + /** Set the value of every matched element */ + val(newValue: any): Dom7Array; + + // DATA + /** Store arbitrary data associated with the matched elements */ + data(key: string, value: any): Dom7Array; + /** Return the value at the named data store for the first element in the collection, as set by data(key, value) or by an HTML5 data-* attribute */ + data(key: string): any; + /** Remove specified data */ + removeData(key: string): void; + /** Returns element's data set (set of data- attributes) as plain Object */ + dataset(): any; + + // CSS TRASFORMS, TRANSITIONS + /** Adds prefixed CSS transform property */ + transform(CSSTransformString: string): Dom7Array; + /** Set CSS transition-duration property to collection */ + transition(transitionDuration: number): Dom7Array; + + // EVENTS + /** Add event handler function to one or more events to the selected elements */ + on( + eventName: string, + handler: (event: Event) => void, + useCapture?: boolean, + ): Dom7Array; + /** Live/delegated event handler */ + on( + eventName: string, + delegatedTarget: string, + handler: (event: Event) => void, + useCapture?: boolean, + ): Dom7Array; + /** Add event handler function to one or more events to the selected elements that will be executed only once */ + once( + eventName: string, + handler: (event: Event) => void, + useCapture?: boolean, + ): Dom7Array; + /** Live/delegated event handler that will be executed only once */ + once( + eventName: string, + delegatedTarget: string, + handler: (event: Event) => void, + useCapture?: boolean, + ): Dom7Array; + /** Remove event handler */ + off( + eventName: string, + handler: (event: Event) => void, + useCapture?: boolean, + ): Dom7Array; + /** Remove live/delegated event handler */ + off( + eventName: string, + delegatedTarget: string, + handler: (event: Event) => void, + useCapture?: boolean, + ): Dom7Array; + /** Execute all handlers added to the matched elements for the specified event */ + trigger(eventName: string, eventData?: any): Dom7Array; + /** Adds transitionEnd event handler to collection */ + transitionEnd(callback: () => void): Dom7Array; + /** Adds animationEnd event handler to collection */ + animationEnd(callback: () => void): Dom7Array; + + // STYLES + /** Get the current computed width for the first element in the set of matched elements */ + width(): number; + /** Set width for the first element in the set of matched elements */ + width(value: string | number): Dom7Array; + /** Get the current computed width for the first element in the set of matched elements, including padding and border, and margin (if includeMargin is true) */ + outerWidth(includeMargin?: boolean): number; + /** Set width for the first element in the set of matched elements, including padding and border, and margin (if includeMargin is true) */ + outerWidth(value: string | number): Dom7Array; + /** Get the current computed height for the first element in the set of matched elements */ + height(): number; + /** Set height for the first element in the set of matched elements */ + height(value: string | number): Dom7Array; + /** Get the current computed height for the first element in the set of matched elements, including padding and border, and margin (if includeMargin is true) */ + outerHeight(includeMargin?: boolean): number; + /** Set height for the first element in the set of matched elements, including padding and border, and margin (if includeMargin is true) */ + outerHeight(value: string | number): Dom7Array; + /** Get the current coordinates of the first element relative to the document */ + offset(): { top: number; left: number }; + /** Set the coordinates of the first element relative to the document */ + offset(value: string | number): Dom7Array; + /** Set "display:none" to the matched elements */ + hide(): void; + /** Set "display:block" to the matched elements */ + show(): void; + /** Get value of specified CSS property for the first element */ + css(property: string): string | number; + /** Set specified CSS property to the matched elements */ + css(property: string, value: string | number): Dom7Array; + /** Set multiple CSS properties to the matched elements */ + css(propertiesObject: any): Dom7Array; + + // SCROLL + /** Get scrollTop position of element */ + scrollTop(): number; + /** Set scrollTop "position" with animation during "duration" (in ms). Scroll top position will be set immediately if duration is not specified. If you have specified "callback" function, then it will be executed after scrolling completed */ + scrollTop( + position: number, + duration?: number, + callback?: () => void, + ): Dom7Array; + /** Get scrollLeft position of element */ + scrollLeft(): number; + /** Set scrollLeft "position" with animation during "duration" (in ms). Scroll left postion will be set immediately if duration is not specified. If you have specified "callback" function, then it will be executed after scrolling completed */ + scrollLeft( + position: number, + duration?: number, + callback?: () => void, + ): Dom7Array; + /** Set scroll left and scroll top with animation during "duration" (in ms). Scroll postion will be set immediately if duration is not specified. If you have specified "callback" function, then it will be executed after scrolling completed */ + scrollTo( + left: number, + top: number, + duration?: number, + callback?: () => void, + ): Dom7Array; + + // DOM MANIPULATION + /** Add HTML element to the set of matched elements */ + add(html: string): Dom7Array; + /** Create a new Dom7Array collection with elements added to the set of matched elements */ + add(...elements: Array): Dom7Array; + /** Iterate over collection, executing a callback function for each matched element */ + each(callback: (element: any, index: number) => void): Dom7Array; + /** Get the HTML contents of the first element in the set of matched elements */ + html(): string; + /** Set the HTML contents of every matched element */ + html(newInnerHTML: string): Dom7Array; + /** Get the text contents of the first element in the set of matched elements */ + text(): string; + /** Set the text contents of every matched element */ + text(newTextContent: string): Dom7Array; + /** `.is(CSSSelector)` : + * Check the current matched set of elements against CSS selector + * + * `.is(HTMLElement)` : + * Check the current matched set of elements against HTML element or Dom7Array collection + * */ + is(CSSSelector: string | Element | Dom7Array): boolean; + /** Return the position of the first element within the Dom7Array collection relative to its sibling elements */ + index(): number; + /** Reduce the set of matched elements to the one at the specified index */ + eq(index: number): Dom7Array; + /** `.append(HTMLString)` : + * Insert content, specified by the parameter, to the end of each element in the set of matched elements + * + * `.append(HTMLElement)` : + * Insert specified HTML element to the end of element in the set of matched elements + * */ + append(element: string | Element | Dom7Array): Dom7Array; + /** Insert content/elements, to the end of element specified in parameter */ + appendTo(element: string | Element | Dom7Array): Dom7Array; + /** `.prepend(newHTML)` : + * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements + * + * `.prepend(HTMLElement)` : + * Insert specified HTML element to the beginning of element in the set of matched elements + * */ + prepend(element: string | Element | Dom7Array): Dom7Array; + /** Insert content/elements, to the beginning of element specified in parameter */ + prependTo(element: string | Element | Dom7Array): Dom7Array; + /** Insert every element in the set of matched elements before the target. Target could be specified as CSS selector or HTML element or Dom7Array collection */ + insertBefore(element: string | Element | Dom7Array): Dom7Array; + /** Insert every element in the set of matched elements after the target. Target could be specified as CSS selector or HTML element or Dom7Array collection */ + insertAfter(element: string | Element | Dom7Array): Dom7Array; + /** Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector */ + next(selector?: string): Dom7Array; + /** Get all following siblings of each element in the set of matched elements, optionally filtered by a selector */ + nextAll(selector?: string): Dom7Array; + /** Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector */ + prev(selector?: string): Dom7Array; + /** Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector */ + prevAll(selector?: string): Dom7Array; + /** Get the siblings of each element in the set of matched elements, optionally filtered by a selector */ + siblings(selector?: string): Dom7Array; + /** Get the first parent of each element in the current set of matched elements, optionally filtered by a selector */ + parent(selector?: string): Dom7Array; + /** Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector */ + parents(selector?: string): Dom7Array; + /** For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree */ + closest(selector?: string): Dom7Array; + /** Get the descendants of each element in the current set of matched elements, filtered by a selector */ + find(selector?: string): Dom7Array; + /** Get the children of each element in the set of matched elements, optionally filtered by a selector */ + children(selector?: string): Dom7Array; + /** Filter collection of elements */ + filter(callback: (element: any, index: number) => boolean): Dom7Array; + /** Remove/detach matched elements from the Dom */ + remove(): Dom7Array; + /** Remove all child nodes of the set of matched elements from the DOM. Alias for `.html('')` */ + empty(): Dom7Array; + + // SHORTCUTS + /** Trigger "click" event on collection */ + click(): Dom7Array; + /** Add "click" event handler to collection */ + click(handler: (event: Event) => void): Dom7Array; + /** Trigger "blur" event on collection */ + blur(): Dom7Array; + /** Add "blur" event handler to collection */ + blur(handler: (event: Event) => void): Dom7Array; + /** Trigger "focus" event on collection */ + focus(): Dom7Array; + /** Add "focus" event handler to collection */ + focus(handler: (event: Event) => void): Dom7Array; + /** Trigger "focusin" event on collection */ + focusin(): Dom7Array; + /** Add "focusin" event handler to collection */ + focusin(handler: (event: Event) => void): Dom7Array; + /** Trigger "focusout" event on collection */ + focusout(): Dom7Array; + /** Add "focusout" event handler to collection */ + focusout(handler: (event: Event) => void): Dom7Array; + /** Trigger "keyup" event on collection */ + keyup(): Dom7Array; + /** Add "keyup" event handler to collection */ + keyup(handler: (event: Event) => void): Dom7Array; + /** Trigger "keydown" event on collection */ + keydown(): Dom7Array; + /** Add "keydown" event handler to collection */ + keydown(handler: (event: Event) => void): Dom7Array; + /** Trigger "keypress" event on collection */ + keypress(): Dom7Array; + /** Add "keypress" event handler to collection */ + keypress(handler: (event: Event) => void): Dom7Array; + /** Trigger "submit" event on collection */ + submit(): Dom7Array; + /** Add "submit" event handler to collection */ + submit(handler: (event: Event) => void): Dom7Array; + /** Trigger "change" event on collection */ + change(): Dom7Array; + /** Add "change" event handler to collection */ + change(handler: (event: Event) => void): Dom7Array; + /** Trigger "mousedown" event on collection */ + mousedown(): Dom7Array; + /** Add "mousedown" event handler to collection */ + mousedown(handler: (event: Event) => void): Dom7Array; + /** Trigger "mousemove" event on collection */ + mousemove(): Dom7Array; + /** Add "mousemove" event handler to collection */ + mousemove(handler: (event: Event) => void): Dom7Array; + /** Trigger "mouseup" event on collection */ + mouseup(): Dom7Array; + /** Add "mouseup" event handler to collection */ + mouseup(handler: (event: Event) => void): Dom7Array; + /** Trigger "mouseenter" event on collection */ + mouseenter(): Dom7Array; + /** Add "mouseenter" event handler to collection */ + mouseenter(handler: (event: Event) => void): Dom7Array; + /** Trigger "mouseleave" event on collection */ + mouseleave(): Dom7Array; + /** Add "mouseleave" event handler to collection */ + mouseleave(handler: (event: Event) => void): Dom7Array; + /** Trigger "mouseout" event on collection */ + mouseout(): Dom7Array; + /** Add "mouseout" event handler to collection */ + mouseout(handler: (event: Event) => void): Dom7Array; + /** Trigger "mouseover" event on collection */ + mouseover(): Dom7Array; + /** Add "mouseover" event handler to collection */ + mouseover(handler: (event: Event) => void): Dom7Array; + /** Trigger "touchstart" event on collection */ + touchstart(): Dom7Array; + /** Add "touchstart" event handler to collection */ + touchstart(handler: (event: Event) => void): Dom7Array; + /** Trigger "touchend" event on collection */ + touchend(): Dom7Array; + /** Add "touchend" event handler to collection */ + touchend(handler: (event: Event) => void): Dom7Array; + /** Trigger "touchmove" event on collection */ + touchmove(): Dom7Array; + /** Add "touchmove" event handler to collection */ + touchmove(handler: (event: Event) => void): Dom7Array; + /** Add "resize" event handler to collection */ + resize(handler: (event: Event) => void): Dom7Array; + /** Add "scroll" event handler to collection */ + scroll(handler: (event: Event) => void): Dom7Array; + /** Perform a custom animation of a set of CSS properties */ + animate(properties: any, parameters: any): Dom7Array; +} + +export interface Dom7 { + (): Dom7Array; + (selector: string, context?: Element | Dom7Array): Dom7Array; + (element: Element): Dom7Array; + (element: Document): Dom7Array; + (elementArray: Element[]): Dom7Array; + (event: EventTarget): Dom7Array; + fn: any; +} + +declare const Dom7: Dom7; + +declare const add: () => void; +declare const addClass: () => void; +declare const animate: () => void; +declare const animationEnd: () => void; +declare const append: () => void; +declare const appendTo: () => void; +declare const attr: () => void; +declare const blur: () => void; +declare const change: () => void; +declare const children: () => void; +declare const click: () => void; +declare const closest: () => void; +declare const css: () => void; +declare const data: () => void; +declare const dataset: () => void; +declare const detach: () => void; +declare const each: () => void; +declare const empty: () => void; +declare const eq: () => void; +declare const filter: () => void; +declare const find: () => void; +declare const focus: () => void; +declare const focusin: () => void; +declare const focusout: () => void; +declare const hasClass: () => void; +declare const height: () => void; +declare const hide: () => void; +declare const html: () => void; +declare const insertAfter: () => void; +declare const insertBefore: () => void; +declare const is: () => void; +declare const keydown: () => void; +declare const keypress: () => void; +declare const keyup: () => void; +declare const mousedown: () => void; +declare const mouseenter: () => void; +declare const mouseleave: () => void; +declare const mousemove: () => void; +declare const mouseout: () => void; +declare const mouseover: () => void; +declare const mouseup: () => void; +declare const next: () => void; +declare const nextAll: () => void; +declare const off: () => void; +declare const offset: () => void; +declare const on: () => void; +declare const once: () => void; +declare const outerHeight: () => void; +declare const outerWidth: () => void; +declare const parent: () => void; +declare const parents: () => void; +declare const prepend: () => void; +declare const prependTo: () => void; +declare const prev: () => void; +declare const prevAll: () => void; +declare const prop: () => void; +declare const remove: () => void; +declare const removeAttr: () => void; +declare const removeClass: () => void; +declare const removeData: () => void; +declare const resize: () => void; +declare const scroll: () => void; +declare const scrollLeft: () => void; +declare const scrollTo: () => void; +declare const scrollTop: () => void; +declare const show: () => void; +declare const siblings: () => void; +declare const stop: () => void; +declare const styles: () => void; +declare const submit: () => void; +declare const text: () => void; +declare const toggleClass: () => void; +declare const touchend: () => void; +declare const touchmove: () => void; +declare const touchstart: () => void; +declare const transform: () => void; +declare const transition: () => void; +declare const transitionEnd: () => void; +declare const trigger: () => void; +declare const val: () => void; +declare const value: () => void; +declare const width: () => void; + +export { + Dom7 as $, + add, + addClass, + animate, + animationEnd, + append, + appendTo, + attr, + blur, + change, + children, + click, + closest, + css, + data, + dataset, + detach, + each, + empty, + eq, + filter, + find, + focus, + focusin, + focusout, + hasClass, + height, + hide, + html, + insertAfter, + insertBefore, + is, + keydown, + keypress, + keyup, + mousedown, + mouseenter, + mouseleave, + mousemove, + mouseout, + mouseover, + mouseup, + next, + nextAll, + off, + offset, + on, + once, + outerHeight, + outerWidth, + parent, + parents, + prepend, + prependTo, + prev, + prevAll, + prop, + remove, + removeAttr, + removeClass, + removeData, + resize, + scroll, + scrollLeft, + scrollTo, + scrollTop, + show, + siblings, + stop, + styles, + submit, + text, + toggleClass, + touchend, + touchmove, + touchstart, + transform, + transition, + transitionEnd, + trigger, + val, + value, + width, +}; +export default Dom7; diff --git a/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.esm.js b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.esm.js new file mode 100644 index 0000000..96a5881 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.esm.js @@ -0,0 +1,1478 @@ +/** + * Dom7 4.0.1 + * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API + * https://framework7.io/docs/dom7.html + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ +import { getWindow, getDocument } from 'ssr-window'; + +/* eslint-disable no-proto */ +function makeReactive(obj) { + const proto = obj.__proto__; + Object.defineProperty(obj, '__proto__', { + get() { + return proto; + }, + + set(value) { + proto.__proto__ = value; + } + + }); +} + +class Dom7 extends Array { + constructor(items) { + super(...(items || [])); + makeReactive(this); + } + +} + +function arrayFlat(arr = []) { + const res = []; + arr.forEach(el => { + if (Array.isArray(el)) { + res.push(...arrayFlat(el)); + } else { + res.push(el); + } + }); + return res; +} +function arrayFilter(arr, callback) { + return Array.prototype.filter.call(arr, callback); +} +function arrayUnique(arr) { + const uniqueArray = []; + + for (let i = 0; i < arr.length; i += 1) { + if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]); + } + + return uniqueArray; +} +function toCamelCase(string) { + return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase()); +} + +// eslint-disable-next-line + +function qsa(selector, context) { + if (typeof selector !== 'string') { + return [selector]; + } + + const a = []; + const res = context.querySelectorAll(selector); + + for (let i = 0; i < res.length; i += 1) { + a.push(res[i]); + } + + return a; +} + +function $(selector, context) { + const window = getWindow(); + const document = getDocument(); + let arr = []; + + if (!context && selector instanceof Dom7) { + return selector; + } + + if (!selector) { + return new Dom7(arr); + } + + if (typeof selector === 'string') { + const html = selector.trim(); + + if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) { + let toCreate = 'div'; + if (html.indexOf(' c.split(' '))); + this.forEach(el => { + el.classList.add(...classNames); + }); + return this; +} + +function removeClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + this.forEach(el => { + el.classList.remove(...classNames); + }); + return this; +} + +function toggleClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + this.forEach(el => { + classNames.forEach(className => { + el.classList.toggle(className); + }); + }); +} + +function hasClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + return arrayFilter(this, el => { + return classNames.filter(className => el.classList.contains(className)).length > 0; + }).length > 0; +} + +function attr(attrs, value) { + if (arguments.length === 1 && typeof attrs === 'string') { + // Get attr + if (this[0]) return this[0].getAttribute(attrs); + return undefined; + } // Set attrs + + + for (let i = 0; i < this.length; i += 1) { + if (arguments.length === 2) { + // String + this[i].setAttribute(attrs, value); + } else { + // Object + for (const attrName in attrs) { + this[i][attrName] = attrs[attrName]; + this[i].setAttribute(attrName, attrs[attrName]); + } + } + } + + return this; +} + +function removeAttr(attr) { + for (let i = 0; i < this.length; i += 1) { + this[i].removeAttribute(attr); + } + + return this; +} + +function prop(props, value) { + if (arguments.length === 1 && typeof props === 'string') { + // Get prop + if (this[0]) return this[0][props]; + } else { + // Set props + for (let i = 0; i < this.length; i += 1) { + if (arguments.length === 2) { + // String + this[i][props] = value; + } else { + // Object + for (const propName in props) { + this[i][propName] = props[propName]; + } + } + } + + return this; + } + + return this; +} + +function data(key, value) { + let el; + + if (typeof value === 'undefined') { + el = this[0]; + if (!el) return undefined; // Get value + + if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) { + return el.dom7ElementDataStorage[key]; + } + + const dataKey = el.getAttribute(`data-${key}`); + + if (dataKey) { + return dataKey; + } + + return undefined; + } // Set value + + + for (let i = 0; i < this.length; i += 1) { + el = this[i]; + if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {}; + el.dom7ElementDataStorage[key] = value; + } + + return this; +} + +function removeData(key) { + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) { + el.dom7ElementDataStorage[key] = null; + delete el.dom7ElementDataStorage[key]; + } + } +} + +function dataset() { + const el = this[0]; + if (!el) return undefined; + const dataset = {}; // eslint-disable-line + + if (el.dataset) { + for (const dataKey in el.dataset) { + dataset[dataKey] = el.dataset[dataKey]; + } + } else { + for (let i = 0; i < el.attributes.length; i += 1) { + const attr = el.attributes[i]; + + if (attr.name.indexOf('data-') >= 0) { + dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value; + } + } + } + + for (const key in dataset) { + if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1; + } + + return dataset; +} + +function val(value) { + if (typeof value === 'undefined') { + // get value + const el = this[0]; + if (!el) return undefined; + + if (el.multiple && el.nodeName.toLowerCase() === 'select') { + const values = []; + + for (let i = 0; i < el.selectedOptions.length; i += 1) { + values.push(el.selectedOptions[i].value); + } + + return values; + } + + return el.value; + } // set value + + + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') { + for (let j = 0; j < el.options.length; j += 1) { + el.options[j].selected = value.indexOf(el.options[j].value) >= 0; + } + } else { + el.value = value; + } + } + + return this; +} + +function value(value) { + return this.val(value); +} + +function transform(transform) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transform = transform; + } + + return this; +} + +function transition(duration) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration; + } + + return this; +} + +function on(...args) { + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + + function handleLiveEvent(e) { + const target = e.target; + if (!target) return; + const eventData = e.target.dom7EventData || []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + if ($(target).is(targetSelector)) listener.apply(target, eventData);else { + const parents = $(target).parents(); // eslint-disable-line + + for (let k = 0; k < parents.length; k += 1) { + if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData); + } + } + } + + function handleEvent(e) { + const eventData = e && e.target ? e.target.dom7EventData || [] : []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + listener.apply(this, eventData); + } + + const events = eventType.split(' '); + let j; + + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (!targetSelector) { + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7Listeners) el.dom7Listeners = {}; + if (!el.dom7Listeners[event]) el.dom7Listeners[event] = []; + el.dom7Listeners[event].push({ + listener, + proxyListener: handleEvent + }); + el.addEventListener(event, handleEvent, capture); + } + } else { + // Live events + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7LiveListeners) el.dom7LiveListeners = {}; + if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = []; + el.dom7LiveListeners[event].push({ + listener, + proxyListener: handleLiveEvent + }); + el.addEventListener(event, handleLiveEvent, capture); + } + } + } + + return this; +} + +function off(...args) { + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + const events = eventType.split(' '); + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + let handlers; + + if (!targetSelector && el.dom7Listeners) { + handlers = el.dom7Listeners[event]; + } else if (targetSelector && el.dom7LiveListeners) { + handlers = el.dom7LiveListeners[event]; + } + + if (handlers && handlers.length) { + for (let k = handlers.length - 1; k >= 0; k -= 1) { + const handler = handlers[k]; + + if (listener && handler.listener === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (!listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } + } + } + } + } + + return this; +} + +function once(...args) { + const dom = this; + let [eventName, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventName, listener, capture] = args; + targetSelector = undefined; + } + + function onceHandler(...eventArgs) { + listener.apply(this, eventArgs); + dom.off(eventName, targetSelector, onceHandler, capture); + + if (onceHandler.dom7proxy) { + delete onceHandler.dom7proxy; + } + } + + onceHandler.dom7proxy = listener; + return dom.on(eventName, targetSelector, onceHandler, capture); +} + +function trigger(...args) { + const window = getWindow(); + const events = args[0].split(' '); + const eventData = args[1]; + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + + if (window.CustomEvent) { + const evt = new window.CustomEvent(event, { + detail: eventData, + bubbles: true, + cancelable: true + }); + el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0); + el.dispatchEvent(evt); + el.dom7EventData = []; + delete el.dom7EventData; + } + } + } + + return this; +} + +function transitionEnd(callback) { + const dom = this; + + function fireCallBack(e) { + if (e.target !== this) return; + callback.call(this, e); + dom.off('transitionend', fireCallBack); + } + + if (callback) { + dom.on('transitionend', fireCallBack); + } + + return this; +} + +function animationEnd(callback) { + const dom = this; + + function fireCallBack(e) { + if (e.target !== this) return; + callback.call(this, e); + dom.off('animationend', fireCallBack); + } + + if (callback) { + dom.on('animationend', fireCallBack); + } + + return this; +} + +function width() { + const window = getWindow(); + + if (this[0] === window) { + return window.innerWidth; + } + + if (this.length > 0) { + return parseFloat(this.css('width')); + } + + return null; +} + +function outerWidth(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left')); + } + + return this[0].offsetWidth; + } + + return null; +} + +function height() { + const window = getWindow(); + + if (this[0] === window) { + return window.innerHeight; + } + + if (this.length > 0) { + return parseFloat(this.css('height')); + } + + return null; +} + +function outerHeight(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom')); + } + + return this[0].offsetHeight; + } + + return null; +} + +function offset() { + if (this.length > 0) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + const box = el.getBoundingClientRect(); + const body = document.body; + const clientTop = el.clientTop || body.clientTop || 0; + const clientLeft = el.clientLeft || body.clientLeft || 0; + const scrollTop = el === window ? window.scrollY : el.scrollTop; + const scrollLeft = el === window ? window.scrollX : el.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft + }; + } + + return null; +} + +function hide() { + for (let i = 0; i < this.length; i += 1) { + this[i].style.display = 'none'; + } + + return this; +} + +function show() { + const window = getWindow(); + + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (el.style.display === 'none') { + el.style.display = ''; + } + + if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') { + // Still not visible + el.style.display = 'block'; + } + } + + return this; +} + +function styles() { + const window = getWindow(); + if (this[0]) return window.getComputedStyle(this[0], null); + return {}; +} + +function css(props, value) { + const window = getWindow(); + let i; + + if (arguments.length === 1) { + if (typeof props === 'string') { + // .css('width') + if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props); + } else { + // .css({ width: '100px' }) + for (i = 0; i < this.length; i += 1) { + for (const prop in props) { + this[i].style[prop] = props[prop]; + } + } + + return this; + } + } + + if (arguments.length === 2 && typeof props === 'string') { + // .css('width', '100px') + for (i = 0; i < this.length; i += 1) { + this[i].style[props] = value; + } + + return this; + } + + return this; +} + +function each(callback) { + if (!callback) return this; + this.forEach((el, index) => { + callback.apply(el, [el, index]); + }); + return this; +} + +function filter(callback) { + const result = arrayFilter(this, callback); + return $(result); +} + +function html(html) { + if (typeof html === 'undefined') { + return this[0] ? this[0].innerHTML : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].innerHTML = html; + } + + return this; +} + +function text(text) { + if (typeof text === 'undefined') { + return this[0] ? this[0].textContent.trim() : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].textContent = text; + } + + return this; +} + +function is(selector) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + let compareWith; + let i; + if (!el || typeof selector === 'undefined') return false; + + if (typeof selector === 'string') { + if (el.matches) return el.matches(selector); + if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector); + if (el.msMatchesSelector) return el.msMatchesSelector(selector); + compareWith = $(selector); + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + if (selector === document) { + return el === document; + } + + if (selector === window) { + return el === window; + } + + if (selector.nodeType || selector instanceof Dom7) { + compareWith = selector.nodeType ? [selector] : selector; + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + return false; +} + +function index() { + let child = this[0]; + let i; + + if (child) { + i = 0; // eslint-disable-next-line + + while ((child = child.previousSibling) !== null) { + if (child.nodeType === 1) i += 1; + } + + return i; + } + + return undefined; +} + +function eq(index) { + if (typeof index === 'undefined') return this; + const length = this.length; + + if (index > length - 1) { + return $([]); + } + + if (index < 0) { + const returnIndex = length + index; + if (returnIndex < 0) return $([]); + return $([this[returnIndex]]); + } + + return $([this[index]]); +} + +function append(...els) { + let newChild; + const document = getDocument(); + + for (let k = 0; k < els.length; k += 1) { + newChild = els[k]; + + for (let i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + + while (tempDiv.firstChild) { + this[i].appendChild(tempDiv.firstChild); + } + } else if (newChild instanceof Dom7) { + for (let j = 0; j < newChild.length; j += 1) { + this[i].appendChild(newChild[j]); + } + } else { + this[i].appendChild(newChild); + } + } + } + + return this; +} + +function appendTo(parent) { + $(parent).append(this); + return this; +} + +function prepend(newChild) { + const document = getDocument(); + let i; + let j; + + for (i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + + for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) { + this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); + } + } else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j += 1) { + this[i].insertBefore(newChild[j], this[i].childNodes[0]); + } + } else { + this[i].insertBefore(newChild, this[i].childNodes[0]); + } + } + + return this; +} + +function prependTo(parent) { + $(parent).prepend(this); + return this; +} + +function insertBefore(selector) { + const before = $(selector); + + for (let i = 0; i < this.length; i += 1) { + if (before.length === 1) { + before[0].parentNode.insertBefore(this[i], before[0]); + } else if (before.length > 1) { + for (let j = 0; j < before.length; j += 1) { + before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]); + } + } + } +} + +function insertAfter(selector) { + const after = $(selector); + + for (let i = 0; i < this.length; i += 1) { + if (after.length === 1) { + after[0].parentNode.insertBefore(this[i], after[0].nextSibling); + } else if (after.length > 1) { + for (let j = 0; j < after.length; j += 1) { + after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling); + } + } + } +} + +function next(selector) { + if (this.length > 0) { + if (selector) { + if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) { + return $([this[0].nextElementSibling]); + } + + return $([]); + } + + if (this[0].nextElementSibling) return $([this[0].nextElementSibling]); + return $([]); + } + + return $([]); +} + +function nextAll(selector) { + const nextEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.nextElementSibling) { + const next = el.nextElementSibling; // eslint-disable-line + + if (selector) { + if ($(next).is(selector)) nextEls.push(next); + } else nextEls.push(next); + + el = next; + } + + return $(nextEls); +} + +function prev(selector) { + if (this.length > 0) { + const el = this[0]; + + if (selector) { + if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) { + return $([el.previousElementSibling]); + } + + return $([]); + } + + if (el.previousElementSibling) return $([el.previousElementSibling]); + return $([]); + } + + return $([]); +} + +function prevAll(selector) { + const prevEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.previousElementSibling) { + const prev = el.previousElementSibling; // eslint-disable-line + + if (selector) { + if ($(prev).is(selector)) prevEls.push(prev); + } else prevEls.push(prev); + + el = prev; + } + + return $(prevEls); +} + +function siblings(selector) { + return this.nextAll(selector).add(this.prevAll(selector)); +} + +function parent(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode !== null) { + if (selector) { + if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode); + } else { + parents.push(this[i].parentNode); + } + } + } + + return $(parents); +} + +function parents(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + let parent = this[i].parentNode; // eslint-disable-line + + while (parent) { + if (selector) { + if ($(parent).is(selector)) parents.push(parent); + } else { + parents.push(parent); + } + + parent = parent.parentNode; + } + } + + return $(parents); +} + +function closest(selector) { + let closest = this; // eslint-disable-line + + if (typeof selector === 'undefined') { + return $([]); + } + + if (!closest.is(selector)) { + closest = closest.parents(selector).eq(0); + } + + return closest; +} + +function find(selector) { + const foundElements = []; + + for (let i = 0; i < this.length; i += 1) { + const found = this[i].querySelectorAll(selector); + + for (let j = 0; j < found.length; j += 1) { + foundElements.push(found[j]); + } + } + + return $(foundElements); +} + +function children(selector) { + const children = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + const childNodes = this[i].children; + + for (let j = 0; j < childNodes.length; j += 1) { + if (!selector || $(childNodes[j]).is(selector)) { + children.push(childNodes[j]); + } + } + } + + return $(children); +} + +function remove() { + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode) this[i].parentNode.removeChild(this[i]); + } + + return this; +} + +function detach() { + return this.remove(); +} + +function add(...els) { + const dom = this; + let i; + let j; + + for (i = 0; i < els.length; i += 1) { + const toAdd = $(els[i]); + + for (j = 0; j < toAdd.length; j += 1) { + dom.push(toAdd[j]); + } + } + + return dom; +} + +function empty() { + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (el.nodeType === 1) { + for (let j = 0; j < el.childNodes.length; j += 1) { + if (el.childNodes[j].parentNode) { + el.childNodes[j].parentNode.removeChild(el.childNodes[j]); + } + } + + el.textContent = ''; + } + } + + return this; +} + +// eslint-disable-next-line + +function scrollTo(...args) { + const window = getWindow(); + let [left, top, duration, easing, callback] = args; + + if (args.length === 4 && typeof easing === 'function') { + callback = easing; + [left, top, duration, callback, easing] = args; + } + + if (typeof easing === 'undefined') easing = 'swing'; + return this.each(function animate() { + const el = this; + let currentTop; + let currentLeft; + let maxTop; + let maxLeft; + let newTop; + let newLeft; + let scrollTop; // eslint-disable-line + + let scrollLeft; // eslint-disable-line + + let animateTop = top > 0 || top === 0; + let animateLeft = left > 0 || left === 0; + + if (typeof easing === 'undefined') { + easing = 'swing'; + } + + if (animateTop) { + currentTop = el.scrollTop; + + if (!duration) { + el.scrollTop = top; + } + } + + if (animateLeft) { + currentLeft = el.scrollLeft; + + if (!duration) { + el.scrollLeft = left; + } + } + + if (!duration) return; + + if (animateTop) { + maxTop = el.scrollHeight - el.offsetHeight; + newTop = Math.max(Math.min(top, maxTop), 0); + } + + if (animateLeft) { + maxLeft = el.scrollWidth - el.offsetWidth; + newLeft = Math.max(Math.min(left, maxLeft), 0); + } + + let startTime = null; + if (animateTop && newTop === currentTop) animateTop = false; + if (animateLeft && newLeft === currentLeft) animateLeft = false; + + function render(time = new Date().getTime()) { + if (startTime === null) { + startTime = time; + } + + const progress = Math.max(Math.min((time - startTime) / duration, 1), 0); + const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2; + let done; + if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop); + if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft); + + if (animateTop && newTop > currentTop && scrollTop >= newTop) { + el.scrollTop = newTop; + done = true; + } + + if (animateTop && newTop < currentTop && scrollTop <= newTop) { + el.scrollTop = newTop; + done = true; + } + + if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) { + el.scrollLeft = newLeft; + done = true; + } + + if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) { + el.scrollLeft = newLeft; + done = true; + } + + if (done) { + if (callback) callback(); + return; + } + + if (animateTop) el.scrollTop = scrollTop; + if (animateLeft) el.scrollLeft = scrollLeft; + window.requestAnimationFrame(render); + } + + window.requestAnimationFrame(render); + }); +} // scrollTop(top, duration, easing, callback) { + + +function scrollTop(...args) { + let [top, duration, easing, callback] = args; + + if (args.length === 3 && typeof easing === 'function') { + [top, duration, callback, easing] = args; + } + + const dom = this; + + if (typeof top === 'undefined') { + if (dom.length > 0) return dom[0].scrollTop; + return null; + } + + return dom.scrollTo(undefined, top, duration, easing, callback); +} + +function scrollLeft(...args) { + let [left, duration, easing, callback] = args; + + if (args.length === 3 && typeof easing === 'function') { + [left, duration, callback, easing] = args; + } + + const dom = this; + + if (typeof left === 'undefined') { + if (dom.length > 0) return dom[0].scrollLeft; + return null; + } + + return dom.scrollTo(left, undefined, duration, easing, callback); +} + +// eslint-disable-next-line + +function animate(initialProps, initialParams) { + const window = getWindow(); + const els = this; + const a = { + props: Object.assign({}, initialProps), + params: Object.assign({ + duration: 300, + easing: 'swing' // or 'linear' + + /* Callbacks + begin(elements) + complete(elements) + progress(elements, complete, remaining, start, tweenValue) + */ + + }, initialParams), + elements: els, + animating: false, + que: [], + + easingProgress(easing, progress) { + if (easing === 'swing') { + return 0.5 - Math.cos(progress * Math.PI) / 2; + } + + if (typeof easing === 'function') { + return easing(progress); + } + + return progress; + }, + + stop() { + if (a.frameId) { + window.cancelAnimationFrame(a.frameId); + } + + a.animating = false; + a.elements.each(el => { + const element = el; + delete element.dom7AnimateInstance; + }); + a.que = []; + }, + + done(complete) { + a.animating = false; + a.elements.each(el => { + const element = el; + delete element.dom7AnimateInstance; + }); + if (complete) complete(els); + + if (a.que.length > 0) { + const que = a.que.shift(); + a.animate(que[0], que[1]); + } + }, + + animate(props, params) { + if (a.animating) { + a.que.push([props, params]); + return a; + } + + const elements = []; // Define & Cache Initials & Units + + a.elements.each((el, index) => { + let initialFullValue; + let initialValue; + let unit; + let finalValue; + let finalFullValue; + if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a; + elements[index] = { + container: el + }; + Object.keys(props).forEach(prop => { + initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.'); + initialValue = parseFloat(initialFullValue); + unit = initialFullValue.replace(initialValue, ''); + finalValue = parseFloat(props[prop]); + finalFullValue = props[prop] + unit; + elements[index][prop] = { + initialFullValue, + initialValue, + unit, + finalValue, + finalFullValue, + currentValue: initialValue + }; + }); + }); + let startTime = null; + let time; + let elementsDone = 0; + let propsDone = 0; + let done; + let began = false; + a.animating = true; + + function render() { + time = new Date().getTime(); + let progress; + let easeProgress; // let el; + + if (!began) { + began = true; + if (params.begin) params.begin(els); + } + + if (startTime === null) { + startTime = time; + } + + if (params.progress) { + // eslint-disable-next-line + params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime); + } + + elements.forEach(element => { + const el = element; + if (done || el.done) return; + Object.keys(props).forEach(prop => { + if (done || el.done) return; + progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0); + easeProgress = a.easingProgress(params.easing, progress); + const { + initialValue, + finalValue, + unit + } = el[prop]; + el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue); + const currentValue = el[prop].currentValue; + + if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) { + el.container.style[prop] = finalValue + unit; + propsDone += 1; + + if (propsDone === Object.keys(props).length) { + el.done = true; + elementsDone += 1; + } + + if (elementsDone === elements.length) { + done = true; + } + } + + if (done) { + a.done(params.complete); + return; + } + + el.container.style[prop] = currentValue + unit; + }); + }); + if (done) return; // Then call + + a.frameId = window.requestAnimationFrame(render); + } + + a.frameId = window.requestAnimationFrame(render); + return a; + } + + }; + + if (a.elements.length === 0) { + return els; + } + + let animateInstance; + + for (let i = 0; i < a.elements.length; i += 1) { + if (a.elements[i].dom7AnimateInstance) { + animateInstance = a.elements[i].dom7AnimateInstance; + } else a.elements[i].dom7AnimateInstance = a; + } + + if (!animateInstance) { + animateInstance = a; + } + + if (initialProps === 'stop') { + animateInstance.stop(); + } else { + animateInstance.animate(a.props, a.params); + } + + return els; +} + +function stop() { + const els = this; + + for (let i = 0; i < els.length; i += 1) { + if (els[i].dom7AnimateInstance) { + els[i].dom7AnimateInstance.stop(); + } + } +} + +const noTrigger = 'resize scroll'.split(' '); + +function shortcut(name) { + function eventHandler(...args) { + if (typeof args[0] === 'undefined') { + for (let i = 0; i < this.length; i += 1) { + if (noTrigger.indexOf(name) < 0) { + if (name in this[i]) this[i][name]();else { + $(this[i]).trigger(name); + } + } + } + + return this; + } + + return this.on(name, ...args); + } + + return eventHandler; +} + +const click = shortcut('click'); +const blur = shortcut('blur'); +const focus = shortcut('focus'); +const focusin = shortcut('focusin'); +const focusout = shortcut('focusout'); +const keyup = shortcut('keyup'); +const keydown = shortcut('keydown'); +const keypress = shortcut('keypress'); +const submit = shortcut('submit'); +const change = shortcut('change'); +const mousedown = shortcut('mousedown'); +const mousemove = shortcut('mousemove'); +const mouseup = shortcut('mouseup'); +const mouseenter = shortcut('mouseenter'); +const mouseleave = shortcut('mouseleave'); +const mouseout = shortcut('mouseout'); +const mouseover = shortcut('mouseover'); +const touchstart = shortcut('touchstart'); +const touchend = shortcut('touchend'); +const touchmove = shortcut('touchmove'); +const resize = shortcut('resize'); +const scroll = shortcut('scroll'); + +export default $; +export { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width }; diff --git a/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.js b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.js new file mode 100644 index 0000000..4327572 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.js @@ -0,0 +1,1768 @@ +/** + * Dom7 4.0.1 + * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API + * https://framework7.io/docs/dom7.html + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ +(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.Dom7 = factory()); +}(this, (function () { 'use strict'; + + /** + * SSR Window 4.0.0 + * Better handling for window object in SSR environment + * https://github.com/nolimits4web/ssr-window + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: August 25, 2021 + */ + + /* eslint-disable no-param-reassign */ + function isObject(obj) { + return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object; + } + + function extend(target = {}, src = {}) { + Object.keys(src).forEach(key => { + if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) { + extend(target[key], src[key]); + } + }); + } + + const ssrDocument = { + body: {}, + + addEventListener() {}, + + removeEventListener() {}, + + activeElement: { + blur() {}, + + nodeName: '' + }, + + querySelector() { + return null; + }, + + querySelectorAll() { + return []; + }, + + getElementById() { + return null; + }, + + createEvent() { + return { + initEvent() {} + + }; + }, + + createElement() { + return { + children: [], + childNodes: [], + style: {}, + + setAttribute() {}, + + getElementsByTagName() { + return []; + } + + }; + }, + + createElementNS() { + return {}; + }, + + importNode() { + return null; + }, + + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '' + } + }; + + function getDocument() { + const doc = typeof document !== 'undefined' ? document : {}; + extend(doc, ssrDocument); + return doc; + } + + const ssrWindow = { + document: ssrDocument, + navigator: { + userAgent: '' + }, + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '' + }, + history: { + replaceState() {}, + + pushState() {}, + + go() {}, + + back() {} + + }, + CustomEvent: function CustomEvent() { + return this; + }, + + addEventListener() {}, + + removeEventListener() {}, + + getComputedStyle() { + return { + getPropertyValue() { + return ''; + } + + }; + }, + + Image() {}, + + Date() {}, + + screen: {}, + + setTimeout() {}, + + clearTimeout() {}, + + matchMedia() { + return {}; + }, + + requestAnimationFrame(callback) { + if (typeof setTimeout === 'undefined') { + callback(); + return null; + } + + return setTimeout(callback, 0); + }, + + cancelAnimationFrame(id) { + if (typeof setTimeout === 'undefined') { + return; + } + + clearTimeout(id); + } + + }; + + function getWindow() { + const win = typeof window !== 'undefined' ? window : {}; + extend(win, ssrWindow); + return win; + } + + /* eslint-disable no-proto */ + function makeReactive(obj) { + const proto = obj.__proto__; + Object.defineProperty(obj, '__proto__', { + get() { + return proto; + }, + + set(value) { + proto.__proto__ = value; + } + + }); + } + + class Dom7 extends Array { + constructor(items) { + super(...(items || [])); + makeReactive(this); + } + + } + + function arrayFlat(arr = []) { + const res = []; + arr.forEach(el => { + if (Array.isArray(el)) { + res.push(...arrayFlat(el)); + } else { + res.push(el); + } + }); + return res; + } + function arrayFilter(arr, callback) { + return Array.prototype.filter.call(arr, callback); + } + function arrayUnique(arr) { + const uniqueArray = []; + + for (let i = 0; i < arr.length; i += 1) { + if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]); + } + + return uniqueArray; + } + function toCamelCase(string) { + return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase()); + } + + // eslint-disable-next-line + + function qsa(selector, context) { + if (typeof selector !== 'string') { + return [selector]; + } + + const a = []; + const res = context.querySelectorAll(selector); + + for (let i = 0; i < res.length; i += 1) { + a.push(res[i]); + } + + return a; + } + + function $(selector, context) { + const window = getWindow(); + const document = getDocument(); + let arr = []; + + if (!context && selector instanceof Dom7) { + return selector; + } + + if (!selector) { + return new Dom7(arr); + } + + if (typeof selector === 'string') { + const html = selector.trim(); + + if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) { + let toCreate = 'div'; + if (html.indexOf(' c.split(' '))); + this.forEach(el => { + el.classList.add(...classNames); + }); + return this; + } + + function removeClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + this.forEach(el => { + el.classList.remove(...classNames); + }); + return this; + } + + function toggleClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + this.forEach(el => { + classNames.forEach(className => { + el.classList.toggle(className); + }); + }); + } + + function hasClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + return arrayFilter(this, el => { + return classNames.filter(className => el.classList.contains(className)).length > 0; + }).length > 0; + } + + function attr(attrs, value) { + if (arguments.length === 1 && typeof attrs === 'string') { + // Get attr + if (this[0]) return this[0].getAttribute(attrs); + return undefined; + } // Set attrs + + + for (let i = 0; i < this.length; i += 1) { + if (arguments.length === 2) { + // String + this[i].setAttribute(attrs, value); + } else { + // Object + for (const attrName in attrs) { + this[i][attrName] = attrs[attrName]; + this[i].setAttribute(attrName, attrs[attrName]); + } + } + } + + return this; + } + + function removeAttr(attr) { + for (let i = 0; i < this.length; i += 1) { + this[i].removeAttribute(attr); + } + + return this; + } + + function prop(props, value) { + if (arguments.length === 1 && typeof props === 'string') { + // Get prop + if (this[0]) return this[0][props]; + } else { + // Set props + for (let i = 0; i < this.length; i += 1) { + if (arguments.length === 2) { + // String + this[i][props] = value; + } else { + // Object + for (const propName in props) { + this[i][propName] = props[propName]; + } + } + } + + return this; + } + + return this; + } + + function data(key, value) { + let el; + + if (typeof value === 'undefined') { + el = this[0]; + if (!el) return undefined; // Get value + + if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) { + return el.dom7ElementDataStorage[key]; + } + + const dataKey = el.getAttribute(`data-${key}`); + + if (dataKey) { + return dataKey; + } + + return undefined; + } // Set value + + + for (let i = 0; i < this.length; i += 1) { + el = this[i]; + if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {}; + el.dom7ElementDataStorage[key] = value; + } + + return this; + } + + function removeData(key) { + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) { + el.dom7ElementDataStorage[key] = null; + delete el.dom7ElementDataStorage[key]; + } + } + } + + function dataset() { + const el = this[0]; + if (!el) return undefined; + const dataset = {}; // eslint-disable-line + + if (el.dataset) { + for (const dataKey in el.dataset) { + dataset[dataKey] = el.dataset[dataKey]; + } + } else { + for (let i = 0; i < el.attributes.length; i += 1) { + const attr = el.attributes[i]; + + if (attr.name.indexOf('data-') >= 0) { + dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value; + } + } + } + + for (const key in dataset) { + if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1; + } + + return dataset; + } + + function val(value) { + if (typeof value === 'undefined') { + // get value + const el = this[0]; + if (!el) return undefined; + + if (el.multiple && el.nodeName.toLowerCase() === 'select') { + const values = []; + + for (let i = 0; i < el.selectedOptions.length; i += 1) { + values.push(el.selectedOptions[i].value); + } + + return values; + } + + return el.value; + } // set value + + + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') { + for (let j = 0; j < el.options.length; j += 1) { + el.options[j].selected = value.indexOf(el.options[j].value) >= 0; + } + } else { + el.value = value; + } + } + + return this; + } + + function value(value) { + return this.val(value); + } + + function transform(transform) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transform = transform; + } + + return this; + } + + function transition(duration) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration; + } + + return this; + } + + function on(...args) { + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + + function handleLiveEvent(e) { + const target = e.target; + if (!target) return; + const eventData = e.target.dom7EventData || []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + if ($(target).is(targetSelector)) listener.apply(target, eventData);else { + const parents = $(target).parents(); // eslint-disable-line + + for (let k = 0; k < parents.length; k += 1) { + if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData); + } + } + } + + function handleEvent(e) { + const eventData = e && e.target ? e.target.dom7EventData || [] : []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + listener.apply(this, eventData); + } + + const events = eventType.split(' '); + let j; + + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (!targetSelector) { + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7Listeners) el.dom7Listeners = {}; + if (!el.dom7Listeners[event]) el.dom7Listeners[event] = []; + el.dom7Listeners[event].push({ + listener, + proxyListener: handleEvent + }); + el.addEventListener(event, handleEvent, capture); + } + } else { + // Live events + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7LiveListeners) el.dom7LiveListeners = {}; + if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = []; + el.dom7LiveListeners[event].push({ + listener, + proxyListener: handleLiveEvent + }); + el.addEventListener(event, handleLiveEvent, capture); + } + } + } + + return this; + } + + function off(...args) { + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + const events = eventType.split(' '); + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + let handlers; + + if (!targetSelector && el.dom7Listeners) { + handlers = el.dom7Listeners[event]; + } else if (targetSelector && el.dom7LiveListeners) { + handlers = el.dom7LiveListeners[event]; + } + + if (handlers && handlers.length) { + for (let k = handlers.length - 1; k >= 0; k -= 1) { + const handler = handlers[k]; + + if (listener && handler.listener === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (!listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } + } + } + } + } + + return this; + } + + function once(...args) { + const dom = this; + let [eventName, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventName, listener, capture] = args; + targetSelector = undefined; + } + + function onceHandler(...eventArgs) { + listener.apply(this, eventArgs); + dom.off(eventName, targetSelector, onceHandler, capture); + + if (onceHandler.dom7proxy) { + delete onceHandler.dom7proxy; + } + } + + onceHandler.dom7proxy = listener; + return dom.on(eventName, targetSelector, onceHandler, capture); + } + + function trigger(...args) { + const window = getWindow(); + const events = args[0].split(' '); + const eventData = args[1]; + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + + if (window.CustomEvent) { + const evt = new window.CustomEvent(event, { + detail: eventData, + bubbles: true, + cancelable: true + }); + el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0); + el.dispatchEvent(evt); + el.dom7EventData = []; + delete el.dom7EventData; + } + } + } + + return this; + } + + function transitionEnd(callback) { + const dom = this; + + function fireCallBack(e) { + if (e.target !== this) return; + callback.call(this, e); + dom.off('transitionend', fireCallBack); + } + + if (callback) { + dom.on('transitionend', fireCallBack); + } + + return this; + } + + function animationEnd(callback) { + const dom = this; + + function fireCallBack(e) { + if (e.target !== this) return; + callback.call(this, e); + dom.off('animationend', fireCallBack); + } + + if (callback) { + dom.on('animationend', fireCallBack); + } + + return this; + } + + function width() { + const window = getWindow(); + + if (this[0] === window) { + return window.innerWidth; + } + + if (this.length > 0) { + return parseFloat(this.css('width')); + } + + return null; + } + + function outerWidth(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left')); + } + + return this[0].offsetWidth; + } + + return null; + } + + function height() { + const window = getWindow(); + + if (this[0] === window) { + return window.innerHeight; + } + + if (this.length > 0) { + return parseFloat(this.css('height')); + } + + return null; + } + + function outerHeight(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom')); + } + + return this[0].offsetHeight; + } + + return null; + } + + function offset() { + if (this.length > 0) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + const box = el.getBoundingClientRect(); + const body = document.body; + const clientTop = el.clientTop || body.clientTop || 0; + const clientLeft = el.clientLeft || body.clientLeft || 0; + const scrollTop = el === window ? window.scrollY : el.scrollTop; + const scrollLeft = el === window ? window.scrollX : el.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft + }; + } + + return null; + } + + function hide() { + for (let i = 0; i < this.length; i += 1) { + this[i].style.display = 'none'; + } + + return this; + } + + function show() { + const window = getWindow(); + + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (el.style.display === 'none') { + el.style.display = ''; + } + + if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') { + // Still not visible + el.style.display = 'block'; + } + } + + return this; + } + + function styles() { + const window = getWindow(); + if (this[0]) return window.getComputedStyle(this[0], null); + return {}; + } + + function css(props, value) { + const window = getWindow(); + let i; + + if (arguments.length === 1) { + if (typeof props === 'string') { + // .css('width') + if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props); + } else { + // .css({ width: '100px' }) + for (i = 0; i < this.length; i += 1) { + for (const prop in props) { + this[i].style[prop] = props[prop]; + } + } + + return this; + } + } + + if (arguments.length === 2 && typeof props === 'string') { + // .css('width', '100px') + for (i = 0; i < this.length; i += 1) { + this[i].style[props] = value; + } + + return this; + } + + return this; + } + + function each(callback) { + if (!callback) return this; + this.forEach((el, index) => { + callback.apply(el, [el, index]); + }); + return this; + } + + function filter(callback) { + const result = arrayFilter(this, callback); + return $(result); + } + + function html(html) { + if (typeof html === 'undefined') { + return this[0] ? this[0].innerHTML : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].innerHTML = html; + } + + return this; + } + + function text(text) { + if (typeof text === 'undefined') { + return this[0] ? this[0].textContent.trim() : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].textContent = text; + } + + return this; + } + + function is(selector) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + let compareWith; + let i; + if (!el || typeof selector === 'undefined') return false; + + if (typeof selector === 'string') { + if (el.matches) return el.matches(selector); + if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector); + if (el.msMatchesSelector) return el.msMatchesSelector(selector); + compareWith = $(selector); + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + if (selector === document) { + return el === document; + } + + if (selector === window) { + return el === window; + } + + if (selector.nodeType || selector instanceof Dom7) { + compareWith = selector.nodeType ? [selector] : selector; + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + return false; + } + + function index() { + let child = this[0]; + let i; + + if (child) { + i = 0; // eslint-disable-next-line + + while ((child = child.previousSibling) !== null) { + if (child.nodeType === 1) i += 1; + } + + return i; + } + + return undefined; + } + + function eq(index) { + if (typeof index === 'undefined') return this; + const length = this.length; + + if (index > length - 1) { + return $([]); + } + + if (index < 0) { + const returnIndex = length + index; + if (returnIndex < 0) return $([]); + return $([this[returnIndex]]); + } + + return $([this[index]]); + } + + function append(...els) { + let newChild; + const document = getDocument(); + + for (let k = 0; k < els.length; k += 1) { + newChild = els[k]; + + for (let i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + + while (tempDiv.firstChild) { + this[i].appendChild(tempDiv.firstChild); + } + } else if (newChild instanceof Dom7) { + for (let j = 0; j < newChild.length; j += 1) { + this[i].appendChild(newChild[j]); + } + } else { + this[i].appendChild(newChild); + } + } + } + + return this; + } + + function appendTo(parent) { + $(parent).append(this); + return this; + } + + function prepend(newChild) { + const document = getDocument(); + let i; + let j; + + for (i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + + for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) { + this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); + } + } else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j += 1) { + this[i].insertBefore(newChild[j], this[i].childNodes[0]); + } + } else { + this[i].insertBefore(newChild, this[i].childNodes[0]); + } + } + + return this; + } + + function prependTo(parent) { + $(parent).prepend(this); + return this; + } + + function insertBefore(selector) { + const before = $(selector); + + for (let i = 0; i < this.length; i += 1) { + if (before.length === 1) { + before[0].parentNode.insertBefore(this[i], before[0]); + } else if (before.length > 1) { + for (let j = 0; j < before.length; j += 1) { + before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]); + } + } + } + } + + function insertAfter(selector) { + const after = $(selector); + + for (let i = 0; i < this.length; i += 1) { + if (after.length === 1) { + after[0].parentNode.insertBefore(this[i], after[0].nextSibling); + } else if (after.length > 1) { + for (let j = 0; j < after.length; j += 1) { + after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling); + } + } + } + } + + function next(selector) { + if (this.length > 0) { + if (selector) { + if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) { + return $([this[0].nextElementSibling]); + } + + return $([]); + } + + if (this[0].nextElementSibling) return $([this[0].nextElementSibling]); + return $([]); + } + + return $([]); + } + + function nextAll(selector) { + const nextEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.nextElementSibling) { + const next = el.nextElementSibling; // eslint-disable-line + + if (selector) { + if ($(next).is(selector)) nextEls.push(next); + } else nextEls.push(next); + + el = next; + } + + return $(nextEls); + } + + function prev(selector) { + if (this.length > 0) { + const el = this[0]; + + if (selector) { + if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) { + return $([el.previousElementSibling]); + } + + return $([]); + } + + if (el.previousElementSibling) return $([el.previousElementSibling]); + return $([]); + } + + return $([]); + } + + function prevAll(selector) { + const prevEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.previousElementSibling) { + const prev = el.previousElementSibling; // eslint-disable-line + + if (selector) { + if ($(prev).is(selector)) prevEls.push(prev); + } else prevEls.push(prev); + + el = prev; + } + + return $(prevEls); + } + + function siblings(selector) { + return this.nextAll(selector).add(this.prevAll(selector)); + } + + function parent(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode !== null) { + if (selector) { + if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode); + } else { + parents.push(this[i].parentNode); + } + } + } + + return $(parents); + } + + function parents(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + let parent = this[i].parentNode; // eslint-disable-line + + while (parent) { + if (selector) { + if ($(parent).is(selector)) parents.push(parent); + } else { + parents.push(parent); + } + + parent = parent.parentNode; + } + } + + return $(parents); + } + + function closest(selector) { + let closest = this; // eslint-disable-line + + if (typeof selector === 'undefined') { + return $([]); + } + + if (!closest.is(selector)) { + closest = closest.parents(selector).eq(0); + } + + return closest; + } + + function find(selector) { + const foundElements = []; + + for (let i = 0; i < this.length; i += 1) { + const found = this[i].querySelectorAll(selector); + + for (let j = 0; j < found.length; j += 1) { + foundElements.push(found[j]); + } + } + + return $(foundElements); + } + + function children(selector) { + const children = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + const childNodes = this[i].children; + + for (let j = 0; j < childNodes.length; j += 1) { + if (!selector || $(childNodes[j]).is(selector)) { + children.push(childNodes[j]); + } + } + } + + return $(children); + } + + function remove() { + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode) this[i].parentNode.removeChild(this[i]); + } + + return this; + } + + function detach() { + return this.remove(); + } + + function add(...els) { + const dom = this; + let i; + let j; + + for (i = 0; i < els.length; i += 1) { + const toAdd = $(els[i]); + + for (j = 0; j < toAdd.length; j += 1) { + dom.push(toAdd[j]); + } + } + + return dom; + } + + function empty() { + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (el.nodeType === 1) { + for (let j = 0; j < el.childNodes.length; j += 1) { + if (el.childNodes[j].parentNode) { + el.childNodes[j].parentNode.removeChild(el.childNodes[j]); + } + } + + el.textContent = ''; + } + } + + return this; + } + + var methods = /*#__PURE__*/Object.freeze({ + __proto__: null, + addClass: addClass, + removeClass: removeClass, + toggleClass: toggleClass, + hasClass: hasClass, + attr: attr, + removeAttr: removeAttr, + prop: prop, + data: data, + removeData: removeData, + dataset: dataset, + val: val, + value: value, + transform: transform, + transition: transition, + on: on, + off: off, + once: once, + trigger: trigger, + transitionEnd: transitionEnd, + animationEnd: animationEnd, + width: width, + outerWidth: outerWidth, + height: height, + outerHeight: outerHeight, + offset: offset, + hide: hide, + show: show, + styles: styles, + css: css, + each: each, + filter: filter, + html: html, + text: text, + is: is, + index: index, + eq: eq, + append: append, + appendTo: appendTo, + prepend: prepend, + prependTo: prependTo, + insertBefore: insertBefore, + insertAfter: insertAfter, + next: next, + nextAll: nextAll, + prev: prev, + prevAll: prevAll, + siblings: siblings, + parent: parent, + parents: parents, + closest: closest, + find: find, + children: children, + remove: remove, + detach: detach, + add: add, + empty: empty + }); + + // eslint-disable-next-line + + function scrollTo(...args) { + const window = getWindow(); + let [left, top, duration, easing, callback] = args; + + if (args.length === 4 && typeof easing === 'function') { + callback = easing; + [left, top, duration, callback, easing] = args; + } + + if (typeof easing === 'undefined') easing = 'swing'; + return this.each(function animate() { + const el = this; + let currentTop; + let currentLeft; + let maxTop; + let maxLeft; + let newTop; + let newLeft; + let scrollTop; // eslint-disable-line + + let scrollLeft; // eslint-disable-line + + let animateTop = top > 0 || top === 0; + let animateLeft = left > 0 || left === 0; + + if (typeof easing === 'undefined') { + easing = 'swing'; + } + + if (animateTop) { + currentTop = el.scrollTop; + + if (!duration) { + el.scrollTop = top; + } + } + + if (animateLeft) { + currentLeft = el.scrollLeft; + + if (!duration) { + el.scrollLeft = left; + } + } + + if (!duration) return; + + if (animateTop) { + maxTop = el.scrollHeight - el.offsetHeight; + newTop = Math.max(Math.min(top, maxTop), 0); + } + + if (animateLeft) { + maxLeft = el.scrollWidth - el.offsetWidth; + newLeft = Math.max(Math.min(left, maxLeft), 0); + } + + let startTime = null; + if (animateTop && newTop === currentTop) animateTop = false; + if (animateLeft && newLeft === currentLeft) animateLeft = false; + + function render(time = new Date().getTime()) { + if (startTime === null) { + startTime = time; + } + + const progress = Math.max(Math.min((time - startTime) / duration, 1), 0); + const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2; + let done; + if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop); + if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft); + + if (animateTop && newTop > currentTop && scrollTop >= newTop) { + el.scrollTop = newTop; + done = true; + } + + if (animateTop && newTop < currentTop && scrollTop <= newTop) { + el.scrollTop = newTop; + done = true; + } + + if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) { + el.scrollLeft = newLeft; + done = true; + } + + if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) { + el.scrollLeft = newLeft; + done = true; + } + + if (done) { + if (callback) callback(); + return; + } + + if (animateTop) el.scrollTop = scrollTop; + if (animateLeft) el.scrollLeft = scrollLeft; + window.requestAnimationFrame(render); + } + + window.requestAnimationFrame(render); + }); + } // scrollTop(top, duration, easing, callback) { + + + function scrollTop(...args) { + let [top, duration, easing, callback] = args; + + if (args.length === 3 && typeof easing === 'function') { + [top, duration, callback, easing] = args; + } + + const dom = this; + + if (typeof top === 'undefined') { + if (dom.length > 0) return dom[0].scrollTop; + return null; + } + + return dom.scrollTo(undefined, top, duration, easing, callback); + } + + function scrollLeft(...args) { + let [left, duration, easing, callback] = args; + + if (args.length === 3 && typeof easing === 'function') { + [left, duration, callback, easing] = args; + } + + const dom = this; + + if (typeof left === 'undefined') { + if (dom.length > 0) return dom[0].scrollLeft; + return null; + } + + return dom.scrollTo(left, undefined, duration, easing, callback); + } + + var scroll$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + scrollTo: scrollTo, + scrollTop: scrollTop, + scrollLeft: scrollLeft + }); + + // eslint-disable-next-line + + function animate(initialProps, initialParams) { + const window = getWindow(); + const els = this; + const a = { + props: Object.assign({}, initialProps), + params: Object.assign({ + duration: 300, + easing: 'swing' // or 'linear' + + /* Callbacks + begin(elements) + complete(elements) + progress(elements, complete, remaining, start, tweenValue) + */ + + }, initialParams), + elements: els, + animating: false, + que: [], + + easingProgress(easing, progress) { + if (easing === 'swing') { + return 0.5 - Math.cos(progress * Math.PI) / 2; + } + + if (typeof easing === 'function') { + return easing(progress); + } + + return progress; + }, + + stop() { + if (a.frameId) { + window.cancelAnimationFrame(a.frameId); + } + + a.animating = false; + a.elements.each(el => { + const element = el; + delete element.dom7AnimateInstance; + }); + a.que = []; + }, + + done(complete) { + a.animating = false; + a.elements.each(el => { + const element = el; + delete element.dom7AnimateInstance; + }); + if (complete) complete(els); + + if (a.que.length > 0) { + const que = a.que.shift(); + a.animate(que[0], que[1]); + } + }, + + animate(props, params) { + if (a.animating) { + a.que.push([props, params]); + return a; + } + + const elements = []; // Define & Cache Initials & Units + + a.elements.each((el, index) => { + let initialFullValue; + let initialValue; + let unit; + let finalValue; + let finalFullValue; + if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a; + elements[index] = { + container: el + }; + Object.keys(props).forEach(prop => { + initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.'); + initialValue = parseFloat(initialFullValue); + unit = initialFullValue.replace(initialValue, ''); + finalValue = parseFloat(props[prop]); + finalFullValue = props[prop] + unit; + elements[index][prop] = { + initialFullValue, + initialValue, + unit, + finalValue, + finalFullValue, + currentValue: initialValue + }; + }); + }); + let startTime = null; + let time; + let elementsDone = 0; + let propsDone = 0; + let done; + let began = false; + a.animating = true; + + function render() { + time = new Date().getTime(); + let progress; + let easeProgress; // let el; + + if (!began) { + began = true; + if (params.begin) params.begin(els); + } + + if (startTime === null) { + startTime = time; + } + + if (params.progress) { + // eslint-disable-next-line + params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime); + } + + elements.forEach(element => { + const el = element; + if (done || el.done) return; + Object.keys(props).forEach(prop => { + if (done || el.done) return; + progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0); + easeProgress = a.easingProgress(params.easing, progress); + const { + initialValue, + finalValue, + unit + } = el[prop]; + el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue); + const currentValue = el[prop].currentValue; + + if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) { + el.container.style[prop] = finalValue + unit; + propsDone += 1; + + if (propsDone === Object.keys(props).length) { + el.done = true; + elementsDone += 1; + } + + if (elementsDone === elements.length) { + done = true; + } + } + + if (done) { + a.done(params.complete); + return; + } + + el.container.style[prop] = currentValue + unit; + }); + }); + if (done) return; // Then call + + a.frameId = window.requestAnimationFrame(render); + } + + a.frameId = window.requestAnimationFrame(render); + return a; + } + + }; + + if (a.elements.length === 0) { + return els; + } + + let animateInstance; + + for (let i = 0; i < a.elements.length; i += 1) { + if (a.elements[i].dom7AnimateInstance) { + animateInstance = a.elements[i].dom7AnimateInstance; + } else a.elements[i].dom7AnimateInstance = a; + } + + if (!animateInstance) { + animateInstance = a; + } + + if (initialProps === 'stop') { + animateInstance.stop(); + } else { + animateInstance.animate(a.props, a.params); + } + + return els; + } + + function stop() { + const els = this; + + for (let i = 0; i < els.length; i += 1) { + if (els[i].dom7AnimateInstance) { + els[i].dom7AnimateInstance.stop(); + } + } + } + + var animate$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + animate: animate, + stop: stop + }); + + const noTrigger = 'resize scroll'.split(' '); + + function shortcut(name) { + function eventHandler(...args) { + if (typeof args[0] === 'undefined') { + for (let i = 0; i < this.length; i += 1) { + if (noTrigger.indexOf(name) < 0) { + if (name in this[i]) this[i][name]();else { + $(this[i]).trigger(name); + } + } + } + + return this; + } + + return this.on(name, ...args); + } + + return eventHandler; + } + + const click = shortcut('click'); + const blur = shortcut('blur'); + const focus = shortcut('focus'); + const focusin = shortcut('focusin'); + const focusout = shortcut('focusout'); + const keyup = shortcut('keyup'); + const keydown = shortcut('keydown'); + const keypress = shortcut('keypress'); + const submit = shortcut('submit'); + const change = shortcut('change'); + const mousedown = shortcut('mousedown'); + const mousemove = shortcut('mousemove'); + const mouseup = shortcut('mouseup'); + const mouseenter = shortcut('mouseenter'); + const mouseleave = shortcut('mouseleave'); + const mouseout = shortcut('mouseout'); + const mouseover = shortcut('mouseover'); + const touchstart = shortcut('touchstart'); + const touchend = shortcut('touchend'); + const touchmove = shortcut('touchmove'); + const resize = shortcut('resize'); + const scroll = shortcut('scroll'); + + var shortcuts = /*#__PURE__*/Object.freeze({ + __proto__: null, + click: click, + blur: blur, + focus: focus, + focusin: focusin, + focusout: focusout, + keyup: keyup, + keydown: keydown, + keypress: keypress, + submit: submit, + change: change, + mousedown: mousedown, + mousemove: mousemove, + mouseup: mouseup, + mouseenter: mouseenter, + mouseleave: mouseleave, + mouseout: mouseout, + mouseover: mouseover, + touchstart: touchstart, + touchend: touchend, + touchmove: touchmove, + resize: resize, + scroll: scroll + }); + + [methods, scroll$1, animate$1, shortcuts].forEach(group => { + Object.keys(group).forEach(methodName => { + $.fn[methodName] = group[methodName]; + }); + }); + + return $; + +}))); +//# sourceMappingURL=dom7.js.map diff --git a/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.js.map b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.js.map new file mode 100644 index 0000000..50290dc --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dom7.js","sources":["../node_modules/ssr-window/ssr-window.esm.js","../src/dom7-class.js","../src/utils.js","../src/$.js","../src/methods.js","../src/scroll.js","../src/animate.js","../src/shortcuts.js","../src/dom7.bundle.js"],"sourcesContent":["/**\n * SSR Window 4.0.0\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: August 25, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n return (obj !== null &&\n typeof obj === 'object' &&\n 'constructor' in obj &&\n obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n Object.keys(src).forEach((key) => {\n if (typeof target[key] === 'undefined')\n target[key] = src[key];\n else if (isObject(src[key]) &&\n isObject(target[key]) &&\n Object.keys(src[key]).length > 0) {\n extend(target[key], src[key]);\n }\n });\n}\n\nconst ssrDocument = {\n body: {},\n addEventListener() { },\n removeEventListener() { },\n activeElement: {\n blur() { },\n nodeName: '',\n },\n querySelector() {\n return null;\n },\n querySelectorAll() {\n return [];\n },\n getElementById() {\n return null;\n },\n createEvent() {\n return {\n initEvent() { },\n };\n },\n createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute() { },\n getElementsByTagName() {\n return [];\n },\n };\n },\n createElementNS() {\n return {};\n },\n importNode() {\n return null;\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n};\nfunction getDocument() {\n const doc = typeof document !== 'undefined' ? document : {};\n extend(doc, ssrDocument);\n return doc;\n}\n\nconst ssrWindow = {\n document: ssrDocument,\n navigator: {\n userAgent: '',\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n history: {\n replaceState() { },\n pushState() { },\n go() { },\n back() { },\n },\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener() { },\n removeEventListener() { },\n getComputedStyle() {\n return {\n getPropertyValue() {\n return '';\n },\n };\n },\n Image() { },\n Date() { },\n screen: {},\n setTimeout() { },\n clearTimeout() { },\n matchMedia() {\n return {};\n },\n requestAnimationFrame(callback) {\n if (typeof setTimeout === 'undefined') {\n callback();\n return null;\n }\n return setTimeout(callback, 0);\n },\n cancelAnimationFrame(id) {\n if (typeof setTimeout === 'undefined') {\n return;\n }\n clearTimeout(id);\n },\n};\nfunction getWindow() {\n const win = typeof window !== 'undefined' ? window : {};\n extend(win, ssrWindow);\n return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n const proto = obj.__proto__;\n Object.defineProperty(obj, '__proto__', {\n get() {\n return proto;\n },\n set(value) {\n proto.__proto__ = value;\n },\n });\n}\nclass Dom7 extends Array {\n constructor(items) {\n super(...(items || []));\n\n makeReactive(this);\n }\n}\nexport default Dom7;\n","export function arrayFlat(arr = []) {\n const res = [];\n arr.forEach((el) => {\n if (Array.isArray(el)) {\n res.push(...arrayFlat(el));\n } else {\n res.push(el);\n }\n });\n return res;\n}\nexport function arrayFilter(arr, callback) {\n return Array.prototype.filter.call(arr, callback);\n}\nexport function arrayUnique(arr) {\n const uniqueArray = [];\n for (let i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n }\n return uniqueArray;\n}\nexport function toCamelCase(string) {\n return string\n .toLowerCase()\n .replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n","// eslint-disable-next-line\nimport { getWindow, getDocument } from 'ssr-window';\nimport Dom7 from './dom7-class';\nimport { arrayUnique } from './utils';\n\nfunction qsa(selector, context) {\n if (typeof selector !== 'string') {\n return [selector];\n }\n const a = [];\n const res = context.querySelectorAll(selector);\n for (let i = 0; i < res.length; i += 1) {\n a.push(res[i]);\n }\n return a;\n}\n\nfunction $(selector, context) {\n const window = getWindow();\n const document = getDocument();\n let arr = [];\n if (!context && selector instanceof Dom7) {\n return selector;\n }\n if (!selector) {\n return new Dom7(arr);\n }\n if (typeof selector === 'string') {\n const html = selector.trim();\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n let toCreate = 'div';\n if (html.indexOf(' c.split(' ')));\n this.forEach((el) => {\n el.classList.add(...classNames);\n });\n return this;\n}\nfunction removeClass(...classes) {\n const classNames = arrayFlat(classes.map((c) => c.split(' ')));\n this.forEach((el) => {\n el.classList.remove(...classNames);\n });\n return this;\n}\nfunction toggleClass(...classes) {\n const classNames = arrayFlat(classes.map((c) => c.split(' ')));\n this.forEach((el) => {\n classNames.forEach((className) => {\n el.classList.toggle(className);\n });\n });\n}\nfunction hasClass(...classes) {\n const classNames = arrayFlat(classes.map((c) => c.split(' ')));\n return (\n arrayFilter(this, (el) => {\n return (\n classNames.filter((className) => el.classList.contains(className))\n .length > 0\n );\n }).length > 0\n );\n}\nfunction attr(attrs, value) {\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) return this[0].getAttribute(attrs);\n return undefined;\n }\n\n // Set attrs\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n for (const attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n return this;\n}\nfunction removeAttr(attr) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n return this;\n}\nfunction prop(props, value) {\n if (arguments.length === 1 && typeof props === 'string') {\n // Get prop\n if (this[0]) return this[0][props];\n } else {\n // Set props\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i][props] = value;\n } else {\n // Object\n for (const propName in props) {\n this[i][propName] = props[propName];\n }\n }\n }\n return this;\n }\n return this;\n}\nfunction data(key, value) {\n let el;\n if (typeof value === 'undefined') {\n el = this[0];\n if (!el) return undefined;\n // Get value\n if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n return el.dom7ElementDataStorage[key];\n }\n\n const dataKey = el.getAttribute(`data-${key}`);\n if (dataKey) {\n return dataKey;\n }\n return undefined;\n }\n\n // Set value\n for (let i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n el.dom7ElementDataStorage[key] = value;\n }\n return this;\n}\nfunction removeData(key) {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n el.dom7ElementDataStorage[key] = null;\n delete el.dom7ElementDataStorage[key];\n }\n }\n}\nfunction dataset() {\n const el = this[0];\n if (!el) return undefined;\n const dataset = {}; // eslint-disable-line\n if (el.dataset) {\n for (const dataKey in el.dataset) {\n dataset[dataKey] = el.dataset[dataKey];\n }\n } else {\n for (let i = 0; i < el.attributes.length; i += 1) {\n const attr = el.attributes[i];\n if (attr.name.indexOf('data-') >= 0) {\n dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n }\n }\n }\n for (const key in dataset) {\n if (dataset[key] === 'false') dataset[key] = false;\n else if (dataset[key] === 'true') dataset[key] = true;\n else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n }\n return dataset;\n}\nfunction val(value) {\n if (typeof value === 'undefined') {\n // get value\n const el = this[0];\n if (!el) return undefined;\n if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n const values = [];\n for (let i = 0; i < el.selectedOptions.length; i += 1) {\n values.push(el.selectedOptions[i].value);\n }\n return values;\n }\n return el.value;\n }\n\n // set value\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (\n Array.isArray(value) &&\n el.multiple &&\n el.nodeName.toLowerCase() === 'select'\n ) {\n for (let j = 0; j < el.options.length; j += 1) {\n el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n }\n } else {\n el.value = value;\n }\n }\n return this;\n}\nfunction value(value) {\n return this.val(value);\n}\nfunction transform(transform) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transform = transform;\n }\n return this;\n}\nfunction transition(duration) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transitionDuration =\n typeof duration !== 'string' ? `${duration}ms` : duration;\n }\n return this;\n}\nfunction on(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n if (!capture) capture = false;\n\n function handleLiveEvent(e) {\n const target = e.target;\n if (!target) return;\n const eventData = e.target.dom7EventData || [];\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n if ($(target).is(targetSelector)) listener.apply(target, eventData);\n else {\n const parents = $(target).parents(); // eslint-disable-line\n for (let k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector))\n listener.apply(parents[k], eventData);\n }\n }\n }\n function handleEvent(e) {\n const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n listener.apply(this, eventData);\n }\n const events = eventType.split(' ');\n let j;\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7Listeners) el.dom7Listeners = {};\n if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n el.dom7Listeners[event].push({\n listener,\n proxyListener: handleEvent,\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n el.dom7LiveListeners[event].push({\n listener,\n proxyListener: handleLiveEvent,\n });\n el.addEventListener(event, handleLiveEvent, capture);\n }\n }\n }\n return this;\n}\nfunction off(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n if (!capture) capture = false;\n\n const events = eventType.split(' ');\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n let handlers;\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n if (handlers && handlers.length) {\n for (let k = handlers.length - 1; k >= 0; k -= 1) {\n const handler = handlers[k];\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (\n listener &&\n handler.listener &&\n handler.listener.dom7proxy &&\n handler.listener.dom7proxy === listener\n ) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n return this;\n}\nfunction once(...args) {\n const dom = this;\n let [eventName, targetSelector, listener, capture] = args;\n if (typeof args[1] === 'function') {\n [eventName, listener, capture] = args;\n targetSelector = undefined;\n }\n function onceHandler(...eventArgs) {\n listener.apply(this, eventArgs);\n dom.off(eventName, targetSelector, onceHandler, capture);\n if (onceHandler.dom7proxy) {\n delete onceHandler.dom7proxy;\n }\n }\n onceHandler.dom7proxy = listener;\n return dom.on(eventName, targetSelector, onceHandler, capture);\n}\nfunction trigger(...args) {\n const window = getWindow();\n const events = args[0].split(' ');\n const eventData = args[1];\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n if (window.CustomEvent) {\n const evt = new window.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true,\n });\n el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n }\n return this;\n}\nfunction transitionEnd(callback) {\n const dom = this;\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('transitionend', fireCallBack);\n }\n if (callback) {\n dom.on('transitionend', fireCallBack);\n }\n return this;\n}\nfunction animationEnd(callback) {\n const dom = this;\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('animationend', fireCallBack);\n }\n if (callback) {\n dom.on('animationend', fireCallBack);\n }\n return this;\n}\nfunction width() {\n const window = getWindow();\n if (this[0] === window) {\n return window.innerWidth;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('width'));\n }\n\n return null;\n}\nfunction outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return (\n this[0].offsetWidth +\n parseFloat(styles.getPropertyValue('margin-right')) +\n parseFloat(styles.getPropertyValue('margin-left'))\n );\n }\n return this[0].offsetWidth;\n }\n return null;\n}\nfunction height() {\n const window = getWindow();\n if (this[0] === window) {\n return window.innerHeight;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('height'));\n }\n\n return null;\n}\nfunction outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return (\n this[0].offsetHeight +\n parseFloat(styles.getPropertyValue('margin-top')) +\n parseFloat(styles.getPropertyValue('margin-bottom'))\n );\n }\n return this[0].offsetHeight;\n }\n return null;\n}\nfunction offset() {\n if (this.length > 0) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n const box = el.getBoundingClientRect();\n const body = document.body;\n const clientTop = el.clientTop || body.clientTop || 0;\n const clientLeft = el.clientLeft || body.clientLeft || 0;\n const scrollTop = el === window ? window.scrollY : el.scrollTop;\n const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n return {\n top: box.top + scrollTop - clientTop,\n left: box.left + scrollLeft - clientLeft,\n };\n }\n\n return null;\n}\nfunction hide() {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.display = 'none';\n }\n return this;\n}\nfunction show() {\n const window = getWindow();\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (el.style.display === 'none') {\n el.style.display = '';\n }\n if (\n window.getComputedStyle(el, null).getPropertyValue('display') === 'none'\n ) {\n // Still not visible\n el.style.display = 'block';\n }\n }\n return this;\n}\nfunction styles() {\n const window = getWindow();\n if (this[0]) return window.getComputedStyle(this[0], null);\n return {};\n}\nfunction css(props, value) {\n const window = getWindow();\n let i;\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n // .css('width')\n if (this[0])\n return window.getComputedStyle(this[0], null).getPropertyValue(props);\n } else {\n // .css({ width: '100px' })\n for (i = 0; i < this.length; i += 1) {\n for (const prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n return this;\n }\n }\n if (arguments.length === 2 && typeof props === 'string') {\n // .css('width', '100px')\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n return this;\n }\n return this;\n}\nfunction each(callback) {\n if (!callback) return this;\n this.forEach((el, index) => {\n callback.apply(el, [el, index]);\n });\n return this;\n}\nfunction filter(callback) {\n const result = arrayFilter(this, callback);\n return $(result);\n}\nfunction html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n return this;\n}\nfunction text(text) {\n if (typeof text === 'undefined') {\n return this[0] ? this[0].textContent.trim() : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n return this;\n}\nfunction is(selector) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n let compareWith;\n let i;\n if (!el || typeof selector === 'undefined') return false;\n if (typeof selector === 'string') {\n if (el.matches) return el.matches(selector);\n if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n\n compareWith = $(selector);\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n return false;\n }\n if (selector === document) {\n return el === document;\n }\n if (selector === window) {\n return el === window;\n }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n return false;\n }\n return false;\n}\nfunction index() {\n let child = this[0];\n let i;\n if (child) {\n i = 0;\n // eslint-disable-next-line\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) i += 1;\n }\n return i;\n }\n return undefined;\n}\nfunction eq(index) {\n if (typeof index === 'undefined') return this;\n const length = this.length;\n if (index > length - 1) {\n return $([]);\n }\n if (index < 0) {\n const returnIndex = length + index;\n if (returnIndex < 0) return $([]);\n return $([this[returnIndex]]);\n }\n return $([this[index]]);\n}\nfunction append(...els) {\n let newChild;\n const document = getDocument();\n\n for (let k = 0; k < els.length; k += 1) {\n newChild = els[k];\n for (let i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (let j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n}\nfunction appendTo(parent) {\n $(parent).append(this);\n return this;\n}\nfunction prepend(newChild) {\n const document = getDocument();\n let i;\n let j;\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n return this;\n}\nfunction prependTo(parent) {\n $(parent).prepend(this);\n return this;\n}\nfunction insertBefore(selector) {\n const before = $(selector);\n for (let i = 0; i < this.length; i += 1) {\n if (before.length === 1) {\n before[0].parentNode.insertBefore(this[i], before[0]);\n } else if (before.length > 1) {\n for (let j = 0; j < before.length; j += 1) {\n before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n }\n }\n }\n}\nfunction insertAfter(selector) {\n const after = $(selector);\n for (let i = 0; i < this.length; i += 1) {\n if (after.length === 1) {\n after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n } else if (after.length > 1) {\n for (let j = 0; j < after.length; j += 1) {\n after[j].parentNode.insertBefore(\n this[i].cloneNode(true),\n after[j].nextSibling,\n );\n }\n }\n }\n}\nfunction next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (\n this[0].nextElementSibling &&\n $(this[0].nextElementSibling).is(selector)\n ) {\n return $([this[0].nextElementSibling]);\n }\n return $([]);\n }\n\n if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n return $([]);\n }\n return $([]);\n}\nfunction nextAll(selector) {\n const nextEls = [];\n let el = this[0];\n if (!el) return $([]);\n while (el.nextElementSibling) {\n const next = el.nextElementSibling; // eslint-disable-line\n if (selector) {\n if ($(next).is(selector)) nextEls.push(next);\n } else nextEls.push(next);\n el = next;\n }\n return $(nextEls);\n}\nfunction prev(selector) {\n if (this.length > 0) {\n const el = this[0];\n if (selector) {\n if (\n el.previousElementSibling &&\n $(el.previousElementSibling).is(selector)\n ) {\n return $([el.previousElementSibling]);\n }\n return $([]);\n }\n\n if (el.previousElementSibling) return $([el.previousElementSibling]);\n return $([]);\n }\n return $([]);\n}\nfunction prevAll(selector) {\n const prevEls = [];\n let el = this[0];\n if (!el) return $([]);\n while (el.previousElementSibling) {\n const prev = el.previousElementSibling; // eslint-disable-line\n if (selector) {\n if ($(prev).is(selector)) prevEls.push(prev);\n } else prevEls.push(prev);\n el = prev;\n }\n return $(prevEls);\n}\nfunction siblings(selector) {\n return this.nextAll(selector).add(this.prevAll(selector));\n}\nfunction parent(selector) {\n const parents = []; // eslint-disable-line\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector))\n parents.push(this[i].parentNode);\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n return $(parents);\n}\nfunction parents(selector) {\n const parents = []; // eslint-disable-line\n for (let i = 0; i < this.length; i += 1) {\n let parent = this[i].parentNode; // eslint-disable-line\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) parents.push(parent);\n } else {\n parents.push(parent);\n }\n parent = parent.parentNode;\n }\n }\n return $(parents);\n}\nfunction closest(selector) {\n let closest = this; // eslint-disable-line\n if (typeof selector === 'undefined') {\n return $([]);\n }\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n return closest;\n}\nfunction find(selector) {\n const foundElements = [];\n for (let i = 0; i < this.length; i += 1) {\n const found = this[i].querySelectorAll(selector);\n for (let j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n return $(foundElements);\n}\nfunction children(selector) {\n const children = []; // eslint-disable-line\n for (let i = 0; i < this.length; i += 1) {\n const childNodes = this[i].children;\n\n for (let j = 0; j < childNodes.length; j += 1) {\n if (!selector || $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n return $(children);\n}\nfunction remove() {\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n }\n return this;\n}\nfunction detach() {\n return this.remove();\n}\nfunction add(...els) {\n const dom = this;\n let i;\n let j;\n for (i = 0; i < els.length; i += 1) {\n const toAdd = $(els[i]);\n for (j = 0; j < toAdd.length; j += 1) {\n dom.push(toAdd[j]);\n }\n }\n return dom;\n}\nfunction empty() {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (el.nodeType === 1) {\n for (let j = 0; j < el.childNodes.length; j += 1) {\n if (el.childNodes[j].parentNode) {\n el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n }\n }\n el.textContent = '';\n }\n }\n return this;\n}\n\nexport {\n addClass,\n removeClass,\n toggleClass,\n hasClass,\n attr,\n removeAttr,\n prop,\n data,\n removeData,\n dataset,\n val,\n value,\n transform,\n transition,\n on,\n off,\n once,\n trigger,\n transitionEnd,\n animationEnd,\n width,\n outerWidth,\n height,\n outerHeight,\n offset,\n hide,\n show,\n styles,\n css,\n each,\n filter,\n html,\n text,\n is,\n index,\n eq,\n append,\n appendTo,\n prepend,\n prependTo,\n insertBefore,\n insertAfter,\n next,\n nextAll,\n prev,\n prevAll,\n siblings,\n parent,\n parents,\n closest,\n find,\n children,\n remove,\n detach,\n add,\n empty,\n};\n","// eslint-disable-next-line\nimport { getWindow } from 'ssr-window';\n\nfunction scrollTo(...args) {\n const window = getWindow();\n let [left, top, duration, easing, callback] = args;\n if (args.length === 4 && typeof easing === 'function') {\n callback = easing;\n [left, top, duration, callback, easing] = args;\n }\n if (typeof easing === 'undefined') easing = 'swing';\n\n return this.each(function animate() {\n const el = this;\n let currentTop;\n let currentLeft;\n let maxTop;\n let maxLeft;\n let newTop;\n let newLeft;\n let scrollTop; // eslint-disable-line\n let scrollLeft; // eslint-disable-line\n let animateTop = top > 0 || top === 0;\n let animateLeft = left > 0 || left === 0;\n if (typeof easing === 'undefined') {\n easing = 'swing';\n }\n if (animateTop) {\n currentTop = el.scrollTop;\n if (!duration) {\n el.scrollTop = top;\n }\n }\n if (animateLeft) {\n currentLeft = el.scrollLeft;\n if (!duration) {\n el.scrollLeft = left;\n }\n }\n if (!duration) return;\n if (animateTop) {\n maxTop = el.scrollHeight - el.offsetHeight;\n newTop = Math.max(Math.min(top, maxTop), 0);\n }\n if (animateLeft) {\n maxLeft = el.scrollWidth - el.offsetWidth;\n newLeft = Math.max(Math.min(left, maxLeft), 0);\n }\n let startTime = null;\n if (animateTop && newTop === currentTop) animateTop = false;\n if (animateLeft && newLeft === currentLeft) animateLeft = false;\n function render(time = new Date().getTime()) {\n if (startTime === null) {\n startTime = time;\n }\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress =\n easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n let done;\n if (animateTop)\n scrollTop = currentTop + easeProgress * (newTop - currentTop);\n if (animateLeft)\n scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (done) {\n if (callback) callback();\n return;\n }\n if (animateTop) el.scrollTop = scrollTop;\n if (animateLeft) el.scrollLeft = scrollLeft;\n window.requestAnimationFrame(render);\n }\n window.requestAnimationFrame(render);\n });\n}\n// scrollTop(top, duration, easing, callback) {\nfunction scrollTop(...args) {\n let [top, duration, easing, callback] = args;\n if (args.length === 3 && typeof easing === 'function') {\n [top, duration, callback, easing] = args;\n }\n const dom = this;\n if (typeof top === 'undefined') {\n if (dom.length > 0) return dom[0].scrollTop;\n return null;\n }\n return dom.scrollTo(undefined, top, duration, easing, callback);\n}\nfunction scrollLeft(...args) {\n let [left, duration, easing, callback] = args;\n if (args.length === 3 && typeof easing === 'function') {\n [left, duration, callback, easing] = args;\n }\n const dom = this;\n if (typeof left === 'undefined') {\n if (dom.length > 0) return dom[0].scrollLeft;\n return null;\n }\n return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\nexport { scrollTo, scrollTop, scrollLeft };\n","// eslint-disable-next-line\nimport { getWindow } from 'ssr-window';\n\nfunction animate(initialProps, initialParams) {\n const window = getWindow();\n const els = this;\n const a = {\n props: Object.assign({}, initialProps),\n params: Object.assign(\n {\n duration: 300,\n easing: 'swing', // or 'linear'\n /* Callbacks\n begin(elements)\n complete(elements)\n progress(elements, complete, remaining, start, tweenValue)\n */\n },\n initialParams,\n ),\n\n elements: els,\n animating: false,\n que: [],\n\n easingProgress(easing, progress) {\n if (easing === 'swing') {\n return 0.5 - Math.cos(progress * Math.PI) / 2;\n }\n if (typeof easing === 'function') {\n return easing(progress);\n }\n return progress;\n },\n stop() {\n if (a.frameId) {\n window.cancelAnimationFrame(a.frameId);\n }\n a.animating = false;\n a.elements.each((el) => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n a.que = [];\n },\n done(complete) {\n a.animating = false;\n a.elements.each((el) => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n if (complete) complete(els);\n if (a.que.length > 0) {\n const que = a.que.shift();\n a.animate(que[0], que[1]);\n }\n },\n animate(props, params) {\n if (a.animating) {\n a.que.push([props, params]);\n return a;\n }\n const elements = [];\n\n // Define & Cache Initials & Units\n a.elements.each((el, index) => {\n let initialFullValue;\n let initialValue;\n let unit;\n let finalValue;\n let finalFullValue;\n\n if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n\n elements[index] = {\n container: el,\n };\n Object.keys(props).forEach((prop) => {\n initialFullValue = window\n .getComputedStyle(el, null)\n .getPropertyValue(prop)\n .replace(',', '.');\n initialValue = parseFloat(initialFullValue);\n unit = initialFullValue.replace(initialValue, '');\n finalValue = parseFloat(props[prop]);\n finalFullValue = props[prop] + unit;\n elements[index][prop] = {\n initialFullValue,\n initialValue,\n unit,\n finalValue,\n finalFullValue,\n currentValue: initialValue,\n };\n });\n });\n\n let startTime = null;\n let time;\n let elementsDone = 0;\n let propsDone = 0;\n let done;\n let began = false;\n\n a.animating = true;\n\n function render() {\n time = new Date().getTime();\n let progress;\n let easeProgress;\n // let el;\n if (!began) {\n began = true;\n if (params.begin) params.begin(els);\n }\n if (startTime === null) {\n startTime = time;\n }\n if (params.progress) {\n // eslint-disable-next-line\n params.progress(\n els,\n Math.max(Math.min((time - startTime) / params.duration, 1), 0),\n startTime + params.duration - time < 0\n ? 0\n : startTime + params.duration - time,\n startTime,\n );\n }\n\n elements.forEach((element) => {\n const el = element;\n if (done || el.done) return;\n Object.keys(props).forEach((prop) => {\n if (done || el.done) return;\n progress = Math.max(\n Math.min((time - startTime) / params.duration, 1),\n 0,\n );\n easeProgress = a.easingProgress(params.easing, progress);\n const { initialValue, finalValue, unit } = el[prop];\n el[prop].currentValue =\n initialValue + easeProgress * (finalValue - initialValue);\n const currentValue = el[prop].currentValue;\n\n if (\n (finalValue > initialValue && currentValue >= finalValue) ||\n (finalValue < initialValue && currentValue <= finalValue)\n ) {\n el.container.style[prop] = finalValue + unit;\n propsDone += 1;\n if (propsDone === Object.keys(props).length) {\n el.done = true;\n elementsDone += 1;\n }\n if (elementsDone === elements.length) {\n done = true;\n }\n }\n if (done) {\n a.done(params.complete);\n return;\n }\n el.container.style[prop] = currentValue + unit;\n });\n });\n if (done) return;\n // Then call\n a.frameId = window.requestAnimationFrame(render);\n }\n a.frameId = window.requestAnimationFrame(render);\n return a;\n },\n };\n\n if (a.elements.length === 0) {\n return els;\n }\n\n let animateInstance;\n for (let i = 0; i < a.elements.length; i += 1) {\n if (a.elements[i].dom7AnimateInstance) {\n animateInstance = a.elements[i].dom7AnimateInstance;\n } else a.elements[i].dom7AnimateInstance = a;\n }\n if (!animateInstance) {\n animateInstance = a;\n }\n\n if (initialProps === 'stop') {\n animateInstance.stop();\n } else {\n animateInstance.animate(a.props, a.params);\n }\n\n return els;\n}\n\nfunction stop() {\n const els = this;\n for (let i = 0; i < els.length; i += 1) {\n if (els[i].dom7AnimateInstance) {\n els[i].dom7AnimateInstance.stop();\n }\n }\n}\n\nexport { animate, stop };\n","import $ from './$';\n\nconst noTrigger = 'resize scroll'.split(' ');\nfunction shortcut(name) {\n function eventHandler(...args) {\n if (typeof args[0] === 'undefined') {\n for (let i = 0; i < this.length; i += 1) {\n if (noTrigger.indexOf(name) < 0) {\n if (name in this[i]) this[i][name]();\n else {\n $(this[i]).trigger(name);\n }\n }\n }\n return this;\n }\n return this.on(name, ...args);\n }\n return eventHandler;\n}\nexport const click = shortcut('click');\nexport const blur = shortcut('blur');\nexport const focus = shortcut('focus');\nexport const focusin = shortcut('focusin');\nexport const focusout = shortcut('focusout');\nexport const keyup = shortcut('keyup');\nexport const keydown = shortcut('keydown');\nexport const keypress = shortcut('keypress');\nexport const submit = shortcut('submit');\nexport const change = shortcut('change');\nexport const mousedown = shortcut('mousedown');\nexport const mousemove = shortcut('mousemove');\nexport const mouseup = shortcut('mouseup');\nexport const mouseenter = shortcut('mouseenter');\nexport const mouseleave = shortcut('mouseleave');\nexport const mouseout = shortcut('mouseout');\nexport const mouseover = shortcut('mouseover');\nexport const touchstart = shortcut('touchstart');\nexport const touchend = shortcut('touchend');\nexport const touchmove = shortcut('touchmove');\nexport const resize = shortcut('resize');\nexport const scroll = shortcut('scroll');\n","import $ from './$';\nimport * as methods from './methods';\nimport * as scroll from './scroll';\nimport * as animate from './animate';\nimport * as shortcuts from './shortcuts';\n\n[methods, scroll, animate, shortcuts].forEach((group) => {\n Object.keys(group).forEach((methodName) => {\n $.fn[methodName] = group[methodName];\n });\n});\n\nexport default $;\n"],"names":["isObject","obj","constructor","Object","extend","target","src","keys","forEach","key","length","ssrDocument","body","addEventListener","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","createElement","children","childNodes","style","setAttribute","getElementsByTagName","createElementNS","importNode","location","hash","host","hostname","href","origin","pathname","protocol","search","getDocument","doc","document","ssrWindow","navigator","userAgent","history","replaceState","pushState","go","back","CustomEvent","getComputedStyle","getPropertyValue","Image","Date","screen","setTimeout","clearTimeout","matchMedia","requestAnimationFrame","callback","cancelAnimationFrame","id","getWindow","win","window","makeReactive","proto","__proto__","defineProperty","get","set","value","Dom7","Array","items","arrayFlat","arr","res","el","isArray","push","arrayFilter","prototype","filter","call","arrayUnique","uniqueArray","i","indexOf","toCamelCase","string","toLowerCase","replace","match","group","toUpperCase","qsa","selector","context","a","$","html","trim","toCreate","tempParent","innerHTML","nodeType","fn","addClass","classes","classNames","map","c","split","classList","add","removeClass","remove","toggleClass","className","toggle","hasClass","contains","attr","attrs","arguments","getAttribute","undefined","attrName","removeAttr","removeAttribute","prop","props","propName","data","dom7ElementDataStorage","dataKey","removeData","dataset","attributes","name","parseFloat","val","multiple","values","selectedOptions","j","options","selected","transform","transition","duration","transitionDuration","on","args","eventType","targetSelector","listener","capture","handleLiveEvent","e","eventData","dom7EventData","unshift","is","apply","parents","k","handleEvent","events","event","dom7Listeners","proxyListener","dom7LiveListeners","off","handlers","handler","splice","dom7proxy","once","dom","eventName","onceHandler","eventArgs","trigger","evt","detail","bubbles","cancelable","dataIndex","dispatchEvent","transitionEnd","fireCallBack","animationEnd","width","innerWidth","css","outerWidth","includeMargins","styles","offsetWidth","height","innerHeight","outerHeight","offsetHeight","offset","box","getBoundingClientRect","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","top","left","hide","display","show","each","index","result","text","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","append","els","newChild","tempDiv","firstChild","appendChild","appendTo","parent","prepend","insertBefore","prependTo","before","parentNode","cloneNode","insertAfter","after","nextSibling","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","siblings","closest","find","foundElements","found","removeChild","detach","toAdd","empty","scrollTo","easing","animate","currentTop","currentLeft","maxTop","maxLeft","newTop","newLeft","animateTop","animateLeft","scrollHeight","Math","max","min","scrollWidth","startTime","render","time","getTime","progress","easeProgress","cos","PI","done","initialProps","initialParams","assign","params","elements","animating","que","easingProgress","stop","frameId","element","dom7AnimateInstance","complete","shift","initialFullValue","initialValue","unit","finalValue","finalFullValue","container","currentValue","elementsDone","propsDone","began","begin","animateInstance","noTrigger","shortcut","eventHandler","click","focus","focusin","focusout","keyup","keydown","keypress","submit","change","mousedown","mousemove","mouseup","mouseenter","mouseleave","mouseout","mouseover","touchstart","touchend","touchmove","resize","scroll","methods","shortcuts","methodName"],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.min.js b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.min.js new file mode 100644 index 0000000..f160069 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.min.js @@ -0,0 +1,13 @@ +/** + * Dom7 4.0.1 + * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API + * https://framework7.io/docs/dom7.html + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Dom7=e()}(this,(function(){"use strict";function t(t){return null!==t&&"object"==typeof t&&"constructor"in t&&t.constructor===Object}function e(n={},i={}){Object.keys(i).forEach((o=>{void 0===n[o]?n[o]=i[o]:t(i[o])&&t(n[o])&&Object.keys(i[o]).length>0&&e(n[o],i[o])}))}const n={body:{},addEventListener(){},removeEventListener(){},activeElement:{blur(){},nodeName:""},querySelector:()=>null,querySelectorAll:()=>[],getElementById:()=>null,createEvent:()=>({initEvent(){}}),createElement:()=>({children:[],childNodes:[],style:{},setAttribute(){},getElementsByTagName:()=>[]}),createElementNS:()=>({}),importNode:()=>null,location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function i(){const t="undefined"!=typeof document?document:{};return e(t,n),t}const o={document:n,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState(){},pushState(){},go(){},back(){}},CustomEvent:function(){return this},addEventListener(){},removeEventListener(){},getComputedStyle:()=>({getPropertyValue:()=>""}),Image(){},Date(){},screen:{},setTimeout(){},clearTimeout(){},matchMedia:()=>({}),requestAnimationFrame:t=>"undefined"==typeof setTimeout?(t(),null):setTimeout(t,0),cancelAnimationFrame(t){"undefined"!=typeof setTimeout&&clearTimeout(t)}};function s(){const t="undefined"!=typeof window?window:{};return e(t,o),t}class r extends Array{constructor(t){super(...t||[]),function(t){const e=t.__proto__;Object.defineProperty(t,"__proto__",{get:()=>e,set(t){e.__proto__=t}})}(this)}}function l(t=[]){const e=[];return t.forEach((t=>{Array.isArray(t)?e.push(...l(t)):e.push(t)})),e}function h(t,e){return Array.prototype.filter.call(t,e)}function u(t,e){const n=s(),o=i();let l=[];if(!e&&t instanceof r)return t;if(!t)return new r(l);if("string"==typeof t){const n=t.trim();if(n.indexOf("<")>=0&&n.indexOf(">")>=0){let t="div";0===n.indexOf("t.split(" "))));return this.forEach((t=>{t.classList.add(...e)})),this},removeClass:function(...t){const e=l(t.map((t=>t.split(" "))));return this.forEach((t=>{t.classList.remove(...e)})),this},toggleClass:function(...t){const e=l(t.map((t=>t.split(" "))));this.forEach((t=>{e.forEach((e=>{t.classList.toggle(e)}))}))},hasClass:function(...t){const e=l(t.map((t=>t.split(" "))));return h(this,(t=>e.filter((e=>t.classList.contains(e))).length>0)).length>0},attr:function(t,e){if(1===arguments.length&&"string"==typeof t)return this[0]?this[0].getAttribute(t):void 0;for(let n=0;n=0&&(e[(n=o.name.split("data-")[1],n.toLowerCase().replace(/-(.)/g,((t,e)=>e.toUpperCase())))]=o.value)}var n;for(const t in e)"false"===e[t]?e[t]=!1:"true"===e[t]?e[t]=!0:parseFloat(e[t])===1*e[t]&&(e[t]*=1);return e},val:function(t){if(void 0===t){const t=this[0];if(!t)return;if(t.multiple&&"select"===t.nodeName.toLowerCase()){const e=[];for(let n=0;n=0;else n.value=t}return this},value:function(t){return this.val(t)},transform:function(t){for(let e=0;e=0;t-=1){const n=r[t];i&&n.listener===i||i&&n.listener&&n.listener.dom7proxy&&n.listener.dom7proxy===i?(s.removeEventListener(e,n.proxyListener,o),r.splice(t,1)):i||(s.removeEventListener(e,n.proxyListener,o),r.splice(t,1))}}}return this},once:function(...t){const e=this;let[n,i,o,s]=t;function r(...t){o.apply(this,t),e.off(n,i,r,s),r.dom7proxy&&delete r.dom7proxy}return"function"==typeof t[1]&&([n,o,s]=t,i=void 0),r.dom7proxy=o,e.on(n,i,r,s)},trigger:function(...t){const e=s(),n=t[0].split(" "),i=t[1];for(let o=0;oe>0)),o.dispatchEvent(n),o.dom7EventData=[],delete o.dom7EventData}}}return this},transitionEnd:function(t){const e=this;return t&&e.on("transitionend",(function n(i){i.target===this&&(t.call(this,i),e.off("transitionend",n))})),this},animationEnd:function(t){const e=this;return t&&e.on("animationend",(function n(i){i.target===this&&(t.call(this,i),e.off("animationend",n))})),this},width:function(){const t=s();return this[0]===t?t.innerWidth:this.length>0?parseFloat(this.css("width")):null},outerWidth:function(t){if(this.length>0){if(t){const t=this.styles();return this[0].offsetWidth+parseFloat(t.getPropertyValue("margin-right"))+parseFloat(t.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},height:function(){const t=s();return this[0]===t?t.innerHeight:this.length>0?parseFloat(this.css("height")):null},outerHeight:function(t){if(this.length>0){if(t){const t=this.styles();return this[0].offsetHeight+parseFloat(t.getPropertyValue("margin-top"))+parseFloat(t.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},offset:function(){if(this.length>0){const t=s(),e=i(),n=this[0],o=n.getBoundingClientRect(),r=e.body,l=n.clientTop||r.clientTop||0,h=n.clientLeft||r.clientLeft||0,u=n===t?t.scrollY:n.scrollTop,a=n===t?t.scrollX:n.scrollLeft;return{top:o.top+u-l,left:o.left+a-h}}return null},hide:function(){for(let t=0;t{t.apply(e,[e,n])})),this):this},filter:function(t){return u(h(this,t))},html:function(t){if(void 0===t)return this[0]?this[0].innerHTML:null;for(let e=0;ee-1)return u([]);if(t<0){const n=e+t;return u(n<0?[]:[this[n]])}return u([this[t]])},append:function(...t){let e;const n=i();for(let i=0;i=0;o-=1)this[n].insertBefore(i.childNodes[o],this[n].childNodes[0])}else if(t instanceof r)for(o=0;o1)for(let n=0;n1)for(let n=0;n0?t?this[0].nextElementSibling&&u(this[0].nextElementSibling).is(t)?u([this[0].nextElementSibling]):u([]):this[0].nextElementSibling?u([this[0].nextElementSibling]):u([]):u([])},nextAll:function(t){const e=[];let n=this[0];if(!n)return u([]);for(;n.nextElementSibling;){const i=n.nextElementSibling;t?u(i).is(t)&&e.push(i):e.push(i),n=i}return u(e)},prev:function(t){if(this.length>0){const e=this[0];return t?e.previousElementSibling&&u(e.previousElementSibling).is(t)?u([e.previousElementSibling]):u([]):e.previousElementSibling?u([e.previousElementSibling]):u([])}return u([])},prevAll:function(t){const e=[];let n=this[0];if(!n)return u([]);for(;n.previousElementSibling;){const i=n.previousElementSibling;t?u(i).is(t)&&e.push(i):e.push(i),n=i}return u(e)},siblings:function(t){return this.nextAll(t).add(this.prevAll(t))},parent:function(t){const e=[];for(let n=0;n0||0===i,g=n>0||0===n;if(void 0===r&&(r="swing"),m&&(s=t.scrollTop,o||(t.scrollTop=i)),g&&(h=t.scrollLeft,o||(t.scrollLeft=n)),!o)return;m&&(u=t.scrollHeight-t.offsetHeight,c=Math.max(Math.min(i,u),0)),g&&(a=t.scrollWidth-t.offsetWidth,f=Math.max(Math.min(n,a),0));let y=null;m&&c===s&&(m=!1),g&&f===h&&(g=!1),e.requestAnimationFrame((function n(i=(new Date).getTime()){null===y&&(y=i);const u=Math.max(Math.min((i-y)/o,1),0),a="linear"===r?u:.5-Math.cos(u*Math.PI)/2;let v;m&&(d=s+a*(c-s)),g&&(p=h+a*(f-h)),m&&c>s&&d>=c&&(t.scrollTop=c,v=!0),m&&ch&&p>=f&&(t.scrollLeft=f,v=!0),g&&f0?s[0].scrollTop:null:s.scrollTo(void 0,e,n,i,o)},scrollLeft:function(...t){let[e,n,i,o]=t;3===t.length&&"function"==typeof i&&([e,n,o,i]=t);const s=this;return void 0===e?s.length>0?s[0].scrollLeft:null:s.scrollTo(e,void 0,n,i,o)}});var f=Object.freeze({__proto__:null,animate:function(t,e){const n=s(),i=this,o={props:Object.assign({},t),params:Object.assign({duration:300,easing:"swing"},e),elements:i,animating:!1,que:[],easingProgress:(t,e)=>"swing"===t?.5-Math.cos(e*Math.PI)/2:"function"==typeof t?t(e):e,stop(){o.frameId&&n.cancelAnimationFrame(o.frameId),o.animating=!1,o.elements.each((t=>{delete t.dom7AnimateInstance})),o.que=[]},done(t){if(o.animating=!1,o.elements.each((t=>{delete t.dom7AnimateInstance})),t&&t(i),o.que.length>0){const t=o.que.shift();o.animate(t[0],t[1])}},animate(t,e){if(o.animating)return o.que.push([t,e]),o;const s=[];o.elements.each(((e,i)=>{let r,l,h,u,a;e.dom7AnimateInstance||(o.elements[i].dom7AnimateInstance=o),s[i]={container:e},Object.keys(t).forEach((o=>{r=n.getComputedStyle(e,null).getPropertyValue(o).replace(",","."),l=parseFloat(r),h=r.replace(l,""),u=parseFloat(t[o]),a=t[o]+h,s[i][o]={initialFullValue:r,initialValue:l,unit:h,finalValue:u,finalFullValue:a,currentValue:l}}))}));let r,l,h=null,u=0,a=0,c=!1;return o.animating=!0,o.frameId=n.requestAnimationFrame((function f(){let d,p;r=(new Date).getTime(),c||(c=!0,e.begin&&e.begin(i)),null===h&&(h=r),e.progress&&e.progress(i,Math.max(Math.min((r-h)/e.duration,1),0),h+e.duration-r<0?0:h+e.duration-r,h),s.forEach((n=>{const i=n;l||i.done||Object.keys(t).forEach((n=>{if(l||i.done)return;d=Math.max(Math.min((r-h)/e.duration,1),0),p=o.easingProgress(e.easing,d);const{initialValue:c,finalValue:f,unit:m}=i[n];i[n].currentValue=c+p*(f-c);const g=i[n].currentValue;(f>c&&g>=f||f{Object.keys(t).forEach((e=>{u.fn[e]=t[e]}))})),u})); +//# sourceMappingURL=dom7.min.js.map \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.min.js.map b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.min.js.map new file mode 100644 index 0000000..426ac13 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/dom7/dom7.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../node_modules/ssr-window/ssr-window.esm.js","../src/dom7-class.js","../src/utils.js","../src/$.js","../src/methods.js","../src/scroll.js","../src/animate.js","../src/shortcuts.js","../src/dom7.bundle.js"],"names":["isObject","obj","constructor","Object","extend","target","src","keys","forEach","key","length","ssrDocument","body","addEventListener","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","createElement","children","childNodes","style","setAttribute","getElementsByTagName","createElementNS","importNode","location","hash","host","hostname","href","origin","pathname","protocol","search","getDocument","doc","document","ssrWindow","navigator","userAgent","history","replaceState","pushState","go","back","CustomEvent","this","getComputedStyle","getPropertyValue","Image","Date","screen","setTimeout","clearTimeout","matchMedia","requestAnimationFrame","callback","cancelAnimationFrame","id","getWindow","win","window","Dom7","Array","items","super","proto","__proto__","defineProperty","get","set","value","makeReactive","arrayFlat","arr","res","el","isArray","push","arrayFilter","prototype","filter","call","$","selector","context","html","trim","indexOf","toCreate","tempParent","innerHTML","i","a","qsa","nodeType","uniqueArray","arrayUnique","fn","classes","classNames","map","c","split","classList","add","remove","className","toggle","contains","attrs","arguments","getAttribute","attrName","attr","removeAttribute","props","propName","dom7ElementDataStorage","dataKey","dataset","attributes","name","string","toLowerCase","replace","match","group","toUpperCase","parseFloat","multiple","values","selectedOptions","j","options","selected","val","transform","duration","transitionDuration","args","eventType","targetSelector","listener","capture","handleLiveEvent","e","eventData","dom7EventData","unshift","is","apply","parents","k","handleEvent","undefined","events","event","dom7LiveListeners","proxyListener","dom7Listeners","handlers","handler","dom7proxy","splice","dom","eventName","onceHandler","eventArgs","off","on","evt","detail","bubbles","cancelable","data","dataIndex","dispatchEvent","fireCallBack","innerWidth","css","includeMargins","styles","offsetWidth","innerHeight","offsetHeight","box","getBoundingClientRect","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","top","left","display","prop","index","text","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","returnIndex","els","newChild","tempDiv","firstChild","appendChild","parent","append","insertBefore","prepend","before","parentNode","cloneNode","after","nextSibling","nextElementSibling","nextEls","next","previousElementSibling","prevEls","prev","nextAll","prevAll","closest","eq","foundElements","found","removeChild","toAdd","easing","each","currentTop","currentLeft","maxTop","maxLeft","newTop","newLeft","animateTop","animateLeft","scrollHeight","Math","max","min","scrollWidth","startTime","render","time","getTime","progress","easeProgress","cos","PI","done","scrollTo","initialProps","initialParams","assign","params","elements","animating","que","easingProgress","stop","frameId","dom7AnimateInstance","complete","shift","animate","initialFullValue","initialValue","unit","finalValue","finalFullValue","container","currentValue","elementsDone","propsDone","began","begin","element","animateInstance","noTrigger","shortcut","trigger","click","focus","focusin","focusout","keyup","keydown","keypress","submit","change","mousedown","mousemove","mouseup","mouseenter","mouseleave","mouseout","mouseover","touchstart","touchend","touchmove","resize","scroll","methods","methodName"],"mappings":"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","file":"dom7.min.js","sourcesContent":["/**\n * SSR Window 4.0.0\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: August 25, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n return (obj !== null &&\n typeof obj === 'object' &&\n 'constructor' in obj &&\n obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n Object.keys(src).forEach((key) => {\n if (typeof target[key] === 'undefined')\n target[key] = src[key];\n else if (isObject(src[key]) &&\n isObject(target[key]) &&\n Object.keys(src[key]).length > 0) {\n extend(target[key], src[key]);\n }\n });\n}\n\nconst ssrDocument = {\n body: {},\n addEventListener() { },\n removeEventListener() { },\n activeElement: {\n blur() { },\n nodeName: '',\n },\n querySelector() {\n return null;\n },\n querySelectorAll() {\n return [];\n },\n getElementById() {\n return null;\n },\n createEvent() {\n return {\n initEvent() { },\n };\n },\n createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute() { },\n getElementsByTagName() {\n return [];\n },\n };\n },\n createElementNS() {\n return {};\n },\n importNode() {\n return null;\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n};\nfunction getDocument() {\n const doc = typeof document !== 'undefined' ? document : {};\n extend(doc, ssrDocument);\n return doc;\n}\n\nconst ssrWindow = {\n document: ssrDocument,\n navigator: {\n userAgent: '',\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n history: {\n replaceState() { },\n pushState() { },\n go() { },\n back() { },\n },\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener() { },\n removeEventListener() { },\n getComputedStyle() {\n return {\n getPropertyValue() {\n return '';\n },\n };\n },\n Image() { },\n Date() { },\n screen: {},\n setTimeout() { },\n clearTimeout() { },\n matchMedia() {\n return {};\n },\n requestAnimationFrame(callback) {\n if (typeof setTimeout === 'undefined') {\n callback();\n return null;\n }\n return setTimeout(callback, 0);\n },\n cancelAnimationFrame(id) {\n if (typeof setTimeout === 'undefined') {\n return;\n }\n clearTimeout(id);\n },\n};\nfunction getWindow() {\n const win = typeof window !== 'undefined' ? window : {};\n extend(win, ssrWindow);\n return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n const proto = obj.__proto__;\n Object.defineProperty(obj, '__proto__', {\n get() {\n return proto;\n },\n set(value) {\n proto.__proto__ = value;\n },\n });\n}\nclass Dom7 extends Array {\n constructor(items) {\n super(...(items || []));\n\n makeReactive(this);\n }\n}\nexport default Dom7;\n","export function arrayFlat(arr = []) {\n const res = [];\n arr.forEach((el) => {\n if (Array.isArray(el)) {\n res.push(...arrayFlat(el));\n } else {\n res.push(el);\n }\n });\n return res;\n}\nexport function arrayFilter(arr, callback) {\n return Array.prototype.filter.call(arr, callback);\n}\nexport function arrayUnique(arr) {\n const uniqueArray = [];\n for (let i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n }\n return uniqueArray;\n}\nexport function toCamelCase(string) {\n return string\n .toLowerCase()\n .replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n","// eslint-disable-next-line\nimport { getWindow, getDocument } from 'ssr-window';\nimport Dom7 from './dom7-class';\nimport { arrayUnique } from './utils';\n\nfunction qsa(selector, context) {\n if (typeof selector !== 'string') {\n return [selector];\n }\n const a = [];\n const res = context.querySelectorAll(selector);\n for (let i = 0; i < res.length; i += 1) {\n a.push(res[i]);\n }\n return a;\n}\n\nfunction $(selector, context) {\n const window = getWindow();\n const document = getDocument();\n let arr = [];\n if (!context && selector instanceof Dom7) {\n return selector;\n }\n if (!selector) {\n return new Dom7(arr);\n }\n if (typeof selector === 'string') {\n const html = selector.trim();\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n let toCreate = 'div';\n if (html.indexOf(' c.split(' ')));\n this.forEach((el) => {\n el.classList.add(...classNames);\n });\n return this;\n}\nfunction removeClass(...classes) {\n const classNames = arrayFlat(classes.map((c) => c.split(' ')));\n this.forEach((el) => {\n el.classList.remove(...classNames);\n });\n return this;\n}\nfunction toggleClass(...classes) {\n const classNames = arrayFlat(classes.map((c) => c.split(' ')));\n this.forEach((el) => {\n classNames.forEach((className) => {\n el.classList.toggle(className);\n });\n });\n}\nfunction hasClass(...classes) {\n const classNames = arrayFlat(classes.map((c) => c.split(' ')));\n return (\n arrayFilter(this, (el) => {\n return (\n classNames.filter((className) => el.classList.contains(className))\n .length > 0\n );\n }).length > 0\n );\n}\nfunction attr(attrs, value) {\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) return this[0].getAttribute(attrs);\n return undefined;\n }\n\n // Set attrs\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n for (const attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n return this;\n}\nfunction removeAttr(attr) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n return this;\n}\nfunction prop(props, value) {\n if (arguments.length === 1 && typeof props === 'string') {\n // Get prop\n if (this[0]) return this[0][props];\n } else {\n // Set props\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i][props] = value;\n } else {\n // Object\n for (const propName in props) {\n this[i][propName] = props[propName];\n }\n }\n }\n return this;\n }\n return this;\n}\nfunction data(key, value) {\n let el;\n if (typeof value === 'undefined') {\n el = this[0];\n if (!el) return undefined;\n // Get value\n if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n return el.dom7ElementDataStorage[key];\n }\n\n const dataKey = el.getAttribute(`data-${key}`);\n if (dataKey) {\n return dataKey;\n }\n return undefined;\n }\n\n // Set value\n for (let i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n el.dom7ElementDataStorage[key] = value;\n }\n return this;\n}\nfunction removeData(key) {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n el.dom7ElementDataStorage[key] = null;\n delete el.dom7ElementDataStorage[key];\n }\n }\n}\nfunction dataset() {\n const el = this[0];\n if (!el) return undefined;\n const dataset = {}; // eslint-disable-line\n if (el.dataset) {\n for (const dataKey in el.dataset) {\n dataset[dataKey] = el.dataset[dataKey];\n }\n } else {\n for (let i = 0; i < el.attributes.length; i += 1) {\n const attr = el.attributes[i];\n if (attr.name.indexOf('data-') >= 0) {\n dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n }\n }\n }\n for (const key in dataset) {\n if (dataset[key] === 'false') dataset[key] = false;\n else if (dataset[key] === 'true') dataset[key] = true;\n else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n }\n return dataset;\n}\nfunction val(value) {\n if (typeof value === 'undefined') {\n // get value\n const el = this[0];\n if (!el) return undefined;\n if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n const values = [];\n for (let i = 0; i < el.selectedOptions.length; i += 1) {\n values.push(el.selectedOptions[i].value);\n }\n return values;\n }\n return el.value;\n }\n\n // set value\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (\n Array.isArray(value) &&\n el.multiple &&\n el.nodeName.toLowerCase() === 'select'\n ) {\n for (let j = 0; j < el.options.length; j += 1) {\n el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n }\n } else {\n el.value = value;\n }\n }\n return this;\n}\nfunction value(value) {\n return this.val(value);\n}\nfunction transform(transform) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transform = transform;\n }\n return this;\n}\nfunction transition(duration) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transitionDuration =\n typeof duration !== 'string' ? `${duration}ms` : duration;\n }\n return this;\n}\nfunction on(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n if (!capture) capture = false;\n\n function handleLiveEvent(e) {\n const target = e.target;\n if (!target) return;\n const eventData = e.target.dom7EventData || [];\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n if ($(target).is(targetSelector)) listener.apply(target, eventData);\n else {\n const parents = $(target).parents(); // eslint-disable-line\n for (let k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector))\n listener.apply(parents[k], eventData);\n }\n }\n }\n function handleEvent(e) {\n const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n listener.apply(this, eventData);\n }\n const events = eventType.split(' ');\n let j;\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7Listeners) el.dom7Listeners = {};\n if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n el.dom7Listeners[event].push({\n listener,\n proxyListener: handleEvent,\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n el.dom7LiveListeners[event].push({\n listener,\n proxyListener: handleLiveEvent,\n });\n el.addEventListener(event, handleLiveEvent, capture);\n }\n }\n }\n return this;\n}\nfunction off(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n if (!capture) capture = false;\n\n const events = eventType.split(' ');\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n let handlers;\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n if (handlers && handlers.length) {\n for (let k = handlers.length - 1; k >= 0; k -= 1) {\n const handler = handlers[k];\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (\n listener &&\n handler.listener &&\n handler.listener.dom7proxy &&\n handler.listener.dom7proxy === listener\n ) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n return this;\n}\nfunction once(...args) {\n const dom = this;\n let [eventName, targetSelector, listener, capture] = args;\n if (typeof args[1] === 'function') {\n [eventName, listener, capture] = args;\n targetSelector = undefined;\n }\n function onceHandler(...eventArgs) {\n listener.apply(this, eventArgs);\n dom.off(eventName, targetSelector, onceHandler, capture);\n if (onceHandler.dom7proxy) {\n delete onceHandler.dom7proxy;\n }\n }\n onceHandler.dom7proxy = listener;\n return dom.on(eventName, targetSelector, onceHandler, capture);\n}\nfunction trigger(...args) {\n const window = getWindow();\n const events = args[0].split(' ');\n const eventData = args[1];\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n if (window.CustomEvent) {\n const evt = new window.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true,\n });\n el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n }\n return this;\n}\nfunction transitionEnd(callback) {\n const dom = this;\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('transitionend', fireCallBack);\n }\n if (callback) {\n dom.on('transitionend', fireCallBack);\n }\n return this;\n}\nfunction animationEnd(callback) {\n const dom = this;\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('animationend', fireCallBack);\n }\n if (callback) {\n dom.on('animationend', fireCallBack);\n }\n return this;\n}\nfunction width() {\n const window = getWindow();\n if (this[0] === window) {\n return window.innerWidth;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('width'));\n }\n\n return null;\n}\nfunction outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return (\n this[0].offsetWidth +\n parseFloat(styles.getPropertyValue('margin-right')) +\n parseFloat(styles.getPropertyValue('margin-left'))\n );\n }\n return this[0].offsetWidth;\n }\n return null;\n}\nfunction height() {\n const window = getWindow();\n if (this[0] === window) {\n return window.innerHeight;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('height'));\n }\n\n return null;\n}\nfunction outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return (\n this[0].offsetHeight +\n parseFloat(styles.getPropertyValue('margin-top')) +\n parseFloat(styles.getPropertyValue('margin-bottom'))\n );\n }\n return this[0].offsetHeight;\n }\n return null;\n}\nfunction offset() {\n if (this.length > 0) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n const box = el.getBoundingClientRect();\n const body = document.body;\n const clientTop = el.clientTop || body.clientTop || 0;\n const clientLeft = el.clientLeft || body.clientLeft || 0;\n const scrollTop = el === window ? window.scrollY : el.scrollTop;\n const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n return {\n top: box.top + scrollTop - clientTop,\n left: box.left + scrollLeft - clientLeft,\n };\n }\n\n return null;\n}\nfunction hide() {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.display = 'none';\n }\n return this;\n}\nfunction show() {\n const window = getWindow();\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (el.style.display === 'none') {\n el.style.display = '';\n }\n if (\n window.getComputedStyle(el, null).getPropertyValue('display') === 'none'\n ) {\n // Still not visible\n el.style.display = 'block';\n }\n }\n return this;\n}\nfunction styles() {\n const window = getWindow();\n if (this[0]) return window.getComputedStyle(this[0], null);\n return {};\n}\nfunction css(props, value) {\n const window = getWindow();\n let i;\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n // .css('width')\n if (this[0])\n return window.getComputedStyle(this[0], null).getPropertyValue(props);\n } else {\n // .css({ width: '100px' })\n for (i = 0; i < this.length; i += 1) {\n for (const prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n return this;\n }\n }\n if (arguments.length === 2 && typeof props === 'string') {\n // .css('width', '100px')\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n return this;\n }\n return this;\n}\nfunction each(callback) {\n if (!callback) return this;\n this.forEach((el, index) => {\n callback.apply(el, [el, index]);\n });\n return this;\n}\nfunction filter(callback) {\n const result = arrayFilter(this, callback);\n return $(result);\n}\nfunction html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n return this;\n}\nfunction text(text) {\n if (typeof text === 'undefined') {\n return this[0] ? this[0].textContent.trim() : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n return this;\n}\nfunction is(selector) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n let compareWith;\n let i;\n if (!el || typeof selector === 'undefined') return false;\n if (typeof selector === 'string') {\n if (el.matches) return el.matches(selector);\n if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n\n compareWith = $(selector);\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n return false;\n }\n if (selector === document) {\n return el === document;\n }\n if (selector === window) {\n return el === window;\n }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n return false;\n }\n return false;\n}\nfunction index() {\n let child = this[0];\n let i;\n if (child) {\n i = 0;\n // eslint-disable-next-line\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) i += 1;\n }\n return i;\n }\n return undefined;\n}\nfunction eq(index) {\n if (typeof index === 'undefined') return this;\n const length = this.length;\n if (index > length - 1) {\n return $([]);\n }\n if (index < 0) {\n const returnIndex = length + index;\n if (returnIndex < 0) return $([]);\n return $([this[returnIndex]]);\n }\n return $([this[index]]);\n}\nfunction append(...els) {\n let newChild;\n const document = getDocument();\n\n for (let k = 0; k < els.length; k += 1) {\n newChild = els[k];\n for (let i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (let j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n}\nfunction appendTo(parent) {\n $(parent).append(this);\n return this;\n}\nfunction prepend(newChild) {\n const document = getDocument();\n let i;\n let j;\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n return this;\n}\nfunction prependTo(parent) {\n $(parent).prepend(this);\n return this;\n}\nfunction insertBefore(selector) {\n const before = $(selector);\n for (let i = 0; i < this.length; i += 1) {\n if (before.length === 1) {\n before[0].parentNode.insertBefore(this[i], before[0]);\n } else if (before.length > 1) {\n for (let j = 0; j < before.length; j += 1) {\n before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n }\n }\n }\n}\nfunction insertAfter(selector) {\n const after = $(selector);\n for (let i = 0; i < this.length; i += 1) {\n if (after.length === 1) {\n after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n } else if (after.length > 1) {\n for (let j = 0; j < after.length; j += 1) {\n after[j].parentNode.insertBefore(\n this[i].cloneNode(true),\n after[j].nextSibling,\n );\n }\n }\n }\n}\nfunction next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (\n this[0].nextElementSibling &&\n $(this[0].nextElementSibling).is(selector)\n ) {\n return $([this[0].nextElementSibling]);\n }\n return $([]);\n }\n\n if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n return $([]);\n }\n return $([]);\n}\nfunction nextAll(selector) {\n const nextEls = [];\n let el = this[0];\n if (!el) return $([]);\n while (el.nextElementSibling) {\n const next = el.nextElementSibling; // eslint-disable-line\n if (selector) {\n if ($(next).is(selector)) nextEls.push(next);\n } else nextEls.push(next);\n el = next;\n }\n return $(nextEls);\n}\nfunction prev(selector) {\n if (this.length > 0) {\n const el = this[0];\n if (selector) {\n if (\n el.previousElementSibling &&\n $(el.previousElementSibling).is(selector)\n ) {\n return $([el.previousElementSibling]);\n }\n return $([]);\n }\n\n if (el.previousElementSibling) return $([el.previousElementSibling]);\n return $([]);\n }\n return $([]);\n}\nfunction prevAll(selector) {\n const prevEls = [];\n let el = this[0];\n if (!el) return $([]);\n while (el.previousElementSibling) {\n const prev = el.previousElementSibling; // eslint-disable-line\n if (selector) {\n if ($(prev).is(selector)) prevEls.push(prev);\n } else prevEls.push(prev);\n el = prev;\n }\n return $(prevEls);\n}\nfunction siblings(selector) {\n return this.nextAll(selector).add(this.prevAll(selector));\n}\nfunction parent(selector) {\n const parents = []; // eslint-disable-line\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector))\n parents.push(this[i].parentNode);\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n return $(parents);\n}\nfunction parents(selector) {\n const parents = []; // eslint-disable-line\n for (let i = 0; i < this.length; i += 1) {\n let parent = this[i].parentNode; // eslint-disable-line\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) parents.push(parent);\n } else {\n parents.push(parent);\n }\n parent = parent.parentNode;\n }\n }\n return $(parents);\n}\nfunction closest(selector) {\n let closest = this; // eslint-disable-line\n if (typeof selector === 'undefined') {\n return $([]);\n }\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n return closest;\n}\nfunction find(selector) {\n const foundElements = [];\n for (let i = 0; i < this.length; i += 1) {\n const found = this[i].querySelectorAll(selector);\n for (let j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n return $(foundElements);\n}\nfunction children(selector) {\n const children = []; // eslint-disable-line\n for (let i = 0; i < this.length; i += 1) {\n const childNodes = this[i].children;\n\n for (let j = 0; j < childNodes.length; j += 1) {\n if (!selector || $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n return $(children);\n}\nfunction remove() {\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n }\n return this;\n}\nfunction detach() {\n return this.remove();\n}\nfunction add(...els) {\n const dom = this;\n let i;\n let j;\n for (i = 0; i < els.length; i += 1) {\n const toAdd = $(els[i]);\n for (j = 0; j < toAdd.length; j += 1) {\n dom.push(toAdd[j]);\n }\n }\n return dom;\n}\nfunction empty() {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n if (el.nodeType === 1) {\n for (let j = 0; j < el.childNodes.length; j += 1) {\n if (el.childNodes[j].parentNode) {\n el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n }\n }\n el.textContent = '';\n }\n }\n return this;\n}\n\nexport {\n addClass,\n removeClass,\n toggleClass,\n hasClass,\n attr,\n removeAttr,\n prop,\n data,\n removeData,\n dataset,\n val,\n value,\n transform,\n transition,\n on,\n off,\n once,\n trigger,\n transitionEnd,\n animationEnd,\n width,\n outerWidth,\n height,\n outerHeight,\n offset,\n hide,\n show,\n styles,\n css,\n each,\n filter,\n html,\n text,\n is,\n index,\n eq,\n append,\n appendTo,\n prepend,\n prependTo,\n insertBefore,\n insertAfter,\n next,\n nextAll,\n prev,\n prevAll,\n siblings,\n parent,\n parents,\n closest,\n find,\n children,\n remove,\n detach,\n add,\n empty,\n};\n","// eslint-disable-next-line\nimport { getWindow } from 'ssr-window';\n\nfunction scrollTo(...args) {\n const window = getWindow();\n let [left, top, duration, easing, callback] = args;\n if (args.length === 4 && typeof easing === 'function') {\n callback = easing;\n [left, top, duration, callback, easing] = args;\n }\n if (typeof easing === 'undefined') easing = 'swing';\n\n return this.each(function animate() {\n const el = this;\n let currentTop;\n let currentLeft;\n let maxTop;\n let maxLeft;\n let newTop;\n let newLeft;\n let scrollTop; // eslint-disable-line\n let scrollLeft; // eslint-disable-line\n let animateTop = top > 0 || top === 0;\n let animateLeft = left > 0 || left === 0;\n if (typeof easing === 'undefined') {\n easing = 'swing';\n }\n if (animateTop) {\n currentTop = el.scrollTop;\n if (!duration) {\n el.scrollTop = top;\n }\n }\n if (animateLeft) {\n currentLeft = el.scrollLeft;\n if (!duration) {\n el.scrollLeft = left;\n }\n }\n if (!duration) return;\n if (animateTop) {\n maxTop = el.scrollHeight - el.offsetHeight;\n newTop = Math.max(Math.min(top, maxTop), 0);\n }\n if (animateLeft) {\n maxLeft = el.scrollWidth - el.offsetWidth;\n newLeft = Math.max(Math.min(left, maxLeft), 0);\n }\n let startTime = null;\n if (animateTop && newTop === currentTop) animateTop = false;\n if (animateLeft && newLeft === currentLeft) animateLeft = false;\n function render(time = new Date().getTime()) {\n if (startTime === null) {\n startTime = time;\n }\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress =\n easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n let done;\n if (animateTop)\n scrollTop = currentTop + easeProgress * (newTop - currentTop);\n if (animateLeft)\n scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (done) {\n if (callback) callback();\n return;\n }\n if (animateTop) el.scrollTop = scrollTop;\n if (animateLeft) el.scrollLeft = scrollLeft;\n window.requestAnimationFrame(render);\n }\n window.requestAnimationFrame(render);\n });\n}\n// scrollTop(top, duration, easing, callback) {\nfunction scrollTop(...args) {\n let [top, duration, easing, callback] = args;\n if (args.length === 3 && typeof easing === 'function') {\n [top, duration, callback, easing] = args;\n }\n const dom = this;\n if (typeof top === 'undefined') {\n if (dom.length > 0) return dom[0].scrollTop;\n return null;\n }\n return dom.scrollTo(undefined, top, duration, easing, callback);\n}\nfunction scrollLeft(...args) {\n let [left, duration, easing, callback] = args;\n if (args.length === 3 && typeof easing === 'function') {\n [left, duration, callback, easing] = args;\n }\n const dom = this;\n if (typeof left === 'undefined') {\n if (dom.length > 0) return dom[0].scrollLeft;\n return null;\n }\n return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\nexport { scrollTo, scrollTop, scrollLeft };\n","// eslint-disable-next-line\nimport { getWindow } from 'ssr-window';\n\nfunction animate(initialProps, initialParams) {\n const window = getWindow();\n const els = this;\n const a = {\n props: Object.assign({}, initialProps),\n params: Object.assign(\n {\n duration: 300,\n easing: 'swing', // or 'linear'\n /* Callbacks\n begin(elements)\n complete(elements)\n progress(elements, complete, remaining, start, tweenValue)\n */\n },\n initialParams,\n ),\n\n elements: els,\n animating: false,\n que: [],\n\n easingProgress(easing, progress) {\n if (easing === 'swing') {\n return 0.5 - Math.cos(progress * Math.PI) / 2;\n }\n if (typeof easing === 'function') {\n return easing(progress);\n }\n return progress;\n },\n stop() {\n if (a.frameId) {\n window.cancelAnimationFrame(a.frameId);\n }\n a.animating = false;\n a.elements.each((el) => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n a.que = [];\n },\n done(complete) {\n a.animating = false;\n a.elements.each((el) => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n if (complete) complete(els);\n if (a.que.length > 0) {\n const que = a.que.shift();\n a.animate(que[0], que[1]);\n }\n },\n animate(props, params) {\n if (a.animating) {\n a.que.push([props, params]);\n return a;\n }\n const elements = [];\n\n // Define & Cache Initials & Units\n a.elements.each((el, index) => {\n let initialFullValue;\n let initialValue;\n let unit;\n let finalValue;\n let finalFullValue;\n\n if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n\n elements[index] = {\n container: el,\n };\n Object.keys(props).forEach((prop) => {\n initialFullValue = window\n .getComputedStyle(el, null)\n .getPropertyValue(prop)\n .replace(',', '.');\n initialValue = parseFloat(initialFullValue);\n unit = initialFullValue.replace(initialValue, '');\n finalValue = parseFloat(props[prop]);\n finalFullValue = props[prop] + unit;\n elements[index][prop] = {\n initialFullValue,\n initialValue,\n unit,\n finalValue,\n finalFullValue,\n currentValue: initialValue,\n };\n });\n });\n\n let startTime = null;\n let time;\n let elementsDone = 0;\n let propsDone = 0;\n let done;\n let began = false;\n\n a.animating = true;\n\n function render() {\n time = new Date().getTime();\n let progress;\n let easeProgress;\n // let el;\n if (!began) {\n began = true;\n if (params.begin) params.begin(els);\n }\n if (startTime === null) {\n startTime = time;\n }\n if (params.progress) {\n // eslint-disable-next-line\n params.progress(\n els,\n Math.max(Math.min((time - startTime) / params.duration, 1), 0),\n startTime + params.duration - time < 0\n ? 0\n : startTime + params.duration - time,\n startTime,\n );\n }\n\n elements.forEach((element) => {\n const el = element;\n if (done || el.done) return;\n Object.keys(props).forEach((prop) => {\n if (done || el.done) return;\n progress = Math.max(\n Math.min((time - startTime) / params.duration, 1),\n 0,\n );\n easeProgress = a.easingProgress(params.easing, progress);\n const { initialValue, finalValue, unit } = el[prop];\n el[prop].currentValue =\n initialValue + easeProgress * (finalValue - initialValue);\n const currentValue = el[prop].currentValue;\n\n if (\n (finalValue > initialValue && currentValue >= finalValue) ||\n (finalValue < initialValue && currentValue <= finalValue)\n ) {\n el.container.style[prop] = finalValue + unit;\n propsDone += 1;\n if (propsDone === Object.keys(props).length) {\n el.done = true;\n elementsDone += 1;\n }\n if (elementsDone === elements.length) {\n done = true;\n }\n }\n if (done) {\n a.done(params.complete);\n return;\n }\n el.container.style[prop] = currentValue + unit;\n });\n });\n if (done) return;\n // Then call\n a.frameId = window.requestAnimationFrame(render);\n }\n a.frameId = window.requestAnimationFrame(render);\n return a;\n },\n };\n\n if (a.elements.length === 0) {\n return els;\n }\n\n let animateInstance;\n for (let i = 0; i < a.elements.length; i += 1) {\n if (a.elements[i].dom7AnimateInstance) {\n animateInstance = a.elements[i].dom7AnimateInstance;\n } else a.elements[i].dom7AnimateInstance = a;\n }\n if (!animateInstance) {\n animateInstance = a;\n }\n\n if (initialProps === 'stop') {\n animateInstance.stop();\n } else {\n animateInstance.animate(a.props, a.params);\n }\n\n return els;\n}\n\nfunction stop() {\n const els = this;\n for (let i = 0; i < els.length; i += 1) {\n if (els[i].dom7AnimateInstance) {\n els[i].dom7AnimateInstance.stop();\n }\n }\n}\n\nexport { animate, stop };\n","import $ from './$';\n\nconst noTrigger = 'resize scroll'.split(' ');\nfunction shortcut(name) {\n function eventHandler(...args) {\n if (typeof args[0] === 'undefined') {\n for (let i = 0; i < this.length; i += 1) {\n if (noTrigger.indexOf(name) < 0) {\n if (name in this[i]) this[i][name]();\n else {\n $(this[i]).trigger(name);\n }\n }\n }\n return this;\n }\n return this.on(name, ...args);\n }\n return eventHandler;\n}\nexport const click = shortcut('click');\nexport const blur = shortcut('blur');\nexport const focus = shortcut('focus');\nexport const focusin = shortcut('focusin');\nexport const focusout = shortcut('focusout');\nexport const keyup = shortcut('keyup');\nexport const keydown = shortcut('keydown');\nexport const keypress = shortcut('keypress');\nexport const submit = shortcut('submit');\nexport const change = shortcut('change');\nexport const mousedown = shortcut('mousedown');\nexport const mousemove = shortcut('mousemove');\nexport const mouseup = shortcut('mouseup');\nexport const mouseenter = shortcut('mouseenter');\nexport const mouseleave = shortcut('mouseleave');\nexport const mouseout = shortcut('mouseout');\nexport const mouseover = shortcut('mouseover');\nexport const touchstart = shortcut('touchstart');\nexport const touchend = shortcut('touchend');\nexport const touchmove = shortcut('touchmove');\nexport const resize = shortcut('resize');\nexport const scroll = shortcut('scroll');\n","import $ from './$';\nimport * as methods from './methods';\nimport * as scroll from './scroll';\nimport * as animate from './animate';\nimport * as shortcuts from './shortcuts';\n\n[methods, scroll, animate, shortcuts].forEach((group) => {\n Object.keys(group).forEach((methodName) => {\n $.fn[methodName] = group[methodName];\n });\n});\n\nexport default $;\n"]} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/node_modules/dom7/package.json b/src/main/resources/static/assets/js/swiper/node_modules/dom7/package.json new file mode 100644 index 0000000..f171d6d --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/dom7/package.json @@ -0,0 +1,60 @@ +{ + "_from": "dom7@^4.0.1", + "_id": "dom7@4.0.1", + "_inBundle": false, + "_integrity": "sha512-y/RWjw3gK3qQnZz6IqDaIoqH6+xBhcB3Wsh5HFwl0abwuO/NAgbSB31ZbxtBDcuDe8jAX5NYUNDLTx4Ul48sIw==", + "_location": "/swiper/dom7", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "dom7@^4.0.1", + "name": "dom7", + "escapedName": "dom7", + "rawSpec": "^4.0.1", + "saveSpec": null, + "fetchSpec": "^4.0.1" + }, + "_requiredBy": [ + "/swiper" + ], + "_resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.1.tgz", + "_shasum": "821209df1bfdf97dd82b5156e50f7cb66b3f166c", + "_spec": "dom7@^4.0.1", + "_where": "C:\\Users\\Administrator\\node_modules\\swiper", + "author": { + "name": "Vladimir Kharlampidi" + }, + "bugs": { + "url": "https://github.com/nolimits4web/dom7/issues" + }, + "bundleDependencies": false, + "dependencies": { + "ssr-window": "^4.0.0" + }, + "deprecated": false, + "description": "Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API", + "exports": { + ".": "./dom7.esm.js" + }, + "homepage": "https://framework7.io/docs/dom7.html", + "keywords": [ + "dom", + "dom7", + "jquery", + "mobile", + "framework7" + ], + "license": "MIT", + "main": "./dom7.esm.js", + "module": "./dom7.esm.js", + "name": "dom7", + "repository": { + "type": "git", + "url": "git+https://github.com/nolimits4web/dom7.git" + }, + "sideEffects": false, + "type": "module", + "types": "dom7.d.ts", + "version": "4.0.1" +} diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/LICENSE b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/LICENSE new file mode 100644 index 0000000..27267db --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Vladimir Kharlampidi + +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/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/README.md b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/README.md new file mode 100644 index 0000000..f7c227a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/README.md @@ -0,0 +1,59 @@ +# SSR Window + +Better handling for `window` and `document` object in SSR environment. + +This library doesn't implement the DOM (like JSDOM), it just patches (or creates `window` and `document` objects) to avoid them to fail (throw errors) during server-side rendering. + +Was created for use in: + +- [Dom7](https://github.com/nolimits4web/dom7) +- [Swiper](https://github.com/nolimits4web/swiper) +- [Framework7](https://github.com/framework7io/framework7) + +## Installation + +Library available on NPM: + +``` +npm i ssr-window +``` + +## Usage + +```js +import { window, document } from 'ssr-window'; + +window.addEventListener('resize', () => {}); + +const div = document.querySelectorAll('div'); +``` + +## Extending + +If you rely on some window/document properties which are not included here, you can use `extend` helper to add them: + +```js +import { window, document, extend } from 'ssr-window'; + +// add window.navigator.language +extend(window, { + navigator: { + language: 'en', + }, +}); + +// add document.body +extend(document, { + body: { + /* ... */ + }, +}); +``` + +## Contribution + +Yes please! See the [contributing guidelines](https://github.com/nolimits4web/ssr-window/blob/master/CONTRIBUTING.md) for details. + +## Licence + +This project is licensed under the terms of the [MIT license](https://github.com/nolimits4web/ssr-window/blob/master/LICENSE). diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/package.json b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/package.json new file mode 100644 index 0000000..3ce129f --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/package.json @@ -0,0 +1,55 @@ +{ + "_from": "ssr-window@^4.0.1", + "_id": "ssr-window@4.0.1", + "_inBundle": false, + "_integrity": "sha512-5q936lkCk5Lg5hM6tG8Nutdym4vNiuFSWorslTzOn71PWb3Wnx44q/k2Ryn1LWA1G4FtxMzjywUFOiOxPkVGrA==", + "_location": "/swiper/ssr-window", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "ssr-window@^4.0.1", + "name": "ssr-window", + "escapedName": "ssr-window", + "rawSpec": "^4.0.1", + "saveSpec": null, + "fetchSpec": "^4.0.1" + }, + "_requiredBy": [ + "/swiper", + "/swiper/dom7" + ], + "_resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.1.tgz", + "_shasum": "514bf2ca81952f63fe88e8b0c623a23f90f7feb3", + "_spec": "ssr-window@^4.0.1", + "_where": "C:\\Users\\Administrator\\node_modules\\swiper", + "author": { + "name": "Vladimir Kharlampidi" + }, + "bugs": { + "url": "https://github.com/nolimits4web/ssr-window/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Better handling for window object in SSR environment", + "exports": { + ".": "./ssr-window.esm.js" + }, + "homepage": "https://github.com/nolimits4web/ssr-window", + "keywords": [ + "ssr", + "window", + "document" + ], + "license": "MIT", + "main": "./ssr-window.esm.js", + "module": "./ssr-window.esm.js", + "name": "ssr-window", + "repository": { + "type": "git", + "url": "git+https://github.com/nolimits4web/ssr-window.git" + }, + "type": "module", + "typings": "types/ssr-window.d.ts", + "version": "4.0.1" +} diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.esm.js b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.esm.js new file mode 100644 index 0000000..4fe1a59 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.esm.js @@ -0,0 +1,148 @@ +/** + * SSR Window 4.0.1 + * Better handling for window object in SSR environment + * https://github.com/nolimits4web/ssr-window + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ +/* eslint-disable no-param-reassign */ +function isObject(obj) { + return (obj !== null && + typeof obj === 'object' && + 'constructor' in obj && + obj.constructor === Object); +} +function extend(target = {}, src = {}) { + Object.keys(src).forEach((key) => { + if (typeof target[key] === 'undefined') + target[key] = src[key]; + else if (isObject(src[key]) && + isObject(target[key]) && + Object.keys(src[key]).length > 0) { + extend(target[key], src[key]); + } + }); +} + +const ssrDocument = { + body: {}, + addEventListener() { }, + removeEventListener() { }, + activeElement: { + blur() { }, + nodeName: '', + }, + querySelector() { + return null; + }, + querySelectorAll() { + return []; + }, + getElementById() { + return null; + }, + createEvent() { + return { + initEvent() { }, + }; + }, + createElement() { + return { + children: [], + childNodes: [], + style: {}, + setAttribute() { }, + getElementsByTagName() { + return []; + }, + }; + }, + createElementNS() { + return {}; + }, + importNode() { + return null; + }, + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '', + }, +}; +function getDocument() { + const doc = typeof document !== 'undefined' ? document : {}; + extend(doc, ssrDocument); + return doc; +} + +const ssrWindow = { + document: ssrDocument, + navigator: { + userAgent: '', + }, + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '', + }, + history: { + replaceState() { }, + pushState() { }, + go() { }, + back() { }, + }, + CustomEvent: function CustomEvent() { + return this; + }, + addEventListener() { }, + removeEventListener() { }, + getComputedStyle() { + return { + getPropertyValue() { + return ''; + }, + }; + }, + Image() { }, + Date() { }, + screen: {}, + setTimeout() { }, + clearTimeout() { }, + matchMedia() { + return {}; + }, + requestAnimationFrame(callback) { + if (typeof setTimeout === 'undefined') { + callback(); + return null; + } + return setTimeout(callback, 0); + }, + cancelAnimationFrame(id) { + if (typeof setTimeout === 'undefined') { + return; + } + clearTimeout(id); + }, +}; +function getWindow() { + const win = typeof window !== 'undefined' ? window : {}; + extend(win, ssrWindow); + return win; +} + +export { extend, getDocument, getWindow, ssrDocument, ssrWindow }; diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.js b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.js new file mode 100644 index 0000000..a3bf9aa --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.js @@ -0,0 +1,163 @@ +/** + * SSR Window 4.0.1 + * Better handling for window object in SSR environment + * https://github.com/nolimits4web/ssr-window + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ssrWindow = {})); +}(this, (function (exports) { 'use strict'; + + /* eslint-disable no-param-reassign */ + function isObject(obj) { + return (obj !== null && + typeof obj === 'object' && + 'constructor' in obj && + obj.constructor === Object); + } + function extend(target = {}, src = {}) { + Object.keys(src).forEach((key) => { + if (typeof target[key] === 'undefined') + target[key] = src[key]; + else if (isObject(src[key]) && + isObject(target[key]) && + Object.keys(src[key]).length > 0) { + extend(target[key], src[key]); + } + }); + } + + const ssrDocument = { + body: {}, + addEventListener() { }, + removeEventListener() { }, + activeElement: { + blur() { }, + nodeName: '', + }, + querySelector() { + return null; + }, + querySelectorAll() { + return []; + }, + getElementById() { + return null; + }, + createEvent() { + return { + initEvent() { }, + }; + }, + createElement() { + return { + children: [], + childNodes: [], + style: {}, + setAttribute() { }, + getElementsByTagName() { + return []; + }, + }; + }, + createElementNS() { + return {}; + }, + importNode() { + return null; + }, + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '', + }, + }; + function getDocument() { + const doc = typeof document !== 'undefined' ? document : {}; + extend(doc, ssrDocument); + return doc; + } + + const ssrWindow = { + document: ssrDocument, + navigator: { + userAgent: '', + }, + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '', + }, + history: { + replaceState() { }, + pushState() { }, + go() { }, + back() { }, + }, + CustomEvent: function CustomEvent() { + return this; + }, + addEventListener() { }, + removeEventListener() { }, + getComputedStyle() { + return { + getPropertyValue() { + return ''; + }, + }; + }, + Image() { }, + Date() { }, + screen: {}, + setTimeout() { }, + clearTimeout() { }, + matchMedia() { + return {}; + }, + requestAnimationFrame(callback) { + if (typeof setTimeout === 'undefined') { + callback(); + return null; + } + return setTimeout(callback, 0); + }, + cancelAnimationFrame(id) { + if (typeof setTimeout === 'undefined') { + return; + } + clearTimeout(id); + }, + }; + function getWindow() { + const win = typeof window !== 'undefined' ? window : {}; + extend(win, ssrWindow); + return win; + } + + exports.extend = extend; + exports.getDocument = getDocument; + exports.getWindow = getWindow; + exports.ssrDocument = ssrDocument; + exports.ssrWindow = ssrWindow; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=ssr-window.umd.js.map diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.js.map b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.js.map new file mode 100644 index 0000000..712accd --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ssr-window.umd.js.map","sources":["../src/extend.ts","../src/document.ts","../src/window.ts"],"sourcesContent":[null,null,null],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.min.js b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.min.js new file mode 100644 index 0000000..c9fa6ec --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.min.js @@ -0,0 +1,13 @@ +/** + * SSR Window 4.0.1 + * Better handling for window object in SSR environment + * https://github.com/nolimits4web/ssr-window + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ssrWindow={})}(this,(function(e){"use strict";function t(e){return null!==e&&"object"==typeof e&&"constructor"in e&&e.constructor===Object}function n(e={},o={}){Object.keys(o).forEach((i=>{void 0===e[i]?e[i]=o[i]:t(o[i])&&t(e[i])&&Object.keys(o[i]).length>0&&n(e[i],o[i])}))}const o={body:{},addEventListener(){},removeEventListener(){},activeElement:{blur(){},nodeName:""},querySelector:()=>null,querySelectorAll:()=>[],getElementById:()=>null,createEvent:()=>({initEvent(){}}),createElement:()=>({children:[],childNodes:[],style:{},setAttribute(){},getElementsByTagName:()=>[]}),createElementNS:()=>({}),importNode:()=>null,location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};const i={document:o,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState(){},pushState(){},go(){},back(){}},CustomEvent:function(){return this},addEventListener(){},removeEventListener(){},getComputedStyle:()=>({getPropertyValue:()=>""}),Image(){},Date(){},screen:{},setTimeout(){},clearTimeout(){},matchMedia:()=>({}),requestAnimationFrame:e=>"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0),cancelAnimationFrame(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};e.extend=n,e.getDocument=function(){const e="undefined"!=typeof document?document:{};return n(e,o),e},e.getWindow=function(){const e="undefined"!=typeof window?window:{};return n(e,i),e},e.ssrDocument=o,e.ssrWindow=i,Object.defineProperty(e,"__esModule",{value:!0})})); +//# sourceMappingURL=ssr-window.umd.min.js.map \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.min.js.map b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.min.js.map new file mode 100644 index 0000000..a3fe002 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/ssr-window.umd.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/extend.ts","../src/document.ts","../src/window.ts"],"names":["isObject","obj","constructor","Object","extend","target","src","keys","forEach","key","length","ssrDocument","body","addEventListener","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","createElement","children","childNodes","style","setAttribute","getElementsByTagName","createElementNS","importNode","location","hash","host","hostname","href","origin","pathname","protocol","search","ssrWindow","document","navigator","userAgent","history","replaceState","pushState","go","back","CustomEvent","this","getComputedStyle","getPropertyValue","Image","Date","screen","setTimeout","clearTimeout","matchMedia","requestAnimationFrame","callback","cancelAnimationFrame","id","doc","win","window"],"mappings":";;;;;;;;;;;iPACA,SAASA,EAASC,GAChB,OACU,OAARA,GACe,iBAARA,GACP,gBAAiBA,GACjBA,EAAIC,cAAgBC,OAIxB,SAASC,EAAOC,EAAc,GAAIC,EAAW,IAC3CH,OAAOI,KAAKD,GAAKE,SAASC,SACG,IAAhBJ,EAAOI,GAAsBJ,EAAOI,GAAOH,EAAIG,GAExDT,EAASM,EAAIG,KACbT,EAASK,EAAOI,KAChBN,OAAOI,KAAKD,EAAIG,IAAMC,OAAS,GAE/BN,EAAOC,EAAOI,GAAMH,EAAIG,aChBxBE,EAAc,CAClBC,KAAM,GACNC,qBACAC,wBACAC,cAAe,CACbC,SACAC,SAAU,IAEZC,cAAa,IACJ,KAETC,iBAAgB,IACP,GAETC,eAAc,IACL,KAETC,YAAW,KACF,CACLC,gBAGJC,cAAa,KACJ,CACLC,SAAU,GACVC,WAAY,GACZC,MAAO,GACPC,iBACAC,qBAAoB,IACX,KAIbC,gBAAe,KACN,IAETC,WAAU,IACD,KAETC,SAAU,CACRC,KAAM,GACNC,KAAM,GACNC,SAAU,GACVC,KAAM,GACNC,OAAQ,GACRC,SAAU,GACVC,SAAU,GACVC,OAAQ,WC9CNC,EAAY,CAChBC,SAAU9B,EACV+B,UAAW,CACTC,UAAW,IAEbZ,SAAU,CACRC,KAAM,GACNC,KAAM,GACNC,SAAU,GACVC,KAAM,GACNC,OAAQ,GACRC,SAAU,GACVC,SAAU,GACVC,OAAQ,IAEVK,QAAS,CACPC,iBACAC,cACAC,OACAC,UAEFC,YAAa,WACX,OAAOC,MAETrC,qBACAC,wBACAqC,iBAAgB,KACP,CACLC,iBAAgB,IACP,KAIbC,UACAC,SACAC,OAAQ,GACRC,eACAC,iBACAC,WAAU,KACD,IAETC,sBAAsBC,GACM,oBAAfJ,YACTI,IACO,MAEFJ,WAAWI,EAAU,GAE9BC,qBAAqBC,GACO,oBAAfN,YAGXC,aAAaK,8BDFjB,WACE,MAAMC,EACgB,oBAAbtB,SAA2BA,SAAY,GAEhD,OADArC,EAAO2D,EAAKpD,GACLoD,eCET,WACE,MAAMC,EAAgC,oBAAXC,OAAyBA,OAAU,GAE9D,OADA7D,EAAO4D,EAAKxB,GACLwB","file":"ssr-window.umd.min.js"} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/document.d.ts b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/document.d.ts new file mode 100644 index 0000000..63b28de --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/document.d.ts @@ -0,0 +1,36 @@ +declare const ssrDocument: { + body: {}; + addEventListener(): void; + removeEventListener(): void; + activeElement: { + blur(): void; + nodeName: string; + }; + querySelector(): any; + querySelectorAll(): any[]; + getElementById(): any; + createEvent(): { + initEvent(): void; + }; + createElement(): { + children: any[]; + childNodes: any[]; + style: {}; + setAttribute(): void; + getElementsByTagName(): any[]; + }; + createElementNS(): {}; + importNode(): any; + location: { + hash: string; + host: string; + hostname: string; + href: string; + origin: string; + pathname: string; + protocol: string; + search: string; + }; +}; +declare function getDocument(): Document; +export { getDocument, ssrDocument }; diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/extend.d.ts b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/extend.d.ts new file mode 100644 index 0000000..5044ccf --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/extend.d.ts @@ -0,0 +1,2 @@ +declare function extend(target?: any, src?: any): void; +export default extend; diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/ssr-window.d.ts b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/ssr-window.d.ts new file mode 100644 index 0000000..feb2e20 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/ssr-window.d.ts @@ -0,0 +1,4 @@ +import { getDocument, ssrDocument } from './document'; +import { getWindow, ssrWindow } from './window'; +import extend from './extend'; +export { getDocument, ssrDocument, getWindow, ssrWindow, extend }; diff --git a/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/window.d.ts b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/window.d.ts new file mode 100644 index 0000000..734a96c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/node_modules/ssr-window/types/window.d.ts @@ -0,0 +1,72 @@ +/// +declare const ssrWindow: { + document: { + body: {}; + addEventListener(): void; + removeEventListener(): void; + activeElement: { + blur(): void; + nodeName: string; + }; + querySelector(): any; + querySelectorAll(): any[]; + getElementById(): any; + createEvent(): { + initEvent(): void; + }; + createElement(): { + children: any[]; + childNodes: any[]; + style: {}; + setAttribute(): void; + getElementsByTagName(): any[]; + }; + createElementNS(): {}; + importNode(): any; + location: { + hash: string; + host: string; + hostname: string; + href: string; + origin: string; + pathname: string; + protocol: string; + search: string; + }; + }; + navigator: { + userAgent: string; + }; + location: { + hash: string; + host: string; + hostname: string; + href: string; + origin: string; + pathname: string; + protocol: string; + search: string; + }; + history: { + replaceState(): void; + pushState(): void; + go(): void; + back(): void; + }; + CustomEvent: () => any; + addEventListener(): void; + removeEventListener(): void; + getComputedStyle(): { + getPropertyValue(): string; + }; + Image(): void; + Date(): void; + screen: {}; + setTimeout(): void; + clearTimeout(): void; + matchMedia(): {}; + requestAnimationFrame(callback: any): NodeJS.Timeout; + cancelAnimationFrame(id: any): void; +}; +declare function getWindow(): Window; +export { getWindow, ssrWindow }; diff --git a/src/main/resources/static/assets/js/swiper/package.json b/src/main/resources/static/assets/js/swiper/package.json new file mode 100644 index 0000000..3030296 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/package.json @@ -0,0 +1,191 @@ +{ + "_from": "swiper", + "_id": "swiper@7.2.0", + "_inBundle": false, + "_integrity": "sha512-CUL6Nvzcf3fU0b8dHaraYphgBT7l44PY1B6T8b+E12pim4DEcwFZDy/KZoIKrAnn+rfbayCmcksYmSDIP5nDHg==", + "_location": "/swiper", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "swiper", + "name": "swiper", + "escapedName": "swiper", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/swiper/-/swiper-7.2.0.tgz", + "_shasum": "aae2bb7632798467abd5c1ab3e2441598a70dbd7", + "_spec": "swiper", + "_where": "C:\\Users\\Administrator", + "author": { + "name": "Vladimir Kharlampidi" + }, + "bugs": { + "url": "https://github.com/nolimits4web/swiper/issues" + }, + "bundleDependencies": false, + "dependencies": { + "dom7": "^4.0.1", + "ssr-window": "^4.0.1" + }, + "deprecated": false, + "description": "Most modern mobile touch slider and framework with hardware accelerated transitions", + "engines": { + "node": ">= 4.7.0" + }, + "exports": { + ".": "./swiper.esm.js", + "./core": "./swiper.esm.js", + "./bundle": "./swiper-bundle.esm.js", + "./css": "./swiper.min.css", + "./css/bundle": "./swiper-bundle.min.css", + "./css/a11y": "./modules/a11y/a11y.min.css", + "./css/autoplay": "./modules/autoplay/autoplay.min.css", + "./css/controller": "./modules/controller/controller.min.css", + "./css/effect-coverflow": "./modules/effect-coverflow/effect-coverflow.min.css", + "./css/effect-cube": "./modules/effect-cube/effect-cube.min.css", + "./css/effect-fade": "./modules/effect-fade/effect-fade.min.css", + "./css/effect-flip": "./modules/effect-flip/effect-flip.min.css", + "./css/effect-creative": "./modules/effect-creative/effect-creative.min.css", + "./css/effect-cards": "./modules/effect-cards/effect-cards.min.css", + "./css/free-mode": "./modules/free-mode/free-mode.min.css", + "./css/grid": "./modules/grid/grid.min.css", + "./css/hash-navigation": "./modules/hash-navigation/hash-navigation.min.css", + "./css/history": "./modules/history/history.min.css", + "./css/keyboard": "./modules/keyboard/keyboard.min.css", + "./css/lazy": "./modules/lazy/lazy.min.css", + "./css/manipulation": "./modules/manipulation/manipulation.min.css", + "./css/mousewheel": "./modules/mousewheel/mousewheel.min.css", + "./css/navigation": "./modules/navigation/navigation.min.css", + "./css/pagination": "./modules/pagination/pagination.min.css", + "./css/parallax": "./modules/parallax/parallax.min.css", + "./css/scrollbar": "./modules/scrollbar/scrollbar.min.css", + "./css/thumbs": "./modules/thumbs/thumbs.min.css", + "./css/virtual": "./modules/virtual/virtual.min.css", + "./css/zoom": "./modules/zoom/zoom.min.css", + "./less": "./swiper.less", + "./less/a11y": "./modules/a11y/a11y.less", + "./less/autoplay": "./modules/autoplay/autoplay.less", + "./less/controller": "./modules/controller/controller.less", + "./less/effect-coverflow": "./modules/effect-coverflow/effect-coverflow.less", + "./less/effect-cube": "./modules/effect-cube/effect-cube.less", + "./less/effect-fade": "./modules/effect-fade/effect-fade.less", + "./less/effect-flip": "./modules/effect-flip/effect-flip.less", + "./less/effect-creative": "./modules/effect-creative/effect-creative.less", + "./less/effect-cards": "./modules/effect-cards/effect-cards.less", + "./less/free-mode": "./modules/free-mode/free-mode.less", + "./less/grid": "./modules/grid/grid.less", + "./less/hash-navigation": "./modules/hash-navigation/hash-navigation.less", + "./less/history": "./modules/history/history.less", + "./less/keyboard": "./modules/keyboard/keyboard.less", + "./less/lazy": "./modules/lazy/lazy.less", + "./less/manipulation": "./modules/manipulation/manipulation.less", + "./less/mousewheel": "./modules/mousewheel/mousewheel.less", + "./less/navigation": "./modules/navigation/navigation.less", + "./less/pagination": "./modules/pagination/pagination.less", + "./less/parallax": "./modules/parallax/parallax.less", + "./less/scrollbar": "./modules/scrollbar/scrollbar.less", + "./less/thumbs": "./modules/thumbs/thumbs.less", + "./less/virtual": "./modules/virtual/virtual.less", + "./less/zoom": "./modules/zoom/zoom.less", + "./scss": "./swiper.scss", + "./scss/a11y": "./modules/a11y/a11y.scss", + "./scss/autoplay": "./modules/autoplay/autoplay.scss", + "./scss/controller": "./modules/controller/controller.scss", + "./scss/effect-coverflow": "./modules/effect-coverflow/effect-coverflow.scss", + "./scss/effect-cube": "./modules/effect-cube/effect-cube.scss", + "./scss/effect-fade": "./modules/effect-fade/effect-fade.scss", + "./scss/effect-flip": "./modules/effect-flip/effect-flip.scss", + "./scss/effect-creative": "./modules/effect-creative/effect-creative.scss", + "./scss/effect-cards": "./modules/effect-cards/effect-cards.scss", + "./scss/free-mode": "./modules/free-mode/free-mode.scss", + "./scss/grid": "./modules/grid/grid.scss", + "./scss/hash-navigation": "./modules/hash-navigation/hash-navigation.scss", + "./scss/history": "./modules/history/history.scss", + "./scss/keyboard": "./modules/keyboard/keyboard.scss", + "./scss/lazy": "./modules/lazy/lazy.scss", + "./scss/manipulation": "./modules/manipulation/manipulation.scss", + "./scss/mousewheel": "./modules/mousewheel/mousewheel.scss", + "./scss/navigation": "./modules/navigation/navigation.scss", + "./scss/pagination": "./modules/pagination/pagination.scss", + "./scss/parallax": "./modules/parallax/parallax.scss", + "./scss/scrollbar": "./modules/scrollbar/scrollbar.scss", + "./scss/thumbs": "./modules/thumbs/thumbs.scss", + "./scss/virtual": "./modules/virtual/virtual.scss", + "./scss/zoom": "./modules/zoom/zoom.scss", + "./angular": "./angular/fesm2015/swiper_angular.js", + "./react": "./react/swiper-react.js", + "./vue": "./vue/swiper-vue.js", + "./svelte": "./svelte/swiper-svelte.js", + "./types": "./types/index.d.ts", + "./package.json": "./package.json" + }, + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "homepage": "https://swiperjs.com", + "keywords": [ + "swiper", + "swipe", + "slider", + "touch", + "ios", + "mobile", + "cordova", + "phonegap", + "app", + "framework", + "framework7", + "carousel", + "gallery", + "plugin", + "react", + "vue", + "angular", + "svelte", + "slideshow" + ], + "license": "MIT", + "main": "./swiper.esm.js", + "module": "./swiper.esm.js", + "name": "swiper", + "repository": { + "type": "git", + "url": "git+https://github.com/nolimits4web/Swiper.git" + }, + "scripts": { + "postinstall": "node -e \"try{require('./postinstall')}catch(e){}\"" + }, + "type": "module", + "typesVersions": { + "*": { + "angular": [ + "angular/swiper_angular.d.ts" + ], + "react": [ + "react/swiper-react.d.ts" + ], + "svelte": [ + "svelte/swiper-svelte.d.ts" + ], + "vue": [ + "vue/swiper-vue.d.ts" + ] + } + }, + "typings": "swiper.d.ts", + "version": "7.2.0" +} diff --git a/src/main/resources/static/assets/js/swiper/postinstall.js b/src/main/resources/static/assets/js/swiper/postinstall.js new file mode 100644 index 0000000..90cce0b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/postinstall.js @@ -0,0 +1,36 @@ +/* eslint-disable max-len -- for better formatting */ +var env = process.env; + +var ADBLOCK = is(env.ADBLOCK); +var COLOR = is(env.npm_config_color); +var DISABLE_OPENCOLLECTIVE = is(env.DISABLE_OPENCOLLECTIVE); +var SILENT = ['silent', 'error', 'warn'].indexOf(env.npm_config_loglevel) !== -1; +var OPEN_SOURCE_CONTRIBUTOR = is(env.OPEN_SOURCE_CONTRIBUTOR); + +// you could add a PR with an env variable for your CI detection +var CI = [ + 'BUILD_NUMBER', + 'CI', + 'CONTINUOUS_INTEGRATION', + 'DRONE', + 'RUN_ID' +].some(function (it) { return is(env[it]); }); + +var BANNER = '\u001b[35m\u001b[1mLove Swiper? Support Vladimir\'s work by donating or pledging: \u001B[0m\n' + +'\u001b[22m\u001b[39m\u001b[32m> On Patreon https://patreon.com/swiperjs \u001B[0m\n' + +'\u001b[22m\u001b[39m\u001b[32m> On Open Collective https://opencollective.com/swiper'; + +function is(it) { + return !!it && it !== '0' && it !== 'false'; +} + +function isBannerRequired() { + return !(ADBLOCK || CI || DISABLE_OPENCOLLECTIVE || SILENT || OPEN_SOURCE_CONTRIBUTOR); +} + +function showBanner() { + // eslint-disable-next-line no-console,no-control-regex -- output + console.log(COLOR ? BANNER : BANNER.replace(/\u001B\[\d+m/g, '')); +} + +if (isBannerRequired()) showBanner(); diff --git a/src/main/resources/static/assets/js/swiper/react/get-changed-params.js b/src/main/resources/static/assets/js/swiper/react/get-changed-params.js new file mode 100644 index 0000000..d45ece4 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/get-changed-params.js @@ -0,0 +1,43 @@ +import { paramsList } from './params-list.js'; +import { isObject } from './utils.js'; + +function getChangedParams(swiperParams, oldParams, children, oldChildren) { + const keys = []; + if (!oldParams) return keys; + + const addKey = key => { + if (keys.indexOf(key) < 0) keys.push(key); + }; + + const oldChildrenKeys = oldChildren.map(child => child.key); + const childrenKeys = children.map(child => child.key); + if (oldChildrenKeys.join('') !== childrenKeys.join('')) addKey('children'); + if (oldChildren.length !== children.length) addKey('children'); + const watchParams = paramsList.filter(key => key[0] === '_').map(key => key.replace(/_/, '')); + watchParams.forEach(key => { + if (key in swiperParams && key in oldParams) { + if (isObject(swiperParams[key]) && isObject(oldParams[key])) { + const newKeys = Object.keys(swiperParams[key]); + const oldKeys = Object.keys(oldParams[key]); + + if (newKeys.length !== oldKeys.length) { + addKey(key); + } else { + newKeys.forEach(newKey => { + if (swiperParams[key][newKey] !== oldParams[key][newKey]) { + addKey(key); + } + }); + oldKeys.forEach(oldKey => { + if (swiperParams[key][oldKey] !== oldParams[key][oldKey]) addKey(key); + }); + } + } else if (swiperParams[key] !== oldParams[key]) { + addKey(key); + } + } + }); + return keys; +} + +export { getChangedParams }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/get-children.js b/src/main/resources/static/assets/js/swiper/react/get-children.js new file mode 100644 index 0000000..8e01a9f --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/get-children.js @@ -0,0 +1,46 @@ +import React from 'react'; + +function processChildren(c) { + const slides = []; + React.Children.toArray(c).forEach(child => { + if (child.type && child.type.displayName === 'SwiperSlide') { + slides.push(child); + } else if (child.props && child.props.children) { + processChildren(child.props.children).forEach(slide => slides.push(slide)); + } + }); + return slides; +} + +function getChildren(c) { + const slides = []; + const slots = { + 'container-start': [], + 'container-end': [], + 'wrapper-start': [], + 'wrapper-end': [] + }; + React.Children.toArray(c).forEach(child => { + if (child.type && child.type.displayName === 'SwiperSlide') { + slides.push(child); + } else if (child.props && child.props.slot && slots[child.props.slot]) { + slots[child.props.slot].push(child); + } else if (child.props && child.props.children) { + const foundSlides = processChildren(child.props.children); + + if (foundSlides.length > 0) { + foundSlides.forEach(slide => slides.push(slide)); + } else { + slots['container-end'].push(child); + } + } else { + slots['container-end'].push(child); + } + }); + return { + slides, + slots + }; +} + +export { getChildren }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/get-params.js b/src/main/resources/static/assets/js/swiper/react/get-params.js new file mode 100644 index 0000000..1ee4108 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/get-params.js @@ -0,0 +1,46 @@ +import Swiper from 'swiper'; +import { isObject, extend } from './utils.js'; +import { paramsList } from './params-list.js'; + +function getParams(obj = {}) { + const params = { + on: {} + }; + const events = {}; + const passedParams = {}; + extend(params, Swiper.defaults); + extend(params, Swiper.extendedDefaults); + params._emitClasses = true; + params.init = false; + const rest = {}; + const allowedParams = paramsList.map(key => key.replace(/_/, '')); + Object.keys(obj).forEach(key => { + if (allowedParams.indexOf(key) >= 0) { + if (isObject(obj[key])) { + params[key] = {}; + passedParams[key] = {}; + extend(params[key], obj[key]); + extend(passedParams[key], obj[key]); + } else { + params[key] = obj[key]; + passedParams[key] = obj[key]; + } + } else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === 'function') { + events[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key]; + } else { + rest[key] = obj[key]; + } + }); + ['navigation', 'pagination', 'scrollbar'].forEach(key => { + if (params[key] === true) params[key] = {}; + if (params[key] === false) delete params[key]; + }); + return { + params, + passedParams, + rest, + events + }; +} + +export { getParams }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/init-swiper.js b/src/main/resources/static/assets/js/swiper/react/init-swiper.js new file mode 100644 index 0000000..aaf5568 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/init-swiper.js @@ -0,0 +1,36 @@ +import Swiper from 'swiper'; +import { needsNavigation, needsPagination, needsScrollbar } from './utils.js'; + +function initSwiper(swiperParams) { + return new Swiper(swiperParams); +} + +function mountSwiper({ + el, + nextEl, + prevEl, + paginationEl, + scrollbarEl, + swiper +}, swiperParams) { + if (needsNavigation(swiperParams) && nextEl && prevEl) { + swiper.params.navigation.nextEl = nextEl; + swiper.originalParams.navigation.nextEl = nextEl; + swiper.params.navigation.prevEl = prevEl; + swiper.originalParams.navigation.prevEl = prevEl; + } + + if (needsPagination(swiperParams) && paginationEl) { + swiper.params.pagination.el = paginationEl; + swiper.originalParams.pagination.el = paginationEl; + } + + if (needsScrollbar(swiperParams) && scrollbarEl) { + swiper.params.scrollbar.el = scrollbarEl; + swiper.originalParams.scrollbar.el = scrollbarEl; + } + + swiper.init(el); +} + +export { initSwiper, mountSwiper }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/loop.js b/src/main/resources/static/assets/js/swiper/react/loop.js new file mode 100644 index 0000000..962fe8d --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/loop.js @@ -0,0 +1,78 @@ +import React from 'react'; +import Swiper from 'swiper'; + +function calcLoopedSlides(slides, swiperParams) { + let slidesPerViewParams = swiperParams.slidesPerView; + + if (swiperParams.breakpoints) { + const breakpoint = Swiper.prototype.getBreakpoint(swiperParams.breakpoints); + const breakpointOnlyParams = breakpoint in swiperParams.breakpoints ? swiperParams.breakpoints[breakpoint] : undefined; + + if (breakpointOnlyParams && breakpointOnlyParams.slidesPerView) { + slidesPerViewParams = breakpointOnlyParams.slidesPerView; + } + } + + let loopedSlides = Math.ceil(parseFloat(swiperParams.loopedSlides || slidesPerViewParams, 10)); + loopedSlides += swiperParams.loopAdditionalSlides; + + if (loopedSlides > slides.length) { + loopedSlides = slides.length; + } + + return loopedSlides; +} + +function renderLoop(swiper, slides, swiperParams) { + const modifiedSlides = slides.map((child, index) => { + return /*#__PURE__*/React.cloneElement(child, { + swiper, + 'data-swiper-slide-index': index + }); + }); + + function duplicateSlide(child, index, position) { + return /*#__PURE__*/React.cloneElement(child, { + key: `${child.key}-duplicate-${index}-${position}`, + className: `${child.props.className || ''} ${swiperParams.slideDuplicateClass}` + }); + } + + if (swiperParams.loopFillGroupWithBlank) { + const blankSlidesNum = swiperParams.slidesPerGroup - modifiedSlides.length % swiperParams.slidesPerGroup; + + if (blankSlidesNum !== swiperParams.slidesPerGroup) { + for (let i = 0; i < blankSlidesNum; i += 1) { + const blankSlide = /*#__PURE__*/React.createElement("div", { + className: `${swiperParams.slideClass} ${swiperParams.slideBlankClass}` + }); + modifiedSlides.push(blankSlide); + } + } + } + + if (swiperParams.slidesPerView === 'auto' && !swiperParams.loopedSlides) { + swiperParams.loopedSlides = modifiedSlides.length; + } + + const loopedSlides = calcLoopedSlides(modifiedSlides, swiperParams); + const prependSlides = []; + const appendSlides = []; + modifiedSlides.forEach((child, index) => { + if (index < loopedSlides) { + appendSlides.push(duplicateSlide(child, index, 'prepend')); + } + + if (index < modifiedSlides.length && index >= modifiedSlides.length - loopedSlides) { + prependSlides.push(duplicateSlide(child, index, 'append')); + } + }); + + if (swiper) { + swiper.loopedSlides = loopedSlides; + } + + return [...prependSlides, ...modifiedSlides, ...appendSlides]; +} + +export { calcLoopedSlides, renderLoop }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/params-list.js b/src/main/resources/static/assets/js/swiper/react/params-list.js new file mode 100644 index 0000000..2d25f8f --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/params-list.js @@ -0,0 +1,4 @@ +/* underscore in name -> watch for changes */ +const paramsList = ['modules', 'init', '_direction', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', '_spaceBetween', '_slidesPerView', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_preloadImages', 'updateOnImagesReady', '_loop', '_loopAdditionalSlides', '_loopedSlides', '_loopFillGroupWithBlank', 'loopPreventsSlide', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideBlankClass', 'slideActiveClass', 'slideDuplicateActiveClass', 'slideVisibleClass', 'slideDuplicateClass', 'slideNextClass', 'slideDuplicateNextClass', 'slidePrevClass', 'slideDuplicatePrevClass', 'wrapperClass', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren', // modules +'a11y', 'autoplay', '_controller', 'coverflowEffect', 'cubeEffect', 'fadeEffect', 'flipEffect', 'creativeEffect', 'cardsEffect', 'hashNavigation', 'history', 'keyboard', 'lazy', 'mousewheel', '_navigation', '_pagination', 'parallax', '_scrollbar', '_thumbs', 'virtual', 'zoom']; +export { paramsList }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/swiper-react.d.ts b/src/main/resources/static/assets/js/swiper/react/swiper-react.d.ts new file mode 100644 index 0000000..e8d2e73 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/swiper-react.d.ts @@ -0,0 +1,467 @@ +import * as React from 'react'; + +import { SwiperOptions, Swiper as SwiperClass } from '../types/'; + +interface Swiper extends SwiperOptions { + /** + * Swiper container tag + * + * @default 'div' + */ + tag?: string; + + /** + * Swiper wrapper tag + * + * @default 'div' + */ + wrapperTag?: string; + + /** + * Get Swiper instance + */ + onSwiper?: (swiper: SwiperClass) => void; + + /** + * Event will be fired in when autoplay started + */ + onAutoplayStart?: (swiper: SwiperClass) => void; + /** + * Event will be fired when autoplay stopped + */ + onAutoplayStop?: (swiper: SwiperClass) => void; + /** + * Event will be fired when slide changed with autoplay + */ + onAutoplay?: (swiper: SwiperClass) => void;/** + * Event will be fired on window hash change + */ + onHashChange?: (swiper: SwiperClass) => void; + /** + * Event will be fired when swiper updates the hash + */ + onHashSet?: (swiper: SwiperClass) => void;/** + * Event will be fired on mousewheel scroll + */ + onScroll?: (swiper: SwiperClass, event: WheelEvent) => void;/** + * Event will be fired in the beginning of lazy loading of image + */ + onLazyImageLoad?: (swiper: SwiperClass, slideEl: HTMLElement, imageEl: HTMLElement) => void; + /** + * Event will be fired when lazy loading image will be loaded + */ + onLazyImageReady?: (swiper: SwiperClass, slideEl: HTMLElement, imageEl: HTMLElement) => void;/** + * Event will be fired on key press + */ + onKeyPress?: (swiper: SwiperClass, keyCode: string) => void;/** + * Event will be fired on navigation hide + */ + onNavigationHide?: (swiper: SwiperClass) => void; + /** + * Event will be fired on navigation show + */ + onNavigationShow?: (swiper: SwiperClass) => void;/** + * Event will be fired on draggable scrollbar drag start + */ + onScrollbarDragStart?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired on draggable scrollbar drag move + */ + onScrollbarDragMove?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired on draggable scrollbar drag end + */ + onScrollbarDragEnd?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void;/** + * Event will be fired after pagination rendered + */ + onPaginationRender?: (swiper: SwiperClass, paginationEl: HTMLElement) => void; + + /** + * Event will be fired when pagination updated + */ + onPaginationUpdate?: (swiper: SwiperClass, paginationEl: HTMLElement) => void; + + /** + * Event will be fired on pagination hide + */ + onPaginationHide?: (swiper: SwiperClass) => void; + + /** + * Event will be fired on pagination show + */ + onPaginationShow?: (swiper: SwiperClass) => void;/** + * Event will be fired on zoom change + */ + onZoomChange?: (swiper: SwiperClass, scale: number, imageEl: HTMLElement, slideEl: HTMLElement) => void; + + /** + * Fired right after Swiper initialization. + * @note Note that with `swiper.on('init')` syntax it will + * work only in case you set `init: false` parameter. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * init: false, + * // other parameters + * }); + * swiper.on('init', function() { + * // do something + * }); + * // init Swiper + * swiper.init(); + * ``` + * + * @example + * ```js + * // Otherwise use it as the parameter: + * const swiper = new Swiper('.swiper', { + * // other parameters + * on: { + * init: function () { + * // do something + * }, + * } + * }); + * ``` + */ + onInit?: (swiper: SwiperClass) => any; + + /** + * Event will be fired right before Swiper destroyed + */ + onBeforeDestroy?: (swiper: SwiperClass) => void; + + /** + * Event will be fired when currently active slide is changed + */ + onSlideChange?: (swiper: SwiperClass) => void; + + /** + * Event will be fired in the beginning of animation to other slide (next or previous). + */ + onSlideChangeTransitionStart?: (swiper: SwiperClass) => void; + + /** + * Event will be fired after animation to other slide (next or previous). + */ + onSlideChangeTransitionEnd?: (swiper: SwiperClass) => void; + + /** + * Same as "slideChangeTransitionStart" but for "forward" direction only + */ + onSlideNextTransitionStart?: (swiper: SwiperClass) => void; + + /** + * Same as "slideChangeTransitionEnd" but for "forward" direction only + */ + onSlideNextTransitionEnd?: (swiper: SwiperClass) => void; + + /** + * Same as "slideChangeTransitionStart" but for "backward" direction only + */ + onSlidePrevTransitionStart?: (swiper: SwiperClass) => void; + + /** + * Same as "slideChangeTransitionEnd" but for "backward" direction only + */ + onSlidePrevTransitionEnd?: (swiper: SwiperClass) => void; + + /** + * Event will be fired in the beginning of transition. + */ + onTransitionStart?: (swiper: SwiperClass) => void; + + /** + * Event will be fired after transition. + */ + onTransitionEnd?: (swiper: SwiperClass) => void; + + /** + * Event will be fired when user touch Swiper. Receives `touchstart` event as an arguments. + */ + onTouchStart?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user touch and move finger over Swiper. Receives `touchmove` event as an arguments. + */ + onTouchMove?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user touch and move finger over Swiper in direction opposite to direction parameter. Receives `touchmove` event as an arguments. + */ + onTouchMoveOpposite?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user touch and move finger over Swiper and move it. Receives `touchmove` event as an arguments. + */ + onSliderMove?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user release Swiper. Receives `touchend` event as an arguments. + */ + onTouchEnd?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user click/tap on Swiper. Receives `touchend` event as an arguments. + */ + onClick?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user click/tap on Swiper. Receives `touchend` event as an arguments. + */ + onTap?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user double tap on Swiper's container. Receives `touchend` event as an arguments + */ + onDoubleTap?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired right after all inner images are loaded. updateOnImagesReady should be also enabled + */ + onImagesReady?: (swiper: SwiperClass) => void; + + /** + * Event will be fired when Swiper progress is changed, as an arguments it receives progress that is always from 0 to 1 + */ + onProgress?: (swiper: SwiperClass, progress: number) => void; + + /** + * Event will be fired when Swiper reach its beginning (initial position) + */ + onReachBeginning?: (swiper: SwiperClass) => void; + + /** + * Event will be fired when Swiper reach last slide + */ + onReachEnd?: (swiper: SwiperClass) => void; + + /** + * Event will be fired when Swiper goes to beginning or end position + */ + onToEdge?: (swiper: SwiperClass) => void; + + /** + * Event will be fired when Swiper goes from beginning or end position + */ + onFromEdge?: (swiper: SwiperClass) => void; + + /** + * Event will be fired when swiper's wrapper change its position. Receives current translate value as an arguments + */ + onSetTranslate?: (swiper: SwiperClass, translate: number) => void; + + /** + * Event will be fired everytime when swiper starts animation. Receives current transition duration (in ms) as an arguments + */ + onSetTransition?: (swiper: SwiperClass, transition: number) => void; + + /** + * Event will be fired on window resize right before swiper's onresize manipulation + */ + onResize?: (swiper: SwiperClass) => void; + + /** + * Event will be fired if observer is enabled and it detects DOM mutations + */ + onObserverUpdate?: (swiper: SwiperClass) => void; + + /** + * Event will be fired right before "loop fix" + */ + onBeforeLoopFix?: (swiper: SwiperClass) => void; + + /** + * Event will be fired after "loop fix" + */ + onLoopFix?: (swiper: SwiperClass) => void; + + /** + * Event will be fired on breakpoint change + */ + onBreakpoint?: (swiper: SwiperClass, breakpointParams: SwiperOptions) => void; + + /** + * !INTERNAL: Event will fired right before breakpoint change + */ + _beforeBreakpoint?: (swiper: SwiperClass, breakpointParams: SwiperOptions) => void; + + /** + * !INTERNAL: Event will fired after setting CSS classes on swiper container element + */ + _containerClasses?: (swiper: SwiperClass, classNames: string) => void; + + /** + * !INTERNAL: Event will fired after setting CSS classes on swiper slide element + */ + _slideClass?: (swiper: SwiperClass, slideEl: HTMLElement, classNames: string) => void; + + /** + * !INTERNAL: Event will fired after setting CSS classes on all swiper slides + */ + _slideClasses?: ( + swiper: SwiperClass, + slides: { slideEl: HTMLElement; classNames: string; index: number }[], + ) => void; + + /** + * !INTERNAL: Event will fired as soon as swiper instance available (before init) + */ + _swiper?: (swiper: SwiperClass) => void; + + /** + * !INTERNAL: Event will be fired on free mode touch end (release) and there will no be momentum + */ + _freeModeNoMomentumRelease?: (swiper: SwiperClass) => void; + + /** + * Event will fired on active index change + */ + onActiveIndexChange?: (swiper: SwiperClass) => void; + /** + * Event will fired on snap index change + */ + onSnapIndexChange?: (swiper: SwiperClass) => void; + /** + * Event will fired on real index change + */ + onRealIndexChange?: (swiper: SwiperClass) => void; + /** + * Event will fired right after initialization + */ + onAfterInit?: (swiper: SwiperClass) => void; + /** + * Event will fired right before initialization + */ + onBeforeInit?: (swiper: SwiperClass) => void; + /** + * Event will fired before resize handler + */ + onBeforeResize?: (swiper: SwiperClass) => void; + /** + * Event will fired before slide change transition start + */ + onBeforeSlideChangeStart?: (swiper: SwiperClass) => void; + /** + * Event will fired before transition start + */ + onBeforeTransitionStart?: (swiper: SwiperClass, speed: number, internal: any) => void; // what is internal? + /** + * Event will fired on direction change + */ + onChangeDirection?: (swiper: SwiperClass) => void; + /** + * Event will be fired when user double click/tap on Swiper + */ + onDoubleClick?: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + /** + * Event will be fired on swiper destroy + */ + onDestroy?: (swiper: SwiperClass) => void; + /** + * Event will be fired on momentum bounce + */ + onMomentumBounce?: (swiper: SwiperClass) => void; + /** + * Event will be fired on orientation change (e.g. landscape -> portrait) + */ + onOrientationchange?: (swiper: SwiperClass) => void; + /** + * Event will be fired in the beginning of animation of resetting slide to current one + */ + onSlideResetTransitionStart?: (swiper: SwiperClass) => void; + /** + * Event will be fired in the end of animation of resetting slide to current one + */ + onSlideResetTransitionEnd?: (swiper: SwiperClass) => void; + /** + * Event will be fired with first touch/drag move + */ + onSliderFirstMove?: (swiper: SwiperClass, event: TouchEvent) => void; + /** + * Event will be fired when number of slides has changed + */ + onSlidesLengthChange?: (swiper: SwiperClass) => void; + /** + * Event will be fired when slides grid has changed + */ + onSlidesGridLengthChange?: (swiper: SwiperClass) => void; + /** + * Event will be fired when snap grid has changed + */ + onSnapGridLengthChange?: (swiper: SwiperClass) => void; + /** + * Event will be fired after swiper.update() call + */ + onUpdate?: (swiper: SwiperClass) => void; + /** + * Event will be fired when swiper is locked (when `watchOverflow` enabled) + */ + onLock?: (swiper: SwiperClass) => void; + /** + * Event will be fired when swiper is unlocked (when `watchOverflow` enabled) + */ + onUnlock?: (swiper: SwiperClass) => void; + +} + +interface SlideData { + isActive: boolean; + isVisible: boolean; + isDuplicate: boolean; + isPrev: boolean; + isNext: boolean; +} + +interface SwiperSlide { + /** + * Slide tag + * + * @default 'div' + */ + tag?: string; + + /** + * Enables additional wrapper required for zoom mode + * + * @default false + */ + zoom?: boolean; + + /** + * Slide's index in slides array/collection + * + * @default false + */ + virtualIndex?: number; + + /** + * Slide's child element or render function + * + * @default undefined + */ + children?: React.ReactNode | ((slideData: SlideData) => React.ReactNode); +} + +interface Swiper + extends Omit< + React.HTMLAttributes, + | 'onProgress' + | 'onClick' + | 'onTouchEnd' + | 'onTouchMove' + | 'onTouchStart' + | 'onTransitionEnd' + | 'onKeyPress' + | 'onDoubleClick' + | 'onScroll' + > {} +interface SwiperSlide extends React.HTMLAttributes {} + +declare const Swiper: React.FunctionComponent; +declare const SwiperSlide: React.VoidFunctionComponent; + +export { Swiper, SwiperSlide }; diff --git a/src/main/resources/static/assets/js/swiper/react/swiper-react.js b/src/main/resources/static/assets/js/swiper/react/swiper-react.js new file mode 100644 index 0000000..35bd813 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/swiper-react.js @@ -0,0 +1,15 @@ +/** + * Swiper React 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +import { Swiper } from './swiper.js'; +import { SwiperSlide } from './swiper-slide.js'; +export { Swiper, SwiperSlide }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/swiper-slide.js b/src/main/resources/static/assets/js/swiper/react/swiper-slide.js new file mode 100644 index 0000000..1cbab62 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/swiper-slide.js @@ -0,0 +1,79 @@ +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +import React, { useRef, useState, forwardRef } from 'react'; +import { uniqueClasses } from './utils.js'; +import { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect.js'; +const SwiperSlide = /*#__PURE__*/forwardRef(({ + tag: Tag = 'div', + children, + className = '', + swiper, + zoom, + virtualIndex, + ...rest +} = {}, externalRef) => { + const slideElRef = useRef(null); + const [slideClasses, setSlideClasses] = useState('swiper-slide'); + + function updateClasses(_s, el, classNames) { + if (el === slideElRef.current) { + setSlideClasses(classNames); + } + } + + useIsomorphicLayoutEffect(() => { + if (externalRef) { + externalRef.current = slideElRef.current; + } + + if (!slideElRef.current || !swiper) { + return; + } + + if (swiper.destroyed) { + if (slideClasses !== 'swiper-slide') { + setSlideClasses('swiper-slide'); + } + + return; + } + + swiper.on('_slideClass', updateClasses); // eslint-disable-next-line + + return () => { + if (!swiper) return; + swiper.off('_slideClass', updateClasses); + }; + }); + useIsomorphicLayoutEffect(() => { + if (swiper && slideElRef.current) { + setSlideClasses(swiper.getSlideClasses(slideElRef.current)); + } + }, [swiper]); + let slideData; + + if (typeof children === 'function') { + slideData = { + isActive: slideClasses.indexOf('swiper-slide-active') >= 0 || slideClasses.indexOf('swiper-slide-duplicate-active') >= 0, + isVisible: slideClasses.indexOf('swiper-slide-visible') >= 0, + isDuplicate: slideClasses.indexOf('swiper-slide-duplicate') >= 0, + isPrev: slideClasses.indexOf('swiper-slide-prev') >= 0 || slideClasses.indexOf('swiper-slide-duplicate-prev') >= 0, + isNext: slideClasses.indexOf('swiper-slide-next') >= 0 || slideClasses.indexOf('swiper-slide-duplicate-next') >= 0 + }; + } + + const renderChildren = () => { + return typeof children === 'function' ? children(slideData) : children; + }; + + return /*#__PURE__*/React.createElement(Tag, _extends({ + ref: slideElRef, + className: uniqueClasses(`${slideClasses}${className ? ` ${className}` : ''}`), + "data-swiper-slide-index": virtualIndex + }, rest), zoom ? /*#__PURE__*/React.createElement("div", { + className: "swiper-zoom-container", + "data-swiper-zoom": typeof zoom === 'number' ? zoom : undefined + }, renderChildren()) : renderChildren()); +}); +SwiperSlide.displayName = 'SwiperSlide'; +export { SwiperSlide }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/swiper.js b/src/main/resources/static/assets/js/swiper/react/swiper.js new file mode 100644 index 0000000..8e709e4 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/swiper.js @@ -0,0 +1,202 @@ +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +import React, { useRef, useState, useEffect, forwardRef } from 'react'; +import { getParams } from './get-params.js'; +import { initSwiper, mountSwiper } from './init-swiper.js'; +import { needsScrollbar, needsNavigation, needsPagination, uniqueClasses, extend } from './utils.js'; +import { renderLoop, calcLoopedSlides } from './loop.js'; +import { getChangedParams } from './get-changed-params.js'; +import { getChildren } from './get-children.js'; +import { updateSwiper } from './update-swiper.js'; +import { renderVirtual, updateOnVirtualData } from './virtual.js'; +import { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect.js'; +const Swiper = /*#__PURE__*/forwardRef(({ + className, + tag: Tag = 'div', + wrapperTag: WrapperTag = 'div', + children, + onSwiper, + ...rest +} = {}, externalElRef) => { + let eventsAssigned = false; + const [containerClasses, setContainerClasses] = useState('swiper'); + const [virtualData, setVirtualData] = useState(null); + const [breakpointChanged, setBreakpointChanged] = useState(false); + const initializedRef = useRef(false); + const swiperElRef = useRef(null); + const swiperRef = useRef(null); + const oldPassedParamsRef = useRef(null); + const oldSlides = useRef(null); + const nextElRef = useRef(null); + const prevElRef = useRef(null); + const paginationElRef = useRef(null); + const scrollbarElRef = useRef(null); + const { + params: swiperParams, + passedParams, + rest: restProps, + events + } = getParams(rest); + const { + slides, + slots + } = getChildren(children); + + const onBeforeBreakpoint = () => { + setBreakpointChanged(!breakpointChanged); + }; + + Object.assign(swiperParams.on, { + _containerClasses(swiper, classes) { + setContainerClasses(classes); + } + + }); + + if (!swiperElRef.current) { + // init swiper + Object.assign(swiperParams.on, events); + eventsAssigned = true; + swiperRef.current = initSwiper(swiperParams); + + swiperRef.current.loopCreate = () => {}; + + swiperRef.current.loopDestroy = () => {}; + + if (swiperParams.loop) { + swiperRef.current.loopedSlides = calcLoopedSlides(slides, swiperParams); + } + + if (swiperRef.current.virtual && swiperRef.current.params.virtual.enabled) { + swiperRef.current.virtual.slides = slides; + const extendWith = { + cache: false, + slides, + renderExternal: setVirtualData, + renderExternalUpdate: false + }; + extend(swiperRef.current.params.virtual, extendWith); + extend(swiperRef.current.originalParams.virtual, extendWith); + } + } // Listen for breakpoints change + + + if (swiperRef.current) { + swiperRef.current.on('_beforeBreakpoint', onBeforeBreakpoint); + } + + const attachEvents = () => { + if (eventsAssigned || !events || !swiperRef.current) return; + Object.keys(events).forEach(eventName => { + swiperRef.current.on(eventName, events[eventName]); + }); + }; + + const detachEvents = () => { + if (!events || !swiperRef.current) return; + Object.keys(events).forEach(eventName => { + swiperRef.current.off(eventName, events[eventName]); + }); + }; + + useEffect(() => { + return () => { + if (swiperRef.current) swiperRef.current.off('_beforeBreakpoint', onBeforeBreakpoint); + }; + }); // set initialized flag + + useEffect(() => { + if (!initializedRef.current && swiperRef.current) { + swiperRef.current.emitSlidesClasses(); + initializedRef.current = true; + } + }); // mount swiper + + useIsomorphicLayoutEffect(() => { + if (externalElRef) { + externalElRef.current = swiperElRef.current; + } + + if (!swiperElRef.current) return; + mountSwiper({ + el: swiperElRef.current, + nextEl: nextElRef.current, + prevEl: prevElRef.current, + paginationEl: paginationElRef.current, + scrollbarEl: scrollbarElRef.current, + swiper: swiperRef.current + }, swiperParams); + if (onSwiper) onSwiper(swiperRef.current); // eslint-disable-next-line + + return () => { + if (swiperRef.current && !swiperRef.current.destroyed) { + swiperRef.current.destroy(true, false); + } + }; + }, []); // watch for params change + + useIsomorphicLayoutEffect(() => { + attachEvents(); + const changedParams = getChangedParams(passedParams, oldPassedParamsRef.current, slides, oldSlides.current); + oldPassedParamsRef.current = passedParams; + oldSlides.current = slides; + + if (changedParams.length && swiperRef.current && !swiperRef.current.destroyed) { + updateSwiper({ + swiper: swiperRef.current, + slides, + passedParams, + changedParams, + nextEl: nextElRef.current, + prevEl: prevElRef.current, + scrollbarEl: scrollbarElRef.current, + paginationEl: paginationElRef.current + }); + } + + return () => { + detachEvents(); + }; + }); // update on virtual update + + useIsomorphicLayoutEffect(() => { + updateOnVirtualData(swiperRef.current); + }, [virtualData]); // bypass swiper instance to slides + + function renderSlides() { + if (swiperParams.virtual) { + return renderVirtual(swiperRef.current, slides, virtualData); + } + + if (!swiperParams.loop || swiperRef.current && swiperRef.current.destroyed) { + return slides.map(child => { + return /*#__PURE__*/React.cloneElement(child, { + swiper: swiperRef.current + }); + }); + } + + return renderLoop(swiperRef.current, slides, swiperParams); + } + + return /*#__PURE__*/React.createElement(Tag, _extends({ + ref: swiperElRef, + className: uniqueClasses(`${containerClasses}${className ? ` ${className}` : ''}`) + }, restProps), slots['container-start'], needsNavigation(swiperParams) && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { + ref: prevElRef, + className: "swiper-button-prev" + }), /*#__PURE__*/React.createElement("div", { + ref: nextElRef, + className: "swiper-button-next" + })), needsScrollbar(swiperParams) && /*#__PURE__*/React.createElement("div", { + ref: scrollbarElRef, + className: "swiper-scrollbar" + }), needsPagination(swiperParams) && /*#__PURE__*/React.createElement("div", { + ref: paginationElRef, + className: "swiper-pagination" + }), /*#__PURE__*/React.createElement(WrapperTag, { + className: "swiper-wrapper" + }, slots['wrapper-start'], renderSlides(), slots['wrapper-end']), slots['container-end']); +}); +Swiper.displayName = 'Swiper'; +export { Swiper }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/update-swiper.js b/src/main/resources/static/assets/js/swiper/react/update-swiper.js new file mode 100644 index 0000000..09633c7 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/update-swiper.js @@ -0,0 +1,131 @@ +import { isObject, extend } from './utils.js'; + +function updateSwiper({ + swiper, + slides, + passedParams, + changedParams, + nextEl, + prevEl, + scrollbarEl, + paginationEl +}) { + const updateParams = changedParams.filter(key => key !== 'children' && key !== 'direction'); + const { + params: currentParams, + pagination, + navigation, + scrollbar, + virtual, + thumbs + } = swiper; + let needThumbsInit; + let needControllerInit; + let needPaginationInit; + let needScrollbarInit; + let needNavigationInit; + + if (changedParams.includes('thumbs') && passedParams.thumbs && passedParams.thumbs.swiper && currentParams.thumbs && !currentParams.thumbs.swiper) { + needThumbsInit = true; + } + + if (changedParams.includes('controller') && passedParams.controller && passedParams.controller.control && currentParams.controller && !currentParams.controller.control) { + needControllerInit = true; + } + + if (changedParams.includes('pagination') && passedParams.pagination && (passedParams.pagination.el || paginationEl) && (currentParams.pagination || currentParams.pagination === false) && pagination && !pagination.el) { + needPaginationInit = true; + } + + if (changedParams.includes('scrollbar') && passedParams.scrollbar && (passedParams.scrollbar.el || scrollbarEl) && (currentParams.scrollbar || currentParams.scrollbar === false) && scrollbar && !scrollbar.el) { + needScrollbarInit = true; + } + + if (changedParams.includes('navigation') && passedParams.navigation && (passedParams.navigation.prevEl || prevEl) && (passedParams.navigation.nextEl || nextEl) && (currentParams.navigation || currentParams.navigation === false) && navigation && !navigation.prevEl && !navigation.nextEl) { + needNavigationInit = true; + } + + const destroyModule = mod => { + if (!swiper[mod]) return; + swiper[mod].destroy(); + + if (mod === 'navigation') { + currentParams[mod].prevEl = undefined; + currentParams[mod].nextEl = undefined; + swiper[mod].prevEl = undefined; + swiper[mod].nextEl = undefined; + } else { + currentParams[mod].el = undefined; + swiper[mod].el = undefined; + } + }; + + updateParams.forEach(key => { + if (isObject(currentParams[key]) && isObject(passedParams[key])) { + extend(currentParams[key], passedParams[key]); + } else { + const newValue = passedParams[key]; + + if ((newValue === true || newValue === false) && (key === 'navigation' || key === 'pagination' || key === 'scrollbar')) { + if (newValue === false) { + destroyModule(key); + } + } else { + currentParams[key] = passedParams[key]; + } + } + }); + + if (changedParams.includes('children') && virtual && currentParams.virtual.enabled) { + virtual.slides = slides; + virtual.update(true); + } else if (changedParams.includes('children') && swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + + if (needThumbsInit) { + const initialized = thumbs.init(); + if (initialized) thumbs.update(true); + } + + if (needControllerInit) { + swiper.controller.control = currentParams.controller.control; + } + + if (needPaginationInit) { + if (paginationEl) currentParams.pagination.el = paginationEl; + pagination.init(); + pagination.render(); + pagination.update(); + } + + if (needScrollbarInit) { + if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl; + scrollbar.init(); + scrollbar.updateSize(); + scrollbar.setTranslate(); + } + + if (needNavigationInit) { + if (nextEl) currentParams.navigation.nextEl = nextEl; + if (prevEl) currentParams.navigation.prevEl = prevEl; + navigation.init(); + navigation.update(); + } + + if (changedParams.includes('allowSlideNext')) { + swiper.allowSlideNext = passedParams.allowSlideNext; + } + + if (changedParams.includes('allowSlidePrev')) { + swiper.allowSlidePrev = passedParams.allowSlidePrev; + } + + if (changedParams.includes('direction')) { + swiper.changeDirection(passedParams.direction, false); + } + + swiper.update(); +} + +export { updateSwiper }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/use-isomorphic-layout-effect.js b/src/main/resources/static/assets/js/swiper/react/use-isomorphic-layout-effect.js new file mode 100644 index 0000000..25d33b1 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/use-isomorphic-layout-effect.js @@ -0,0 +1,9 @@ +import { useEffect, useLayoutEffect } from 'react'; + +function useIsomorphicLayoutEffect(callback, deps) { + // eslint-disable-next-line + if (typeof window === 'undefined') return useEffect(callback, deps); + return useLayoutEffect(callback, deps); +} + +export { useIsomorphicLayoutEffect }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/utils.js b/src/main/resources/static/assets/js/swiper/react/utils.js new file mode 100644 index 0000000..dfb9b99 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/utils.js @@ -0,0 +1,37 @@ +function isObject(o) { + return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object'; +} + +function extend(target, src) { + const noExtend = ['__proto__', 'constructor', 'prototype']; + Object.keys(src).filter(key => noExtend.indexOf(key) < 0).forEach(key => { + if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) { + if (src[key].__swiper__) target[key] = src[key];else extend(target[key], src[key]); + } else { + target[key] = src[key]; + } + }); +} + +function needsNavigation(params = {}) { + return params.navigation && typeof params.navigation.nextEl === 'undefined' && typeof params.navigation.prevEl === 'undefined'; +} + +function needsPagination(params = {}) { + return params.pagination && typeof params.pagination.el === 'undefined'; +} + +function needsScrollbar(params = {}) { + return params.scrollbar && typeof params.scrollbar.el === 'undefined'; +} + +function uniqueClasses(classNames = '') { + const classes = classNames.split(' ').map(c => c.trim()).filter(c => !!c); + const unique = []; + classes.forEach(c => { + if (unique.indexOf(c) < 0) unique.push(c); + }); + return unique.join(' '); +} + +export { isObject, extend, needsNavigation, needsPagination, needsScrollbar, uniqueClasses }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/react/virtual.js b/src/main/resources/static/assets/js/swiper/react/virtual.js new file mode 100644 index 0000000..cf12163 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/react/virtual.js @@ -0,0 +1,33 @@ +import React from 'react'; + +function updateOnVirtualData(swiper) { + if (!swiper || swiper.destroyed || !swiper.params.virtual || swiper.params.virtual && !swiper.params.virtual.enabled) return; + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + if (swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + + if (swiper.parallax && swiper.params.parallax && swiper.params.parallax.enabled) { + swiper.parallax.setTranslate(); + } +} + +function renderVirtual(swiper, slides, virtualData) { + if (!virtualData) return null; + const style = swiper.isHorizontal() ? { + [swiper.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px` + } : { + top: `${virtualData.offset}px` + }; + return slides.filter((child, index) => index >= virtualData.from && index <= virtualData.to).map(child => { + return /*#__PURE__*/React.cloneElement(child, { + swiper, + style + }); + }); +} + +export { renderVirtual, updateOnVirtualData }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/classes-to-selector.js b/src/main/resources/static/assets/js/swiper/shared/classes-to-selector.js new file mode 100644 index 0000000..7c34df9 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/classes-to-selector.js @@ -0,0 +1,4 @@ +export default function classesToSelector(classes = '') { + return `.${classes.trim().replace(/([\.:!\/])/g, '\\$1') // eslint-disable-line + .replace(/ /g, '.')}`; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/create-element-if-not-defined.js b/src/main/resources/static/assets/js/swiper/shared/create-element-if-not-defined.js new file mode 100644 index 0000000..9fd2450 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/create-element-if-not-defined.js @@ -0,0 +1,23 @@ +import { getDocument } from 'ssr-window'; +export default function createElementIfNotDefined(swiper, originalParams, params, checkProps) { + const document = getDocument(); + + if (swiper.params.createElements) { + Object.keys(checkProps).forEach(key => { + if (!params[key] && params.auto === true) { + let element = swiper.$el.children(`.${checkProps[key]}`)[0]; + + if (!element) { + element = document.createElement('div'); + element.className = checkProps[key]; + swiper.$el.append(element); + } + + params[key] = element; + originalParams[key] = element; + } + }); + } + + return params; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/create-shadow.js b/src/main/resources/static/assets/js/swiper/shared/create-shadow.js new file mode 100644 index 0000000..9564898 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/create-shadow.js @@ -0,0 +1,13 @@ +import $ from './dom.js'; +export default function createShadow(params, $slideEl, side) { + const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`; + const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl; + let $shadowEl = $shadowContainer.children(`.${shadowClass}`); + + if (!$shadowEl.length) { + $shadowEl = $(`
`); + $shadowContainer.append($shadowEl); + } + + return $shadowEl; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/dom.js b/src/main/resources/static/assets/js/swiper/shared/dom.js new file mode 100644 index 0000000..d66471c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/dom.js @@ -0,0 +1,46 @@ +import { $, addClass, removeClass, hasClass, toggleClass, attr, removeAttr, transform, transition, on, off, trigger, transitionEnd, outerWidth, outerHeight, styles, offset, css, each, html, text, is, index, eq, append, prepend, next, nextAll, prev, prevAll, parent, parents, closest, find, children, filter, remove } from 'dom7'; +const Methods = { + addClass, + removeClass, + hasClass, + toggleClass, + attr, + removeAttr, + transform, + transition, + on, + off, + trigger, + transitionEnd, + outerWidth, + outerHeight, + styles, + offset, + css, + each, + html, + text, + is, + index, + eq, + append, + prepend, + next, + nextAll, + prev, + prevAll, + parent, + parents, + closest, + find, + children, + filter, + remove +}; +Object.keys(Methods).forEach(methodName => { + Object.defineProperty($.fn, methodName, { + value: Methods[methodName], + writable: true + }); +}); +export default $; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/effect-init.js b/src/main/resources/static/assets/js/swiper/shared/effect-init.js new file mode 100644 index 0000000..974d102 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/effect-init.js @@ -0,0 +1,31 @@ +export default function effectInit(params) { + const { + effect, + swiper, + on, + setTranslate, + setTransition, + overwriteParams, + perspective + } = params; + on('beforeInit', () => { + if (swiper.params.effect !== effect) return; + swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`); + + if (perspective && perspective()) { + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + } + + const overwriteParamsResult = overwriteParams ? overwriteParams() : {}; + Object.assign(swiper.params, overwriteParamsResult); + Object.assign(swiper.originalParams, overwriteParamsResult); + }); + on('setTranslate', () => { + if (swiper.params.effect !== effect) return; + setTranslate(); + }); + on('setTransition', (_s, duration) => { + if (swiper.params.effect !== effect) return; + setTransition(duration); + }); +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/effect-target.js b/src/main/resources/static/assets/js/swiper/shared/effect-target.js new file mode 100644 index 0000000..2f9fa04 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/effect-target.js @@ -0,0 +1,10 @@ +export default function effectTarget(effectParams, $slideEl) { + if (effectParams.transformEl) { + return $slideEl.find(effectParams.transformEl).css({ + 'backface-visibility': 'hidden', + '-webkit-backface-visibility': 'hidden' + }); + } + + return $slideEl; +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/effect-virtual-transition-end.js b/src/main/resources/static/assets/js/swiper/shared/effect-virtual-transition-end.js new file mode 100644 index 0000000..1427bb7 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/effect-virtual-transition-end.js @@ -0,0 +1,35 @@ +export default function effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides +}) { + const { + slides, + activeIndex, + $wrapperEl + } = swiper; + + if (swiper.params.virtualTranslate && duration !== 0) { + let eventTriggered = false; + let $transitionEndTarget; + + if (allSlides) { + $transitionEndTarget = transformEl ? slides.find(transformEl) : slides; + } else { + $transitionEndTarget = transformEl ? slides.eq(activeIndex).find(transformEl) : slides.eq(activeIndex); + } + + $transitionEndTarget.transitionEnd(() => { + if (eventTriggered) return; + if (!swiper || swiper.destroyed) return; + eventTriggered = true; + swiper.animating = false; + const triggerEvents = ['webkitTransitionEnd', 'transitionend']; + + for (let i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/get-browser.js b/src/main/resources/static/assets/js/swiper/shared/get-browser.js new file mode 100644 index 0000000..78804c5 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/get-browser.js @@ -0,0 +1,26 @@ +import { getWindow } from 'ssr-window'; +let browser; + +function calcBrowser() { + const window = getWindow(); + + function isSafari() { + const ua = window.navigator.userAgent.toLowerCase(); + return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0; + } + + return { + isSafari: isSafari(), + isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent) + }; +} + +function getBrowser() { + if (!browser) { + browser = calcBrowser(); + } + + return browser; +} + +export { getBrowser }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/get-device.js b/src/main/resources/static/assets/js/swiper/shared/get-device.js new file mode 100644 index 0000000..cc87197 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/get-device.js @@ -0,0 +1,57 @@ +import { getWindow } from 'ssr-window'; +import { getSupport } from './get-support.js'; +let deviceCached; + +function calcDevice({ + userAgent +} = {}) { + const support = getSupport(); + const window = getWindow(); + const platform = window.navigator.platform; + const ua = userAgent || window.navigator.userAgent; + const device = { + ios: false, + android: false + }; + const screenWidth = window.screen.width; + const screenHeight = window.screen.height; + const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line + + let ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); + const windows = platform === 'Win32'; + let macos = platform === 'MacIntel'; // iPadOs 13 fix + + const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810']; + + if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) { + ipad = ua.match(/(Version)\/([\d.]+)/); + if (!ipad) ipad = [0, 1, '13_0_0']; + macos = false; + } // Android + + + if (android && !windows) { + device.os = 'android'; + device.android = true; + } + + if (ipad || iphone || ipod) { + device.os = 'ios'; + device.ios = true; + } // Export object + + + return device; +} + +function getDevice(overrides = {}) { + if (!deviceCached) { + deviceCached = calcDevice(overrides); + } + + return deviceCached; +} + +export { getDevice }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/get-support.js b/src/main/resources/static/assets/js/swiper/shared/get-support.js new file mode 100644 index 0000000..d26e153 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/get-support.js @@ -0,0 +1,41 @@ +import { getWindow, getDocument } from 'ssr-window'; +let support; + +function calcSupport() { + const window = getWindow(); + const document = getDocument(); + return { + smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style, + touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch), + passiveListener: function checkPassiveListener() { + let supportsPassive = false; + + try { + const opts = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line + get() { + supportsPassive = true; + } + + }); + window.addEventListener('testPassiveListener', null, opts); + } catch (e) {// No support + } + + return supportsPassive; + }(), + gestures: function checkGestures() { + return 'ongesturestart' in window; + }() + }; +} + +function getSupport() { + if (!support) { + support = calcSupport(); + } + + return support; +} + +export { getSupport }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/shared/utils.js b/src/main/resources/static/assets/js/swiper/shared/utils.js new file mode 100644 index 0000000..9fecbe3 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/shared/utils.js @@ -0,0 +1,197 @@ +import { getWindow } from 'ssr-window'; + +function deleteProps(obj) { + const object = obj; + Object.keys(object).forEach(key => { + try { + object[key] = null; + } catch (e) {// no getter for object + } + + try { + delete object[key]; + } catch (e) {// something got wrong + } + }); +} + +function nextTick(callback, delay = 0) { + return setTimeout(callback, delay); +} + +function now() { + return Date.now(); +} + +function getComputedStyle(el) { + const window = getWindow(); + let style; + + if (window.getComputedStyle) { + style = window.getComputedStyle(el, null); + } + + if (!style && el.currentStyle) { + style = el.currentStyle; + } + + if (!style) { + style = el.style; + } + + return style; +} + +function getTranslate(el, axis = 'x') { + const window = getWindow(); + let matrix; + let curTransform; + let transformMatrix; + const curStyle = getComputedStyle(el, null); + + if (window.WebKitCSSMatrix) { + curTransform = curStyle.transform || curStyle.webkitTransform; + + if (curTransform.split(',').length > 6) { + curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', '); + } // Some old versions of Webkit choke when 'none' is passed; pass + // empty string instead in this case + + + transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); + } else { + transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); + matrix = transformMatrix.toString().split(','); + } + + if (axis === 'x') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers + else curTransform = parseFloat(matrix[4]); + } + + if (axis === 'y') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers + else curTransform = parseFloat(matrix[5]); + } + + return curTransform || 0; +} + +function isObject(o) { + return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object'; +} + +function isNode(node) { + // eslint-disable-next-line + if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') { + return node instanceof HTMLElement; + } + + return node && (node.nodeType === 1 || node.nodeType === 11); +} + +function extend(...args) { + const to = Object(args[0]); + const noExtend = ['__proto__', 'constructor', 'prototype']; + + for (let i = 1; i < args.length; i += 1) { + const nextSource = args[i]; + + if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) { + const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0); + + for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { + const nextKey = keysArray[nextIndex]; + const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); + + if (desc !== undefined && desc.enumerable) { + if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) { + if (nextSource[nextKey].__swiper__) { + to[nextKey] = nextSource[nextKey]; + } else { + extend(to[nextKey], nextSource[nextKey]); + } + } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) { + to[nextKey] = {}; + + if (nextSource[nextKey].__swiper__) { + to[nextKey] = nextSource[nextKey]; + } else { + extend(to[nextKey], nextSource[nextKey]); + } + } else { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + } + + return to; +} + +function setCSSProperty(el, varName, varValue) { + el.style.setProperty(varName, varValue); +} + +function animateCSSModeScroll({ + swiper, + targetPosition, + side +}) { + const window = getWindow(); + const startPosition = -swiper.translate; + let startTime = null; + let time; + const duration = swiper.params.speed; + swiper.wrapperEl.style.scrollSnapType = 'none'; + window.cancelAnimationFrame(swiper.cssModeFrameID); + const dir = targetPosition > startPosition ? 'next' : 'prev'; + + const isOutOfBound = (current, target) => { + return dir === 'next' && current >= target || dir === 'prev' && current <= target; + }; + + const animate = () => { + time = new Date().getTime(); + + if (startTime === null) { + startTime = time; + } + + const progress = Math.max(Math.min((time - startTime) / duration, 1), 0); + const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2; + let currentPosition = startPosition + easeProgress * (targetPosition - startPosition); + + if (isOutOfBound(currentPosition, targetPosition)) { + currentPosition = targetPosition; + } + + swiper.wrapperEl.scrollTo({ + [side]: currentPosition + }); + + if (isOutOfBound(currentPosition, targetPosition)) { + swiper.wrapperEl.style.overflow = 'hidden'; + swiper.wrapperEl.style.scrollSnapType = ''; + setTimeout(() => { + swiper.wrapperEl.style.overflow = ''; + swiper.wrapperEl.scrollTo({ + [side]: currentPosition + }); + }); + window.cancelAnimationFrame(swiper.cssModeFrameID); + return; + } + + swiper.cssModeFrameID = window.requestAnimationFrame(animate); + }; + + animate(); +} + +export { animateCSSModeScroll, deleteProps, nextTick, now, getTranslate, isObject, extend, getComputedStyle, setCSSProperty }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/svelte/get-changed-params.js b/src/main/resources/static/assets/js/swiper/svelte/get-changed-params.js new file mode 100644 index 0000000..a25ac8a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/get-changed-params.js @@ -0,0 +1,39 @@ +import { isObject } from './utils.js'; +import { paramsList } from './params-list.js'; + +function getChangedParams(swiperParams, oldParams) { + const keys = []; + if (!oldParams) return keys; + + const addKey = key => { + if (keys.indexOf(key) < 0) keys.push(key); + }; + + const watchParams = paramsList.filter(key => key[0] === '_').map(key => key.replace(/_/, '')); + watchParams.forEach(key => { + if (key in swiperParams && key in oldParams) { + if (isObject(swiperParams[key]) && isObject(oldParams[key])) { + const newKeys = Object.keys(swiperParams[key]); + const oldKeys = Object.keys(oldParams[key]); + + if (newKeys.length !== oldKeys.length) { + addKey(key); + } else { + newKeys.forEach(newKey => { + if (swiperParams[key][newKey] !== oldParams[key][newKey]) { + addKey(key); + } + }); + oldKeys.forEach(oldKey => { + if (swiperParams[key][oldKey] !== oldParams[key][oldKey]) addKey(key); + }); + } + } else if (swiperParams[key] !== oldParams[key]) { + addKey(key); + } + } + }); + return keys; +} + +export { getChangedParams }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/svelte/get-params.js b/src/main/resources/static/assets/js/swiper/svelte/get-params.js new file mode 100644 index 0000000..00b79b1 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/get-params.js @@ -0,0 +1,44 @@ +import Swiper from 'swiper'; +import { isObject, extend } from './utils.js'; +import { paramsList } from './params-list.js'; + +function getParams(obj = {}) { + const params = { + on: {} + }; + const passedParams = {}; + extend(params, Swiper.defaults); + extend(params, Swiper.extendedDefaults); + params._emitClasses = true; + params.init = false; + const rest = {}; + const allowedParams = paramsList.map(key => key.replace(/_/, '')); + Object.keys(obj).forEach(key => { + if (allowedParams.indexOf(key) >= 0) { + if (isObject(obj[key])) { + params[key] = {}; + passedParams[key] = {}; + extend(params[key], obj[key]); + extend(passedParams[key], obj[key]); + } else { + params[key] = obj[key]; + passedParams[key] = obj[key]; + } + } else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === 'function') { + params.on[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key]; + } else { + rest[key] = obj[key]; + } + }); + ['navigation', 'pagination', 'scrollbar'].forEach(key => { + if (params[key] === true) params[key] = {}; + if (params[key] === false) delete params[key]; + }); + return { + params, + passedParams, + rest + }; +} + +export { getParams }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/svelte/init-swiper.js b/src/main/resources/static/assets/js/swiper/svelte/init-swiper.js new file mode 100644 index 0000000..aaf5568 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/init-swiper.js @@ -0,0 +1,36 @@ +import Swiper from 'swiper'; +import { needsNavigation, needsPagination, needsScrollbar } from './utils.js'; + +function initSwiper(swiperParams) { + return new Swiper(swiperParams); +} + +function mountSwiper({ + el, + nextEl, + prevEl, + paginationEl, + scrollbarEl, + swiper +}, swiperParams) { + if (needsNavigation(swiperParams) && nextEl && prevEl) { + swiper.params.navigation.nextEl = nextEl; + swiper.originalParams.navigation.nextEl = nextEl; + swiper.params.navigation.prevEl = prevEl; + swiper.originalParams.navigation.prevEl = prevEl; + } + + if (needsPagination(swiperParams) && paginationEl) { + swiper.params.pagination.el = paginationEl; + swiper.originalParams.pagination.el = paginationEl; + } + + if (needsScrollbar(swiperParams) && scrollbarEl) { + swiper.params.scrollbar.el = scrollbarEl; + swiper.originalParams.scrollbar.el = scrollbarEl; + } + + swiper.init(el); +} + +export { initSwiper, mountSwiper }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/svelte/params-list.js b/src/main/resources/static/assets/js/swiper/svelte/params-list.js new file mode 100644 index 0000000..2e0223c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/params-list.js @@ -0,0 +1,4 @@ +/* underscore in name -> watch for changes */ +const paramsList = ['modules', 'init', '_direction', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', '_spaceBetween', '_slidesPerView', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_preloadImages', 'updateOnImagesReady', '_loop', '_loopAdditionalSlides', '_loopedSlides', '_loopFillGroupWithBlank', 'loopPreventsSlide', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideBlankClass', 'slideActiveClass', 'slideDuplicateActiveClass', 'slideVisibleClass', 'slideDuplicateClass', 'slideNextClass', 'slideDuplicateNextClass', 'slidePrevClass', 'slideDuplicatePrevClass', 'wrapperClass', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren', // modules +'a11y', 'autoplay', '_controller', 'coverflowEffect', 'cubeEffect', 'fadeEffect', 'flipEffect', 'creativeEffect', 'cardsEffect', 'hashNavigation', 'history', 'keyboard', 'lazy', 'mousewheel', '_navigation', '_pagination', 'parallax', '_scrollbar', '_thumbs', '_virtual', 'zoom']; +export { paramsList }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/svelte/swiper-slide.svelte b/src/main/resources/static/assets/js/swiper/svelte/swiper-slide.svelte new file mode 100644 index 0000000..a07b304 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/swiper-slide.svelte @@ -0,0 +1,95 @@ + + +
+ {#if zoom} +
+ +
+ {:else} + + {/if} +
diff --git a/src/main/resources/static/assets/js/swiper/svelte/swiper-svelte.d.ts b/src/main/resources/static/assets/js/swiper/svelte/swiper-svelte.d.ts new file mode 100644 index 0000000..88569b8 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/swiper-svelte.d.ts @@ -0,0 +1,431 @@ +import { SvelteComponentTyped } from 'svelte'; +import { SwiperOptions, Swiper as SwiperClass } from '../types/'; + +// @ts-ignore +interface SwiperProps extends svelte.JSX.HTMLAttributes {} +interface SwiperProps extends SwiperOptions {} + +// @ts-ignore +interface SwiperSlideProps extends svelte.JSX.HTMLAttributes { + /** + * Enables additional wrapper required for zoom mode + * + * @default false + */ + zoom?: boolean; + + /** + * Slide's index in slides array/collection + * + * @default false + */ + virtualIndex?: number; +} + +declare class Swiper extends SvelteComponentTyped< + SwiperProps, + { + swiper: CustomEvent; + /** + * Event will be fired in when autoplay started + */ + autoplayStart: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired when autoplay stopped + */ + autoplayStop: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired when slide changed with autoplay + */ + autoplay: CustomEvent<[swiper: SwiperClass]>;/** + * Event will be fired on window hash change + */ + hashChange: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired when swiper updates the hash + */ + hashSet: CustomEvent<[swiper: SwiperClass]>;/** + * Event will be fired on mousewheel scroll + */ + scroll: CustomEvent<[swiper: SwiperClass, event: WheelEvent]>;/** + * Event will be fired in the beginning of lazy loading of image + */ + lazyImageLoad: CustomEvent<[swiper: SwiperClass, slideEl: HTMLElement, imageEl: HTMLElement]>; + /** + * Event will be fired when lazy loading image will be loaded + */ + lazyImageReady: CustomEvent<[swiper: SwiperClass, slideEl: HTMLElement, imageEl: HTMLElement]>;/** + * Event will be fired on key press + */ + keyPress: CustomEvent<[swiper: SwiperClass, keyCode: string]>;/** + * Event will be fired on navigation hide + */ + navigationHide: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired on navigation show + */ + navigationShow: CustomEvent<[swiper: SwiperClass]>;/** + * Event will be fired on draggable scrollbar drag start + */ + scrollbarDragStart: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired on draggable scrollbar drag move + */ + scrollbarDragMove: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired on draggable scrollbar drag end + */ + scrollbarDragEnd: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>;/** + * Event will be fired after pagination rendered + */ + paginationRender: CustomEvent<[swiper: SwiperClass, paginationEl: HTMLElement]>; + + /** + * Event will be fired when pagination updated + */ + paginationUpdate: CustomEvent<[swiper: SwiperClass, paginationEl: HTMLElement]>; + + /** + * Event will be fired on pagination hide + */ + paginationHide: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired on pagination show + */ + paginationShow: CustomEvent<[swiper: SwiperClass]>;/** + * Event will be fired on zoom change + */ + zoomChange: CustomEvent<[swiper: SwiperClass, scale: number, imageEl: HTMLElement, slideEl: HTMLElement]>; + + /** + * Fired right after Swiper initialization. + * @note Note that with `swiper.on('init')` syntax it will + * work only in case you set `init: false` parameter. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * init: false, + * // other parameters + * }); + * swiper.on('init', function() { + * // do something + * }); + * // init Swiper + * swiper.init(); + * ``` + * + * @example + * ```js + * // Otherwise use it as the parameter: + * const swiper = new Swiper('.swiper', { + * // other parameters + * on: { + * init: function () { + * // do something + * }, + * } + * }); + * ``` + */ + init: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired right before Swiper destroyed + */ + beforeDestroy: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired when currently active slide is changed + */ + slideChange: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired in the beginning of animation to other slide (next or previous). + */ + slideChangeTransitionStart: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired after animation to other slide (next or previous). + */ + slideChangeTransitionEnd: CustomEvent<[swiper: SwiperClass]>; + + /** + * Same as "slideChangeTransitionStart" but for "forward" direction only + */ + slideNextTransitionStart: CustomEvent<[swiper: SwiperClass]>; + + /** + * Same as "slideChangeTransitionEnd" but for "forward" direction only + */ + slideNextTransitionEnd: CustomEvent<[swiper: SwiperClass]>; + + /** + * Same as "slideChangeTransitionStart" but for "backward" direction only + */ + slidePrevTransitionStart: CustomEvent<[swiper: SwiperClass]>; + + /** + * Same as "slideChangeTransitionEnd" but for "backward" direction only + */ + slidePrevTransitionEnd: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired in the beginning of transition. + */ + transitionStart: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired after transition. + */ + transitionEnd: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired when user touch Swiper. Receives `touchstart` event as an arguments. + */ + touchStart: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired when user touch and move finger over Swiper. Receives `touchmove` event as an arguments. + */ + touchMove: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired when user touch and move finger over Swiper in direction opposite to direction parameter. Receives `touchmove` event as an arguments. + */ + touchMoveOpposite: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired when user touch and move finger over Swiper and move it. Receives `touchmove` event as an arguments. + */ + sliderMove: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired when user release Swiper. Receives `touchend` event as an arguments. + */ + touchEnd: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired when user click/tap on Swiper. Receives `touchend` event as an arguments. + */ + click: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired when user click/tap on Swiper. Receives `touchend` event as an arguments. + */ + tap: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired when user double tap on Swiper's container. Receives `touchend` event as an arguments + */ + doubleTap: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + + /** + * Event will be fired right after all inner images are loaded. updateOnImagesReady should be also enabled + */ + imagesReady: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired when Swiper progress is changed, as an arguments it receives progress that is always from 0 to 1 + */ + progress: CustomEvent<[swiper: SwiperClass, progress: number]>; + + /** + * Event will be fired when Swiper reach its beginning (initial position) + */ + reachBeginning: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired when Swiper reach last slide + */ + reachEnd: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired when Swiper goes to beginning or end position + */ + toEdge: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired when Swiper goes from beginning or end position + */ + fromEdge: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired when swiper's wrapper change its position. Receives current translate value as an arguments + */ + setTranslate: CustomEvent<[swiper: SwiperClass, translate: number]>; + + /** + * Event will be fired everytime when swiper starts animation. Receives current transition duration (in ms) as an arguments + */ + setTransition: CustomEvent<[swiper: SwiperClass, transition: number]>; + + /** + * Event will be fired on window resize right before swiper's onresize manipulation + */ + resize: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired if observer is enabled and it detects DOM mutations + */ + observerUpdate: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired right before "loop fix" + */ + beforeLoopFix: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired after "loop fix" + */ + loopFix: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will be fired on breakpoint change + */ + breakpoint: CustomEvent<[swiper: SwiperClass, breakpointParams: SwiperOptions]>; + + /** + * !INTERNAL: Event will fired right before breakpoint change + */ + _beforeBreakpoint: CustomEvent<[swiper: SwiperClass, breakpointParams: SwiperOptions]>; + + /** + * !INTERNAL: Event will fired after setting CSS classes on swiper container element + */ + _containerClasses: CustomEvent<[swiper: SwiperClass, classNames: string]>; + + /** + * !INTERNAL: Event will fired after setting CSS classes on swiper slide element + */ + _slideClass: CustomEvent<[swiper: SwiperClass, slideEl: HTMLElement, classNames: string]>; + + /** + * !INTERNAL: Event will fired after setting CSS classes on all swiper slides + */ + _slideClasses: CustomEvent<[ + swiper: SwiperClass, + slides: { slideEl: HTMLElement; classNames: string; index: number }[], + ]>; + + /** + * !INTERNAL: Event will fired as soon as swiper instance available (before init) + */ + _swiper: CustomEvent<[swiper: SwiperClass]>; + + /** + * !INTERNAL: Event will be fired on free mode touch end (release) and there will no be momentum + */ + _freeModeNoMomentumRelease: CustomEvent<[swiper: SwiperClass]>; + + /** + * Event will fired on active index change + */ + activeIndexChange: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will fired on snap index change + */ + snapIndexChange: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will fired on real index change + */ + realIndexChange: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will fired right after initialization + */ + afterInit: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will fired right before initialization + */ + beforeInit: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will fired before resize handler + */ + beforeResize: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will fired before slide change transition start + */ + beforeSlideChangeStart: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will fired before transition start + */ + beforeTransitionStart: CustomEvent<[swiper: SwiperClass, speed: number, internal: any]>; // what is internal? + /** + * Event will fired on direction change + */ + changeDirection: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired when user double click/tap on Swiper + */ + doubleClick: CustomEvent<[swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent]>; + /** + * Event will be fired on swiper destroy + */ + destroy: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired on momentum bounce + */ + momentumBounce: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired on orientation change (e.g. landscape -> portrait) + */ + orientationchange: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired in the beginning of animation of resetting slide to current one + */ + slideResetTransitionStart: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired in the end of animation of resetting slide to current one + */ + slideResetTransitionEnd: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired with first touch/drag move + */ + sliderFirstMove: CustomEvent<[swiper: SwiperClass, event: TouchEvent]>; + /** + * Event will be fired when number of slides has changed + */ + slidesLengthChange: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired when slides grid has changed + */ + slidesGridLengthChange: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired when snap grid has changed + */ + snapGridLengthChange: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired after swiper.update() call + */ + update: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired when swiper is locked (when `watchOverflow` enabled) + */ + lock: CustomEvent<[swiper: SwiperClass]>; + /** + * Event will be fired when swiper is unlocked (when `watchOverflow` enabled) + */ + unlock: CustomEvent<[swiper: SwiperClass]>; + + }, + { + default: {}; + 'container-start': {}; + 'wrapper-start': {}; + 'wrapper-end': {}; + 'container-end': {}; + } +> {} + +declare class SwiperSlide extends SvelteComponentTyped< + SwiperSlideProps, + {}, + { + default: {}; + } +> {} + +export { Swiper, SwiperSlide }; diff --git a/src/main/resources/static/assets/js/swiper/svelte/swiper-svelte.js b/src/main/resources/static/assets/js/swiper/svelte/swiper-svelte.js new file mode 100644 index 0000000..7b3452d --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/swiper-svelte.js @@ -0,0 +1,15 @@ +/** + * Swiper Svelte 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +import Swiper from './swiper.svelte'; +import SwiperSlide from './swiper-slide.svelte'; +export { Swiper, SwiperSlide }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/svelte/swiper.svelte b/src/main/resources/static/assets/js/swiper/svelte/swiper.svelte new file mode 100644 index 0000000..504ae51 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/swiper.svelte @@ -0,0 +1,178 @@ + + +
+ + {#if needsNavigation(swiperParams)} +
+
+ {/if} + {#if needsScrollbar(swiperParams)} +
+ {/if} + {#if needsPagination(swiperParams)} +
+ {/if} +
+ + + +
+ +
diff --git a/src/main/resources/static/assets/js/swiper/svelte/update-swiper.js b/src/main/resources/static/assets/js/swiper/svelte/update-swiper.js new file mode 100644 index 0000000..269ae5a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/update-swiper.js @@ -0,0 +1,132 @@ +import { isObject, extend } from './utils.js'; + +function updateSwiper({ + swiper, + passedParams, + changedParams, + nextEl, + prevEl, + scrollbarEl, + paginationEl +}) { + const updateParams = changedParams.filter(key => key !== 'children' && key !== 'direction'); + const { + params: currentParams, + pagination, + navigation, + scrollbar, + thumbs + } = swiper; + let needThumbsInit; + let needControllerInit; + let needPaginationInit; + let needScrollbarInit; + let needNavigationInit; + + if (changedParams.includes('thumbs') && passedParams.thumbs && passedParams.thumbs.swiper && currentParams.thumbs && !currentParams.thumbs.swiper) { + needThumbsInit = true; + } + + if (changedParams.includes('controller') && passedParams.controller && passedParams.controller.control && currentParams.controller && !currentParams.controller.control) { + needControllerInit = true; + } + + if (changedParams.includes('pagination') && passedParams.pagination && (passedParams.pagination.el || paginationEl) && (currentParams.pagination || currentParams.pagination === false) && pagination && !pagination.el) { + needPaginationInit = true; + } + + if (changedParams.includes('scrollbar') && passedParams.scrollbar && (passedParams.scrollbar.el || scrollbarEl) && (currentParams.scrollbar || currentParams.scrollbar === false) && scrollbar && !scrollbar.el) { + needScrollbarInit = true; + } + + if (changedParams.includes('navigation') && passedParams.navigation && (passedParams.navigation.prevEl || prevEl) && (passedParams.navigation.nextEl || nextEl) && (currentParams.navigation || currentParams.navigation === false) && navigation && !navigation.prevEl && !navigation.nextEl) { + needNavigationInit = true; + } + + if (changedParams.includes('virtual')) { + if (passedParams.virtual && passedParams.virtual.slides && swiper.virtual) { + swiper.virtual.slides = passedParams.virtual.slides; + swiper.virtual.update(); + } + } + + const destroyModule = mod => { + if (!swiper[mod]) return; + swiper[mod].destroy(); + + if (mod === 'navigation') { + currentParams[mod].prevEl = undefined; + currentParams[mod].nextEl = undefined; + swiper[mod].prevEl = undefined; + swiper[mod].nextEl = undefined; + } else { + currentParams[mod].el = undefined; + swiper[mod].el = undefined; + } + }; + + updateParams.forEach(key => { + if (isObject(currentParams[key]) && isObject(passedParams[key])) { + extend(currentParams[key], passedParams[key]); + } else { + const newValue = passedParams[key]; + + if ((newValue === true || newValue === false) && (key === 'navigation' || key === 'pagination' || key === 'scrollbar')) { + if (newValue === false) { + destroyModule(key); + } + } else { + currentParams[key] = passedParams[key]; + } + } + }); + + if (needThumbsInit) { + const initialized = thumbs.init(); + + if (initialized) { + thumbs.update(true); + } + } + + if (needControllerInit) { + swiper.controller.control = currentParams.controller.control; + } + + if (needPaginationInit) { + if (paginationEl) currentParams.pagination.el = paginationEl; + pagination.init(); + pagination.render(); + pagination.update(); + } + + if (needScrollbarInit) { + if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl; + scrollbar.init(); + scrollbar.updateSize(); + scrollbar.setTranslate(); + } + + if (needNavigationInit) { + if (nextEl) currentParams.navigation.nextEl = nextEl; + if (prevEl) currentParams.navigation.prevEl = prevEl; + navigation.init(); + navigation.update(); + } + + if (changedParams.includes('allowSlideNext')) { + swiper.allowSlideNext = passedParams.allowSlideNext; + } + + if (changedParams.includes('allowSlidePrev')) { + swiper.allowSlidePrev = passedParams.allowSlidePrev; + } + + if (changedParams.includes('direction')) { + swiper.changeDirection(passedParams.direction, false); + } + + swiper.update(); +} + +export { updateSwiper }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/svelte/utils.js b/src/main/resources/static/assets/js/swiper/svelte/utils.js new file mode 100644 index 0000000..dfb9b99 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/svelte/utils.js @@ -0,0 +1,37 @@ +function isObject(o) { + return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object'; +} + +function extend(target, src) { + const noExtend = ['__proto__', 'constructor', 'prototype']; + Object.keys(src).filter(key => noExtend.indexOf(key) < 0).forEach(key => { + if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) { + if (src[key].__swiper__) target[key] = src[key];else extend(target[key], src[key]); + } else { + target[key] = src[key]; + } + }); +} + +function needsNavigation(params = {}) { + return params.navigation && typeof params.navigation.nextEl === 'undefined' && typeof params.navigation.prevEl === 'undefined'; +} + +function needsPagination(params = {}) { + return params.pagination && typeof params.pagination.el === 'undefined'; +} + +function needsScrollbar(params = {}) { + return params.scrollbar && typeof params.scrollbar.el === 'undefined'; +} + +function uniqueClasses(classNames = '') { + const classes = classNames.split(' ').map(c => c.trim()).filter(c => !!c); + const unique = []; + classes.forEach(c => { + if (unique.indexOf(c) < 0) unique.push(c); + }); + return unique.join(' '); +} + +export { isObject, extend, needsNavigation, needsPagination, needsScrollbar, uniqueClasses }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.css b/src/main/resources/static/assets/js/swiper/swiper-bundle.css new file mode 100644 index 0000000..bcf72fe --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.css @@ -0,0 +1,612 @@ +/** + * Swiper 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +@font-face { + font-family: 'swiper-icons'; + src: url('data:application/font-woff;charset=utf-8;base64, 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'); + font-weight: 400; + font-style: normal; +} +:root { + --swiper-theme-color: #ffffff; +} +.swiper { + margin-left: auto; + margin-right: auto; + position: relative; + overflow: hidden; + list-style: none; + padding: 0; + /* Fix of Webkit flickering */ + z-index: 1; +} +.swiper-vertical > .swiper-wrapper { + flex-direction: column; +} +.swiper-wrapper { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: flex; + transition-property: transform; + box-sizing: content-box; +} +.swiper-android .swiper-slide, +.swiper-wrapper { + transform: translate3d(0px, 0, 0); +} +.swiper-pointer-events { + touch-action: pan-y; +} +.swiper-pointer-events.swiper-vertical { + touch-action: pan-x; +} +.swiper-slide { + flex-shrink: 0; + width: 100%; + height: 100%; + position: relative; + transition-property: transform; +} +.swiper-slide-invisible-blank { + visibility: hidden; +} +/* Auto Height */ +.swiper-autoheight, +.swiper-autoheight .swiper-slide { + height: auto; +} +.swiper-autoheight .swiper-wrapper { + align-items: flex-start; + transition-property: transform, height; +} +/* 3D Effects */ +.swiper-3d, +.swiper-3d.swiper-css-mode .swiper-wrapper { + perspective: 1200px; +} +.swiper-3d .swiper-wrapper, +.swiper-3d .swiper-slide, +.swiper-3d .swiper-slide-shadow, +.swiper-3d .swiper-slide-shadow-left, +.swiper-3d .swiper-slide-shadow-right, +.swiper-3d .swiper-slide-shadow-top, +.swiper-3d .swiper-slide-shadow-bottom, +.swiper-3d .swiper-cube-shadow { + transform-style: preserve-3d; +} +.swiper-3d .swiper-slide-shadow, +.swiper-3d .swiper-slide-shadow-left, +.swiper-3d .swiper-slide-shadow-right, +.swiper-3d .swiper-slide-shadow-top, +.swiper-3d .swiper-slide-shadow-bottom { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10; +} +.swiper-3d .swiper-slide-shadow { + background: rgba(0, 0, 0, 0.15); +} +.swiper-3d .swiper-slide-shadow-left { + background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); +} +.swiper-3d .swiper-slide-shadow-right { + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); +} +.swiper-3d .swiper-slide-shadow-top { + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); +} +.swiper-3d .swiper-slide-shadow-bottom { + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); +} +/* CSS Mode */ +.swiper-css-mode > .swiper-wrapper { + overflow: auto; + scrollbar-width: none; + /* For Firefox */ + -ms-overflow-style: none; + /* For Internet Explorer and Edge */ +} +.swiper-css-mode > .swiper-wrapper::-webkit-scrollbar { + display: none; +} +.swiper-css-mode > .swiper-wrapper > .swiper-slide { + scroll-snap-align: start start; +} +.swiper-horizontal.swiper-css-mode > .swiper-wrapper { + scroll-snap-type: x mandatory; +} +.swiper-vertical.swiper-css-mode > .swiper-wrapper { + scroll-snap-type: y mandatory; +} +.swiper-centered > .swiper-wrapper::before { + content: ''; + flex-shrink: 0; + order: 9999; +} +.swiper-centered.swiper-horizontal > .swiper-wrapper > .swiper-slide:first-child { + margin-inline-start: var(--swiper-centered-offset-before); +} +.swiper-centered.swiper-horizontal > .swiper-wrapper::before { + height: 100%; + min-height: 1px; + width: var(--swiper-centered-offset-after); +} +.swiper-centered.swiper-vertical > .swiper-wrapper > .swiper-slide:first-child { + margin-block-start: var(--swiper-centered-offset-before); +} +.swiper-centered.swiper-vertical > .swiper-wrapper::before { + width: 100%; + min-width: 1px; + height: var(--swiper-centered-offset-after); +} +.swiper-centered > .swiper-wrapper > .swiper-slide { + scroll-snap-align: center center; +} +.swiper-virtual.swiper-css-mode .swiper-wrapper::after { + content: ''; + position: absolute; + left: 0; + top: 0; + pointer-events: none; +} +.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after { + height: 1px; + width: var(--swiper-virtual-size); +} +.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after { + width: 1px; + height: var(--swiper-virtual-size); +} +:root { + --swiper-navigation-size: 44px; + /* + --swiper-navigation-color: var(--swiper-theme-color); + */ +} +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + width: calc(var(--swiper-navigation-size) / 44 * 27); + height: var(--swiper-navigation-size); + margin-top: calc(0px - (var(--swiper-navigation-size) / 2)); + z-index: 10; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--swiper-navigation-color, var(--swiper-theme-color)); +} +.swiper-button-prev.swiper-button-disabled, +.swiper-button-next.swiper-button-disabled { + opacity: 0.35; + cursor: auto; + pointer-events: none; +} +.swiper-button-prev:after, +.swiper-button-next:after { + font-family: swiper-icons; + font-size: var(--swiper-navigation-size); + text-transform: none !important; + letter-spacing: 0; + text-transform: none; + font-variant: initial; + line-height: 1; +} +.swiper-button-prev, +.swiper-rtl .swiper-button-next { + left: 10px; + right: auto; +} +.swiper-button-prev:after, +.swiper-rtl .swiper-button-next:after { + content: 'prev'; +} +.swiper-button-next, +.swiper-rtl .swiper-button-prev { + right: 10px; + left: auto; +} +.swiper-button-next:after, +.swiper-rtl .swiper-button-prev:after { + content: 'next'; +} +.swiper-button-lock { + display: none; +} +:root { + /* + --swiper-pagination-color: var(--swiper-theme-color); + --swiper-pagination-bullet-size: 8px; + --swiper-pagination-bullet-width: 8px; + --swiper-pagination-bullet-height: 8px; + --swiper-pagination-bullet-inactive-color: #000; + --swiper-pagination-bullet-inactive-opacity: 0.2; + --swiper-pagination-bullet-opacity: 1; + --swiper-pagination-bullet-horizontal-gap: 4px; + --swiper-pagination-bullet-vertical-gap: 6px; + */ +} +.swiper-pagination { + position: absolute; + text-align: center; + transition: 300ms opacity; + transform: translate3d(0, 0, 0); + z-index: 10; +} +.swiper-pagination.swiper-pagination-hidden { + opacity: 0; +} +/* Common Styles */ +.swiper-pagination-fraction, +.swiper-pagination-custom, +.swiper-horizontal > .swiper-pagination-bullets, +.swiper-pagination-bullets.swiper-pagination-horizontal { + bottom: 10px; + left: 0; + width: 100%; +} +/* Bullets */ +.swiper-pagination-bullets-dynamic { + overflow: hidden; + font-size: 0; +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + transform: scale(0.33); + position: relative; +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active { + transform: scale(1); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main { + transform: scale(1); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev { + transform: scale(0.66); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev { + transform: scale(0.33); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next { + transform: scale(0.66); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next { + transform: scale(0.33); +} +.swiper-pagination-bullet { + width: var(--swiper-pagination-bullet-width, var(--swiper-pagination-bullet-size, 15px)); + height: var(--swiper-pagination-bullet-height, var(--swiper-pagination-bullet-size, 5px)); + display: inline-block; + background: var(--swiper-pagination-bullet-inactive-color, #FFF); + opacity: var(--swiper-pagination-bullet-inactive-opacity, 0.2); +} +button.swiper-pagination-bullet { + border: none; + margin: 0; + padding: 0; + box-shadow: none; + -webkit-appearance: none; + appearance: none; +} +.swiper-pagination-clickable .swiper-pagination-bullet { + cursor: pointer; +} +.swiper-pagination-bullet:only-child { + display: none !important; +} +.swiper-pagination-bullet-active { + opacity: var(--swiper-pagination-bullet-opacity, 1); + background: var(--swiper-pagination-color, var(--swiper-theme-color)); +} +.swiper-vertical > .swiper-pagination-bullets, +.swiper-pagination-vertical.swiper-pagination-bullets { + right: 10px; + top: 50%; + transform: translate3d(0px, -50%, 0); +} +.swiper-vertical > .swiper-pagination-bullets .swiper-pagination-bullet, +.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet { + margin: var(--swiper-pagination-bullet-vertical-gap, 6px) 0; + display: block; +} +.swiper-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic, +.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic { + top: 50%; + transform: translateY(-50%); + width: 8px; +} +.swiper-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet, +.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + display: inline-block; + transition: 200ms transform, 200ms top; +} +.swiper-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet, +.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet { + margin: 0 var(--swiper-pagination-bullet-horizontal-gap, 4px); +} +.swiper-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic, +.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic { + left: 50%; + transform: translateX(-50%); + white-space: nowrap; +} +.swiper-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet, +.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + transition: 200ms transform, 200ms left; +} +.swiper-horizontal.swiper-rtl > .swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + transition: 200ms transform, 200ms right; +} +/* Progress */ +.swiper-pagination-progressbar { + background: rgba(0, 0, 0, 0.25); + position: absolute; +} +.swiper-pagination-progressbar .swiper-pagination-progressbar-fill { + background: var(--swiper-pagination-color, var(--swiper-theme-color)); + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + transform: scale(0); + transform-origin: left top; +} +.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill { + transform-origin: right top; +} +.swiper-horizontal > .swiper-pagination-progressbar, +.swiper-pagination-progressbar.swiper-pagination-horizontal, +.swiper-vertical > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite, +.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite { + width: 100%; + height: 4px; + left: 0; + top: 0; +} +.swiper-vertical > .swiper-pagination-progressbar, +.swiper-pagination-progressbar.swiper-pagination-vertical, +.swiper-horizontal > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite, +.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite { + width: 4px; + height: 100%; + left: 0; + top: 0; +} +.swiper-pagination-lock { + display: none; +} +/* Scrollbar */ +.swiper-scrollbar { + border-radius: 10px; + position: relative; + -ms-touch-action: none; + background: rgba(0, 0, 0, 0.1); +} +.swiper-horizontal > .swiper-scrollbar { + position: absolute; + left: 1%; + bottom: 3px; + z-index: 50; + height: 5px; + width: 98%; +} +.swiper-vertical > .swiper-scrollbar { + position: absolute; + right: 3px; + top: 1%; + z-index: 50; + width: 5px; + height: 98%; +} +.swiper-scrollbar-drag { + height: 100%; + width: 100%; + position: relative; + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; + left: 0; + top: 0; +} +.swiper-scrollbar-cursor-drag { + cursor: move; +} +.swiper-scrollbar-lock { + display: none; +} +.swiper-zoom-container { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + text-align: center; +} +.swiper-zoom-container > img, +.swiper-zoom-container > svg, +.swiper-zoom-container > canvas { + max-width: 100%; + max-height: 100%; + object-fit: contain; +} +.swiper-slide-zoomed { + cursor: move; +} +/* Preloader */ +:root { + /* + --swiper-preloader-color: var(--swiper-theme-color); + */ +} +.swiper-lazy-preloader { + width: 42px; + height: 42px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -21px; + margin-top: -21px; + z-index: 10; + transform-origin: 50%; + animation: swiper-preloader-spin 1s infinite linear; + box-sizing: border-box; + border: 4px solid var(--swiper-preloader-color, var(--swiper-theme-color)); + border-radius: 50%; + border-top-color: transparent; +} +.swiper-lazy-preloader-white { + --swiper-preloader-color: #fff; +} +.swiper-lazy-preloader-black { + --swiper-preloader-color: #000; +} +@keyframes swiper-preloader-spin { + 100% { + transform: rotate(360deg); + } +} +/* a11y */ +.swiper .swiper-notification { + position: absolute; + left: 0; + top: 0; + pointer-events: none; + opacity: 0; + z-index: -1000; +} +.swiper-free-mode > .swiper-wrapper { + transition-timing-function: ease-out; + margin: 0 auto; +} +.swiper-grid > .swiper-wrapper { + flex-wrap: wrap; +} +.swiper-grid-column > .swiper-wrapper { + flex-wrap: wrap; + flex-direction: column; +} +.swiper-fade.swiper-free-mode .swiper-slide { + transition-timing-function: ease-out; +} +.swiper-fade .swiper-slide { + pointer-events: none; + transition-property: opacity; +} +.swiper-fade .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-fade .swiper-slide-active, +.swiper-fade .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-cube { + overflow: visible; +} +.swiper-cube .swiper-slide { + pointer-events: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1; + visibility: hidden; + transform-origin: 0 0; + width: 100%; + height: 100%; +} +.swiper-cube .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-cube.swiper-rtl .swiper-slide { + transform-origin: 100% 0; +} +.swiper-cube .swiper-slide-active, +.swiper-cube .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-cube .swiper-slide-active, +.swiper-cube .swiper-slide-next, +.swiper-cube .swiper-slide-prev, +.swiper-cube .swiper-slide-next + .swiper-slide { + pointer-events: auto; + visibility: visible; +} +.swiper-cube .swiper-slide-shadow-top, +.swiper-cube .swiper-slide-shadow-bottom, +.swiper-cube .swiper-slide-shadow-left, +.swiper-cube .swiper-slide-shadow-right { + z-index: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.swiper-cube .swiper-cube-shadow { + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 100%; + opacity: 0.6; + z-index: 0; +} +.swiper-cube .swiper-cube-shadow:before { + content: ''; + background: #000; + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + filter: blur(50px); +} +.swiper-flip { + overflow: visible; +} +.swiper-flip .swiper-slide { + pointer-events: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1; +} +.swiper-flip .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-flip .swiper-slide-active, +.swiper-flip .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-flip .swiper-slide-shadow-top, +.swiper-flip .swiper-slide-shadow-bottom, +.swiper-flip .swiper-slide-shadow-left, +.swiper-flip .swiper-slide-shadow-right { + z-index: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.swiper-creative .swiper-slide { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + overflow: hidden; + transition-property: transform, opacity, height; +} +.swiper-cards { + overflow: visible; +} +.swiper-cards .swiper-slide { + transform-origin: center bottom; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + overflow: hidden; +} diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.js b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.js new file mode 100644 index 0000000..ef767e9 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.js @@ -0,0 +1,10060 @@ +/** + * Swiper 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +/** + * SSR Window 4.0.1 + * Better handling for window object in SSR environment + * https://github.com/nolimits4web/ssr-window + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ + +/* eslint-disable no-param-reassign */ +function isObject$1(obj) { + return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object; +} + +function extend$1(target = {}, src = {}) { + Object.keys(src).forEach(key => { + if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject$1(src[key]) && isObject$1(target[key]) && Object.keys(src[key]).length > 0) { + extend$1(target[key], src[key]); + } + }); +} + +const ssrDocument = { + body: {}, + + addEventListener() {}, + + removeEventListener() {}, + + activeElement: { + blur() {}, + + nodeName: '' + }, + + querySelector() { + return null; + }, + + querySelectorAll() { + return []; + }, + + getElementById() { + return null; + }, + + createEvent() { + return { + initEvent() {} + + }; + }, + + createElement() { + return { + children: [], + childNodes: [], + style: {}, + + setAttribute() {}, + + getElementsByTagName() { + return []; + } + + }; + }, + + createElementNS() { + return {}; + }, + + importNode() { + return null; + }, + + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '' + } +}; + +function getDocument() { + const doc = typeof document !== 'undefined' ? document : {}; + extend$1(doc, ssrDocument); + return doc; +} + +const ssrWindow = { + document: ssrDocument, + navigator: { + userAgent: '' + }, + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '' + }, + history: { + replaceState() {}, + + pushState() {}, + + go() {}, + + back() {} + + }, + CustomEvent: function CustomEvent() { + return this; + }, + + addEventListener() {}, + + removeEventListener() {}, + + getComputedStyle() { + return { + getPropertyValue() { + return ''; + } + + }; + }, + + Image() {}, + + Date() {}, + + screen: {}, + + setTimeout() {}, + + clearTimeout() {}, + + matchMedia() { + return {}; + }, + + requestAnimationFrame(callback) { + if (typeof setTimeout === 'undefined') { + callback(); + return null; + } + + return setTimeout(callback, 0); + }, + + cancelAnimationFrame(id) { + if (typeof setTimeout === 'undefined') { + return; + } + + clearTimeout(id); + } + +}; + +function getWindow() { + const win = typeof window !== 'undefined' ? window : {}; + extend$1(win, ssrWindow); + return win; +} + +/** + * Dom7 4.0.1 + * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API + * https://framework7.io/docs/dom7.html + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ +/* eslint-disable no-proto */ + +function makeReactive(obj) { + const proto = obj.__proto__; + Object.defineProperty(obj, '__proto__', { + get() { + return proto; + }, + + set(value) { + proto.__proto__ = value; + } + + }); +} + +class Dom7 extends Array { + constructor(items) { + super(...(items || [])); + makeReactive(this); + } + +} + +function arrayFlat(arr = []) { + const res = []; + arr.forEach(el => { + if (Array.isArray(el)) { + res.push(...arrayFlat(el)); + } else { + res.push(el); + } + }); + return res; +} + +function arrayFilter(arr, callback) { + return Array.prototype.filter.call(arr, callback); +} + +function arrayUnique(arr) { + const uniqueArray = []; + + for (let i = 0; i < arr.length; i += 1) { + if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]); + } + + return uniqueArray; +} + + +function qsa(selector, context) { + if (typeof selector !== 'string') { + return [selector]; + } + + const a = []; + const res = context.querySelectorAll(selector); + + for (let i = 0; i < res.length; i += 1) { + a.push(res[i]); + } + + return a; +} + +function $(selector, context) { + const window = getWindow(); + const document = getDocument(); + let arr = []; + + if (!context && selector instanceof Dom7) { + return selector; + } + + if (!selector) { + return new Dom7(arr); + } + + if (typeof selector === 'string') { + const html = selector.trim(); + + if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) { + let toCreate = 'div'; + if (html.indexOf(' c.split(' '))); + this.forEach(el => { + el.classList.add(...classNames); + }); + return this; +} + +function removeClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + this.forEach(el => { + el.classList.remove(...classNames); + }); + return this; +} + +function toggleClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + this.forEach(el => { + classNames.forEach(className => { + el.classList.toggle(className); + }); + }); +} + +function hasClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + return arrayFilter(this, el => { + return classNames.filter(className => el.classList.contains(className)).length > 0; + }).length > 0; +} + +function attr(attrs, value) { + if (arguments.length === 1 && typeof attrs === 'string') { + // Get attr + if (this[0]) return this[0].getAttribute(attrs); + return undefined; + } // Set attrs + + + for (let i = 0; i < this.length; i += 1) { + if (arguments.length === 2) { + // String + this[i].setAttribute(attrs, value); + } else { + // Object + for (const attrName in attrs) { + this[i][attrName] = attrs[attrName]; + this[i].setAttribute(attrName, attrs[attrName]); + } + } + } + + return this; +} + +function removeAttr(attr) { + for (let i = 0; i < this.length; i += 1) { + this[i].removeAttribute(attr); + } + + return this; +} + +function transform(transform) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transform = transform; + } + + return this; +} + +function transition$1(duration) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration; + } + + return this; +} + +function on(...args) { + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + + function handleLiveEvent(e) { + const target = e.target; + if (!target) return; + const eventData = e.target.dom7EventData || []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + if ($(target).is(targetSelector)) listener.apply(target, eventData);else { + const parents = $(target).parents(); // eslint-disable-line + + for (let k = 0; k < parents.length; k += 1) { + if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData); + } + } + } + + function handleEvent(e) { + const eventData = e && e.target ? e.target.dom7EventData || [] : []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + listener.apply(this, eventData); + } + + const events = eventType.split(' '); + let j; + + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (!targetSelector) { + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7Listeners) el.dom7Listeners = {}; + if (!el.dom7Listeners[event]) el.dom7Listeners[event] = []; + el.dom7Listeners[event].push({ + listener, + proxyListener: handleEvent + }); + el.addEventListener(event, handleEvent, capture); + } + } else { + // Live events + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7LiveListeners) el.dom7LiveListeners = {}; + if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = []; + el.dom7LiveListeners[event].push({ + listener, + proxyListener: handleLiveEvent + }); + el.addEventListener(event, handleLiveEvent, capture); + } + } + } + + return this; +} + +function off(...args) { + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + const events = eventType.split(' '); + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + let handlers; + + if (!targetSelector && el.dom7Listeners) { + handlers = el.dom7Listeners[event]; + } else if (targetSelector && el.dom7LiveListeners) { + handlers = el.dom7LiveListeners[event]; + } + + if (handlers && handlers.length) { + for (let k = handlers.length - 1; k >= 0; k -= 1) { + const handler = handlers[k]; + + if (listener && handler.listener === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (!listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } + } + } + } + } + + return this; +} + +function trigger(...args) { + const window = getWindow(); + const events = args[0].split(' '); + const eventData = args[1]; + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + + if (window.CustomEvent) { + const evt = new window.CustomEvent(event, { + detail: eventData, + bubbles: true, + cancelable: true + }); + el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0); + el.dispatchEvent(evt); + el.dom7EventData = []; + delete el.dom7EventData; + } + } + } + + return this; +} + +function transitionEnd$1(callback) { + const dom = this; + + function fireCallBack(e) { + if (e.target !== this) return; + callback.call(this, e); + dom.off('transitionend', fireCallBack); + } + + if (callback) { + dom.on('transitionend', fireCallBack); + } + + return this; +} + +function outerWidth(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left')); + } + + return this[0].offsetWidth; + } + + return null; +} + +function outerHeight(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom')); + } + + return this[0].offsetHeight; + } + + return null; +} + +function offset() { + if (this.length > 0) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + const box = el.getBoundingClientRect(); + const body = document.body; + const clientTop = el.clientTop || body.clientTop || 0; + const clientLeft = el.clientLeft || body.clientLeft || 0; + const scrollTop = el === window ? window.scrollY : el.scrollTop; + const scrollLeft = el === window ? window.scrollX : el.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft + }; + } + + return null; +} + +function styles() { + const window = getWindow(); + if (this[0]) return window.getComputedStyle(this[0], null); + return {}; +} + +function css(props, value) { + const window = getWindow(); + let i; + + if (arguments.length === 1) { + if (typeof props === 'string') { + // .css('width') + if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props); + } else { + // .css({ width: '100px' }) + for (i = 0; i < this.length; i += 1) { + for (const prop in props) { + this[i].style[prop] = props[prop]; + } + } + + return this; + } + } + + if (arguments.length === 2 && typeof props === 'string') { + // .css('width', '100px') + for (i = 0; i < this.length; i += 1) { + this[i].style[props] = value; + } + + return this; + } + + return this; +} + +function each(callback) { + if (!callback) return this; + this.forEach((el, index) => { + callback.apply(el, [el, index]); + }); + return this; +} + +function filter(callback) { + const result = arrayFilter(this, callback); + return $(result); +} + +function html(html) { + if (typeof html === 'undefined') { + return this[0] ? this[0].innerHTML : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].innerHTML = html; + } + + return this; +} + +function text(text) { + if (typeof text === 'undefined') { + return this[0] ? this[0].textContent.trim() : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].textContent = text; + } + + return this; +} + +function is(selector) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + let compareWith; + let i; + if (!el || typeof selector === 'undefined') return false; + + if (typeof selector === 'string') { + if (el.matches) return el.matches(selector); + if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector); + if (el.msMatchesSelector) return el.msMatchesSelector(selector); + compareWith = $(selector); + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + if (selector === document) { + return el === document; + } + + if (selector === window) { + return el === window; + } + + if (selector.nodeType || selector instanceof Dom7) { + compareWith = selector.nodeType ? [selector] : selector; + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + return false; +} + +function index() { + let child = this[0]; + let i; + + if (child) { + i = 0; // eslint-disable-next-line + + while ((child = child.previousSibling) !== null) { + if (child.nodeType === 1) i += 1; + } + + return i; + } + + return undefined; +} + +function eq(index) { + if (typeof index === 'undefined') return this; + const length = this.length; + + if (index > length - 1) { + return $([]); + } + + if (index < 0) { + const returnIndex = length + index; + if (returnIndex < 0) return $([]); + return $([this[returnIndex]]); + } + + return $([this[index]]); +} + +function append(...els) { + let newChild; + const document = getDocument(); + + for (let k = 0; k < els.length; k += 1) { + newChild = els[k]; + + for (let i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + + while (tempDiv.firstChild) { + this[i].appendChild(tempDiv.firstChild); + } + } else if (newChild instanceof Dom7) { + for (let j = 0; j < newChild.length; j += 1) { + this[i].appendChild(newChild[j]); + } + } else { + this[i].appendChild(newChild); + } + } + } + + return this; +} + +function prepend(newChild) { + const document = getDocument(); + let i; + let j; + + for (i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + + for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) { + this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); + } + } else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j += 1) { + this[i].insertBefore(newChild[j], this[i].childNodes[0]); + } + } else { + this[i].insertBefore(newChild, this[i].childNodes[0]); + } + } + + return this; +} + +function next(selector) { + if (this.length > 0) { + if (selector) { + if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) { + return $([this[0].nextElementSibling]); + } + + return $([]); + } + + if (this[0].nextElementSibling) return $([this[0].nextElementSibling]); + return $([]); + } + + return $([]); +} + +function nextAll(selector) { + const nextEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.nextElementSibling) { + const next = el.nextElementSibling; // eslint-disable-line + + if (selector) { + if ($(next).is(selector)) nextEls.push(next); + } else nextEls.push(next); + + el = next; + } + + return $(nextEls); +} + +function prev(selector) { + if (this.length > 0) { + const el = this[0]; + + if (selector) { + if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) { + return $([el.previousElementSibling]); + } + + return $([]); + } + + if (el.previousElementSibling) return $([el.previousElementSibling]); + return $([]); + } + + return $([]); +} + +function prevAll(selector) { + const prevEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.previousElementSibling) { + const prev = el.previousElementSibling; // eslint-disable-line + + if (selector) { + if ($(prev).is(selector)) prevEls.push(prev); + } else prevEls.push(prev); + + el = prev; + } + + return $(prevEls); +} + +function parent(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode !== null) { + if (selector) { + if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode); + } else { + parents.push(this[i].parentNode); + } + } + } + + return $(parents); +} + +function parents(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + let parent = this[i].parentNode; // eslint-disable-line + + while (parent) { + if (selector) { + if ($(parent).is(selector)) parents.push(parent); + } else { + parents.push(parent); + } + + parent = parent.parentNode; + } + } + + return $(parents); +} + +function closest(selector) { + let closest = this; // eslint-disable-line + + if (typeof selector === 'undefined') { + return $([]); + } + + if (!closest.is(selector)) { + closest = closest.parents(selector).eq(0); + } + + return closest; +} + +function find(selector) { + const foundElements = []; + + for (let i = 0; i < this.length; i += 1) { + const found = this[i].querySelectorAll(selector); + + for (let j = 0; j < found.length; j += 1) { + foundElements.push(found[j]); + } + } + + return $(foundElements); +} + +function children(selector) { + const children = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + const childNodes = this[i].children; + + for (let j = 0; j < childNodes.length; j += 1) { + if (!selector || $(childNodes[j]).is(selector)) { + children.push(childNodes[j]); + } + } + } + + return $(children); +} + +function remove() { + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode) this[i].parentNode.removeChild(this[i]); + } + + return this; +} + +const Methods = { + addClass, + removeClass, + hasClass, + toggleClass, + attr, + removeAttr, + transform, + transition: transition$1, + on, + off, + trigger, + transitionEnd: transitionEnd$1, + outerWidth, + outerHeight, + styles, + offset, + css, + each, + html, + text, + is, + index, + eq, + append, + prepend, + next, + nextAll, + prev, + prevAll, + parent, + parents, + closest, + find, + children, + filter, + remove +}; +Object.keys(Methods).forEach(methodName => { + Object.defineProperty($.fn, methodName, { + value: Methods[methodName], + writable: true + }); +}); + +function deleteProps(obj) { + const object = obj; + Object.keys(object).forEach(key => { + try { + object[key] = null; + } catch (e) {// no getter for object + } + + try { + delete object[key]; + } catch (e) {// something got wrong + } + }); +} + +function nextTick(callback, delay = 0) { + return setTimeout(callback, delay); +} + +function now() { + return Date.now(); +} + +function getComputedStyle$1(el) { + const window = getWindow(); + let style; + + if (window.getComputedStyle) { + style = window.getComputedStyle(el, null); + } + + if (!style && el.currentStyle) { + style = el.currentStyle; + } + + if (!style) { + style = el.style; + } + + return style; +} + +function getTranslate(el, axis = 'x') { + const window = getWindow(); + let matrix; + let curTransform; + let transformMatrix; + const curStyle = getComputedStyle$1(el); + + if (window.WebKitCSSMatrix) { + curTransform = curStyle.transform || curStyle.webkitTransform; + + if (curTransform.split(',').length > 6) { + curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', '); + } // Some old versions of Webkit choke when 'none' is passed; pass + // empty string instead in this case + + + transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); + } else { + transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); + matrix = transformMatrix.toString().split(','); + } + + if (axis === 'x') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers + else curTransform = parseFloat(matrix[4]); + } + + if (axis === 'y') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers + else curTransform = parseFloat(matrix[5]); + } + + return curTransform || 0; +} + +function isObject(o) { + return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object'; +} + +function isNode(node) { + // eslint-disable-next-line + if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') { + return node instanceof HTMLElement; + } + + return node && (node.nodeType === 1 || node.nodeType === 11); +} + +function extend(...args) { + const to = Object(args[0]); + const noExtend = ['__proto__', 'constructor', 'prototype']; + + for (let i = 1; i < args.length; i += 1) { + const nextSource = args[i]; + + if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) { + const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0); + + for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { + const nextKey = keysArray[nextIndex]; + const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); + + if (desc !== undefined && desc.enumerable) { + if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) { + if (nextSource[nextKey].__swiper__) { + to[nextKey] = nextSource[nextKey]; + } else { + extend(to[nextKey], nextSource[nextKey]); + } + } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) { + to[nextKey] = {}; + + if (nextSource[nextKey].__swiper__) { + to[nextKey] = nextSource[nextKey]; + } else { + extend(to[nextKey], nextSource[nextKey]); + } + } else { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + } + + return to; +} + +function setCSSProperty(el, varName, varValue) { + el.style.setProperty(varName, varValue); +} + +function animateCSSModeScroll({ + swiper, + targetPosition, + side +}) { + const window = getWindow(); + const startPosition = -swiper.translate; + let startTime = null; + let time; + const duration = swiper.params.speed; + swiper.wrapperEl.style.scrollSnapType = 'none'; + window.cancelAnimationFrame(swiper.cssModeFrameID); + const dir = targetPosition > startPosition ? 'next' : 'prev'; + + const isOutOfBound = (current, target) => { + return dir === 'next' && current >= target || dir === 'prev' && current <= target; + }; + + const animate = () => { + time = new Date().getTime(); + + if (startTime === null) { + startTime = time; + } + + const progress = Math.max(Math.min((time - startTime) / duration, 1), 0); + const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2; + let currentPosition = startPosition + easeProgress * (targetPosition - startPosition); + + if (isOutOfBound(currentPosition, targetPosition)) { + currentPosition = targetPosition; + } + + swiper.wrapperEl.scrollTo({ + [side]: currentPosition + }); + + if (isOutOfBound(currentPosition, targetPosition)) { + swiper.wrapperEl.style.overflow = 'hidden'; + swiper.wrapperEl.style.scrollSnapType = ''; + setTimeout(() => { + swiper.wrapperEl.style.overflow = ''; + swiper.wrapperEl.scrollTo({ + [side]: currentPosition + }); + }); + window.cancelAnimationFrame(swiper.cssModeFrameID); + return; + } + + swiper.cssModeFrameID = window.requestAnimationFrame(animate); + }; + + animate(); +} + +let support; + +function calcSupport() { + const window = getWindow(); + const document = getDocument(); + return { + smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style, + touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch), + passiveListener: function checkPassiveListener() { + let supportsPassive = false; + + try { + const opts = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line + get() { + supportsPassive = true; + } + + }); + window.addEventListener('testPassiveListener', null, opts); + } catch (e) {// No support + } + + return supportsPassive; + }(), + gestures: function checkGestures() { + return 'ongesturestart' in window; + }() + }; +} + +function getSupport() { + if (!support) { + support = calcSupport(); + } + + return support; +} + +let deviceCached; + +function calcDevice({ + userAgent +} = {}) { + const support = getSupport(); + const window = getWindow(); + const platform = window.navigator.platform; + const ua = userAgent || window.navigator.userAgent; + const device = { + ios: false, + android: false + }; + const screenWidth = window.screen.width; + const screenHeight = window.screen.height; + const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line + + let ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); + const windows = platform === 'Win32'; + let macos = platform === 'MacIntel'; // iPadOs 13 fix + + const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810']; + + if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) { + ipad = ua.match(/(Version)\/([\d.]+)/); + if (!ipad) ipad = [0, 1, '13_0_0']; + macos = false; + } // Android + + + if (android && !windows) { + device.os = 'android'; + device.android = true; + } + + if (ipad || iphone || ipod) { + device.os = 'ios'; + device.ios = true; + } // Export object + + + return device; +} + +function getDevice(overrides = {}) { + if (!deviceCached) { + deviceCached = calcDevice(overrides); + } + + return deviceCached; +} + +let browser; + +function calcBrowser() { + const window = getWindow(); + + function isSafari() { + const ua = window.navigator.userAgent.toLowerCase(); + return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0; + } + + return { + isSafari: isSafari(), + isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent) + }; +} + +function getBrowser() { + if (!browser) { + browser = calcBrowser(); + } + + return browser; +} + +function Resize({ + swiper, + on, + emit +}) { + const window = getWindow(); + let observer = null; + + const resizeHandler = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + emit('beforeResize'); + emit('resize'); + }; + + const createObserver = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + observer = new ResizeObserver(entries => { + const { + width, + height + } = swiper; + let newWidth = width; + let newHeight = height; + entries.forEach(({ + contentBoxSize, + contentRect, + target + }) => { + if (target && target !== swiper.el) return; + newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize; + newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize; + }); + + if (newWidth !== width || newHeight !== height) { + resizeHandler(); + } + }); + observer.observe(swiper.el); + }; + + const removeObserver = () => { + if (observer && observer.unobserve && swiper.el) { + observer.unobserve(swiper.el); + observer = null; + } + }; + + const orientationChangeHandler = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + emit('orientationchange'); + }; + + on('init', () => { + if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') { + createObserver(); + return; + } + + window.addEventListener('resize', resizeHandler); + window.addEventListener('orientationchange', orientationChangeHandler); + }); + on('destroy', () => { + removeObserver(); + window.removeEventListener('resize', resizeHandler); + window.removeEventListener('orientationchange', orientationChangeHandler); + }); +} + +function Observer({ + swiper, + extendParams, + on, + emit +}) { + const observers = []; + const window = getWindow(); + + const attach = (target, options = {}) => { + const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver; + const observer = new ObserverFunc(mutations => { + // The observerUpdate event should only be triggered + // once despite the number of mutations. Additional + // triggers are redundant and are very costly + if (mutations.length === 1) { + emit('observerUpdate', mutations[0]); + return; + } + + const observerUpdate = function observerUpdate() { + emit('observerUpdate', mutations[0]); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(observerUpdate); + } else { + window.setTimeout(observerUpdate, 0); + } + }); + observer.observe(target, { + attributes: typeof options.attributes === 'undefined' ? true : options.attributes, + childList: typeof options.childList === 'undefined' ? true : options.childList, + characterData: typeof options.characterData === 'undefined' ? true : options.characterData + }); + observers.push(observer); + }; + + const init = () => { + if (!swiper.params.observer) return; + + if (swiper.params.observeParents) { + const containerParents = swiper.$el.parents(); + + for (let i = 0; i < containerParents.length; i += 1) { + attach(containerParents[i]); + } + } // Observe container + + + attach(swiper.$el[0], { + childList: swiper.params.observeSlideChildren + }); // Observe wrapper + + attach(swiper.$wrapperEl[0], { + attributes: false + }); + }; + + const destroy = () => { + observers.forEach(observer => { + observer.disconnect(); + }); + observers.splice(0, observers.length); + }; + + extendParams({ + observer: false, + observeParents: false, + observeSlideChildren: false + }); + on('init', init); + on('destroy', destroy); +} + +/* eslint-disable no-underscore-dangle */ +var eventsEmitter = { + on(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + const method = priority ? 'unshift' : 'push'; + events.split(' ').forEach(event => { + if (!self.eventsListeners[event]) self.eventsListeners[event] = []; + self.eventsListeners[event][method](handler); + }); + return self; + }, + + once(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + + function onceHandler(...args) { + self.off(events, onceHandler); + + if (onceHandler.__emitterProxy) { + delete onceHandler.__emitterProxy; + } + + handler.apply(self, args); + } + + onceHandler.__emitterProxy = handler; + return self.on(events, onceHandler, priority); + }, + + onAny(handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + const method = priority ? 'unshift' : 'push'; + + if (self.eventsAnyListeners.indexOf(handler) < 0) { + self.eventsAnyListeners[method](handler); + } + + return self; + }, + + offAny(handler) { + const self = this; + if (!self.eventsAnyListeners) return self; + const index = self.eventsAnyListeners.indexOf(handler); + + if (index >= 0) { + self.eventsAnyListeners.splice(index, 1); + } + + return self; + }, + + off(events, handler) { + const self = this; + if (!self.eventsListeners) return self; + events.split(' ').forEach(event => { + if (typeof handler === 'undefined') { + self.eventsListeners[event] = []; + } else if (self.eventsListeners[event]) { + self.eventsListeners[event].forEach((eventHandler, index) => { + if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) { + self.eventsListeners[event].splice(index, 1); + } + }); + } + }); + return self; + }, + + emit(...args) { + const self = this; + if (!self.eventsListeners) return self; + let events; + let data; + let context; + + if (typeof args[0] === 'string' || Array.isArray(args[0])) { + events = args[0]; + data = args.slice(1, args.length); + context = self; + } else { + events = args[0].events; + data = args[0].data; + context = args[0].context || self; + } + + data.unshift(context); + const eventsArray = Array.isArray(events) ? events : events.split(' '); + eventsArray.forEach(event => { + if (self.eventsAnyListeners && self.eventsAnyListeners.length) { + self.eventsAnyListeners.forEach(eventHandler => { + eventHandler.apply(context, [event, ...data]); + }); + } + + if (self.eventsListeners && self.eventsListeners[event]) { + self.eventsListeners[event].forEach(eventHandler => { + eventHandler.apply(context, data); + }); + } + }); + return self; + } + +}; + +function updateSize() { + const swiper = this; + let width; + let height; + const $el = swiper.$el; + + if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) { + width = swiper.params.width; + } else { + width = $el[0].clientWidth; + } + + if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) { + height = swiper.params.height; + } else { + height = $el[0].clientHeight; + } + + if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) { + return; + } // Subtract paddings + + + width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10); + height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10); + if (Number.isNaN(width)) width = 0; + if (Number.isNaN(height)) height = 0; + Object.assign(swiper, { + width, + height, + size: swiper.isHorizontal() ? width : height + }); +} + +function updateSlides() { + const swiper = this; + + function getDirectionLabel(property) { + if (swiper.isHorizontal()) { + return property; + } // prettier-ignore + + + return { + 'width': 'height', + 'margin-top': 'margin-left', + 'margin-bottom ': 'margin-right', + 'margin-left': 'margin-top', + 'margin-right': 'margin-bottom', + 'padding-left': 'padding-top', + 'padding-right': 'padding-bottom', + 'marginRight': 'marginBottom' + }[property]; + } + + function getDirectionPropertyValue(node, label) { + return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0); + } + + const params = swiper.params; + const { + $wrapperEl, + size: swiperSize, + rtlTranslate: rtl, + wrongRTL + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; + const slides = $wrapperEl.children(`.${swiper.params.slideClass}`); + const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; + let snapGrid = []; + const slidesGrid = []; + const slidesSizesGrid = []; + let offsetBefore = params.slidesOffsetBefore; + + if (typeof offsetBefore === 'function') { + offsetBefore = params.slidesOffsetBefore.call(swiper); + } + + let offsetAfter = params.slidesOffsetAfter; + + if (typeof offsetAfter === 'function') { + offsetAfter = params.slidesOffsetAfter.call(swiper); + } + + const previousSnapGridLength = swiper.snapGrid.length; + const previousSlidesGridLength = swiper.slidesGrid.length; + let spaceBetween = params.spaceBetween; + let slidePosition = -offsetBefore; + let prevSlideSize = 0; + let index = 0; + + if (typeof swiperSize === 'undefined') { + return; + } + + if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { + spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize; + } + + swiper.virtualSize = -spaceBetween; // reset margins + + if (rtl) slides.css({ + marginLeft: '', + marginBottom: '', + marginTop: '' + });else slides.css({ + marginRight: '', + marginBottom: '', + marginTop: '' + }); // reset cssMode offsets + + if (params.centeredSlides && params.cssMode) { + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', ''); + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', ''); + } + + const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid; + + if (gridEnabled) { + swiper.grid.initSlides(slidesLength); + } // Calc slides + + + let slideSize; + const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => { + return typeof params.breakpoints[key].slidesPerView !== 'undefined'; + }).length > 0; + + for (let i = 0; i < slidesLength; i += 1) { + slideSize = 0; + const slide = slides.eq(i); + + if (gridEnabled) { + swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel); + } + + if (slide.css('display') === 'none') continue; // eslint-disable-line + + if (params.slidesPerView === 'auto') { + if (shouldResetSlideSize) { + slides[i].style[getDirectionLabel('width')] = ``; + } + + const slideStyles = getComputedStyle(slide[0]); + const currentTransform = slide[0].style.transform; + const currentWebKitTransform = slide[0].style.webkitTransform; + + if (currentTransform) { + slide[0].style.transform = 'none'; + } + + if (currentWebKitTransform) { + slide[0].style.webkitTransform = 'none'; + } + + if (params.roundLengths) { + slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true); + } else { + // eslint-disable-next-line + const width = getDirectionPropertyValue(slideStyles, 'width'); + const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left'); + const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right'); + const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left'); + const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right'); + const boxSizing = slideStyles.getPropertyValue('box-sizing'); + + if (boxSizing && boxSizing === 'border-box') { + slideSize = width + marginLeft + marginRight; + } else { + const { + clientWidth, + offsetWidth + } = slide[0]; + slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth); + } + } + + if (currentTransform) { + slide[0].style.transform = currentTransform; + } + + if (currentWebKitTransform) { + slide[0].style.webkitTransform = currentWebKitTransform; + } + + if (params.roundLengths) slideSize = Math.floor(slideSize); + } else { + slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView; + if (params.roundLengths) slideSize = Math.floor(slideSize); + + if (slides[i]) { + slides[i].style[getDirectionLabel('width')] = `${slideSize}px`; + } + } + + if (slides[i]) { + slides[i].swiperSlideSize = slideSize; + } + + slidesSizesGrid.push(slideSize); + + if (params.centeredSlides) { + slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; + if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; + if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; + if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + } else { + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + slidePosition = slidePosition + slideSize + spaceBetween; + } + + swiper.virtualSize += slideSize + spaceBetween; + prevSlideSize = slideSize; + index += 1; + } + + swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; + + if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) { + $wrapperEl.css({ + width: `${swiper.virtualSize + params.spaceBetween}px` + }); + } + + if (params.setWrapperSize) { + $wrapperEl.css({ + [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px` + }); + } + + if (gridEnabled) { + swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel); + } // Remove last grid elements depending on width + + + if (!params.centeredSlides) { + const newSlidesGrid = []; + + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); + + if (snapGrid[i] <= swiper.virtualSize - swiperSize) { + newSlidesGrid.push(slidesGridItem); + } + } + + snapGrid = newSlidesGrid; + + if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { + snapGrid.push(swiper.virtualSize - swiperSize); + } + } + + if (snapGrid.length === 0) snapGrid = [0]; + + if (params.spaceBetween !== 0) { + const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight'); + slides.filter((_, slideIndex) => { + if (!params.cssMode) return true; + + if (slideIndex === slides.length - 1) { + return false; + } + + return true; + }).css({ + [key]: `${spaceBetween}px` + }); + } + + if (params.centeredSlides && params.centeredSlidesBounds) { + let allSlidesSize = 0; + slidesSizesGrid.forEach(slideSizeValue => { + allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + const maxSnap = allSlidesSize - swiperSize; + snapGrid = snapGrid.map(snap => { + if (snap < 0) return -offsetBefore; + if (snap > maxSnap) return maxSnap + offsetAfter; + return snap; + }); + } + + if (params.centerInsufficientSlides) { + let allSlidesSize = 0; + slidesSizesGrid.forEach(slideSizeValue => { + allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + + if (allSlidesSize < swiperSize) { + const allSlidesOffset = (swiperSize - allSlidesSize) / 2; + snapGrid.forEach((snap, snapIndex) => { + snapGrid[snapIndex] = snap - allSlidesOffset; + }); + slidesGrid.forEach((snap, snapIndex) => { + slidesGrid[snapIndex] = snap + allSlidesOffset; + }); + } + } + + Object.assign(swiper, { + slides, + snapGrid, + slidesGrid, + slidesSizesGrid + }); + + if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) { + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`); + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`); + const addToSnapGrid = -swiper.snapGrid[0]; + const addToSlidesGrid = -swiper.slidesGrid[0]; + swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid); + swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid); + } + + if (slidesLength !== previousSlidesLength) { + swiper.emit('slidesLengthChange'); + } + + if (snapGrid.length !== previousSnapGridLength) { + if (swiper.params.watchOverflow) swiper.checkOverflow(); + swiper.emit('snapGridLengthChange'); + } + + if (slidesGrid.length !== previousSlidesGridLength) { + swiper.emit('slidesGridLengthChange'); + } + + if (params.watchSlidesProgress) { + swiper.updateSlidesOffset(); + } +} + +function updateAutoHeight(speed) { + const swiper = this; + const activeSlides = []; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let newHeight = 0; + let i; + + if (typeof speed === 'number') { + swiper.setTransition(speed); + } else if (speed === true) { + swiper.setTransition(swiper.params.speed); + } + + const getSlideByIndex = index => { + if (isVirtual) { + return swiper.slides.filter(el => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index)[0]; + } + + return swiper.slides.eq(index)[0]; + }; // Find slides currently in view + + + if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) { + if (swiper.params.centeredSlides) { + swiper.visibleSlides.each(slide => { + activeSlides.push(slide); + }); + } else { + for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { + const index = swiper.activeIndex + i; + if (index > swiper.slides.length && !isVirtual) break; + activeSlides.push(getSlideByIndex(index)); + } + } + } else { + activeSlides.push(getSlideByIndex(swiper.activeIndex)); + } // Find new height from highest slide in view + + + for (i = 0; i < activeSlides.length; i += 1) { + if (typeof activeSlides[i] !== 'undefined') { + const height = activeSlides[i].offsetHeight; + newHeight = height > newHeight ? height : newHeight; + } + } // Update Height + + + if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`); +} + +function updateSlidesOffset() { + const swiper = this; + const slides = swiper.slides; + + for (let i = 0; i < slides.length; i += 1) { + slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop; + } +} + +function updateSlidesProgress(translate = this && this.translate || 0) { + const swiper = this; + const params = swiper.params; + const { + slides, + rtlTranslate: rtl, + snapGrid + } = swiper; + if (slides.length === 0) return; + if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset(); + let offsetCenter = -translate; + if (rtl) offsetCenter = translate; // Visible Slides + + slides.removeClass(params.slideVisibleClass); + swiper.visibleSlidesIndexes = []; + swiper.visibleSlides = []; + + for (let i = 0; i < slides.length; i += 1) { + const slide = slides[i]; + let slideOffset = slide.swiperSlideOffset; + + if (params.cssMode && params.centeredSlides) { + slideOffset -= slides[0].swiperSlideOffset; + } + + const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween); + const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween); + const slideBefore = -(offsetCenter - slideOffset); + const slideAfter = slideBefore + swiper.slidesSizesGrid[i]; + const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size; + + if (isVisible) { + swiper.visibleSlides.push(slide); + swiper.visibleSlidesIndexes.push(i); + slides.eq(i).addClass(params.slideVisibleClass); + } + + slide.progress = rtl ? -slideProgress : slideProgress; + slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress; + } + + swiper.visibleSlides = $(swiper.visibleSlides); +} + +function updateProgress(translate) { + const swiper = this; + + if (typeof translate === 'undefined') { + const multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line + + translate = swiper && swiper.translate && swiper.translate * multiplier || 0; + } + + const params = swiper.params; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + let { + progress, + isBeginning, + isEnd + } = swiper; + const wasBeginning = isBeginning; + const wasEnd = isEnd; + + if (translatesDiff === 0) { + progress = 0; + isBeginning = true; + isEnd = true; + } else { + progress = (translate - swiper.minTranslate()) / translatesDiff; + isBeginning = progress <= 0; + isEnd = progress >= 1; + } + + Object.assign(swiper, { + progress, + isBeginning, + isEnd + }); + if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate); + + if (isBeginning && !wasBeginning) { + swiper.emit('reachBeginning toEdge'); + } + + if (isEnd && !wasEnd) { + swiper.emit('reachEnd toEdge'); + } + + if (wasBeginning && !isBeginning || wasEnd && !isEnd) { + swiper.emit('fromEdge'); + } + + swiper.emit('progress', progress); +} + +function updateSlidesClasses() { + const swiper = this; + const { + slides, + params, + $wrapperEl, + activeIndex, + realIndex + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`); + let activeSlide; + + if (isVirtual) { + activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index="${activeIndex}"]`); + } else { + activeSlide = slides.eq(activeIndex); + } // Active classes + + + activeSlide.addClass(params.slideActiveClass); + + if (params.loop) { + // Duplicate to all looped slides + if (activeSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${realIndex}"]`).addClass(params.slideDuplicateActiveClass); + } else { + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${realIndex}"]`).addClass(params.slideDuplicateActiveClass); + } + } // Next Slide + + + let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass); + + if (params.loop && nextSlide.length === 0) { + nextSlide = slides.eq(0); + nextSlide.addClass(params.slideNextClass); + } // Prev Slide + + + let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass); + + if (params.loop && prevSlide.length === 0) { + prevSlide = slides.eq(-1); + prevSlide.addClass(params.slidePrevClass); + } + + if (params.loop) { + // Duplicate to all looped slides + if (nextSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicateNextClass); + } else { + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicateNextClass); + } + + if (prevSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicatePrevClass); + } else { + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicatePrevClass); + } + } + + swiper.emitSlidesClasses(); +} + +function updateActiveIndex(newActiveIndex) { + const swiper = this; + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + const { + slidesGrid, + snapGrid, + params, + activeIndex: previousIndex, + realIndex: previousRealIndex, + snapIndex: previousSnapIndex + } = swiper; + let activeIndex = newActiveIndex; + let snapIndex; + + if (typeof activeIndex === 'undefined') { + for (let i = 0; i < slidesGrid.length; i += 1) { + if (typeof slidesGrid[i + 1] !== 'undefined') { + if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) { + activeIndex = i; + } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) { + activeIndex = i + 1; + } + } else if (translate >= slidesGrid[i]) { + activeIndex = i; + } + } // Normalize slideIndex + + + if (params.normalizeSlideIndex) { + if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0; + } + } + + if (snapGrid.indexOf(translate) >= 0) { + snapIndex = snapGrid.indexOf(translate); + } else { + const skip = Math.min(params.slidesPerGroupSkip, activeIndex); + snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup); + } + + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if (activeIndex === previousIndex) { + if (snapIndex !== previousSnapIndex) { + swiper.snapIndex = snapIndex; + swiper.emit('snapIndexChange'); + } + + return; + } // Get real index + + + const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10); + Object.assign(swiper, { + snapIndex, + realIndex, + previousIndex, + activeIndex + }); + swiper.emit('activeIndexChange'); + swiper.emit('snapIndexChange'); + + if (previousRealIndex !== realIndex) { + swiper.emit('realIndexChange'); + } + + if (swiper.initialized || swiper.params.runCallbacksOnInit) { + swiper.emit('slideChange'); + } +} + +function updateClickedSlide(e) { + const swiper = this; + const params = swiper.params; + const slide = $(e.target).closest(`.${params.slideClass}`)[0]; + let slideFound = false; + let slideIndex; + + if (slide) { + for (let i = 0; i < swiper.slides.length; i += 1) { + if (swiper.slides[i] === slide) { + slideFound = true; + slideIndex = i; + break; + } + } + } + + if (slide && slideFound) { + swiper.clickedSlide = slide; + + if (swiper.virtual && swiper.params.virtual.enabled) { + swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10); + } else { + swiper.clickedIndex = slideIndex; + } + } else { + swiper.clickedSlide = undefined; + swiper.clickedIndex = undefined; + return; + } + + if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) { + swiper.slideToClickedSlide(); + } +} + +var update = { + updateSize, + updateSlides, + updateAutoHeight, + updateSlidesOffset, + updateSlidesProgress, + updateProgress, + updateSlidesClasses, + updateActiveIndex, + updateClickedSlide +}; + +function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') { + const swiper = this; + const { + params, + rtlTranslate: rtl, + translate, + $wrapperEl + } = swiper; + + if (params.virtualTranslate) { + return rtl ? -translate : translate; + } + + if (params.cssMode) { + return translate; + } + + let currentTranslate = getTranslate($wrapperEl[0], axis); + if (rtl) currentTranslate = -currentTranslate; + return currentTranslate || 0; +} + +function setTranslate(translate, byController) { + const swiper = this; + const { + rtlTranslate: rtl, + params, + $wrapperEl, + wrapperEl, + progress + } = swiper; + let x = 0; + let y = 0; + const z = 0; + + if (swiper.isHorizontal()) { + x = rtl ? -translate : translate; + } else { + y = translate; + } + + if (params.roundLengths) { + x = Math.floor(x); + y = Math.floor(y); + } + + if (params.cssMode) { + wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y; + } else if (!params.virtualTranslate) { + $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`); + } + + swiper.previousTranslate = swiper.translate; + swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress + + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (translate - swiper.minTranslate()) / translatesDiff; + } + + if (newProgress !== progress) { + swiper.updateProgress(translate); + } + + swiper.emit('setTranslate', swiper.translate, byController); +} + +function minTranslate() { + return -this.snapGrid[0]; +} + +function maxTranslate() { + return -this.snapGrid[this.snapGrid.length - 1]; +} + +function translateTo(translate = 0, speed = this.params.speed, runCallbacks = true, translateBounds = true, internal) { + const swiper = this; + const { + params, + wrapperEl + } = swiper; + + if (swiper.animating && params.preventInteractionOnTransition) { + return false; + } + + const minTranslate = swiper.minTranslate(); + const maxTranslate = swiper.maxTranslate(); + let newTranslate; + if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress + + swiper.updateProgress(newTranslate); + + if (params.cssMode) { + const isH = swiper.isHorizontal(); + + if (speed === 0) { + wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate; + } else { + if (!swiper.support.smoothScroll) { + animateCSSModeScroll({ + swiper, + targetPosition: -newTranslate, + side: isH ? 'left' : 'top' + }); + return true; + } + + wrapperEl.scrollTo({ + [isH ? 'left' : 'top']: -newTranslate, + behavior: 'smooth' + }); + } + + return true; + } + + if (speed === 0) { + swiper.setTransition(0); + swiper.setTranslate(newTranslate); + + if (runCallbacks) { + swiper.emit('beforeTransitionStart', speed, internal); + swiper.emit('transitionEnd'); + } + } else { + swiper.setTransition(speed); + swiper.setTranslate(newTranslate); + + if (runCallbacks) { + swiper.emit('beforeTransitionStart', speed, internal); + swiper.emit('transitionStart'); + } + + if (!swiper.animating) { + swiper.animating = true; + + if (!swiper.onTranslateToWrapperTransitionEnd) { + swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd); + swiper.onTranslateToWrapperTransitionEnd = null; + delete swiper.onTranslateToWrapperTransitionEnd; + + if (runCallbacks) { + swiper.emit('transitionEnd'); + } + }; + } + + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd); + } + } + + return true; +} + +var translate = { + getTranslate: getSwiperTranslate, + setTranslate, + minTranslate, + maxTranslate, + translateTo +}; + +function setTransition(duration, byController) { + const swiper = this; + + if (!swiper.params.cssMode) { + swiper.$wrapperEl.transition(duration); + } + + swiper.emit('setTransition', duration, byController); +} + +function transitionEmit({ + swiper, + runCallbacks, + direction, + step +}) { + const { + activeIndex, + previousIndex + } = swiper; + let dir = direction; + + if (!dir) { + if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset'; + } + + swiper.emit(`transition${step}`); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === 'reset') { + swiper.emit(`slideResetTransition${step}`); + return; + } + + swiper.emit(`slideChangeTransition${step}`); + + if (dir === 'next') { + swiper.emit(`slideNextTransition${step}`); + } else { + swiper.emit(`slidePrevTransition${step}`); + } + } +} + +function transitionStart(runCallbacks = true, direction) { + const swiper = this; + const { + params + } = swiper; + if (params.cssMode) return; + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + transitionEmit({ + swiper, + runCallbacks, + direction, + step: 'Start' + }); +} + +function transitionEnd(runCallbacks = true, direction) { + const swiper = this; + const { + params + } = swiper; + swiper.animating = false; + if (params.cssMode) return; + swiper.setTransition(0); + transitionEmit({ + swiper, + runCallbacks, + direction, + step: 'End' + }); +} + +var transition = { + setTransition, + transitionStart, + transitionEnd +}; + +function slideTo(index = 0, speed = this.params.speed, runCallbacks = true, internal, initial) { + if (typeof index !== 'number' && typeof index !== 'string') { + throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`); + } + + if (typeof index === 'string') { + /** + * The `index` argument converted from `string` to `number`. + * @type {number} + */ + const indexAsNumber = parseInt(index, 10); + /** + * Determines whether the `index` argument is a valid `number` + * after being converted from the `string` type. + * @type {boolean} + */ + + const isValidNumber = isFinite(indexAsNumber); + + if (!isValidNumber) { + throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`); + } // Knowing that the converted `index` is a valid number, + // we can update the original argument's value. + + + index = indexAsNumber; + } + + const swiper = this; + let slideIndex = index; + if (slideIndex < 0) slideIndex = 0; + const { + params, + snapGrid, + slidesGrid, + previousIndex, + activeIndex, + rtlTranslate: rtl, + wrapperEl, + enabled + } = swiper; + + if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) { + return false; + } + + const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex); + let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup); + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) { + swiper.emit('beforeSlideChangeStart'); + } + + const translate = -snapGrid[snapIndex]; // Update progress + + swiper.updateProgress(translate); // Normalize slideIndex + + if (params.normalizeSlideIndex) { + for (let i = 0; i < slidesGrid.length; i += 1) { + const normalizedTranslate = -Math.floor(translate * 100); + const normalizedGrid = Math.floor(slidesGrid[i] * 100); + const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100); + + if (typeof slidesGrid[i + 1] !== 'undefined') { + if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) { + slideIndex = i; + } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) { + slideIndex = i + 1; + } + } else if (normalizedTranslate >= normalizedGrid) { + slideIndex = i; + } + } + } // Directions locks + + + if (swiper.initialized && slideIndex !== activeIndex) { + if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) { + return false; + } + + if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) { + if ((activeIndex || 0) !== slideIndex) return false; + } + } + + let direction; + if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index + + if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) { + swiper.updateActiveIndex(slideIndex); // Update Height + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + swiper.updateSlidesClasses(); + + if (params.effect !== 'slide') { + swiper.setTranslate(translate); + } + + if (direction !== 'reset') { + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } + + return false; + } + + if (params.cssMode) { + const isH = swiper.isHorizontal(); + const t = rtl ? translate : -translate; + + if (speed === 0) { + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + + if (isVirtual) { + swiper.wrapperEl.style.scrollSnapType = 'none'; + swiper._immediateVirtual = true; + } + + wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t; + + if (isVirtual) { + requestAnimationFrame(() => { + swiper.wrapperEl.style.scrollSnapType = ''; + swiper._swiperImmediateVirtual = false; + }); + } + } else { + if (!swiper.support.smoothScroll) { + animateCSSModeScroll({ + swiper, + targetPosition: t, + side: isH ? 'left' : 'top' + }); + return true; + } + + wrapperEl.scrollTo({ + [isH ? 'left' : 'top']: t, + behavior: 'smooth' + }); + } + + return true; + } + + if (speed === 0) { + swiper.setTransition(0); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } else { + swiper.setTransition(speed); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + + if (!swiper.animating) { + swiper.animating = true; + + if (!swiper.onSlideToWrapperTransitionEnd) { + swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + swiper.onSlideToWrapperTransitionEnd = null; + delete swiper.onSlideToWrapperTransitionEnd; + swiper.transitionEnd(runCallbacks, direction); + }; + } + + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + } + } + + return true; +} + +function slideToLoop(index = 0, speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + let newIndex = index; + + if (swiper.params.loop) { + newIndex += swiper.loopedSlides; + } + + return swiper.slideTo(newIndex, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slideNext(speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { + animating, + enabled, + params + } = swiper; + if (!enabled) return swiper; + let perGroup = params.slidesPerGroup; + + if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { + perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1); + } + + const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup; + + if (params.loop) { + if (animating && params.loopPreventsSlide) return false; + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + + return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slidePrev(speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { + params, + animating, + snapGrid, + slidesGrid, + rtlTranslate, + enabled + } = swiper; + if (!enabled) return swiper; + + if (params.loop) { + if (animating && params.loopPreventsSlide) return false; + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + + const translate = rtlTranslate ? swiper.translate : -swiper.translate; + + function normalize(val) { + if (val < 0) return -Math.floor(Math.abs(val)); + return Math.floor(val); + } + + const normalizedTranslate = normalize(translate); + const normalizedSnapGrid = snapGrid.map(val => normalize(val)); + let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; + + if (typeof prevSnap === 'undefined' && params.cssMode) { + let prevSnapIndex; + snapGrid.forEach((snap, snapIndex) => { + if (normalizedTranslate >= snap) { + // prevSnap = snap; + prevSnapIndex = snapIndex; + } + }); + + if (typeof prevSnapIndex !== 'undefined') { + prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex]; + } + } + + let prevIndex = 0; + + if (typeof prevSnap !== 'undefined') { + prevIndex = slidesGrid.indexOf(prevSnap); + if (prevIndex < 0) prevIndex = swiper.activeIndex - 1; + + if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { + prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1; + prevIndex = Math.max(prevIndex, 0); + } + } + + return swiper.slideTo(prevIndex, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slideReset(speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slideToClosest(speed = this.params.speed, runCallbacks = true, internal, threshold = 0.5) { + const swiper = this; + let index = swiper.activeIndex; + const skip = Math.min(swiper.params.slidesPerGroupSkip, index); + const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup); + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + + if (translate >= swiper.snapGrid[snapIndex]) { + // The current translate is on or after the current snap index, so the choice + // is between the current index and the one after it. + const currentSnap = swiper.snapGrid[snapIndex]; + const nextSnap = swiper.snapGrid[snapIndex + 1]; + + if (translate - currentSnap > (nextSnap - currentSnap) * threshold) { + index += swiper.params.slidesPerGroup; + } + } else { + // The current translate is before the current snap index, so the choice + // is between the current index and the one before it. + const prevSnap = swiper.snapGrid[snapIndex - 1]; + const currentSnap = swiper.snapGrid[snapIndex]; + + if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) { + index -= swiper.params.slidesPerGroup; + } + } + + index = Math.max(index, 0); + index = Math.min(index, swiper.slidesGrid.length - 1); + return swiper.slideTo(index, speed, runCallbacks, internal); +} + +function slideToClickedSlide() { + const swiper = this; + const { + params, + $wrapperEl + } = swiper; + const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView; + let slideToIndex = swiper.clickedIndex; + let realIndex; + + if (params.loop) { + if (swiper.animating) return; + realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10); + + if (params.centeredSlides) { + if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) { + swiper.loopFix(); + slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`).eq(0).index(); + nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else if (slideToIndex > swiper.slides.length - slidesPerView) { + swiper.loopFix(); + slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`).eq(0).index(); + nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else { + swiper.slideTo(slideToIndex); + } +} + +var slide = { + slideTo, + slideToLoop, + slideNext, + slidePrev, + slideReset, + slideToClosest, + slideToClickedSlide +}; + +function loopCreate() { + const swiper = this; + const document = getDocument(); + const { + params, + $wrapperEl + } = swiper; // Remove duplicated slides + + const $selector = $($wrapperEl.children()[0].parentNode); + $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove(); + let slides = $selector.children(`.${params.slideClass}`); + + if (params.loopFillGroupWithBlank) { + const blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup; + + if (blankSlidesNum !== params.slidesPerGroup) { + for (let i = 0; i < blankSlidesNum; i += 1) { + const blankNode = $(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`); + $selector.append(blankNode); + } + + slides = $selector.children(`.${params.slideClass}`); + } + } + + if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length; + swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10)); + swiper.loopedSlides += params.loopAdditionalSlides; + + if (swiper.loopedSlides > slides.length) { + swiper.loopedSlides = slides.length; + } + + const prependSlides = []; + const appendSlides = []; + slides.each((el, index) => { + const slide = $(el); + + if (index < swiper.loopedSlides) { + appendSlides.push(el); + } + + if (index < slides.length && index >= slides.length - swiper.loopedSlides) { + prependSlides.push(el); + } + + slide.attr('data-swiper-slide-index', index); + }); + + for (let i = 0; i < appendSlides.length; i += 1) { + $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } + + for (let i = prependSlides.length - 1; i >= 0; i -= 1) { + $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } +} + +function loopFix() { + const swiper = this; + swiper.emit('beforeLoopFix'); + const { + activeIndex, + slides, + loopedSlides, + allowSlidePrev, + allowSlideNext, + snapGrid, + rtlTranslate: rtl + } = swiper; + let newIndex; + swiper.allowSlidePrev = true; + swiper.allowSlideNext = true; + const snapTranslate = -snapGrid[activeIndex]; + const diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding + + if (activeIndex < loopedSlides) { + newIndex = slides.length - loopedSlides * 3 + activeIndex; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } else if (activeIndex >= slides.length - loopedSlides) { + // Fix For Positive Oversliding + newIndex = -slides.length + activeIndex + loopedSlides; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } + + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + swiper.emit('loopFix'); +} + +function loopDestroy() { + const swiper = this; + const { + $wrapperEl, + params, + slides + } = swiper; + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove(); + slides.removeAttr('data-swiper-slide-index'); +} + +var loop = { + loopCreate, + loopFix, + loopDestroy +}; + +function setGrabCursor(moving) { + const swiper = this; + if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return; + const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl; + el.style.cursor = 'move'; + el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab'; + el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab'; + el.style.cursor = moving ? 'grabbing' : 'grab'; +} + +function unsetGrabCursor() { + const swiper = this; + + if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) { + return; + } + + swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = ''; +} + +var grabCursor = { + setGrabCursor, + unsetGrabCursor +}; + +function closestElement(selector, base = this) { + function __closestFrom(el) { + if (!el || el === getDocument() || el === getWindow()) return null; + if (el.assignedSlot) el = el.assignedSlot; + const found = el.closest(selector); + return found || __closestFrom(el.getRootNode().host); + } + + return __closestFrom(base); +} + +function onTouchStart(event) { + const swiper = this; + const document = getDocument(); + const window = getWindow(); + const data = swiper.touchEventsData; + const { + params, + touches, + enabled + } = swiper; + if (!enabled) return; + + if (swiper.animating && params.preventInteractionOnTransition) { + return; + } + + if (!swiper.animating && params.cssMode && params.loop) { + swiper.loopFix(); + } + + let e = event; + if (e.originalEvent) e = e.originalEvent; + let $targetEl = $(e.target); + + if (params.touchEventsTarget === 'wrapper') { + if (!$targetEl.closest(swiper.wrapperEl).length) return; + } + + data.isTouchEvent = e.type === 'touchstart'; + if (!data.isTouchEvent && 'which' in e && e.which === 3) return; + if (!data.isTouchEvent && 'button' in e && e.button > 0) return; + if (data.isTouched && data.isMoved) return; // change target el for shadow root component + + const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== ''; + + if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) { + $targetEl = $(event.path[0]); + } + + const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`; + const isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element + + if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, e.target) : $targetEl.closest(noSwipingSelector)[0])) { + swiper.allowClick = true; + return; + } + + if (params.swipeHandler) { + if (!$targetEl.closest(params.swipeHandler)[0]) return; + } + + touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + const startX = touches.currentX; + const startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore + + const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; + const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; + + if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) { + if (edgeSwipeDetection === 'prevent') { + event.preventDefault(); + } else { + return; + } + } + + Object.assign(data, { + isTouched: true, + isMoved: false, + allowTouchCallbacks: true, + isScrolling: undefined, + startMoving: undefined + }); + touches.startX = startX; + touches.startY = startY; + data.touchStartTime = now(); + swiper.allowClick = true; + swiper.updateSize(); + swiper.swipeDirection = undefined; + if (params.threshold > 0) data.allowThresholdMove = false; + + if (e.type !== 'touchstart') { + let preventDefault = true; + if ($targetEl.is(data.focusableElements)) preventDefault = false; + + if (document.activeElement && $(document.activeElement).is(data.focusableElements) && document.activeElement !== $targetEl[0]) { + document.activeElement.blur(); + } + + const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; + + if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) { + e.preventDefault(); + } + } + + swiper.emit('touchStart', e); +} + +function onTouchMove(event) { + const document = getDocument(); + const swiper = this; + const data = swiper.touchEventsData; + const { + params, + touches, + rtlTranslate: rtl, + enabled + } = swiper; + if (!enabled) return; + let e = event; + if (e.originalEvent) e = e.originalEvent; + + if (!data.isTouched) { + if (data.startMoving && data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + + return; + } + + if (data.isTouchEvent && e.type !== 'touchmove') return; + const targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]); + const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX; + const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY; + + if (e.preventedByNestedSwiper) { + touches.startX = pageX; + touches.startY = pageY; + return; + } + + if (!swiper.allowTouchMove) { + // isMoved = true; + swiper.allowClick = false; + + if (data.isTouched) { + Object.assign(touches, { + startX: pageX, + startY: pageY, + currentX: pageX, + currentY: pageY + }); + data.touchStartTime = now(); + } + + return; + } + + if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) { + if (swiper.isVertical()) { + // Vertical + if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) { + data.isTouched = false; + data.isMoved = false; + return; + } + } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) { + return; + } + } + + if (data.isTouchEvent && document.activeElement) { + if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) { + data.isMoved = true; + swiper.allowClick = false; + return; + } + } + + if (data.allowTouchCallbacks) { + swiper.emit('touchMove', e); + } + + if (e.targetTouches && e.targetTouches.length > 1) return; + touches.currentX = pageX; + touches.currentY = pageY; + const diffX = touches.currentX - touches.startX; + const diffY = touches.currentY - touches.startY; + if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return; + + if (typeof data.isScrolling === 'undefined') { + let touchAngle; + + if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) { + data.isScrolling = false; + } else { + // eslint-disable-next-line + if (diffX * diffX + diffY * diffY >= 25) { + touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI; + data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle; + } + } + } + + if (data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + + if (typeof data.startMoving === 'undefined') { + if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { + data.startMoving = true; + } + } + + if (data.isScrolling) { + data.isTouched = false; + return; + } + + if (!data.startMoving) { + return; + } + + swiper.allowClick = false; + + if (!params.cssMode && e.cancelable) { + e.preventDefault(); + } + + if (params.touchMoveStopPropagation && !params.nested) { + e.stopPropagation(); + } + + if (!data.isMoved) { + if (params.loop && !params.cssMode) { + swiper.loopFix(); + } + + data.startTranslate = swiper.getTranslate(); + swiper.setTransition(0); + + if (swiper.animating) { + swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend'); + } + + data.allowMomentumBounce = false; // Grab Cursor + + if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(true); + } + + swiper.emit('sliderFirstMove', e); + } + + swiper.emit('sliderMove', e); + data.isMoved = true; + let diff = swiper.isHorizontal() ? diffX : diffY; + touches.diff = diff; + diff *= params.touchRatio; + if (rtl) diff = -diff; + swiper.swipeDirection = diff > 0 ? 'prev' : 'next'; + data.currentTranslate = diff + data.startTranslate; + let disableParentSwiper = true; + let resistanceRatio = params.resistanceRatio; + + if (params.touchReleaseOnEdges) { + resistanceRatio = 0; + } + + if (diff > 0 && data.currentTranslate > swiper.minTranslate()) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio; + } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio; + } + + if (disableParentSwiper) { + e.preventedByNestedSwiper = true; + } // Directions locks + + + if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + + if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + + if (!swiper.allowSlidePrev && !swiper.allowSlideNext) { + data.currentTranslate = data.startTranslate; + } // Threshold + + + if (params.threshold > 0) { + if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { + if (!data.allowThresholdMove) { + data.allowThresholdMove = true; + touches.startX = touches.currentX; + touches.startY = touches.currentY; + data.currentTranslate = data.startTranslate; + touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; + return; + } + } else { + data.currentTranslate = data.startTranslate; + return; + } + } + + if (!params.followFinger || params.cssMode) return; // Update active index in free mode + + if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) { + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) { + swiper.freeMode.onTouchMove(); + } // Update progress + + + swiper.updateProgress(data.currentTranslate); // Update translate + + swiper.setTranslate(data.currentTranslate); +} + +function onTouchEnd(event) { + const swiper = this; + const data = swiper.touchEventsData; + const { + params, + touches, + rtlTranslate: rtl, + slidesGrid, + enabled + } = swiper; + if (!enabled) return; + let e = event; + if (e.originalEvent) e = e.originalEvent; + + if (data.allowTouchCallbacks) { + swiper.emit('touchEnd', e); + } + + data.allowTouchCallbacks = false; + + if (!data.isTouched) { + if (data.isMoved && params.grabCursor) { + swiper.setGrabCursor(false); + } + + data.isMoved = false; + data.startMoving = false; + return; + } // Return Grab Cursor + + + if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(false); + } // Time diff + + + const touchEndTime = now(); + const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click + + if (swiper.allowClick) { + swiper.updateClickedSlide(e); + swiper.emit('tap click', e); + + if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) { + swiper.emit('doubleTap doubleClick', e); + } + } + + data.lastClickTime = now(); + nextTick(() => { + if (!swiper.destroyed) swiper.allowClick = true; + }); + + if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) { + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + return; + } + + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + let currentPos; + + if (params.followFinger) { + currentPos = rtl ? swiper.translate : -swiper.translate; + } else { + currentPos = -data.currentTranslate; + } + + if (params.cssMode) { + return; + } + + if (swiper.params.freeMode && params.freeMode.enabled) { + swiper.freeMode.onTouchEnd({ + currentPos + }); + return; + } // Find current slide + + + let stopIndex = 0; + let groupSize = swiper.slidesSizesGrid[0]; + + for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) { + const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; + + if (typeof slidesGrid[i + increment] !== 'undefined') { + if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) { + stopIndex = i; + groupSize = slidesGrid[i + increment] - slidesGrid[i]; + } + } else if (currentPos >= slidesGrid[i]) { + stopIndex = i; + groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; + } + } // Find current slide size + + + const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; + const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; + + if (timeDiff > params.longSwipesMs) { + // Long touches + if (!params.longSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + + if (swiper.swipeDirection === 'next') { + if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex); + } + + if (swiper.swipeDirection === 'prev') { + if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex); + } + } else { + // Short swipes + if (!params.shortSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + + const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl); + + if (!isNavButtonTarget) { + if (swiper.swipeDirection === 'next') { + swiper.slideTo(stopIndex + increment); + } + + if (swiper.swipeDirection === 'prev') { + swiper.slideTo(stopIndex); + } + } else if (e.target === swiper.navigation.nextEl) { + swiper.slideTo(stopIndex + increment); + } else { + swiper.slideTo(stopIndex); + } + } +} + +function onResize() { + const swiper = this; + const { + params, + el + } = swiper; + if (el && el.offsetWidth === 0) return; // Breakpoints + + if (params.breakpoints) { + swiper.setBreakpoint(); + } // Save locks + + + const { + allowSlideNext, + allowSlidePrev, + snapGrid + } = swiper; // Disable locks on resize + + swiper.allowSlideNext = true; + swiper.allowSlidePrev = true; + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateSlidesClasses(); + + if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) { + swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + swiper.slideTo(swiper.activeIndex, 0, false, true); + } + + if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { + swiper.autoplay.run(); + } // Return locks after resize + + + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + + if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } +} + +function onClick(e) { + const swiper = this; + if (!swiper.enabled) return; + + if (!swiper.allowClick) { + if (swiper.params.preventClicks) e.preventDefault(); + + if (swiper.params.preventClicksPropagation && swiper.animating) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } +} + +function onScroll() { + const swiper = this; + const { + wrapperEl, + rtlTranslate, + enabled + } = swiper; + if (!enabled) return; + swiper.previousTranslate = swiper.translate; + + if (swiper.isHorizontal()) { + swiper.translate = -wrapperEl.scrollLeft; + } else { + swiper.translate = -wrapperEl.scrollTop; + } // eslint-disable-next-line + + + if (swiper.translate === -0) swiper.translate = 0; + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff; + } + + if (newProgress !== swiper.progress) { + swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate); + } + + swiper.emit('setTranslate', swiper.translate, false); +} + +let dummyEventAttached = false; + +function dummyEventListener() {} + +const events = (swiper, method) => { + const document = getDocument(); + const { + params, + touchEvents, + el, + wrapperEl, + device, + support + } = swiper; + const capture = !!params.nested; + const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener'; + const swiperMethod = method; // Touch Events + + if (!support.touch) { + el[domMethod](touchEvents.start, swiper.onTouchStart, false); + document[domMethod](touchEvents.move, swiper.onTouchMove, capture); + document[domMethod](touchEvents.end, swiper.onTouchEnd, false); + } else { + const passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? { + passive: true, + capture: false + } : false; + el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener); + el[domMethod](touchEvents.move, swiper.onTouchMove, support.passiveListener ? { + passive: false, + capture + } : capture); + el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener); + + if (touchEvents.cancel) { + el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener); + } + } // Prevent Links Clicks + + + if (params.preventClicks || params.preventClicksPropagation) { + el[domMethod]('click', swiper.onClick, true); + } + + if (params.cssMode) { + wrapperEl[domMethod]('scroll', swiper.onScroll); + } // Resize handler + + + if (params.updateOnWindowResize) { + swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true); + } else { + swiper[swiperMethod]('observerUpdate', onResize, true); + } +}; + +function attachEvents() { + const swiper = this; + const document = getDocument(); + const { + params, + support + } = swiper; + swiper.onTouchStart = onTouchStart.bind(swiper); + swiper.onTouchMove = onTouchMove.bind(swiper); + swiper.onTouchEnd = onTouchEnd.bind(swiper); + + if (params.cssMode) { + swiper.onScroll = onScroll.bind(swiper); + } + + swiper.onClick = onClick.bind(swiper); + + if (support.touch && !dummyEventAttached) { + document.addEventListener('touchstart', dummyEventListener); + dummyEventAttached = true; + } + + events(swiper, 'on'); +} + +function detachEvents() { + const swiper = this; + events(swiper, 'off'); +} + +var events$1 = { + attachEvents, + detachEvents +}; + +const isGridEnabled = (swiper, params) => { + return swiper.grid && params.grid && params.grid.rows > 1; +}; + +function setBreakpoint() { + const swiper = this; + const { + activeIndex, + initialized, + loopedSlides = 0, + params, + $el + } = swiper; + const breakpoints = params.breakpoints; + if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters + + const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el); + if (!breakpoint || swiper.currentBreakpoint === breakpoint) return; + const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined; + const breakpointParams = breakpointOnlyParams || swiper.originalParams; + const wasMultiRow = isGridEnabled(swiper, params); + const isMultiRow = isGridEnabled(swiper, breakpointParams); + const wasEnabled = params.enabled; + + if (wasMultiRow && !isMultiRow) { + $el.removeClass(`${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`); + swiper.emitContainerClasses(); + } else if (!wasMultiRow && isMultiRow) { + $el.addClass(`${params.containerModifierClass}grid`); + + if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') { + $el.addClass(`${params.containerModifierClass}grid-column`); + } + + swiper.emitContainerClasses(); + } + + const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; + const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); + + if (directionChanged && initialized) { + swiper.changeDirection(); + } + + extend(swiper.params, breakpointParams); + const isEnabled = swiper.params.enabled; + Object.assign(swiper, { + allowTouchMove: swiper.params.allowTouchMove, + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev + }); + + if (wasEnabled && !isEnabled) { + swiper.disable(); + } else if (!wasEnabled && isEnabled) { + swiper.enable(); + } + + swiper.currentBreakpoint = breakpoint; + swiper.emit('_beforeBreakpoint', breakpointParams); + + if (needsReLoop && initialized) { + swiper.loopDestroy(); + swiper.loopCreate(); + swiper.updateSlides(); + swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false); + } + + swiper.emit('breakpoint', breakpointParams); +} + +function getBreakpoint(breakpoints, base = 'window', containerEl) { + if (!breakpoints || base === 'container' && !containerEl) return undefined; + let breakpoint = false; + const window = getWindow(); + const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight; + const points = Object.keys(breakpoints).map(point => { + if (typeof point === 'string' && point.indexOf('@') === 0) { + const minRatio = parseFloat(point.substr(1)); + const value = currentHeight * minRatio; + return { + value, + point + }; + } + + return { + value: point, + point + }; + }); + points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10)); + + for (let i = 0; i < points.length; i += 1) { + const { + point, + value + } = points[i]; + + if (base === 'window') { + if (window.matchMedia(`(min-width: ${value}px)`).matches) { + breakpoint = point; + } + } else if (value <= containerEl.clientWidth) { + breakpoint = point; + } + } + + return breakpoint || 'max'; +} + +var breakpoints = { + setBreakpoint, + getBreakpoint +}; + +function prepareClasses(entries, prefix) { + const resultClasses = []; + entries.forEach(item => { + if (typeof item === 'object') { + Object.keys(item).forEach(classNames => { + if (item[classNames]) { + resultClasses.push(prefix + classNames); + } + }); + } else if (typeof item === 'string') { + resultClasses.push(prefix + item); + } + }); + return resultClasses; +} + +function addClasses() { + const swiper = this; + const { + classNames, + params, + rtl, + $el, + device, + support + } = swiper; // prettier-ignore + + const suffixes = prepareClasses(['initialized', params.direction, { + 'pointer-events': !support.touch + }, { + 'free-mode': swiper.params.freeMode && params.freeMode.enabled + }, { + 'autoheight': params.autoHeight + }, { + 'rtl': rtl + }, { + 'grid': params.grid && params.grid.rows > 1 + }, { + 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' + }, { + 'android': device.android + }, { + 'ios': device.ios + }, { + 'css-mode': params.cssMode + }, { + 'centered': params.cssMode && params.centeredSlides + }], params.containerModifierClass); + classNames.push(...suffixes); + $el.addClass([...classNames].join(' ')); + swiper.emitContainerClasses(); +} + +function removeClasses() { + const swiper = this; + const { + $el, + classNames + } = swiper; + $el.removeClass(classNames.join(' ')); + swiper.emitContainerClasses(); +} + +var classes = { + addClasses, + removeClasses +}; + +function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) { + const window = getWindow(); + let image; + + function onReady() { + if (callback) callback(); + } + + const isPicture = $(imageEl).parent('picture')[0]; + + if (!isPicture && (!imageEl.complete || !checkForComplete)) { + if (src) { + image = new window.Image(); + image.onload = onReady; + image.onerror = onReady; + + if (sizes) { + image.sizes = sizes; + } + + if (srcset) { + image.srcset = srcset; + } + + if (src) { + image.src = src; + } + } else { + onReady(); + } + } else { + // image already loaded... + onReady(); + } +} + +function preloadImages() { + const swiper = this; + swiper.imagesToLoad = swiper.$el.find('img'); + + function onReady() { + if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return; + if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1; + + if (swiper.imagesLoaded === swiper.imagesToLoad.length) { + if (swiper.params.updateOnImagesReady) swiper.update(); + swiper.emit('imagesReady'); + } + } + + for (let i = 0; i < swiper.imagesToLoad.length; i += 1) { + const imageEl = swiper.imagesToLoad[i]; + swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady); + } +} + +var images = { + loadImage, + preloadImages +}; + +function checkOverflow() { + const swiper = this; + const { + isLocked: wasLocked, + params + } = swiper; + const { + slidesOffsetBefore + } = params; + + if (slidesOffsetBefore) { + const lastSlideIndex = swiper.slides.length - 1; + const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2; + swiper.isLocked = swiper.size > lastSlideRightEdge; + } else { + swiper.isLocked = swiper.snapGrid.length === 1; + } + + if (params.allowSlideNext === true) { + swiper.allowSlideNext = !swiper.isLocked; + } + + if (params.allowSlidePrev === true) { + swiper.allowSlidePrev = !swiper.isLocked; + } + + if (wasLocked && wasLocked !== swiper.isLocked) { + swiper.isEnd = false; + } + + if (wasLocked !== swiper.isLocked) { + swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); + } +} + +var checkOverflow$1 = { + checkOverflow +}; + +var defaults = { + init: true, + direction: 'horizontal', + touchEventsTarget: 'wrapper', + initialSlide: 0, + speed: 300, + cssMode: false, + updateOnWindowResize: true, + resizeObserver: true, + nested: false, + createElements: false, + enabled: true, + focusableElements: 'input, select, option, textarea, button, video, label', + // Overrides + width: null, + height: null, + // + preventInteractionOnTransition: false, + // ssr + userAgent: null, + url: null, + // To support iOS's swipe-to-go-back gesture (when being used in-app). + edgeSwipeDetection: false, + edgeSwipeThreshold: 20, + // Autoheight + autoHeight: false, + // Set wrapper width + setWrapperSize: false, + // Virtual Translate + virtualTranslate: false, + // Effects + effect: 'slide', + // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' + // Breakpoints + breakpoints: undefined, + breakpointsBase: 'window', + // Slides grid + spaceBetween: 0, + slidesPerView: 1, + slidesPerGroup: 1, + slidesPerGroupSkip: 0, + slidesPerGroupAuto: false, + centeredSlides: false, + centeredSlidesBounds: false, + slidesOffsetBefore: 0, + // in px + slidesOffsetAfter: 0, + // in px + normalizeSlideIndex: true, + centerInsufficientSlides: false, + // Disable swiper and hide navigation when container not overflow + watchOverflow: true, + // Round length + roundLengths: false, + // Touches + touchRatio: 1, + touchAngle: 45, + simulateTouch: true, + shortSwipes: true, + longSwipes: true, + longSwipesRatio: 0.5, + longSwipesMs: 300, + followFinger: true, + allowTouchMove: true, + threshold: 0, + touchMoveStopPropagation: false, + touchStartPreventDefault: true, + touchStartForcePreventDefault: false, + touchReleaseOnEdges: false, + // Unique Navigation Elements + uniqueNavElements: true, + // Resistance + resistance: true, + resistanceRatio: 0.85, + // Progress + watchSlidesProgress: false, + // Cursor + grabCursor: false, + // Clicks + preventClicks: true, + preventClicksPropagation: true, + slideToClickedSlide: false, + // Images + preloadImages: true, + updateOnImagesReady: true, + // loop + loop: false, + loopAdditionalSlides: 0, + loopedSlides: null, + loopFillGroupWithBlank: false, + loopPreventsSlide: true, + // Swiping/no swiping + allowSlidePrev: true, + allowSlideNext: true, + swipeHandler: null, + // '.swipe-handler', + noSwiping: true, + noSwipingClass: 'swiper-no-swiping', + noSwipingSelector: null, + // Passive Listeners + passiveListeners: true, + // NS + containerModifierClass: 'swiper-', + // NEW + slideClass: 'swiper-slide', + slideBlankClass: 'swiper-slide-invisible-blank', + slideActiveClass: 'swiper-slide-active', + slideDuplicateActiveClass: 'swiper-slide-duplicate-active', + slideVisibleClass: 'swiper-slide-visible', + slideDuplicateClass: 'swiper-slide-duplicate', + slideNextClass: 'swiper-slide-next', + slideDuplicateNextClass: 'swiper-slide-duplicate-next', + slidePrevClass: 'swiper-slide-prev', + slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', + wrapperClass: 'swiper-wrapper', + // Callbacks + runCallbacksOnInit: true, + // Internals + _emitClasses: false +}; + +function moduleExtendParams(params, allModulesParams) { + return function extendParams(obj = {}) { + const moduleParamName = Object.keys(obj)[0]; + const moduleParams = obj[moduleParamName]; + + if (typeof moduleParams !== 'object' || moduleParams === null) { + extend(allModulesParams, obj); + return; + } + + if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) { + params[moduleParamName] = { + auto: true + }; + } + + if (!(moduleParamName in params && 'enabled' in moduleParams)) { + extend(allModulesParams, obj); + return; + } + + if (params[moduleParamName] === true) { + params[moduleParamName] = { + enabled: true + }; + } + + if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) { + params[moduleParamName].enabled = true; + } + + if (!params[moduleParamName]) params[moduleParamName] = { + enabled: false + }; + extend(allModulesParams, obj); + }; +} + +/* eslint no-param-reassign: "off" */ +const prototypes = { + eventsEmitter, + update, + translate, + transition, + slide, + loop, + grabCursor, + events: events$1, + breakpoints, + checkOverflow: checkOverflow$1, + classes, + images +}; +const extendedDefaults = {}; + +class Swiper { + constructor(...args) { + let el; + let params; + + if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') { + params = args[0]; + } else { + [el, params] = args; + } + + if (!params) params = {}; + params = extend({}, params); + if (el && !params.el) params.el = el; + + if (params.el && $(params.el).length > 1) { + const swipers = []; + $(params.el).each(containerEl => { + const newParams = extend({}, params, { + el: containerEl + }); + swipers.push(new Swiper(newParams)); + }); + return swipers; + } // Swiper Instance + + + const swiper = this; + swiper.__swiper__ = true; + swiper.support = getSupport(); + swiper.device = getDevice({ + userAgent: params.userAgent + }); + swiper.browser = getBrowser(); + swiper.eventsListeners = {}; + swiper.eventsAnyListeners = []; + swiper.modules = [...swiper.__modules__]; + + if (params.modules && Array.isArray(params.modules)) { + swiper.modules.push(...params.modules); + } + + const allModulesParams = {}; + swiper.modules.forEach(mod => { + mod({ + swiper, + extendParams: moduleExtendParams(params, allModulesParams), + on: swiper.on.bind(swiper), + once: swiper.once.bind(swiper), + off: swiper.off.bind(swiper), + emit: swiper.emit.bind(swiper) + }); + }); // Extend defaults with modules params + + const swiperParams = extend({}, defaults, allModulesParams); // Extend defaults with passed params + + swiper.params = extend({}, swiperParams, extendedDefaults, params); + swiper.originalParams = extend({}, swiper.params); + swiper.passedParams = extend({}, params); // add event listeners + + if (swiper.params && swiper.params.on) { + Object.keys(swiper.params.on).forEach(eventName => { + swiper.on(eventName, swiper.params.on[eventName]); + }); + } + + if (swiper.params && swiper.params.onAny) { + swiper.onAny(swiper.params.onAny); + } // Save Dom lib + + + swiper.$ = $; // Extend Swiper + + Object.assign(swiper, { + enabled: swiper.params.enabled, + el, + // Classes + classNames: [], + // Slides + slides: $(), + slidesGrid: [], + snapGrid: [], + slidesSizesGrid: [], + + // isDirection + isHorizontal() { + return swiper.params.direction === 'horizontal'; + }, + + isVertical() { + return swiper.params.direction === 'vertical'; + }, + + // Indexes + activeIndex: 0, + realIndex: 0, + // + isBeginning: true, + isEnd: false, + // Props + translate: 0, + previousTranslate: 0, + progress: 0, + velocity: 0, + animating: false, + // Locks + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + // Touch Events + touchEvents: function touchEvents() { + const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel']; + const desktop = ['pointerdown', 'pointermove', 'pointerup']; + swiper.touchEventsTouch = { + start: touch[0], + move: touch[1], + end: touch[2], + cancel: touch[3] + }; + swiper.touchEventsDesktop = { + start: desktop[0], + move: desktop[1], + end: desktop[2] + }; + return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop; + }(), + touchEventsData: { + isTouched: undefined, + isMoved: undefined, + allowTouchCallbacks: undefined, + touchStartTime: undefined, + isScrolling: undefined, + currentTranslate: undefined, + startTranslate: undefined, + allowThresholdMove: undefined, + // Form elements to match + focusableElements: swiper.params.focusableElements, + // Last click time + lastClickTime: now(), + clickTimeout: undefined, + // Velocities + velocities: [], + allowMomentumBounce: undefined, + isTouchEvent: undefined, + startMoving: undefined + }, + // Clicks + allowClick: true, + // Touches + allowTouchMove: swiper.params.allowTouchMove, + touches: { + startX: 0, + startY: 0, + currentX: 0, + currentY: 0, + diff: 0 + }, + // Images + imagesToLoad: [], + imagesLoaded: 0 + }); + swiper.emit('_swiper'); // Init + + if (swiper.params.init) { + swiper.init(); + } // Return app instance + + + return swiper; + } + + enable() { + const swiper = this; + if (swiper.enabled) return; + swiper.enabled = true; + + if (swiper.params.grabCursor) { + swiper.setGrabCursor(); + } + + swiper.emit('enable'); + } + + disable() { + const swiper = this; + if (!swiper.enabled) return; + swiper.enabled = false; + + if (swiper.params.grabCursor) { + swiper.unsetGrabCursor(); + } + + swiper.emit('disable'); + } + + setProgress(progress, speed) { + const swiper = this; + progress = Math.min(Math.max(progress, 0), 1); + const min = swiper.minTranslate(); + const max = swiper.maxTranslate(); + const current = (max - min) * progress + min; + swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + emitContainerClasses() { + const swiper = this; + if (!swiper.params._emitClasses || !swiper.el) return; + const cls = swiper.el.className.split(' ').filter(className => { + return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0; + }); + swiper.emit('_containerClasses', cls.join(' ')); + } + + getSlideClasses(slideEl) { + const swiper = this; + return slideEl.className.split(' ').filter(className => { + return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0; + }).join(' '); + } + + emitSlidesClasses() { + const swiper = this; + if (!swiper.params._emitClasses || !swiper.el) return; + const updates = []; + swiper.slides.each(slideEl => { + const classNames = swiper.getSlideClasses(slideEl); + updates.push({ + slideEl, + classNames + }); + swiper.emit('_slideClass', slideEl, classNames); + }); + swiper.emit('_slideClasses', updates); + } + + slidesPerViewDynamic(view = 'current', exact = false) { + const swiper = this; + const { + params, + slides, + slidesGrid, + slidesSizesGrid, + size: swiperSize, + activeIndex + } = swiper; + let spv = 1; + + if (params.centeredSlides) { + let slideSize = slides[activeIndex].swiperSlideSize; + let breakLoop; + + for (let i = activeIndex + 1; i < slides.length; i += 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + + for (let i = activeIndex - 1; i >= 0; i -= 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + } else { + // eslint-disable-next-line + if (view === 'current') { + for (let i = activeIndex + 1; i < slides.length; i += 1) { + const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize; + + if (slideInView) { + spv += 1; + } + } + } else { + // previous + for (let i = activeIndex - 1; i >= 0; i -= 1) { + const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize; + + if (slideInView) { + spv += 1; + } + } + } + } + + return spv; + } + + update() { + const swiper = this; + if (!swiper || swiper.destroyed) return; + const { + snapGrid, + params + } = swiper; // Breakpoints + + if (params.breakpoints) { + swiper.setBreakpoint(); + } + + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + function setTranslate() { + const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; + const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + let translated; + + if (swiper.params.freeMode && swiper.params.freeMode.enabled) { + setTranslate(); + + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { + translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + translated = swiper.slideTo(swiper.activeIndex, 0, false, true); + } + + if (!translated) { + setTranslate(); + } + } + + if (params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + + swiper.emit('update'); + } + + changeDirection(newDirection, needUpdate = true) { + const swiper = this; + const currentDirection = swiper.params.direction; + + if (!newDirection) { + // eslint-disable-next-line + newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal'; + } + + if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') { + return swiper; + } + + swiper.$el.removeClass(`${swiper.params.containerModifierClass}${currentDirection}`).addClass(`${swiper.params.containerModifierClass}${newDirection}`); + swiper.emitContainerClasses(); + swiper.params.direction = newDirection; + swiper.slides.each(slideEl => { + if (newDirection === 'vertical') { + slideEl.style.width = ''; + } else { + slideEl.style.height = ''; + } + }); + swiper.emit('changeDirection'); + if (needUpdate) swiper.update(); + return swiper; + } + + mount(el) { + const swiper = this; + if (swiper.mounted) return true; // Find el + + const $el = $(el || swiper.params.el); + el = $el[0]; + + if (!el) { + return false; + } + + el.swiper = swiper; + + const getWrapperSelector = () => { + return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`; + }; + + const getWrapper = () => { + if (el && el.shadowRoot && el.shadowRoot.querySelector) { + const res = $(el.shadowRoot.querySelector(getWrapperSelector())); // Children needs to return slot items + + res.children = options => $el.children(options); + + return res; + } + + return $el.children(getWrapperSelector()); + }; // Find Wrapper + + + let $wrapperEl = getWrapper(); + + if ($wrapperEl.length === 0 && swiper.params.createElements) { + const document = getDocument(); + const wrapper = document.createElement('div'); + $wrapperEl = $(wrapper); + wrapper.className = swiper.params.wrapperClass; + $el.append(wrapper); + $el.children(`.${swiper.params.slideClass}`).each(slideEl => { + $wrapperEl.append(slideEl); + }); + } + + Object.assign(swiper, { + $el, + el, + $wrapperEl, + wrapperEl: $wrapperEl[0], + mounted: true, + // RTL + rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl', + rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), + wrongRTL: $wrapperEl.css('display') === '-webkit-box' + }); + return true; + } + + init(el) { + const swiper = this; + if (swiper.initialized) return swiper; + const mounted = swiper.mount(el); + if (mounted === false) return swiper; + swiper.emit('beforeInit'); // Set breakpoint + + if (swiper.params.breakpoints) { + swiper.setBreakpoint(); + } // Add Classes + + + swiper.addClasses(); // Create loop + + if (swiper.params.loop) { + swiper.loopCreate(); + } // Update size + + + swiper.updateSize(); // Update slides + + swiper.updateSlides(); + + if (swiper.params.watchOverflow) { + swiper.checkOverflow(); + } // Set Grab Cursor + + + if (swiper.params.grabCursor && swiper.enabled) { + swiper.setGrabCursor(); + } + + if (swiper.params.preloadImages) { + swiper.preloadImages(); + } // Slide To Initial Slide + + + if (swiper.params.loop) { + swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit, false, true); + } else { + swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true); + } // Attach events + + + swiper.attachEvents(); // Init Flag + + swiper.initialized = true; // Emit + + swiper.emit('init'); + swiper.emit('afterInit'); + return swiper; + } + + destroy(deleteInstance = true, cleanStyles = true) { + const swiper = this; + const { + params, + $el, + $wrapperEl, + slides + } = swiper; + + if (typeof swiper.params === 'undefined' || swiper.destroyed) { + return null; + } + + swiper.emit('beforeDestroy'); // Init Flag + + swiper.initialized = false; // Detach events + + swiper.detachEvents(); // Destroy loop + + if (params.loop) { + swiper.loopDestroy(); + } // Cleanup styles + + + if (cleanStyles) { + swiper.removeClasses(); + $el.removeAttr('style'); + $wrapperEl.removeAttr('style'); + + if (slides && slides.length) { + slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index'); + } + } + + swiper.emit('destroy'); // Detach emitter events + + Object.keys(swiper.eventsListeners).forEach(eventName => { + swiper.off(eventName); + }); + + if (deleteInstance !== false) { + swiper.$el[0].swiper = null; + deleteProps(swiper); + } + + swiper.destroyed = true; + return null; + } + + static extendDefaults(newDefaults) { + extend(extendedDefaults, newDefaults); + } + + static get extendedDefaults() { + return extendedDefaults; + } + + static get defaults() { + return defaults; + } + + static installModule(mod) { + if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = []; + const modules = Swiper.prototype.__modules__; + + if (typeof mod === 'function' && modules.indexOf(mod) < 0) { + modules.push(mod); + } + } + + static use(module) { + if (Array.isArray(module)) { + module.forEach(m => Swiper.installModule(m)); + return Swiper; + } + + Swiper.installModule(module); + return Swiper; + } + +} + +Object.keys(prototypes).forEach(prototypeGroup => { + Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => { + Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; + }); +}); +Swiper.use([Resize, Observer]); + +function Virtual({ + swiper, + extendParams, + on +}) { + extendParams({ + virtual: { + enabled: false, + slides: [], + cache: true, + renderSlide: null, + renderExternal: null, + renderExternalUpdate: true, + addSlidesBefore: 0, + addSlidesAfter: 0 + } + }); + let cssModeTimeout; + swiper.virtual = { + cache: {}, + from: undefined, + to: undefined, + slides: [], + offset: 0, + slidesGrid: [] + }; + + function renderSlide(slide, index) { + const params = swiper.params.virtual; + + if (params.cache && swiper.virtual.cache[index]) { + return swiper.virtual.cache[index]; + } + + const $slideEl = params.renderSlide ? $(params.renderSlide.call(swiper, slide, index)) : $(`
${slide}
`); + if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index); + if (params.cache) swiper.virtual.cache[index] = $slideEl; + return $slideEl; + } + + function update(force) { + const { + slidesPerView, + slidesPerGroup, + centeredSlides + } = swiper.params; + const { + addSlidesBefore, + addSlidesAfter + } = swiper.params.virtual; + const { + from: previousFrom, + to: previousTo, + slides, + slidesGrid: previousSlidesGrid, + offset: previousOffset + } = swiper.virtual; + + if (!swiper.params.cssMode) { + swiper.updateActiveIndex(); + } + + const activeIndex = swiper.activeIndex || 0; + let offsetProp; + if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top'; + let slidesAfter; + let slidesBefore; + + if (centeredSlides) { + slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter; + slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore; + } else { + slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter; + slidesBefore = slidesPerGroup + addSlidesBefore; + } + + const from = Math.max((activeIndex || 0) - slidesBefore, 0); + const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1); + const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0); + Object.assign(swiper.virtual, { + from, + to, + offset, + slidesGrid: swiper.slidesGrid + }); + + function onRendered() { + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + if (swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + } + + if (previousFrom === from && previousTo === to && !force) { + if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) { + swiper.slides.css(offsetProp, `${offset}px`); + } + + swiper.updateProgress(); + return; + } + + if (swiper.params.virtual.renderExternal) { + swiper.params.virtual.renderExternal.call(swiper, { + offset, + from, + to, + slides: function getSlides() { + const slidesToRender = []; + + for (let i = from; i <= to; i += 1) { + slidesToRender.push(slides[i]); + } + + return slidesToRender; + }() + }); + + if (swiper.params.virtual.renderExternalUpdate) { + onRendered(); + } + + return; + } + + const prependIndexes = []; + const appendIndexes = []; + + if (force) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove(); + } else { + for (let i = previousFrom; i <= previousTo; i += 1) { + if (i < from || i > to) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}[data-swiper-slide-index="${i}"]`).remove(); + } + } + } + + for (let i = 0; i < slides.length; i += 1) { + if (i >= from && i <= to) { + if (typeof previousTo === 'undefined' || force) { + appendIndexes.push(i); + } else { + if (i > previousTo) appendIndexes.push(i); + if (i < previousFrom) prependIndexes.push(i); + } + } + } + + appendIndexes.forEach(index => { + swiper.$wrapperEl.append(renderSlide(slides[index], index)); + }); + prependIndexes.sort((a, b) => b - a).forEach(index => { + swiper.$wrapperEl.prepend(renderSlide(slides[index], index)); + }); + swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`); + onRendered(); + } + + function appendSlide(slides) { + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.push(slides[i]); + } + } else { + swiper.virtual.slides.push(slides); + } + + update(true); + } + + function prependSlide(slides) { + const activeIndex = swiper.activeIndex; + let newActiveIndex = activeIndex + 1; + let numberOfNewSlides = 1; + + if (Array.isArray(slides)) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.unshift(slides[i]); + } + + newActiveIndex = activeIndex + slides.length; + numberOfNewSlides = slides.length; + } else { + swiper.virtual.slides.unshift(slides); + } + + if (swiper.params.virtual.cache) { + const cache = swiper.virtual.cache; + const newCache = {}; + Object.keys(cache).forEach(cachedIndex => { + const $cachedEl = cache[cachedIndex]; + const cachedElIndex = $cachedEl.attr('data-swiper-slide-index'); + + if (cachedElIndex) { + $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides); + } + + newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl; + }); + swiper.virtual.cache = newCache; + } + + update(true); + swiper.slideTo(newActiveIndex, 0); + } + + function removeSlide(slidesIndexes) { + if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return; + let activeIndex = swiper.activeIndex; + + if (Array.isArray(slidesIndexes)) { + for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) { + swiper.virtual.slides.splice(slidesIndexes[i], 1); + + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes[i]]; + } + + if (slidesIndexes[i] < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + } else { + swiper.virtual.slides.splice(slidesIndexes, 1); + + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes]; + } + + if (slidesIndexes < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + + update(true); + swiper.slideTo(activeIndex, 0); + } + + function removeAllSlides() { + swiper.virtual.slides = []; + + if (swiper.params.virtual.cache) { + swiper.virtual.cache = {}; + } + + update(true); + swiper.slideTo(0, 0); + } + + on('beforeInit', () => { + if (!swiper.params.virtual.enabled) return; + swiper.virtual.slides = swiper.params.virtual.slides; + swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`); + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + + if (!swiper.params.initialSlide) { + update(); + } + }); + on('setTranslate', () => { + if (!swiper.params.virtual.enabled) return; + + if (swiper.params.cssMode && !swiper._immediateVirtual) { + clearTimeout(cssModeTimeout); + cssModeTimeout = setTimeout(() => { + update(); + }, 100); + } else { + update(); + } + }); + on('init update resize', () => { + if (!swiper.params.virtual.enabled) return; + + if (swiper.params.cssMode) { + setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`); + } + }); + Object.assign(swiper.virtual, { + appendSlide, + prependSlide, + removeSlide, + removeAllSlides, + update + }); +} + +/* eslint-disable consistent-return */ +function Keyboard({ + swiper, + extendParams, + on, + emit +}) { + const document = getDocument(); + const window = getWindow(); + swiper.keyboard = { + enabled: false + }; + extendParams({ + keyboard: { + enabled: false, + onlyInViewport: true, + pageUpDown: true + } + }); + + function handle(event) { + if (!swiper.enabled) return; + const { + rtlTranslate: rtl + } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; // jquery fix + + const kc = e.keyCode || e.charCode; + const pageUpDown = swiper.params.keyboard.pageUpDown; + const isPageUp = pageUpDown && kc === 33; + const isPageDown = pageUpDown && kc === 34; + const isArrowLeft = kc === 37; + const isArrowRight = kc === 39; + const isArrowUp = kc === 38; + const isArrowDown = kc === 40; // Directions locks + + if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) { + return false; + } + + if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) { + return false; + } + + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { + return undefined; + } + + if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) { + return undefined; + } + + if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) { + let inView = false; // Check that swiper should be inside of visible area of window + + if (swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 && swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0) { + return undefined; + } + + const $el = swiper.$el; + const swiperWidth = $el[0].clientWidth; + const swiperHeight = $el[0].clientHeight; + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + const swiperOffset = swiper.$el.offset(); + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]]; + + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + + if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) { + if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line + + inView = true; + } + } + + if (!inView) return undefined; + } + + if (swiper.isHorizontal()) { + if (isPageUp || isPageDown || isArrowLeft || isArrowRight) { + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + } + + if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext(); + if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev(); + } else { + if (isPageUp || isPageDown || isArrowUp || isArrowDown) { + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + } + + if (isPageDown || isArrowDown) swiper.slideNext(); + if (isPageUp || isArrowUp) swiper.slidePrev(); + } + + emit('keyPress', kc); + return undefined; + } + + function enable() { + if (swiper.keyboard.enabled) return; + $(document).on('keydown', handle); + swiper.keyboard.enabled = true; + } + + function disable() { + if (!swiper.keyboard.enabled) return; + $(document).off('keydown', handle); + swiper.keyboard.enabled = false; + } + + on('init', () => { + if (swiper.params.keyboard.enabled) { + enable(); + } + }); + on('destroy', () => { + if (swiper.keyboard.enabled) { + disable(); + } + }); + Object.assign(swiper.keyboard, { + enable, + disable + }); +} + +/* eslint-disable consistent-return */ +function Mousewheel({ + swiper, + extendParams, + on, + emit +}) { + const window = getWindow(); + extendParams({ + mousewheel: { + enabled: false, + releaseOnEdges: false, + invert: false, + forceToAxis: false, + sensitivity: 1, + eventsTarget: 'container', + thresholdDelta: null, + thresholdTime: null + } + }); + swiper.mousewheel = { + enabled: false + }; + let timeout; + let lastScrollTime = now(); + let lastEventBeforeSnap; + const recentWheelEvents = []; + + function normalize(e) { + // Reasonable defaults + const PIXEL_STEP = 10; + const LINE_HEIGHT = 40; + const PAGE_HEIGHT = 800; + let sX = 0; + let sY = 0; // spinX, spinY + + let pX = 0; + let pY = 0; // pixelX, pixelY + // Legacy + + if ('detail' in e) { + sY = e.detail; + } + + if ('wheelDelta' in e) { + sY = -e.wheelDelta / 120; + } + + if ('wheelDeltaY' in e) { + sY = -e.wheelDeltaY / 120; + } + + if ('wheelDeltaX' in e) { + sX = -e.wheelDeltaX / 120; + } // side scrolling on FF with DOMMouseScroll + + + if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) { + sX = sY; + sY = 0; + } + + pX = sX * PIXEL_STEP; + pY = sY * PIXEL_STEP; + + if ('deltaY' in e) { + pY = e.deltaY; + } + + if ('deltaX' in e) { + pX = e.deltaX; + } + + if (e.shiftKey && !pX) { + // if user scrolls with shift he wants horizontal scroll + pX = pY; + pY = 0; + } + + if ((pX || pY) && e.deltaMode) { + if (e.deltaMode === 1) { + // delta in LINE units + pX *= LINE_HEIGHT; + pY *= LINE_HEIGHT; + } else { + // delta in PAGE units + pX *= PAGE_HEIGHT; + pY *= PAGE_HEIGHT; + } + } // Fall-back if spin cannot be determined + + + if (pX && !sX) { + sX = pX < 1 ? -1 : 1; + } + + if (pY && !sY) { + sY = pY < 1 ? -1 : 1; + } + + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY + }; + } + + function handleMouseEnter() { + if (!swiper.enabled) return; + swiper.mouseEntered = true; + } + + function handleMouseLeave() { + if (!swiper.enabled) return; + swiper.mouseEntered = false; + } + + function animateSlider(newEvent) { + if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) { + // Prevent if delta of wheel scroll delta is below configured threshold + return false; + } + + if (swiper.params.mousewheel.thresholdTime && now() - lastScrollTime < swiper.params.mousewheel.thresholdTime) { + // Prevent if time between scrolls is below configured threshold + return false; + } // If the movement is NOT big enough and + // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider): + // Don't go any further (avoid insignificant scroll movement). + + + if (newEvent.delta >= 6 && now() - lastScrollTime < 60) { + // Return false as a default + return true; + } // If user is scrolling towards the end: + // If the slider hasn't hit the latest slide or + // if the slider is a loop and + // if the slider isn't moving right now: + // Go to next slide and + // emit a scroll event. + // Else (the user is scrolling towards the beginning) and + // if the slider hasn't hit the first slide or + // if the slider is a loop and + // if the slider isn't moving right now: + // Go to prev slide and + // emit a scroll event. + + + if (newEvent.direction < 0) { + if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) { + swiper.slideNext(); + emit('scroll', newEvent.raw); + } + } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) { + swiper.slidePrev(); + emit('scroll', newEvent.raw); + } // If you got here is because an animation has been triggered so store the current time + + + lastScrollTime = new window.Date().getTime(); // Return false as a default + + return false; + } + + function releaseScroll(newEvent) { + const params = swiper.params.mousewheel; + + if (newEvent.direction < 0) { + if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) { + // Return true to animate scroll on edges + return true; + } + } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) { + // Return true to animate scroll on edges + return true; + } + + return false; + } + + function handle(event) { + let e = event; + let disableParentSwiper = true; + if (!swiper.enabled) return; + const params = swiper.params.mousewheel; + + if (swiper.params.cssMode) { + e.preventDefault(); + } + + let target = swiper.$el; + + if (swiper.params.mousewheel.eventsTarget !== 'container') { + target = $(swiper.params.mousewheel.eventsTarget); + } + + if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) return true; + if (e.originalEvent) e = e.originalEvent; // jquery fix + + let delta = 0; + const rtlFactor = swiper.rtlTranslate ? -1 : 1; + const data = normalize(e); + + if (params.forceToAxis) { + if (swiper.isHorizontal()) { + if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true; + } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true; + } else { + delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY; + } + + if (delta === 0) return true; + if (params.invert) delta = -delta; // Get the scroll positions + + let positions = swiper.getTranslate() + delta * params.sensitivity; + if (positions >= swiper.minTranslate()) positions = swiper.minTranslate(); + if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); // When loop is true: + // the disableParentSwiper will be true. + // When loop is false: + // if the scroll positions is not on edge, + // then the disableParentSwiper will be true. + // if the scroll on edge positions, + // then the disableParentSwiper will be false. + + disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate()); + if (disableParentSwiper && swiper.params.nested) e.stopPropagation(); + + if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) { + // Register the new event in a variable which stores the relevant data + const newEvent = { + time: now(), + delta: Math.abs(delta), + direction: Math.sign(delta), + raw: event + }; // Keep the most recent events + + if (recentWheelEvents.length >= 2) { + recentWheelEvents.shift(); // only store the last N events + } + + const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined; + recentWheelEvents.push(newEvent); // If there is at least one previous recorded event: + // If direction has changed or + // if the scroll is quicker than the previous one: + // Animate the slider. + // Else (this is the first time the wheel is moved): + // Animate the slider. + + if (prevEvent) { + if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) { + animateSlider(newEvent); + } + } else { + animateSlider(newEvent); + } // If it's time to release the scroll: + // Return now so you don't hit the preventDefault. + + + if (releaseScroll(newEvent)) { + return true; + } + } else { + // Freemode or scrollContainer: + // If we recently snapped after a momentum scroll, then ignore wheel events + // to give time for the deceleration to finish. Stop ignoring after 500 msecs + // or if it's a new scroll (larger delta or inverse sign as last event before + // an end-of-momentum snap). + const newEvent = { + time: now(), + delta: Math.abs(delta), + direction: Math.sign(delta) + }; + const ignoreWheelEvents = lastEventBeforeSnap && newEvent.time < lastEventBeforeSnap.time + 500 && newEvent.delta <= lastEventBeforeSnap.delta && newEvent.direction === lastEventBeforeSnap.direction; + + if (!ignoreWheelEvents) { + lastEventBeforeSnap = undefined; + + if (swiper.params.loop) { + swiper.loopFix(); + } + + let position = swiper.getTranslate() + delta * params.sensitivity; + const wasBeginning = swiper.isBeginning; + const wasEnd = swiper.isEnd; + if (position >= swiper.minTranslate()) position = swiper.minTranslate(); + if (position <= swiper.maxTranslate()) position = swiper.maxTranslate(); + swiper.setTransition(0); + swiper.setTranslate(position); + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) { + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeMode.sticky) { + // When wheel scrolling starts with sticky (aka snap) enabled, then detect + // the end of a momentum scroll by storing recent (N=15?) wheel events. + // 1. do all N events have decreasing or same (absolute value) delta? + // 2. did all N events arrive in the last M (M=500?) msecs? + // 3. does the earliest event have an (absolute value) delta that's + // at least P (P=1?) larger than the most recent event's delta? + // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels? + // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration. + // Snap immediately and ignore remaining wheel events in this scroll. + // See comment above for "remaining wheel events in this scroll" determination. + // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event. + clearTimeout(timeout); + timeout = undefined; + + if (recentWheelEvents.length >= 15) { + recentWheelEvents.shift(); // only store the last N events + } + + const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined; + const firstEvent = recentWheelEvents[0]; + recentWheelEvents.push(newEvent); + + if (prevEvent && (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)) { + // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log. + recentWheelEvents.splice(0); + } else if (recentWheelEvents.length >= 15 && newEvent.time - firstEvent.time < 500 && firstEvent.delta - newEvent.delta >= 1 && newEvent.delta <= 6) { + // We're at the end of the deceleration of a momentum scroll, so there's no need + // to wait for more events. Snap ASAP on the next tick. + // Also, because there's some remaining momentum we'll bias the snap in the + // direction of the ongoing scroll because it's better UX for the scroll to snap + // in the same direction as the scroll instead of reversing to snap. Therefore, + // if it's already scrolled more than 20% in the current direction, keep going. + const snapToThreshold = delta > 0 ? 0.8 : 0.2; + lastEventBeforeSnap = newEvent; + recentWheelEvents.splice(0); + timeout = nextTick(() => { + swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold); + }, 0); // no delay; move on next tick + } + + if (!timeout) { + // if we get here, then we haven't detected the end of a momentum scroll, so + // we'll consider a scroll "complete" when there haven't been any wheel events + // for 500ms. + timeout = nextTick(() => { + const snapToThreshold = 0.5; + lastEventBeforeSnap = newEvent; + recentWheelEvents.splice(0); + swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold); + }, 500); + } + } // Emit event + + + if (!ignoreWheelEvents) emit('scroll', e); // Stop autoplay + + if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); // Return page scroll on edge positions + + if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true; + } + } + + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + return false; + } + + function events(method) { + let target = swiper.$el; + + if (swiper.params.mousewheel.eventsTarget !== 'container') { + target = $(swiper.params.mousewheel.eventsTarget); + } + + target[method]('mouseenter', handleMouseEnter); + target[method]('mouseleave', handleMouseLeave); + target[method]('wheel', handle); + } + + function enable() { + if (swiper.params.cssMode) { + swiper.wrapperEl.removeEventListener('wheel', handle); + return true; + } + + if (swiper.mousewheel.enabled) return false; + events('on'); + swiper.mousewheel.enabled = true; + return true; + } + + function disable() { + if (swiper.params.cssMode) { + swiper.wrapperEl.addEventListener(event, handle); + return true; + } + + if (!swiper.mousewheel.enabled) return false; + events('off'); + swiper.mousewheel.enabled = false; + return true; + } + + on('init', () => { + if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) { + disable(); + } + + if (swiper.params.mousewheel.enabled) enable(); + }); + on('destroy', () => { + if (swiper.params.cssMode) { + enable(); + } + + if (swiper.mousewheel.enabled) disable(); + }); + Object.assign(swiper.mousewheel, { + enable, + disable + }); +} + +function createElementIfNotDefined(swiper, originalParams, params, checkProps) { + const document = getDocument(); + + if (swiper.params.createElements) { + Object.keys(checkProps).forEach(key => { + if (!params[key] && params.auto === true) { + let element = swiper.$el.children(`.${checkProps[key]}`)[0]; + + if (!element) { + element = document.createElement('div'); + element.className = checkProps[key]; + swiper.$el.append(element); + } + + params[key] = element; + originalParams[key] = element; + } + }); + } + + return params; +} + +function Navigation({ + swiper, + extendParams, + on, + emit +}) { + extendParams({ + navigation: { + nextEl: null, + prevEl: null, + hideOnClick: false, + disabledClass: 'swiper-button-disabled', + hiddenClass: 'swiper-button-hidden', + lockClass: 'swiper-button-lock' + } + }); + swiper.navigation = { + nextEl: null, + $nextEl: null, + prevEl: null, + $prevEl: null + }; + + function getEl(el) { + let $el; + + if (el) { + $el = $(el); + + if (swiper.params.uniqueNavElements && typeof el === 'string' && $el.length > 1 && swiper.$el.find(el).length === 1) { + $el = swiper.$el.find(el); + } + } + + return $el; + } + + function toggleEl($el, disabled) { + const params = swiper.params.navigation; + + if ($el && $el.length > 0) { + $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass); + if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled; + + if (swiper.params.watchOverflow && swiper.enabled) { + $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + } + } + + function update() { + // Update Navigation Buttons + if (swiper.params.loop) return; + const { + $nextEl, + $prevEl + } = swiper.navigation; + toggleEl($prevEl, swiper.isBeginning); + toggleEl($nextEl, swiper.isEnd); + } + + function onPrevClick(e) { + e.preventDefault(); + if (swiper.isBeginning && !swiper.params.loop) return; + swiper.slidePrev(); + } + + function onNextClick(e) { + e.preventDefault(); + if (swiper.isEnd && !swiper.params.loop) return; + swiper.slideNext(); + } + + function init() { + const params = swiper.params.navigation; + swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, { + nextEl: 'swiper-button-next', + prevEl: 'swiper-button-prev' + }); + if (!(params.nextEl || params.prevEl)) return; + const $nextEl = getEl(params.nextEl); + const $prevEl = getEl(params.prevEl); + + if ($nextEl && $nextEl.length > 0) { + $nextEl.on('click', onNextClick); + } + + if ($prevEl && $prevEl.length > 0) { + $prevEl.on('click', onPrevClick); + } + + Object.assign(swiper.navigation, { + $nextEl, + nextEl: $nextEl && $nextEl[0], + $prevEl, + prevEl: $prevEl && $prevEl[0] + }); + + if (!swiper.enabled) { + if ($nextEl) $nextEl.addClass(params.lockClass); + if ($prevEl) $prevEl.addClass(params.lockClass); + } + } + + function destroy() { + const { + $nextEl, + $prevEl + } = swiper.navigation; + + if ($nextEl && $nextEl.length) { + $nextEl.off('click', onNextClick); + $nextEl.removeClass(swiper.params.navigation.disabledClass); + } + + if ($prevEl && $prevEl.length) { + $prevEl.off('click', onPrevClick); + $prevEl.removeClass(swiper.params.navigation.disabledClass); + } + } + + on('init', () => { + init(); + update(); + }); + on('toEdge fromEdge lock unlock', () => { + update(); + }); + on('destroy', () => { + destroy(); + }); + on('enable disable', () => { + const { + $nextEl, + $prevEl + } = swiper.navigation; + + if ($nextEl) { + $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass); + } + + if ($prevEl) { + $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass); + } + }); + on('click', (_s, e) => { + const { + $nextEl, + $prevEl + } = swiper.navigation; + const targetEl = e.target; + + if (swiper.params.navigation.hideOnClick && !$(targetEl).is($prevEl) && !$(targetEl).is($nextEl)) { + if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return; + let isHidden; + + if ($nextEl) { + isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass); + } else if ($prevEl) { + isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass); + } + + if (isHidden === true) { + emit('navigationShow'); + } else { + emit('navigationHide'); + } + + if ($nextEl) { + $nextEl.toggleClass(swiper.params.navigation.hiddenClass); + } + + if ($prevEl) { + $prevEl.toggleClass(swiper.params.navigation.hiddenClass); + } + } + }); + Object.assign(swiper.navigation, { + update, + init, + destroy + }); +} + +function classesToSelector(classes = '') { + return `.${classes.trim().replace(/([\.:!\/])/g, '\\$1') // eslint-disable-line + .replace(/ /g, '.')}`; +} + +function Pagination({ + swiper, + extendParams, + on, + emit +}) { + const pfx = 'swiper-pagination'; + extendParams({ + pagination: { + el: null, + bulletElement: 'span', + clickable: false, + hideOnClick: false, + renderBullet: null, + renderProgressbar: null, + renderFraction: null, + renderCustom: null, + progressbarOpposite: false, + type: 'bullets', + // 'bullets' or 'progressbar' or 'fraction' or 'custom' + dynamicBullets: false, + dynamicMainBullets: 1, + formatFractionCurrent: number => number, + formatFractionTotal: number => number, + bulletClass: `${pfx}-bullet`, + bulletActiveClass: `${pfx}-bullet-active`, + modifierClass: `${pfx}-`, + currentClass: `${pfx}-current`, + totalClass: `${pfx}-total`, + hiddenClass: `${pfx}-hidden`, + progressbarFillClass: `${pfx}-progressbar-fill`, + progressbarOppositeClass: `${pfx}-progressbar-opposite`, + clickableClass: `${pfx}-clickable`, + lockClass: `${pfx}-lock`, + horizontalClass: `${pfx}-horizontal`, + verticalClass: `${pfx}-vertical` + } + }); + swiper.pagination = { + el: null, + $el: null, + bullets: [] + }; + let bulletSize; + let dynamicBulletIndex = 0; + + function isPaginationDisabled() { + return !swiper.params.pagination.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0; + } + + function setSideBullets($bulletEl, position) { + const { + bulletActiveClass + } = swiper.params.pagination; + $bulletEl[position]().addClass(`${bulletActiveClass}-${position}`)[position]().addClass(`${bulletActiveClass}-${position}-${position}`); + } + + function update() { + // Render || Update Pagination bullets/items + const rtl = swiper.rtl; + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + const $el = swiper.pagination.$el; // Current/Total + + let current; + const total = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + + if (swiper.params.loop) { + current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup); + + if (current > slidesLength - 1 - swiper.loopedSlides * 2) { + current -= slidesLength - swiper.loopedSlides * 2; + } + + if (current > total - 1) current -= total; + if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current; + } else if (typeof swiper.snapIndex !== 'undefined') { + current = swiper.snapIndex; + } else { + current = swiper.activeIndex || 0; + } // Types + + + if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) { + const bullets = swiper.pagination.bullets; + let firstIndex; + let lastIndex; + let midIndex; + + if (params.dynamicBullets) { + bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true); + $el.css(swiper.isHorizontal() ? 'width' : 'height', `${bulletSize * (params.dynamicMainBullets + 4)}px`); + + if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) { + dynamicBulletIndex += current - swiper.previousIndex; + + if (dynamicBulletIndex > params.dynamicMainBullets - 1) { + dynamicBulletIndex = params.dynamicMainBullets - 1; + } else if (dynamicBulletIndex < 0) { + dynamicBulletIndex = 0; + } + } + + firstIndex = current - dynamicBulletIndex; + lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1); + midIndex = (lastIndex + firstIndex) / 2; + } + + bullets.removeClass(['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`).join(' ')); + + if ($el.length > 1) { + bullets.each(bullet => { + const $bullet = $(bullet); + const bulletIndex = $bullet.index(); + + if (bulletIndex === current) { + $bullet.addClass(params.bulletActiveClass); + } + + if (params.dynamicBullets) { + if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { + $bullet.addClass(`${params.bulletActiveClass}-main`); + } + + if (bulletIndex === firstIndex) { + setSideBullets($bullet, 'prev'); + } + + if (bulletIndex === lastIndex) { + setSideBullets($bullet, 'next'); + } + } + }); + } else { + const $bullet = bullets.eq(current); + const bulletIndex = $bullet.index(); + $bullet.addClass(params.bulletActiveClass); + + if (params.dynamicBullets) { + const $firstDisplayedBullet = bullets.eq(firstIndex); + const $lastDisplayedBullet = bullets.eq(lastIndex); + + for (let i = firstIndex; i <= lastIndex; i += 1) { + bullets.eq(i).addClass(`${params.bulletActiveClass}-main`); + } + + if (swiper.params.loop) { + if (bulletIndex >= bullets.length - params.dynamicMainBullets) { + for (let i = params.dynamicMainBullets; i >= 0; i -= 1) { + bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`); + } + + bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(`${params.bulletActiveClass}-prev`); + } else { + setSideBullets($firstDisplayedBullet, 'prev'); + setSideBullets($lastDisplayedBullet, 'next'); + } + } else { + setSideBullets($firstDisplayedBullet, 'prev'); + setSideBullets($lastDisplayedBullet, 'next'); + } + } + } + + if (params.dynamicBullets) { + const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4); + const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize; + const offsetProp = rtl ? 'right' : 'left'; + bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`); + } + } + + if (params.type === 'fraction') { + $el.find(classesToSelector(params.currentClass)).text(params.formatFractionCurrent(current + 1)); + $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total)); + } + + if (params.type === 'progressbar') { + let progressbarDirection; + + if (params.progressbarOpposite) { + progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal'; + } else { + progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical'; + } + + const scale = (current + 1) / total; + let scaleX = 1; + let scaleY = 1; + + if (progressbarDirection === 'horizontal') { + scaleX = scale; + } else { + scaleY = scale; + } + + $el.find(classesToSelector(params.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`).transition(swiper.params.speed); + } + + if (params.type === 'custom' && params.renderCustom) { + $el.html(params.renderCustom(swiper, current + 1, total)); + emit('paginationRender', $el[0]); + } else { + emit('paginationUpdate', $el[0]); + } + + if (swiper.params.watchOverflow && swiper.enabled) { + $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + } + + function render() { + // Render Container + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + const $el = swiper.pagination.$el; + let paginationHTML = ''; + + if (params.type === 'bullets') { + let numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + + if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.loop && numberOfBullets > slidesLength) { + numberOfBullets = slidesLength; + } + + for (let i = 0; i < numberOfBullets; i += 1) { + if (params.renderBullet) { + paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass); + } else { + paginationHTML += `<${params.bulletElement} class="${params.bulletClass}">`; + } + } + + $el.html(paginationHTML); + swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass)); + } + + if (params.type === 'fraction') { + if (params.renderFraction) { + paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass); + } else { + paginationHTML = `` + ' / ' + ``; + } + + $el.html(paginationHTML); + } + + if (params.type === 'progressbar') { + if (params.renderProgressbar) { + paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass); + } else { + paginationHTML = ``; + } + + $el.html(paginationHTML); + } + + if (params.type !== 'custom') { + emit('paginationRender', swiper.pagination.$el[0]); + } + } + + function init() { + swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, { + el: 'swiper-pagination' + }); + const params = swiper.params.pagination; + if (!params.el) return; + let $el = $(params.el); + if ($el.length === 0) return; + + if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) { + $el = swiper.$el.find(params.el); // check if it belongs to another nested Swiper + + if ($el.length > 1) { + $el = $el.filter(el => { + if ($(el).parents('.swiper')[0] !== swiper.el) return false; + return true; + }); + } + } + + if (params.type === 'bullets' && params.clickable) { + $el.addClass(params.clickableClass); + } + + $el.addClass(params.modifierClass + params.type); + $el.addClass(params.modifierClass + swiper.params.direction); + + if (params.type === 'bullets' && params.dynamicBullets) { + $el.addClass(`${params.modifierClass}${params.type}-dynamic`); + dynamicBulletIndex = 0; + + if (params.dynamicMainBullets < 1) { + params.dynamicMainBullets = 1; + } + } + + if (params.type === 'progressbar' && params.progressbarOpposite) { + $el.addClass(params.progressbarOppositeClass); + } + + if (params.clickable) { + $el.on('click', classesToSelector(params.bulletClass), function onClick(e) { + e.preventDefault(); + let index = $(this).index() * swiper.params.slidesPerGroup; + if (swiper.params.loop) index += swiper.loopedSlides; + swiper.slideTo(index); + }); + } + + Object.assign(swiper.pagination, { + $el, + el: $el[0] + }); + + if (!swiper.enabled) { + $el.addClass(params.lockClass); + } + } + + function destroy() { + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const $el = swiper.pagination.$el; + $el.removeClass(params.hiddenClass); + $el.removeClass(params.modifierClass + params.type); + $el.removeClass(params.modifierClass + swiper.params.direction); + if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass) swiper.pagination.bullets.removeClass(params.bulletActiveClass); + + if (params.clickable) { + $el.off('click', classesToSelector(params.bulletClass)); + } + } + + on('init', () => { + init(); + render(); + update(); + }); + on('activeIndexChange', () => { + if (swiper.params.loop) { + update(); + } else if (typeof swiper.snapIndex === 'undefined') { + update(); + } + }); + on('snapIndexChange', () => { + if (!swiper.params.loop) { + update(); + } + }); + on('slidesLengthChange', () => { + if (swiper.params.loop) { + render(); + update(); + } + }); + on('snapGridLengthChange', () => { + if (!swiper.params.loop) { + render(); + update(); + } + }); + on('destroy', () => { + destroy(); + }); + on('enable disable', () => { + const { + $el + } = swiper.pagination; + + if ($el) { + $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass); + } + }); + on('lock unlock', () => { + update(); + }); + on('click', (_s, e) => { + const targetEl = e.target; + const { + $el + } = swiper.pagination; + + if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && $el.length > 0 && !$(targetEl).hasClass(swiper.params.pagination.bulletClass)) { + if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return; + const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass); + + if (isHidden === true) { + emit('paginationShow'); + } else { + emit('paginationHide'); + } + + $el.toggleClass(swiper.params.pagination.hiddenClass); + } + }); + Object.assign(swiper.pagination, { + render, + update, + init, + destroy + }); +} + +function Scrollbar({ + swiper, + extendParams, + on, + emit +}) { + const document = getDocument(); + let isTouched = false; + let timeout = null; + let dragTimeout = null; + let dragStartPos; + let dragSize; + let trackSize; + let divider; + extendParams({ + scrollbar: { + el: null, + dragSize: 'auto', + hide: false, + draggable: false, + snapOnRelease: true, + lockClass: 'swiper-scrollbar-lock', + dragClass: 'swiper-scrollbar-drag' + } + }); + swiper.scrollbar = { + el: null, + dragEl: null, + $el: null, + $dragEl: null + }; + + function setTranslate() { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { + scrollbar, + rtlTranslate: rtl, + progress + } = swiper; + const { + $dragEl, + $el + } = scrollbar; + const params = swiper.params.scrollbar; + let newSize = dragSize; + let newPos = (trackSize - dragSize) * progress; + + if (rtl) { + newPos = -newPos; + + if (newPos > 0) { + newSize = dragSize - newPos; + newPos = 0; + } else if (-newPos + dragSize > trackSize) { + newSize = trackSize + newPos; + } + } else if (newPos < 0) { + newSize = dragSize + newPos; + newPos = 0; + } else if (newPos + dragSize > trackSize) { + newSize = trackSize - newPos; + } + + if (swiper.isHorizontal()) { + $dragEl.transform(`translate3d(${newPos}px, 0, 0)`); + $dragEl[0].style.width = `${newSize}px`; + } else { + $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`); + $dragEl[0].style.height = `${newSize}px`; + } + + if (params.hide) { + clearTimeout(timeout); + $el[0].style.opacity = 1; + timeout = setTimeout(() => { + $el[0].style.opacity = 0; + $el.transition(400); + }, 1000); + } + } + + function setTransition(duration) { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + swiper.scrollbar.$dragEl.transition(duration); + } + + function updateSize() { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { + scrollbar + } = swiper; + const { + $dragEl, + $el + } = scrollbar; + $dragEl[0].style.width = ''; + $dragEl[0].style.height = ''; + trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight; + divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0)); + + if (swiper.params.scrollbar.dragSize === 'auto') { + dragSize = trackSize * divider; + } else { + dragSize = parseInt(swiper.params.scrollbar.dragSize, 10); + } + + if (swiper.isHorizontal()) { + $dragEl[0].style.width = `${dragSize}px`; + } else { + $dragEl[0].style.height = `${dragSize}px`; + } + + if (divider >= 1) { + $el[0].style.display = 'none'; + } else { + $el[0].style.display = ''; + } + + if (swiper.params.scrollbar.hide) { + $el[0].style.opacity = 0; + } + + if (swiper.params.watchOverflow && swiper.enabled) { + scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass); + } + } + + function getPointerPosition(e) { + if (swiper.isHorizontal()) { + return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientX : e.clientX; + } + + return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientY : e.clientY; + } + + function setDragPosition(e) { + const { + scrollbar, + rtlTranslate: rtl + } = swiper; + const { + $el + } = scrollbar; + let positionRatio; + positionRatio = (getPointerPosition(e) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize); + positionRatio = Math.max(Math.min(positionRatio, 1), 0); + + if (rtl) { + positionRatio = 1 - positionRatio; + } + + const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio; + swiper.updateProgress(position); + swiper.setTranslate(position); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + function onDragStart(e) { + const params = swiper.params.scrollbar; + const { + scrollbar, + $wrapperEl + } = swiper; + const { + $el, + $dragEl + } = scrollbar; + isTouched = true; + dragStartPos = e.target === $dragEl[0] || e.target === $dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null; + e.preventDefault(); + e.stopPropagation(); + $wrapperEl.transition(100); + $dragEl.transition(100); + setDragPosition(e); + clearTimeout(dragTimeout); + $el.transition(0); + + if (params.hide) { + $el.css('opacity', 1); + } + + if (swiper.params.cssMode) { + swiper.$wrapperEl.css('scroll-snap-type', 'none'); + } + + emit('scrollbarDragStart', e); + } + + function onDragMove(e) { + const { + scrollbar, + $wrapperEl + } = swiper; + const { + $el, + $dragEl + } = scrollbar; + if (!isTouched) return; + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + setDragPosition(e); + $wrapperEl.transition(0); + $el.transition(0); + $dragEl.transition(0); + emit('scrollbarDragMove', e); + } + + function onDragEnd(e) { + const params = swiper.params.scrollbar; + const { + scrollbar, + $wrapperEl + } = swiper; + const { + $el + } = scrollbar; + if (!isTouched) return; + isTouched = false; + + if (swiper.params.cssMode) { + swiper.$wrapperEl.css('scroll-snap-type', ''); + $wrapperEl.transition(''); + } + + if (params.hide) { + clearTimeout(dragTimeout); + dragTimeout = nextTick(() => { + $el.css('opacity', 0); + $el.transition(400); + }, 1000); + } + + emit('scrollbarDragEnd', e); + + if (params.snapOnRelease) { + swiper.slideToClosest(); + } + } + + function events(method) { + const { + scrollbar, + touchEventsTouch, + touchEventsDesktop, + params, + support + } = swiper; + const $el = scrollbar.$el; + const target = $el[0]; + const activeListener = support.passiveListener && params.passiveListeners ? { + passive: false, + capture: false + } : false; + const passiveListener = support.passiveListener && params.passiveListeners ? { + passive: true, + capture: false + } : false; + if (!target) return; + const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener'; + + if (!support.touch) { + target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener); + document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener); + document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener); + } else { + target[eventMethod](touchEventsTouch.start, onDragStart, activeListener); + target[eventMethod](touchEventsTouch.move, onDragMove, activeListener); + target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener); + } + } + + function enableDraggable() { + if (!swiper.params.scrollbar.el) return; + events('on'); + } + + function disableDraggable() { + if (!swiper.params.scrollbar.el) return; + events('off'); + } + + function init() { + const { + scrollbar, + $el: $swiperEl + } = swiper; + swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, { + el: 'swiper-scrollbar' + }); + const params = swiper.params.scrollbar; + if (!params.el) return; + let $el = $(params.el); + + if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) { + $el = $swiperEl.find(params.el); + } + + let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`); + + if ($dragEl.length === 0) { + $dragEl = $(`
`); + $el.append($dragEl); + } + + Object.assign(scrollbar, { + $el, + el: $el[0], + $dragEl, + dragEl: $dragEl[0] + }); + + if (params.draggable) { + enableDraggable(); + } + + if ($el) { + $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass); + } + } + + function destroy() { + disableDraggable(); + } + + on('init', () => { + init(); + updateSize(); + setTranslate(); + }); + on('update resize observerUpdate lock unlock', () => { + updateSize(); + }); + on('setTranslate', () => { + setTranslate(); + }); + on('setTransition', (_s, duration) => { + setTransition(duration); + }); + on('enable disable', () => { + const { + $el + } = swiper.scrollbar; + + if ($el) { + $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass); + } + }); + on('destroy', () => { + destroy(); + }); + Object.assign(swiper.scrollbar, { + updateSize, + setTranslate, + init, + destroy + }); +} + +function Parallax({ + swiper, + extendParams, + on +}) { + extendParams({ + parallax: { + enabled: false + } + }); + + const setTransform = (el, progress) => { + const { + rtl + } = swiper; + const $el = $(el); + const rtlFactor = rtl ? -1 : 1; + const p = $el.attr('data-swiper-parallax') || '0'; + let x = $el.attr('data-swiper-parallax-x'); + let y = $el.attr('data-swiper-parallax-y'); + const scale = $el.attr('data-swiper-parallax-scale'); + const opacity = $el.attr('data-swiper-parallax-opacity'); + + if (x || y) { + x = x || '0'; + y = y || '0'; + } else if (swiper.isHorizontal()) { + x = p; + y = '0'; + } else { + y = p; + x = '0'; + } + + if (x.indexOf('%') >= 0) { + x = `${parseInt(x, 10) * progress * rtlFactor}%`; + } else { + x = `${x * progress * rtlFactor}px`; + } + + if (y.indexOf('%') >= 0) { + y = `${parseInt(y, 10) * progress}%`; + } else { + y = `${y * progress}px`; + } + + if (typeof opacity !== 'undefined' && opacity !== null) { + const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress)); + $el[0].style.opacity = currentOpacity; + } + + if (typeof scale === 'undefined' || scale === null) { + $el.transform(`translate3d(${x}, ${y}, 0px)`); + } else { + const currentScale = scale - (scale - 1) * (1 - Math.abs(progress)); + $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`); + } + }; + + const setTranslate = () => { + const { + $el, + slides, + progress, + snapGrid + } = swiper; + $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(el => { + setTransform(el, progress); + }); + slides.each((slideEl, slideIndex) => { + let slideProgress = slideEl.progress; + + if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') { + slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1); + } + + slideProgress = Math.min(Math.max(slideProgress, -1), 1); + $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(el => { + setTransform(el, slideProgress); + }); + }); + }; + + const setTransition = (duration = swiper.params.speed) => { + const { + $el + } = swiper; + $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(parallaxEl => { + const $parallaxEl = $(parallaxEl); + let parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration; + if (duration === 0) parallaxDuration = 0; + $parallaxEl.transition(parallaxDuration); + }); + }; + + on('beforeInit', () => { + if (!swiper.params.parallax.enabled) return; + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }); + on('init', () => { + if (!swiper.params.parallax.enabled) return; + setTranslate(); + }); + on('setTranslate', () => { + if (!swiper.params.parallax.enabled) return; + setTranslate(); + }); + on('setTransition', (_swiper, duration) => { + if (!swiper.params.parallax.enabled) return; + setTransition(duration); + }); +} + +function Zoom({ + swiper, + extendParams, + on, + emit +}) { + const window = getWindow(); + extendParams({ + zoom: { + enabled: false, + maxRatio: 3, + minRatio: 1, + toggle: true, + containerClass: 'swiper-zoom-container', + zoomedSlideClass: 'swiper-slide-zoomed' + } + }); + swiper.zoom = { + enabled: false + }; + let currentScale = 1; + let isScaling = false; + let gesturesEnabled; + let fakeGestureTouched; + let fakeGestureMoved; + const gesture = { + $slideEl: undefined, + slideWidth: undefined, + slideHeight: undefined, + $imageEl: undefined, + $imageWrapEl: undefined, + maxRatio: 3 + }; + const image = { + isTouched: undefined, + isMoved: undefined, + currentX: undefined, + currentY: undefined, + minX: undefined, + minY: undefined, + maxX: undefined, + maxY: undefined, + width: undefined, + height: undefined, + startX: undefined, + startY: undefined, + touchesStart: {}, + touchesCurrent: {} + }; + const velocity = { + x: undefined, + y: undefined, + prevPositionX: undefined, + prevPositionY: undefined, + prevTime: undefined + }; + let scale = 1; + Object.defineProperty(swiper.zoom, 'scale', { + get() { + return scale; + }, + + set(value) { + if (scale !== value) { + const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined; + const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined; + emit('zoomChange', value, imageEl, slideEl); + } + + scale = value; + } + + }); + + function getDistanceBetweenTouches(e) { + if (e.targetTouches.length < 2) return 1; + const x1 = e.targetTouches[0].pageX; + const y1 = e.targetTouches[0].pageY; + const x2 = e.targetTouches[1].pageX; + const y2 = e.targetTouches[1].pageY; + const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); + return distance; + } // Events + + + function onGestureStart(e) { + const support = swiper.support; + const params = swiper.params.zoom; + fakeGestureTouched = false; + fakeGestureMoved = false; + + if (!support.gestures) { + if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) { + return; + } + + fakeGestureTouched = true; + gesture.scaleStart = getDistanceBetweenTouches(e); + } + + if (!gesture.$slideEl || !gesture.$slideEl.length) { + gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`); + if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('img, svg, canvas, picture, .swiper-zoom-target'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + + if (gesture.$imageWrapEl.length === 0) { + gesture.$imageEl = undefined; + return; + } + } + + if (gesture.$imageEl) { + gesture.$imageEl.transition(0); + } + + isScaling = true; + } + + function onGestureChange(e) { + const support = swiper.support; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + + if (!support.gestures) { + if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) { + return; + } + + fakeGestureMoved = true; + gesture.scaleMove = getDistanceBetweenTouches(e); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { + if (e.type === 'gesturechange') onGestureStart(e); + return; + } + + if (support.gestures) { + zoom.scale = e.scale * currentScale; + } else { + zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale; + } + + if (zoom.scale > gesture.maxRatio) { + zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5; + } + + if (zoom.scale < params.minRatio) { + zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5; + } + + gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`); + } + + function onGestureEnd(e) { + const device = swiper.device; + const support = swiper.support; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + + if (!support.gestures) { + if (!fakeGestureTouched || !fakeGestureMoved) { + return; + } + + if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2 && !device.android) { + return; + } + + fakeGestureTouched = false; + fakeGestureMoved = false; + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio); + gesture.$imageEl.transition(swiper.params.speed).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + currentScale = zoom.scale; + isScaling = false; + if (zoom.scale === 1) gesture.$slideEl = undefined; + } + + function onTouchStart(e) { + const device = swiper.device; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (image.isTouched) return; + if (device.android && e.cancelable) e.preventDefault(); + image.isTouched = true; + image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + } + + function onTouchMove(e) { + const zoom = swiper.zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + swiper.allowClick = false; + if (!image.isTouched || !gesture.$slideEl) return; + + if (!image.isMoved) { + image.width = gesture.$imageEl[0].offsetWidth; + image.height = gesture.$imageEl[0].offsetHeight; + image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0; + image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0; + gesture.slideWidth = gesture.$slideEl[0].offsetWidth; + gesture.slideHeight = gesture.$slideEl[0].offsetHeight; + gesture.$imageWrapEl.transition(0); + } // Define if we need image drag + + + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return; + image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); + image.maxX = -image.minX; + image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); + image.maxY = -image.minY; + image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (!image.isMoved && !isScaling) { + if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) { + image.isTouched = false; + return; + } + + if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) { + image.isTouched = false; + return; + } + } + + if (e.cancelable) { + e.preventDefault(); + } + + e.stopPropagation(); + image.isMoved = true; + image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX; + image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY; + + if (image.currentX < image.minX) { + image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8; + } + + if (image.currentX > image.maxX) { + image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8; + } + + if (image.currentY < image.minY) { + image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8; + } + + if (image.currentY > image.maxY) { + image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8; + } // Velocity + + + if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x; + if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y; + if (!velocity.prevTime) velocity.prevTime = Date.now(); + velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2; + velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2; + if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0; + if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0; + velocity.prevPositionX = image.touchesCurrent.x; + velocity.prevPositionY = image.touchesCurrent.y; + velocity.prevTime = Date.now(); + gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + } + + function onTouchEnd() { + const zoom = swiper.zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + + if (!image.isTouched || !image.isMoved) { + image.isTouched = false; + image.isMoved = false; + return; + } + + image.isTouched = false; + image.isMoved = false; + let momentumDurationX = 300; + let momentumDurationY = 300; + const momentumDistanceX = velocity.x * momentumDurationX; + const newPositionX = image.currentX + momentumDistanceX; + const momentumDistanceY = velocity.y * momentumDurationY; + const newPositionY = image.currentY + momentumDistanceY; // Fix duration + + if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); + if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); + const momentumDuration = Math.max(momentumDurationX, momentumDurationY); + image.currentX = newPositionX; + image.currentY = newPositionY; // Define if we need image drag + + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); + image.maxX = -image.minX; + image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); + image.maxY = -image.minY; + image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX); + image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY); + gesture.$imageWrapEl.transition(momentumDuration).transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + } + + function onTransitionEnd() { + const zoom = swiper.zoom; + + if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) { + if (gesture.$imageEl) { + gesture.$imageEl.transform('translate3d(0,0,0) scale(1)'); + } + + if (gesture.$imageWrapEl) { + gesture.$imageWrapEl.transform('translate3d(0,0,0)'); + } + + zoom.scale = 1; + currentScale = 1; + gesture.$slideEl = undefined; + gesture.$imageEl = undefined; + gesture.$imageWrapEl = undefined; + } + } + + function zoomIn(e) { + const zoom = swiper.zoom; + const params = swiper.params.zoom; + + if (!gesture.$slideEl) { + if (e && e.target) { + gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`); + } + + if (!gesture.$slideEl) { + if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) { + gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`); + } else { + gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + } + } + + gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('img, svg, canvas, picture, .swiper-zoom-target'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return; + + if (swiper.params.cssMode) { + swiper.wrapperEl.style.overflow = 'hidden'; + swiper.wrapperEl.style.touchAction = 'none'; + } + + gesture.$slideEl.addClass(`${params.zoomedSlideClass}`); + let touchX; + let touchY; + let offsetX; + let offsetY; + let diffX; + let diffY; + let translateX; + let translateY; + let imageWidth; + let imageHeight; + let scaledWidth; + let scaledHeight; + let translateMinX; + let translateMinY; + let translateMaxX; + let translateMaxY; + let slideWidth; + let slideHeight; + + if (typeof image.touchesStart.x === 'undefined' && e) { + touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX; + touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY; + } else { + touchX = image.touchesStart.x; + touchY = image.touchesStart.y; + } + + zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + + if (e) { + slideWidth = gesture.$slideEl[0].offsetWidth; + slideHeight = gesture.$slideEl[0].offsetHeight; + offsetX = gesture.$slideEl.offset().left + window.scrollX; + offsetY = gesture.$slideEl.offset().top + window.scrollY; + diffX = offsetX + slideWidth / 2 - touchX; + diffY = offsetY + slideHeight / 2 - touchY; + imageWidth = gesture.$imageEl[0].offsetWidth; + imageHeight = gesture.$imageEl[0].offsetHeight; + scaledWidth = imageWidth * zoom.scale; + scaledHeight = imageHeight * zoom.scale; + translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0); + translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0); + translateMaxX = -translateMinX; + translateMaxY = -translateMinY; + translateX = diffX * zoom.scale; + translateY = diffY * zoom.scale; + + if (translateX < translateMinX) { + translateX = translateMinX; + } + + if (translateX > translateMaxX) { + translateX = translateMaxX; + } + + if (translateY < translateMinY) { + translateY = translateMinY; + } + + if (translateY > translateMaxY) { + translateY = translateMaxY; + } + } else { + translateX = 0; + translateY = 0; + } + + gesture.$imageWrapEl.transition(300).transform(`translate3d(${translateX}px, ${translateY}px,0)`); + gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + } + + function zoomOut() { + const zoom = swiper.zoom; + const params = swiper.params.zoom; + + if (!gesture.$slideEl) { + if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) { + gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`); + } else { + gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + } + + gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('img, svg, canvas, picture, .swiper-zoom-target'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return; + + if (swiper.params.cssMode) { + swiper.wrapperEl.style.overflow = ''; + swiper.wrapperEl.style.touchAction = ''; + } + + zoom.scale = 1; + currentScale = 1; + gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)'); + gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)'); + gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`); + gesture.$slideEl = undefined; + } // Toggle Zoom + + + function zoomToggle(e) { + const zoom = swiper.zoom; + + if (zoom.scale && zoom.scale !== 1) { + // Zoom Out + zoomOut(); + } else { + // Zoom In + zoomIn(e); + } + } + + function getListeners() { + const support = swiper.support; + const passiveListener = swiper.touchEvents.start === 'touchstart' && support.passiveListener && swiper.params.passiveListeners ? { + passive: true, + capture: false + } : false; + const activeListenerWithCapture = support.passiveListener ? { + passive: false, + capture: true + } : true; + return { + passiveListener, + activeListenerWithCapture + }; + } + + function getSlideSelector() { + return `.${swiper.params.slideClass}`; + } + + function toggleGestures(method) { + const { + passiveListener + } = getListeners(); + const slideSelector = getSlideSelector(); + swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener); + swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener); + swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener); + } + + function enableGestures() { + if (gesturesEnabled) return; + gesturesEnabled = true; + toggleGestures('on'); + } + + function disableGestures() { + if (!gesturesEnabled) return; + gesturesEnabled = false; + toggleGestures('off'); + } // Attach/Detach Events + + + function enable() { + const zoom = swiper.zoom; + if (zoom.enabled) return; + zoom.enabled = true; + const support = swiper.support; + const { + passiveListener, + activeListenerWithCapture + } = getListeners(); + const slideSelector = getSlideSelector(); // Scale image + + if (support.gestures) { + swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, onGestureStart, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, onGestureChange, activeListenerWithCapture); + swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener); + + if (swiper.touchEvents.cancel) { + swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, onGestureEnd, passiveListener); + } + } // Move image + + + swiper.$wrapperEl.on(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, onTouchMove, activeListenerWithCapture); + } + + function disable() { + const zoom = swiper.zoom; + if (!zoom.enabled) return; + const support = swiper.support; + zoom.enabled = false; + const { + passiveListener, + activeListenerWithCapture + } = getListeners(); + const slideSelector = getSlideSelector(); // Scale image + + if (support.gestures) { + swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, onGestureStart, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, onGestureChange, activeListenerWithCapture); + swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener); + + if (swiper.touchEvents.cancel) { + swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, onGestureEnd, passiveListener); + } + } // Move image + + + swiper.$wrapperEl.off(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, onTouchMove, activeListenerWithCapture); + } + + on('init', () => { + if (swiper.params.zoom.enabled) { + enable(); + } + }); + on('destroy', () => { + disable(); + }); + on('touchStart', (_s, e) => { + if (!swiper.zoom.enabled) return; + onTouchStart(e); + }); + on('touchEnd', (_s, e) => { + if (!swiper.zoom.enabled) return; + onTouchEnd(); + }); + on('doubleTap', (_s, e) => { + if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) { + zoomToggle(e); + } + }); + on('transitionEnd', () => { + if (swiper.zoom.enabled && swiper.params.zoom.enabled) { + onTransitionEnd(); + } + }); + on('slideChange', () => { + if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) { + onTransitionEnd(); + } + }); + Object.assign(swiper.zoom, { + enable, + disable, + in: zoomIn, + out: zoomOut, + toggle: zoomToggle + }); +} + +function Lazy({ + swiper, + extendParams, + on, + emit +}) { + extendParams({ + lazy: { + checkInView: false, + enabled: false, + loadPrevNext: false, + loadPrevNextAmount: 1, + loadOnTransitionStart: false, + scrollingElement: '', + elementClass: 'swiper-lazy', + loadingClass: 'swiper-lazy-loading', + loadedClass: 'swiper-lazy-loaded', + preloaderClass: 'swiper-lazy-preloader' + } + }); + swiper.lazy = {}; + let scrollHandlerAttached = false; + let initialImageLoaded = false; + + function loadInSlide(index, loadInDuplicate = true) { + const params = swiper.params.lazy; + if (typeof index === 'undefined') return; + if (swiper.slides.length === 0) return; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + const $slideEl = isVirtual ? swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-swiper-slide-index="${index}"]`) : swiper.slides.eq(index); + const $images = $slideEl.find(`.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`); + + if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) { + $images.push($slideEl[0]); + } + + if ($images.length === 0) return; + $images.each(imageEl => { + const $imageEl = $(imageEl); + $imageEl.addClass(params.loadingClass); + const background = $imageEl.attr('data-background'); + const src = $imageEl.attr('data-src'); + const srcset = $imageEl.attr('data-srcset'); + const sizes = $imageEl.attr('data-sizes'); + const $pictureEl = $imageEl.parent('picture'); + swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => { + if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper && !swiper.params || swiper.destroyed) return; + + if (background) { + $imageEl.css('background-image', `url("${background}")`); + $imageEl.removeAttr('data-background'); + } else { + if (srcset) { + $imageEl.attr('srcset', srcset); + $imageEl.removeAttr('data-srcset'); + } + + if (sizes) { + $imageEl.attr('sizes', sizes); + $imageEl.removeAttr('data-sizes'); + } + + if ($pictureEl.length) { + $pictureEl.children('source').each(sourceEl => { + const $source = $(sourceEl); + + if ($source.attr('data-srcset')) { + $source.attr('srcset', $source.attr('data-srcset')); + $source.removeAttr('data-srcset'); + } + }); + } + + if (src) { + $imageEl.attr('src', src); + $imageEl.removeAttr('data-src'); + } + } + + $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass); + $slideEl.find(`.${params.preloaderClass}`).remove(); + + if (swiper.params.loop && loadInDuplicate) { + const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index'); + + if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) { + const originalSlide = swiper.$wrapperEl.children(`[data-swiper-slide-index="${slideOriginalIndex}"]:not(.${swiper.params.slideDuplicateClass})`); + loadInSlide(originalSlide.index(), false); + } else { + const duplicatedSlide = swiper.$wrapperEl.children(`.${swiper.params.slideDuplicateClass}[data-swiper-slide-index="${slideOriginalIndex}"]`); + loadInSlide(duplicatedSlide.index(), false); + } + } + + emit('lazyImageReady', $slideEl[0], $imageEl[0]); + + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + }); + emit('lazyImageLoad', $slideEl[0], $imageEl[0]); + }); + } + + function load() { + const { + $wrapperEl, + params: swiperParams, + slides, + activeIndex + } = swiper; + const isVirtual = swiper.virtual && swiperParams.virtual.enabled; + const params = swiperParams.lazy; + let slidesPerView = swiperParams.slidesPerView; + + if (slidesPerView === 'auto') { + slidesPerView = 0; + } + + function slideExist(index) { + if (isVirtual) { + if ($wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index="${index}"]`).length) { + return true; + } + } else if (slides[index]) return true; + + return false; + } + + function slideIndex(slideEl) { + if (isVirtual) { + return $(slideEl).attr('data-swiper-slide-index'); + } + + return $(slideEl).index(); + } + + if (!initialImageLoaded) initialImageLoaded = true; + + if (swiper.params.watchSlidesProgress) { + $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each(slideEl => { + const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index(); + loadInSlide(index); + }); + } else if (slidesPerView > 1) { + for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) { + if (slideExist(i)) loadInSlide(i); + } + } else { + loadInSlide(activeIndex); + } + + if (params.loadPrevNext) { + if (slidesPerView > 1 || params.loadPrevNextAmount && params.loadPrevNextAmount > 1) { + const amount = params.loadPrevNextAmount; + const spv = slidesPerView; + const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length); + const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); // Next Slides + + for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) { + if (slideExist(i)) loadInSlide(i); + } // Prev Slides + + + for (let i = minIndex; i < activeIndex; i += 1) { + if (slideExist(i)) loadInSlide(i); + } + } else { + const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`); + if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide)); + const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`); + if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide)); + } + } + } + + function checkInViewOnLoad() { + const window = getWindow(); + if (!swiper || swiper.destroyed) return; + const $scrollElement = swiper.params.lazy.scrollingElement ? $(swiper.params.lazy.scrollingElement) : $(window); + const isWindow = $scrollElement[0] === window; + const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth; + const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight; + const swiperOffset = swiper.$el.offset(); + const { + rtlTranslate: rtl + } = swiper; + let inView = false; + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiper.width, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiper.height], [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height]]; + + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + + if (point[0] >= 0 && point[0] <= scrollElementWidth && point[1] >= 0 && point[1] <= scrollElementHeight) { + if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line + + inView = true; + } + } + + const passiveListener = swiper.touchEvents.start === 'touchstart' && swiper.support.passiveListener && swiper.params.passiveListeners ? { + passive: true, + capture: false + } : false; + + if (inView) { + load(); + $scrollElement.off('scroll', checkInViewOnLoad, passiveListener); + } else if (!scrollHandlerAttached) { + scrollHandlerAttached = true; + $scrollElement.on('scroll', checkInViewOnLoad, passiveListener); + } + } + + on('beforeInit', () => { + if (swiper.params.lazy.enabled && swiper.params.preloadImages) { + swiper.params.preloadImages = false; + } + }); + on('init', () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on('scroll', () => { + if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.freeMode.sticky) { + load(); + } + }); + on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on('transitionStart', () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.loadOnTransitionStart || !swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + } + }); + on('transitionEnd', () => { + if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on('slideChange', () => { + const { + lazy, + cssMode, + watchSlidesProgress, + touchReleaseOnEdges, + resistanceRatio + } = swiper.params; + + if (lazy.enabled && (cssMode || watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0))) { + load(); + } + }); + Object.assign(swiper.lazy, { + load, + loadInSlide + }); +} + +/* eslint no-bitwise: ["error", { "allow": [">>"] }] */ +function Controller({ + swiper, + extendParams, + on +}) { + extendParams({ + controller: { + control: undefined, + inverse: false, + by: 'slide' // or 'container' + + } + }); + swiper.controller = { + control: undefined + }; + + function LinearSpline(x, y) { + const binarySearch = function search() { + let maxIndex; + let minIndex; + let guess; + return (array, val) => { + minIndex = -1; + maxIndex = array.length; + + while (maxIndex - minIndex > 1) { + guess = maxIndex + minIndex >> 1; + + if (array[guess] <= val) { + minIndex = guess; + } else { + maxIndex = guess; + } + } + + return maxIndex; + }; + }(); + + this.x = x; + this.y = y; + this.lastIndex = x.length - 1; // Given an x value (x2), return the expected y2 value: + // (x1,y1) is the known point before given value, + // (x3,y3) is the known point after given value. + + let i1; + let i3; + + this.interpolate = function interpolate(x2) { + if (!x2) return 0; // Get the indexes of x1 and x3 (the array indexes before and after given x2): + + i3 = binarySearch(this.x, x2); + i1 = i3 - 1; // We have our indexes i1 & i3, so we can calculate already: + // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1 + + return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1]; + }; + + return this; + } // xxx: for now i will just save one spline function to to + + + function getInterpolateFunction(c) { + if (!swiper.controller.spline) { + swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid); + } + } + + function setTranslate(_t, byController) { + const controlled = swiper.controller.control; + let multiplier; + let controlledTranslate; + const Swiper = swiper.constructor; + + function setControlledTranslate(c) { + // this will create an Interpolate function based on the snapGrids + // x is the Grid of the scrolled scroller and y will be the controlled scroller + // it makes sense to create this only once and recall it for the interpolation + // the function does a lot of value caching for performance + const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate; + + if (swiper.params.controller.by === 'slide') { + getInterpolateFunction(c); // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid + // but it did not work out + + controlledTranslate = -swiper.controller.spline.interpolate(-translate); + } + + if (!controlledTranslate || swiper.params.controller.by === 'container') { + multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate()); + controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate(); + } + + if (swiper.params.controller.inverse) { + controlledTranslate = c.maxTranslate() - controlledTranslate; + } + + c.updateProgress(controlledTranslate); + c.setTranslate(controlledTranslate, swiper); + c.updateActiveIndex(); + c.updateSlidesClasses(); + } + + if (Array.isArray(controlled)) { + for (let i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTranslate(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTranslate(controlled); + } + } + + function setTransition(duration, byController) { + const Swiper = swiper.constructor; + const controlled = swiper.controller.control; + let i; + + function setControlledTransition(c) { + c.setTransition(duration, swiper); + + if (duration !== 0) { + c.transitionStart(); + + if (c.params.autoHeight) { + nextTick(() => { + c.updateAutoHeight(); + }); + } + + c.$wrapperEl.transitionEnd(() => { + if (!controlled) return; + + if (c.params.loop && swiper.params.controller.by === 'slide') { + c.loopFix(); + } + + c.transitionEnd(); + }); + } + } + + if (Array.isArray(controlled)) { + for (i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTransition(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTransition(controlled); + } + } + + function removeSpline() { + if (!swiper.controller.control) return; + + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + } + + on('beforeInit', () => { + swiper.controller.control = swiper.params.controller.control; + }); + on('update', () => { + removeSpline(); + }); + on('resize', () => { + removeSpline(); + }); + on('observerUpdate', () => { + removeSpline(); + }); + on('setTranslate', (_s, translate, byController) => { + if (!swiper.controller.control) return; + swiper.controller.setTranslate(translate, byController); + }); + on('setTransition', (_s, duration, byController) => { + if (!swiper.controller.control) return; + swiper.controller.setTransition(duration, byController); + }); + Object.assign(swiper.controller, { + setTranslate, + setTransition + }); +} + +function A11y({ + swiper, + extendParams, + on +}) { + extendParams({ + a11y: { + enabled: true, + notificationClass: 'swiper-notification', + prevSlideMessage: 'Previous slide', + nextSlideMessage: 'Next slide', + firstSlideMessage: 'This is the first slide', + lastSlideMessage: 'This is the last slide', + paginationBulletMessage: 'Go to slide {{index}}', + slideLabelMessage: '{{index}} / {{slidesLength}}', + containerMessage: null, + containerRoleDescriptionMessage: null, + itemRoleDescriptionMessage: null, + slideRole: 'group' + } + }); + let liveRegion = null; + + function notify(message) { + const notification = liveRegion; + if (notification.length === 0) return; + notification.html(''); + notification.html(message); + } + + function getRandomNumber(size = 16) { + const randomChar = () => Math.round(16 * Math.random()).toString(16); + + return 'x'.repeat(size).replace(/x/g, randomChar); + } + + function makeElFocusable($el) { + $el.attr('tabIndex', '0'); + } + + function makeElNotFocusable($el) { + $el.attr('tabIndex', '-1'); + } + + function addElRole($el, role) { + $el.attr('role', role); + } + + function addElRoleDescription($el, description) { + $el.attr('aria-roledescription', description); + } + + function addElControls($el, controls) { + $el.attr('aria-controls', controls); + } + + function addElLabel($el, label) { + $el.attr('aria-label', label); + } + + function addElId($el, id) { + $el.attr('id', id); + } + + function addElLive($el, live) { + $el.attr('aria-live', live); + } + + function disableEl($el) { + $el.attr('aria-disabled', true); + } + + function enableEl($el) { + $el.attr('aria-disabled', false); + } + + function onEnterOrSpaceKey(e) { + if (e.keyCode !== 13 && e.keyCode !== 32) return; + const params = swiper.params.a11y; + const $targetEl = $(e.target); + + if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) { + if (!(swiper.isEnd && !swiper.params.loop)) { + swiper.slideNext(); + } + + if (swiper.isEnd) { + notify(params.lastSlideMessage); + } else { + notify(params.nextSlideMessage); + } + } + + if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) { + if (!(swiper.isBeginning && !swiper.params.loop)) { + swiper.slidePrev(); + } + + if (swiper.isBeginning) { + notify(params.firstSlideMessage); + } else { + notify(params.prevSlideMessage); + } + } + + if (swiper.pagination && $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))) { + $targetEl[0].click(); + } + } + + function updateNavigation() { + if (swiper.params.loop || !swiper.navigation) return; + const { + $nextEl, + $prevEl + } = swiper.navigation; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + disableEl($prevEl); + makeElNotFocusable($prevEl); + } else { + enableEl($prevEl); + makeElFocusable($prevEl); + } + } + + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + disableEl($nextEl); + makeElNotFocusable($nextEl); + } else { + enableEl($nextEl); + makeElFocusable($nextEl); + } + } + } + + function hasPagination() { + return swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length; + } + + function updatePagination() { + const params = swiper.params.a11y; + + if (hasPagination()) { + swiper.pagination.bullets.each(bulletEl => { + const $bulletEl = $(bulletEl); + makeElFocusable($bulletEl); + + if (!swiper.params.pagination.renderBullet) { + addElRole($bulletEl, 'button'); + addElLabel($bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, $bulletEl.index() + 1)); + } + }); + } + } + + const initNavEl = ($el, wrapperId, message) => { + makeElFocusable($el); + + if ($el[0].tagName !== 'BUTTON') { + addElRole($el, 'button'); + $el.on('keydown', onEnterOrSpaceKey); + } + + addElLabel($el, message); + addElControls($el, wrapperId); + }; + + function init() { + const params = swiper.params.a11y; + swiper.$el.append(liveRegion); // Container + + const $containerEl = swiper.$el; + + if (params.containerRoleDescriptionMessage) { + addElRoleDescription($containerEl, params.containerRoleDescriptionMessage); + } + + if (params.containerMessage) { + addElLabel($containerEl, params.containerMessage); + } // Wrapper + + + const $wrapperEl = swiper.$wrapperEl; + const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`; + const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite'; + addElId($wrapperEl, wrapperId); + addElLive($wrapperEl, live); // Slide + + if (params.itemRoleDescriptionMessage) { + addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage); + } + + addElRole($(swiper.slides), params.slideRole); + const slidesLength = swiper.params.loop ? swiper.slides.filter(el => !el.classList.contains(swiper.params.slideDuplicateClass)).length : swiper.slides.length; + swiper.slides.each((slideEl, index) => { + const $slideEl = $(slideEl); + const slideIndex = swiper.params.loop ? parseInt($slideEl.attr('data-swiper-slide-index'), 10) : index; + const ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength); + addElLabel($slideEl, ariaLabelMessage); + }); // Navigation + + let $nextEl; + let $prevEl; + + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + + if ($nextEl && $nextEl.length) { + initNavEl($nextEl, wrapperId, params.nextSlideMessage); + } + + if ($prevEl && $prevEl.length) { + initNavEl($prevEl, wrapperId, params.prevSlideMessage); + } // Pagination + + + if (hasPagination()) { + swiper.pagination.$el.on('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey); + } + } + + function destroy() { + if (liveRegion && liveRegion.length > 0) liveRegion.remove(); + let $nextEl; + let $prevEl; + + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + + if ($nextEl) { + $nextEl.off('keydown', onEnterOrSpaceKey); + } + + if ($prevEl) { + $prevEl.off('keydown', onEnterOrSpaceKey); + } // Pagination + + + if (hasPagination()) { + swiper.pagination.$el.off('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey); + } + } + + on('beforeInit', () => { + liveRegion = $(``); + }); + on('afterInit', () => { + if (!swiper.params.a11y.enabled) return; + init(); + updateNavigation(); + }); + on('toEdge', () => { + if (!swiper.params.a11y.enabled) return; + updateNavigation(); + }); + on('fromEdge', () => { + if (!swiper.params.a11y.enabled) return; + updateNavigation(); + }); + on('paginationUpdate', () => { + if (!swiper.params.a11y.enabled) return; + updatePagination(); + }); + on('destroy', () => { + if (!swiper.params.a11y.enabled) return; + destroy(); + }); +} + +function History({ + swiper, + extendParams, + on +}) { + extendParams({ + history: { + enabled: false, + root: '', + replaceState: false, + key: 'slides' + } + }); + let initialized = false; + let paths = {}; + + const slugify = text => { + return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, ''); + }; + + const getPathValues = urlOverride => { + const window = getWindow(); + let location; + + if (urlOverride) { + location = new URL(urlOverride); + } else { + location = window.location; + } + + const pathArray = location.pathname.slice(1).split('/').filter(part => part !== ''); + const total = pathArray.length; + const key = pathArray[total - 2]; + const value = pathArray[total - 1]; + return { + key, + value + }; + }; + + const setHistory = (key, index) => { + const window = getWindow(); + if (!initialized || !swiper.params.history.enabled) return; + let location; + + if (swiper.params.url) { + location = new URL(swiper.params.url); + } else { + location = window.location; + } + + const slide = swiper.slides.eq(index); + let value = slugify(slide.attr('data-history')); + + if (swiper.params.history.root.length > 0) { + let root = swiper.params.history.root; + if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1); + value = `${root}/${key}/${value}`; + } else if (!location.pathname.includes(key)) { + value = `${key}/${value}`; + } + + const currentState = window.history.state; + + if (currentState && currentState.value === value) { + return; + } + + if (swiper.params.history.replaceState) { + window.history.replaceState({ + value + }, null, value); + } else { + window.history.pushState({ + value + }, null, value); + } + }; + + const scrollToSlide = (speed, value, runCallbacks) => { + if (value) { + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHistory = slugify(slide.attr('data-history')); + + if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, runCallbacks); + } + } + } else { + swiper.slideTo(0, speed, runCallbacks); + } + }; + + const setHistoryPopState = () => { + paths = getPathValues(swiper.params.url); + scrollToSlide(swiper.params.speed, swiper.paths.value, false); + }; + + const init = () => { + const window = getWindow(); + if (!swiper.params.history) return; + + if (!window.history || !window.history.pushState) { + swiper.params.history.enabled = false; + swiper.params.hashNavigation.enabled = true; + return; + } + + initialized = true; + paths = getPathValues(swiper.params.url); + if (!paths.key && !paths.value) return; + scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit); + + if (!swiper.params.history.replaceState) { + window.addEventListener('popstate', setHistoryPopState); + } + }; + + const destroy = () => { + const window = getWindow(); + + if (!swiper.params.history.replaceState) { + window.removeEventListener('popstate', setHistoryPopState); + } + }; + + on('init', () => { + if (swiper.params.history.enabled) { + init(); + } + }); + on('destroy', () => { + if (swiper.params.history.enabled) { + destroy(); + } + }); + on('transitionEnd _freeModeNoMomentumRelease', () => { + if (initialized) { + setHistory(swiper.params.history.key, swiper.activeIndex); + } + }); + on('slideChange', () => { + if (initialized && swiper.params.cssMode) { + setHistory(swiper.params.history.key, swiper.activeIndex); + } + }); +} + +function HashNavigation({ + swiper, + extendParams, + emit, + on +}) { + let initialized = false; + const document = getDocument(); + const window = getWindow(); + extendParams({ + hashNavigation: { + enabled: false, + replaceState: false, + watchState: false + } + }); + + const onHashChange = () => { + emit('hashChange'); + const newHash = document.location.hash.replace('#', ''); + const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash'); + + if (newHash !== activeSlideHash) { + const newIndex = swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-hash="${newHash}"]`).index(); + if (typeof newIndex === 'undefined') return; + swiper.slideTo(newIndex); + } + }; + + const setHash = () => { + if (!initialized || !swiper.params.hashNavigation.enabled) return; + + if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) { + window.history.replaceState(null, null, `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || ''); + emit('hashSet'); + } else { + const slide = swiper.slides.eq(swiper.activeIndex); + const hash = slide.attr('data-hash') || slide.attr('data-history'); + document.location.hash = hash || ''; + emit('hashSet'); + } + }; + + const init = () => { + if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return; + initialized = true; + const hash = document.location.hash.replace('#', ''); + + if (hash) { + const speed = 0; + + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHash = slide.attr('data-hash') || slide.attr('data-history'); + + if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true); + } + } + } + + if (swiper.params.hashNavigation.watchState) { + $(window).on('hashchange', onHashChange); + } + }; + + const destroy = () => { + if (swiper.params.hashNavigation.watchState) { + $(window).off('hashchange', onHashChange); + } + }; + + on('init', () => { + if (swiper.params.hashNavigation.enabled) { + init(); + } + }); + on('destroy', () => { + if (swiper.params.hashNavigation.enabled) { + destroy(); + } + }); + on('transitionEnd _freeModeNoMomentumRelease', () => { + if (initialized) { + setHash(); + } + }); + on('slideChange', () => { + if (initialized && swiper.params.cssMode) { + setHash(); + } + }); +} + +/* eslint no-underscore-dangle: "off" */ +function Autoplay({ + swiper, + extendParams, + on, + emit +}) { + let timeout; + swiper.autoplay = { + running: false, + paused: false + }; + extendParams({ + autoplay: { + enabled: false, + delay: 3000, + waitForTransition: true, + disableOnInteraction: true, + stopOnLastSlide: false, + reverseDirection: false, + pauseOnMouseEnter: false + } + }); + + function run() { + const $activeSlideEl = swiper.slides.eq(swiper.activeIndex); + let delay = swiper.params.autoplay.delay; + + if ($activeSlideEl.attr('data-swiper-autoplay')) { + delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay; + } + + clearTimeout(timeout); + timeout = nextTick(() => { + let autoplayResult; + + if (swiper.params.autoplay.reverseDirection) { + if (swiper.params.loop) { + swiper.loopFix(); + autoplayResult = swiper.slidePrev(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.isBeginning) { + autoplayResult = swiper.slidePrev(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true); + emit('autoplay'); + } else { + stop(); + } + } else if (swiper.params.loop) { + swiper.loopFix(); + autoplayResult = swiper.slideNext(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.isEnd) { + autoplayResult = swiper.slideNext(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true); + emit('autoplay'); + } else { + stop(); + } + + if (swiper.params.cssMode && swiper.autoplay.running) run();else if (autoplayResult === false) { + run(); + } + }, delay); + } + + function start() { + if (typeof timeout !== 'undefined') return false; + if (swiper.autoplay.running) return false; + swiper.autoplay.running = true; + emit('autoplayStart'); + run(); + return true; + } + + function stop() { + if (!swiper.autoplay.running) return false; + if (typeof timeout === 'undefined') return false; + + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + + swiper.autoplay.running = false; + emit('autoplayStop'); + return true; + } + + function pause(speed) { + if (!swiper.autoplay.running) return; + if (swiper.autoplay.paused) return; + if (timeout) clearTimeout(timeout); + swiper.autoplay.paused = true; + + if (speed === 0 || !swiper.params.autoplay.waitForTransition) { + swiper.autoplay.paused = false; + run(); + } else { + ['transitionend', 'webkitTransitionEnd'].forEach(event => { + swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd); + }); + } + } + + function onVisibilityChange() { + const document = getDocument(); + + if (document.visibilityState === 'hidden' && swiper.autoplay.running) { + pause(); + } + + if (document.visibilityState === 'visible' && swiper.autoplay.paused) { + run(); + swiper.autoplay.paused = false; + } + } + + function onTransitionEnd(e) { + if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return; + if (e.target !== swiper.$wrapperEl[0]) return; + ['transitionend', 'webkitTransitionEnd'].forEach(event => { + swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd); + }); + swiper.autoplay.paused = false; + + if (!swiper.autoplay.running) { + stop(); + } else { + run(); + } + } + + function onMouseEnter() { + if (swiper.params.autoplay.disableOnInteraction) { + stop(); + } else { + pause(); + } + + ['transitionend', 'webkitTransitionEnd'].forEach(event => { + swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd); + }); + } + + function onMouseLeave() { + if (swiper.params.autoplay.disableOnInteraction) { + return; + } + + swiper.autoplay.paused = false; + run(); + } + + function attachMouseEvents() { + if (swiper.params.autoplay.pauseOnMouseEnter) { + swiper.$el.on('mouseenter', onMouseEnter); + swiper.$el.on('mouseleave', onMouseLeave); + } + } + + function detachMouseEvents() { + swiper.$el.off('mouseenter', onMouseEnter); + swiper.$el.off('mouseleave', onMouseLeave); + } + + on('init', () => { + if (swiper.params.autoplay.enabled) { + start(); + const document = getDocument(); + document.addEventListener('visibilitychange', onVisibilityChange); + attachMouseEvents(); + } + }); + on('beforeTransitionStart', (_s, speed, internal) => { + if (swiper.autoplay.running) { + if (internal || !swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.pause(speed); + } else { + stop(); + } + } + }); + on('sliderFirstMove', () => { + if (swiper.autoplay.running) { + if (swiper.params.autoplay.disableOnInteraction) { + stop(); + } else { + pause(); + } + } + }); + on('touchEnd', () => { + if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) { + run(); + } + }); + on('destroy', () => { + detachMouseEvents(); + + if (swiper.autoplay.running) { + stop(); + } + + const document = getDocument(); + document.removeEventListener('visibilitychange', onVisibilityChange); + }); + Object.assign(swiper.autoplay, { + pause, + run, + start, + stop + }); +} + +function Thumb({ + swiper, + extendParams, + on +}) { + extendParams({ + thumbs: { + swiper: null, + multipleActiveThumbs: true, + autoScrollOffset: 0, + slideThumbActiveClass: 'swiper-slide-thumb-active', + thumbsContainerClass: 'swiper-thumbs' + } + }); + let initialized = false; + let swiperCreated = false; + swiper.thumbs = { + swiper: null + }; + + function onThumbClick() { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const clickedIndex = thumbsSwiper.clickedIndex; + const clickedSlide = thumbsSwiper.clickedSlide; + if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) return; + if (typeof clickedIndex === 'undefined' || clickedIndex === null) return; + let slideToIndex; + + if (thumbsSwiper.params.loop) { + slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10); + } else { + slideToIndex = clickedIndex; + } + + if (swiper.params.loop) { + let currentIndex = swiper.activeIndex; + + if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) { + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + currentIndex = swiper.activeIndex; + } + + const prevIndex = swiper.slides.eq(currentIndex).prevAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + const nextIndex = swiper.slides.eq(currentIndex).nextAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;else slideToIndex = prevIndex; + } + + swiper.slideTo(slideToIndex); + } + + function init() { + const { + thumbs: thumbsParams + } = swiper.params; + if (initialized) return false; + initialized = true; + const SwiperClass = swiper.constructor; + + if (thumbsParams.swiper instanceof SwiperClass) { + swiper.thumbs.swiper = thumbsParams.swiper; + Object.assign(swiper.thumbs.swiper.originalParams, { + watchSlidesProgress: true, + slideToClickedSlide: false + }); + Object.assign(swiper.thumbs.swiper.params, { + watchSlidesProgress: true, + slideToClickedSlide: false + }); + } else if (isObject(thumbsParams.swiper)) { + const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper); + Object.assign(thumbsSwiperParams, { + watchSlidesProgress: true, + slideToClickedSlide: false + }); + swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams); + swiperCreated = true; + } + + swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass); + swiper.thumbs.swiper.on('tap', onThumbClick); + return true; + } + + function update(initial) { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView; + const autoScrollOffset = swiper.params.thumbs.autoScrollOffset; + const useOffset = autoScrollOffset && !thumbsSwiper.params.loop; + + if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) { + let currentThumbsIndex = thumbsSwiper.activeIndex; + let newThumbsIndex; + let direction; + + if (thumbsSwiper.params.loop) { + if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) { + thumbsSwiper.loopFix(); // eslint-disable-next-line + + thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft; + currentThumbsIndex = thumbsSwiper.activeIndex; + } // Find actual thumbs index to slide to + + + const prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + const nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + + if (typeof prevThumbsIndex === 'undefined') { + newThumbsIndex = nextThumbsIndex; + } else if (typeof nextThumbsIndex === 'undefined') { + newThumbsIndex = prevThumbsIndex; + } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { + newThumbsIndex = thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex; + } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { + newThumbsIndex = nextThumbsIndex; + } else { + newThumbsIndex = prevThumbsIndex; + } + + direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev'; + } else { + newThumbsIndex = swiper.realIndex; + direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev'; + } + + if (useOffset) { + newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset; + } + + if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) { + if (thumbsSwiper.params.centeredSlides) { + if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1; + } else { + newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1; + } + } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ; + + thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined); + } + } // Activate thumbs + + + let thumbsToActivate = 1; + const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass; + + if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) { + thumbsToActivate = swiper.params.slidesPerView; + } + + if (!swiper.params.thumbs.multipleActiveThumbs) { + thumbsToActivate = 1; + } + + thumbsToActivate = Math.floor(thumbsToActivate); + thumbsSwiper.slides.removeClass(thumbActiveClass); + + if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.$wrapperEl.children(`[data-swiper-slide-index="${swiper.realIndex + i}"]`).addClass(thumbActiveClass); + } + } else { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass); + } + } + } + + on('beforeInit', () => { + const { + thumbs + } = swiper.params; + if (!thumbs || !thumbs.swiper) return; + init(); + update(true); + }); + on('slideChange update resize observerUpdate', () => { + if (!swiper.thumbs.swiper) return; + update(); + }); + on('setTransition', (_s, duration) => { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + thumbsSwiper.setTransition(duration); + }); + on('beforeDestroy', () => { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + + if (swiperCreated && thumbsSwiper) { + thumbsSwiper.destroy(); + } + }); + Object.assign(swiper.thumbs, { + init, + update + }); +} + +function freeMode({ + swiper, + extendParams, + emit, + once +}) { + extendParams({ + freeMode: { + enabled: false, + momentum: true, + momentumRatio: 1, + momentumBounce: true, + momentumBounceRatio: 1, + momentumVelocityRatio: 1, + sticky: false, + minimumVelocity: 0.02 + } + }); + + function onTouchMove() { + const { + touchEventsData: data, + touches + } = swiper; // Velocity + + if (data.velocities.length === 0) { + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'startX' : 'startY'], + time: data.touchStartTime + }); + } + + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'], + time: now() + }); + } + + function onTouchEnd({ + currentPos + }) { + const { + params, + $wrapperEl, + rtlTranslate: rtl, + snapGrid, + touchEventsData: data + } = swiper; // Time diff + + const touchEndTime = now(); + const timeDiff = touchEndTime - data.touchStartTime; + + if (currentPos < -swiper.minTranslate()) { + swiper.slideTo(swiper.activeIndex); + return; + } + + if (currentPos > -swiper.maxTranslate()) { + if (swiper.slides.length < snapGrid.length) { + swiper.slideTo(snapGrid.length - 1); + } else { + swiper.slideTo(swiper.slides.length - 1); + } + + return; + } + + if (params.freeMode.momentum) { + if (data.velocities.length > 1) { + const lastMoveEvent = data.velocities.pop(); + const velocityEvent = data.velocities.pop(); + const distance = lastMoveEvent.position - velocityEvent.position; + const time = lastMoveEvent.time - velocityEvent.time; + swiper.velocity = distance / time; + swiper.velocity /= 2; + + if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) { + swiper.velocity = 0; + } // this implies that the user stopped moving a finger then released. + // There would be no events with distance zero, so the last event is stale. + + + if (time > 150 || now() - lastMoveEvent.time > 300) { + swiper.velocity = 0; + } + } else { + swiper.velocity = 0; + } + + swiper.velocity *= params.freeMode.momentumVelocityRatio; + data.velocities.length = 0; + let momentumDuration = 1000 * params.freeMode.momentumRatio; + const momentumDistance = swiper.velocity * momentumDuration; + let newPosition = swiper.translate + momentumDistance; + if (rtl) newPosition = -newPosition; + let doBounce = false; + let afterBouncePosition; + const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio; + let needsLoopFix; + + if (newPosition < swiper.maxTranslate()) { + if (params.freeMode.momentumBounce) { + if (newPosition + swiper.maxTranslate() < -bounceAmount) { + newPosition = swiper.maxTranslate() - bounceAmount; + } + + afterBouncePosition = swiper.maxTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.maxTranslate(); + } + + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (newPosition > swiper.minTranslate()) { + if (params.freeMode.momentumBounce) { + if (newPosition - swiper.minTranslate() > bounceAmount) { + newPosition = swiper.minTranslate() + bounceAmount; + } + + afterBouncePosition = swiper.minTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.minTranslate(); + } + + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (params.freeMode.sticky) { + let nextSlide; + + for (let j = 0; j < snapGrid.length; j += 1) { + if (snapGrid[j] > -newPosition) { + nextSlide = j; + break; + } + } + + if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') { + newPosition = snapGrid[nextSlide]; + } else { + newPosition = snapGrid[nextSlide - 1]; + } + + newPosition = -newPosition; + } + + if (needsLoopFix) { + once('transitionEnd', () => { + swiper.loopFix(); + }); + } // Fix duration + + + if (swiper.velocity !== 0) { + if (rtl) { + momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity); + } else { + momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity); + } + + if (params.freeMode.sticky) { + // If freeMode.sticky is active and the user ends a swipe with a slow-velocity + // event, then durations can be 20+ seconds to slide one (or zero!) slides. + // It's easy to see this when simulating touch with mouse events. To fix this, + // limit single-slide swipes to the default slide duration. This also has the + // nice side effect of matching slide speed if the user stopped moving before + // lifting finger or mouse vs. moving slowly before lifting the finger/mouse. + // For faster swipes, also apply limits (albeit higher ones). + const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate); + const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex]; + + if (moveDistance < currentSlideSize) { + momentumDuration = params.speed; + } else if (moveDistance < 2 * currentSlideSize) { + momentumDuration = params.speed * 1.5; + } else { + momentumDuration = params.speed * 2.5; + } + } + } else if (params.freeMode.sticky) { + swiper.slideToClosest(); + return; + } + + if (params.freeMode.momentumBounce && doBounce) { + swiper.updateProgress(afterBouncePosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return; + emit('momentumBounce'); + swiper.setTransition(params.speed); + setTimeout(() => { + swiper.setTranslate(afterBouncePosition); + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + }, 0); + }); + } else if (swiper.velocity) { + emit('_freeModeNoMomentumRelease'); + swiper.updateProgress(newPosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + + if (!swiper.animating) { + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + } + } else { + swiper.updateProgress(newPosition); + } + + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } else if (params.freeMode.sticky) { + swiper.slideToClosest(); + return; + } else if (params.freeMode) { + emit('_freeModeNoMomentumRelease'); + } + + if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) { + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + } + + Object.assign(swiper, { + freeMode: { + onTouchMove, + onTouchEnd + } + }); +} + +function Grid({ + swiper, + extendParams +}) { + extendParams({ + grid: { + rows: 1, + fill: 'column' + } + }); + let slidesNumberEvenToRows; + let slidesPerRow; + let numFullColumns; + + const initSlides = slidesLength => { + const { + slidesPerView + } = swiper.params; + const { + rows, + fill + } = swiper.params.grid; + slidesPerRow = slidesNumberEvenToRows / rows; + numFullColumns = Math.floor(slidesLength / rows); + + if (Math.floor(slidesLength / rows) === slidesLength / rows) { + slidesNumberEvenToRows = slidesLength; + } else { + slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows; + } + + if (slidesPerView !== 'auto' && fill === 'row') { + slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows); + } + }; + + const updateSlide = (i, slide, slidesLength, getDirectionLabel) => { + const { + slidesPerGroup, + spaceBetween + } = swiper.params; + const { + rows, + fill + } = swiper.params.grid; // Set slides order + + let newSlideOrderIndex; + let column; + let row; + + if (fill === 'row' && slidesPerGroup > 1) { + const groupIndex = Math.floor(i / (slidesPerGroup * rows)); + const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex; + const columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup); + row = Math.floor(slideIndexInGroup / columnsInGroup); + column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup; + newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows; + slide.css({ + '-webkit-order': newSlideOrderIndex, + order: newSlideOrderIndex + }); + } else if (fill === 'column') { + column = Math.floor(i / rows); + row = i - column * rows; + + if (column > numFullColumns || column === numFullColumns && row === rows - 1) { + row += 1; + + if (row >= rows) { + row = 0; + column += 1; + } + } + } else { + row = Math.floor(i / slidesPerRow); + column = i - row * slidesPerRow; + } + + slide.css(getDirectionLabel('margin-top'), row !== 0 ? spaceBetween && `${spaceBetween}px` : ''); + }; + + const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => { + const { + spaceBetween, + centeredSlides, + roundLengths + } = swiper.params; + const { + rows + } = swiper.params.grid; + swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows; + swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween; + swiper.$wrapperEl.css({ + [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px` + }); + + if (centeredSlides) { + snapGrid.splice(0, snapGrid.length); + const newSlidesGrid = []; + + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (roundLengths) slidesGridItem = Math.floor(slidesGridItem); + if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem); + } + + snapGrid.push(...newSlidesGrid); + } + }; + + swiper.grid = { + initSlides, + updateSlide, + updateWrapperSize + }; +} + +function appendSlide(slides) { + const swiper = this; + const { + $wrapperEl, + params + } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + } else { + $wrapperEl.append(slides); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } +} + +function prependSlide(slides) { + const swiper = this; + const { + params, + $wrapperEl, + activeIndex + } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + + let newActiveIndex = activeIndex + 1; + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.prepend(slides[i]); + } + + newActiveIndex = activeIndex + slides.length; + } else { + $wrapperEl.prepend(slides); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + swiper.slideTo(newActiveIndex, 0, false); +} + +function addSlide(index, slides) { + const swiper = this; + const { + $wrapperEl, + params, + activeIndex + } = swiper; + let activeIndexBuffer = activeIndex; + + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + + const baseLength = swiper.slides.length; + + if (index <= 0) { + swiper.prependSlide(slides); + return; + } + + if (index >= baseLength) { + swiper.appendSlide(slides); + return; + } + + let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer; + const slidesBuffer = []; + + for (let i = baseLength - 1; i >= index; i -= 1) { + const currentSlide = swiper.slides.eq(i); + currentSlide.remove(); + slidesBuffer.unshift(currentSlide); + } + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + + newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer; + } else { + $wrapperEl.append(slides); + } + + for (let i = 0; i < slidesBuffer.length; i += 1) { + $wrapperEl.append(slidesBuffer[i]); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } +} + +function removeSlide(slidesIndexes) { + const swiper = this; + const { + params, + $wrapperEl, + activeIndex + } = swiper; + let activeIndexBuffer = activeIndex; + + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + + let newActiveIndex = activeIndexBuffer; + let indexToRemove; + + if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) { + for (let i = 0; i < slidesIndexes.length; i += 1) { + indexToRemove = slidesIndexes[i]; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + } + + newActiveIndex = Math.max(newActiveIndex, 0); + } else { + indexToRemove = slidesIndexes; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + newActiveIndex = Math.max(newActiveIndex, 0); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } +} + +function removeAllSlides() { + const swiper = this; + const slidesIndexes = []; + + for (let i = 0; i < swiper.slides.length; i += 1) { + slidesIndexes.push(i); + } + + swiper.removeSlide(slidesIndexes); +} + +function Manipulation({ + swiper +}) { + Object.assign(swiper, { + appendSlide: appendSlide.bind(swiper), + prependSlide: prependSlide.bind(swiper), + addSlide: addSlide.bind(swiper), + removeSlide: removeSlide.bind(swiper), + removeAllSlides: removeAllSlides.bind(swiper) + }); +} + +function effectInit(params) { + const { + effect, + swiper, + on, + setTranslate, + setTransition, + overwriteParams, + perspective + } = params; + on('beforeInit', () => { + if (swiper.params.effect !== effect) return; + swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`); + + if (perspective && perspective()) { + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + } + + const overwriteParamsResult = overwriteParams ? overwriteParams() : {}; + Object.assign(swiper.params, overwriteParamsResult); + Object.assign(swiper.originalParams, overwriteParamsResult); + }); + on('setTranslate', () => { + if (swiper.params.effect !== effect) return; + setTranslate(); + }); + on('setTransition', (_s, duration) => { + if (swiper.params.effect !== effect) return; + setTransition(duration); + }); +} + +function effectTarget(effectParams, $slideEl) { + if (effectParams.transformEl) { + return $slideEl.find(effectParams.transformEl).css({ + 'backface-visibility': 'hidden', + '-webkit-backface-visibility': 'hidden' + }); + } + + return $slideEl; +} + +function effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides +}) { + const { + slides, + activeIndex, + $wrapperEl + } = swiper; + + if (swiper.params.virtualTranslate && duration !== 0) { + let eventTriggered = false; + let $transitionEndTarget; + + if (allSlides) { + $transitionEndTarget = transformEl ? slides.find(transformEl) : slides; + } else { + $transitionEndTarget = transformEl ? slides.eq(activeIndex).find(transformEl) : slides.eq(activeIndex); + } + + $transitionEndTarget.transitionEnd(() => { + if (eventTriggered) return; + if (!swiper || swiper.destroyed) return; + eventTriggered = true; + swiper.animating = false; + const triggerEvents = ['webkitTransitionEnd', 'transitionend']; + + for (let i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } +} + +function EffectFade({ + swiper, + extendParams, + on +}) { + extendParams({ + fadeEffect: { + crossFade: false, + transformEl: null + } + }); + + const setTranslate = () => { + const { + slides + } = swiper; + const params = swiper.params.fadeEffect; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = swiper.slides.eq(i); + const offset = $slideEl[0].swiperSlideOffset; + let tx = -offset; + if (!swiper.params.virtualTranslate) tx -= swiper.translate; + let ty = 0; + + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + } + + const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs($slideEl[0].progress), 0) : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0); + const $targetEl = effectTarget(params, $slideEl); + $targetEl.css({ + opacity: slideOpacity + }).transform(`translate3d(${tx}px, ${ty}px, 0px)`); + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.fadeEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides: true + }); + }; + + effectInit({ + effect: 'fade', + swiper, + on, + setTranslate, + setTransition, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: !swiper.params.cssMode + }) + }); +} + +function EffectCube({ + swiper, + extendParams, + on +}) { + extendParams({ + cubeEffect: { + slideShadows: true, + shadow: true, + shadowOffset: 20, + shadowScale: 0.94 + } + }); + + const setTranslate = () => { + const { + $el, + $wrapperEl, + slides, + width: swiperWidth, + height: swiperHeight, + rtlTranslate: rtl, + size: swiperSize, + browser + } = swiper; + const params = swiper.params.cubeEffect; + const isHorizontal = swiper.isHorizontal(); + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let wrapperRotate = 0; + let $cubeShadowEl; + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow'); + + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
'); + $wrapperEl.append($cubeShadowEl); + } + + $cubeShadowEl.css({ + height: `${swiperWidth}px` + }); + } else { + $cubeShadowEl = $el.find('.swiper-cube-shadow'); + + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
'); + $el.append($cubeShadowEl); + } + } + } + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let slideIndex = i; + + if (isVirtual) { + slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10); + } + + let slideAngle = slideIndex * 90; + let round = Math.floor(slideAngle / 360); + + if (rtl) { + slideAngle = -slideAngle; + round = Math.floor(-slideAngle / 360); + } + + const progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + let tx = 0; + let ty = 0; + let tz = 0; + + if (slideIndex % 4 === 0) { + tx = -round * 4 * swiperSize; + tz = 0; + } else if ((slideIndex - 1) % 4 === 0) { + tx = 0; + tz = -round * 4 * swiperSize; + } else if ((slideIndex - 2) % 4 === 0) { + tx = swiperSize + round * 4 * swiperSize; + tz = swiperSize; + } else if ((slideIndex - 3) % 4 === 0) { + tx = -swiperSize; + tz = 3 * swiperSize + swiperSize * 4 * round; + } + + if (rtl) { + tx = -tx; + } + + if (!isHorizontal) { + ty = tx; + tx = 0; + } + + const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${isHorizontal ? slideAngle : 0}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`; + + if (progress <= 1 && progress > -1) { + wrapperRotate = slideIndex * 90 + progress * 90; + if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90; + } + + $slideEl.transform(transform); + + if (params.slideShadows) { + // Set shadows + let shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + + if (shadowBefore.length === 0) { + shadowBefore = $(`
`); + $slideEl.append(shadowBefore); + } + + if (shadowAfter.length === 0) { + shadowAfter = $(`
`); + $slideEl.append(shadowAfter); + } + + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + } + + $wrapperEl.css({ + '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`, + 'transform-origin': `50% 50% -${swiperSize / 2}px` + }); + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl.transform(`translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`); + } else { + const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90; + const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2); + const scale1 = params.shadowScale; + const scale2 = params.shadowScale / multiplier; + const offset = params.shadowOffset; + $cubeShadowEl.transform(`scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-90deg)`); + } + } + + const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0; + $wrapperEl.transform(`translate3d(0px,0,${zFactor}px) rotateX(${swiper.isHorizontal() ? 0 : wrapperRotate}deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`); + }; + + const setTransition = duration => { + const { + $el, + slides + } = swiper; + slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + + if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) { + $el.find('.swiper-cube-shadow').transition(duration); + } + }; + + effectInit({ + effect: 'cube', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + resistanceRatio: 0, + spaceBetween: 0, + centeredSlides: false, + virtualTranslate: true + }) + }); +} + +function createShadow(params, $slideEl, side) { + const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`; + const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl; + let $shadowEl = $shadowContainer.children(`.${shadowClass}`); + + if (!$shadowEl.length) { + $shadowEl = $(`
`); + $shadowContainer.append($shadowEl); + } + + return $shadowEl; +} + +function EffectFlip({ + swiper, + extendParams, + on +}) { + extendParams({ + flipEffect: { + slideShadows: true, + limitRotation: true, + transformEl: null + } + }); + + const setTranslate = () => { + const { + slides, + rtlTranslate: rtl + } = swiper; + const params = swiper.params.flipEffect; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let progress = $slideEl[0].progress; + + if (swiper.params.flipEffect.limitRotation) { + progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + } + + const offset = $slideEl[0].swiperSlideOffset; + const rotate = -180 * progress; + let rotateY = rotate; + let rotateX = 0; + let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset; + let ty = 0; + + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + rotateX = -rotateY; + rotateY = 0; + } else if (rtl) { + rotateY = -rotateY; + } + + $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length; + + if (params.slideShadows) { + // Set shadows + let shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + + if (shadowBefore.length === 0) { + shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top'); + } + + if (shadowAfter.length === 0) { + shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom'); + } + + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + + const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform); + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.flipEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl + }); + }; + + effectInit({ + effect: 'flip', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: !swiper.params.cssMode + }) + }); +} + +function EffectCoverflow({ + swiper, + extendParams, + on +}) { + extendParams({ + coverflowEffect: { + rotate: 50, + stretch: 0, + depth: 100, + scale: 1, + modifier: 1, + slideShadows: true, + transformEl: null + } + }); + + const setTranslate = () => { + const { + width: swiperWidth, + height: swiperHeight, + slides, + slidesSizesGrid + } = swiper; + const params = swiper.params.coverflowEffect; + const isHorizontal = swiper.isHorizontal(); + const transform = swiper.translate; + const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2; + const rotate = isHorizontal ? params.rotate : -params.rotate; + const translate = params.depth; // Each slide offset from center + + for (let i = 0, length = slides.length; i < length; i += 1) { + const $slideEl = slides.eq(i); + const slideSize = slidesSizesGrid[i]; + const slideOffset = $slideEl[0].swiperSlideOffset; + const offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * params.modifier; + let rotateY = isHorizontal ? rotate * offsetMultiplier : 0; + let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; // var rotateZ = 0 + + let translateZ = -translate * Math.abs(offsetMultiplier); + let stretch = params.stretch; // Allow percentage to make a relative stretch for responsive sliders + + if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) { + stretch = parseFloat(params.stretch) / 100 * slideSize; + } + + let translateY = isHorizontal ? 0 : stretch * offsetMultiplier; + let translateX = isHorizontal ? stretch * offsetMultiplier : 0; + let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier); // Fix for ultra small values + + if (Math.abs(translateX) < 0.001) translateX = 0; + if (Math.abs(translateY) < 0.001) translateY = 0; + if (Math.abs(translateZ) < 0.001) translateZ = 0; + if (Math.abs(rotateY) < 0.001) rotateY = 0; + if (Math.abs(rotateX) < 0.001) rotateX = 0; + if (Math.abs(scale) < 0.001) scale = 0; + const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(slideTransform); + $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; + + if (params.slideShadows) { + // Set shadows + let $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + + if ($shadowBeforeEl.length === 0) { + $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top'); + } + + if ($shadowAfterEl.length === 0) { + $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom'); + } + + if ($shadowBeforeEl.length) $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; + if ($shadowAfterEl.length) $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0; + } + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.coverflowEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + }; + + effectInit({ + effect: 'coverflow', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + watchSlidesProgress: true + }) + }); +} + +function EffectCreative({ + swiper, + extendParams, + on +}) { + extendParams({ + creativeEffect: { + transformEl: null, + limitProgress: 1, + shadowPerProgress: false, + progressMultiplier: 1, + perspective: true, + prev: { + translate: [0, 0, 0], + rotate: [0, 0, 0], + opacity: 1, + scale: 1 + }, + next: { + translate: [0, 0, 0], + rotate: [0, 0, 0], + opacity: 1, + scale: 1 + } + } + }); + + const getTranslateValue = value => { + if (typeof value === 'string') return value; + return `${value}px`; + }; + + const setTranslate = () => { + const { + slides, + $wrapperEl, + slidesSizesGrid + } = swiper; + const params = swiper.params.creativeEffect; + const { + progressMultiplier: multiplier + } = params; + const isCenteredSlides = swiper.params.centeredSlides; + + if (isCenteredSlides) { + const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0; + $wrapperEl.transform(`translateX(calc(50% - ${margin}px))`); + } + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + const slideProgress = $slideEl[0].progress; + const progress = Math.min(Math.max($slideEl[0].progress, -params.limitProgress), params.limitProgress); + let originalProgress = progress; + + if (!isCenteredSlides) { + originalProgress = Math.min(Math.max($slideEl[0].originalProgress, -params.limitProgress), params.limitProgress); + } + + const offset = $slideEl[0].swiperSlideOffset; + const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0]; + const r = [0, 0, 0]; + let custom = false; + + if (!swiper.isHorizontal()) { + t[1] = t[0]; + t[0] = 0; + } + + let data = { + translate: [0, 0, 0], + rotate: [0, 0, 0], + scale: 1, + opacity: 1 + }; + + if (progress < 0) { + data = params.next; + custom = true; + } else if (progress > 0) { + data = params.prev; + custom = true; + } // set translate + + + t.forEach((value, index) => { + t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`; + }); // set rotates + + r.forEach((value, index) => { + r[index] = data.rotate[index] * Math.abs(progress * multiplier); + }); + $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length; + const translateString = t.join(', '); + const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`; + const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`; + const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier; + const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`; // Set shadows + + if (custom && data.shadow || !custom) { + let $shadowEl = $slideEl.children('.swiper-slide-shadow'); + + if ($shadowEl.length === 0 && data.shadow) { + $shadowEl = createShadow(params, $slideEl); + } + + if ($shadowEl.length) { + const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress; + $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1); + } + } + + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform).css({ + opacity: opacityString + }); + + if (data.origin) { + $targetEl.css('transform-origin', data.origin); + } + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.creativeEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides: true + }); + }; + + effectInit({ + effect: 'creative', + swiper, + on, + setTranslate, + setTransition, + perspective: () => swiper.params.creativeEffect.perspective, + overwriteParams: () => ({ + watchSlidesProgress: true, + virtualTranslate: !swiper.params.cssMode + }) + }); +} + +function EffectCards({ + swiper, + extendParams, + on +}) { + extendParams({ + cardsEffect: { + slideShadows: true, + transformEl: null + } + }); + + const setTranslate = () => { + const { + slides, + activeIndex + } = swiper; + const params = swiper.params.cardsEffect; + const { + startTranslate, + isTouched + } = swiper.touchEventsData; + const currentTranslate = swiper.translate; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + const slideProgress = $slideEl[0].progress; + const progress = Math.min(Math.max(slideProgress, -4), 4); + let offset = $slideEl[0].swiperSlideOffset; + + if (swiper.params.centeredSlides && !swiper.params.cssMode) { + swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`); + } + + if (swiper.params.centeredSlides && swiper.params.cssMode) { + offset -= slides[0].swiperSlideOffset; + } + + let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset; + let tY = 0; + const tZ = -100 * Math.abs(progress); + let scale = 1; + let rotate = -2 * progress; + let tXAdd = 8 - Math.abs(progress) * 0.75; + const isSwipeToNext = (i === activeIndex || i === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate; + const isSwipeToPrev = (i === activeIndex || i === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate; + + if (isSwipeToNext || isSwipeToPrev) { + const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5; + rotate += -28 * progress * subProgress; + scale += -0.5 * subProgress; + tXAdd += 96 * subProgress; + tY = `${-25 * subProgress * Math.abs(progress)}%`; + } + + if (progress < 0) { + // next + tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`; + } else if (progress > 0) { + // prev + tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`; + } else { + tX = `${tX}px`; + } + + if (!swiper.isHorizontal()) { + const prevY = tY; + tY = tX; + tX = prevY; + } + + const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`; + const transform = ` + translate3d(${tX}, ${tY}, ${tZ}px) + rotateZ(${rotate}deg) + scale(${scaleString}) + `; + + if (params.slideShadows) { + // Set shadows + let $shadowEl = $slideEl.find('.swiper-slide-shadow'); + + if ($shadowEl.length === 0) { + $shadowEl = createShadow(params, $slideEl); + } + + if ($shadowEl.length) $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1); + } + + $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform); + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.cardsEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl + }); + }; + + effectInit({ + effect: 'cards', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + watchSlidesProgress: true, + virtualTranslate: !swiper.params.cssMode + }) + }); +} + +// Swiper Class +const modules = [Virtual, Keyboard, Mousewheel, Navigation, Pagination, Scrollbar, Parallax, Zoom, Lazy, Controller, A11y, History, HashNavigation, Autoplay, Thumb, freeMode, Grid, Manipulation, EffectFade, EffectCube, EffectFlip, EffectCoverflow, EffectCreative, EffectCards]; +Swiper.use(modules); + +export { Swiper, Swiper as default }; +//# sourceMappingURL=swiper-bundle.esm.browser.js.map diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.js.map b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.js.map new file mode 100644 index 0000000..3874fe9 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swiper-bundle.esm.browser.js.map","sources":["../node_modules/ssr-window/ssr-window.esm.js","../node_modules/dom7/dom7.esm.js","../src/shared/dom.js","../src/shared/utils.js","../src/shared/get-support.js","../src/shared/get-device.js","../src/shared/get-browser.js","../src/core/modules/resize/resize.js","../src/core/modules/observer/observer.js","../src/core/events-emitter.js","../src/core/update/updateSize.js","../src/core/update/updateSlides.js","../src/core/update/updateAutoHeight.js","../src/core/update/updateSlidesOffset.js","../src/core/update/updateSlidesProgress.js","../src/core/update/updateProgress.js","../src/core/update/updateSlidesClasses.js","../src/core/update/updateActiveIndex.js","../src/core/update/updateClickedSlide.js","../src/core/update/index.js","../src/core/translate/getTranslate.js","../src/core/translate/setTranslate.js","../src/core/translate/minTranslate.js","../src/core/translate/maxTranslate.js","../src/core/translate/translateTo.js","../src/core/translate/index.js","../src/core/transition/setTransition.js","../src/core/transition/transitionEmit.js","../src/core/transition/transitionStart.js","../src/core/transition/transitionEnd.js","../src/core/transition/index.js","../src/core/slide/slideTo.js","../src/core/slide/slideToLoop.js","../src/core/slide/slideNext.js","../src/core/slide/slidePrev.js","../src/core/slide/slideReset.js","../src/core/slide/slideToClosest.js","../src/core/slide/slideToClickedSlide.js","../src/core/slide/index.js","../src/core/loop/loopCreate.js","../src/core/loop/loopFix.js","../src/core/loop/loopDestroy.js","../src/core/loop/index.js","../src/core/grab-cursor/setGrabCursor.js","../src/core/grab-cursor/unsetGrabCursor.js","../src/core/grab-cursor/index.js","../src/core/events/onTouchStart.js","../src/core/events/onTouchMove.js","../src/core/events/onTouchEnd.js","../src/core/events/onResize.js","../src/core/events/onClick.js","../src/core/events/onScroll.js","../src/core/events/index.js","../src/core/breakpoints/setBreakpoint.js","../src/core/breakpoints/getBreakpoint.js","../src/core/breakpoints/index.js","../src/core/classes/addClasses.js","../src/core/classes/removeClasses.js","../src/core/classes/index.js","../src/core/images/loadImage.js","../src/core/images/preloadImages.js","../src/core/images/index.js","../src/core/check-overflow/index.js","../src/core/defaults.js","../src/core/moduleExtendParams.js","../src/core/core.js","../src/modules/virtual/virtual.js","../src/modules/keyboard/keyboard.js","../src/modules/mousewheel/mousewheel.js","../src/shared/create-element-if-not-defined.js","../src/modules/navigation/navigation.js","../src/shared/classes-to-selector.js","../src/modules/pagination/pagination.js","../src/modules/scrollbar/scrollbar.js","../src/modules/parallax/parallax.js","../src/modules/zoom/zoom.js","../src/modules/lazy/lazy.js","../src/modules/controller/controller.js","../src/modules/a11y/a11y.js","../src/modules/history/history.js","../src/modules/hash-navigation/hash-navigation.js","../src/modules/autoplay/autoplay.js","../src/modules/thumbs/thumbs.js","../src/modules/free-mode/free-mode.js","../src/modules/grid/grid.js","../src/modules/manipulation/methods/appendSlide.js","../src/modules/manipulation/methods/prependSlide.js","../src/modules/manipulation/methods/addSlide.js","../src/modules/manipulation/methods/removeSlide.js","../src/modules/manipulation/methods/removeAllSlides.js","../src/modules/manipulation/manipulation.js","../src/shared/effect-init.js","../src/shared/effect-target.js","../src/shared/effect-virtual-transition-end.js","../src/modules/effect-fade/effect-fade.js","../src/modules/effect-cube/effect-cube.js","../src/shared/create-shadow.js","../src/modules/effect-flip/effect-flip.js","../src/modules/effect-coverflow/effect-coverflow.js","../src/modules/effect-creative/effect-creative.js","../src/modules/effect-cards/effect-cards.js","../src/swiper.js"],"sourcesContent":["/**\n * SSR Window 4.0.1\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n return (obj !== null &&\n typeof obj === 'object' &&\n 'constructor' in obj &&\n obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n Object.keys(src).forEach((key) => {\n if (typeof target[key] === 'undefined')\n target[key] = src[key];\n else if (isObject(src[key]) &&\n isObject(target[key]) &&\n Object.keys(src[key]).length > 0) {\n extend(target[key], src[key]);\n }\n });\n}\n\nconst ssrDocument = {\n body: {},\n addEventListener() { },\n removeEventListener() { },\n activeElement: {\n blur() { },\n nodeName: '',\n },\n querySelector() {\n return null;\n },\n querySelectorAll() {\n return [];\n },\n getElementById() {\n return null;\n },\n createEvent() {\n return {\n initEvent() { },\n };\n },\n createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute() { },\n getElementsByTagName() {\n return [];\n },\n };\n },\n createElementNS() {\n return {};\n },\n importNode() {\n return null;\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n};\nfunction getDocument() {\n const doc = typeof document !== 'undefined' ? document : {};\n extend(doc, ssrDocument);\n return doc;\n}\n\nconst ssrWindow = {\n document: ssrDocument,\n navigator: {\n userAgent: '',\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n history: {\n replaceState() { },\n pushState() { },\n go() { },\n back() { },\n },\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener() { },\n removeEventListener() { },\n getComputedStyle() {\n return {\n getPropertyValue() {\n return '';\n },\n };\n },\n Image() { },\n Date() { },\n screen: {},\n setTimeout() { },\n clearTimeout() { },\n matchMedia() {\n return {};\n },\n requestAnimationFrame(callback) {\n if (typeof setTimeout === 'undefined') {\n callback();\n return null;\n }\n return setTimeout(callback, 0);\n },\n cancelAnimationFrame(id) {\n if (typeof setTimeout === 'undefined') {\n return;\n }\n clearTimeout(id);\n },\n};\nfunction getWindow() {\n const win = typeof window !== 'undefined' ? window : {};\n extend(win, ssrWindow);\n return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.1\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n const proto = obj.__proto__;\n Object.defineProperty(obj, '__proto__', {\n get() {\n return proto;\n },\n\n set(value) {\n proto.__proto__ = value;\n }\n\n });\n}\n\nclass Dom7 extends Array {\n constructor(items) {\n super(...(items || []));\n makeReactive(this);\n }\n\n}\n\nfunction arrayFlat(arr = []) {\n const res = [];\n arr.forEach(el => {\n if (Array.isArray(el)) {\n res.push(...arrayFlat(el));\n } else {\n res.push(el);\n }\n });\n return res;\n}\nfunction arrayFilter(arr, callback) {\n return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n const uniqueArray = [];\n\n for (let i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n }\n\n return uniqueArray;\n}\nfunction toCamelCase(string) {\n return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n if (typeof selector !== 'string') {\n return [selector];\n }\n\n const a = [];\n const res = context.querySelectorAll(selector);\n\n for (let i = 0; i < res.length; i += 1) {\n a.push(res[i]);\n }\n\n return a;\n}\n\nfunction $(selector, context) {\n const window = getWindow();\n const document = getDocument();\n let arr = [];\n\n if (!context && selector instanceof Dom7) {\n return selector;\n }\n\n if (!selector) {\n return new Dom7(arr);\n }\n\n if (typeof selector === 'string') {\n const html = selector.trim();\n\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n let toCreate = 'div';\n if (html.indexOf(' c.split(' ')));\n this.forEach(el => {\n el.classList.add(...classNames);\n });\n return this;\n}\n\nfunction removeClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n el.classList.remove(...classNames);\n });\n return this;\n}\n\nfunction toggleClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n classNames.forEach(className => {\n el.classList.toggle(className);\n });\n });\n}\n\nfunction hasClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n return arrayFilter(this, el => {\n return classNames.filter(className => el.classList.contains(className)).length > 0;\n }).length > 0;\n}\n\nfunction attr(attrs, value) {\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) return this[0].getAttribute(attrs);\n return undefined;\n } // Set attrs\n\n\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n for (const attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n\n return this;\n}\n\nfunction removeAttr(attr) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n\n return this;\n}\n\nfunction prop(props, value) {\n if (arguments.length === 1 && typeof props === 'string') {\n // Get prop\n if (this[0]) return this[0][props];\n } else {\n // Set props\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i][props] = value;\n } else {\n // Object\n for (const propName in props) {\n this[i][propName] = props[propName];\n }\n }\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction data(key, value) {\n let el;\n\n if (typeof value === 'undefined') {\n el = this[0];\n if (!el) return undefined; // Get value\n\n if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n return el.dom7ElementDataStorage[key];\n }\n\n const dataKey = el.getAttribute(`data-${key}`);\n\n if (dataKey) {\n return dataKey;\n }\n\n return undefined;\n } // Set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n el.dom7ElementDataStorage[key] = value;\n }\n\n return this;\n}\n\nfunction removeData(key) {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n el.dom7ElementDataStorage[key] = null;\n delete el.dom7ElementDataStorage[key];\n }\n }\n}\n\nfunction dataset() {\n const el = this[0];\n if (!el) return undefined;\n const dataset = {}; // eslint-disable-line\n\n if (el.dataset) {\n for (const dataKey in el.dataset) {\n dataset[dataKey] = el.dataset[dataKey];\n }\n } else {\n for (let i = 0; i < el.attributes.length; i += 1) {\n const attr = el.attributes[i];\n\n if (attr.name.indexOf('data-') >= 0) {\n dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n }\n }\n }\n\n for (const key in dataset) {\n if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n }\n\n return dataset;\n}\n\nfunction val(value) {\n if (typeof value === 'undefined') {\n // get value\n const el = this[0];\n if (!el) return undefined;\n\n if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n const values = [];\n\n for (let i = 0; i < el.selectedOptions.length; i += 1) {\n values.push(el.selectedOptions[i].value);\n }\n\n return values;\n }\n\n return el.value;\n } // set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n for (let j = 0; j < el.options.length; j += 1) {\n el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n }\n } else {\n el.value = value;\n }\n }\n\n return this;\n}\n\nfunction value(value) {\n return this.val(value);\n}\n\nfunction transform(transform) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transform = transform;\n }\n\n return this;\n}\n\nfunction transition(duration) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n }\n\n return this;\n}\n\nfunction on(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n\n function handleLiveEvent(e) {\n const target = e.target;\n if (!target) return;\n const eventData = e.target.dom7EventData || [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n const parents = $(target).parents(); // eslint-disable-line\n\n for (let k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n }\n }\n }\n\n function handleEvent(e) {\n const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n listener.apply(this, eventData);\n }\n\n const events = eventType.split(' ');\n let j;\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7Listeners) el.dom7Listeners = {};\n if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n el.dom7Listeners[event].push({\n listener,\n proxyListener: handleEvent\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n el.dom7LiveListeners[event].push({\n listener,\n proxyListener: handleLiveEvent\n });\n el.addEventListener(event, handleLiveEvent, capture);\n }\n }\n }\n\n return this;\n}\n\nfunction off(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n const events = eventType.split(' ');\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n let handlers;\n\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n\n if (handlers && handlers.length) {\n for (let k = handlers.length - 1; k >= 0; k -= 1) {\n const handler = handlers[k];\n\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n\n return this;\n}\n\nfunction once(...args) {\n const dom = this;\n let [eventName, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventName, listener, capture] = args;\n targetSelector = undefined;\n }\n\n function onceHandler(...eventArgs) {\n listener.apply(this, eventArgs);\n dom.off(eventName, targetSelector, onceHandler, capture);\n\n if (onceHandler.dom7proxy) {\n delete onceHandler.dom7proxy;\n }\n }\n\n onceHandler.dom7proxy = listener;\n return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n const window = getWindow();\n const events = args[0].split(' ');\n const eventData = args[1];\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n\n if (window.CustomEvent) {\n const evt = new window.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true\n });\n el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n }\n\n return this;\n}\n\nfunction transitionEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('transitionend', fireCallBack);\n }\n\n if (callback) {\n dom.on('transitionend', fireCallBack);\n }\n\n return this;\n}\n\nfunction animationEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('animationend', fireCallBack);\n }\n\n if (callback) {\n dom.on('animationend', fireCallBack);\n }\n\n return this;\n}\n\nfunction width() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerWidth;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('width'));\n }\n\n return null;\n}\n\nfunction outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n }\n\n return this[0].offsetWidth;\n }\n\n return null;\n}\n\nfunction height() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerHeight;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('height'));\n }\n\n return null;\n}\n\nfunction outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n }\n\n return this[0].offsetHeight;\n }\n\n return null;\n}\n\nfunction offset() {\n if (this.length > 0) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n const box = el.getBoundingClientRect();\n const body = document.body;\n const clientTop = el.clientTop || body.clientTop || 0;\n const clientLeft = el.clientLeft || body.clientLeft || 0;\n const scrollTop = el === window ? window.scrollY : el.scrollTop;\n const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n return {\n top: box.top + scrollTop - clientTop,\n left: box.left + scrollLeft - clientLeft\n };\n }\n\n return null;\n}\n\nfunction hide() {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.display = 'none';\n }\n\n return this;\n}\n\nfunction show() {\n const window = getWindow();\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.style.display === 'none') {\n el.style.display = '';\n }\n\n if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n // Still not visible\n el.style.display = 'block';\n }\n }\n\n return this;\n}\n\nfunction styles() {\n const window = getWindow();\n if (this[0]) return window.getComputedStyle(this[0], null);\n return {};\n}\n\nfunction css(props, value) {\n const window = getWindow();\n let i;\n\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n // .css('width')\n if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n } else {\n // .css({ width: '100px' })\n for (i = 0; i < this.length; i += 1) {\n for (const prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n\n return this;\n }\n }\n\n if (arguments.length === 2 && typeof props === 'string') {\n // .css('width', '100px')\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction each(callback) {\n if (!callback) return this;\n this.forEach((el, index) => {\n callback.apply(el, [el, index]);\n });\n return this;\n}\n\nfunction filter(callback) {\n const result = arrayFilter(this, callback);\n return $(result);\n}\n\nfunction html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n\n return this;\n}\n\nfunction text(text) {\n if (typeof text === 'undefined') {\n return this[0] ? this[0].textContent.trim() : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n\n return this;\n}\n\nfunction is(selector) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n let compareWith;\n let i;\n if (!el || typeof selector === 'undefined') return false;\n\n if (typeof selector === 'string') {\n if (el.matches) return el.matches(selector);\n if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n compareWith = $(selector);\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n if (selector === document) {\n return el === document;\n }\n\n if (selector === window) {\n return el === window;\n }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n return false;\n}\n\nfunction index() {\n let child = this[0];\n let i;\n\n if (child) {\n i = 0; // eslint-disable-next-line\n\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) i += 1;\n }\n\n return i;\n }\n\n return undefined;\n}\n\nfunction eq(index) {\n if (typeof index === 'undefined') return this;\n const length = this.length;\n\n if (index > length - 1) {\n return $([]);\n }\n\n if (index < 0) {\n const returnIndex = length + index;\n if (returnIndex < 0) return $([]);\n return $([this[returnIndex]]);\n }\n\n return $([this[index]]);\n}\n\nfunction append(...els) {\n let newChild;\n const document = getDocument();\n\n for (let k = 0; k < els.length; k += 1) {\n newChild = els[k];\n\n for (let i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (let j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n}\n\nfunction appendTo(parent) {\n $(parent).append(this);\n return this;\n}\n\nfunction prepend(newChild) {\n const document = getDocument();\n let i;\n let j;\n\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n\n return this;\n}\n\nfunction prependTo(parent) {\n $(parent).prepend(this);\n return this;\n}\n\nfunction insertBefore(selector) {\n const before = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (before.length === 1) {\n before[0].parentNode.insertBefore(this[i], before[0]);\n } else if (before.length > 1) {\n for (let j = 0; j < before.length; j += 1) {\n before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n }\n }\n }\n}\n\nfunction insertAfter(selector) {\n const after = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (after.length === 1) {\n after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n } else if (after.length > 1) {\n for (let j = 0; j < after.length; j += 1) {\n after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n }\n }\n }\n}\n\nfunction next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n return $([this[0].nextElementSibling]);\n }\n\n return $([]);\n }\n\n if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction nextAll(selector) {\n const nextEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.nextElementSibling) {\n const next = el.nextElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(next).is(selector)) nextEls.push(next);\n } else nextEls.push(next);\n\n el = next;\n }\n\n return $(nextEls);\n}\n\nfunction prev(selector) {\n if (this.length > 0) {\n const el = this[0];\n\n if (selector) {\n if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n return $([el.previousElementSibling]);\n }\n\n return $([]);\n }\n\n if (el.previousElementSibling) return $([el.previousElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction prevAll(selector) {\n const prevEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.previousElementSibling) {\n const prev = el.previousElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(prev).is(selector)) prevEls.push(prev);\n } else prevEls.push(prev);\n\n el = prev;\n }\n\n return $(prevEls);\n}\n\nfunction siblings(selector) {\n return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n\n return $(parents);\n}\n\nfunction parents(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n let parent = this[i].parentNode; // eslint-disable-line\n\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) parents.push(parent);\n } else {\n parents.push(parent);\n }\n\n parent = parent.parentNode;\n }\n }\n\n return $(parents);\n}\n\nfunction closest(selector) {\n let closest = this; // eslint-disable-line\n\n if (typeof selector === 'undefined') {\n return $([]);\n }\n\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n\n return closest;\n}\n\nfunction find(selector) {\n const foundElements = [];\n\n for (let i = 0; i < this.length; i += 1) {\n const found = this[i].querySelectorAll(selector);\n\n for (let j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n\n return $(foundElements);\n}\n\nfunction children(selector) {\n const children = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n const childNodes = this[i].children;\n\n for (let j = 0; j < childNodes.length; j += 1) {\n if (!selector || $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n\n return $(children);\n}\n\nfunction remove() {\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n }\n\n return this;\n}\n\nfunction detach() {\n return this.remove();\n}\n\nfunction add(...els) {\n const dom = this;\n let i;\n let j;\n\n for (i = 0; i < els.length; i += 1) {\n const toAdd = $(els[i]);\n\n for (j = 0; j < toAdd.length; j += 1) {\n dom.push(toAdd[j]);\n }\n }\n\n return dom;\n}\n\nfunction empty() {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.nodeType === 1) {\n for (let j = 0; j < el.childNodes.length; j += 1) {\n if (el.childNodes[j].parentNode) {\n el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n }\n }\n\n el.textContent = '';\n }\n }\n\n return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n const window = getWindow();\n let [left, top, duration, easing, callback] = args;\n\n if (args.length === 4 && typeof easing === 'function') {\n callback = easing;\n [left, top, duration, callback, easing] = args;\n }\n\n if (typeof easing === 'undefined') easing = 'swing';\n return this.each(function animate() {\n const el = this;\n let currentTop;\n let currentLeft;\n let maxTop;\n let maxLeft;\n let newTop;\n let newLeft;\n let scrollTop; // eslint-disable-line\n\n let scrollLeft; // eslint-disable-line\n\n let animateTop = top > 0 || top === 0;\n let animateLeft = left > 0 || left === 0;\n\n if (typeof easing === 'undefined') {\n easing = 'swing';\n }\n\n if (animateTop) {\n currentTop = el.scrollTop;\n\n if (!duration) {\n el.scrollTop = top;\n }\n }\n\n if (animateLeft) {\n currentLeft = el.scrollLeft;\n\n if (!duration) {\n el.scrollLeft = left;\n }\n }\n\n if (!duration) return;\n\n if (animateTop) {\n maxTop = el.scrollHeight - el.offsetHeight;\n newTop = Math.max(Math.min(top, maxTop), 0);\n }\n\n if (animateLeft) {\n maxLeft = el.scrollWidth - el.offsetWidth;\n newLeft = Math.max(Math.min(left, maxLeft), 0);\n }\n\n let startTime = null;\n if (animateTop && newTop === currentTop) animateTop = false;\n if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n function render(time = new Date().getTime()) {\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n let done;\n if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (done) {\n if (callback) callback();\n return;\n }\n\n if (animateTop) el.scrollTop = scrollTop;\n if (animateLeft) el.scrollLeft = scrollLeft;\n window.requestAnimationFrame(render);\n }\n\n window.requestAnimationFrame(render);\n });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n let [top, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [top, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof top === 'undefined') {\n if (dom.length > 0) return dom[0].scrollTop;\n return null;\n }\n\n return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n let [left, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [left, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof left === 'undefined') {\n if (dom.length > 0) return dom[0].scrollLeft;\n return null;\n }\n\n return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n const window = getWindow();\n const els = this;\n const a = {\n props: Object.assign({}, initialProps),\n params: Object.assign({\n duration: 300,\n easing: 'swing' // or 'linear'\n\n /* Callbacks\n begin(elements)\n complete(elements)\n progress(elements, complete, remaining, start, tweenValue)\n */\n\n }, initialParams),\n elements: els,\n animating: false,\n que: [],\n\n easingProgress(easing, progress) {\n if (easing === 'swing') {\n return 0.5 - Math.cos(progress * Math.PI) / 2;\n }\n\n if (typeof easing === 'function') {\n return easing(progress);\n }\n\n return progress;\n },\n\n stop() {\n if (a.frameId) {\n window.cancelAnimationFrame(a.frameId);\n }\n\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n a.que = [];\n },\n\n done(complete) {\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n if (complete) complete(els);\n\n if (a.que.length > 0) {\n const que = a.que.shift();\n a.animate(que[0], que[1]);\n }\n },\n\n animate(props, params) {\n if (a.animating) {\n a.que.push([props, params]);\n return a;\n }\n\n const elements = []; // Define & Cache Initials & Units\n\n a.elements.each((el, index) => {\n let initialFullValue;\n let initialValue;\n let unit;\n let finalValue;\n let finalFullValue;\n if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n elements[index] = {\n container: el\n };\n Object.keys(props).forEach(prop => {\n initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n initialValue = parseFloat(initialFullValue);\n unit = initialFullValue.replace(initialValue, '');\n finalValue = parseFloat(props[prop]);\n finalFullValue = props[prop] + unit;\n elements[index][prop] = {\n initialFullValue,\n initialValue,\n unit,\n finalValue,\n finalFullValue,\n currentValue: initialValue\n };\n });\n });\n let startTime = null;\n let time;\n let elementsDone = 0;\n let propsDone = 0;\n let done;\n let began = false;\n a.animating = true;\n\n function render() {\n time = new Date().getTime();\n let progress;\n let easeProgress; // let el;\n\n if (!began) {\n began = true;\n if (params.begin) params.begin(els);\n }\n\n if (startTime === null) {\n startTime = time;\n }\n\n if (params.progress) {\n // eslint-disable-next-line\n params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n }\n\n elements.forEach(element => {\n const el = element;\n if (done || el.done) return;\n Object.keys(props).forEach(prop => {\n if (done || el.done) return;\n progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n easeProgress = a.easingProgress(params.easing, progress);\n const {\n initialValue,\n finalValue,\n unit\n } = el[prop];\n el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n const currentValue = el[prop].currentValue;\n\n if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n el.container.style[prop] = finalValue + unit;\n propsDone += 1;\n\n if (propsDone === Object.keys(props).length) {\n el.done = true;\n elementsDone += 1;\n }\n\n if (elementsDone === elements.length) {\n done = true;\n }\n }\n\n if (done) {\n a.done(params.complete);\n return;\n }\n\n el.container.style[prop] = currentValue + unit;\n });\n });\n if (done) return; // Then call\n\n a.frameId = window.requestAnimationFrame(render);\n }\n\n a.frameId = window.requestAnimationFrame(render);\n return a;\n }\n\n };\n\n if (a.elements.length === 0) {\n return els;\n }\n\n let animateInstance;\n\n for (let i = 0; i < a.elements.length; i += 1) {\n if (a.elements[i].dom7AnimateInstance) {\n animateInstance = a.elements[i].dom7AnimateInstance;\n } else a.elements[i].dom7AnimateInstance = a;\n }\n\n if (!animateInstance) {\n animateInstance = a;\n }\n\n if (initialProps === 'stop') {\n animateInstance.stop();\n } else {\n animateInstance.animate(a.props, a.params);\n }\n\n return els;\n}\n\nfunction stop() {\n const els = this;\n\n for (let i = 0; i < els.length; i += 1) {\n if (els[i].dom7AnimateInstance) {\n els[i].dom7AnimateInstance.stop();\n }\n }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n function eventHandler(...args) {\n if (typeof args[0] === 'undefined') {\n for (let i = 0; i < this.length; i += 1) {\n if (noTrigger.indexOf(name) < 0) {\n if (name in this[i]) this[i][name]();else {\n $(this[i]).trigger(name);\n }\n }\n }\n\n return this;\n }\n\n return this.on(name, ...args);\n }\n\n return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import {\n $,\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n} from 'dom7';\n\nconst Methods = {\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n};\n\nObject.keys(Methods).forEach((methodName) => {\n Object.defineProperty($.fn, methodName, { value: Methods[methodName], writable: true });\n});\n\nexport default $;\n","import { getWindow } from 'ssr-window';\n\nfunction deleteProps(obj) {\n const object = obj;\n Object.keys(object).forEach((key) => {\n try {\n object[key] = null;\n } catch (e) {\n // no getter for object\n }\n try {\n delete object[key];\n } catch (e) {\n // something got wrong\n }\n });\n}\nfunction nextTick(callback, delay = 0) {\n return setTimeout(callback, delay);\n}\nfunction now() {\n return Date.now();\n}\nfunction getComputedStyle(el) {\n const window = getWindow();\n let style;\n if (window.getComputedStyle) {\n style = window.getComputedStyle(el, null);\n }\n if (!style && el.currentStyle) {\n style = el.currentStyle;\n }\n if (!style) {\n style = el.style;\n }\n\n return style;\n}\nfunction getTranslate(el, axis = 'x') {\n const window = getWindow();\n let matrix;\n let curTransform;\n let transformMatrix;\n\n const curStyle = getComputedStyle(el, null);\n\n if (window.WebKitCSSMatrix) {\n curTransform = curStyle.transform || curStyle.webkitTransform;\n if (curTransform.split(',').length > 6) {\n curTransform = curTransform\n .split(', ')\n .map((a) => a.replace(',', '.'))\n .join(', ');\n }\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n } else {\n transformMatrix =\n curStyle.MozTransform ||\n curStyle.OTransform ||\n curStyle.MsTransform ||\n curStyle.msTransform ||\n curStyle.transform ||\n curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n\n if (axis === 'x') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[4]);\n }\n if (axis === 'y') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[5]);\n }\n return curTransform || 0;\n}\nfunction isObject(o) {\n return (\n typeof o === 'object' &&\n o !== null &&\n o.constructor &&\n Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n );\n}\nfunction isNode(node) {\n // eslint-disable-next-line\n if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n return node instanceof HTMLElement;\n }\n return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend(...args) {\n const to = Object(args[0]);\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n for (let i = 1; i < args.length; i += 1) {\n const nextSource = args[i];\n if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0);\n for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n const nextKey = keysArray[nextIndex];\n const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({ swiper, targetPosition, side }) {\n const window = getWindow();\n const startPosition = -swiper.translate;\n let startTime = null;\n let time;\n const duration = swiper.params.speed;\n\n swiper.wrapperEl.style.scrollSnapType = 'none';\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n\n const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n const isOutOfBound = (current, target) => {\n return (dir === 'next' && current >= target) || (dir === 'prev' && current <= target);\n };\n\n const animate = () => {\n time = new Date().getTime();\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n if (isOutOfBound(currentPosition, targetPosition)) {\n currentPosition = targetPosition;\n }\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n if (isOutOfBound(currentPosition, targetPosition)) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.scrollSnapType = '';\n setTimeout(() => {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n });\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n return;\n }\n swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n };\n animate();\n}\n\nexport {\n animateCSSModeScroll,\n deleteProps,\n nextTick,\n now,\n getTranslate,\n isObject,\n extend,\n getComputedStyle,\n setCSSProperty,\n};\n","import { getWindow, getDocument } from 'ssr-window';\n\nlet support;\n\nfunction calcSupport() {\n const window = getWindow();\n const document = getDocument();\n\n return {\n smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n\n touch: !!(\n 'ontouchstart' in window ||\n (window.DocumentTouch && document instanceof window.DocumentTouch)\n ),\n\n passiveListener: (function checkPassiveListener() {\n let supportsPassive = false;\n try {\n const opts = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line\n get() {\n supportsPassive = true;\n },\n });\n window.addEventListener('testPassiveListener', null, opts);\n } catch (e) {\n // No support\n }\n return supportsPassive;\n })(),\n\n gestures: (function checkGestures() {\n return 'ongesturestart' in window;\n })(),\n };\n}\n\nfunction getSupport() {\n if (!support) {\n support = calcSupport();\n }\n return support;\n}\n\nexport { getSupport };\n","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\n\nlet deviceCached;\n\nfunction calcDevice({ userAgent } = {}) {\n const support = getSupport();\n const window = getWindow();\n const platform = window.navigator.platform;\n const ua = userAgent || window.navigator.userAgent;\n\n const device = {\n ios: false,\n android: false,\n };\n\n const screenWidth = window.screen.width;\n const screenHeight = window.screen.height;\n\n const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n const windows = platform === 'Win32';\n let macos = platform === 'MacIntel';\n\n // iPadOs 13 fix\n const iPadScreens = [\n '1024x1366',\n '1366x1024',\n '834x1194',\n '1194x834',\n '834x1112',\n '1112x834',\n '768x1024',\n '1024x768',\n '820x1180',\n '1180x820',\n '810x1080',\n '1080x810',\n ];\n if (\n !ipad &&\n macos &&\n support.touch &&\n iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0\n ) {\n ipad = ua.match(/(Version)\\/([\\d.]+)/);\n if (!ipad) ipad = [0, 1, '13_0_0'];\n macos = false;\n }\n\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.android = true;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n\n // Export object\n return device;\n}\n\nfunction getDevice(overrides = {}) {\n if (!deviceCached) {\n deviceCached = calcDevice(overrides);\n }\n return deviceCached;\n}\n\nexport { getDevice };\n","import { getWindow } from 'ssr-window';\n\nlet browser;\n\nfunction calcBrowser() {\n const window = getWindow();\n function isSafari() {\n const ua = window.navigator.userAgent.toLowerCase();\n return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n }\n return {\n isSafari: isSafari(),\n isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),\n };\n}\n\nfunction getBrowser() {\n if (!browser) {\n browser = calcBrowser();\n }\n return browser;\n}\n\nexport { getBrowser };\n","import { getWindow } from 'ssr-window';\n\nexport default function Resize({ swiper, on, emit }) {\n const window = getWindow();\n let observer = null;\n\n const resizeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('beforeResize');\n emit('resize');\n };\n\n const createObserver = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n observer = new ResizeObserver((entries) => {\n const { width, height } = swiper;\n let newWidth = width;\n let newHeight = height;\n entries.forEach(({ contentBoxSize, contentRect, target }) => {\n if (target && target !== swiper.el) return;\n newWidth = contentRect\n ? contentRect.width\n : (contentBoxSize[0] || contentBoxSize).inlineSize;\n newHeight = contentRect\n ? contentRect.height\n : (contentBoxSize[0] || contentBoxSize).blockSize;\n });\n if (newWidth !== width || newHeight !== height) {\n resizeHandler();\n }\n });\n observer.observe(swiper.el);\n };\n\n const removeObserver = () => {\n if (observer && observer.unobserve && swiper.el) {\n observer.unobserve(swiper.el);\n observer = null;\n }\n };\n\n const orientationChangeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('orientationchange');\n };\n\n on('init', () => {\n if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n createObserver();\n return;\n }\n window.addEventListener('resize', resizeHandler);\n window.addEventListener('orientationchange', orientationChangeHandler);\n });\n\n on('destroy', () => {\n removeObserver();\n window.removeEventListener('resize', resizeHandler);\n window.removeEventListener('orientationchange', orientationChangeHandler);\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Observer({ swiper, extendParams, on, emit }) {\n const observers = [];\n const window = getWindow();\n const attach = (target, options = {}) => {\n const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n const observer = new ObserverFunc((mutations) => {\n // The observerUpdate event should only be triggered\n // once despite the number of mutations. Additional\n // triggers are redundant and are very costly\n if (mutations.length === 1) {\n emit('observerUpdate', mutations[0]);\n return;\n }\n const observerUpdate = function observerUpdate() {\n emit('observerUpdate', mutations[0]);\n };\n\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(observerUpdate);\n } else {\n window.setTimeout(observerUpdate, 0);\n }\n });\n\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n });\n\n observers.push(observer);\n };\n const init = () => {\n if (!swiper.params.observer) return;\n if (swiper.params.observeParents) {\n const containerParents = swiper.$el.parents();\n for (let i = 0; i < containerParents.length; i += 1) {\n attach(containerParents[i]);\n }\n }\n // Observe container\n attach(swiper.$el[0], {\n childList: swiper.params.observeSlideChildren,\n });\n\n // Observe wrapper\n attach(swiper.$wrapperEl[0], { attributes: false });\n };\n const destroy = () => {\n observers.forEach((observer) => {\n observer.disconnect();\n });\n observers.splice(0, observers.length);\n };\n\n extendParams({\n observer: false,\n observeParents: false,\n observeSlideChildren: false,\n });\n on('init', init);\n on('destroy', destroy);\n}\n","/* eslint-disable no-underscore-dangle */\n\nexport default {\n on(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n events.split(' ').forEach((event) => {\n if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n self.eventsListeners[event][method](handler);\n });\n return self;\n },\n\n once(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n function onceHandler(...args) {\n self.off(events, onceHandler);\n if (onceHandler.__emitterProxy) {\n delete onceHandler.__emitterProxy;\n }\n handler.apply(self, args);\n }\n onceHandler.__emitterProxy = handler;\n return self.on(events, onceHandler, priority);\n },\n\n onAny(handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n if (self.eventsAnyListeners.indexOf(handler) < 0) {\n self.eventsAnyListeners[method](handler);\n }\n return self;\n },\n\n offAny(handler) {\n const self = this;\n if (!self.eventsAnyListeners) return self;\n const index = self.eventsAnyListeners.indexOf(handler);\n if (index >= 0) {\n self.eventsAnyListeners.splice(index, 1);\n }\n return self;\n },\n\n off(events, handler) {\n const self = this;\n if (!self.eventsListeners) return self;\n events.split(' ').forEach((event) => {\n if (typeof handler === 'undefined') {\n self.eventsListeners[event] = [];\n } else if (self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler, index) => {\n if (\n eventHandler === handler ||\n (eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler)\n ) {\n self.eventsListeners[event].splice(index, 1);\n }\n });\n }\n });\n return self;\n },\n\n emit(...args) {\n const self = this;\n if (!self.eventsListeners) return self;\n let events;\n let data;\n let context;\n if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n events = args[0];\n data = args.slice(1, args.length);\n context = self;\n } else {\n events = args[0].events;\n data = args[0].data;\n context = args[0].context || self;\n }\n data.unshift(context);\n const eventsArray = Array.isArray(events) ? events : events.split(' ');\n\n eventsArray.forEach((event) => {\n if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n self.eventsAnyListeners.forEach((eventHandler) => {\n eventHandler.apply(context, [event, ...data]);\n });\n }\n if (self.eventsListeners && self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler) => {\n eventHandler.apply(context, data);\n });\n }\n });\n return self;\n },\n};\n","export default function updateSize() {\n const swiper = this;\n let width;\n let height;\n const $el = swiper.$el;\n if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n width = swiper.params.width;\n } else {\n width = $el[0].clientWidth;\n }\n if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n height = swiper.params.height;\n } else {\n height = $el[0].clientHeight;\n }\n if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n return;\n }\n\n // Subtract paddings\n width =\n width -\n parseInt($el.css('padding-left') || 0, 10) -\n parseInt($el.css('padding-right') || 0, 10);\n height =\n height -\n parseInt($el.css('padding-top') || 0, 10) -\n parseInt($el.css('padding-bottom') || 0, 10);\n\n if (Number.isNaN(width)) width = 0;\n if (Number.isNaN(height)) height = 0;\n\n Object.assign(swiper, {\n width,\n height,\n size: swiper.isHorizontal() ? width : height,\n });\n}\n","import { setCSSProperty } from '../../shared/utils.js';\n\nexport default function updateSlides() {\n const swiper = this;\n function getDirectionLabel(property) {\n if (swiper.isHorizontal()) {\n return property;\n }\n // prettier-ignore\n return {\n 'width': 'height',\n 'margin-top': 'margin-left',\n 'margin-bottom ': 'margin-right',\n 'margin-left': 'margin-top',\n 'margin-right': 'margin-bottom',\n 'padding-left': 'padding-top',\n 'padding-right': 'padding-bottom',\n 'marginRight': 'marginBottom',\n }[property];\n }\n function getDirectionPropertyValue(node, label) {\n return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n }\n\n const params = swiper.params;\n\n const { $wrapperEl, size: swiperSize, rtlTranslate: rtl, wrongRTL } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n let snapGrid = [];\n const slidesGrid = [];\n const slidesSizesGrid = [];\n\n let offsetBefore = params.slidesOffsetBefore;\n if (typeof offsetBefore === 'function') {\n offsetBefore = params.slidesOffsetBefore.call(swiper);\n }\n\n let offsetAfter = params.slidesOffsetAfter;\n if (typeof offsetAfter === 'function') {\n offsetAfter = params.slidesOffsetAfter.call(swiper);\n }\n\n const previousSnapGridLength = swiper.snapGrid.length;\n const previousSlidesGridLength = swiper.slidesGrid.length;\n\n let spaceBetween = params.spaceBetween;\n let slidePosition = -offsetBefore;\n let prevSlideSize = 0;\n let index = 0;\n if (typeof swiperSize === 'undefined') {\n return;\n }\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n }\n\n swiper.virtualSize = -spaceBetween;\n\n // reset margins\n if (rtl) slides.css({ marginLeft: '', marginBottom: '', marginTop: '' });\n else slides.css({ marginRight: '', marginBottom: '', marginTop: '' });\n\n // reset cssMode offsets\n if (params.centeredSlides && params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n }\n\n const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n if (gridEnabled) {\n swiper.grid.initSlides(slidesLength);\n }\n\n // Calc slides\n let slideSize;\n\n const shouldResetSlideSize =\n params.slidesPerView === 'auto' &&\n params.breakpoints &&\n Object.keys(params.breakpoints).filter((key) => {\n return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n }).length > 0;\n\n for (let i = 0; i < slidesLength; i += 1) {\n slideSize = 0;\n const slide = slides.eq(i);\n if (gridEnabled) {\n swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n }\n if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n if (params.slidesPerView === 'auto') {\n if (shouldResetSlideSize) {\n slides[i].style[getDirectionLabel('width')] = ``;\n }\n const slideStyles = getComputedStyle(slide[0]);\n const currentTransform = slide[0].style.transform;\n const currentWebKitTransform = slide[0].style.webkitTransform;\n if (currentTransform) {\n slide[0].style.transform = 'none';\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = 'none';\n }\n if (params.roundLengths) {\n slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n } else {\n // eslint-disable-next-line\n const width = getDirectionPropertyValue(slideStyles, 'width');\n const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n const boxSizing = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing && boxSizing === 'border-box') {\n slideSize = width + marginLeft + marginRight;\n } else {\n const { clientWidth, offsetWidth } = slide[0];\n slideSize =\n width +\n paddingLeft +\n paddingRight +\n marginLeft +\n marginRight +\n (offsetWidth - clientWidth);\n }\n }\n if (currentTransform) {\n slide[0].style.transform = currentTransform;\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = currentWebKitTransform;\n }\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n } else {\n slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n if (slides[i]) {\n slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n }\n }\n if (slides[i]) {\n slides[i].swiperSlideSize = slideSize;\n }\n slidesSizesGrid.push(slideSize);\n\n if (params.centeredSlides) {\n slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n if (prevSlideSize === 0 && i !== 0)\n slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n } else {\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (\n (index - Math.min(swiper.params.slidesPerGroupSkip, index)) %\n swiper.params.slidesPerGroup ===\n 0\n )\n snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n slidePosition = slidePosition + slideSize + spaceBetween;\n }\n\n swiper.virtualSize += slideSize + spaceBetween;\n\n prevSlideSize = slideSize;\n\n index += 1;\n }\n swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` });\n }\n if (params.setWrapperSize) {\n $wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`,\n });\n }\n\n if (gridEnabled) {\n swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n }\n\n // Remove last grid elements depending on width\n if (!params.centeredSlides) {\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n newSlidesGrid.push(slidesGridItem);\n }\n }\n snapGrid = newSlidesGrid;\n\n if (\n Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) >\n 1\n ) {\n snapGrid.push(swiper.virtualSize - swiperSize);\n }\n }\n if (snapGrid.length === 0) snapGrid = [0];\n\n if (params.spaceBetween !== 0) {\n const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n slides\n .filter((_, slideIndex) => {\n if (!params.cssMode) return true;\n if (slideIndex === slides.length - 1) {\n return false;\n }\n return true;\n })\n .css({ [key]: `${spaceBetween}px` });\n }\n\n if (params.centeredSlides && params.centeredSlidesBounds) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n const maxSnap = allSlidesSize - swiperSize;\n snapGrid = snapGrid.map((snap) => {\n if (snap < 0) return -offsetBefore;\n if (snap > maxSnap) return maxSnap + offsetAfter;\n return snap;\n });\n }\n\n if (params.centerInsufficientSlides) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n if (allSlidesSize < swiperSize) {\n const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n snapGrid.forEach((snap, snapIndex) => {\n snapGrid[snapIndex] = snap - allSlidesOffset;\n });\n slidesGrid.forEach((snap, snapIndex) => {\n slidesGrid[snapIndex] = snap + allSlidesOffset;\n });\n }\n }\n\n Object.assign(swiper, {\n slides,\n snapGrid,\n slidesGrid,\n slidesSizesGrid,\n });\n\n if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n setCSSProperty(\n swiper.wrapperEl,\n '--swiper-centered-offset-after',\n `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`,\n );\n const addToSnapGrid = -swiper.snapGrid[0];\n const addToSlidesGrid = -swiper.slidesGrid[0];\n swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid);\n swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid);\n }\n\n if (slidesLength !== previousSlidesLength) {\n swiper.emit('slidesLengthChange');\n }\n if (snapGrid.length !== previousSnapGridLength) {\n if (swiper.params.watchOverflow) swiper.checkOverflow();\n swiper.emit('snapGridLengthChange');\n }\n if (slidesGrid.length !== previousSlidesGridLength) {\n swiper.emit('slidesGridLengthChange');\n }\n\n if (params.watchSlidesProgress) {\n swiper.updateSlidesOffset();\n }\n}\n","export default function updateAutoHeight(speed) {\n const swiper = this;\n const activeSlides = [];\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let newHeight = 0;\n let i;\n if (typeof speed === 'number') {\n swiper.setTransition(speed);\n } else if (speed === true) {\n swiper.setTransition(swiper.params.speed);\n }\n\n const getSlideByIndex = (index) => {\n if (isVirtual) {\n return swiper.slides.filter(\n (el) => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index,\n )[0];\n }\n return swiper.slides.eq(index)[0];\n };\n // Find slides currently in view\n if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n if (swiper.params.centeredSlides) {\n swiper.visibleSlides.each((slide) => {\n activeSlides.push(slide);\n });\n } else {\n for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n const index = swiper.activeIndex + i;\n if (index > swiper.slides.length && !isVirtual) break;\n activeSlides.push(getSlideByIndex(index));\n }\n }\n } else {\n activeSlides.push(getSlideByIndex(swiper.activeIndex));\n }\n\n // Find new height from highest slide in view\n for (i = 0; i < activeSlides.length; i += 1) {\n if (typeof activeSlides[i] !== 'undefined') {\n const height = activeSlides[i].offsetHeight;\n newHeight = height > newHeight ? height : newHeight;\n }\n }\n\n // Update Height\n if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}\n","export default function updateSlidesOffset() {\n const swiper = this;\n const slides = swiper.slides;\n for (let i = 0; i < slides.length; i += 1) {\n slides[i].swiperSlideOffset = swiper.isHorizontal()\n ? slides[i].offsetLeft\n : slides[i].offsetTop;\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateSlidesProgress(translate = (this && this.translate) || 0) {\n const swiper = this;\n const params = swiper.params;\n\n const { slides, rtlTranslate: rtl, snapGrid } = swiper;\n\n if (slides.length === 0) return;\n if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n\n let offsetCenter = -translate;\n if (rtl) offsetCenter = translate;\n\n // Visible Slides\n slides.removeClass(params.slideVisibleClass);\n\n swiper.visibleSlidesIndexes = [];\n swiper.visibleSlides = [];\n\n for (let i = 0; i < slides.length; i += 1) {\n const slide = slides[i];\n let slideOffset = slide.swiperSlideOffset;\n if (params.cssMode && params.centeredSlides) {\n slideOffset -= slides[0].swiperSlideOffset;\n }\n\n const slideProgress =\n (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const originalSlideProgress =\n (offsetCenter -\n snapGrid[0] +\n (params.centeredSlides ? swiper.minTranslate() : 0) -\n slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const slideBefore = -(offsetCenter - slideOffset);\n const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n const isVisible =\n (slideBefore >= 0 && slideBefore < swiper.size - 1) ||\n (slideAfter > 1 && slideAfter <= swiper.size) ||\n (slideBefore <= 0 && slideAfter >= swiper.size);\n if (isVisible) {\n swiper.visibleSlides.push(slide);\n swiper.visibleSlidesIndexes.push(i);\n slides.eq(i).addClass(params.slideVisibleClass);\n }\n slide.progress = rtl ? -slideProgress : slideProgress;\n slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n }\n swiper.visibleSlides = $(swiper.visibleSlides);\n}\n","export default function updateProgress(translate) {\n const swiper = this;\n if (typeof translate === 'undefined') {\n const multiplier = swiper.rtlTranslate ? -1 : 1;\n // eslint-disable-next-line\n translate = (swiper && swiper.translate && swiper.translate * multiplier) || 0;\n }\n const params = swiper.params;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n let { progress, isBeginning, isEnd } = swiper;\n const wasBeginning = isBeginning;\n const wasEnd = isEnd;\n if (translatesDiff === 0) {\n progress = 0;\n isBeginning = true;\n isEnd = true;\n } else {\n progress = (translate - swiper.minTranslate()) / translatesDiff;\n isBeginning = progress <= 0;\n isEnd = progress >= 1;\n }\n Object.assign(swiper, {\n progress,\n isBeginning,\n isEnd,\n });\n\n if (params.watchSlidesProgress || (params.centeredSlides && params.autoHeight))\n swiper.updateSlidesProgress(translate);\n\n if (isBeginning && !wasBeginning) {\n swiper.emit('reachBeginning toEdge');\n }\n if (isEnd && !wasEnd) {\n swiper.emit('reachEnd toEdge');\n }\n if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n swiper.emit('fromEdge');\n }\n\n swiper.emit('progress', progress);\n}\n","export default function updateSlidesClasses() {\n const swiper = this;\n\n const { slides, params, $wrapperEl, activeIndex, realIndex } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n\n slides.removeClass(\n `${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`,\n );\n\n let activeSlide;\n if (isVirtual) {\n activeSlide = swiper.$wrapperEl.find(\n `.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`,\n );\n } else {\n activeSlide = slides.eq(activeIndex);\n }\n\n // Active classes\n activeSlide.addClass(params.slideActiveClass);\n\n if (params.loop) {\n // Duplicate to all looped slides\n if (activeSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n }\n }\n // Next Slide\n let nextSlide = activeSlide\n .nextAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slideNextClass);\n if (params.loop && nextSlide.length === 0) {\n nextSlide = slides.eq(0);\n nextSlide.addClass(params.slideNextClass);\n }\n // Prev Slide\n let prevSlide = activeSlide\n .prevAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slidePrevClass);\n if (params.loop && prevSlide.length === 0) {\n prevSlide = slides.eq(-1);\n prevSlide.addClass(params.slidePrevClass);\n }\n if (params.loop) {\n // Duplicate to all looped slides\n if (nextSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n }\n if (prevSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n }\n }\n swiper.emitSlidesClasses();\n}\n","export default function updateActiveIndex(newActiveIndex) {\n const swiper = this;\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n const {\n slidesGrid,\n snapGrid,\n params,\n activeIndex: previousIndex,\n realIndex: previousRealIndex,\n snapIndex: previousSnapIndex,\n } = swiper;\n let activeIndex = newActiveIndex;\n let snapIndex;\n if (typeof activeIndex === 'undefined') {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n translate >= slidesGrid[i] &&\n translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2\n ) {\n activeIndex = i;\n } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n activeIndex = i + 1;\n }\n } else if (translate >= slidesGrid[i]) {\n activeIndex = i;\n }\n }\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n }\n }\n if (snapGrid.indexOf(translate) >= 0) {\n snapIndex = snapGrid.indexOf(translate);\n } else {\n const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n }\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n if (activeIndex === previousIndex) {\n if (snapIndex !== previousSnapIndex) {\n swiper.snapIndex = snapIndex;\n swiper.emit('snapIndexChange');\n }\n return;\n }\n\n // Get real index\n const realIndex = parseInt(\n swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex,\n 10,\n );\n\n Object.assign(swiper, {\n snapIndex,\n realIndex,\n previousIndex,\n activeIndex,\n });\n swiper.emit('activeIndexChange');\n swiper.emit('snapIndexChange');\n if (previousRealIndex !== realIndex) {\n swiper.emit('realIndexChange');\n }\n if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n swiper.emit('slideChange');\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateClickedSlide(e) {\n const swiper = this;\n const params = swiper.params;\n const slide = $(e.target).closest(`.${params.slideClass}`)[0];\n let slideFound = false;\n let slideIndex;\n\n if (slide) {\n for (let i = 0; i < swiper.slides.length; i += 1) {\n if (swiper.slides[i] === slide) {\n slideFound = true;\n slideIndex = i;\n break;\n }\n }\n }\n\n if (slide && slideFound) {\n swiper.clickedSlide = slide;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n } else {\n swiper.clickedIndex = slideIndex;\n }\n } else {\n swiper.clickedSlide = undefined;\n swiper.clickedIndex = undefined;\n return;\n }\n if (\n params.slideToClickedSlide &&\n swiper.clickedIndex !== undefined &&\n swiper.clickedIndex !== swiper.activeIndex\n ) {\n swiper.slideToClickedSlide();\n }\n}\n","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\n\nexport default {\n updateSize,\n updateSlides,\n updateAutoHeight,\n updateSlidesOffset,\n updateSlidesProgress,\n updateProgress,\n updateSlidesClasses,\n updateActiveIndex,\n updateClickedSlide,\n};\n","import { getTranslate } from '../../shared/utils.js';\n\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n const swiper = this;\n\n const { params, rtlTranslate: rtl, translate, $wrapperEl } = swiper;\n\n if (params.virtualTranslate) {\n return rtl ? -translate : translate;\n }\n if (params.cssMode) {\n return translate;\n }\n\n let currentTranslate = getTranslate($wrapperEl[0], axis);\n if (rtl) currentTranslate = -currentTranslate;\n\n return currentTranslate || 0;\n}\n","export default function setTranslate(translate, byController) {\n const swiper = this;\n const { rtlTranslate: rtl, params, $wrapperEl, wrapperEl, progress } = swiper;\n let x = 0;\n let y = 0;\n const z = 0;\n\n if (swiper.isHorizontal()) {\n x = rtl ? -translate : translate;\n } else {\n y = translate;\n }\n\n if (params.roundLengths) {\n x = Math.floor(x);\n y = Math.floor(y);\n }\n\n if (params.cssMode) {\n wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n } else if (!params.virtualTranslate) {\n $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n }\n swiper.previousTranslate = swiper.translate;\n swiper.translate = swiper.isHorizontal() ? x : y;\n\n // Check if we need to update progress\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== progress) {\n swiper.updateProgress(translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, byController);\n}\n","export default function minTranslate() {\n return -this.snapGrid[0];\n}\n","export default function maxTranslate() {\n return -this.snapGrid[this.snapGrid.length - 1];\n}\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function translateTo(\n translate = 0,\n speed = this.params.speed,\n runCallbacks = true,\n translateBounds = true,\n internal,\n) {\n const swiper = this;\n\n const { params, wrapperEl } = swiper;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return false;\n }\n\n const minTranslate = swiper.minTranslate();\n const maxTranslate = swiper.maxTranslate();\n let newTranslate;\n if (translateBounds && translate > minTranslate) newTranslate = minTranslate;\n else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;\n else newTranslate = translate;\n\n // Update progress\n swiper.updateProgress(newTranslate);\n\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n if (speed === 0) {\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: -newTranslate, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: -newTranslate,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionEnd');\n }\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionStart');\n }\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onTranslateToWrapperTransitionEnd) {\n swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.onTranslateToWrapperTransitionEnd = null;\n delete swiper.onTranslateToWrapperTransitionEnd;\n if (runCallbacks) {\n swiper.emit('transitionEnd');\n }\n };\n }\n swiper.$wrapperEl[0].addEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\n\nexport default {\n getTranslate,\n setTranslate,\n minTranslate,\n maxTranslate,\n translateTo,\n};\n","export default function setTransition(duration, byController) {\n const swiper = this;\n\n if (!swiper.params.cssMode) {\n swiper.$wrapperEl.transition(duration);\n }\n\n swiper.emit('setTransition', duration, byController);\n}\n","export default function transitionEmit({ swiper, runCallbacks, direction, step }) {\n const { activeIndex, previousIndex } = swiper;\n let dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) dir = 'next';\n else if (activeIndex < previousIndex) dir = 'prev';\n else dir = 'reset';\n }\n\n swiper.emit(`transition${step}`);\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit(`slideResetTransition${step}`);\n return;\n }\n swiper.emit(`slideChangeTransition${step}`);\n if (dir === 'next') {\n swiper.emit(`slideNextTransition${step}`);\n } else {\n swiper.emit(`slidePrevTransition${step}`);\n }\n }\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionStart(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n if (params.cssMode) return;\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'Start' });\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionEnd(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n swiper.animating = false;\n if (params.cssMode) return;\n swiper.setTransition(0);\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'End' });\n}\n","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\n\nexport default {\n setTransition,\n transitionStart,\n transitionEnd,\n};\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function slideTo(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n initial,\n) {\n if (typeof index !== 'number' && typeof index !== 'string') {\n throw new Error(\n `The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`,\n );\n }\n\n if (typeof index === 'string') {\n /**\n * The `index` argument converted from `string` to `number`.\n * @type {number}\n */\n const indexAsNumber = parseInt(index, 10);\n\n /**\n * Determines whether the `index` argument is a valid `number`\n * after being converted from the `string` type.\n * @type {boolean}\n */\n const isValidNumber = isFinite(indexAsNumber);\n\n if (!isValidNumber) {\n throw new Error(\n `The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`,\n );\n }\n\n // Knowing that the converted `index` is a valid number,\n // we can update the original argument's value.\n index = indexAsNumber;\n }\n\n const swiper = this;\n let slideIndex = index;\n if (slideIndex < 0) slideIndex = 0;\n\n const {\n params,\n snapGrid,\n slidesGrid,\n previousIndex,\n activeIndex,\n rtlTranslate: rtl,\n wrapperEl,\n enabled,\n } = swiper;\n\n if (\n (swiper.animating && params.preventInteractionOnTransition) ||\n (!enabled && !internal && !initial)\n ) {\n return false;\n }\n\n const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n const translate = -snapGrid[snapIndex];\n\n // Update progress\n swiper.updateProgress(translate);\n\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n const normalizedTranslate = -Math.floor(translate * 100);\n const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2\n ) {\n slideIndex = i;\n } else if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext\n ) {\n slideIndex = i + 1;\n }\n } else if (normalizedTranslate >= normalizedGrid) {\n slideIndex = i;\n }\n }\n }\n // Directions locks\n if (swiper.initialized && slideIndex !== activeIndex) {\n if (\n !swiper.allowSlideNext &&\n translate < swiper.translate &&\n translate < swiper.minTranslate()\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n translate > swiper.translate &&\n translate > swiper.maxTranslate()\n ) {\n if ((activeIndex || 0) !== slideIndex) return false;\n }\n }\n\n let direction;\n if (slideIndex > activeIndex) direction = 'next';\n else if (slideIndex < activeIndex) direction = 'prev';\n else direction = 'reset';\n\n // Update Index\n if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n if (direction !== 'reset') {\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n }\n return false;\n }\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n const t = rtl ? translate : -translate;\n if (speed === 0) {\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n if (isVirtual) {\n swiper.wrapperEl.style.scrollSnapType = 'none';\n swiper._immediateVirtual = true;\n }\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n if (isVirtual) {\n requestAnimationFrame(() => {\n swiper.wrapperEl.style.scrollSnapType = '';\n swiper._swiperImmediateVirtual = false;\n });\n }\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: t, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: t,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onSlideToWrapperTransitionEnd) {\n swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.onSlideToWrapperTransitionEnd = null;\n delete swiper.onSlideToWrapperTransitionEnd;\n swiper.transitionEnd(runCallbacks, direction);\n };\n }\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","export default function slideToLoop(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n) {\n const swiper = this;\n let newIndex = index;\n if (swiper.params.loop) {\n newIndex += swiper.loopedSlides;\n }\n\n return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { animating, enabled, params } = swiper;\n if (!enabled) return swiper;\n let perGroup = params.slidesPerGroup;\n if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n }\n const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { params, animating, snapGrid, slidesGrid, rtlTranslate, enabled } = swiper;\n if (!enabled) return swiper;\n\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n function normalize(val) {\n if (val < 0) return -Math.floor(Math.abs(val));\n return Math.floor(val);\n }\n const normalizedTranslate = normalize(translate);\n const normalizedSnapGrid = snapGrid.map((val) => normalize(val));\n\n let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n if (typeof prevSnap === 'undefined' && params.cssMode) {\n let prevSnapIndex;\n snapGrid.forEach((snap, snapIndex) => {\n if (normalizedTranslate >= snap) {\n // prevSnap = snap;\n prevSnapIndex = snapIndex;\n }\n });\n if (typeof prevSnapIndex !== 'undefined') {\n prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n }\n }\n let prevIndex = 0;\n if (typeof prevSnap !== 'undefined') {\n prevIndex = slidesGrid.indexOf(prevSnap);\n if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n if (\n params.slidesPerView === 'auto' &&\n params.slidesPerGroup === 1 &&\n params.slidesPerGroupAuto\n ) {\n prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n prevIndex = Math.max(prevIndex, 0);\n }\n }\n return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n threshold = 0.5,\n) {\n const swiper = this;\n let index = swiper.activeIndex;\n const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n if (translate >= swiper.snapGrid[snapIndex]) {\n // The current translate is on or after the current snap index, so the choice\n // is between the current index and the one after it.\n const currentSnap = swiper.snapGrid[snapIndex];\n const nextSnap = swiper.snapGrid[snapIndex + 1];\n if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n index += swiper.params.slidesPerGroup;\n }\n } else {\n // The current translate is before the current snap index, so the choice\n // is between the current index and the one before it.\n const prevSnap = swiper.snapGrid[snapIndex - 1];\n const currentSnap = swiper.snapGrid[snapIndex];\n if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n index -= swiper.params.slidesPerGroup;\n }\n }\n index = Math.max(index, 0);\n index = Math.min(index, swiper.slidesGrid.length - 1);\n\n return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function slideToClickedSlide() {\n const swiper = this;\n const { params, $wrapperEl } = swiper;\n\n const slidesPerView =\n params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n let slideToIndex = swiper.clickedIndex;\n let realIndex;\n if (params.loop) {\n if (swiper.animating) return;\n realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (\n slideToIndex < swiper.loopedSlides - slidesPerView / 2 ||\n slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2\n ) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n}\n","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\n\nexport default {\n slideTo,\n slideToLoop,\n slideNext,\n slidePrev,\n slideReset,\n slideToClosest,\n slideToClickedSlide,\n};\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loopCreate() {\n const swiper = this;\n const document = getDocument();\n const { params, $wrapperEl } = swiper;\n // Remove duplicated slides\n const $selector = $($wrapperEl.children()[0].parentNode);\n $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n\n let slides = $selector.children(`.${params.slideClass}`);\n\n if (params.loopFillGroupWithBlank) {\n const blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n if (blankSlidesNum !== params.slidesPerGroup) {\n for (let i = 0; i < blankSlidesNum; i += 1) {\n const blankNode = $(document.createElement('div')).addClass(\n `${params.slideClass} ${params.slideBlankClass}`,\n );\n $selector.append(blankNode);\n }\n slides = $selector.children(`.${params.slideClass}`);\n }\n }\n\n if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n\n swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n swiper.loopedSlides += params.loopAdditionalSlides;\n if (swiper.loopedSlides > slides.length) {\n swiper.loopedSlides = slides.length;\n }\n\n const prependSlides = [];\n const appendSlides = [];\n slides.each((el, index) => {\n const slide = $(el);\n if (index < swiper.loopedSlides) {\n appendSlides.push(el);\n }\n if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n prependSlides.push(el);\n }\n slide.attr('data-swiper-slide-index', index);\n });\n for (let i = 0; i < appendSlides.length; i += 1) {\n $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n}\n","export default function loopFix() {\n const swiper = this;\n\n swiper.emit('beforeLoopFix');\n\n const {\n activeIndex,\n slides,\n loopedSlides,\n allowSlidePrev,\n allowSlideNext,\n snapGrid,\n rtlTranslate: rtl,\n } = swiper;\n let newIndex;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n\n const snapTranslate = -snapGrid[activeIndex];\n const diff = snapTranslate - swiper.getTranslate();\n\n // Fix For Negative Oversliding\n if (activeIndex < loopedSlides) {\n newIndex = slides.length - loopedSlides * 3 + activeIndex;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n } else if (activeIndex >= slides.length - loopedSlides) {\n // Fix For Positive Oversliding\n newIndex = -slides.length + activeIndex + loopedSlides;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n swiper.emit('loopFix');\n}\n","export default function loopDestroy() {\n const swiper = this;\n const { $wrapperEl, params, slides } = swiper;\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`,\n )\n .remove();\n slides.removeAttr('data-swiper-slide-index');\n}\n","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\n\nexport default {\n loopCreate,\n loopFix,\n loopDestroy,\n};\n","export default function setGrabCursor(moving) {\n const swiper = this;\n if (\n swiper.support.touch ||\n !swiper.params.simulateTouch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n )\n return;\n const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n el.style.cursor = 'move';\n el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n}\n","export default function unsetGrabCursor() {\n const swiper = this;\n if (\n swiper.support.touch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n ) {\n return;\n }\n swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}\n","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\n\nexport default {\n setGrabCursor,\n unsetGrabCursor,\n};\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base = this) {\n function __closestFrom(el) {\n if (!el || el === getDocument() || el === getWindow()) return null;\n if (el.assignedSlot) el = el.assignedSlot;\n const found = el.closest(selector);\n return found || __closestFrom(el.getRootNode().host);\n }\n return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n const swiper = this;\n const document = getDocument();\n const window = getWindow();\n\n const data = swiper.touchEventsData;\n const { params, touches, enabled } = swiper;\n if (!enabled) return;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return;\n }\n if (!swiper.animating && params.cssMode && params.loop) {\n swiper.loopFix();\n }\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n let $targetEl = $(e.target);\n\n if (params.touchEventsTarget === 'wrapper') {\n if (!$targetEl.closest(swiper.wrapperEl).length) return;\n }\n data.isTouchEvent = e.type === 'touchstart';\n if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n if (data.isTouched && data.isMoved) return;\n\n // change target el for shadow root component\n const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n $targetEl = $(event.path[0]);\n }\n\n const noSwipingSelector = params.noSwipingSelector\n ? params.noSwipingSelector\n : `.${params.noSwipingClass}`;\n const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n // use closestElement for shadow root element to get the actual closest for nested shadow root element\n if (\n params.noSwiping &&\n (isTargetShadow\n ? closestElement(noSwipingSelector, e.target)\n : $targetEl.closest(noSwipingSelector)[0])\n ) {\n swiper.allowClick = true;\n return;\n }\n\n if (params.swipeHandler) {\n if (!$targetEl.closest(params.swipeHandler)[0]) return;\n }\n\n touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n const startX = touches.currentX;\n const startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n if (\n edgeSwipeDetection &&\n (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)\n ) {\n if (edgeSwipeDetection === 'prevent') {\n event.preventDefault();\n } else {\n return;\n }\n }\n\n Object.assign(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined,\n });\n\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) data.allowThresholdMove = false;\n if (e.type !== 'touchstart') {\n let preventDefault = true;\n if ($targetEl.is(data.focusableElements)) preventDefault = false;\n if (\n document.activeElement &&\n $(document.activeElement).is(data.focusableElements) &&\n document.activeElement !== $targetEl[0]\n ) {\n document.activeElement.blur();\n }\n\n const shouldPreventDefault =\n preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n if (\n (params.touchStartForcePreventDefault || shouldPreventDefault) &&\n !$targetEl[0].isContentEditable\n ) {\n e.preventDefault();\n }\n }\n swiper.emit('touchStart', e);\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\nexport default function onTouchMove(event) {\n const document = getDocument();\n const swiper = this;\n const data = swiper.touchEventsData;\n const { params, touches, rtlTranslate: rtl, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (!data.isTouched) {\n if (data.startMoving && data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n return;\n }\n if (data.isTouchEvent && e.type !== 'touchmove') return;\n const targetTouch =\n e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n // isMoved = true;\n swiper.allowClick = false;\n if (data.isTouched) {\n Object.assign(touches, {\n startX: pageX,\n startY: pageY,\n currentX: pageX,\n currentY: pageY,\n });\n data.touchStartTime = now();\n }\n return;\n }\n if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (\n (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) ||\n (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n ) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (\n (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) ||\n (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n ) {\n return;\n }\n }\n if (data.isTouchEvent && document.activeElement) {\n if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) return;\n\n touches.currentX = pageX;\n touches.currentY = pageY;\n\n const diffX = touches.currentX - touches.startX;\n const diffY = touches.currentY - touches.startY;\n if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold)\n return;\n\n if (typeof data.isScrolling === 'undefined') {\n let touchAngle;\n if (\n (swiper.isHorizontal() && touches.currentY === touches.startY) ||\n (swiper.isVertical() && touches.currentX === touches.startX)\n ) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if (diffX * diffX + diffY * diffY >= 25) {\n touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n data.isScrolling = swiper.isHorizontal()\n ? touchAngle > params.touchAngle\n : 90 - touchAngle > params.touchAngle;\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof data.startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (data.isScrolling) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n if (!params.cssMode && e.cancelable) {\n e.preventDefault();\n }\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n\n if (!data.isMoved) {\n if (params.loop && !params.cssMode) {\n swiper.loopFix();\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n\n let diff = swiper.isHorizontal() ? diffX : diffY;\n touches.diff = diff;\n\n diff *= params.touchRatio;\n if (rtl) diff = -diff;\n\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n data.currentTranslate = diff + data.startTranslate;\n\n let disableParentSwiper = true;\n let resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.minTranslate() -\n 1 +\n (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.maxTranslate() +\n 1 -\n (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n }\n\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n swiper.swipeDirection === 'next' &&\n data.currentTranslate < data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (\n !swiper.allowSlidePrev &&\n swiper.swipeDirection === 'prev' &&\n data.currentTranslate > data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n data.currentTranslate = data.startTranslate;\n }\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal()\n ? touches.currentX - touches.startX\n : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n\n if (!params.followFinger || params.cssMode) return;\n\n // Update active index in free mode\n if (\n (params.freeMode && params.freeMode.enabled && swiper.freeMode) ||\n params.watchSlidesProgress\n ) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n swiper.freeMode.onTouchMove();\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n}\n","import { now, nextTick } from '../../shared/utils.js';\n\nexport default function onTouchEnd(event) {\n const swiper = this;\n const data = swiper.touchEventsData;\n\n const { params, touches, rtlTranslate: rtl, slidesGrid, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) {\n if (data.isMoved && params.grabCursor) {\n swiper.setGrabCursor(false);\n }\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n // Return Grab Cursor\n if (\n params.grabCursor &&\n data.isMoved &&\n data.isTouched &&\n (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)\n ) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n swiper.updateClickedSlide(e);\n swiper.emit('tap click', e);\n if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n swiper.emit('doubleTap doubleClick', e);\n }\n }\n\n data.lastClickTime = now();\n nextTick(() => {\n if (!swiper.destroyed) swiper.allowClick = true;\n });\n\n if (\n !data.isTouched ||\n !data.isMoved ||\n !swiper.swipeDirection ||\n touches.diff === 0 ||\n data.currentTranslate === data.startTranslate\n ) {\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n\n let currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n\n if (params.cssMode) {\n return;\n }\n\n if (swiper.params.freeMode && params.freeMode.enabled) {\n swiper.freeMode.onTouchEnd({ currentPos });\n return;\n }\n\n // Find current slide\n let stopIndex = 0;\n let groupSize = swiper.slidesSizesGrid[0];\n for (\n let i = 0;\n i < slidesGrid.length;\n i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup\n ) {\n const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n if (typeof slidesGrid[i + increment] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n stopIndex = i;\n groupSize = slidesGrid[i + increment] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n\n // Find current slide size\n const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n const isNavButtonTarget =\n swiper.navigation &&\n (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n if (!isNavButtonTarget) {\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(stopIndex + increment);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(stopIndex);\n }\n } else if (e.target === swiper.navigation.nextEl) {\n swiper.slideTo(stopIndex + increment);\n } else {\n swiper.slideTo(stopIndex);\n }\n }\n}\n","export default function onResize() {\n const swiper = this;\n\n const { params, el } = swiper;\n\n if (el && el.offsetWidth === 0) return;\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n const { allowSlideNext, allowSlidePrev, snapGrid } = swiper;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n\n swiper.updateSize();\n swiper.updateSlides();\n\n swiper.updateSlidesClasses();\n if (\n (params.slidesPerView === 'auto' || params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.isBeginning &&\n !swiper.params.centeredSlides\n ) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n\n if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n swiper.autoplay.run();\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n}\n","export default function onClick(e) {\n const swiper = this;\n if (!swiper.enabled) return;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) e.preventDefault();\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n}\n","export default function onScroll() {\n const swiper = this;\n const { wrapperEl, rtlTranslate, enabled } = swiper;\n if (!enabled) return;\n swiper.previousTranslate = swiper.translate;\n if (swiper.isHorizontal()) {\n swiper.translate = -wrapperEl.scrollLeft;\n } else {\n swiper.translate = -wrapperEl.scrollTop;\n }\n // eslint-disable-next-line\n if (swiper.translate === -0) swiper.translate = 0;\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== swiper.progress) {\n swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, false);\n}\n","import { getDocument } from 'ssr-window';\n\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\n\nlet dummyEventAttached = false;\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n const document = getDocument();\n const { params, touchEvents, el, wrapperEl, device, support } = swiper;\n const capture = !!params.nested;\n const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n const swiperMethod = method;\n\n // Touch Events\n if (!support.touch) {\n el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n } else {\n const passiveListener =\n touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n el[domMethod](\n touchEvents.move,\n swiper.onTouchMove,\n support.passiveListener ? { passive: false, capture } : capture,\n );\n el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n if (touchEvents.cancel) {\n el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n el[domMethod]('click', swiper.onClick, true);\n }\n if (params.cssMode) {\n wrapperEl[domMethod]('scroll', swiper.onScroll);\n }\n\n // Resize handler\n if (params.updateOnWindowResize) {\n swiper[swiperMethod](\n device.ios || device.android\n ? 'resize orientationchange observerUpdate'\n : 'resize observerUpdate',\n onResize,\n true,\n );\n } else {\n swiper[swiperMethod]('observerUpdate', onResize, true);\n }\n};\n\nfunction attachEvents() {\n const swiper = this;\n const document = getDocument();\n const { params, support } = swiper;\n\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n if (params.cssMode) {\n swiper.onScroll = onScroll.bind(swiper);\n }\n\n swiper.onClick = onClick.bind(swiper);\n\n if (support.touch && !dummyEventAttached) {\n document.addEventListener('touchstart', dummyEventListener);\n dummyEventAttached = true;\n }\n\n events(swiper, 'on');\n}\n\nfunction detachEvents() {\n const swiper = this;\n events(swiper, 'off');\n}\n\nexport default {\n attachEvents,\n detachEvents,\n};\n","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n const swiper = this;\n const { activeIndex, initialized, loopedSlides = 0, params, $el } = swiper;\n const breakpoints = params.breakpoints;\n if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) return;\n\n // Get breakpoint for window width and update parameters\n const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n\n if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n\n const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n const wasMultiRow = isGridEnabled(swiper, params);\n const isMultiRow = isGridEnabled(swiper, breakpointParams);\n\n const wasEnabled = params.enabled;\n\n if (wasMultiRow && !isMultiRow) {\n $el.removeClass(\n `${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`,\n );\n swiper.emitContainerClasses();\n } else if (!wasMultiRow && isMultiRow) {\n $el.addClass(`${params.containerModifierClass}grid`);\n if (\n (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column') ||\n (!breakpointParams.grid.fill && params.grid.fill === 'column')\n ) {\n $el.addClass(`${params.containerModifierClass}grid-column`);\n }\n swiper.emitContainerClasses();\n }\n\n const directionChanged =\n breakpointParams.direction && breakpointParams.direction !== params.direction;\n const needsReLoop =\n params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n if (directionChanged && initialized) {\n swiper.changeDirection();\n }\n extend(swiper.params, breakpointParams);\n\n const isEnabled = swiper.params.enabled;\n\n Object.assign(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n });\n\n if (wasEnabled && !isEnabled) {\n swiper.disable();\n } else if (!wasEnabled && isEnabled) {\n swiper.enable();\n }\n\n swiper.currentBreakpoint = breakpoint;\n\n swiper.emit('_beforeBreakpoint', breakpointParams);\n\n if (needsReLoop && initialized) {\n swiper.loopDestroy();\n swiper.loopCreate();\n swiper.updateSlides();\n swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n }\n\n swiper.emit('breakpoint', breakpointParams);\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n if (!breakpoints || (base === 'container' && !containerEl)) return undefined;\n let breakpoint = false;\n\n const window = getWindow();\n const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n\n const points = Object.keys(breakpoints).map((point) => {\n if (typeof point === 'string' && point.indexOf('@') === 0) {\n const minRatio = parseFloat(point.substr(1));\n const value = currentHeight * minRatio;\n return { value, point };\n }\n return { value: point, point };\n });\n\n points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n for (let i = 0; i < points.length; i += 1) {\n const { point, value } = points[i];\n if (base === 'window') {\n if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n breakpoint = point;\n }\n } else if (value <= containerEl.clientWidth) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n}\n","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\n\nexport default { setBreakpoint, getBreakpoint };\n","function prepareClasses(entries, prefix) {\n const resultClasses = [];\n entries.forEach((item) => {\n if (typeof item === 'object') {\n Object.keys(item).forEach((classNames) => {\n if (item[classNames]) {\n resultClasses.push(prefix + classNames);\n }\n });\n } else if (typeof item === 'string') {\n resultClasses.push(prefix + item);\n }\n });\n return resultClasses;\n}\n\nexport default function addClasses() {\n const swiper = this;\n const { classNames, params, rtl, $el, device, support } = swiper;\n // prettier-ignore\n const suffixes = prepareClasses([\n 'initialized',\n params.direction,\n { 'pointer-events': !support.touch },\n { 'free-mode': swiper.params.freeMode && params.freeMode.enabled },\n { 'autoheight': params.autoHeight },\n { 'rtl': rtl },\n { 'grid': params.grid && params.grid.rows > 1 },\n { 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' },\n { 'android': device.android },\n { 'ios': device.ios },\n { 'css-mode': params.cssMode },\n { 'centered': params.cssMode && params.centeredSlides },\n ], params.containerModifierClass);\n classNames.push(...suffixes);\n $el.addClass([...classNames].join(' '));\n swiper.emitContainerClasses();\n}\n","export default function removeClasses() {\n const swiper = this;\n const { $el, classNames } = swiper;\n\n $el.removeClass(classNames.join(' '));\n swiper.emitContainerClasses();\n}\n","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\n\nexport default { addClasses, removeClasses };\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n const window = getWindow();\n let image;\n function onReady() {\n if (callback) callback();\n }\n const isPicture = $(imageEl).parent('picture')[0];\n\n if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n if (src) {\n image = new window.Image();\n image.onload = onReady;\n image.onerror = onReady;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcset) {\n image.srcset = srcset;\n }\n if (src) {\n image.src = src;\n }\n } else {\n onReady();\n }\n } else {\n // image already loaded...\n onReady();\n }\n}\n","export default function preloadImages() {\n const swiper = this;\n swiper.imagesToLoad = swiper.$el.find('img');\n function onReady() {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n if (swiper.params.updateOnImagesReady) swiper.update();\n swiper.emit('imagesReady');\n }\n }\n for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n const imageEl = swiper.imagesToLoad[i];\n swiper.loadImage(\n imageEl,\n imageEl.currentSrc || imageEl.getAttribute('src'),\n imageEl.srcset || imageEl.getAttribute('srcset'),\n imageEl.sizes || imageEl.getAttribute('sizes'),\n true,\n onReady,\n );\n }\n}\n","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\n\nexport default {\n loadImage,\n preloadImages,\n};\n","function checkOverflow() {\n const swiper = this;\n const { isLocked: wasLocked, params } = swiper;\n const { slidesOffsetBefore } = params;\n\n if (slidesOffsetBefore) {\n const lastSlideIndex = swiper.slides.length - 1;\n const lastSlideRightEdge =\n swiper.slidesGrid[lastSlideIndex] +\n swiper.slidesSizesGrid[lastSlideIndex] +\n slidesOffsetBefore * 2;\n swiper.isLocked = swiper.size > lastSlideRightEdge;\n } else {\n swiper.isLocked = swiper.snapGrid.length === 1;\n }\n if (params.allowSlideNext === true) {\n swiper.allowSlideNext = !swiper.isLocked;\n }\n if (params.allowSlidePrev === true) {\n swiper.allowSlidePrev = !swiper.isLocked;\n }\n\n if (wasLocked && wasLocked !== swiper.isLocked) {\n swiper.isEnd = false;\n }\n if (wasLocked !== swiper.isLocked) {\n swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n }\n}\n\nexport default { checkOverflow };\n","export default {\n init: true,\n direction: 'horizontal',\n touchEventsTarget: 'wrapper',\n initialSlide: 0,\n speed: 300,\n cssMode: false,\n updateOnWindowResize: true,\n resizeObserver: true,\n nested: false,\n createElements: false,\n enabled: true,\n focusableElements: 'input, select, option, textarea, button, video, label',\n\n // Overrides\n width: null,\n height: null,\n\n //\n preventInteractionOnTransition: false,\n\n // ssr\n userAgent: null,\n url: null,\n\n // To support iOS's swipe-to-go-back gesture (when being used in-app).\n edgeSwipeDetection: false,\n edgeSwipeThreshold: 20,\n\n // Autoheight\n autoHeight: false,\n\n // Set wrapper width\n setWrapperSize: false,\n\n // Virtual Translate\n virtualTranslate: false,\n\n // Effects\n effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n breakpointsBase: 'window',\n\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerGroup: 1,\n slidesPerGroupSkip: 0,\n slidesPerGroupAuto: false,\n centeredSlides: false,\n centeredSlidesBounds: false,\n slidesOffsetBefore: 0, // in px\n slidesOffsetAfter: 0, // in px\n normalizeSlideIndex: true,\n centerInsufficientSlides: false,\n\n // Disable swiper and hide navigation when container not overflow\n watchOverflow: true,\n\n // Round length\n roundLengths: false,\n\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 0,\n touchMoveStopPropagation: false,\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchReleaseOnEdges: false,\n\n // Unique Navigation Elements\n uniqueNavElements: true,\n\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n\n // Progress\n watchSlidesProgress: false,\n\n // Cursor\n grabCursor: false,\n\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n\n // Images\n preloadImages: true,\n updateOnImagesReady: true,\n\n // loop\n loop: false,\n loopAdditionalSlides: 0,\n loopedSlides: null,\n loopFillGroupWithBlank: false,\n loopPreventsSlide: true,\n\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null, // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n noSwipingSelector: null,\n\n // Passive Listeners\n passiveListeners: true,\n\n // NS\n containerModifierClass: 'swiper-', // NEW\n slideClass: 'swiper-slide',\n slideBlankClass: 'swiper-slide-invisible-blank',\n slideActiveClass: 'swiper-slide-active',\n slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideDuplicateClass: 'swiper-slide-duplicate',\n slideNextClass: 'swiper-slide-next',\n slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n slidePrevClass: 'swiper-slide-prev',\n slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n wrapperClass: 'swiper-wrapper',\n\n // Callbacks\n runCallbacksOnInit: true,\n\n // Internals\n _emitClasses: false,\n};\n","import { extend } from '../shared/utils.js';\n\nexport default function moduleExtendParams(params, allModulesParams) {\n return function extendParams(obj = {}) {\n const moduleParamName = Object.keys(obj)[0];\n const moduleParams = obj[moduleParamName];\n if (typeof moduleParams !== 'object' || moduleParams === null) {\n extend(allModulesParams, obj);\n return;\n }\n if (\n ['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 &&\n params[moduleParamName] === true\n ) {\n params[moduleParamName] = { auto: true };\n }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n extend(allModulesParams, obj);\n return;\n }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = { enabled: true };\n }\n if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) params[moduleParamName] = { enabled: false };\n extend(allModulesParams, obj);\n };\n}\n","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\n\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\n\nimport eventsEmitter from './events-emitter.js';\n\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\n\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\n\nconst prototypes = {\n eventsEmitter,\n update,\n translate,\n transition,\n slide,\n loop,\n grabCursor,\n events,\n breakpoints,\n checkOverflow,\n classes,\n images,\n};\n\nconst extendedDefaults = {};\n\nclass Swiper {\n constructor(...args) {\n let el;\n let params;\n if (\n args.length === 1 &&\n args[0].constructor &&\n Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object'\n ) {\n params = args[0];\n } else {\n [el, params] = args;\n }\n if (!params) params = {};\n\n params = extend({}, params);\n if (el && !params.el) params.el = el;\n\n if (params.el && $(params.el).length > 1) {\n const swipers = [];\n $(params.el).each((containerEl) => {\n const newParams = extend({}, params, { el: containerEl });\n swipers.push(new Swiper(newParams));\n });\n return swipers;\n }\n\n // Swiper Instance\n const swiper = this;\n swiper.__swiper__ = true;\n swiper.support = getSupport();\n swiper.device = getDevice({ userAgent: params.userAgent });\n swiper.browser = getBrowser();\n\n swiper.eventsListeners = {};\n swiper.eventsAnyListeners = [];\n swiper.modules = [...swiper.__modules__];\n if (params.modules && Array.isArray(params.modules)) {\n swiper.modules.push(...params.modules);\n }\n\n const allModulesParams = {};\n\n swiper.modules.forEach((mod) => {\n mod({\n swiper,\n extendParams: moduleExtendParams(params, allModulesParams),\n on: swiper.on.bind(swiper),\n once: swiper.once.bind(swiper),\n off: swiper.off.bind(swiper),\n emit: swiper.emit.bind(swiper),\n });\n });\n\n // Extend defaults with modules params\n const swiperParams = extend({}, defaults, allModulesParams);\n\n // Extend defaults with passed params\n swiper.params = extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = extend({}, swiper.params);\n swiper.passedParams = extend({}, params);\n\n // add event listeners\n if (swiper.params && swiper.params.on) {\n Object.keys(swiper.params.on).forEach((eventName) => {\n swiper.on(eventName, swiper.params.on[eventName]);\n });\n }\n if (swiper.params && swiper.params.onAny) {\n swiper.onAny(swiper.params.onAny);\n }\n\n // Save Dom lib\n swiper.$ = $;\n\n // Extend Swiper\n Object.assign(swiper, {\n enabled: swiper.params.enabled,\n el,\n\n // Classes\n classNames: [],\n\n // Slides\n slides: $(),\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n\n // isDirection\n isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical() {\n return swiper.params.direction === 'vertical';\n },\n\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n\n //\n isBeginning: true,\n isEnd: false,\n\n // Props\n translate: 0,\n previousTranslate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n\n // Touch Events\n touchEvents: (function touchEvents() {\n const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n\n swiper.touchEventsTouch = {\n start: touch[0],\n move: touch[1],\n end: touch[2],\n cancel: touch[3],\n };\n swiper.touchEventsDesktop = {\n start: desktop[0],\n move: desktop[1],\n end: desktop[2],\n };\n return swiper.support.touch || !swiper.params.simulateTouch\n ? swiper.touchEventsTouch\n : swiper.touchEventsDesktop;\n })(),\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n focusableElements: swiper.params.focusableElements,\n // Last click time\n lastClickTime: now(),\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n isTouchEvent: undefined,\n startMoving: undefined,\n },\n\n // Clicks\n allowClick: true,\n\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0,\n },\n\n // Images\n imagesToLoad: [],\n imagesLoaded: 0,\n });\n\n swiper.emit('_swiper');\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n return swiper;\n }\n\n enable() {\n const swiper = this;\n if (swiper.enabled) return;\n swiper.enabled = true;\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n swiper.emit('enable');\n }\n\n disable() {\n const swiper = this;\n if (!swiper.enabled) return;\n swiper.enabled = false;\n if (swiper.params.grabCursor) {\n swiper.unsetGrabCursor();\n }\n swiper.emit('disable');\n }\n\n setProgress(progress, speed) {\n const swiper = this;\n progress = Math.min(Math.max(progress, 0), 1);\n const min = swiper.minTranslate();\n const max = swiper.maxTranslate();\n const current = (max - min) * progress + min;\n swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n\n emitContainerClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const cls = swiper.el.className.split(' ').filter((className) => {\n return (\n className.indexOf('swiper') === 0 ||\n className.indexOf(swiper.params.containerModifierClass) === 0\n );\n });\n swiper.emit('_containerClasses', cls.join(' '));\n }\n\n getSlideClasses(slideEl) {\n const swiper = this;\n\n return slideEl.className\n .split(' ')\n .filter((className) => {\n return (\n className.indexOf('swiper-slide') === 0 ||\n className.indexOf(swiper.params.slideClass) === 0\n );\n })\n .join(' ');\n }\n\n emitSlidesClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const updates = [];\n swiper.slides.each((slideEl) => {\n const classNames = swiper.getSlideClasses(slideEl);\n updates.push({ slideEl, classNames });\n swiper.emit('_slideClass', slideEl, classNames);\n });\n swiper.emit('_slideClasses', updates);\n }\n\n slidesPerViewDynamic(view = 'current', exact = false) {\n const swiper = this;\n const { params, slides, slidesGrid, slidesSizesGrid, size: swiperSize, activeIndex } = swiper;\n let spv = 1;\n if (params.centeredSlides) {\n let slideSize = slides[activeIndex].swiperSlideSize;\n let breakLoop;\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n } else {\n // eslint-disable-next-line\n if (view === 'current') {\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n const slideInView = exact\n ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize\n : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n } else {\n // previous\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n }\n }\n return spv;\n }\n\n update() {\n const swiper = this;\n if (!swiper || swiper.destroyed) return;\n const { snapGrid, params } = swiper;\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n\n function setTranslate() {\n const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n const newTranslate = Math.min(\n Math.max(translateValue, swiper.maxTranslate()),\n swiper.minTranslate(),\n );\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n let translated;\n if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n setTranslate();\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if (\n (swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.params.centeredSlides\n ) {\n translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n swiper.emit('update');\n }\n\n changeDirection(newDirection, needUpdate = true) {\n const swiper = this;\n const currentDirection = swiper.params.direction;\n if (!newDirection) {\n // eslint-disable-next-line\n newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n }\n if (\n newDirection === currentDirection ||\n (newDirection !== 'horizontal' && newDirection !== 'vertical')\n ) {\n return swiper;\n }\n\n swiper.$el\n .removeClass(`${swiper.params.containerModifierClass}${currentDirection}`)\n .addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n swiper.emitContainerClasses();\n\n swiper.params.direction = newDirection;\n\n swiper.slides.each((slideEl) => {\n if (newDirection === 'vertical') {\n slideEl.style.width = '';\n } else {\n slideEl.style.height = '';\n }\n });\n\n swiper.emit('changeDirection');\n if (needUpdate) swiper.update();\n\n return swiper;\n }\n\n mount(el) {\n const swiper = this;\n if (swiper.mounted) return true;\n\n // Find el\n const $el = $(el || swiper.params.el);\n el = $el[0];\n\n if (!el) {\n return false;\n }\n\n el.swiper = swiper;\n\n const getWrapperSelector = () => {\n return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n };\n\n const getWrapper = () => {\n if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n const res = $(el.shadowRoot.querySelector(getWrapperSelector()));\n // Children needs to return slot items\n res.children = (options) => $el.children(options);\n return res;\n }\n return $el.children(getWrapperSelector());\n };\n // Find Wrapper\n let $wrapperEl = getWrapper();\n if ($wrapperEl.length === 0 && swiper.params.createElements) {\n const document = getDocument();\n const wrapper = document.createElement('div');\n $wrapperEl = $(wrapper);\n wrapper.className = swiper.params.wrapperClass;\n $el.append(wrapper);\n $el.children(`.${swiper.params.slideClass}`).each((slideEl) => {\n $wrapperEl.append(slideEl);\n });\n }\n\n Object.assign(swiper, {\n $el,\n el,\n $wrapperEl,\n wrapperEl: $wrapperEl[0],\n mounted: true,\n\n // RTL\n rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n rtlTranslate:\n swiper.params.direction === 'horizontal' &&\n (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n });\n\n return true;\n }\n\n init(el) {\n const swiper = this;\n if (swiper.initialized) return swiper;\n\n const mounted = swiper.mount(el);\n if (mounted === false) return swiper;\n\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n\n if (swiper.params.watchOverflow) {\n swiper.checkOverflow();\n }\n\n // Set Grab Cursor\n if (swiper.params.grabCursor && swiper.enabled) {\n swiper.setGrabCursor();\n }\n\n if (swiper.params.preloadImages) {\n swiper.preloadImages();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop) {\n swiper.slideTo(\n swiper.params.initialSlide + swiper.loopedSlides,\n 0,\n swiper.params.runCallbacksOnInit,\n false,\n true,\n );\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n }\n\n // Attach events\n swiper.attachEvents();\n\n // Init Flag\n swiper.initialized = true;\n\n // Emit\n swiper.emit('init');\n swiper.emit('afterInit');\n\n return swiper;\n }\n\n destroy(deleteInstance = true, cleanStyles = true) {\n const swiper = this;\n const { params, $el, $wrapperEl, slides } = swiper;\n\n if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n return null;\n }\n\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n $el.removeAttr('style');\n $wrapperEl.removeAttr('style');\n if (slides && slides.length) {\n slides\n .removeClass(\n [\n params.slideVisibleClass,\n params.slideActiveClass,\n params.slideNextClass,\n params.slidePrevClass,\n ].join(' '),\n )\n .removeAttr('style')\n .removeAttr('data-swiper-slide-index');\n }\n }\n\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach((eventName) => {\n swiper.off(eventName);\n });\n\n if (deleteInstance !== false) {\n swiper.$el[0].swiper = null;\n deleteProps(swiper);\n }\n swiper.destroyed = true;\n\n return null;\n }\n\n static extendDefaults(newDefaults) {\n extend(extendedDefaults, newDefaults);\n }\n\n static get extendedDefaults() {\n return extendedDefaults;\n }\n\n static get defaults() {\n return defaults;\n }\n\n static installModule(mod) {\n if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n const modules = Swiper.prototype.__modules__;\n\n if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n modules.push(mod);\n }\n }\n\n static use(module) {\n if (Array.isArray(module)) {\n module.forEach((m) => Swiper.installModule(m));\n return Swiper;\n }\n Swiper.installModule(module);\n return Swiper;\n }\n}\n\nObject.keys(prototypes).forEach((prototypeGroup) => {\n Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n });\n});\n\nSwiper.use([Resize, Observer]);\n\nexport default Swiper;\n","import $ from '../../shared/dom.js';\nimport { setCSSProperty } from '../../shared/utils.js';\n\nexport default function Virtual({ swiper, extendParams, on }) {\n extendParams({\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n renderExternalUpdate: true,\n addSlidesBefore: 0,\n addSlidesAfter: 0,\n },\n });\n\n let cssModeTimeout;\n\n swiper.virtual = {\n cache: {},\n from: undefined,\n to: undefined,\n slides: [],\n offset: 0,\n slidesGrid: [],\n };\n\n function renderSlide(slide, index) {\n const params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n const $slideEl = params.renderSlide\n ? $(params.renderSlide.call(swiper, slide, index))\n : $(\n `
${slide}
`,\n );\n if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);\n if (params.cache) swiper.virtual.cache[index] = $slideEl;\n return $slideEl;\n }\n\n function update(force) {\n const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params;\n const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual;\n const {\n from: previousFrom,\n to: previousTo,\n slides,\n slidesGrid: previousSlidesGrid,\n offset: previousOffset,\n } = swiper.virtual;\n if (!swiper.params.cssMode) {\n swiper.updateActiveIndex();\n }\n\n const activeIndex = swiper.activeIndex || 0;\n\n let offsetProp;\n if (swiper.rtlTranslate) offsetProp = 'right';\n else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n\n let slidesAfter;\n let slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;\n slidesBefore = slidesPerGroup + addSlidesBefore;\n }\n const from = Math.max((activeIndex || 0) - slidesBefore, 0);\n const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n Object.assign(swiper.virtual, {\n from,\n to,\n offset,\n slidesGrid: swiper.slidesGrid,\n });\n\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.lazy && swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n }\n\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.css(offsetProp, `${offset}px`);\n }\n swiper.updateProgress();\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset,\n from,\n to,\n slides: (function getSlides() {\n const slidesToRender = [];\n for (let i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n })(),\n });\n if (swiper.params.virtual.renderExternalUpdate) {\n onRendered();\n }\n return;\n }\n const prependIndexes = [];\n const appendIndexes = [];\n if (force) {\n swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove();\n } else {\n for (let i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n swiper.$wrapperEl\n .find(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${i}\"]`)\n .remove();\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n if (i >= from && i <= to) {\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(i);\n } else {\n if (i > previousTo) appendIndexes.push(i);\n if (i < previousFrom) prependIndexes.push(i);\n }\n }\n }\n appendIndexes.forEach((index) => {\n swiper.$wrapperEl.append(renderSlide(slides[index], index));\n });\n prependIndexes\n .sort((a, b) => b - a)\n .forEach((index) => {\n swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n });\n swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`);\n onRendered();\n }\n\n function appendSlide(slides) {\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.push(slides[i]);\n }\n } else {\n swiper.virtual.slides.push(slides);\n }\n update(true);\n }\n function prependSlide(slides) {\n const activeIndex = swiper.activeIndex;\n let newActiveIndex = activeIndex + 1;\n let numberOfNewSlides = 1;\n\n if (Array.isArray(slides)) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n numberOfNewSlides = slides.length;\n } else {\n swiper.virtual.slides.unshift(slides);\n }\n if (swiper.params.virtual.cache) {\n const cache = swiper.virtual.cache;\n const newCache = {};\n Object.keys(cache).forEach((cachedIndex) => {\n const $cachedEl = cache[cachedIndex];\n const cachedElIndex = $cachedEl.attr('data-swiper-slide-index');\n if (cachedElIndex) {\n $cachedEl.attr(\n 'data-swiper-slide-index',\n parseInt(cachedElIndex, 10) + numberOfNewSlides,\n );\n }\n newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;\n });\n swiper.virtual.cache = newCache;\n }\n update(true);\n swiper.slideTo(newActiveIndex, 0);\n }\n function removeSlide(slidesIndexes) {\n if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n let activeIndex = swiper.activeIndex;\n if (Array.isArray(slidesIndexes)) {\n for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n swiper.virtual.slides.splice(slidesIndexes[i], 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes[i]];\n }\n if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n } else {\n swiper.virtual.slides.splice(slidesIndexes, 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes];\n }\n if (slidesIndexes < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n update(true);\n swiper.slideTo(activeIndex, 0);\n }\n function removeAllSlides() {\n swiper.virtual.slides = [];\n if (swiper.params.virtual.cache) {\n swiper.virtual.cache = {};\n }\n update(true);\n swiper.slideTo(0, 0);\n }\n\n on('beforeInit', () => {\n if (!swiper.params.virtual.enabled) return;\n swiper.virtual.slides = swiper.params.virtual.slides;\n swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n\n if (!swiper.params.initialSlide) {\n update();\n }\n });\n on('setTranslate', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode && !swiper._immediateVirtual) {\n clearTimeout(cssModeTimeout);\n cssModeTimeout = setTimeout(() => {\n update();\n }, 100);\n } else {\n update();\n }\n });\n on('init update resize', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n }\n });\n\n Object.assign(swiper.virtual, {\n appendSlide,\n prependSlide,\n removeSlide,\n removeAllSlides,\n update,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Keyboard({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n const window = getWindow();\n swiper.keyboard = {\n enabled: false,\n };\n extendParams({\n keyboard: {\n enabled: false,\n onlyInViewport: true,\n pageUpDown: true,\n },\n });\n\n function handle(event) {\n if (!swiper.enabled) return;\n\n const { rtlTranslate: rtl } = swiper;\n let e = event;\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n const kc = e.keyCode || e.charCode;\n const pageUpDown = swiper.params.keyboard.pageUpDown;\n const isPageUp = pageUpDown && kc === 33;\n const isPageDown = pageUpDown && kc === 34;\n const isArrowLeft = kc === 37;\n const isArrowRight = kc === 39;\n const isArrowUp = kc === 38;\n const isArrowDown = kc === 40;\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n ((swiper.isHorizontal() && isArrowRight) ||\n (swiper.isVertical() && isArrowDown) ||\n isPageDown)\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n ((swiper.isHorizontal() && isArrowLeft) || (swiper.isVertical() && isArrowUp) || isPageUp)\n ) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (\n document.activeElement &&\n document.activeElement.nodeName &&\n (document.activeElement.nodeName.toLowerCase() === 'input' ||\n document.activeElement.nodeName.toLowerCase() === 'textarea')\n ) {\n return undefined;\n }\n if (\n swiper.params.keyboard.onlyInViewport &&\n (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)\n ) {\n let inView = false;\n // Check that swiper should be inside of visible area of window\n if (\n swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 &&\n swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0\n ) {\n return undefined;\n }\n\n const $el = swiper.$el;\n const swiperWidth = $el[0].clientWidth;\n const swiperHeight = $el[0].clientHeight;\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const swiperOffset = swiper.$el.offset();\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiperWidth, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiperHeight],\n [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n if (!inView) return undefined;\n }\n if (swiper.isHorizontal()) {\n if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (((isPageDown || isArrowRight) && !rtl) || ((isPageUp || isArrowLeft) && rtl))\n swiper.slideNext();\n if (((isPageUp || isArrowLeft) && !rtl) || ((isPageDown || isArrowRight) && rtl))\n swiper.slidePrev();\n } else {\n if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (isPageDown || isArrowDown) swiper.slideNext();\n if (isPageUp || isArrowUp) swiper.slidePrev();\n }\n emit('keyPress', kc);\n return undefined;\n }\n function enable() {\n if (swiper.keyboard.enabled) return;\n $(document).on('keydown', handle);\n swiper.keyboard.enabled = true;\n }\n function disable() {\n if (!swiper.keyboard.enabled) return;\n $(document).off('keydown', handle);\n swiper.keyboard.enabled = false;\n }\n\n on('init', () => {\n if (swiper.params.keyboard.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n if (swiper.keyboard.enabled) {\n disable();\n }\n });\n\n Object.assign(swiper.keyboard, {\n enable,\n disable,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now, nextTick } from '../../shared/utils.js';\n\nexport default function Mousewheel({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n\n extendParams({\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarget: 'container',\n thresholdDelta: null,\n thresholdTime: null,\n },\n });\n\n swiper.mousewheel = {\n enabled: false,\n };\n\n let timeout;\n let lastScrollTime = now();\n let lastEventBeforeSnap;\n const recentWheelEvents = [];\n\n function normalize(e) {\n // Reasonable defaults\n const PIXEL_STEP = 10;\n const LINE_HEIGHT = 40;\n const PAGE_HEIGHT = 800;\n\n let sX = 0;\n let sY = 0; // spinX, spinY\n let pX = 0;\n let pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n\n if (e.shiftKey && !pX) {\n // if user scrolls with shift he wants horizontal scroll\n pX = pY;\n pY = 0;\n }\n\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) {\n // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else {\n // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = pX < 1 ? -1 : 1;\n }\n if (pY && !sY) {\n sY = pY < 1 ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY,\n };\n }\n function handleMouseEnter() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = true;\n }\n function handleMouseLeave() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = false;\n }\n function animateSlider(newEvent) {\n if (\n swiper.params.mousewheel.thresholdDelta &&\n newEvent.delta < swiper.params.mousewheel.thresholdDelta\n ) {\n // Prevent if delta of wheel scroll delta is below configured threshold\n return false;\n }\n\n if (\n swiper.params.mousewheel.thresholdTime &&\n now() - lastScrollTime < swiper.params.mousewheel.thresholdTime\n ) {\n // Prevent if time between scrolls is below configured threshold\n return false;\n }\n\n // If the movement is NOT big enough and\n // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n // Don't go any further (avoid insignificant scroll movement).\n if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n // Return false as a default\n return true;\n }\n // If user is scrolling towards the end:\n // If the slider hasn't hit the latest slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to next slide and\n // emit a scroll event.\n // Else (the user is scrolling towards the beginning) and\n // if the slider hasn't hit the first slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to prev slide and\n // emit a scroll event.\n if (newEvent.direction < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n emit('scroll', newEvent.raw);\n }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n emit('scroll', newEvent.raw);\n }\n // If you got here is because an animation has been triggered so store the current time\n lastScrollTime = new window.Date().getTime();\n // Return false as a default\n return false;\n }\n function releaseScroll(newEvent) {\n const params = swiper.params.mousewheel;\n if (newEvent.direction < 0) {\n if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n return false;\n }\n function handle(event) {\n let e = event;\n let disableParentSwiper = true;\n if (!swiper.enabled) return;\n const params = swiper.params.mousewheel;\n\n if (swiper.params.cssMode) {\n e.preventDefault();\n }\n\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges)\n return true;\n\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n let delta = 0;\n const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n const data = normalize(e);\n\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;\n else return true;\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;\n else return true;\n } else {\n delta =\n Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n\n if (delta === 0) return true;\n\n if (params.invert) delta = -delta;\n\n // Get the scroll positions\n let positions = swiper.getTranslate() + delta * params.sensitivity;\n\n if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n // When loop is true:\n // the disableParentSwiper will be true.\n // When loop is false:\n // if the scroll positions is not on edge,\n // then the disableParentSwiper will be true.\n // if the scroll on edge positions,\n // then the disableParentSwiper will be false.\n disableParentSwiper = swiper.params.loop\n ? true\n : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n\n if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n\n if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n // Register the new event in a variable which stores the relevant data\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n raw: event,\n };\n\n // Keep the most recent events\n if (recentWheelEvents.length >= 2) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n recentWheelEvents.push(newEvent);\n\n // If there is at least one previous recorded event:\n // If direction has changed or\n // if the scroll is quicker than the previous one:\n // Animate the slider.\n // Else (this is the first time the wheel is moved):\n // Animate the slider.\n if (prevEvent) {\n if (\n newEvent.direction !== prevEvent.direction ||\n newEvent.delta > prevEvent.delta ||\n newEvent.time > prevEvent.time + 150\n ) {\n animateSlider(newEvent);\n }\n } else {\n animateSlider(newEvent);\n }\n\n // If it's time to release the scroll:\n // Return now so you don't hit the preventDefault.\n if (releaseScroll(newEvent)) {\n return true;\n }\n } else {\n // Freemode or scrollContainer:\n\n // If we recently snapped after a momentum scroll, then ignore wheel events\n // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n // or if it's a new scroll (larger delta or inverse sign as last event before\n // an end-of-momentum snap).\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n };\n const ignoreWheelEvents =\n lastEventBeforeSnap &&\n newEvent.time < lastEventBeforeSnap.time + 500 &&\n newEvent.delta <= lastEventBeforeSnap.delta &&\n newEvent.direction === lastEventBeforeSnap.direction;\n if (!ignoreWheelEvents) {\n lastEventBeforeSnap = undefined;\n\n if (swiper.params.loop) {\n swiper.loopFix();\n }\n let position = swiper.getTranslate() + delta * params.sensitivity;\n const wasBeginning = swiper.isBeginning;\n const wasEnd = swiper.isEnd;\n\n if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n swiper.updateSlidesClasses();\n }\n\n if (swiper.params.freeMode.sticky) {\n // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n // the end of a momentum scroll by storing recent (N=15?) wheel events.\n // 1. do all N events have decreasing or same (absolute value) delta?\n // 2. did all N events arrive in the last M (M=500?) msecs?\n // 3. does the earliest event have an (absolute value) delta that's\n // at least P (P=1?) larger than the most recent event's delta?\n // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n // Snap immediately and ignore remaining wheel events in this scroll.\n // See comment above for \"remaining wheel events in this scroll\" determination.\n // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n clearTimeout(timeout);\n timeout = undefined;\n if (recentWheelEvents.length >= 15) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n const firstEvent = recentWheelEvents[0];\n recentWheelEvents.push(newEvent);\n if (\n prevEvent &&\n (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)\n ) {\n // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n recentWheelEvents.splice(0);\n } else if (\n recentWheelEvents.length >= 15 &&\n newEvent.time - firstEvent.time < 500 &&\n firstEvent.delta - newEvent.delta >= 1 &&\n newEvent.delta <= 6\n ) {\n // We're at the end of the deceleration of a momentum scroll, so there's no need\n // to wait for more events. Snap ASAP on the next tick.\n // Also, because there's some remaining momentum we'll bias the snap in the\n // direction of the ongoing scroll because it's better UX for the scroll to snap\n // in the same direction as the scroll instead of reversing to snap. Therefore,\n // if it's already scrolled more than 20% in the current direction, keep going.\n const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n timeout = nextTick(() => {\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 0); // no delay; move on next tick\n }\n if (!timeout) {\n // if we get here, then we haven't detected the end of a momentum scroll, so\n // we'll consider a scroll \"complete\" when there haven't been any wheel events\n // for 500ms.\n timeout = nextTick(() => {\n const snapToThreshold = 0.5;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 500);\n }\n }\n\n // Emit event\n if (!ignoreWheelEvents) emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction)\n swiper.autoplay.stop();\n // Return page scroll on edge positions\n if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;\n }\n }\n\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n return false;\n }\n\n function events(method) {\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n target[method]('mouseenter', handleMouseEnter);\n target[method]('mouseleave', handleMouseLeave);\n target[method]('wheel', handle);\n }\n\n function enable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.removeEventListener('wheel', handle);\n return true;\n }\n if (swiper.mousewheel.enabled) return false;\n events('on');\n swiper.mousewheel.enabled = true;\n return true;\n }\n function disable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.addEventListener(event, handle);\n return true;\n }\n if (!swiper.mousewheel.enabled) return false;\n events('off');\n swiper.mousewheel.enabled = false;\n return true;\n }\n\n on('init', () => {\n if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n disable();\n }\n if (swiper.params.mousewheel.enabled) enable();\n });\n on('destroy', () => {\n if (swiper.params.cssMode) {\n enable();\n }\n if (swiper.mousewheel.enabled) disable();\n });\n\n Object.assign(swiper.mousewheel, {\n enable,\n disable,\n });\n}\n","import { getDocument } from 'ssr-window';\n\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n const document = getDocument();\n if (swiper.params.createElements) {\n Object.keys(checkProps).forEach((key) => {\n if (!params[key] && params.auto === true) {\n let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n if (!element) {\n element = document.createElement('div');\n element.className = checkProps[key];\n swiper.$el.append(element);\n }\n params[key] = element;\n originalParams[key] = element;\n }\n });\n }\n return params;\n}\n","import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Navigation({ swiper, extendParams, on, emit }) {\n extendParams({\n navigation: {\n nextEl: null,\n prevEl: null,\n\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n lockClass: 'swiper-button-lock',\n },\n });\n\n swiper.navigation = {\n nextEl: null,\n $nextEl: null,\n prevEl: null,\n $prevEl: null,\n };\n\n function getEl(el) {\n let $el;\n if (el) {\n $el = $(el);\n if (\n swiper.params.uniqueNavElements &&\n typeof el === 'string' &&\n $el.length > 1 &&\n swiper.$el.find(el).length === 1\n ) {\n $el = swiper.$el.find(el);\n }\n }\n return $el;\n }\n\n function toggleEl($el, disabled) {\n const params = swiper.params.navigation;\n if ($el && $el.length > 0) {\n $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n }\n function update() {\n // Update Navigation Buttons\n if (swiper.params.loop) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n toggleEl($prevEl, swiper.isBeginning);\n toggleEl($nextEl, swiper.isEnd);\n }\n function onPrevClick(e) {\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop) return;\n swiper.slidePrev();\n }\n function onNextClick(e) {\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop) return;\n swiper.slideNext();\n }\n function init() {\n const params = swiper.params.navigation;\n\n swiper.params.navigation = createElementIfNotDefined(\n swiper,\n swiper.originalParams.navigation,\n swiper.params.navigation,\n {\n nextEl: 'swiper-button-next',\n prevEl: 'swiper-button-prev',\n },\n );\n if (!(params.nextEl || params.prevEl)) return;\n\n const $nextEl = getEl(params.nextEl);\n const $prevEl = getEl(params.prevEl);\n\n if ($nextEl && $nextEl.length > 0) {\n $nextEl.on('click', onNextClick);\n }\n if ($prevEl && $prevEl.length > 0) {\n $prevEl.on('click', onPrevClick);\n }\n\n Object.assign(swiper.navigation, {\n $nextEl,\n nextEl: $nextEl && $nextEl[0],\n $prevEl,\n prevEl: $prevEl && $prevEl[0],\n });\n\n if (!swiper.enabled) {\n if ($nextEl) $nextEl.addClass(params.lockClass);\n if ($prevEl) $prevEl.addClass(params.lockClass);\n }\n }\n function destroy() {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl && $nextEl.length) {\n $nextEl.off('click', onNextClick);\n $nextEl.removeClass(swiper.params.navigation.disabledClass);\n }\n if ($prevEl && $prevEl.length) {\n $prevEl.off('click', onPrevClick);\n $prevEl.removeClass(swiper.params.navigation.disabledClass);\n }\n }\n\n on('init', () => {\n init();\n update();\n });\n on('toEdge fromEdge lock unlock', () => {\n update();\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl) {\n $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n if ($prevEl) {\n $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n });\n on('click', (_s, e) => {\n const { $nextEl, $prevEl } = swiper.navigation;\n const targetEl = e.target;\n if (\n swiper.params.navigation.hideOnClick &&\n !$(targetEl).is($prevEl) &&\n !$(targetEl).is($nextEl)\n ) {\n if (\n swiper.pagination &&\n swiper.params.pagination &&\n swiper.params.pagination.clickable &&\n (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))\n )\n return;\n let isHidden;\n if ($nextEl) {\n isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n } else if ($prevEl) {\n isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n }\n if (isHidden === true) {\n emit('navigationShow');\n } else {\n emit('navigationHide');\n }\n if ($nextEl) {\n $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n if ($prevEl) {\n $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n }\n });\n\n Object.assign(swiper.navigation, {\n update,\n init,\n destroy,\n });\n}\n","export default function classesToSelector(classes = '') {\n return `.${classes\n .trim()\n .replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n .replace(/ /g, '.')}`;\n}\n","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Pagination({ swiper, extendParams, on, emit }) {\n const pfx = 'swiper-pagination';\n extendParams({\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n progressbarOpposite: false,\n type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n dynamicMainBullets: 1,\n formatFractionCurrent: (number) => number,\n formatFractionTotal: (number) => number,\n bulletClass: `${pfx}-bullet`,\n bulletActiveClass: `${pfx}-bullet-active`,\n modifierClass: `${pfx}-`,\n currentClass: `${pfx}-current`,\n totalClass: `${pfx}-total`,\n hiddenClass: `${pfx}-hidden`,\n progressbarFillClass: `${pfx}-progressbar-fill`,\n progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n clickableClass: `${pfx}-clickable`,\n lockClass: `${pfx}-lock`,\n horizontalClass: `${pfx}-horizontal`,\n verticalClass: `${pfx}-vertical`,\n },\n });\n\n swiper.pagination = {\n el: null,\n $el: null,\n bullets: [],\n };\n\n let bulletSize;\n let dynamicBulletIndex = 0;\n\n function isPaginationDisabled() {\n return (\n !swiper.params.pagination.el ||\n !swiper.pagination.el ||\n !swiper.pagination.$el ||\n swiper.pagination.$el.length === 0\n );\n }\n\n function setSideBullets($bulletEl, position) {\n const { bulletActiveClass } = swiper.params.pagination;\n $bulletEl[position]()\n .addClass(`${bulletActiveClass}-${position}`)\n [position]()\n .addClass(`${bulletActiveClass}-${position}-${position}`);\n }\n\n function update() {\n // Render || Update Pagination bullets/items\n const rtl = swiper.rtl;\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n const $el = swiper.pagination.$el;\n // Current/Total\n let current;\n const total = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (swiper.params.loop) {\n current = Math.ceil(\n (swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup,\n );\n if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n current -= slidesLength - swiper.loopedSlides * 2;\n }\n if (current > total - 1) current -= total;\n if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n } else {\n current = swiper.activeIndex || 0;\n }\n // Types\n if (\n params.type === 'bullets' &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length > 0\n ) {\n const bullets = swiper.pagination.bullets;\n let firstIndex;\n let lastIndex;\n let midIndex;\n if (params.dynamicBullets) {\n bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n $el.css(\n swiper.isHorizontal() ? 'width' : 'height',\n `${bulletSize * (params.dynamicMainBullets + 4)}px`,\n );\n if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n dynamicBulletIndex += current - swiper.previousIndex;\n if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n dynamicBulletIndex = params.dynamicMainBullets - 1;\n } else if (dynamicBulletIndex < 0) {\n dynamicBulletIndex = 0;\n }\n }\n firstIndex = current - dynamicBulletIndex;\n lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n midIndex = (lastIndex + firstIndex) / 2;\n }\n bullets.removeClass(\n ['', '-next', '-next-next', '-prev', '-prev-prev', '-main']\n .map((suffix) => `${params.bulletActiveClass}${suffix}`)\n .join(' '),\n );\n if ($el.length > 1) {\n bullets.each((bullet) => {\n const $bullet = $(bullet);\n const bulletIndex = $bullet.index();\n if (bulletIndex === current) {\n $bullet.addClass(params.bulletActiveClass);\n }\n if (params.dynamicBullets) {\n if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n $bullet.addClass(`${params.bulletActiveClass}-main`);\n }\n if (bulletIndex === firstIndex) {\n setSideBullets($bullet, 'prev');\n }\n if (bulletIndex === lastIndex) {\n setSideBullets($bullet, 'next');\n }\n }\n });\n } else {\n const $bullet = bullets.eq(current);\n const bulletIndex = $bullet.index();\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n const $firstDisplayedBullet = bullets.eq(firstIndex);\n const $lastDisplayedBullet = bullets.eq(lastIndex);\n for (let i = firstIndex; i <= lastIndex; i += 1) {\n bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n }\n if (swiper.params.loop) {\n if (bulletIndex >= bullets.length - params.dynamicMainBullets) {\n for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n }\n bullets\n .eq(bullets.length - params.dynamicMainBullets - 1)\n .addClass(`${params.bulletActiveClass}-prev`);\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n }\n }\n if (params.dynamicBullets) {\n const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n const bulletsOffset =\n (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n const offsetProp = rtl ? 'right' : 'left';\n bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n }\n }\n if (params.type === 'fraction') {\n $el\n .find(classesToSelector(params.currentClass))\n .text(params.formatFractionCurrent(current + 1));\n $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n }\n if (params.type === 'progressbar') {\n let progressbarDirection;\n if (params.progressbarOpposite) {\n progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n } else {\n progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n }\n const scale = (current + 1) / total;\n let scaleX = 1;\n let scaleY = 1;\n if (progressbarDirection === 'horizontal') {\n scaleX = scale;\n } else {\n scaleY = scale;\n }\n $el\n .find(classesToSelector(params.progressbarFillClass))\n .transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`)\n .transition(swiper.params.speed);\n }\n if (params.type === 'custom' && params.renderCustom) {\n $el.html(params.renderCustom(swiper, current + 1, total));\n emit('paginationRender', $el[0]);\n } else {\n emit('paginationUpdate', $el[0]);\n }\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n function render() {\n // Render Container\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n\n const $el = swiper.pagination.$el;\n let paginationHTML = '';\n if (params.type === 'bullets') {\n let numberOfBullets = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.loop &&\n numberOfBullets > slidesLength\n ) {\n numberOfBullets = slidesLength;\n }\n for (let i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\">`;\n }\n }\n $el.html(paginationHTML);\n\n swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML =\n `` +\n ' / ' +\n ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type !== 'custom') {\n emit('paginationRender', swiper.pagination.$el[0]);\n }\n }\n function init() {\n swiper.params.pagination = createElementIfNotDefined(\n swiper,\n swiper.originalParams.pagination,\n swiper.params.pagination,\n { el: 'swiper-pagination' },\n );\n const params = swiper.params.pagination;\n if (!params.el) return;\n\n let $el = $(params.el);\n if ($el.length === 0) return;\n\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n $el = swiper.$el.find(params.el);\n // check if it belongs to another nested Swiper\n if ($el.length > 1) {\n $el = $el.filter((el) => {\n if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n return true;\n });\n }\n }\n\n if (params.type === 'bullets' && params.clickable) {\n $el.addClass(params.clickableClass);\n }\n\n $el.addClass(params.modifierClass + params.type);\n $el.addClass(params.modifierClass + swiper.params.direction);\n\n if (params.type === 'bullets' && params.dynamicBullets) {\n $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n dynamicBulletIndex = 0;\n if (params.dynamicMainBullets < 1) {\n params.dynamicMainBullets = 1;\n }\n }\n if (params.type === 'progressbar' && params.progressbarOpposite) {\n $el.addClass(params.progressbarOppositeClass);\n }\n\n if (params.clickable) {\n $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n e.preventDefault();\n let index = $(this).index() * swiper.params.slidesPerGroup;\n if (swiper.params.loop) index += swiper.loopedSlides;\n swiper.slideTo(index);\n });\n }\n\n Object.assign(swiper.pagination, {\n $el,\n el: $el[0],\n });\n\n if (!swiper.enabled) {\n $el.addClass(params.lockClass);\n }\n }\n function destroy() {\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const $el = swiper.pagination.$el;\n\n $el.removeClass(params.hiddenClass);\n $el.removeClass(params.modifierClass + params.type);\n $el.removeClass(params.modifierClass + swiper.params.direction);\n if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass)\n swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n if (params.clickable) {\n $el.off('click', classesToSelector(params.bulletClass));\n }\n }\n\n on('init', () => {\n init();\n render();\n update();\n });\n on('activeIndexChange', () => {\n if (swiper.params.loop) {\n update();\n } else if (typeof swiper.snapIndex === 'undefined') {\n update();\n }\n });\n on('snapIndexChange', () => {\n if (!swiper.params.loop) {\n update();\n }\n });\n on('slidesLengthChange', () => {\n if (swiper.params.loop) {\n render();\n update();\n }\n });\n on('snapGridLengthChange', () => {\n if (!swiper.params.loop) {\n render();\n update();\n }\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $el } = swiper.pagination;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n }\n });\n on('lock unlock', () => {\n update();\n });\n on('click', (_s, e) => {\n const targetEl = e.target;\n const { $el } = swiper.pagination;\n if (\n swiper.params.pagination.el &&\n swiper.params.pagination.hideOnClick &&\n $el.length > 0 &&\n !$(targetEl).hasClass(swiper.params.pagination.bulletClass)\n ) {\n if (\n swiper.navigation &&\n ((swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) ||\n (swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl))\n )\n return;\n const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n if (isHidden === true) {\n emit('paginationShow');\n } else {\n emit('paginationHide');\n }\n $el.toggleClass(swiper.params.pagination.hiddenClass);\n }\n });\n\n Object.assign(swiper.pagination, {\n render,\n update,\n init,\n destroy,\n });\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Scrollbar({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n\n let isTouched = false;\n let timeout = null;\n let dragTimeout = null;\n let dragStartPos;\n let dragSize;\n let trackSize;\n let divider;\n\n extendParams({\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n lockClass: 'swiper-scrollbar-lock',\n dragClass: 'swiper-scrollbar-drag',\n },\n });\n\n swiper.scrollbar = {\n el: null,\n dragEl: null,\n $el: null,\n $dragEl: null,\n };\n\n function setTranslate() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n const { scrollbar, rtlTranslate: rtl, progress } = swiper;\n const { $dragEl, $el } = scrollbar;\n const params = swiper.params.scrollbar;\n\n let newSize = dragSize;\n let newPos = (trackSize - dragSize) * progress;\n if (rtl) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n $dragEl.transform(`translate3d(${newPos}px, 0, 0)`);\n $dragEl[0].style.width = `${newSize}px`;\n } else {\n $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n $dragEl[0].style.height = `${newSize}px`;\n }\n if (params.hide) {\n clearTimeout(timeout);\n $el[0].style.opacity = 1;\n timeout = setTimeout(() => {\n $el[0].style.opacity = 0;\n $el.transition(400);\n }, 1000);\n }\n }\n function setTransition(duration) {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n swiper.scrollbar.$dragEl.transition(duration);\n }\n function updateSize() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n\n const { scrollbar } = swiper;\n const { $dragEl, $el } = scrollbar;\n\n $dragEl[0].style.width = '';\n $dragEl[0].style.height = '';\n trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n divider =\n swiper.size /\n (swiper.virtualSize +\n swiper.params.slidesOffsetBefore -\n (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n\n if (swiper.isHorizontal()) {\n $dragEl[0].style.width = `${dragSize}px`;\n } else {\n $dragEl[0].style.height = `${dragSize}px`;\n }\n\n if (divider >= 1) {\n $el[0].style.display = 'none';\n } else {\n $el[0].style.display = '';\n }\n if (swiper.params.scrollbar.hide) {\n $el[0].style.opacity = 0;\n }\n\n if (swiper.params.watchOverflow && swiper.enabled) {\n scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](\n swiper.params.scrollbar.lockClass,\n );\n }\n }\n function getPointerPosition(e) {\n if (swiper.isHorizontal()) {\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientX\n : e.clientX;\n }\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientY\n : e.clientY;\n }\n function setDragPosition(e) {\n const { scrollbar, rtlTranslate: rtl } = swiper;\n const { $el } = scrollbar;\n\n let positionRatio;\n positionRatio =\n (getPointerPosition(e) -\n $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] -\n (dragStartPos !== null ? dragStartPos : dragSize / 2)) /\n (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (rtl) {\n positionRatio = 1 - positionRatio;\n }\n\n const position =\n swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n function onDragStart(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n isTouched = true;\n dragStartPos =\n e.target === $dragEl[0] || e.target === $dragEl\n ? getPointerPosition(e) -\n e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top']\n : null;\n e.preventDefault();\n e.stopPropagation();\n\n $wrapperEl.transition(100);\n $dragEl.transition(100);\n setDragPosition(e);\n\n clearTimeout(dragTimeout);\n\n $el.transition(0);\n if (params.hide) {\n $el.css('opacity', 1);\n }\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', 'none');\n }\n emit('scrollbarDragStart', e);\n }\n function onDragMove(e) {\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n\n if (!isTouched) return;\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n setDragPosition(e);\n $wrapperEl.transition(0);\n $el.transition(0);\n $dragEl.transition(0);\n emit('scrollbarDragMove', e);\n }\n function onDragEnd(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el } = scrollbar;\n\n if (!isTouched) return;\n isTouched = false;\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', '');\n $wrapperEl.transition('');\n }\n if (params.hide) {\n clearTimeout(dragTimeout);\n dragTimeout = nextTick(() => {\n $el.css('opacity', 0);\n $el.transition(400);\n }, 1000);\n }\n emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideToClosest();\n }\n }\n\n function events(method) {\n const { scrollbar, touchEventsTouch, touchEventsDesktop, params, support } = swiper;\n const $el = scrollbar.$el;\n const target = $el[0];\n const activeListener =\n support.passiveListener && params.passiveListeners\n ? { passive: false, capture: false }\n : false;\n const passiveListener =\n support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n if (!target) return;\n const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n if (!support.touch) {\n target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n } else {\n target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n }\n }\n\n function enableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('on');\n }\n function disableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('off');\n }\n function init() {\n const { scrollbar, $el: $swiperEl } = swiper;\n swiper.params.scrollbar = createElementIfNotDefined(\n swiper,\n swiper.originalParams.scrollbar,\n swiper.params.scrollbar,\n { el: 'swiper-scrollbar' },\n );\n const params = swiper.params.scrollbar;\n if (!params.el) return;\n\n let $el = $(params.el);\n if (\n swiper.params.uniqueNavElements &&\n typeof params.el === 'string' &&\n $el.length > 1 &&\n $swiperEl.find(params.el).length === 1\n ) {\n $el = $swiperEl.find(params.el);\n }\n\n let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n if ($dragEl.length === 0) {\n $dragEl = $(`
`);\n $el.append($dragEl);\n }\n\n Object.assign(scrollbar, {\n $el,\n el: $el[0],\n $dragEl,\n dragEl: $dragEl[0],\n });\n\n if (params.draggable) {\n enableDraggable();\n }\n\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n }\n function destroy() {\n disableDraggable();\n }\n\n on('init', () => {\n init();\n updateSize();\n setTranslate();\n });\n on('update resize observerUpdate lock unlock', () => {\n updateSize();\n });\n on('setTranslate', () => {\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n setTransition(duration);\n });\n on('enable disable', () => {\n const { $el } = swiper.scrollbar;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n });\n on('destroy', () => {\n destroy();\n });\n\n Object.assign(swiper.scrollbar, {\n updateSize,\n setTranslate,\n init,\n destroy,\n });\n}\n","import $ from '../../shared/dom.js';\n\nexport default function Parallax({ swiper, extendParams, on }) {\n extendParams({\n parallax: {\n enabled: false,\n },\n });\n\n const setTransform = (el, progress) => {\n const { rtl } = swiper;\n\n const $el = $(el);\n const rtlFactor = rtl ? -1 : 1;\n\n const p = $el.attr('data-swiper-parallax') || '0';\n let x = $el.attr('data-swiper-parallax-x');\n let y = $el.attr('data-swiper-parallax-y');\n const scale = $el.attr('data-swiper-parallax-scale');\n const opacity = $el.attr('data-swiper-parallax-opacity');\n\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n\n if (x.indexOf('%') >= 0) {\n x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n } else {\n x = `${x * progress * rtlFactor}px`;\n }\n if (y.indexOf('%') >= 0) {\n y = `${parseInt(y, 10) * progress}%`;\n } else {\n y = `${y * progress}px`;\n }\n\n if (typeof opacity !== 'undefined' && opacity !== null) {\n const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n $el[0].style.opacity = currentOpacity;\n }\n if (typeof scale === 'undefined' || scale === null) {\n $el.transform(`translate3d(${x}, ${y}, 0px)`);\n } else {\n const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`);\n }\n };\n\n const setTranslate = () => {\n const { $el, slides, progress, snapGrid } = swiper;\n $el\n .children(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, progress);\n });\n slides.each((slideEl, slideIndex) => {\n let slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n $(slideEl)\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, slideProgress);\n });\n });\n };\n\n const setTransition = (duration = swiper.params.speed) => {\n const { $el } = swiper;\n $el\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((parallaxEl) => {\n const $parallaxEl = $(parallaxEl);\n let parallaxDuration =\n parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) parallaxDuration = 0;\n $parallaxEl.transition(parallaxDuration);\n });\n };\n\n on('beforeInit', () => {\n if (!swiper.params.parallax.enabled) return;\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n });\n on('init', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTranslate', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTransition', (_swiper, duration) => {\n if (!swiper.params.parallax.enabled) return;\n setTransition(duration);\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { getTranslate } from '../../shared/utils.js';\n\nexport default function Zoom({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n extendParams({\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed',\n },\n });\n\n swiper.zoom = {\n enabled: false,\n };\n\n let currentScale = 1;\n let isScaling = false;\n let gesturesEnabled;\n let fakeGestureTouched;\n let fakeGestureMoved;\n const gesture = {\n $slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n $imageEl: undefined,\n $imageWrapEl: undefined,\n maxRatio: 3,\n };\n const image = {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {},\n };\n const velocity = {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined,\n };\n\n let scale = 1;\n Object.defineProperty(swiper.zoom, 'scale', {\n get() {\n return scale;\n },\n set(value) {\n if (scale !== value) {\n const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined;\n const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined;\n emit('zoomChange', value, imageEl, slideEl);\n }\n scale = value;\n },\n });\n\n function getDistanceBetweenTouches(e) {\n if (e.targetTouches.length < 2) return 1;\n const x1 = e.targetTouches[0].pageX;\n const y1 = e.targetTouches[0].pageY;\n const x2 = e.targetTouches[1].pageX;\n const y2 = e.targetTouches[1].pageY;\n const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n return distance;\n }\n\n // Events\n function onGestureStart(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n if (!support.gestures) {\n if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureTouched = true;\n gesture.scaleStart = getDistanceBetweenTouches(e);\n }\n if (!gesture.$slideEl || !gesture.$slideEl.length) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (gesture.$imageWrapEl.length === 0) {\n gesture.$imageEl = undefined;\n return;\n }\n }\n if (gesture.$imageEl) {\n gesture.$imageEl.transition(0);\n }\n isScaling = true;\n }\n function onGestureChange(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureMoved = true;\n gesture.scaleMove = getDistanceBetweenTouches(e);\n }\n\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) {\n if (e.type === 'gesturechange') onGestureStart(e);\n return;\n }\n if (support.gestures) {\n zoom.scale = e.scale * currentScale;\n } else {\n zoom.scale = (gesture.scaleMove / gesture.scaleStart) * currentScale;\n }\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n }\n gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function onGestureEnd(e) {\n const device = swiper.device;\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (!fakeGestureTouched || !fakeGestureMoved) {\n return;\n }\n if (\n e.type !== 'touchend' ||\n (e.type === 'touchend' && e.changedTouches.length < 2 && !device.android)\n ) {\n return;\n }\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.$imageEl\n .transition(swiper.params.speed)\n .transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n currentScale = zoom.scale;\n isScaling = false;\n if (zoom.scale === 1) gesture.$slideEl = undefined;\n }\n function onTouchStart(e) {\n const device = swiper.device;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (image.isTouched) return;\n if (device.android && e.cancelable) e.preventDefault();\n image.isTouched = true;\n image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n }\n function onTouchMove(e) {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n swiper.allowClick = false;\n if (!image.isTouched || !gesture.$slideEl) return;\n\n if (!image.isMoved) {\n image.width = gesture.$imageEl[0].offsetWidth;\n image.height = gesture.$imageEl[0].offsetHeight;\n image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n gesture.$imageWrapEl.transition(0);\n }\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;\n\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n\n image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n if (!image.isMoved && !isScaling) {\n if (\n swiper.isHorizontal() &&\n ((Math.floor(image.minX) === Math.floor(image.startX) &&\n image.touchesCurrent.x < image.touchesStart.x) ||\n (Math.floor(image.maxX) === Math.floor(image.startX) &&\n image.touchesCurrent.x > image.touchesStart.x))\n ) {\n image.isTouched = false;\n return;\n }\n if (\n !swiper.isHorizontal() &&\n ((Math.floor(image.minY) === Math.floor(image.startY) &&\n image.touchesCurrent.y < image.touchesStart.y) ||\n (Math.floor(image.maxY) === Math.floor(image.startY) &&\n image.touchesCurrent.y > image.touchesStart.y))\n ) {\n image.isTouched = false;\n return;\n }\n }\n if (e.cancelable) {\n e.preventDefault();\n }\n e.stopPropagation();\n\n image.isMoved = true;\n image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;\n image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;\n\n if (image.currentX < image.minX) {\n image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n }\n if (image.currentX > image.maxX) {\n image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n }\n\n if (image.currentY < image.minY) {\n image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n }\n if (image.currentY > image.maxY) {\n image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n }\n\n // Velocity\n if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n if (!velocity.prevTime) velocity.prevTime = Date.now();\n velocity.x =\n (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y =\n (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n\n gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTouchEnd() {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n let momentumDurationX = 300;\n let momentumDurationY = 300;\n const momentumDistanceX = velocity.x * momentumDurationX;\n const newPositionX = image.currentX + momentumDistanceX;\n const momentumDistanceY = velocity.y * momentumDurationY;\n const newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0)\n momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n if (velocity.y !== 0)\n momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n gesture.$imageWrapEl\n .transition(momentumDuration)\n .transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTransitionEnd() {\n const zoom = swiper.zoom;\n if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n if (gesture.$imageEl) {\n gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n }\n if (gesture.$imageWrapEl) {\n gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n }\n\n zoom.scale = 1;\n currentScale = 1;\n\n gesture.$slideEl = undefined;\n gesture.$imageEl = undefined;\n gesture.$imageWrapEl = undefined;\n }\n }\n\n function zoomIn(e) {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (e && e.target) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n }\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n }\n\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.touchAction = 'none';\n }\n\n gesture.$slideEl.addClass(`${params.zoomedSlideClass}`);\n\n let touchX;\n let touchY;\n let offsetX;\n let offsetY;\n let diffX;\n let diffY;\n let translateX;\n let translateY;\n let imageWidth;\n let imageHeight;\n let scaledWidth;\n let scaledHeight;\n let translateMinX;\n let translateMinY;\n let translateMaxX;\n let translateMaxY;\n let slideWidth;\n let slideHeight;\n\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n\n zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (e) {\n slideWidth = gesture.$slideEl[0].offsetWidth;\n slideHeight = gesture.$slideEl[0].offsetHeight;\n offsetX = gesture.$slideEl.offset().left + window.scrollX;\n offsetY = gesture.$slideEl.offset().top + window.scrollY;\n diffX = offsetX + slideWidth / 2 - touchX;\n diffY = offsetY + slideHeight / 2 - touchY;\n\n imageWidth = gesture.$imageEl[0].offsetWidth;\n imageHeight = gesture.$imageEl[0].offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n\n translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n gesture.$imageWrapEl\n .transition(300)\n .transform(`translate3d(${translateX}px, ${translateY}px,0)`);\n gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function zoomOut() {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.style.touchAction = '';\n }\n zoom.scale = 1;\n currentScale = 1;\n gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`);\n gesture.$slideEl = undefined;\n }\n\n // Toggle Zoom\n function zoomToggle(e) {\n const zoom = swiper.zoom;\n\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoomOut();\n } else {\n // Zoom In\n zoomIn(e);\n }\n }\n\n function getListeners() {\n const support = swiper.support;\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n const activeListenerWithCapture = support.passiveListener\n ? { passive: false, capture: true }\n : true;\n return { passiveListener, activeListenerWithCapture };\n }\n\n function getSlideSelector() {\n return `.${swiper.params.slideClass}`;\n }\n\n function toggleGestures(method) {\n const { passiveListener } = getListeners();\n const slideSelector = getSlideSelector();\n swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener);\n swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener);\n swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener);\n }\n function enableGestures() {\n if (gesturesEnabled) return;\n gesturesEnabled = true;\n toggleGestures('on');\n }\n function disableGestures() {\n if (!gesturesEnabled) return;\n gesturesEnabled = false;\n toggleGestures('off');\n }\n\n // Attach/Detach Events\n function enable() {\n const zoom = swiper.zoom;\n if (zoom.enabled) return;\n zoom.enabled = true;\n const support = swiper.support;\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.on(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.on(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n function disable() {\n const zoom = swiper.zoom;\n if (!zoom.enabled) return;\n const support = swiper.support;\n zoom.enabled = false;\n\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.off(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.off(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n\n on('init', () => {\n if (swiper.params.zoom.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n disable();\n });\n on('touchStart', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchStart(e);\n });\n on('touchEnd', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchEnd(e);\n });\n on('doubleTap', (_s, e) => {\n if (\n !swiper.animating &&\n swiper.params.zoom.enabled &&\n swiper.zoom.enabled &&\n swiper.params.zoom.toggle\n ) {\n zoomToggle(e);\n }\n });\n on('transitionEnd', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n onTransitionEnd();\n }\n });\n on('slideChange', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n onTransitionEnd();\n }\n });\n\n Object.assign(swiper.zoom, {\n enable,\n disable,\n in: zoomIn,\n out: zoomOut,\n toggle: zoomToggle,\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Lazy({ swiper, extendParams, on, emit }) {\n extendParams({\n lazy: {\n checkInView: false,\n enabled: false,\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n scrollingElement: '',\n\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n },\n });\n\n swiper.lazy = {};\n\n let scrollHandlerAttached = false;\n let initialImageLoaded = false;\n\n function loadInSlide(index, loadInDuplicate = true) {\n const params = swiper.params.lazy;\n if (typeof index === 'undefined') return;\n if (swiper.slides.length === 0) return;\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n const $slideEl = isVirtual\n ? swiper.$wrapperEl.children(\n `.${swiper.params.slideClass}[data-swiper-slide-index=\"${index}\"]`,\n )\n : swiper.slides.eq(index);\n\n const $images = $slideEl.find(\n `.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`,\n );\n if (\n $slideEl.hasClass(params.elementClass) &&\n !$slideEl.hasClass(params.loadedClass) &&\n !$slideEl.hasClass(params.loadingClass)\n ) {\n $images.push($slideEl[0]);\n }\n if ($images.length === 0) return;\n\n $images.each((imageEl) => {\n const $imageEl = $(imageEl);\n $imageEl.addClass(params.loadingClass);\n\n const background = $imageEl.attr('data-background');\n const src = $imageEl.attr('data-src');\n const srcset = $imageEl.attr('data-srcset');\n const sizes = $imageEl.attr('data-sizes');\n const $pictureEl = $imageEl.parent('picture');\n\n swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => {\n if (\n typeof swiper === 'undefined' ||\n swiper === null ||\n !swiper ||\n (swiper && !swiper.params) ||\n swiper.destroyed\n )\n return;\n if (background) {\n $imageEl.css('background-image', `url(\"${background}\")`);\n $imageEl.removeAttr('data-background');\n } else {\n if (srcset) {\n $imageEl.attr('srcset', srcset);\n $imageEl.removeAttr('data-srcset');\n }\n if (sizes) {\n $imageEl.attr('sizes', sizes);\n $imageEl.removeAttr('data-sizes');\n }\n if ($pictureEl.length) {\n $pictureEl.children('source').each((sourceEl) => {\n const $source = $(sourceEl);\n\n if ($source.attr('data-srcset')) {\n $source.attr('srcset', $source.attr('data-srcset'));\n $source.removeAttr('data-srcset');\n }\n });\n }\n if (src) {\n $imageEl.attr('src', src);\n $imageEl.removeAttr('data-src');\n }\n }\n\n $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n $slideEl.find(`.${params.preloaderClass}`).remove();\n if (swiper.params.loop && loadInDuplicate) {\n const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n const originalSlide = swiper.$wrapperEl.children(\n `[data-swiper-slide-index=\"${slideOriginalIndex}\"]:not(.${swiper.params.slideDuplicateClass})`,\n );\n loadInSlide(originalSlide.index(), false);\n } else {\n const duplicatedSlide = swiper.$wrapperEl.children(\n `.${swiper.params.slideDuplicateClass}[data-swiper-slide-index=\"${slideOriginalIndex}\"]`,\n );\n loadInSlide(duplicatedSlide.index(), false);\n }\n }\n emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n });\n\n emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n });\n }\n\n function load() {\n const { $wrapperEl, params: swiperParams, slides, activeIndex } = swiper;\n const isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n const params = swiperParams.lazy;\n\n let slidesPerView = swiperParams.slidesPerView;\n if (slidesPerView === 'auto') {\n slidesPerView = 0;\n }\n\n function slideExist(index) {\n if (isVirtual) {\n if (\n $wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index=\"${index}\"]`)\n .length\n ) {\n return true;\n }\n } else if (slides[index]) return true;\n return false;\n }\n\n function slideIndex(slideEl) {\n if (isVirtual) {\n return $(slideEl).attr('data-swiper-slide-index');\n }\n return $(slideEl).index();\n }\n\n if (!initialImageLoaded) initialImageLoaded = true;\n if (swiper.params.watchSlidesProgress) {\n $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each((slideEl) => {\n const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n loadInSlide(index);\n });\n } else if (slidesPerView > 1) {\n for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n loadInSlide(activeIndex);\n }\n if (params.loadPrevNext) {\n if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n const amount = params.loadPrevNextAmount;\n const spv = slidesPerView;\n const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n // Next Slides\n for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n // Prev Slides\n for (let i = minIndex; i < activeIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`);\n if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide));\n\n const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`);\n if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide));\n }\n }\n }\n function checkInViewOnLoad() {\n const window = getWindow();\n if (!swiper || swiper.destroyed) return;\n const $scrollElement = swiper.params.lazy.scrollingElement\n ? $(swiper.params.lazy.scrollingElement)\n : $(window);\n const isWindow = $scrollElement[0] === window;\n const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;\n const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;\n const swiperOffset = swiper.$el.offset();\n const { rtlTranslate: rtl } = swiper;\n\n let inView = false;\n\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiper.width, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiper.height],\n [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (\n point[0] >= 0 &&\n point[0] <= scrollElementWidth &&\n point[1] >= 0 &&\n point[1] <= scrollElementHeight\n ) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n swiper.support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n\n if (inView) {\n load();\n $scrollElement.off('scroll', checkInViewOnLoad, passiveListener);\n } else if (!scrollHandlerAttached) {\n scrollHandlerAttached = true;\n $scrollElement.on('scroll', checkInViewOnLoad, passiveListener);\n }\n }\n\n on('beforeInit', () => {\n if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n swiper.params.preloadImages = false;\n }\n });\n on('init', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('scroll', () => {\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.freeMode.sticky\n ) {\n load();\n }\n });\n on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('transitionStart', () => {\n if (swiper.params.lazy.enabled) {\n if (\n swiper.params.lazy.loadOnTransitionStart ||\n (!swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded)\n ) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n }\n });\n on('transitionEnd', () => {\n if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('slideChange', () => {\n const { lazy, cssMode, watchSlidesProgress, touchReleaseOnEdges, resistanceRatio } =\n swiper.params;\n if (\n lazy.enabled &&\n (cssMode || (watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0)))\n ) {\n load();\n }\n });\n\n Object.assign(swiper.lazy, {\n load,\n loadInSlide,\n });\n}\n","/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Controller({ swiper, extendParams, on }) {\n extendParams({\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide', // or 'container'\n },\n });\n\n swiper.controller = {\n control: undefined,\n };\n\n function LinearSpline(x, y) {\n const binarySearch = (function search() {\n let maxIndex;\n let minIndex;\n let guess;\n return (array, val) => {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = (maxIndex + minIndex) >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n })();\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n let i1;\n let i3;\n\n this.interpolate = function interpolate(x2) {\n if (!x2) return 0;\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (\n ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]\n );\n };\n return this;\n }\n // xxx: for now i will just save one spline function to to\n function getInterpolateFunction(c) {\n if (!swiper.controller.spline) {\n swiper.controller.spline = swiper.params.loop\n ? new LinearSpline(swiper.slidesGrid, c.slidesGrid)\n : new LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n }\n function setTranslate(_t, byController) {\n const controlled = swiper.controller.control;\n let multiplier;\n let controlledTranslate;\n const Swiper = swiper.constructor;\n function setControlledTranslate(c) {\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier =\n (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n }\n\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (let i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n }\n function setTransition(duration, byController) {\n const Swiper = swiper.constructor;\n const controlled = swiper.controller.control;\n let i;\n function setControlledTransition(c) {\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n if (c.params.autoHeight) {\n nextTick(() => {\n c.updateAutoHeight();\n });\n }\n c.$wrapperEl.transitionEnd(() => {\n if (!controlled) return;\n if (c.params.loop && swiper.params.controller.by === 'slide') {\n c.loopFix();\n }\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTransition(controlled);\n }\n }\n\n function removeSpline() {\n if (!swiper.controller.control) return;\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n }\n on('beforeInit', () => {\n swiper.controller.control = swiper.params.controller.control;\n });\n on('update', () => {\n removeSpline();\n });\n on('resize', () => {\n removeSpline();\n });\n on('observerUpdate', () => {\n removeSpline();\n });\n on('setTranslate', (_s, translate, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTranslate(translate, byController);\n });\n on('setTransition', (_s, duration, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTransition(duration, byController);\n });\n\n Object.assign(swiper.controller, {\n setTranslate,\n setTransition,\n });\n}\n","import classesToSelector from '../../shared/classes-to-selector.js';\nimport $ from '../../shared/dom.js';\n\nexport default function A11y({ swiper, extendParams, on }) {\n extendParams({\n a11y: {\n enabled: true,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n slideLabelMessage: '{{index}} / {{slidesLength}}',\n containerMessage: null,\n containerRoleDescriptionMessage: null,\n itemRoleDescriptionMessage: null,\n slideRole: 'group',\n },\n });\n\n let liveRegion = null;\n\n function notify(message) {\n const notification = liveRegion;\n if (notification.length === 0) return;\n notification.html('');\n notification.html(message);\n }\n\n function getRandomNumber(size = 16) {\n const randomChar = () => Math.round(16 * Math.random()).toString(16);\n return 'x'.repeat(size).replace(/x/g, randomChar);\n }\n function makeElFocusable($el) {\n $el.attr('tabIndex', '0');\n }\n function makeElNotFocusable($el) {\n $el.attr('tabIndex', '-1');\n }\n function addElRole($el, role) {\n $el.attr('role', role);\n }\n function addElRoleDescription($el, description) {\n $el.attr('aria-roledescription', description);\n }\n function addElControls($el, controls) {\n $el.attr('aria-controls', controls);\n }\n function addElLabel($el, label) {\n $el.attr('aria-label', label);\n }\n function addElId($el, id) {\n $el.attr('id', id);\n }\n function addElLive($el, live) {\n $el.attr('aria-live', live);\n }\n function disableEl($el) {\n $el.attr('aria-disabled', true);\n }\n function enableEl($el) {\n $el.attr('aria-disabled', false);\n }\n\n function onEnterOrSpaceKey(e) {\n if (e.keyCode !== 13 && e.keyCode !== 32) return;\n const params = swiper.params.a11y;\n const $targetEl = $(e.target);\n if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n notify(params.lastSlideMessage);\n } else {\n notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n notify(params.firstSlideMessage);\n } else {\n notify(params.prevSlideMessage);\n }\n }\n\n if (\n swiper.pagination &&\n $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))\n ) {\n $targetEl[0].click();\n }\n }\n\n function updateNavigation() {\n if (swiper.params.loop || !swiper.navigation) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n disableEl($prevEl);\n makeElNotFocusable($prevEl);\n } else {\n enableEl($prevEl);\n makeElFocusable($prevEl);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n disableEl($nextEl);\n makeElNotFocusable($nextEl);\n } else {\n enableEl($nextEl);\n makeElFocusable($nextEl);\n }\n }\n }\n\n function hasPagination() {\n return (\n swiper.pagination &&\n swiper.params.pagination.clickable &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length\n );\n }\n\n function updatePagination() {\n const params = swiper.params.a11y;\n if (hasPagination()) {\n swiper.pagination.bullets.each((bulletEl) => {\n const $bulletEl = $(bulletEl);\n makeElFocusable($bulletEl);\n if (!swiper.params.pagination.renderBullet) {\n addElRole($bulletEl, 'button');\n addElLabel(\n $bulletEl,\n params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1),\n );\n }\n });\n }\n }\n\n const initNavEl = ($el, wrapperId, message) => {\n makeElFocusable($el);\n if ($el[0].tagName !== 'BUTTON') {\n addElRole($el, 'button');\n $el.on('keydown', onEnterOrSpaceKey);\n }\n addElLabel($el, message);\n addElControls($el, wrapperId);\n };\n\n function init() {\n const params = swiper.params.a11y;\n\n swiper.$el.append(liveRegion);\n\n // Container\n const $containerEl = swiper.$el;\n if (params.containerRoleDescriptionMessage) {\n addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n }\n if (params.containerMessage) {\n addElLabel($containerEl, params.containerMessage);\n }\n\n // Wrapper\n const $wrapperEl = swiper.$wrapperEl;\n const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n addElId($wrapperEl, wrapperId);\n addElLive($wrapperEl, live);\n\n // Slide\n if (params.itemRoleDescriptionMessage) {\n addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);\n }\n addElRole($(swiper.slides), params.slideRole);\n\n const slidesLength = swiper.params.loop\n ? swiper.slides.filter((el) => !el.classList.contains(swiper.params.slideDuplicateClass))\n .length\n : swiper.slides.length;\n swiper.slides.each((slideEl, index) => {\n const $slideEl = $(slideEl);\n const slideIndex = swiper.params.loop\n ? parseInt($slideEl.attr('data-swiper-slide-index'), 10)\n : index;\n const ariaLabelMessage = params.slideLabelMessage\n .replace(/\\{\\{index\\}\\}/, slideIndex + 1)\n .replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n addElLabel($slideEl, ariaLabelMessage);\n });\n\n // Navigation\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n\n if ($nextEl && $nextEl.length) {\n initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n }\n if ($prevEl && $prevEl.length) {\n initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.on(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n function destroy() {\n if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n $nextEl.off('keydown', onEnterOrSpaceKey);\n }\n if ($prevEl) {\n $prevEl.off('keydown', onEnterOrSpaceKey);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.off(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n\n on('beforeInit', () => {\n liveRegion = $(\n ``,\n );\n });\n\n on('afterInit', () => {\n if (!swiper.params.a11y.enabled) return;\n init();\n updateNavigation();\n });\n on('toEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('fromEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('paginationUpdate', () => {\n if (!swiper.params.a11y.enabled) return;\n updatePagination();\n });\n on('destroy', () => {\n if (!swiper.params.a11y.enabled) return;\n destroy();\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function History({ swiper, extendParams, on }) {\n extendParams({\n history: {\n enabled: false,\n root: '',\n replaceState: false,\n key: 'slides',\n },\n });\n\n let initialized = false;\n let paths = {};\n\n const slugify = (text) => {\n return text\n .toString()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n };\n\n const getPathValues = (urlOverride) => {\n const window = getWindow();\n let location;\n if (urlOverride) {\n location = new URL(urlOverride);\n } else {\n location = window.location;\n }\n const pathArray = location.pathname\n .slice(1)\n .split('/')\n .filter((part) => part !== '');\n const total = pathArray.length;\n const key = pathArray[total - 2];\n const value = pathArray[total - 1];\n return { key, value };\n };\n const setHistory = (key, index) => {\n const window = getWindow();\n if (!initialized || !swiper.params.history.enabled) return;\n let location;\n if (swiper.params.url) {\n location = new URL(swiper.params.url);\n } else {\n location = window.location;\n }\n const slide = swiper.slides.eq(index);\n let value = slugify(slide.attr('data-history'));\n if (swiper.params.history.root.length > 0) {\n let root = swiper.params.history.root;\n if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n value = `${root}/${key}/${value}`;\n } else if (!location.pathname.includes(key)) {\n value = `${key}/${value}`;\n }\n const currentState = window.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n window.history.replaceState({ value }, null, value);\n } else {\n window.history.pushState({ value }, null, value);\n }\n };\n\n const scrollToSlide = (speed, value, runCallbacks) => {\n if (value) {\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHistory = slugify(slide.attr('data-history'));\n if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n };\n\n const setHistoryPopState = () => {\n paths = getPathValues(swiper.params.url);\n scrollToSlide(swiper.params.speed, swiper.paths.value, false);\n };\n\n const init = () => {\n const window = getWindow();\n if (!swiper.params.history) return;\n if (!window.history || !window.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n initialized = true;\n paths = getPathValues(swiper.params.url);\n if (!paths.key && !paths.value) return;\n scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n window.addEventListener('popstate', setHistoryPopState);\n }\n };\n const destroy = () => {\n const window = getWindow();\n if (!swiper.params.history.replaceState) {\n window.removeEventListener('popstate', setHistoryPopState);\n }\n };\n\n on('init', () => {\n if (swiper.params.history.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.history.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function HashNavigation({ swiper, extendParams, emit, on }) {\n let initialized = false;\n const document = getDocument();\n const window = getWindow();\n extendParams({\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n },\n });\n const onHashChange = () => {\n emit('hashChange');\n const newHash = document.location.hash.replace('#', '');\n const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n if (newHash !== activeSlideHash) {\n const newIndex = swiper.$wrapperEl\n .children(`.${swiper.params.slideClass}[data-hash=\"${newHash}\"]`)\n .index();\n if (typeof newIndex === 'undefined') return;\n swiper.slideTo(newIndex);\n }\n };\n const setHash = () => {\n if (!initialized || !swiper.params.hashNavigation.enabled) return;\n if (\n swiper.params.hashNavigation.replaceState &&\n window.history &&\n window.history.replaceState\n ) {\n window.history.replaceState(\n null,\n null,\n `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '',\n );\n emit('hashSet');\n } else {\n const slide = swiper.slides.eq(swiper.activeIndex);\n const hash = slide.attr('data-hash') || slide.attr('data-history');\n document.location.hash = hash || '';\n emit('hashSet');\n }\n };\n const init = () => {\n if (\n !swiper.params.hashNavigation.enabled ||\n (swiper.params.history && swiper.params.history.enabled)\n )\n return;\n initialized = true;\n const hash = document.location.hash.replace('#', '');\n if (hash) {\n const speed = 0;\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHash = slide.attr('data-hash') || slide.attr('data-history');\n if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n }\n }\n }\n if (swiper.params.hashNavigation.watchState) {\n $(window).on('hashchange', onHashChange);\n }\n };\n const destroy = () => {\n if (swiper.params.hashNavigation.watchState) {\n $(window).off('hashchange', onHashChange);\n }\n };\n\n on('init', () => {\n if (swiper.params.hashNavigation.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.hashNavigation.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHash();\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHash();\n }\n });\n}\n","/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Autoplay({ swiper, extendParams, on, emit }) {\n let timeout;\n\n swiper.autoplay = {\n running: false,\n paused: false,\n };\n\n extendParams({\n autoplay: {\n enabled: false,\n delay: 3000,\n waitForTransition: true,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n reverseDirection: false,\n pauseOnMouseEnter: false,\n },\n });\n\n function run() {\n const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n let delay = swiper.params.autoplay.delay;\n if ($activeSlideEl.attr('data-swiper-autoplay')) {\n delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n }\n clearTimeout(timeout);\n timeout = nextTick(() => {\n let autoplayResult;\n if (swiper.params.autoplay.reverseDirection) {\n if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isBeginning) {\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(\n swiper.slides.length - 1,\n swiper.params.speed,\n true,\n true,\n );\n emit('autoplay');\n } else {\n stop();\n }\n } else if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isEnd) {\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n emit('autoplay');\n } else {\n stop();\n }\n if (swiper.params.cssMode && swiper.autoplay.running) run();\n else if (autoplayResult === false) {\n run();\n }\n }, delay);\n }\n function start() {\n if (typeof timeout !== 'undefined') return false;\n if (swiper.autoplay.running) return false;\n swiper.autoplay.running = true;\n emit('autoplayStart');\n run();\n return true;\n }\n function stop() {\n if (!swiper.autoplay.running) return false;\n if (typeof timeout === 'undefined') return false;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n swiper.autoplay.running = false;\n emit('autoplayStop');\n return true;\n }\n function pause(speed) {\n if (!swiper.autoplay.running) return;\n if (swiper.autoplay.paused) return;\n if (timeout) clearTimeout(timeout);\n swiper.autoplay.paused = true;\n if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n swiper.autoplay.paused = false;\n run();\n } else {\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n });\n }\n }\n function onVisibilityChange() {\n const document = getDocument();\n if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n pause();\n }\n if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n run();\n swiper.autoplay.paused = false;\n }\n }\n function onTransitionEnd(e) {\n if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n if (e.target !== swiper.$wrapperEl[0]) return;\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n swiper.autoplay.paused = false;\n if (!swiper.autoplay.running) {\n stop();\n } else {\n run();\n }\n }\n function onMouseEnter() {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n }\n function onMouseLeave() {\n if (swiper.params.autoplay.disableOnInteraction) {\n return;\n }\n swiper.autoplay.paused = false;\n run();\n }\n function attachMouseEvents() {\n if (swiper.params.autoplay.pauseOnMouseEnter) {\n swiper.$el.on('mouseenter', onMouseEnter);\n swiper.$el.on('mouseleave', onMouseLeave);\n }\n }\n function detachMouseEvents() {\n swiper.$el.off('mouseenter', onMouseEnter);\n swiper.$el.off('mouseleave', onMouseLeave);\n }\n\n on('init', () => {\n if (swiper.params.autoplay.enabled) {\n start();\n const document = getDocument();\n document.addEventListener('visibilitychange', onVisibilityChange);\n attachMouseEvents();\n }\n });\n on('beforeTransitionStart', (_s, speed, internal) => {\n if (swiper.autoplay.running) {\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.pause(speed);\n } else {\n stop();\n }\n }\n });\n on('sliderFirstMove', () => {\n if (swiper.autoplay.running) {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n }\n });\n on('touchEnd', () => {\n if (\n swiper.params.cssMode &&\n swiper.autoplay.paused &&\n !swiper.params.autoplay.disableOnInteraction\n ) {\n run();\n }\n });\n on('destroy', () => {\n detachMouseEvents();\n if (swiper.autoplay.running) {\n stop();\n }\n const document = getDocument();\n document.removeEventListener('visibilitychange', onVisibilityChange);\n });\n\n Object.assign(swiper.autoplay, {\n pause,\n run,\n start,\n stop,\n });\n}\n","import { isObject } from '../../shared/utils.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Thumb({ swiper, extendParams, on }) {\n extendParams({\n thumbs: {\n swiper: null,\n multipleActiveThumbs: true,\n autoScrollOffset: 0,\n slideThumbActiveClass: 'swiper-slide-thumb-active',\n thumbsContainerClass: 'swiper-thumbs',\n },\n });\n\n let initialized = false;\n let swiperCreated = false;\n\n swiper.thumbs = {\n swiper: null,\n };\n\n function onThumbClick() {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n const clickedIndex = thumbsSwiper.clickedIndex;\n const clickedSlide = thumbsSwiper.clickedSlide;\n if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass))\n return;\n if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n let slideToIndex;\n if (thumbsSwiper.params.loop) {\n slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n } else {\n slideToIndex = clickedIndex;\n }\n if (swiper.params.loop) {\n let currentIndex = swiper.activeIndex;\n if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n currentIndex = swiper.activeIndex;\n }\n const prevIndex = swiper.slides\n .eq(currentIndex)\n .prevAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n const nextIndex = swiper.slides\n .eq(currentIndex)\n .nextAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;\n else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;\n else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;\n else slideToIndex = prevIndex;\n }\n swiper.slideTo(slideToIndex);\n }\n\n function init() {\n const { thumbs: thumbsParams } = swiper.params;\n if (initialized) return false;\n initialized = true;\n const SwiperClass = swiper.constructor;\n if (thumbsParams.swiper instanceof SwiperClass) {\n swiper.thumbs.swiper = thumbsParams.swiper;\n Object.assign(swiper.thumbs.swiper.originalParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n Object.assign(swiper.thumbs.swiper.params, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n } else if (isObject(thumbsParams.swiper)) {\n const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n Object.assign(thumbsSwiperParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n swiperCreated = true;\n }\n swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n swiper.thumbs.swiper.on('tap', onThumbClick);\n return true;\n }\n\n function update(initial) {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n\n const slidesPerView =\n thumbsSwiper.params.slidesPerView === 'auto'\n ? thumbsSwiper.slidesPerViewDynamic()\n : thumbsSwiper.params.slidesPerView;\n\n const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n let currentThumbsIndex = thumbsSwiper.activeIndex;\n let newThumbsIndex;\n let direction;\n if (thumbsSwiper.params.loop) {\n if (\n thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .hasClass(thumbsSwiper.params.slideDuplicateClass)\n ) {\n thumbsSwiper.loopFix();\n // eslint-disable-next-line\n thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n currentThumbsIndex = thumbsSwiper.activeIndex;\n }\n // Find actual thumbs index to slide to\n const prevThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .prevAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n const nextThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .nextAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevThumbsIndex === 'undefined') {\n newThumbsIndex = nextThumbsIndex;\n } else if (typeof nextThumbsIndex === 'undefined') {\n newThumbsIndex = prevThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex =\n thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex = nextThumbsIndex;\n } else {\n newThumbsIndex = prevThumbsIndex;\n }\n direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n } else {\n newThumbsIndex = swiper.realIndex;\n direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n }\n if (useOffset) {\n newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n }\n\n if (\n thumbsSwiper.visibleSlidesIndexes &&\n thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0\n ) {\n if (thumbsSwiper.params.centeredSlides) {\n if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n } else {\n newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n }\n } else if (\n newThumbsIndex > currentThumbsIndex &&\n thumbsSwiper.params.slidesPerGroup === 1\n ) {\n // newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n }\n thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n }\n }\n\n // Activate thumbs\n let thumbsToActivate = 1;\n const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n thumbsToActivate = swiper.params.slidesPerView;\n }\n\n if (!swiper.params.thumbs.multipleActiveThumbs) {\n thumbsToActivate = 1;\n }\n\n thumbsToActivate = Math.floor(thumbsToActivate);\n\n thumbsSwiper.slides.removeClass(thumbActiveClass);\n if (\n thumbsSwiper.params.loop ||\n (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)\n ) {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.$wrapperEl\n .children(`[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`)\n .addClass(thumbActiveClass);\n }\n } else {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass);\n }\n }\n }\n\n on('beforeInit', () => {\n const { thumbs } = swiper.params;\n if (!thumbs || !thumbs.swiper) return;\n init();\n update(true);\n });\n on('slideChange update resize observerUpdate', () => {\n if (!swiper.thumbs.swiper) return;\n update();\n });\n on('setTransition', (_s, duration) => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n thumbsSwiper.setTransition(duration);\n });\n on('beforeDestroy', () => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n if (swiperCreated && thumbsSwiper) {\n thumbsSwiper.destroy();\n }\n });\n\n Object.assign(swiper.thumbs, {\n init,\n update,\n });\n}\n","import { now } from '../../shared/utils.js';\n\nexport default function freeMode({ swiper, extendParams, emit, once }) {\n extendParams({\n freeMode: {\n enabled: false,\n momentum: true,\n momentumRatio: 1,\n momentumBounce: true,\n momentumBounceRatio: 1,\n momentumVelocityRatio: 1,\n sticky: false,\n minimumVelocity: 0.02,\n },\n });\n\n function onTouchMove() {\n const { touchEventsData: data, touches } = swiper;\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime,\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: now(),\n });\n }\n\n function onTouchEnd({ currentPos }) {\n const { params, $wrapperEl, rtlTranslate: rtl, snapGrid, touchEventsData: data } = swiper;\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n\n if (params.freeMode.momentum) {\n if (data.velocities.length > 1) {\n const lastMoveEvent = data.velocities.pop();\n const velocityEvent = data.velocities.pop();\n\n const distance = lastMoveEvent.position - velocityEvent.position;\n const time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || now() - lastMoveEvent.time > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeMode.momentumVelocityRatio;\n\n data.velocities.length = 0;\n let momentumDuration = 1000 * params.freeMode.momentumRatio;\n const momentumDistance = swiper.velocity * momentumDuration;\n\n let newPosition = swiper.translate + momentumDistance;\n if (rtl) newPosition = -newPosition;\n\n let doBounce = false;\n let afterBouncePosition;\n const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n let needsLoopFix;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (params.freeMode.sticky) {\n let nextSlide;\n for (let j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n\n if (\n Math.abs(snapGrid[nextSlide] - newPosition) <\n Math.abs(snapGrid[nextSlide - 1] - newPosition) ||\n swiper.swipeDirection === 'next'\n ) {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n if (needsLoopFix) {\n once('transitionEnd', () => {\n swiper.loopFix();\n });\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n if (params.freeMode.sticky) {\n // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n // It's easy to see this when simulating touch with mouse events. To fix this,\n // limit single-slide swipes to the default slide duration. This also has the\n // nice side effect of matching slide speed if the user stopped moving before\n // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n // For faster swipes, also apply limits (albeit higher ones).\n const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n if (moveDistance < currentSlideSize) {\n momentumDuration = params.speed;\n } else if (moveDistance < 2 * currentSlideSize) {\n momentumDuration = params.speed * 1.5;\n } else {\n momentumDuration = params.speed * 2.5;\n }\n }\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (params.freeMode.momentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n emit('momentumBounce');\n swiper.setTransition(params.speed);\n setTimeout(() => {\n swiper.setTranslate(afterBouncePosition);\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }, 0);\n });\n } else if (swiper.velocity) {\n emit('_freeModeNoMomentumRelease');\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n } else if (params.freeMode) {\n emit('_freeModeNoMomentumRelease');\n }\n\n if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n }\n\n Object.assign(swiper, {\n freeMode: {\n onTouchMove,\n onTouchEnd,\n },\n });\n}\n","export default function Grid({ swiper, extendParams }) {\n extendParams({\n grid: {\n rows: 1,\n fill: 'column',\n },\n });\n\n let slidesNumberEvenToRows;\n let slidesPerRow;\n let numFullColumns;\n\n const initSlides = (slidesLength) => {\n const { slidesPerView } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n slidesPerRow = slidesNumberEvenToRows / rows;\n numFullColumns = Math.floor(slidesLength / rows);\n if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n slidesNumberEvenToRows = slidesLength;\n } else {\n slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n }\n if (slidesPerView !== 'auto' && fill === 'row') {\n slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n }\n };\n\n const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {\n const { slidesPerGroup, spaceBetween } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n // Set slides order\n let newSlideOrderIndex;\n let column;\n let row;\n if (fill === 'row' && slidesPerGroup > 1) {\n const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n const columnsInGroup =\n groupIndex === 0\n ? slidesPerGroup\n : Math.min(\n Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows),\n slidesPerGroup,\n );\n row = Math.floor(slideIndexInGroup / columnsInGroup);\n column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n\n newSlideOrderIndex = column + (row * slidesNumberEvenToRows) / rows;\n slide.css({\n '-webkit-order': newSlideOrderIndex,\n order: newSlideOrderIndex,\n });\n } else if (fill === 'column') {\n column = Math.floor(i / rows);\n row = i - column * rows;\n if (column > numFullColumns || (column === numFullColumns && row === rows - 1)) {\n row += 1;\n if (row >= rows) {\n row = 0;\n column += 1;\n }\n }\n } else {\n row = Math.floor(i / slidesPerRow);\n column = i - row * slidesPerRow;\n }\n slide.css(\n getDirectionLabel('margin-top'),\n row !== 0 ? spaceBetween && `${spaceBetween}px` : '',\n );\n };\n\n const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {\n const { spaceBetween, centeredSlides, roundLengths } = swiper.params;\n const { rows } = swiper.params.grid;\n swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n swiper.$wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px`,\n });\n if (centeredSlides) {\n snapGrid.splice(0, snapGrid.length);\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n }\n snapGrid.push(...newSlidesGrid);\n }\n };\n\n swiper.grid = {\n initSlides,\n updateSlide,\n updateWrapperSize,\n };\n}\n","export default function appendSlide(slides) {\n const swiper = this;\n const { $wrapperEl, params } = swiper;\n if (params.loop) {\n swiper.loopDestroy();\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n } else {\n $wrapperEl.append(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n}\n","export default function prependSlide(slides) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n if (params.loop) {\n swiper.loopDestroy();\n }\n let newActiveIndex = activeIndex + 1;\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.prepend(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n $wrapperEl.prepend(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n}\n","export default function addSlide(index, slides) {\n const swiper = this;\n const { $wrapperEl, params, activeIndex } = swiper;\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n const baseLength = swiper.slides.length;\n if (index <= 0) {\n swiper.prependSlide(slides);\n return;\n }\n if (index >= baseLength) {\n swiper.appendSlide(slides);\n return;\n }\n let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n const slidesBuffer = [];\n for (let i = baseLength - 1; i >= index; i -= 1) {\n const currentSlide = swiper.slides.eq(i);\n currentSlide.remove();\n slidesBuffer.unshift(currentSlide);\n }\n\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n newActiveIndex =\n activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n } else {\n $wrapperEl.append(slides);\n }\n\n for (let i = 0; i < slidesBuffer.length; i += 1) {\n $wrapperEl.append(slidesBuffer[i]);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeSlide(slidesIndexes) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n let newActiveIndex = activeIndexBuffer;\n let indexToRemove;\n\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (let i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeAllSlides() {\n const swiper = this;\n\n const slidesIndexes = [];\n for (let i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n}\n","import appendSlide from './methods/appendSlide.js';\nimport prependSlide from './methods/prependSlide.js';\nimport addSlide from './methods/addSlide.js';\nimport removeSlide from './methods/removeSlide.js';\nimport removeAllSlides from './methods/removeAllSlides.js';\n\nexport default function Manipulation({ swiper }) {\n Object.assign(swiper, {\n appendSlide: appendSlide.bind(swiper),\n prependSlide: prependSlide.bind(swiper),\n addSlide: addSlide.bind(swiper),\n removeSlide: removeSlide.bind(swiper),\n removeAllSlides: removeAllSlides.bind(swiper),\n });\n}\n","export default function effectInit(params) {\n const { effect, swiper, on, setTranslate, setTransition, overwriteParams, perspective } = params;\n\n on('beforeInit', () => {\n if (swiper.params.effect !== effect) return;\n swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n if (perspective && perspective()) {\n swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n }\n\n const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n\n Object.assign(swiper.params, overwriteParamsResult);\n Object.assign(swiper.originalParams, overwriteParamsResult);\n });\n on('setTranslate', () => {\n if (swiper.params.effect !== effect) return;\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n if (swiper.params.effect !== effect) return;\n setTransition(duration);\n });\n}\n","export default function effectTarget(effectParams, $slideEl) {\n if (effectParams.transformEl) {\n return $slideEl.find(effectParams.transformEl).css({\n 'backface-visibility': 'hidden',\n '-webkit-backface-visibility': 'hidden',\n });\n }\n return $slideEl;\n}\n","export default function effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides }) {\n const { slides, activeIndex, $wrapperEl } = swiper;\n if (swiper.params.virtualTranslate && duration !== 0) {\n let eventTriggered = false;\n let $transitionEndTarget;\n if (allSlides) {\n $transitionEndTarget = transformEl ? slides.find(transformEl) : slides;\n } else {\n $transitionEndTarget = transformEl\n ? slides.eq(activeIndex).find(transformEl)\n : slides.eq(activeIndex);\n }\n $transitionEndTarget.transitionEnd(() => {\n if (eventTriggered) return;\n if (!swiper || swiper.destroyed) return;\n eventTriggered = true;\n swiper.animating = false;\n const triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (let i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n}\n","import effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFade({ swiper, extendParams, on }) {\n extendParams({\n fadeEffect: {\n crossFade: false,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides } = swiper;\n const params = swiper.params.fadeEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = swiper.slides.eq(i);\n const offset = $slideEl[0].swiperSlideOffset;\n let tx = -offset;\n if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n const slideOpacity = swiper.params.fadeEffect.crossFade\n ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl\n .css({\n opacity: slideOpacity,\n })\n .transform(`translate3d(${tx}px, ${ty}px, 0px)`);\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.fadeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'fade',\n swiper,\n on,\n setTranslate,\n setTransition,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import $ from '../../shared/dom.js';\nimport effectInit from '../../shared/effect-init.js';\n\nexport default function EffectCube({ swiper, extendParams, on }) {\n extendParams({\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n });\n\n const setTranslate = () => {\n const {\n $el,\n $wrapperEl,\n slides,\n width: swiperWidth,\n height: swiperHeight,\n rtlTranslate: rtl,\n size: swiperSize,\n browser,\n } = swiper;\n const params = swiper.params.cubeEffect;\n const isHorizontal = swiper.isHorizontal();\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let wrapperRotate = 0;\n let $cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
');\n $wrapperEl.append($cubeShadowEl);\n }\n $cubeShadowEl.css({ height: `${swiperWidth}px` });\n } else {\n $cubeShadowEl = $el.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
');\n $el.append($cubeShadowEl);\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n }\n let slideAngle = slideIndex * 90;\n let round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n const progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n let tx = 0;\n let ty = 0;\n let tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + round * 4 * swiperSize;\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = 3 * swiperSize + swiperSize * 4 * round;\n }\n if (rtl) {\n tx = -tx;\n }\n\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n\n const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${\n isHorizontal ? slideAngle : 0\n }deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n if (progress <= 1 && progress > -1) {\n wrapperRotate = slideIndex * 90 + progress * 90;\n if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n }\n $slideEl.transform(transform);\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $(\n `
`,\n );\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $(\n `
`,\n );\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n }\n $wrapperEl.css({\n '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`,\n 'transform-origin': `50% 50% -${swiperSize / 2}px`,\n });\n\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl.transform(\n `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${\n -swiperWidth / 2\n }px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`,\n );\n } else {\n const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n const multiplier =\n 1.5 -\n (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2 +\n Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2);\n const scale1 = params.shadowScale;\n const scale2 = params.shadowScale / multiplier;\n const offset = params.shadowOffset;\n $cubeShadowEl.transform(\n `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${\n -swiperHeight / 2 / scale2\n }px) rotateX(-90deg)`,\n );\n }\n }\n const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;\n $wrapperEl.transform(\n `translate3d(0px,0,${zFactor}px) rotateX(${\n swiper.isHorizontal() ? 0 : wrapperRotate\n }deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`,\n );\n };\n const setTransition = (duration) => {\n const { $el, slides } = swiper;\n slides\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n $el.find('.swiper-cube-shadow').transition(duration);\n }\n };\n\n effectInit({\n effect: 'cube',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true,\n }),\n });\n}\n","import $ from './dom.js';\n\nexport default function createShadow(params, $slideEl, side) {\n const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`;\n const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl;\n let $shadowEl = $shadowContainer.children(`.${shadowClass}`);\n\n if (!$shadowEl.length) {\n $shadowEl = $(`
`);\n $shadowContainer.append($shadowEl);\n }\n return $shadowEl;\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFlip({ swiper, extendParams, on }) {\n extendParams({\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, rtlTranslate: rtl } = swiper;\n const params = swiper.params.flipEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let progress = $slideEl[0].progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n }\n const offset = $slideEl[0].swiperSlideOffset;\n const rotate = -180 * progress;\n let rotateY = rotate;\n let rotateX = 0;\n let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (rtl) {\n rotateY = -rotateY;\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top');\n }\n if (shadowAfter.length === 0) {\n shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.flipEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'flip',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\n\nexport default function EffectCoverflow({ swiper, extendParams, on }) {\n extendParams({\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n scale: 1,\n modifier: 1,\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { width: swiperWidth, height: swiperHeight, slides, slidesSizesGrid } = swiper;\n const params = swiper.params.coverflowEffect;\n const isHorizontal = swiper.isHorizontal();\n const transform = swiper.translate;\n const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n const rotate = isHorizontal ? params.rotate : -params.rotate;\n const translate = params.depth;\n // Each slide offset from center\n for (let i = 0, length = slides.length; i < length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideSize = slidesSizesGrid[i];\n const slideOffset = $slideEl[0].swiperSlideOffset;\n const offsetMultiplier =\n ((center - slideOffset - slideSize / 2) / slideSize) * params.modifier;\n\n let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n let translateZ = -translate * Math.abs(offsetMultiplier);\n\n let stretch = params.stretch;\n // Allow percentage to make a relative stretch for responsive sliders\n if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n stretch = (parseFloat(params.stretch) / 100) * slideSize;\n }\n let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n\n let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) translateX = 0;\n if (Math.abs(translateY) < 0.001) translateY = 0;\n if (Math.abs(translateZ) < 0.001) translateZ = 0;\n if (Math.abs(rotateY) < 0.001) rotateY = 0;\n if (Math.abs(rotateX) < 0.001) rotateX = 0;\n if (Math.abs(scale) < 0.001) scale = 0;\n\n const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(slideTransform);\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowBeforeEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let $shadowAfterEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if ($shadowBeforeEl.length === 0) {\n $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top');\n }\n if ($shadowAfterEl.length === 0) {\n $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom');\n }\n if ($shadowBeforeEl.length)\n $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n if ($shadowAfterEl.length)\n $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n }\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.coverflowEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n };\n\n effectInit({\n effect: 'coverflow',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCreative({ swiper, extendParams, on }) {\n extendParams({\n creativeEffect: {\n transformEl: null,\n limitProgress: 1,\n shadowPerProgress: false,\n progressMultiplier: 1,\n perspective: true,\n prev: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n next: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n },\n });\n\n const getTranslateValue = (value) => {\n if (typeof value === 'string') return value;\n return `${value}px`;\n };\n\n const setTranslate = () => {\n const { slides, $wrapperEl, slidesSizesGrid } = swiper;\n const params = swiper.params.creativeEffect;\n const { progressMultiplier: multiplier } = params;\n\n const isCenteredSlides = swiper.params.centeredSlides;\n\n if (isCenteredSlides) {\n const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;\n $wrapperEl.transform(`translateX(calc(50% - ${margin}px))`);\n }\n\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(\n Math.max($slideEl[0].progress, -params.limitProgress),\n params.limitProgress,\n );\n let originalProgress = progress;\n\n if (!isCenteredSlides) {\n originalProgress = Math.min(\n Math.max($slideEl[0].originalProgress, -params.limitProgress),\n params.limitProgress,\n );\n }\n\n const offset = $slideEl[0].swiperSlideOffset;\n const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n const r = [0, 0, 0];\n let custom = false;\n if (!swiper.isHorizontal()) {\n t[1] = t[0];\n t[0] = 0;\n }\n let data = {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n scale: 1,\n opacity: 1,\n };\n if (progress < 0) {\n data = params.next;\n custom = true;\n } else if (progress > 0) {\n data = params.prev;\n custom = true;\n }\n // set translate\n t.forEach((value, index) => {\n t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(\n progress * multiplier,\n )}))`;\n });\n // set rotates\n r.forEach((value, index) => {\n r[index] = data.rotate[index] * Math.abs(progress * multiplier);\n });\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n\n const translateString = t.join(', ');\n const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;\n const scaleString =\n originalProgress < 0\n ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})`\n : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;\n const opacityString =\n originalProgress < 0\n ? 1 + (1 - data.opacity) * originalProgress * multiplier\n : 1 - (1 - data.opacity) * originalProgress * multiplier;\n const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n // Set shadows\n if ((custom && data.shadow) || !custom) {\n let $shadowEl = $slideEl.children('.swiper-slide-shadow');\n if ($shadowEl.length === 0 && data.shadow) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length) {\n const shadowOpacity = params.shadowPerProgress\n ? progress * (1 / params.limitProgress)\n : progress;\n $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n }\n }\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform).css({ opacity: opacityString });\n if (data.origin) {\n $targetEl.css('transform-origin', data.origin);\n }\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.creativeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'creative',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => swiper.params.creativeEffect.perspective,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCards({ swiper, extendParams, on }) {\n extendParams({\n cardsEffect: {\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, activeIndex } = swiper;\n const params = swiper.params.cardsEffect;\n const { startTranslate, isTouched } = swiper.touchEventsData;\n const currentTranslate = swiper.translate;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(Math.max(slideProgress, -4), 4);\n let offset = $slideEl[0].swiperSlideOffset;\n if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`);\n }\n if (swiper.params.centeredSlides && swiper.params.cssMode) {\n offset -= slides[0].swiperSlideOffset;\n }\n let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let tY = 0;\n const tZ = -100 * Math.abs(progress);\n let scale = 1;\n let rotate = -2 * progress;\n\n let tXAdd = 8 - Math.abs(progress) * 0.75;\n\n const isSwipeToNext =\n (i === activeIndex || i === activeIndex - 1) &&\n progress > 0 &&\n progress < 1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate < startTranslate;\n const isSwipeToPrev =\n (i === activeIndex || i === activeIndex + 1) &&\n progress < 0 &&\n progress > -1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate > startTranslate;\n if (isSwipeToNext || isSwipeToPrev) {\n const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n rotate += -28 * progress * subProgress;\n scale += -0.5 * subProgress;\n tXAdd += 96 * subProgress;\n tY = `${-25 * subProgress * Math.abs(progress)}%`;\n }\n\n if (progress < 0) {\n // next\n tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`;\n } else if (progress > 0) {\n // prev\n tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`;\n } else {\n tX = `${tX}px`;\n }\n if (!swiper.isHorizontal()) {\n const prevY = tY;\n tY = tX;\n tX = prevY;\n }\n\n const scaleString =\n progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n const transform = `\n translate3d(${tX}, ${tY}, ${tZ}px)\n rotateZ(${rotate}deg)\n scale(${scaleString})\n `;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowEl = $slideEl.find('.swiper-slide-shadow');\n if ($shadowEl.length === 0) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length)\n $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.cardsEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'cards',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","// Swiper Class\nimport Swiper from './core/core.js';\n\n//IMPORT_MODULES\n\nconst modules = [\n //INSTALL_MODULES\n];\n\nSwiper.use(modules);\n\n//EXPORT\n"],"names":["isObject","obj","constructor","Object","extend","target","src","keys","forEach","key","length","ssrDocument","body","addEventListener","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","createElement","children","childNodes","style","setAttribute","getElementsByTagName","createElementNS","importNode","location","hash","host","hostname","href","origin","pathname","protocol","search","getDocument","doc","document","ssrWindow","navigator","userAgent","history","replaceState","pushState","go","back","CustomEvent","getComputedStyle","getPropertyValue","Image","Date","screen","setTimeout","clearTimeout","matchMedia","requestAnimationFrame","callback","cancelAnimationFrame","id","getWindow","win","window","makeReactive","proto","__proto__","defineProperty","get","set","value","Dom7","Array","items","arrayFlat","arr","res","el","isArray","push","arrayFilter","prototype","filter","call","arrayUnique","uniqueArray","i","indexOf","qsa","selector","context","a","$","html","trim","toCreate","tempParent","innerHTML","nodeType","fn","addClass","classes","classNames","map","c","split","classList","add","removeClass","remove","toggleClass","className","toggle","hasClass","contains","attr","attrs","arguments","getAttribute","undefined","attrName","removeAttr","removeAttribute","transform","transition","duration","transitionDuration","on","args","eventType","targetSelector","listener","capture","handleLiveEvent","e","eventData","dom7EventData","unshift","is","apply","parents","k","handleEvent","events","j","event","dom7Listeners","proxyListener","dom7LiveListeners","off","handlers","handler","splice","dom7proxy","trigger","evt","detail","bubbles","cancelable","data","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","offsetWidth","parseFloat","outerHeight","offsetHeight","offset","box","getBoundingClientRect","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","top","left","css","props","prop","each","index","result","text","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","append","els","newChild","tempDiv","firstChild","appendChild","prepend","insertBefore","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parent","parentNode","closest","find","foundElements","found","removeChild","Methods","methodName","writable","deleteProps","object","nextTick","delay","now","currentStyle","getTranslate","axis","matrix","curTransform","transformMatrix","curStyle","WebKitCSSMatrix","webkitTransform","replace","join","MozTransform","OTransform","MsTransform","msTransform","toString","m41","m42","o","slice","isNode","node","HTMLElement","to","noExtend","nextSource","keysArray","nextIndex","len","nextKey","desc","getOwnPropertyDescriptor","enumerable","__swiper__","setCSSProperty","varName","varValue","setProperty","animateCSSModeScroll","swiper","targetPosition","side","startPosition","translate","startTime","time","params","speed","wrapperEl","scrollSnapType","cssModeFrameID","dir","isOutOfBound","current","animate","getTime","progress","Math","max","min","easeProgress","cos","PI","currentPosition","scrollTo","overflow","support","calcSupport","smoothScroll","documentElement","touch","DocumentTouch","passiveListener","checkPassiveListener","supportsPassive","opts","gestures","checkGestures","getSupport","deviceCached","calcDevice","platform","ua","device","ios","android","screenWidth","width","screenHeight","height","match","ipad","ipod","iphone","windows","macos","iPadScreens","os","getDevice","overrides","browser","calcBrowser","isSafari","toLowerCase","isWebView","test","getBrowser","Resize","emit","observer","resizeHandler","destroyed","initialized","createObserver","ResizeObserver","entries","newWidth","newHeight","contentBoxSize","contentRect","inlineSize","blockSize","observe","removeObserver","unobserve","orientationChangeHandler","resizeObserver","Observer","extendParams","observers","attach","options","ObserverFunc","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","attributes","childList","characterData","init","observeParents","containerParents","$el","observeSlideChildren","$wrapperEl","destroy","disconnect","priority","self","method","eventsListeners","once","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","eventHandler","eventsArray","updateSize","clientWidth","clientHeight","isHorizontal","isVertical","parseInt","Number","isNaN","assign","size","updateSlides","getDirectionLabel","property","getDirectionPropertyValue","label","swiperSize","rtlTranslate","rtl","wrongRTL","isVirtual","virtual","enabled","previousSlidesLength","slides","slideClass","slidesLength","snapGrid","slidesGrid","slidesSizesGrid","offsetBefore","slidesOffsetBefore","offsetAfter","slidesOffsetAfter","previousSnapGridLength","previousSlidesGridLength","spaceBetween","slidePosition","prevSlideSize","virtualSize","marginLeft","marginBottom","marginTop","marginRight","centeredSlides","cssMode","gridEnabled","grid","rows","initSlides","slideSize","shouldResetSlideSize","slidesPerView","breakpoints","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","roundLengths","paddingLeft","paddingRight","boxSizing","floor","swiperSlideSize","abs","slidesPerGroup","slidesPerGroupSkip","effect","setWrapperSize","updateWrapperSize","newSlidesGrid","slidesGridItem","_","slideIndex","centeredSlidesBounds","allSlidesSize","slideSizeValue","maxSnap","snap","centerInsufficientSlides","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","v","watchOverflow","checkOverflow","watchSlidesProgress","updateSlidesOffset","updateAutoHeight","activeSlides","setTransition","getSlideByIndex","visibleSlides","ceil","activeIndex","swiperSlideOffset","offsetLeft","offsetTop","updateSlidesProgress","offsetCenter","slideVisibleClass","visibleSlidesIndexes","slideOffset","slideProgress","minTranslate","originalSlideProgress","slideBefore","slideAfter","isVisible","originalProgress","updateProgress","multiplier","translatesDiff","maxTranslate","isBeginning","isEnd","wasBeginning","wasEnd","autoHeight","updateSlidesClasses","realIndex","slideActiveClass","slideNextClass","slidePrevClass","slideDuplicateActiveClass","slideDuplicateNextClass","slideDuplicatePrevClass","activeSlide","loop","slideDuplicateClass","nextSlide","prevSlide","emitSlidesClasses","updateActiveIndex","newActiveIndex","previousIndex","previousRealIndex","previousSnapIndex","normalizeSlideIndex","skip","runCallbacksOnInit","updateClickedSlide","slideFound","clickedSlide","clickedIndex","slideToClickedSlide","getSwiperTranslate","virtualTranslate","currentTranslate","setTranslate","byController","x","y","z","previousTranslate","newProgress","translateTo","runCallbacks","translateBounds","internal","animating","preventInteractionOnTransition","newTranslate","isH","behavior","onTranslateToWrapperTransitionEnd","transitionEmit","direction","step","transitionStart","slideTo","initial","Error","indexAsNumber","isValidNumber","isFinite","initialSlide","normalizedTranslate","normalizedGrid","normalizedGridNext","allowSlideNext","allowSlidePrev","t","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","loopedSlides","slideNext","perGroup","slidesPerGroupAuto","slidesPerViewDynamic","increment","loopPreventsSlide","loopFix","_clientLeft","slidePrev","normalize","val","normalizedSnapGrid","prevSnap","prevSnapIndex","prevIndex","slideReset","slideToClosest","threshold","currentSnap","nextSnap","slideToIndex","loopCreate","$selector","loopFillGroupWithBlank","blankSlidesNum","blankNode","slideBlankClass","loopAdditionalSlides","prependSlides","appendSlides","cloneNode","snapTranslate","diff","slideChanged","loopDestroy","setGrabCursor","moving","simulateTouch","isLocked","touchEventsTarget","cursor","unsetGrabCursor","closestElement","base","__closestFrom","assignedSlot","getRootNode","onTouchStart","touchEventsData","touches","originalEvent","$targetEl","isTouchEvent","type","which","button","isTouched","isMoved","swipingClassHasValue","noSwipingClass","shadowRoot","path","noSwipingSelector","isTargetShadow","noSwiping","allowClick","swipeHandler","currentX","targetTouches","pageX","currentY","pageY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","innerWidth","preventDefault","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","swipeDirection","allowThresholdMove","focusableElements","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","isContentEditable","onTouchMove","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","diffX","diffY","sqrt","touchAngle","atan2","touchMoveStopPropagation","nested","stopPropagation","startTranslate","allowMomentumBounce","grabCursor","touchRatio","disableParentSwiper","resistanceRatio","resistance","followFinger","freeMode","onTouchEnd","touchEndTime","timeDiff","lastClickTime","currentPos","stopIndex","groupSize","ratio","longSwipesMs","longSwipes","longSwipesRatio","shortSwipes","isNavButtonTarget","navigation","nextEl","prevEl","onResize","setBreakpoint","autoplay","running","paused","run","onClick","preventClicks","preventClicksPropagation","stopImmediatePropagation","onScroll","dummyEventAttached","dummyEventListener","touchEvents","domMethod","swiperMethod","start","move","end","passiveListeners","passive","cancel","updateOnWindowResize","attachEvents","bind","detachEvents","isGridEnabled","breakpoint","getBreakpoint","breakpointsBase","currentBreakpoint","breakpointOnlyParams","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","containerModifierClass","emitContainerClasses","fill","directionChanged","needsReLoop","changeDirection","isEnabled","disable","enable","containerEl","currentHeight","innerHeight","points","point","minRatio","substr","sort","b","prepareClasses","prefix","resultClasses","item","addClasses","suffixes","removeClasses","loadImage","imageEl","srcset","sizes","checkForComplete","image","onReady","isPicture","complete","onload","onerror","preloadImages","imagesToLoad","imagesLoaded","updateOnImagesReady","update","currentSrc","wasLocked","lastSlideIndex","lastSlideRightEdge","createElements","url","uniqueNavElements","wrapperClass","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","eventsEmitter","images","extendedDefaults","Swiper","swipers","newParams","modules","__modules__","mod","swiperParams","defaults","passedParams","eventName","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","setProgress","cls","getSlideClasses","slideEl","updates","view","exact","spv","breakLoop","slideInView","translateValue","translated","newDirection","needUpdate","currentDirection","mount","mounted","getWrapperSelector","getWrapper","wrapper","deleteInstance","cleanStyles","extendDefaults","newDefaults","installModule","use","module","m","prototypeGroup","protoMethod","Virtual","cache","renderSlide","renderExternal","renderExternalUpdate","addSlidesBefore","addSlidesAfter","cssModeTimeout","from","$slideEl","force","previousFrom","previousTo","previousSlidesGrid","previousOffset","offsetProp","slidesAfter","slidesBefore","onRendered","lazy","load","getSlides","slidesToRender","prependIndexes","appendIndexes","appendSlide","prependSlide","numberOfNewSlides","newCache","cachedIndex","$cachedEl","cachedElIndex","removeSlide","slidesIndexes","removeAllSlides","Keyboard","keyboard","onlyInViewport","pageUpDown","handle","kc","keyCode","charCode","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","shiftKey","altKey","ctrlKey","metaKey","inView","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","swiperCoord","returnValue","Mousewheel","mousewheel","releaseOnEdges","invert","forceToAxis","sensitivity","eventsTarget","thresholdDelta","thresholdTime","timeout","lastScrollTime","lastEventBeforeSnap","recentWheelEvents","PIXEL_STEP","LINE_HEIGHT","PAGE_HEIGHT","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","spinY","pixelX","pixelY","handleMouseEnter","mouseEntered","handleMouseLeave","animateSlider","newEvent","delta","raw","releaseScroll","rtlFactor","positions","sign","shift","prevEvent","ignoreWheelEvents","position","sticky","firstEvent","snapToThreshold","autoplayDisableOnInteraction","stop","createElementIfNotDefined","checkProps","element","Navigation","hideOnClick","disabledClass","hiddenClass","lockClass","$nextEl","$prevEl","getEl","toggleEl","disabled","tagName","onPrevClick","onNextClick","_s","targetEl","pagination","clickable","isHidden","classesToSelector","Pagination","pfx","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","number","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","bullets","bulletSize","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","total","paginationType","firstIndex","lastIndex","midIndex","suffix","bullet","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","progressbarDirection","scale","scaleX","scaleY","render","paginationHTML","numberOfBullets","Scrollbar","dragTimeout","dragStartPos","dragSize","trackSize","divider","scrollbar","hide","draggable","snapOnRelease","dragClass","dragEl","$dragEl","newSize","newPos","opacity","display","getPointerPosition","clientX","clientY","setDragPosition","positionRatio","onDragStart","onDragMove","onDragEnd","activeListener","eventMethod","enableDraggable","disableDraggable","$swiperEl","Parallax","parallax","setTransform","p","currentOpacity","currentScale","parallaxEl","$parallaxEl","parallaxDuration","_swiper","Zoom","zoom","maxRatio","containerClass","zoomedSlideClass","isScaling","gesturesEnabled","fakeGestureTouched","fakeGestureMoved","gesture","slideWidth","slideHeight","$imageEl","$imageWrapEl","minX","minY","maxX","maxY","touchesStart","touchesCurrent","prevPositionX","prevPositionY","prevTime","getDistanceBetweenTouches","x1","y1","x2","y2","distance","onGestureStart","scaleStart","onGestureChange","scaleMove","onGestureEnd","scaledWidth","scaledHeight","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","momentumDuration","onTransitionEnd","zoomIn","touchAction","touchX","touchY","offsetX","offsetY","translateX","translateY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","zoomOut","zoomToggle","getListeners","activeListenerWithCapture","getSlideSelector","toggleGestures","slideSelector","enableGestures","disableGestures","in","out","Lazy","checkInView","loadPrevNext","loadPrevNextAmount","loadOnTransitionStart","scrollingElement","elementClass","loadingClass","loadedClass","preloaderClass","scrollHandlerAttached","initialImageLoaded","loadInSlide","loadInDuplicate","$images","background","$pictureEl","sourceEl","$source","slideOriginalIndex","originalSlide","duplicatedSlide","slideExist","amount","maxIndex","minIndex","checkInViewOnLoad","$scrollElement","isWindow","scrollElementWidth","scrollElementHeight","Controller","controller","control","inverse","by","LinearSpline","binarySearch","guess","array","i1","i3","interpolate","getInterpolateFunction","spline","_t","controlled","controlledTranslate","setControlledTranslate","setControlledTransition","removeSpline","A11y","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","liveRegion","notify","message","notification","getRandomNumber","randomChar","round","random","repeat","makeElFocusable","makeElNotFocusable","addElRole","role","addElRoleDescription","description","addElControls","controls","addElLabel","addElId","addElLive","live","disableEl","enableEl","onEnterOrSpaceKey","click","updateNavigation","hasPagination","updatePagination","bulletEl","initNavEl","wrapperId","$containerEl","ariaLabelMessage","History","root","paths","slugify","getPathValues","urlOverride","URL","pathArray","part","setHistory","includes","currentState","state","scrollToSlide","slideHistory","setHistoryPopState","hashNavigation","HashNavigation","watchState","onHashChange","newHash","activeSlideHash","setHash","slideHash","Autoplay","waitForTransition","disableOnInteraction","stopOnLastSlide","reverseDirection","pauseOnMouseEnter","$activeSlideEl","autoplayResult","pause","onVisibilityChange","visibilityState","onMouseEnter","onMouseLeave","attachMouseEvents","detachMouseEvents","Thumb","thumbs","multipleActiveThumbs","autoScrollOffset","slideThumbActiveClass","thumbsContainerClass","swiperCreated","onThumbClick","thumbsSwiper","currentIndex","thumbsParams","SwiperClass","thumbsSwiperParams","useOffset","currentThumbsIndex","newThumbsIndex","prevThumbsIndex","nextThumbsIndex","thumbsToActivate","thumbActiveClass","momentum","momentumRatio","momentumBounce","momentumBounceRatio","momentumVelocityRatio","minimumVelocity","lastMoveEvent","pop","velocityEvent","momentumDistance","newPosition","doBounce","afterBouncePosition","bounceAmount","needsLoopFix","moveDistance","currentSlideSize","Grid","slidesNumberEvenToRows","slidesPerRow","numFullColumns","newSlideOrderIndex","column","row","groupIndex","slideIndexInGroup","columnsInGroup","order","addSlide","activeIndexBuffer","baseLength","slidesBuffer","currentSlide","indexToRemove","Manipulation","effectInit","overwriteParams","perspective","overwriteParamsResult","effectTarget","effectParams","transformEl","effectVirtualTransitionEnd","allSlides","eventTriggered","$transitionEndTarget","triggerEvents","EffectFade","fadeEffect","crossFade","tx","ty","slideOpacity","$transitionElements","EffectCube","cubeEffect","slideShadows","shadow","shadowOffset","shadowScale","wrapperRotate","$cubeShadowEl","slideAngle","tz","shadowBefore","shadowAfter","shadowAngle","sin","scale1","scale2","zFactor","createShadow","shadowClass","$shadowContainer","$shadowEl","EffectFlip","flipEffect","limitRotation","rotate","rotateY","rotateX","zIndex","EffectCoverflow","coverflowEffect","stretch","depth","modifier","center","offsetMultiplier","translateZ","slideTransform","$shadowBeforeEl","$shadowAfterEl","EffectCreative","creativeEffect","limitProgress","shadowPerProgress","progressMultiplier","getTranslateValue","isCenteredSlides","margin","r","custom","translateString","rotateString","scaleString","opacityString","shadowOpacity","EffectCards","cardsEffect","tX","tY","tZ","tXAdd","isSwipeToNext","isSwipeToPrev","subProgress","prevY"],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.min.js b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.min.js new file mode 100644 index 0000000..c9f16ce --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.min.js @@ -0,0 +1,14 @@ +/** + * Swiper 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +function isObject$1(e){return null!==e&&"object"==typeof e&&"constructor"in e&&e.constructor===Object}function extend$1(e={},t={}){Object.keys(t).forEach((s=>{void 0===e[s]?e[s]=t[s]:isObject$1(t[s])&&isObject$1(e[s])&&Object.keys(t[s]).length>0&&extend$1(e[s],t[s])}))}const ssrDocument={body:{},addEventListener(){},removeEventListener(){},activeElement:{blur(){},nodeName:""},querySelector:()=>null,querySelectorAll:()=>[],getElementById:()=>null,createEvent:()=>({initEvent(){}}),createElement:()=>({children:[],childNodes:[],style:{},setAttribute(){},getElementsByTagName:()=>[]}),createElementNS:()=>({}),importNode:()=>null,location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function getDocument(){const e="undefined"!=typeof document?document:{};return extend$1(e,ssrDocument),e}const ssrWindow={document:ssrDocument,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState(){},pushState(){},go(){},back(){}},CustomEvent:function(){return this},addEventListener(){},removeEventListener(){},getComputedStyle:()=>({getPropertyValue:()=>""}),Image(){},Date(){},screen:{},setTimeout(){},clearTimeout(){},matchMedia:()=>({}),requestAnimationFrame:e=>"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0),cancelAnimationFrame(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function getWindow(){const e="undefined"!=typeof window?window:{};return extend$1(e,ssrWindow),e}function makeReactive(e){const t=e.__proto__;Object.defineProperty(e,"__proto__",{get:()=>t,set(e){t.__proto__=e}})}class Dom7 extends Array{constructor(e){super(...e||[]),makeReactive(this)}}function arrayFlat(e=[]){const t=[];return e.forEach((e=>{Array.isArray(e)?t.push(...arrayFlat(e)):t.push(e)})),t}function arrayFilter(e,t){return Array.prototype.filter.call(e,t)}function arrayUnique(e){const t=[];for(let s=0;s=0&&s.indexOf(">")>=0){let e="div";0===s.indexOf("e.split(" "))));return this.forEach((e=>{e.classList.add(...t)})),this}function removeClass(...e){const t=arrayFlat(e.map((e=>e.split(" "))));return this.forEach((e=>{e.classList.remove(...t)})),this}function toggleClass(...e){const t=arrayFlat(e.map((e=>e.split(" "))));this.forEach((e=>{t.forEach((t=>{e.classList.toggle(t)}))}))}function hasClass(...e){const t=arrayFlat(e.map((e=>e.split(" "))));return arrayFilter(this,(e=>t.filter((t=>e.classList.contains(t))).length>0)).length>0}function attr(e,t){if(1===arguments.length&&"string"==typeof e)return this[0]?this[0].getAttribute(e):void 0;for(let s=0;s=0;e-=1){const s=n[e];a&&s.listener===a||a&&s.listener&&s.listener.dom7proxy&&s.listener.dom7proxy===a?(r.removeEventListener(t,s.proxyListener,i),n.splice(e,1)):a||(r.removeEventListener(t,s.proxyListener,i),n.splice(e,1))}}}return this}function trigger(...e){const t=getWindow(),s=e[0].split(" "),a=e[1];for(let i=0;it>0)),i.dispatchEvent(s),i.dom7EventData=[],delete i.dom7EventData}}}return this}function transitionEnd$1(e){const t=this;return e&&t.on("transitionend",(function s(a){a.target===this&&(e.call(this,a),t.off("transitionend",s))})),this}function outerWidth(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetWidth+parseFloat(e.getPropertyValue("margin-right"))+parseFloat(e.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null}function outerHeight(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetHeight+parseFloat(e.getPropertyValue("margin-top"))+parseFloat(e.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null}function offset(){if(this.length>0){const e=getWindow(),t=getDocument(),s=this[0],a=s.getBoundingClientRect(),i=t.body,r=s.clientTop||i.clientTop||0,n=s.clientLeft||i.clientLeft||0,l=s===e?e.scrollY:s.scrollTop,o=s===e?e.scrollX:s.scrollLeft;return{top:a.top+l-r,left:a.left+o-n}}return null}function styles(){const e=getWindow();return this[0]?e.getComputedStyle(this[0],null):{}}function css(e,t){const s=getWindow();let a;if(1===arguments.length){if("string"!=typeof e){for(a=0;a{e.apply(t,[t,s])})),this):this}function filter(e){return $(arrayFilter(this,e))}function html(e){if(void 0===e)return this[0]?this[0].innerHTML:null;for(let t=0;tt-1)return $([]);if(e<0){const s=t+e;return $(s<0?[]:[this[s]])}return $([this[e]])}function append(...e){let t;const s=getDocument();for(let a=0;a=0;a-=1)this[s].insertBefore(i.childNodes[a],this[s].childNodes[0])}else if(e instanceof Dom7)for(a=0;a0?e?this[0].nextElementSibling&&$(this[0].nextElementSibling).is(e)?$([this[0].nextElementSibling]):$([]):this[0].nextElementSibling?$([this[0].nextElementSibling]):$([]):$([])}function nextAll(e){const t=[];let s=this[0];if(!s)return $([]);for(;s.nextElementSibling;){const a=s.nextElementSibling;e?$(a).is(e)&&t.push(a):t.push(a),s=a}return $(t)}function prev(e){if(this.length>0){const t=this[0];return e?t.previousElementSibling&&$(t.previousElementSibling).is(e)?$([t.previousElementSibling]):$([]):t.previousElementSibling?$([t.previousElementSibling]):$([])}return $([])}function prevAll(e){const t=[];let s=this[0];if(!s)return $([]);for(;s.previousElementSibling;){const a=s.previousElementSibling;e?$(a).is(e)&&t.push(a):t.push(a),s=a}return $(t)}function parent(e){const t=[];for(let s=0;s{try{t[e]=null}catch(e){}try{delete t[e]}catch(e){}}))}function nextTick(e,t=0){return setTimeout(e,t)}function now(){return Date.now()}function getComputedStyle$1(e){const t=getWindow();let s;return t.getComputedStyle&&(s=t.getComputedStyle(e,null)),!s&&e.currentStyle&&(s=e.currentStyle),s||(s=e.style),s}function getTranslate(e,t="x"){const s=getWindow();let a,i,r;const n=getComputedStyle$1(e);return s.WebKitCSSMatrix?(i=n.transform||n.webkitTransform,i.split(",").length>6&&(i=i.split(", ").map((e=>e.replace(",","."))).join(", ")),r=new s.WebKitCSSMatrix("none"===i?"":i)):(r=n.MozTransform||n.OTransform||n.MsTransform||n.msTransform||n.transform||n.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),a=r.toString().split(",")),"x"===t&&(i=s.WebKitCSSMatrix?r.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=s.WebKitCSSMatrix?r.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function isObject(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function isNode(e){return"undefined"!=typeof window&&void 0!==window.HTMLElement?e instanceof HTMLElement:e&&(1===e.nodeType||11===e.nodeType)}function extend(...e){const t=Object(e[0]),s=["__proto__","constructor","prototype"];for(let a=1;as.indexOf(e)<0));for(let s=0,a=e.length;si?"next":"prev",d=(e,t)=>"next"===o&&e>=t||"prev"===o&&e<=t,c=()=>{r=(new Date).getTime(),null===n&&(n=r);const o=Math.max(Math.min((r-n)/l,1),0),p=.5-Math.cos(o*Math.PI)/2;let u=i+p*(t-i);if(d(u,t)&&(u=t),e.wrapperEl.scrollTo({[s]:u}),d(u,t))return e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.scrollSnapType="",setTimeout((()=>{e.wrapperEl.style.overflow="",e.wrapperEl.scrollTo({[s]:u})})),void a.cancelAnimationFrame(e.cssModeFrameID);e.cssModeFrameID=a.requestAnimationFrame(c)};c()}let support,deviceCached,browser;function calcSupport(){const e=getWindow(),t=getDocument();return{smoothScroll:t.documentElement&&"scrollBehavior"in t.documentElement.style,touch:!!("ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch),passiveListener:function(){let t=!1;try{const s=Object.defineProperty({},"passive",{get(){t=!0}});e.addEventListener("testPassiveListener",null,s)}catch(e){}return t}(),gestures:"ongesturestart"in e}}function getSupport(){return support||(support=calcSupport()),support}function calcDevice({userAgent:e}={}){const t=getSupport(),s=getWindow(),a=s.navigator.platform,i=e||s.navigator.userAgent,r={ios:!1,android:!1},n=s.screen.width,l=s.screen.height,o=i.match(/(Android);?[\s\/]+([\d.]+)?/);let d=i.match(/(iPad).*OS\s([\d_]+)/);const c=i.match(/(iPod)(.*OS\s([\d_]+))?/),p=!d&&i.match(/(iPhone\sOS|iOS)\s([\d_]+)/),u="Win32"===a;let h="MacIntel"===a;return!d&&h&&t.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(`${n}x${l}`)>=0&&(d=i.match(/(Version)\/([\d.]+)/),d||(d=[0,1,"13_0_0"]),h=!1),o&&!u&&(r.os="android",r.android=!0),(d||p||c)&&(r.os="ios",r.ios=!0),r}function getDevice(e={}){return deviceCached||(deviceCached=calcDevice(e)),deviceCached}function calcBrowser(){const e=getWindow();return{isSafari:function(){const t=e.navigator.userAgent.toLowerCase();return t.indexOf("safari")>=0&&t.indexOf("chrome")<0&&t.indexOf("android")<0}(),isWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent)}}function getBrowser(){return browser||(browser=calcBrowser()),browser}function Resize({swiper:e,on:t,emit:s}){const a=getWindow();let i=null;const r=()=>{e&&!e.destroyed&&e.initialized&&(s("beforeResize"),s("resize"))},n=()=>{e&&!e.destroyed&&e.initialized&&s("orientationchange")};t("init",(()=>{e.params.resizeObserver&&void 0!==a.ResizeObserver?e&&!e.destroyed&&e.initialized&&(i=new ResizeObserver((t=>{const{width:s,height:a}=e;let i=s,n=a;t.forEach((({contentBoxSize:t,contentRect:s,target:a})=>{a&&a!==e.el||(i=s?s.width:(t[0]||t).inlineSize,n=s?s.height:(t[0]||t).blockSize)})),i===s&&n===a||r()})),i.observe(e.el)):(a.addEventListener("resize",r),a.addEventListener("orientationchange",n))})),t("destroy",(()=>{i&&i.unobserve&&e.el&&(i.unobserve(e.el),i=null),a.removeEventListener("resize",r),a.removeEventListener("orientationchange",n)}))}function Observer({swiper:e,extendParams:t,on:s,emit:a}){const i=[],r=getWindow(),n=(e,t={})=>{const s=new(r.MutationObserver||r.WebkitMutationObserver)((e=>{if(1===e.length)return void a("observerUpdate",e[0]);const t=function(){a("observerUpdate",e[0])};r.requestAnimationFrame?r.requestAnimationFrame(t):r.setTimeout(t,0)}));s.observe(e,{attributes:void 0===t.attributes||t.attributes,childList:void 0===t.childList||t.childList,characterData:void 0===t.characterData||t.characterData}),i.push(s)};t({observer:!1,observeParents:!1,observeSlideChildren:!1}),s("init",(()=>{if(e.params.observer){if(e.params.observeParents){const t=e.$el.parents();for(let e=0;e{i.forEach((e=>{e.disconnect()})),i.splice(0,i.length)}))}Object.keys(Methods).forEach((e=>{Object.defineProperty($.fn,e,{value:Methods[e],writable:!0})}));var eventsEmitter={on(e,t,s){const a=this;if("function"!=typeof t)return a;const i=s?"unshift":"push";return e.split(" ").forEach((e=>{a.eventsListeners[e]||(a.eventsListeners[e]=[]),a.eventsListeners[e][i](t)})),a},once(e,t,s){const a=this;if("function"!=typeof t)return a;function i(...s){a.off(e,i),i.__emitterProxy&&delete i.__emitterProxy,t.apply(a,s)}return i.__emitterProxy=t,a.on(e,i,s)},onAny(e,t){const s=this;if("function"!=typeof e)return s;const a=t?"unshift":"push";return s.eventsAnyListeners.indexOf(e)<0&&s.eventsAnyListeners[a](e),s},offAny(e){const t=this;if(!t.eventsAnyListeners)return t;const s=t.eventsAnyListeners.indexOf(e);return s>=0&&t.eventsAnyListeners.splice(s,1),t},off(e,t){const s=this;return s.eventsListeners?(e.split(" ").forEach((e=>{void 0===t?s.eventsListeners[e]=[]:s.eventsListeners[e]&&s.eventsListeners[e].forEach(((a,i)=>{(a===t||a.__emitterProxy&&a.__emitterProxy===t)&&s.eventsListeners[e].splice(i,1)}))})),s):s},emit(...e){const t=this;if(!t.eventsListeners)return t;let s,a,i;"string"==typeof e[0]||Array.isArray(e[0])?(s=e[0],a=e.slice(1,e.length),i=t):(s=e[0].events,a=e[0].data,i=e[0].context||t),a.unshift(i);return(Array.isArray(s)?s:s.split(" ")).forEach((e=>{t.eventsAnyListeners&&t.eventsAnyListeners.length&&t.eventsAnyListeners.forEach((t=>{t.apply(i,[e,...a])})),t.eventsListeners&&t.eventsListeners[e]&&t.eventsListeners[e].forEach((e=>{e.apply(i,a)}))})),t}};function updateSize(){const e=this;let t,s;const a=e.$el;t=void 0!==e.params.width&&null!==e.params.width?e.params.width:a[0].clientWidth,s=void 0!==e.params.height&&null!==e.params.height?e.params.height:a[0].clientHeight,0===t&&e.isHorizontal()||0===s&&e.isVertical()||(t=t-parseInt(a.css("padding-left")||0,10)-parseInt(a.css("padding-right")||0,10),s=s-parseInt(a.css("padding-top")||0,10)-parseInt(a.css("padding-bottom")||0,10),Number.isNaN(t)&&(t=0),Number.isNaN(s)&&(s=0),Object.assign(e,{width:t,height:s,size:e.isHorizontal()?t:s}))}function updateSlides(){const e=this;function t(t){return e.isHorizontal()?t:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[t]}function s(e,s){return parseFloat(e.getPropertyValue(t(s))||0)}const a=e.params,{$wrapperEl:i,size:r,rtlTranslate:n,wrongRTL:l}=e,o=e.virtual&&a.virtual.enabled,d=o?e.virtual.slides.length:e.slides.length,c=i.children(`.${e.params.slideClass}`),p=o?e.virtual.slides.length:c.length;let u=[];const h=[],m=[];let f=a.slidesOffsetBefore;"function"==typeof f&&(f=a.slidesOffsetBefore.call(e));let g=a.slidesOffsetAfter;"function"==typeof g&&(g=a.slidesOffsetAfter.call(e));const v=e.snapGrid.length,w=e.slidesGrid.length;let b=a.spaceBetween,x=-f,y=0,E=0;if(void 0===r)return;"string"==typeof b&&b.indexOf("%")>=0&&(b=parseFloat(b.replace("%",""))/100*r),e.virtualSize=-b,n?c.css({marginLeft:"",marginBottom:"",marginTop:""}):c.css({marginRight:"",marginBottom:"",marginTop:""}),a.centeredSlides&&a.cssMode&&(setCSSProperty(e.wrapperEl,"--swiper-centered-offset-before",""),setCSSProperty(e.wrapperEl,"--swiper-centered-offset-after",""));const $=a.grid&&a.grid.rows>1&&e.grid;let T;$&&e.grid.initSlides(p);const S="auto"===a.slidesPerView&&a.breakpoints&&Object.keys(a.breakpoints).filter((e=>void 0!==a.breakpoints[e].slidesPerView)).length>0;for(let i=0;i1&&u.push(e.virtualSize-r)}if(0===u.length&&(u=[0]),0!==a.spaceBetween){const s=e.isHorizontal()&&n?"marginLeft":t("marginRight");c.filter(((e,t)=>!a.cssMode||t!==c.length-1)).css({[s]:`${b}px`})}if(a.centeredSlides&&a.centeredSlidesBounds){let e=0;m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween;const t=e-r;u=u.map((e=>e<0?-f:e>t?t+g:e))}if(a.centerInsufficientSlides){let e=0;if(m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween,e{u[s]=e-t})),h.forEach(((e,s)=>{h[s]=e+t}))}}if(Object.assign(e,{slides:c,snapGrid:u,slidesGrid:h,slidesSizesGrid:m}),a.centeredSlides&&a.cssMode&&!a.centeredSlidesBounds){setCSSProperty(e.wrapperEl,"--swiper-centered-offset-before",-u[0]+"px"),setCSSProperty(e.wrapperEl,"--swiper-centered-offset-after",e.size/2-m[m.length-1]/2+"px");const t=-e.snapGrid[0],s=-e.slidesGrid[0];e.snapGrid=e.snapGrid.map((e=>e+t)),e.slidesGrid=e.slidesGrid.map((e=>e+s))}p!==d&&e.emit("slidesLengthChange"),u.length!==v&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),h.length!==w&&e.emit("slidesGridLengthChange"),a.watchSlidesProgress&&e.updateSlidesOffset()}function updateAutoHeight(e){const t=this,s=[],a=t.virtual&&t.params.virtual.enabled;let i,r=0;"number"==typeof e?t.setTransition(e):!0===e&&t.setTransition(t.params.speed);const n=e=>a?t.slides.filter((t=>parseInt(t.getAttribute("data-swiper-slide-index"),10)===e))[0]:t.slides.eq(e)[0];if("auto"!==t.params.slidesPerView&&t.params.slidesPerView>1)if(t.params.centeredSlides)t.visibleSlides.each((e=>{s.push(e)}));else for(i=0;it.slides.length&&!a)break;s.push(n(e))}else s.push(n(t.activeIndex));for(i=0;ir?e:r}r&&t.$wrapperEl.css("height",`${r}px`)}function updateSlidesOffset(){const e=this,t=e.slides;for(let s=0;s=0&&p1&&u<=t.size||p<=0&&u>=t.size)&&(t.visibleSlides.push(l),t.visibleSlidesIndexes.push(e),a.eq(e).addClass(s.slideVisibleClass)),l.progress=i?-d:d,l.originalProgress=i?-c:c}t.visibleSlides=$(t.visibleSlides)}function updateProgress(e){const t=this;if(void 0===e){const s=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*s||0}const s=t.params,a=t.maxTranslate()-t.minTranslate();let{progress:i,isBeginning:r,isEnd:n}=t;const l=r,o=n;0===a?(i=0,r=!0,n=!0):(i=(e-t.minTranslate())/a,r=i<=0,n=i>=1),Object.assign(t,{progress:i,isBeginning:r,isEnd:n}),(s.watchSlidesProgress||s.centeredSlides&&s.autoHeight)&&t.updateSlidesProgress(e),r&&!l&&t.emit("reachBeginning toEdge"),n&&!o&&t.emit("reachEnd toEdge"),(l&&!r||o&&!n)&&t.emit("fromEdge"),t.emit("progress",i)}function updateSlidesClasses(){const e=this,{slides:t,params:s,$wrapperEl:a,activeIndex:i,realIndex:r}=e,n=e.virtual&&s.virtual.enabled;let l;t.removeClass(`${s.slideActiveClass} ${s.slideNextClass} ${s.slidePrevClass} ${s.slideDuplicateActiveClass} ${s.slideDuplicateNextClass} ${s.slideDuplicatePrevClass}`),l=n?e.$wrapperEl.find(`.${s.slideClass}[data-swiper-slide-index="${i}"]`):t.eq(i),l.addClass(s.slideActiveClass),s.loop&&(l.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass));let o=l.nextAll(`.${s.slideClass}`).eq(0).addClass(s.slideNextClass);s.loop&&0===o.length&&(o=t.eq(0),o.addClass(s.slideNextClass));let d=l.prevAll(`.${s.slideClass}`).eq(0).addClass(s.slidePrevClass);s.loop&&0===d.length&&(d=t.eq(-1),d.addClass(s.slidePrevClass)),s.loop&&(o.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass),d.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass)),e.emitSlidesClasses()}function updateActiveIndex(e){const t=this,s=t.rtlTranslate?t.translate:-t.translate,{slidesGrid:a,snapGrid:i,params:r,activeIndex:n,realIndex:l,snapIndex:o}=t;let d,c=e;if(void 0===c){for(let e=0;e=a[e]&&s=a[e]&&s=a[e]&&(c=e);r.normalizeSlideIndex&&(c<0||void 0===c)&&(c=0)}if(i.indexOf(s)>=0)d=i.indexOf(s);else{const e=Math.min(r.slidesPerGroupSkip,c);d=e+Math.floor((c-e)/r.slidesPerGroup)}if(d>=i.length&&(d=i.length-1),c===n)return void(d!==o&&(t.snapIndex=d,t.emit("snapIndexChange")));const p=parseInt(t.slides.eq(c).attr("data-swiper-slide-index")||c,10);Object.assign(t,{snapIndex:d,realIndex:p,previousIndex:n,activeIndex:c}),t.emit("activeIndexChange"),t.emit("snapIndexChange"),l!==p&&t.emit("realIndexChange"),(t.initialized||t.params.runCallbacksOnInit)&&t.emit("slideChange")}function updateClickedSlide(e){const t=this,s=t.params,a=$(e.target).closest(`.${s.slideClass}`)[0];let i,r=!1;if(a)for(let e=0;eo?o:a&&er?"next":i=o.length&&(g=o.length-1),(p||l.initialSlide||0)===(c||0)&&s&&r.emit("beforeSlideChangeStart");const v=-o[g];if(r.updateProgress(v),l.normalizeSlideIndex)for(let e=0;e=s&&t=s&&t=s&&(n=e)}if(r.initialized&&n!==p){if(!r.allowSlideNext&&vr.translate&&v>r.maxTranslate()&&(p||0)!==n)return!1}let w;if(w=n>p?"next":n{r.wrapperEl.style.scrollSnapType="",r._swiperImmediateVirtual=!1}))}else{if(!r.support.smoothScroll)return animateCSSModeScroll({swiper:r,targetPosition:s,side:e?"left":"top"}),!0;h.scrollTo({[e?"left":"top"]:s,behavior:"smooth"})}return!0}return 0===t?(r.setTransition(0),r.setTranslate(v),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,w),r.transitionEnd(s,w)):(r.setTransition(t),r.setTranslate(v),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,w),r.animating||(r.animating=!0,r.onSlideToWrapperTransitionEnd||(r.onSlideToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.$wrapperEl[0].removeEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].removeEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd),r.onSlideToWrapperTransitionEnd=null,delete r.onSlideToWrapperTransitionEnd,r.transitionEnd(s,w))}),r.$wrapperEl[0].addEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].addEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd))),!0}function slideToLoop(e=0,t=this.params.speed,s=!0,a){const i=this;let r=e;return i.params.loop&&(r+=i.loopedSlides),i.slideTo(r,t,s,a)}function slideNext(e=this.params.speed,t=!0,s){const a=this,{animating:i,enabled:r,params:n}=a;if(!r)return a;let l=n.slidesPerGroup;"auto"===n.slidesPerView&&1===n.slidesPerGroup&&n.slidesPerGroupAuto&&(l=Math.max(a.slidesPerViewDynamic("current",!0),1));const o=a.activeIndexc(e)));let h=n[u.indexOf(p)-1];if(void 0===h&&i.cssMode){let e;n.forEach(((t,s)=>{p>=t&&(e=s)})),void 0!==e&&(h=n[e>0?e-1:e])}let m=0;return void 0!==h&&(m=l.indexOf(h),m<0&&(m=a.activeIndex-1),"auto"===i.slidesPerView&&1===i.slidesPerGroup&&i.slidesPerGroupAuto&&(m=m-a.slidesPerViewDynamic("previous",!0)+1,m=Math.max(m,0))),a.slideTo(m,e,t,s)}function slideReset(e=this.params.speed,t=!0,s){return this.slideTo(this.activeIndex,e,t,s)}function slideToClosest(e=this.params.speed,t=!0,s,a=.5){const i=this;let r=i.activeIndex;const n=Math.min(i.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/i.params.slidesPerGroup),o=i.rtlTranslate?i.translate:-i.translate;if(o>=i.snapGrid[l]){const e=i.snapGrid[l];o-e>(i.snapGrid[l+1]-e)*a&&(r+=i.params.slidesPerGroup)}else{const e=i.snapGrid[l-1];o-e<=(i.snapGrid[l]-e)*a&&(r-=i.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,i.slidesGrid.length-1),i.slideTo(r,e,t,s)}function slideToClickedSlide(){const e=this,{params:t,$wrapperEl:s}=e,a="auto"===t.slidesPerView?e.slidesPerViewDynamic():t.slidesPerView;let i,r=e.clickedIndex;if(t.loop){if(e.animating)return;i=parseInt($(e.clickedSlide).attr("data-swiper-slide-index"),10),t.centeredSlides?re.slides.length-e.loopedSlides+a/2?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),nextTick((()=>{e.slideTo(r)}))):e.slideTo(r):r>e.slides.length-a?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),nextTick((()=>{e.slideTo(r)}))):e.slideTo(r)}else e.slideTo(r)}var slide={slideTo:slideTo,slideToLoop:slideToLoop,slideNext:slideNext,slidePrev:slidePrev,slideReset:slideReset,slideToClosest:slideToClosest,slideToClickedSlide:slideToClickedSlide};function loopCreate(){const e=this,t=getDocument(),{params:s,$wrapperEl:a}=e,i=$(a.children()[0].parentNode);i.children(`.${s.slideClass}.${s.slideDuplicateClass}`).remove();let r=i.children(`.${s.slideClass}`);if(s.loopFillGroupWithBlank){const e=s.slidesPerGroup-r.length%s.slidesPerGroup;if(e!==s.slidesPerGroup){for(let a=0;ar.length&&(e.loopedSlides=r.length);const n=[],l=[];r.each(((t,s)=>{const a=$(t);s=r.length-e.loopedSlides&&n.push(t),a.attr("data-swiper-slide-index",s)}));for(let e=0;e=0;e-=1)i.prepend($(n[e].cloneNode(!0)).addClass(s.slideDuplicateClass))}function loopFix(){const e=this;e.emit("beforeLoopFix");const{activeIndex:t,slides:s,loopedSlides:a,allowSlidePrev:i,allowSlideNext:r,snapGrid:n,rtlTranslate:l}=e;let o;e.allowSlidePrev=!0,e.allowSlideNext=!0;const d=-n[t]-e.getTranslate();if(t=s.length-a){o=-s.length+t+a,o+=a;e.slideTo(o,0,!1,!0)&&0!==d&&e.setTranslate((l?-e.translate:e.translate)-d)}e.allowSlidePrev=i,e.allowSlideNext=r,e.emit("loopFix")}function loopDestroy(){const{$wrapperEl:e,params:t,slides:s}=this;e.children(`.${t.slideClass}.${t.slideDuplicateClass},.${t.slideClass}.${t.slideBlankClass}`).remove(),s.removeAttr("data-swiper-slide-index")}var loop={loopCreate:loopCreate,loopFix:loopFix,loopDestroy:loopDestroy};function setGrabCursor(e){const t=this;if(t.support.touch||!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)return;const s="container"===t.params.touchEventsTarget?t.el:t.wrapperEl;s.style.cursor="move",s.style.cursor=e?"-webkit-grabbing":"-webkit-grab",s.style.cursor=e?"-moz-grabbin":"-moz-grab",s.style.cursor=e?"grabbing":"grab"}function unsetGrabCursor(){const e=this;e.support.touch||e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e["container"===e.params.touchEventsTarget?"el":"wrapperEl"].style.cursor="")}var grabCursor={setGrabCursor:setGrabCursor,unsetGrabCursor:unsetGrabCursor};function closestElement(e,t=this){return function t(s){return s&&s!==getDocument()&&s!==getWindow()?(s.assignedSlot&&(s=s.assignedSlot),s.closest(e)||t(s.getRootNode().host)):null}(t)}function onTouchStart(e){const t=this,s=getDocument(),a=getWindow(),i=t.touchEventsData,{params:r,touches:n,enabled:l}=t;if(!l)return;if(t.animating&&r.preventInteractionOnTransition)return;!t.animating&&r.cssMode&&r.loop&&t.loopFix();let o=e;o.originalEvent&&(o=o.originalEvent);let d=$(o.target);if("wrapper"===r.touchEventsTarget&&!d.closest(t.wrapperEl).length)return;if(i.isTouchEvent="touchstart"===o.type,!i.isTouchEvent&&"which"in o&&3===o.which)return;if(!i.isTouchEvent&&"button"in o&&o.button>0)return;if(i.isTouched&&i.isMoved)return;!!r.noSwipingClass&&""!==r.noSwipingClass&&o.target&&o.target.shadowRoot&&e.path&&e.path[0]&&(d=$(e.path[0]));const c=r.noSwipingSelector?r.noSwipingSelector:`.${r.noSwipingClass}`,p=!(!o.target||!o.target.shadowRoot);if(r.noSwiping&&(p?closestElement(c,o.target):d.closest(c)[0]))return void(t.allowClick=!0);if(r.swipeHandler&&!d.closest(r.swipeHandler)[0])return;n.currentX="touchstart"===o.type?o.targetTouches[0].pageX:o.pageX,n.currentY="touchstart"===o.type?o.targetTouches[0].pageY:o.pageY;const u=n.currentX,h=n.currentY,m=r.edgeSwipeDetection||r.iOSEdgeSwipeDetection,f=r.edgeSwipeThreshold||r.iOSEdgeSwipeThreshold;if(m&&(u<=f||u>=a.innerWidth-f)){if("prevent"!==m)return;e.preventDefault()}if(Object.assign(i,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),n.startX=u,n.startY=h,i.touchStartTime=now(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,r.threshold>0&&(i.allowThresholdMove=!1),"touchstart"!==o.type){let e=!0;d.is(i.focusableElements)&&(e=!1),s.activeElement&&$(s.activeElement).is(i.focusableElements)&&s.activeElement!==d[0]&&s.activeElement.blur();const a=e&&t.allowTouchMove&&r.touchStartPreventDefault;!r.touchStartForcePreventDefault&&!a||d[0].isContentEditable||o.preventDefault()}t.emit("touchStart",o)}function onTouchMove(e){const t=getDocument(),s=this,a=s.touchEventsData,{params:i,touches:r,rtlTranslate:n,enabled:l}=s;if(!l)return;let o=e;if(o.originalEvent&&(o=o.originalEvent),!a.isTouched)return void(a.startMoving&&a.isScrolling&&s.emit("touchMoveOpposite",o));if(a.isTouchEvent&&"touchmove"!==o.type)return;const d="touchmove"===o.type&&o.targetTouches&&(o.targetTouches[0]||o.changedTouches[0]),c="touchmove"===o.type?d.pageX:o.pageX,p="touchmove"===o.type?d.pageY:o.pageY;if(o.preventedByNestedSwiper)return r.startX=c,void(r.startY=p);if(!s.allowTouchMove)return s.allowClick=!1,void(a.isTouched&&(Object.assign(r,{startX:c,startY:p,currentX:c,currentY:p}),a.touchStartTime=now()));if(a.isTouchEvent&&i.touchReleaseOnEdges&&!i.loop)if(s.isVertical()){if(pr.startY&&s.translate>=s.minTranslate())return a.isTouched=!1,void(a.isMoved=!1)}else if(cr.startX&&s.translate>=s.minTranslate())return;if(a.isTouchEvent&&t.activeElement&&o.target===t.activeElement&&$(o.target).is(a.focusableElements))return a.isMoved=!0,void(s.allowClick=!1);if(a.allowTouchCallbacks&&s.emit("touchMove",o),o.targetTouches&&o.targetTouches.length>1)return;r.currentX=c,r.currentY=p;const u=r.currentX-r.startX,h=r.currentY-r.startY;if(s.params.threshold&&Math.sqrt(u**2+h**2)=25&&(e=180*Math.atan2(Math.abs(h),Math.abs(u))/Math.PI,a.isScrolling=s.isHorizontal()?e>i.touchAngle:90-e>i.touchAngle)}if(a.isScrolling&&s.emit("touchMoveOpposite",o),void 0===a.startMoving&&(r.currentX===r.startX&&r.currentY===r.startY||(a.startMoving=!0)),a.isScrolling)return void(a.isTouched=!1);if(!a.startMoving)return;s.allowClick=!1,!i.cssMode&&o.cancelable&&o.preventDefault(),i.touchMoveStopPropagation&&!i.nested&&o.stopPropagation(),a.isMoved||(i.loop&&!i.cssMode&&s.loopFix(),a.startTranslate=s.getTranslate(),s.setTransition(0),s.animating&&s.$wrapperEl.trigger("webkitTransitionEnd transitionend"),a.allowMomentumBounce=!1,!i.grabCursor||!0!==s.allowSlideNext&&!0!==s.allowSlidePrev||s.setGrabCursor(!0),s.emit("sliderFirstMove",o)),s.emit("sliderMove",o),a.isMoved=!0;let m=s.isHorizontal()?u:h;r.diff=m,m*=i.touchRatio,n&&(m=-m),s.swipeDirection=m>0?"prev":"next",a.currentTranslate=m+a.startTranslate;let f=!0,g=i.resistanceRatio;if(i.touchReleaseOnEdges&&(g=0),m>0&&a.currentTranslate>s.minTranslate()?(f=!1,i.resistance&&(a.currentTranslate=s.minTranslate()-1+(-s.minTranslate()+a.startTranslate+m)**g)):m<0&&a.currentTranslatea.startTranslate&&(a.currentTranslate=a.startTranslate),s.allowSlidePrev||s.allowSlideNext||(a.currentTranslate=a.startTranslate),i.threshold>0){if(!(Math.abs(m)>i.threshold||a.allowThresholdMove))return void(a.currentTranslate=a.startTranslate);if(!a.allowThresholdMove)return a.allowThresholdMove=!0,r.startX=r.currentX,r.startY=r.currentY,a.currentTranslate=a.startTranslate,void(r.diff=s.isHorizontal()?r.currentX-r.startX:r.currentY-r.startY)}i.followFinger&&!i.cssMode&&((i.freeMode&&i.freeMode.enabled&&s.freeMode||i.watchSlidesProgress)&&(s.updateActiveIndex(),s.updateSlidesClasses()),s.params.freeMode&&i.freeMode.enabled&&s.freeMode&&s.freeMode.onTouchMove(),s.updateProgress(a.currentTranslate),s.setTranslate(a.currentTranslate))}function onTouchEnd(e){const t=this,s=t.touchEventsData,{params:a,touches:i,rtlTranslate:r,slidesGrid:n,enabled:l}=t;if(!l)return;let o=e;if(o.originalEvent&&(o=o.originalEvent),s.allowTouchCallbacks&&t.emit("touchEnd",o),s.allowTouchCallbacks=!1,!s.isTouched)return s.isMoved&&a.grabCursor&&t.setGrabCursor(!1),s.isMoved=!1,void(s.startMoving=!1);a.grabCursor&&s.isMoved&&s.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);const d=now(),c=d-s.touchStartTime;if(t.allowClick&&(t.updateClickedSlide(o),t.emit("tap click",o),c<300&&d-s.lastClickTime<300&&t.emit("doubleTap doubleClick",o)),s.lastClickTime=now(),nextTick((()=>{t.destroyed||(t.allowClick=!0)})),!s.isTouched||!s.isMoved||!t.swipeDirection||0===i.diff||s.currentTranslate===s.startTranslate)return s.isTouched=!1,s.isMoved=!1,void(s.startMoving=!1);let p;if(s.isTouched=!1,s.isMoved=!1,s.startMoving=!1,p=a.followFinger?r?t.translate:-t.translate:-s.currentTranslate,a.cssMode)return;if(t.params.freeMode&&a.freeMode.enabled)return void t.freeMode.onTouchEnd({currentPos:p});let u=0,h=t.slidesSizesGrid[0];for(let e=0;e=n[e]&&p=n[e]&&(u=e,h=n[n.length-1]-n[n.length-2])}const m=(p-n[u])/h,f=ua.longSwipesMs){if(!a.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(m>=a.longSwipesRatio?t.slideTo(u+f):t.slideTo(u)),"prev"===t.swipeDirection&&(m>1-a.longSwipesRatio?t.slideTo(u+f):t.slideTo(u))}else{if(!a.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(o.target===t.navigation.nextEl||o.target===t.navigation.prevEl)?o.target===t.navigation.nextEl?t.slideTo(u+f):t.slideTo(u):("next"===t.swipeDirection&&t.slideTo(u+f),"prev"===t.swipeDirection&&t.slideTo(u))}}function onResize(){const e=this,{params:t,el:s}=e;if(s&&0===s.offsetWidth)return;t.breakpoints&&e.setBreakpoint();const{allowSlideNext:a,allowSlidePrev:i,snapGrid:r}=e;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses(),("auto"===t.slidesPerView||t.slidesPerView>1)&&e.isEnd&&!e.isBeginning&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.run(),e.allowSlidePrev=i,e.allowSlideNext=a,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}function onClick(e){const t=this;t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function onScroll(){const e=this,{wrapperEl:t,rtlTranslate:s,enabled:a}=e;if(!a)return;let i;e.previousTranslate=e.translate,e.isHorizontal()?e.translate=-t.scrollLeft:e.translate=-t.scrollTop,-0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();const r=e.maxTranslate()-e.minTranslate();i=0===r?0:(e.translate-e.minTranslate())/r,i!==e.progress&&e.updateProgress(s?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}let dummyEventAttached=!1;function dummyEventListener(){}const events=(e,t)=>{const s=getDocument(),{params:a,touchEvents:i,el:r,wrapperEl:n,device:l,support:o}=e,d=!!a.nested,c="on"===t?"addEventListener":"removeEventListener",p=t;if(o.touch){const t=!("touchstart"!==i.start||!o.passiveListener||!a.passiveListeners)&&{passive:!0,capture:!1};r[c](i.start,e.onTouchStart,t),r[c](i.move,e.onTouchMove,o.passiveListener?{passive:!1,capture:d}:d),r[c](i.end,e.onTouchEnd,t),i.cancel&&r[c](i.cancel,e.onTouchEnd,t)}else r[c](i.start,e.onTouchStart,!1),s[c](i.move,e.onTouchMove,d),s[c](i.end,e.onTouchEnd,!1);(a.preventClicks||a.preventClicksPropagation)&&r[c]("click",e.onClick,!0),a.cssMode&&n[c]("scroll",e.onScroll),a.updateOnWindowResize?e[p](l.ios||l.android?"resize orientationchange observerUpdate":"resize observerUpdate",onResize,!0):e[p]("observerUpdate",onResize,!0)};function attachEvents(){const e=this,t=getDocument(),{params:s,support:a}=e;e.onTouchStart=onTouchStart.bind(e),e.onTouchMove=onTouchMove.bind(e),e.onTouchEnd=onTouchEnd.bind(e),s.cssMode&&(e.onScroll=onScroll.bind(e)),e.onClick=onClick.bind(e),a.touch&&!dummyEventAttached&&(t.addEventListener("touchstart",dummyEventListener),dummyEventAttached=!0),events(e,"on")}function detachEvents(){events(this,"off")}var events$1={attachEvents:attachEvents,detachEvents:detachEvents};const isGridEnabled=(e,t)=>e.grid&&t.grid&&t.grid.rows>1;function setBreakpoint(){const e=this,{activeIndex:t,initialized:s,loopedSlides:a=0,params:i,$el:r}=e,n=i.breakpoints;if(!n||n&&0===Object.keys(n).length)return;const l=e.getBreakpoint(n,e.params.breakpointsBase,e.el);if(!l||e.currentBreakpoint===l)return;const o=(l in n?n[l]:void 0)||e.originalParams,d=isGridEnabled(e,i),c=isGridEnabled(e,o),p=i.enabled;d&&!c?(r.removeClass(`${i.containerModifierClass}grid ${i.containerModifierClass}grid-column`),e.emitContainerClasses()):!d&&c&&(r.addClass(`${i.containerModifierClass}grid`),(o.grid.fill&&"column"===o.grid.fill||!o.grid.fill&&"column"===i.grid.fill)&&r.addClass(`${i.containerModifierClass}grid-column`),e.emitContainerClasses());const u=o.direction&&o.direction!==i.direction,h=i.loop&&(o.slidesPerView!==i.slidesPerView||u);u&&s&&e.changeDirection(),extend(e.params,o);const m=e.params.enabled;Object.assign(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),p&&!m?e.disable():!p&&m&&e.enable(),e.currentBreakpoint=l,e.emit("_beforeBreakpoint",o),h&&s&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-a+e.loopedSlides,0,!1)),e.emit("breakpoint",o)}function getBreakpoint(e,t="window",s){if(!e||"container"===t&&!s)return;let a=!1;const i=getWindow(),r="window"===t?i.innerHeight:s.clientHeight,n=Object.keys(e).map((e=>{if("string"==typeof e&&0===e.indexOf("@")){const t=parseFloat(e.substr(1));return{value:r*t,point:e}}return{value:e,point:e}}));n.sort(((e,t)=>parseInt(e.value,10)-parseInt(t.value,10)));for(let e=0;e{"object"==typeof e?Object.keys(e).forEach((a=>{e[a]&&s.push(t+a)})):"string"==typeof e&&s.push(t+e)})),s}function addClasses(){const e=this,{classNames:t,params:s,rtl:a,$el:i,device:r,support:n}=e,l=prepareClasses(["initialized",s.direction,{"pointer-events":!n.touch},{"free-mode":e.params.freeMode&&s.freeMode.enabled},{autoheight:s.autoHeight},{rtl:a},{grid:s.grid&&s.grid.rows>1},{"grid-column":s.grid&&s.grid.rows>1&&"column"===s.grid.fill},{android:r.android},{ios:r.ios},{"css-mode":s.cssMode},{centered:s.cssMode&&s.centeredSlides}],s.containerModifierClass);t.push(...l),i.addClass([...t].join(" ")),e.emitContainerClasses()}function removeClasses(){const{$el:e,classNames:t}=this;e.removeClass(t.join(" ")),this.emitContainerClasses()}var classes={addClasses:addClasses,removeClasses:removeClasses};function loadImage(e,t,s,a,i,r){const n=getWindow();let l;function o(){r&&r()}$(e).parent("picture")[0]||e.complete&&i?o():t?(l=new n.Image,l.onload=o,l.onerror=o,a&&(l.sizes=a),s&&(l.srcset=s),t&&(l.src=t)):o()}function preloadImages(){const e=this;function t(){null!=e&&e&&!e.destroyed&&(void 0!==e.imagesLoaded&&(e.imagesLoaded+=1),e.imagesLoaded===e.imagesToLoad.length&&(e.params.updateOnImagesReady&&e.update(),e.emit("imagesReady")))}e.imagesToLoad=e.$el.find("img");for(let s=0;ss}else e.isLocked=1===e.snapGrid.length;!0===s.allowSlideNext&&(e.allowSlideNext=!e.isLocked),!0===s.allowSlidePrev&&(e.allowSlidePrev=!e.isLocked),t&&t!==e.isLocked&&(e.isEnd=!1),t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock")}var checkOverflow$1={checkOverflow:checkOverflow},defaults={init:!0,direction:"horizontal",touchEventsTarget:"wrapper",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!0,nested:!1,createElements:!1,enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerGroup:1,slidesPerGroupSkip:0,slidesPerGroupAuto:!1,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:0,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopFillGroupWithBlank:!1,loopPreventsSlide:!0,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,containerModifierClass:"swiper-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-invisible-blank",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",runCallbacksOnInit:!0,_emitClasses:!1};function moduleExtendParams(e,t){return function(s={}){const a=Object.keys(s)[0],i=s[a];"object"==typeof i&&null!==i?(["navigation","pagination","scrollbar"].indexOf(a)>=0&&!0===e[a]&&(e[a]={auto:!0}),a in e&&"enabled"in i?(!0===e[a]&&(e[a]={enabled:!0}),"object"!=typeof e[a]||"enabled"in e[a]||(e[a].enabled=!0),e[a]||(e[a]={enabled:!1}),extend(t,s)):extend(t,s)):extend(t,s)}}const prototypes={eventsEmitter:eventsEmitter,update:update,translate:translate,transition:transition,slide:slide,loop:loop,grabCursor:grabCursor,events:events$1,breakpoints:breakpoints,checkOverflow:checkOverflow$1,classes:classes,images:images},extendedDefaults={};class Swiper{constructor(...e){let t,s;if(1===e.length&&e[0].constructor&&"Object"===Object.prototype.toString.call(e[0]).slice(8,-1)?s=e[0]:[t,s]=e,s||(s={}),s=extend({},s),t&&!s.el&&(s.el=t),s.el&&$(s.el).length>1){const e=[];return $(s.el).each((t=>{const a=extend({},s,{el:t});e.push(new Swiper(a))})),e}const a=this;a.__swiper__=!0,a.support=getSupport(),a.device=getDevice({userAgent:s.userAgent}),a.browser=getBrowser(),a.eventsListeners={},a.eventsAnyListeners=[],a.modules=[...a.__modules__],s.modules&&Array.isArray(s.modules)&&a.modules.push(...s.modules);const i={};a.modules.forEach((e=>{e({swiper:a,extendParams:moduleExtendParams(s,i),on:a.on.bind(a),once:a.once.bind(a),off:a.off.bind(a),emit:a.emit.bind(a)})}));const r=extend({},defaults,i);return a.params=extend({},r,extendedDefaults,s),a.originalParams=extend({},a.params),a.passedParams=extend({},s),a.params&&a.params.on&&Object.keys(a.params.on).forEach((e=>{a.on(e,a.params.on[e])})),a.params&&a.params.onAny&&a.onAny(a.params.onAny),a.$=$,Object.assign(a,{enabled:a.params.enabled,el:t,classNames:[],slides:$(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:()=>"horizontal"===a.params.direction,isVertical:()=>"vertical"===a.params.direction,activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:a.params.allowSlideNext,allowSlidePrev:a.params.allowSlidePrev,touchEvents:function(){const e=["touchstart","touchmove","touchend","touchcancel"],t=["pointerdown","pointermove","pointerup"];return a.touchEventsTouch={start:e[0],move:e[1],end:e[2],cancel:e[3]},a.touchEventsDesktop={start:t[0],move:t[1],end:t[2]},a.support.touch||!a.params.simulateTouch?a.touchEventsTouch:a.touchEventsDesktop}(),touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:a.params.focusableElements,lastClickTime:now(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:a.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),a.emit("_swiper"),a.params.init&&a.init(),a}enable(){const e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))}disable(){const e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))}setProgress(e,t){const s=this;e=Math.min(Math.max(e,0),1);const a=s.minTranslate(),i=(s.maxTranslate()-a)*e+a;s.translateTo(i,void 0===t?0:t),s.updateActiveIndex(),s.updateSlidesClasses()}emitContainerClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=e.el.className.split(" ").filter((t=>0===t.indexOf("swiper")||0===t.indexOf(e.params.containerModifierClass)));e.emit("_containerClasses",t.join(" "))}getSlideClasses(e){const t=this;return e.className.split(" ").filter((e=>0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass))).join(" ")}emitSlidesClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=[];e.slides.each((s=>{const a=e.getSlideClasses(s);t.push({slideEl:s,classNames:a}),e.emit("_slideClass",s,a)})),e.emit("_slideClasses",t)}slidesPerViewDynamic(e="current",t=!1){const{params:s,slides:a,slidesGrid:i,slidesSizesGrid:r,size:n,activeIndex:l}=this;let o=1;if(s.centeredSlides){let e,t=a[l].swiperSlideSize;for(let s=l+1;sn&&(e=!0));for(let s=l-1;s>=0;s-=1)a[s]&&!e&&(t+=a[s].swiperSlideSize,o+=1,t>n&&(e=!0))}else if("current"===e)for(let e=l+1;e=0;e-=1){i[l]-i[e]1)&&e.isEnd&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),i||a()),s.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}changeDirection(e,t=!0){const s=this,a=s.params.direction;return e||(e="horizontal"===a?"vertical":"horizontal"),e===a||"horizontal"!==e&&"vertical"!==e||(s.$el.removeClass(`${s.params.containerModifierClass}${a}`).addClass(`${s.params.containerModifierClass}${e}`),s.emitContainerClasses(),s.params.direction=e,s.slides.each((t=>{"vertical"===e?t.style.width="":t.style.height=""})),s.emit("changeDirection"),t&&s.update()),s}mount(e){const t=this;if(t.mounted)return!0;const s=$(e||t.params.el);if(!(e=s[0]))return!1;e.swiper=t;const a=()=>`.${(t.params.wrapperClass||"").trim().split(" ").join(".")}`;let i=(()=>{if(e&&e.shadowRoot&&e.shadowRoot.querySelector){const t=$(e.shadowRoot.querySelector(a()));return t.children=e=>s.children(e),t}return s.children(a())})();if(0===i.length&&t.params.createElements){const e=getDocument().createElement("div");i=$(e),e.className=t.params.wrapperClass,s.append(e),s.children(`.${t.params.slideClass}`).each((e=>{i.append(e)}))}return Object.assign(t,{$el:s,el:e,$wrapperEl:i,wrapperEl:i[0],mounted:!0,rtl:"rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction")),wrongRTL:"-webkit-box"===i.css("display")}),!0}init(e){const t=this;if(t.initialized)return t;return!1===t.mount(e)||(t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.params.loop&&t.loopCreate(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.preloadImages&&t.preloadImages(),t.params.loop?t.slideTo(t.params.initialSlide+t.loopedSlides,0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.attachEvents(),t.initialized=!0,t.emit("init"),t.emit("afterInit")),t}destroy(e=!0,t=!0){const s=this,{params:a,$el:i,$wrapperEl:r,slides:n}=s;return void 0===s.params||s.destroyed||(s.emit("beforeDestroy"),s.initialized=!1,s.detachEvents(),a.loop&&s.loopDestroy(),t&&(s.removeClasses(),i.removeAttr("style"),r.removeAttr("style"),n&&n.length&&n.removeClass([a.slideVisibleClass,a.slideActiveClass,a.slideNextClass,a.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")),s.emit("destroy"),Object.keys(s.eventsListeners).forEach((e=>{s.off(e)})),!1!==e&&(s.$el[0].swiper=null,deleteProps(s)),s.destroyed=!0),null}static extendDefaults(e){extend(extendedDefaults,e)}static get extendedDefaults(){return extendedDefaults}static get defaults(){return defaults}static installModule(e){Swiper.prototype.__modules__||(Swiper.prototype.__modules__=[]);const t=Swiper.prototype.__modules__;"function"==typeof e&&t.indexOf(e)<0&&t.push(e)}static use(e){return Array.isArray(e)?(e.forEach((e=>Swiper.installModule(e))),Swiper):(Swiper.installModule(e),Swiper)}}function Virtual({swiper:e,extendParams:t,on:s}){let a;function i(t,s){const a=e.params.virtual;if(a.cache&&e.virtual.cache[s])return e.virtual.cache[s];const i=a.renderSlide?$(a.renderSlide.call(e,t,s)):$(`
${t}
`);return i.attr("data-swiper-slide-index")||i.attr("data-swiper-slide-index",s),a.cache&&(e.virtual.cache[s]=i),i}function r(t){const{slidesPerView:s,slidesPerGroup:a,centeredSlides:r}=e.params,{addSlidesBefore:n,addSlidesAfter:l}=e.params.virtual,{from:o,to:d,slides:c,slidesGrid:p,offset:u}=e.virtual;e.params.cssMode||e.updateActiveIndex();const h=e.activeIndex||0;let m,f,g;m=e.rtlTranslate?"right":e.isHorizontal()?"left":"top",r?(f=Math.floor(s/2)+a+l,g=Math.floor(s/2)+a+n):(f=s+(a-1)+l,g=a+n);const v=Math.max((h||0)-g,0),w=Math.min((h||0)+f,c.length-1),b=(e.slidesGrid[v]||0)-(e.slidesGrid[0]||0);function x(){e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),e.lazy&&e.params.lazy.enabled&&e.lazy.load()}if(Object.assign(e.virtual,{from:v,to:w,offset:b,slidesGrid:e.slidesGrid}),o===v&&d===w&&!t)return e.slidesGrid!==p&&b!==u&&e.slides.css(m,`${b}px`),void e.updateProgress();if(e.params.virtual.renderExternal)return e.params.virtual.renderExternal.call(e,{offset:b,from:v,to:w,slides:function(){const e=[];for(let t=v;t<=w;t+=1)e.push(c[t]);return e}()}),void(e.params.virtual.renderExternalUpdate&&x());const y=[],E=[];if(t)e.$wrapperEl.find(`.${e.params.slideClass}`).remove();else for(let t=o;t<=d;t+=1)(tw)&&e.$wrapperEl.find(`.${e.params.slideClass}[data-swiper-slide-index="${t}"]`).remove();for(let e=0;e=v&&e<=w&&(void 0===d||t?E.push(e):(e>d&&E.push(e),e{e.$wrapperEl.append(i(c[t],t))})),y.sort(((e,t)=>t-e)).forEach((t=>{e.$wrapperEl.prepend(i(c[t],t))})),e.$wrapperEl.children(".swiper-slide").css(m,`${b}px`),x()}t({virtual:{enabled:!1,slides:[],cache:!0,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}}),e.virtual={cache:{},from:void 0,to:void 0,slides:[],offset:0,slidesGrid:[]},s("beforeInit",(()=>{e.params.virtual.enabled&&(e.virtual.slides=e.params.virtual.slides,e.classNames.push(`${e.params.containerModifierClass}virtual`),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0,e.params.initialSlide||r())})),s("setTranslate",(()=>{e.params.virtual.enabled&&(e.params.cssMode&&!e._immediateVirtual?(clearTimeout(a),a=setTimeout((()=>{r()}),100)):r())})),s("init update resize",(()=>{e.params.virtual.enabled&&e.params.cssMode&&setCSSProperty(e.wrapperEl,"--swiper-virtual-size",`${e.virtualSize}px`)})),Object.assign(e.virtual,{appendSlide:function(t){if("object"==typeof t&&"length"in t)for(let s=0;s{const a=t[e],r=a.attr("data-swiper-slide-index");r&&a.attr("data-swiper-slide-index",parseInt(r,10)+i),s[parseInt(e,10)+i]=a})),e.virtual.cache=s}r(!0),e.slideTo(a,0)},removeSlide:function(t){if(null==t)return;let s=e.activeIndex;if(Array.isArray(t))for(let a=t.length-1;a>=0;a-=1)e.virtual.slides.splice(t[a],1),e.params.virtual.cache&&delete e.virtual.cache[t[a]],t[a]0&&0===e.$el.parents(`.${e.params.slideActiveClass}`).length)return;const a=e.$el,i=a[0].clientWidth,n=a[0].clientHeight,l=r.innerWidth,o=r.innerHeight,d=e.$el.offset();s&&(d.left-=e.$el[0].scrollLeft);const c=[[d.left,d.top],[d.left+i,d.top],[d.left,d.top+n],[d.left+i,d.top+n]];for(let e=0;e=0&&s[0]<=l&&s[1]>=0&&s[1]<=o){if(0===s[0]&&0===s[1])continue;t=!0}}if(!t)return}e.isHorizontal()?((d||c||p||u)&&(n.preventDefault?n.preventDefault():n.returnValue=!1),((c||u)&&!s||(d||p)&&s)&&e.slideNext(),((d||p)&&!s||(c||u)&&s)&&e.slidePrev()):((d||c||h||m)&&(n.preventDefault?n.preventDefault():n.returnValue=!1),(c||m)&&e.slideNext(),(d||h)&&e.slidePrev()),a("keyPress",l)}}function l(){e.keyboard.enabled||($(i).on("keydown",n),e.keyboard.enabled=!0)}function o(){e.keyboard.enabled&&($(i).off("keydown",n),e.keyboard.enabled=!1)}e.keyboard={enabled:!1},t({keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0}}),s("init",(()=>{e.params.keyboard.enabled&&l()})),s("destroy",(()=>{e.keyboard.enabled&&o()})),Object.assign(e.keyboard,{enable:l,disable:o})}function Mousewheel({swiper:e,extendParams:t,on:s,emit:a}){const i=getWindow();let r;t({mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null}}),e.mousewheel={enabled:!1};let n,l=now();const o=[];function d(){e.enabled&&(e.mouseEntered=!0)}function c(){e.enabled&&(e.mouseEntered=!1)}function p(t){return!(e.params.mousewheel.thresholdDelta&&t.delta=6&&now()-l<60||(t.direction<0?e.isEnd&&!e.params.loop||e.animating||(e.slideNext(),a("scroll",t.raw)):e.isBeginning&&!e.params.loop||e.animating||(e.slidePrev(),a("scroll",t.raw)),l=(new i.Date).getTime(),!1)))}function u(t){let s=t,i=!0;if(!e.enabled)return;const l=e.params.mousewheel;e.params.cssMode&&s.preventDefault();let d=e.$el;if("container"!==e.params.mousewheel.eventsTarget&&(d=$(e.params.mousewheel.eventsTarget)),!e.mouseEntered&&!d[0].contains(s.target)&&!l.releaseOnEdges)return!0;s.originalEvent&&(s=s.originalEvent);let c=0;const u=e.rtlTranslate?-1:1,h=function(e){let t=0,s=0,a=0,i=0;return"detail"in e&&(s=e.detail),"wheelDelta"in e&&(s=-e.wheelDelta/120),"wheelDeltaY"in e&&(s=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=s,s=0),a=10*t,i=10*s,"deltaY"in e&&(i=e.deltaY),"deltaX"in e&&(a=e.deltaX),e.shiftKey&&!a&&(a=i,i=0),(a||i)&&e.deltaMode&&(1===e.deltaMode?(a*=40,i*=40):(a*=800,i*=800)),a&&!t&&(t=a<1?-1:1),i&&!s&&(s=i<1?-1:1),{spinX:t,spinY:s,pixelX:a,pixelY:i}}(s);if(l.forceToAxis)if(e.isHorizontal()){if(!(Math.abs(h.pixelX)>Math.abs(h.pixelY)))return!0;c=-h.pixelX*u}else{if(!(Math.abs(h.pixelY)>Math.abs(h.pixelX)))return!0;c=-h.pixelY}else c=Math.abs(h.pixelX)>Math.abs(h.pixelY)?-h.pixelX*u:-h.pixelY;if(0===c)return!0;l.invert&&(c=-c);let m=e.getTranslate()+c*l.sensitivity;if(m>=e.minTranslate()&&(m=e.minTranslate()),m<=e.maxTranslate()&&(m=e.maxTranslate()),i=!!e.params.loop||!(m===e.minTranslate()||m===e.maxTranslate()),i&&e.params.nested&&s.stopPropagation(),e.params.freeMode&&e.params.freeMode.enabled){const t={time:now(),delta:Math.abs(c),direction:Math.sign(c)},i=n&&t.time=e.minTranslate()&&(d=e.minTranslate()),d<=e.maxTranslate()&&(d=e.maxTranslate()),e.setTransition(0),e.setTranslate(d),e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses(),(!p&&e.isBeginning||!u&&e.isEnd)&&e.updateSlidesClasses(),e.params.freeMode.sticky){clearTimeout(r),r=void 0,o.length>=15&&o.shift();const s=o.length?o[o.length-1]:void 0,a=o[0];if(o.push(t),s&&(t.delta>s.delta||t.direction!==s.direction))o.splice(0);else if(o.length>=15&&t.time-a.time<500&&a.delta-t.delta>=1&&t.delta<=6){const s=c>0?.8:.2;n=t,o.splice(0),r=nextTick((()=>{e.slideToClosest(e.params.speed,!0,void 0,s)}),0)}r||(r=nextTick((()=>{n=t,o.splice(0),e.slideToClosest(e.params.speed,!0,void 0,.5)}),500))}if(i||a("scroll",s),e.params.autoplay&&e.params.autoplayDisableOnInteraction&&e.autoplay.stop(),d===e.minTranslate()||d===e.maxTranslate())return!0}}else{const s={time:now(),delta:Math.abs(c),direction:Math.sign(c),raw:t};o.length>=2&&o.shift();const a=o.length?o[o.length-1]:void 0;if(o.push(s),a?(s.direction!==a.direction||s.delta>a.delta||s.time>a.time+150)&&p(s):p(s),function(t){const s=e.params.mousewheel;if(t.direction<0){if(e.isEnd&&!e.params.loop&&s.releaseOnEdges)return!0}else if(e.isBeginning&&!e.params.loop&&s.releaseOnEdges)return!0;return!1}(s))return!0}return s.preventDefault?s.preventDefault():s.returnValue=!1,!1}function h(t){let s=e.$el;"container"!==e.params.mousewheel.eventsTarget&&(s=$(e.params.mousewheel.eventsTarget)),s[t]("mouseenter",d),s[t]("mouseleave",c),s[t]("wheel",u)}function m(){return e.params.cssMode?(e.wrapperEl.removeEventListener("wheel",u),!0):!e.mousewheel.enabled&&(h("on"),e.mousewheel.enabled=!0,!0)}function f(){return e.params.cssMode?(e.wrapperEl.addEventListener(event,u),!0):!!e.mousewheel.enabled&&(h("off"),e.mousewheel.enabled=!1,!0)}s("init",(()=>{!e.params.mousewheel.enabled&&e.params.cssMode&&f(),e.params.mousewheel.enabled&&m()})),s("destroy",(()=>{e.params.cssMode&&m(),e.mousewheel.enabled&&f()})),Object.assign(e.mousewheel,{enable:m,disable:f})}function createElementIfNotDefined(e,t,s,a){const i=getDocument();return e.params.createElements&&Object.keys(a).forEach((r=>{if(!s[r]&&!0===s.auto){let n=e.$el.children(`.${a[r]}`)[0];n||(n=i.createElement("div"),n.className=a[r],e.$el.append(n)),s[r]=n,t[r]=n}})),s}function Navigation({swiper:e,extendParams:t,on:s,emit:a}){function i(t){let s;return t&&(s=$(t),e.params.uniqueNavElements&&"string"==typeof t&&s.length>1&&1===e.$el.find(t).length&&(s=e.$el.find(t))),s}function r(t,s){const a=e.params.navigation;t&&t.length>0&&(t[s?"addClass":"removeClass"](a.disabledClass),t[0]&&"BUTTON"===t[0].tagName&&(t[0].disabled=s),e.params.watchOverflow&&e.enabled&&t[e.isLocked?"addClass":"removeClass"](a.lockClass))}function n(){if(e.params.loop)return;const{$nextEl:t,$prevEl:s}=e.navigation;r(s,e.isBeginning),r(t,e.isEnd)}function l(t){t.preventDefault(),e.isBeginning&&!e.params.loop||e.slidePrev()}function o(t){t.preventDefault(),e.isEnd&&!e.params.loop||e.slideNext()}function d(){const t=e.params.navigation;if(e.params.navigation=createElementIfNotDefined(e,e.originalParams.navigation,e.params.navigation,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),!t.nextEl&&!t.prevEl)return;const s=i(t.nextEl),a=i(t.prevEl);s&&s.length>0&&s.on("click",o),a&&a.length>0&&a.on("click",l),Object.assign(e.navigation,{$nextEl:s,nextEl:s&&s[0],$prevEl:a,prevEl:a&&a[0]}),e.enabled||(s&&s.addClass(t.lockClass),a&&a.addClass(t.lockClass))}function c(){const{$nextEl:t,$prevEl:s}=e.navigation;t&&t.length&&(t.off("click",o),t.removeClass(e.params.navigation.disabledClass)),s&&s.length&&(s.off("click",l),s.removeClass(e.params.navigation.disabledClass))}t({navigation:{nextEl:null,prevEl:null,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock"}}),e.navigation={nextEl:null,$nextEl:null,prevEl:null,$prevEl:null},s("init",(()=>{d(),n()})),s("toEdge fromEdge lock unlock",(()=>{n()})),s("destroy",(()=>{c()})),s("enable disable",(()=>{const{$nextEl:t,$prevEl:s}=e.navigation;t&&t[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass),s&&s[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass)})),s("click",((t,s)=>{const{$nextEl:i,$prevEl:r}=e.navigation,n=s.target;if(e.params.navigation.hideOnClick&&!$(n).is(r)&&!$(n).is(i)){if(e.pagination&&e.params.pagination&&e.params.pagination.clickable&&(e.pagination.el===n||e.pagination.el.contains(n)))return;let t;i?t=i.hasClass(e.params.navigation.hiddenClass):r&&(t=r.hasClass(e.params.navigation.hiddenClass)),a(!0===t?"navigationShow":"navigationHide"),i&&i.toggleClass(e.params.navigation.hiddenClass),r&&r.toggleClass(e.params.navigation.hiddenClass)}})),Object.assign(e.navigation,{update:n,init:d,destroy:c})}function classesToSelector(e=""){return`.${e.trim().replace(/([\.:!\/])/g,"\\$1").replace(/ /g,".")}`}function Pagination({swiper:e,extendParams:t,on:s,emit:a}){const i="swiper-pagination";let r;t({pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:e=>e,formatFractionTotal:e=>e,bulletClass:`${i}-bullet`,bulletActiveClass:`${i}-bullet-active`,modifierClass:`${i}-`,currentClass:`${i}-current`,totalClass:`${i}-total`,hiddenClass:`${i}-hidden`,progressbarFillClass:`${i}-progressbar-fill`,progressbarOppositeClass:`${i}-progressbar-opposite`,clickableClass:`${i}-clickable`,lockClass:`${i}-lock`,horizontalClass:`${i}-horizontal`,verticalClass:`${i}-vertical`}}),e.pagination={el:null,$el:null,bullets:[]};let n=0;function l(){return!e.params.pagination.el||!e.pagination.el||!e.pagination.$el||0===e.pagination.$el.length}function o(t,s){const{bulletActiveClass:a}=e.params.pagination;t[s]().addClass(`${a}-${s}`)[s]().addClass(`${a}-${s}-${s}`)}function d(){const t=e.rtl,s=e.params.pagination;if(l())return;const i=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,d=e.pagination.$el;let c;const p=e.params.loop?Math.ceil((i-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;if(e.params.loop?(c=Math.ceil((e.activeIndex-e.loopedSlides)/e.params.slidesPerGroup),c>i-1-2*e.loopedSlides&&(c-=i-2*e.loopedSlides),c>p-1&&(c-=p),c<0&&"bullets"!==e.params.paginationType&&(c=p+c)):c=void 0!==e.snapIndex?e.snapIndex:e.activeIndex||0,"bullets"===s.type&&e.pagination.bullets&&e.pagination.bullets.length>0){const a=e.pagination.bullets;let i,l,p;if(s.dynamicBullets&&(r=a.eq(0)[e.isHorizontal()?"outerWidth":"outerHeight"](!0),d.css(e.isHorizontal()?"width":"height",r*(s.dynamicMainBullets+4)+"px"),s.dynamicMainBullets>1&&void 0!==e.previousIndex&&(n+=c-e.previousIndex,n>s.dynamicMainBullets-1?n=s.dynamicMainBullets-1:n<0&&(n=0)),i=c-n,l=i+(Math.min(a.length,s.dynamicMainBullets)-1),p=(l+i)/2),a.removeClass(["","-next","-next-next","-prev","-prev-prev","-main"].map((e=>`${s.bulletActiveClass}${e}`)).join(" ")),d.length>1)a.each((e=>{const t=$(e),a=t.index();a===c&&t.addClass(s.bulletActiveClass),s.dynamicBullets&&(a>=i&&a<=l&&t.addClass(`${s.bulletActiveClass}-main`),a===i&&o(t,"prev"),a===l&&o(t,"next"))}));else{const t=a.eq(c),r=t.index();if(t.addClass(s.bulletActiveClass),s.dynamicBullets){const t=a.eq(i),n=a.eq(l);for(let e=i;e<=l;e+=1)a.eq(e).addClass(`${s.bulletActiveClass}-main`);if(e.params.loop)if(r>=a.length-s.dynamicMainBullets){for(let e=s.dynamicMainBullets;e>=0;e-=1)a.eq(a.length-e).addClass(`${s.bulletActiveClass}-main`);a.eq(a.length-s.dynamicMainBullets-1).addClass(`${s.bulletActiveClass}-prev`)}else o(t,"prev"),o(n,"next");else o(t,"prev"),o(n,"next")}}if(s.dynamicBullets){const i=Math.min(a.length,s.dynamicMainBullets+4),n=(r*i-r)/2-p*r,l=t?"right":"left";a.css(e.isHorizontal()?l:"top",`${n}px`)}}if("fraction"===s.type&&(d.find(classesToSelector(s.currentClass)).text(s.formatFractionCurrent(c+1)),d.find(classesToSelector(s.totalClass)).text(s.formatFractionTotal(p))),"progressbar"===s.type){let t;t=s.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";const a=(c+1)/p;let i=1,r=1;"horizontal"===t?i=a:r=a,d.find(classesToSelector(s.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${i}) scaleY(${r})`).transition(e.params.speed)}"custom"===s.type&&s.renderCustom?(d.html(s.renderCustom(e,c+1,p)),a("paginationRender",d[0])):a("paginationUpdate",d[0]),e.params.watchOverflow&&e.enabled&&d[e.isLocked?"addClass":"removeClass"](s.lockClass)}function c(){const t=e.params.pagination;if(l())return;const s=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,i=e.pagination.$el;let r="";if("bullets"===t.type){let a=e.params.loop?Math.ceil((s-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;e.params.freeMode&&e.params.freeMode.enabled&&!e.params.loop&&a>s&&(a=s);for(let s=0;s`;i.html(r),e.pagination.bullets=i.find(classesToSelector(t.bulletClass))}"fraction"===t.type&&(r=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):` / `,i.html(r)),"progressbar"===t.type&&(r=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):``,i.html(r)),"custom"!==t.type&&a("paginationRender",e.pagination.$el[0])}function p(){e.params.pagination=createElementIfNotDefined(e,e.originalParams.pagination,e.params.pagination,{el:"swiper-pagination"});const t=e.params.pagination;if(!t.el)return;let s=$(t.el);0!==s.length&&(e.params.uniqueNavElements&&"string"==typeof t.el&&s.length>1&&(s=e.$el.find(t.el),s.length>1&&(s=s.filter((t=>$(t).parents(".swiper")[0]===e.el)))),"bullets"===t.type&&t.clickable&&s.addClass(t.clickableClass),s.addClass(t.modifierClass+t.type),s.addClass(t.modifierClass+e.params.direction),"bullets"===t.type&&t.dynamicBullets&&(s.addClass(`${t.modifierClass}${t.type}-dynamic`),n=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&s.addClass(t.progressbarOppositeClass),t.clickable&&s.on("click",classesToSelector(t.bulletClass),(function(t){t.preventDefault();let s=$(this).index()*e.params.slidesPerGroup;e.params.loop&&(s+=e.loopedSlides),e.slideTo(s)})),Object.assign(e.pagination,{$el:s,el:s[0]}),e.enabled||s.addClass(t.lockClass))}function u(){const t=e.params.pagination;if(l())return;const s=e.pagination.$el;s.removeClass(t.hiddenClass),s.removeClass(t.modifierClass+t.type),s.removeClass(t.modifierClass+e.params.direction),e.pagination.bullets&&e.pagination.bullets.removeClass&&e.pagination.bullets.removeClass(t.bulletActiveClass),t.clickable&&s.off("click",classesToSelector(t.bulletClass))}s("init",(()=>{p(),c(),d()})),s("activeIndexChange",(()=>{(e.params.loop||void 0===e.snapIndex)&&d()})),s("snapIndexChange",(()=>{e.params.loop||d()})),s("slidesLengthChange",(()=>{e.params.loop&&(c(),d())})),s("snapGridLengthChange",(()=>{e.params.loop||(c(),d())})),s("destroy",(()=>{u()})),s("enable disable",(()=>{const{$el:t}=e.pagination;t&&t[e.enabled?"removeClass":"addClass"](e.params.pagination.lockClass)})),s("lock unlock",(()=>{d()})),s("click",((t,s)=>{const i=s.target,{$el:r}=e.pagination;if(e.params.pagination.el&&e.params.pagination.hideOnClick&&r.length>0&&!$(i).hasClass(e.params.pagination.bulletClass)){if(e.navigation&&(e.navigation.nextEl&&i===e.navigation.nextEl||e.navigation.prevEl&&i===e.navigation.prevEl))return;const t=r.hasClass(e.params.pagination.hiddenClass);a(!0===t?"paginationShow":"paginationHide"),r.toggleClass(e.params.pagination.hiddenClass)}})),Object.assign(e.pagination,{render:c,update:d,init:p,destroy:u})}function Scrollbar({swiper:e,extendParams:t,on:s,emit:a}){const i=getDocument();let r,n,l,o,d=!1,c=null,p=null;function u(){if(!e.params.scrollbar.el||!e.scrollbar.el)return;const{scrollbar:t,rtlTranslate:s,progress:a}=e,{$dragEl:i,$el:r}=t,o=e.params.scrollbar;let d=n,p=(l-n)*a;s?(p=-p,p>0?(d=n-p,p=0):-p+n>l&&(d=l+p)):p<0?(d=n+p,p=0):p+n>l&&(d=l-p),e.isHorizontal()?(i.transform(`translate3d(${p}px, 0, 0)`),i[0].style.width=`${d}px`):(i.transform(`translate3d(0px, ${p}px, 0)`),i[0].style.height=`${d}px`),o.hide&&(clearTimeout(c),r[0].style.opacity=1,c=setTimeout((()=>{r[0].style.opacity=0,r.transition(400)}),1e3))}function h(){if(!e.params.scrollbar.el||!e.scrollbar.el)return;const{scrollbar:t}=e,{$dragEl:s,$el:a}=t;s[0].style.width="",s[0].style.height="",l=e.isHorizontal()?a[0].offsetWidth:a[0].offsetHeight,o=e.size/(e.virtualSize+e.params.slidesOffsetBefore-(e.params.centeredSlides?e.snapGrid[0]:0)),n="auto"===e.params.scrollbar.dragSize?l*o:parseInt(e.params.scrollbar.dragSize,10),e.isHorizontal()?s[0].style.width=`${n}px`:s[0].style.height=`${n}px`,a[0].style.display=o>=1?"none":"",e.params.scrollbar.hide&&(a[0].style.opacity=0),e.params.watchOverflow&&e.enabled&&t.$el[e.isLocked?"addClass":"removeClass"](e.params.scrollbar.lockClass)}function m(t){return e.isHorizontal()?"touchstart"===t.type||"touchmove"===t.type?t.targetTouches[0].clientX:t.clientX:"touchstart"===t.type||"touchmove"===t.type?t.targetTouches[0].clientY:t.clientY}function f(t){const{scrollbar:s,rtlTranslate:a}=e,{$el:i}=s;let o;o=(m(t)-i.offset()[e.isHorizontal()?"left":"top"]-(null!==r?r:n/2))/(l-n),o=Math.max(Math.min(o,1),0),a&&(o=1-o);const d=e.minTranslate()+(e.maxTranslate()-e.minTranslate())*o;e.updateProgress(d),e.setTranslate(d),e.updateActiveIndex(),e.updateSlidesClasses()}function g(t){const s=e.params.scrollbar,{scrollbar:i,$wrapperEl:n}=e,{$el:l,$dragEl:o}=i;d=!0,r=t.target===o[0]||t.target===o?m(t)-t.target.getBoundingClientRect()[e.isHorizontal()?"left":"top"]:null,t.preventDefault(),t.stopPropagation(),n.transition(100),o.transition(100),f(t),clearTimeout(p),l.transition(0),s.hide&&l.css("opacity",1),e.params.cssMode&&e.$wrapperEl.css("scroll-snap-type","none"),a("scrollbarDragStart",t)}function v(t){const{scrollbar:s,$wrapperEl:i}=e,{$el:r,$dragEl:n}=s;d&&(t.preventDefault?t.preventDefault():t.returnValue=!1,f(t),i.transition(0),r.transition(0),n.transition(0),a("scrollbarDragMove",t))}function w(t){const s=e.params.scrollbar,{scrollbar:i,$wrapperEl:r}=e,{$el:n}=i;d&&(d=!1,e.params.cssMode&&(e.$wrapperEl.css("scroll-snap-type",""),r.transition("")),s.hide&&(clearTimeout(p),p=nextTick((()=>{n.css("opacity",0),n.transition(400)}),1e3)),a("scrollbarDragEnd",t),s.snapOnRelease&&e.slideToClosest())}function b(t){const{scrollbar:s,touchEventsTouch:a,touchEventsDesktop:r,params:n,support:l}=e,o=s.$el[0],d=!(!l.passiveListener||!n.passiveListeners)&&{passive:!1,capture:!1},c=!(!l.passiveListener||!n.passiveListeners)&&{passive:!0,capture:!1};if(!o)return;const p="on"===t?"addEventListener":"removeEventListener";l.touch?(o[p](a.start,g,d),o[p](a.move,v,d),o[p](a.end,w,c)):(o[p](r.start,g,d),i[p](r.move,v,d),i[p](r.end,w,c))}function x(){const{scrollbar:t,$el:s}=e;e.params.scrollbar=createElementIfNotDefined(e,e.originalParams.scrollbar,e.params.scrollbar,{el:"swiper-scrollbar"});const a=e.params.scrollbar;if(!a.el)return;let i=$(a.el);e.params.uniqueNavElements&&"string"==typeof a.el&&i.length>1&&1===s.find(a.el).length&&(i=s.find(a.el));let r=i.find(`.${e.params.scrollbar.dragClass}`);0===r.length&&(r=$(`
`),i.append(r)),Object.assign(t,{$el:i,el:i[0],$dragEl:r,dragEl:r[0]}),a.draggable&&e.params.scrollbar.el&&b("on"),i&&i[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)}function y(){e.params.scrollbar.el&&b("off")}t({scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag"}}),e.scrollbar={el:null,dragEl:null,$el:null,$dragEl:null},s("init",(()=>{x(),h(),u()})),s("update resize observerUpdate lock unlock",(()=>{h()})),s("setTranslate",(()=>{u()})),s("setTransition",((t,s)=>{!function(t){e.params.scrollbar.el&&e.scrollbar.el&&e.scrollbar.$dragEl.transition(t)}(s)})),s("enable disable",(()=>{const{$el:t}=e.scrollbar;t&&t[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)})),s("destroy",(()=>{y()})),Object.assign(e.scrollbar,{updateSize:h,setTranslate:u,init:x,destroy:y})}function Parallax({swiper:e,extendParams:t,on:s}){t({parallax:{enabled:!1}});const a=(t,s)=>{const{rtl:a}=e,i=$(t),r=a?-1:1,n=i.attr("data-swiper-parallax")||"0";let l=i.attr("data-swiper-parallax-x"),o=i.attr("data-swiper-parallax-y");const d=i.attr("data-swiper-parallax-scale"),c=i.attr("data-swiper-parallax-opacity");if(l||o?(l=l||"0",o=o||"0"):e.isHorizontal()?(l=n,o="0"):(o=n,l="0"),l=l.indexOf("%")>=0?parseInt(l,10)*s*r+"%":l*s*r+"px",o=o.indexOf("%")>=0?parseInt(o,10)*s+"%":o*s+"px",null!=c){const e=c-(c-1)*(1-Math.abs(s));i[0].style.opacity=e}if(null==d)i.transform(`translate3d(${l}, ${o}, 0px)`);else{const e=d-(d-1)*(1-Math.abs(s));i.transform(`translate3d(${l}, ${o}, 0px) scale(${e})`)}},i=()=>{const{$el:t,slides:s,progress:i,snapGrid:r}=e;t.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{a(e,i)})),s.each(((t,s)=>{let n=t.progress;e.params.slidesPerGroup>1&&"auto"!==e.params.slidesPerView&&(n+=Math.ceil(s/2)-i*(r.length-1)),n=Math.min(Math.max(n,-1),1),$(t).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{a(e,n)}))}))};s("beforeInit",(()=>{e.params.parallax.enabled&&(e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)})),s("init",(()=>{e.params.parallax.enabled&&i()})),s("setTranslate",(()=>{e.params.parallax.enabled&&i()})),s("setTransition",((t,s)=>{e.params.parallax.enabled&&((t=e.params.speed)=>{const{$el:s}=e;s.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{const s=$(e);let a=parseInt(s.attr("data-swiper-parallax-duration"),10)||t;0===t&&(a=0),s.transition(a)}))})(s)}))}function Zoom({swiper:e,extendParams:t,on:s,emit:a}){const i=getWindow();t({zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}}),e.zoom={enabled:!1};let r,n,l,o=1,d=!1;const c={$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},p={isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},u={x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0};let h=1;function m(e){if(e.targetTouches.length<2)return 1;const t=e.targetTouches[0].pageX,s=e.targetTouches[0].pageY,a=e.targetTouches[1].pageX,i=e.targetTouches[1].pageY;return Math.sqrt((a-t)**2+(i-s)**2)}function f(t){const s=e.support,a=e.params.zoom;if(n=!1,l=!1,!s.gestures){if("touchstart"!==t.type||"touchstart"===t.type&&t.targetTouches.length<2)return;n=!0,c.scaleStart=m(t)}c.$slideEl&&c.$slideEl.length||(c.$slideEl=$(t.target).closest(`.${e.params.slideClass}`),0===c.$slideEl.length&&(c.$slideEl=e.slides.eq(e.activeIndex)),c.$imageEl=c.$slideEl.find(`.${a.containerClass}`).eq(0).find("img, svg, canvas, picture, .swiper-zoom-target"),c.$imageWrapEl=c.$imageEl.parent(`.${a.containerClass}`),c.maxRatio=c.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,0!==c.$imageWrapEl.length)?(c.$imageEl&&c.$imageEl.transition(0),d=!0):c.$imageEl=void 0}function g(t){const s=e.support,a=e.params.zoom,i=e.zoom;if(!s.gestures){if("touchmove"!==t.type||"touchmove"===t.type&&t.targetTouches.length<2)return;l=!0,c.scaleMove=m(t)}c.$imageEl&&0!==c.$imageEl.length?(s.gestures?i.scale=t.scale*o:i.scale=c.scaleMove/c.scaleStart*o,i.scale>c.maxRatio&&(i.scale=c.maxRatio-1+(i.scale-c.maxRatio+1)**.5),i.scalep.touchesStart.x))return void(p.isTouched=!1);if(!e.isHorizontal()&&(Math.floor(p.minY)===Math.floor(p.startY)&&p.touchesCurrent.yp.touchesStart.y))return void(p.isTouched=!1)}t.cancelable&&t.preventDefault(),t.stopPropagation(),p.isMoved=!0,p.currentX=p.touchesCurrent.x-p.touchesStart.x+p.startX,p.currentY=p.touchesCurrent.y-p.touchesStart.y+p.startY,p.currentXp.maxX&&(p.currentX=p.maxX-1+(p.currentX-p.maxX+1)**.8),p.currentYp.maxY&&(p.currentY=p.maxY-1+(p.currentY-p.maxY+1)**.8),u.prevPositionX||(u.prevPositionX=p.touchesCurrent.x),u.prevPositionY||(u.prevPositionY=p.touchesCurrent.y),u.prevTime||(u.prevTime=Date.now()),u.x=(p.touchesCurrent.x-u.prevPositionX)/(Date.now()-u.prevTime)/2,u.y=(p.touchesCurrent.y-u.prevPositionY)/(Date.now()-u.prevTime)/2,Math.abs(p.touchesCurrent.x-u.prevPositionX)<2&&(u.x=0),Math.abs(p.touchesCurrent.y-u.prevPositionY)<2&&(u.y=0),u.prevPositionX=p.touchesCurrent.x,u.prevPositionY=p.touchesCurrent.y,u.prevTime=Date.now(),c.$imageWrapEl.transform(`translate3d(${p.currentX}px, ${p.currentY}px,0)`)}}function b(){const t=e.zoom;c.$slideEl&&e.previousIndex!==e.activeIndex&&(c.$imageEl&&c.$imageEl.transform("translate3d(0,0,0) scale(1)"),c.$imageWrapEl&&c.$imageWrapEl.transform("translate3d(0,0,0)"),t.scale=1,o=1,c.$slideEl=void 0,c.$imageEl=void 0,c.$imageWrapEl=void 0)}function x(t){const s=e.zoom,a=e.params.zoom;if(c.$slideEl||(t&&t.target&&(c.$slideEl=$(t.target).closest(`.${e.params.slideClass}`)),c.$slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?c.$slideEl=e.$wrapperEl.children(`.${e.params.slideActiveClass}`):c.$slideEl=e.slides.eq(e.activeIndex)),c.$imageEl=c.$slideEl.find(`.${a.containerClass}`).eq(0).find("img, svg, canvas, picture, .swiper-zoom-target"),c.$imageWrapEl=c.$imageEl.parent(`.${a.containerClass}`)),!c.$imageEl||0===c.$imageEl.length||!c.$imageWrapEl||0===c.$imageWrapEl.length)return;let r,n,l,d,u,h,m,f,g,v,w,b,x,y,E,T,S,C;e.params.cssMode&&(e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.touchAction="none"),c.$slideEl.addClass(`${a.zoomedSlideClass}`),void 0===p.touchesStart.x&&t?(r="touchend"===t.type?t.changedTouches[0].pageX:t.pageX,n="touchend"===t.type?t.changedTouches[0].pageY:t.pageY):(r=p.touchesStart.x,n=p.touchesStart.y),s.scale=c.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,o=c.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,t?(S=c.$slideEl[0].offsetWidth,C=c.$slideEl[0].offsetHeight,l=c.$slideEl.offset().left+i.scrollX,d=c.$slideEl.offset().top+i.scrollY,u=l+S/2-r,h=d+C/2-n,g=c.$imageEl[0].offsetWidth,v=c.$imageEl[0].offsetHeight,w=g*s.scale,b=v*s.scale,x=Math.min(S/2-w/2,0),y=Math.min(C/2-b/2,0),E=-x,T=-y,m=u*s.scale,f=h*s.scale,mE&&(m=E),fT&&(f=T)):(m=0,f=0),c.$imageWrapEl.transition(300).transform(`translate3d(${m}px, ${f}px,0)`),c.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${s.scale})`)}function y(){const t=e.zoom,s=e.params.zoom;c.$slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?c.$slideEl=e.$wrapperEl.children(`.${e.params.slideActiveClass}`):c.$slideEl=e.slides.eq(e.activeIndex),c.$imageEl=c.$slideEl.find(`.${s.containerClass}`).eq(0).find("img, svg, canvas, picture, .swiper-zoom-target"),c.$imageWrapEl=c.$imageEl.parent(`.${s.containerClass}`)),c.$imageEl&&0!==c.$imageEl.length&&c.$imageWrapEl&&0!==c.$imageWrapEl.length&&(e.params.cssMode&&(e.wrapperEl.style.overflow="",e.wrapperEl.style.touchAction=""),t.scale=1,o=1,c.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),c.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),c.$slideEl.removeClass(`${s.zoomedSlideClass}`),c.$slideEl=void 0)}function E(t){const s=e.zoom;s.scale&&1!==s.scale?y():x(t)}function T(){const t=e.support;return{passiveListener:!("touchstart"!==e.touchEvents.start||!t.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1},activeListenerWithCapture:!t.passiveListener||{passive:!1,capture:!0}}}function S(){return`.${e.params.slideClass}`}function C(t){const{passiveListener:s}=T(),a=S();e.$wrapperEl[t]("gesturestart",a,f,s),e.$wrapperEl[t]("gesturechange",a,g,s),e.$wrapperEl[t]("gestureend",a,v,s)}function M(){r||(r=!0,C("on"))}function P(){r&&(r=!1,C("off"))}function k(){const t=e.zoom;if(t.enabled)return;t.enabled=!0;const s=e.support,{passiveListener:a,activeListenerWithCapture:i}=T(),r=S();s.gestures?(e.$wrapperEl.on(e.touchEvents.start,M,a),e.$wrapperEl.on(e.touchEvents.end,P,a)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.on(e.touchEvents.start,r,f,a),e.$wrapperEl.on(e.touchEvents.move,r,g,i),e.$wrapperEl.on(e.touchEvents.end,r,v,a),e.touchEvents.cancel&&e.$wrapperEl.on(e.touchEvents.cancel,r,v,a)),e.$wrapperEl.on(e.touchEvents.move,`.${e.params.zoom.containerClass}`,w,i)}function z(){const t=e.zoom;if(!t.enabled)return;const s=e.support;t.enabled=!1;const{passiveListener:a,activeListenerWithCapture:i}=T(),r=S();s.gestures?(e.$wrapperEl.off(e.touchEvents.start,M,a),e.$wrapperEl.off(e.touchEvents.end,P,a)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.off(e.touchEvents.start,r,f,a),e.$wrapperEl.off(e.touchEvents.move,r,g,i),e.$wrapperEl.off(e.touchEvents.end,r,v,a),e.touchEvents.cancel&&e.$wrapperEl.off(e.touchEvents.cancel,r,v,a)),e.$wrapperEl.off(e.touchEvents.move,`.${e.params.zoom.containerClass}`,w,i)}Object.defineProperty(e.zoom,"scale",{get:()=>h,set(e){if(h!==e){const t=c.$imageEl?c.$imageEl[0]:void 0,s=c.$slideEl?c.$slideEl[0]:void 0;a("zoomChange",e,t,s)}h=e}}),s("init",(()=>{e.params.zoom.enabled&&k()})),s("destroy",(()=>{z()})),s("touchStart",((t,s)=>{e.zoom.enabled&&function(t){const s=e.device;c.$imageEl&&0!==c.$imageEl.length&&(p.isTouched||(s.android&&t.cancelable&&t.preventDefault(),p.isTouched=!0,p.touchesStart.x="touchstart"===t.type?t.targetTouches[0].pageX:t.pageX,p.touchesStart.y="touchstart"===t.type?t.targetTouches[0].pageY:t.pageY))}(s)})),s("touchEnd",((t,s)=>{e.zoom.enabled&&function(){const t=e.zoom;if(!c.$imageEl||0===c.$imageEl.length)return;if(!p.isTouched||!p.isMoved)return p.isTouched=!1,void(p.isMoved=!1);p.isTouched=!1,p.isMoved=!1;let s=300,a=300;const i=u.x*s,r=p.currentX+i,n=u.y*a,l=p.currentY+n;0!==u.x&&(s=Math.abs((r-p.currentX)/u.x)),0!==u.y&&(a=Math.abs((l-p.currentY)/u.y));const o=Math.max(s,a);p.currentX=r,p.currentY=l;const d=p.width*t.scale,h=p.height*t.scale;p.minX=Math.min(c.slideWidth/2-d/2,0),p.maxX=-p.minX,p.minY=Math.min(c.slideHeight/2-h/2,0),p.maxY=-p.minY,p.currentX=Math.max(Math.min(p.currentX,p.maxX),p.minX),p.currentY=Math.max(Math.min(p.currentY,p.maxY),p.minY),c.$imageWrapEl.transition(o).transform(`translate3d(${p.currentX}px, ${p.currentY}px,0)`)}()})),s("doubleTap",((t,s)=>{!e.animating&&e.params.zoom.enabled&&e.zoom.enabled&&e.params.zoom.toggle&&E(s)})),s("transitionEnd",(()=>{e.zoom.enabled&&e.params.zoom.enabled&&b()})),s("slideChange",(()=>{e.zoom.enabled&&e.params.zoom.enabled&&e.params.cssMode&&b()})),Object.assign(e.zoom,{enable:k,disable:z,in:x,out:y,toggle:E})}function Lazy({swiper:e,extendParams:t,on:s,emit:a}){t({lazy:{checkInView:!1,enabled:!1,loadPrevNext:!1,loadPrevNextAmount:1,loadOnTransitionStart:!1,scrollingElement:"",elementClass:"swiper-lazy",loadingClass:"swiper-lazy-loading",loadedClass:"swiper-lazy-loaded",preloaderClass:"swiper-lazy-preloader"}}),e.lazy={};let i=!1,r=!1;function n(t,s=!0){const i=e.params.lazy;if(void 0===t)return;if(0===e.slides.length)return;const r=e.virtual&&e.params.virtual.enabled?e.$wrapperEl.children(`.${e.params.slideClass}[data-swiper-slide-index="${t}"]`):e.slides.eq(t),l=r.find(`.${i.elementClass}:not(.${i.loadedClass}):not(.${i.loadingClass})`);!r.hasClass(i.elementClass)||r.hasClass(i.loadedClass)||r.hasClass(i.loadingClass)||l.push(r[0]),0!==l.length&&l.each((t=>{const l=$(t);l.addClass(i.loadingClass);const o=l.attr("data-background"),d=l.attr("data-src"),c=l.attr("data-srcset"),p=l.attr("data-sizes"),u=l.parent("picture");e.loadImage(l[0],d||o,c,p,!1,(()=>{if(null!=e&&e&&(!e||e.params)&&!e.destroyed){if(o?(l.css("background-image",`url("${o}")`),l.removeAttr("data-background")):(c&&(l.attr("srcset",c),l.removeAttr("data-srcset")),p&&(l.attr("sizes",p),l.removeAttr("data-sizes")),u.length&&u.children("source").each((e=>{const t=$(e);t.attr("data-srcset")&&(t.attr("srcset",t.attr("data-srcset")),t.removeAttr("data-srcset"))})),d&&(l.attr("src",d),l.removeAttr("data-src"))),l.addClass(i.loadedClass).removeClass(i.loadingClass),r.find(`.${i.preloaderClass}`).remove(),e.params.loop&&s){const t=r.attr("data-swiper-slide-index");if(r.hasClass(e.params.slideDuplicateClass)){n(e.$wrapperEl.children(`[data-swiper-slide-index="${t}"]:not(.${e.params.slideDuplicateClass})`).index(),!1)}else{n(e.$wrapperEl.children(`.${e.params.slideDuplicateClass}[data-swiper-slide-index="${t}"]`).index(),!1)}}a("lazyImageReady",r[0],l[0]),e.params.autoHeight&&e.updateAutoHeight()}})),a("lazyImageLoad",r[0],l[0])}))}function l(){const{$wrapperEl:t,params:s,slides:a,activeIndex:i}=e,l=e.virtual&&s.virtual.enabled,o=s.lazy;let d=s.slidesPerView;function c(e){if(l){if(t.children(`.${s.slideClass}[data-swiper-slide-index="${e}"]`).length)return!0}else if(a[e])return!0;return!1}function p(e){return l?$(e).attr("data-swiper-slide-index"):$(e).index()}if("auto"===d&&(d=0),r||(r=!0),e.params.watchSlidesProgress)t.children(`.${s.slideVisibleClass}`).each((e=>{n(l?$(e).attr("data-swiper-slide-index"):$(e).index())}));else if(d>1)for(let e=i;e1||o.loadPrevNextAmount&&o.loadPrevNextAmount>1){const e=o.loadPrevNextAmount,t=d,s=Math.min(i+t+Math.max(e,t),a.length),r=Math.max(i-Math.max(t,e),0);for(let e=i+d;e0&&n(p(e));const a=t.children(`.${s.slidePrevClass}`);a.length>0&&n(p(a))}}function o(){const t=getWindow();if(!e||e.destroyed)return;const s=e.params.lazy.scrollingElement?$(e.params.lazy.scrollingElement):$(t),a=s[0]===t,r=a?t.innerWidth:s[0].offsetWidth,n=a?t.innerHeight:s[0].offsetHeight,d=e.$el.offset(),{rtlTranslate:c}=e;let p=!1;c&&(d.left-=e.$el[0].scrollLeft);const u=[[d.left,d.top],[d.left+e.width,d.top],[d.left,d.top+e.height],[d.left+e.width,d.top+e.height]];for(let e=0;e=0&&t[0]<=r&&t[1]>=0&&t[1]<=n){if(0===t[0]&&0===t[1])continue;p=!0}}const h=!("touchstart"!==e.touchEvents.start||!e.support.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1};p?(l(),s.off("scroll",o,h)):i||(i=!0,s.on("scroll",o,h))}s("beforeInit",(()=>{e.params.lazy.enabled&&e.params.preloadImages&&(e.params.preloadImages=!1)})),s("init",(()=>{e.params.lazy.enabled&&(e.params.lazy.checkInView?o():l())})),s("scroll",(()=>{e.params.freeMode&&e.params.freeMode.enabled&&!e.params.freeMode.sticky&&l()})),s("scrollbarDragMove resize _freeModeNoMomentumRelease",(()=>{e.params.lazy.enabled&&(e.params.lazy.checkInView?o():l())})),s("transitionStart",(()=>{e.params.lazy.enabled&&(e.params.lazy.loadOnTransitionStart||!e.params.lazy.loadOnTransitionStart&&!r)&&(e.params.lazy.checkInView?o():l())})),s("transitionEnd",(()=>{e.params.lazy.enabled&&!e.params.lazy.loadOnTransitionStart&&(e.params.lazy.checkInView?o():l())})),s("slideChange",(()=>{const{lazy:t,cssMode:s,watchSlidesProgress:a,touchReleaseOnEdges:i,resistanceRatio:r}=e.params;t.enabled&&(s||a&&(i||0===r))&&l()})),Object.assign(e.lazy,{load:l,loadInSlide:n})}function Controller({swiper:e,extendParams:t,on:s}){function a(e,t){const s=function(){let e,t,s;return(a,i)=>{for(t=-1,e=a.length;e-t>1;)s=e+t>>1,a[s]<=i?t=s:e=s;return e}}();let a,i;return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(i=s(this.x,e),a=i-1,(e-this.x[a])*(this.y[i]-this.y[a])/(this.x[i]-this.x[a])+this.y[a]):0},this}function i(){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)}t({controller:{control:void 0,inverse:!1,by:"slide"}}),e.controller={control:void 0},s("beforeInit",(()=>{e.controller.control=e.params.controller.control})),s("update",(()=>{i()})),s("resize",(()=>{i()})),s("observerUpdate",(()=>{i()})),s("setTranslate",((t,s,a)=>{e.controller.control&&e.controller.setTranslate(s,a)})),s("setTransition",((t,s,a)=>{e.controller.control&&e.controller.setTransition(s,a)})),Object.assign(e.controller,{setTranslate:function(t,s){const i=e.controller.control;let r,n;const l=e.constructor;function o(t){const s=e.rtlTranslate?-e.translate:e.translate;"slide"===e.params.controller.by&&(!function(t){e.controller.spline||(e.controller.spline=e.params.loop?new a(e.slidesGrid,t.slidesGrid):new a(e.snapGrid,t.snapGrid))}(t),n=-e.controller.spline.interpolate(-s)),n&&"container"!==e.params.controller.by||(r=(t.maxTranslate()-t.minTranslate())/(e.maxTranslate()-e.minTranslate()),n=(s-e.minTranslate())*r+t.minTranslate()),e.params.controller.inverse&&(n=t.maxTranslate()-n),t.updateProgress(n),t.setTranslate(n,e),t.updateActiveIndex(),t.updateSlidesClasses()}if(Array.isArray(i))for(let e=0;e{s.updateAutoHeight()})),s.$wrapperEl.transitionEnd((()=>{i&&(s.params.loop&&"slide"===e.params.controller.by&&s.loopFix(),s.transitionEnd())})))}if(Array.isArray(i))for(r=0;r0&&(e.isBeginning?(c(s),n(s)):(p(s),r(s))),t&&t.length>0&&(e.isEnd?(c(t),n(t)):(p(t),r(t)))}function m(){return e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length}const f=(e,t,s)=>{r(e),"BUTTON"!==e[0].tagName&&(l(e,"button"),e.on("keydown",u)),d(e,s),function(e,t){e.attr("aria-controls",t)}(e,t)};function g(){const t=e.params.a11y;e.$el.append(a);const s=e.$el;t.containerRoleDescriptionMessage&&o(s,t.containerRoleDescriptionMessage),t.containerMessage&&d(s,t.containerMessage);const i=e.$wrapperEl,r=i.attr("id")||`swiper-wrapper-${function(e=16){return"x".repeat(e).replace(/x/g,(()=>Math.round(16*Math.random()).toString(16)))}(16)}`,n=e.params.autoplay&&e.params.autoplay.enabled?"off":"polite";var c;c=r,i.attr("id",c),function(e,t){e.attr("aria-live",t)}(i,n),t.itemRoleDescriptionMessage&&o($(e.slides),t.itemRoleDescriptionMessage),l($(e.slides),t.slideRole);const p=e.params.loop?e.slides.filter((t=>!t.classList.contains(e.params.slideDuplicateClass))).length:e.slides.length;let h,g;e.slides.each(((s,a)=>{const i=$(s),r=e.params.loop?parseInt(i.attr("data-swiper-slide-index"),10):a;d(i,t.slideLabelMessage.replace(/\{\{index\}\}/,r+1).replace(/\{\{slidesLength\}\}/,p))})),e.navigation&&e.navigation.$nextEl&&(h=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(g=e.navigation.$prevEl),h&&h.length&&f(h,r,t.nextSlideMessage),g&&g.length&&f(g,r,t.prevSlideMessage),m()&&e.pagination.$el.on("keydown",classesToSelector(e.params.pagination.bulletClass),u)}s("beforeInit",(()=>{a=$(``)})),s("afterInit",(()=>{e.params.a11y.enabled&&(g(),h())})),s("toEdge",(()=>{e.params.a11y.enabled&&h()})),s("fromEdge",(()=>{e.params.a11y.enabled&&h()})),s("paginationUpdate",(()=>{e.params.a11y.enabled&&function(){const t=e.params.a11y;m()&&e.pagination.bullets.each((s=>{const a=$(s);r(a),e.params.pagination.renderBullet||(l(a,"button"),d(a,t.paginationBulletMessage.replace(/\{\{index\}\}/,a.index()+1)))}))}()})),s("destroy",(()=>{e.params.a11y.enabled&&function(){let t,s;a&&a.length>0&&a.remove(),e.navigation&&e.navigation.$nextEl&&(t=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(s=e.navigation.$prevEl),t&&t.off("keydown",u),s&&s.off("keydown",u),m()&&e.pagination.$el.off("keydown",classesToSelector(e.params.pagination.bulletClass),u)}()}))}function History({swiper:e,extendParams:t,on:s}){t({history:{enabled:!1,root:"",replaceState:!1,key:"slides"}});let a=!1,i={};const r=e=>e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,""),n=e=>{const t=getWindow();let s;s=e?new URL(e):t.location;const a=s.pathname.slice(1).split("/").filter((e=>""!==e)),i=a.length;return{key:a[i-2],value:a[i-1]}},l=(t,s)=>{const i=getWindow();if(!a||!e.params.history.enabled)return;let n;n=e.params.url?new URL(e.params.url):i.location;const l=e.slides.eq(s);let o=r(l.attr("data-history"));if(e.params.history.root.length>0){let s=e.params.history.root;"/"===s[s.length-1]&&(s=s.slice(0,s.length-1)),o=`${s}/${t}/${o}`}else n.pathname.includes(t)||(o=`${t}/${o}`);const d=i.history.state;d&&d.value===o||(e.params.history.replaceState?i.history.replaceState({value:o},null,o):i.history.pushState({value:o},null,o))},o=(t,s,a)=>{if(s)for(let i=0,n=e.slides.length;i{i=n(e.params.url),o(e.params.speed,e.paths.value,!1)};s("init",(()=>{e.params.history.enabled&&(()=>{const t=getWindow();if(e.params.history){if(!t.history||!t.history.pushState)return e.params.history.enabled=!1,void(e.params.hashNavigation.enabled=!0);a=!0,i=n(e.params.url),(i.key||i.value)&&(o(0,i.value,e.params.runCallbacksOnInit),e.params.history.replaceState||t.addEventListener("popstate",d))}})()})),s("destroy",(()=>{e.params.history.enabled&&(()=>{const t=getWindow();e.params.history.replaceState||t.removeEventListener("popstate",d)})()})),s("transitionEnd _freeModeNoMomentumRelease",(()=>{a&&l(e.params.history.key,e.activeIndex)})),s("slideChange",(()=>{a&&e.params.cssMode&&l(e.params.history.key,e.activeIndex)}))}function HashNavigation({swiper:e,extendParams:t,emit:s,on:a}){let i=!1;const r=getDocument(),n=getWindow();t({hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}});const l=()=>{s("hashChange");const t=r.location.hash.replace("#","");if(t!==e.slides.eq(e.activeIndex).attr("data-hash")){const s=e.$wrapperEl.children(`.${e.params.slideClass}[data-hash="${t}"]`).index();if(void 0===s)return;e.slideTo(s)}},o=()=>{if(i&&e.params.hashNavigation.enabled)if(e.params.hashNavigation.replaceState&&n.history&&n.history.replaceState)n.history.replaceState(null,null,`#${e.slides.eq(e.activeIndex).attr("data-hash")}`||""),s("hashSet");else{const t=e.slides.eq(e.activeIndex),a=t.attr("data-hash")||t.attr("data-history");r.location.hash=a||"",s("hashSet")}};a("init",(()=>{e.params.hashNavigation.enabled&&(()=>{if(!e.params.hashNavigation.enabled||e.params.history&&e.params.history.enabled)return;i=!0;const t=r.location.hash.replace("#","");if(t){const s=0;for(let a=0,i=e.slides.length;a{e.params.hashNavigation.enabled&&e.params.hashNavigation.watchState&&$(n).off("hashchange",l)})),a("transitionEnd _freeModeNoMomentumRelease",(()=>{i&&o()})),a("slideChange",(()=>{i&&e.params.cssMode&&o()}))}function Autoplay({swiper:e,extendParams:t,on:s,emit:a}){let i;function r(){const t=e.slides.eq(e.activeIndex);let s=e.params.autoplay.delay;t.attr("data-swiper-autoplay")&&(s=t.attr("data-swiper-autoplay")||e.params.autoplay.delay),clearTimeout(i),i=nextTick((()=>{let t;e.params.autoplay.reverseDirection?e.params.loop?(e.loopFix(),t=e.slidePrev(e.params.speed,!0,!0),a("autoplay")):e.isBeginning?e.params.autoplay.stopOnLastSlide?l():(t=e.slideTo(e.slides.length-1,e.params.speed,!0,!0),a("autoplay")):(t=e.slidePrev(e.params.speed,!0,!0),a("autoplay")):e.params.loop?(e.loopFix(),t=e.slideNext(e.params.speed,!0,!0),a("autoplay")):e.isEnd?e.params.autoplay.stopOnLastSlide?l():(t=e.slideTo(0,e.params.speed,!0,!0),a("autoplay")):(t=e.slideNext(e.params.speed,!0,!0),a("autoplay")),(e.params.cssMode&&e.autoplay.running||!1===t)&&r()}),s)}function n(){return void 0===i&&(!e.autoplay.running&&(e.autoplay.running=!0,a("autoplayStart"),r(),!0))}function l(){return!!e.autoplay.running&&(void 0!==i&&(i&&(clearTimeout(i),i=void 0),e.autoplay.running=!1,a("autoplayStop"),!0))}function o(t){e.autoplay.running&&(e.autoplay.paused||(i&&clearTimeout(i),e.autoplay.paused=!0,0!==t&&e.params.autoplay.waitForTransition?["transitionend","webkitTransitionEnd"].forEach((t=>{e.$wrapperEl[0].addEventListener(t,c)})):(e.autoplay.paused=!1,r())))}function d(){const t=getDocument();"hidden"===t.visibilityState&&e.autoplay.running&&o(),"visible"===t.visibilityState&&e.autoplay.paused&&(r(),e.autoplay.paused=!1)}function c(t){e&&!e.destroyed&&e.$wrapperEl&&t.target===e.$wrapperEl[0]&&(["transitionend","webkitTransitionEnd"].forEach((t=>{e.$wrapperEl[0].removeEventListener(t,c)})),e.autoplay.paused=!1,e.autoplay.running?r():l())}function p(){e.params.autoplay.disableOnInteraction?l():o(),["transitionend","webkitTransitionEnd"].forEach((t=>{e.$wrapperEl[0].removeEventListener(t,c)}))}function u(){e.params.autoplay.disableOnInteraction||(e.autoplay.paused=!1,r())}e.autoplay={running:!1,paused:!1},t({autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}}),s("init",(()=>{if(e.params.autoplay.enabled){n();getDocument().addEventListener("visibilitychange",d),e.params.autoplay.pauseOnMouseEnter&&(e.$el.on("mouseenter",p),e.$el.on("mouseleave",u))}})),s("beforeTransitionStart",((t,s,a)=>{e.autoplay.running&&(a||!e.params.autoplay.disableOnInteraction?e.autoplay.pause(s):l())})),s("sliderFirstMove",(()=>{e.autoplay.running&&(e.params.autoplay.disableOnInteraction?l():o())})),s("touchEnd",(()=>{e.params.cssMode&&e.autoplay.paused&&!e.params.autoplay.disableOnInteraction&&r()})),s("destroy",(()=>{e.$el.off("mouseenter",p),e.$el.off("mouseleave",u),e.autoplay.running&&l();getDocument().removeEventListener("visibilitychange",d)})),Object.assign(e.autoplay,{pause:o,run:r,start:n,stop:l})}function Thumb({swiper:e,extendParams:t,on:s}){t({thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-thumbs"}});let a=!1,i=!1;function r(){const t=e.thumbs.swiper;if(!t)return;const s=t.clickedIndex,a=t.clickedSlide;if(a&&$(a).hasClass(e.params.thumbs.slideThumbActiveClass))return;if(null==s)return;let i;if(i=t.params.loop?parseInt($(t.clickedSlide).attr("data-swiper-slide-index"),10):s,e.params.loop){let t=e.activeIndex;e.slides.eq(t).hasClass(e.params.slideDuplicateClass)&&(e.loopFix(),e._clientLeft=e.$wrapperEl[0].clientLeft,t=e.activeIndex);const s=e.slides.eq(t).prevAll(`[data-swiper-slide-index="${i}"]`).eq(0).index(),a=e.slides.eq(t).nextAll(`[data-swiper-slide-index="${i}"]`).eq(0).index();i=void 0===s?a:void 0===a?s:a-t1?a:o:a-oe.previousIndex?"next":"prev"}else n=e.realIndex,l=n>e.previousIndex?"next":"prev";r&&(n+="next"===l?i:-1*i),s.visibleSlidesIndexes&&s.visibleSlidesIndexes.indexOf(n)<0&&(s.params.centeredSlides?n=n>o?n-Math.floor(a/2)+1:n+Math.floor(a/2)-1:n>o&&s.params.slidesPerGroup,s.slideTo(n,t?0:void 0))}let n=1;const l=e.params.thumbs.slideThumbActiveClass;if(e.params.slidesPerView>1&&!e.params.centeredSlides&&(n=e.params.slidesPerView),e.params.thumbs.multipleActiveThumbs||(n=1),n=Math.floor(n),s.slides.removeClass(l),s.params.loop||s.params.virtual&&s.params.virtual.enabled)for(let t=0;t{const{thumbs:t}=e.params;t&&t.swiper&&(n(),l(!0))})),s("slideChange update resize observerUpdate",(()=>{e.thumbs.swiper&&l()})),s("setTransition",((t,s)=>{const a=e.thumbs.swiper;a&&a.setTransition(s)})),s("beforeDestroy",(()=>{const t=e.thumbs.swiper;t&&i&&t&&t.destroy()})),Object.assign(e.thumbs,{init:n,update:l})}function freeMode({swiper:e,extendParams:t,emit:s,once:a}){t({freeMode:{enabled:!1,momentum:!0,momentumRatio:1,momentumBounce:!0,momentumBounceRatio:1,momentumVelocityRatio:1,sticky:!1,minimumVelocity:.02}}),Object.assign(e,{freeMode:{onTouchMove:function(){const{touchEventsData:t,touches:s}=e;0===t.velocities.length&&t.velocities.push({position:s[e.isHorizontal()?"startX":"startY"],time:t.touchStartTime}),t.velocities.push({position:s[e.isHorizontal()?"currentX":"currentY"],time:now()})},onTouchEnd:function({currentPos:t}){const{params:i,$wrapperEl:r,rtlTranslate:n,snapGrid:l,touchEventsData:o}=e,d=now()-o.touchStartTime;if(t<-e.minTranslate())e.slideTo(e.activeIndex);else if(t>-e.maxTranslate())e.slides.length1){const t=o.velocities.pop(),s=o.velocities.pop(),a=t.position-s.position,r=t.time-s.time;e.velocity=a/r,e.velocity/=2,Math.abs(e.velocity)150||now()-t.time>300)&&(e.velocity=0)}else e.velocity=0;e.velocity*=i.freeMode.momentumVelocityRatio,o.velocities.length=0;let t=1e3*i.freeMode.momentumRatio;const d=e.velocity*t;let c=e.translate+d;n&&(c=-c);let p,u=!1;const h=20*Math.abs(e.velocity)*i.freeMode.momentumBounceRatio;let m;if(ce.minTranslate())i.freeMode.momentumBounce?(c-e.minTranslate()>h&&(c=e.minTranslate()+h),p=e.minTranslate(),u=!0,o.allowMomentumBounce=!0):c=e.minTranslate(),i.loop&&i.centeredSlides&&(m=!0);else if(i.freeMode.sticky){let t;for(let e=0;e-c){t=e;break}c=Math.abs(l[t]-c){e.loopFix()})),0!==e.velocity){if(t=n?Math.abs((-c-e.translate)/e.velocity):Math.abs((c-e.translate)/e.velocity),i.freeMode.sticky){const s=Math.abs((n?-c:c)-e.translate),a=e.slidesSizesGrid[e.activeIndex];t=s{e&&!e.destroyed&&o.allowMomentumBounce&&(s("momentumBounce"),e.setTransition(i.speed),setTimeout((()=>{e.setTranslate(p),r.transitionEnd((()=>{e&&!e.destroyed&&e.transitionEnd()}))}),0))}))):e.velocity?(s("_freeModeNoMomentumRelease"),e.updateProgress(c),e.setTransition(t),e.setTranslate(c),e.transitionStart(!0,e.swipeDirection),e.animating||(e.animating=!0,r.transitionEnd((()=>{e&&!e.destroyed&&e.transitionEnd()})))):e.updateProgress(c),e.updateActiveIndex(),e.updateSlidesClasses()}else{if(i.freeMode.sticky)return void e.slideToClosest();i.freeMode&&s("_freeModeNoMomentumRelease")}(!i.freeMode.momentum||d>=i.longSwipesMs)&&(e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses())}}}})}function Grid({swiper:e,extendParams:t}){let s,a,i;t({grid:{rows:1,fill:"column"}});e.grid={initSlides:t=>{const{slidesPerView:r}=e.params,{rows:n,fill:l}=e.params.grid;a=s/n,i=Math.floor(t/n),s=Math.floor(t/n)===t/n?t:Math.ceil(t/n)*n,"auto"!==r&&"row"===l&&(s=Math.max(s,r*n))},updateSlide:(t,r,n,l)=>{const{slidesPerGroup:o,spaceBetween:d}=e.params,{rows:c,fill:p}=e.params.grid;let u,h,m;if("row"===p&&o>1){const e=Math.floor(t/(o*c)),a=t-c*o*e,i=0===e?o:Math.min(Math.ceil((n-e*c*o)/c),o);m=Math.floor(a/i),h=a-m*i+e*o,u=h+m*s/c,r.css({"-webkit-order":u,order:u})}else"column"===p?(h=Math.floor(t/c),m=t-h*c,(h>i||h===i&&m===c-1)&&(m+=1,m>=c&&(m=0,h+=1))):(m=Math.floor(t/a),h=t-m*a);r.css(l("margin-top"),0!==m?d&&`${d}px`:"")},updateWrapperSize:(t,a,i)=>{const{spaceBetween:r,centeredSlides:n,roundLengths:l}=e.params,{rows:o}=e.params.grid;if(e.virtualSize=(t+r)*s,e.virtualSize=Math.ceil(e.virtualSize/o)-r,e.$wrapperEl.css({[i("width")]:`${e.virtualSize+r}px`}),n){a.splice(0,a.length);const t=[];for(let s=0;s=l)return void s.appendSlide(t);let o=n>e?n+1:n;const d=[];for(let t=l-1;t>=e;t-=1){const e=s.slides.eq(t);e.remove(),d.unshift(e)}if("object"==typeof t&&"length"in t){for(let e=0;ee?n+t.length:n}else a.append(t);for(let e=0;e{if(s.params.effect!==t)return;s.classNames.push(`${s.params.containerModifierClass}${t}`),l&&l()&&s.classNames.push(`${s.params.containerModifierClass}3d`);const e=n?n():{};Object.assign(s.params,e),Object.assign(s.originalParams,e)})),a("setTranslate",(()=>{s.params.effect===t&&i()})),a("setTransition",((e,a)=>{s.params.effect===t&&r(a)}))}function effectTarget(e,t){return e.transformEl?t.find(e.transformEl).css({"backface-visibility":"hidden","-webkit-backface-visibility":"hidden"}):t}function effectVirtualTransitionEnd({swiper:e,duration:t,transformEl:s,allSlides:a}){const{slides:i,activeIndex:r,$wrapperEl:n}=e;if(e.params.virtualTranslate&&0!==t){let t,l=!1;t=a?s?i.find(s):i:s?i.eq(r).find(s):i.eq(r),t.transitionEnd((()=>{if(l)return;if(!e||e.destroyed)return;l=!0,e.animating=!1;const t=["webkitTransitionEnd","transitionend"];for(let e=0;e{const{slides:t}=e,s=e.params.fadeEffect;for(let a=0;a{const{transformEl:s}=e.params.fadeEffect;(s?e.slides.find(s):e.slides).transition(t),effectVirtualTransitionEnd({swiper:e,duration:t,transformEl:s,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})}function EffectCube({swiper:e,extendParams:t,on:s}){t({cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}});effectInit({effect:"cube",swiper:e,on:s,setTranslate:()=>{const{$el:t,$wrapperEl:s,slides:a,width:i,height:r,rtlTranslate:n,size:l,browser:o}=e,d=e.params.cubeEffect,c=e.isHorizontal(),p=e.virtual&&e.params.virtual.enabled;let u,h=0;d.shadow&&(c?(u=s.find(".swiper-cube-shadow"),0===u.length&&(u=$('
'),s.append(u)),u.css({height:`${i}px`})):(u=t.find(".swiper-cube-shadow"),0===u.length&&(u=$('
'),t.append(u))));for(let e=0;e-1&&(h=90*s+90*o,n&&(h=90*-s-90*o)),t.transform(g),d.slideShadows){let e=c?t.find(".swiper-slide-shadow-left"):t.find(".swiper-slide-shadow-top"),s=c?t.find(".swiper-slide-shadow-right"):t.find(".swiper-slide-shadow-bottom");0===e.length&&(e=$(`
`),t.append(e)),0===s.length&&(s=$(`
`),t.append(s)),e.length&&(e[0].style.opacity=Math.max(-o,0)),s.length&&(s[0].style.opacity=Math.max(o,0))}}if(s.css({"-webkit-transform-origin":`50% 50% -${l/2}px`,"transform-origin":`50% 50% -${l/2}px`}),d.shadow)if(c)u.transform(`translate3d(0px, ${i/2+d.shadowOffset}px, ${-i/2}px) rotateX(90deg) rotateZ(0deg) scale(${d.shadowScale})`);else{const e=Math.abs(h)-90*Math.floor(Math.abs(h)/90),t=1.5-(Math.sin(2*e*Math.PI/360)/2+Math.cos(2*e*Math.PI/360)/2),s=d.shadowScale,a=d.shadowScale/t,i=d.shadowOffset;u.transform(`scale3d(${s}, 1, ${a}) translate3d(0px, ${r/2+i}px, ${-r/2/a}px) rotateX(-90deg)`)}const m=o.isSafari||o.isWebView?-l/2:0;s.transform(`translate3d(0px,0,${m}px) rotateX(${e.isHorizontal()?0:h}deg) rotateY(${e.isHorizontal()?-h:0}deg)`)},setTransition:t=>{const{$el:s,slides:a}=e;a.transition(t).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(t),e.params.cubeEffect.shadow&&!e.isHorizontal()&&s.find(".swiper-cube-shadow").transition(t)},perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0})})}function createShadow(e,t,s){const a="swiper-slide-shadow"+(s?`-${s}`:""),i=e.transformEl?t.find(e.transformEl):t;let r=i.children(`.${a}`);return r.length||(r=$(`
`),i.append(r)),r}function EffectFlip({swiper:e,extendParams:t,on:s}){t({flipEffect:{slideShadows:!0,limitRotation:!0,transformEl:null}});effectInit({effect:"flip",swiper:e,on:s,setTranslate:()=>{const{slides:t,rtlTranslate:s}=e,a=e.params.flipEffect;for(let i=0;i{const{transformEl:s}=e.params.flipEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(t),effectVirtualTransitionEnd({swiper:e,duration:t,transformEl:s})},perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})}function EffectCoverflow({swiper:e,extendParams:t,on:s}){t({coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0,transformEl:null}});effectInit({effect:"coverflow",swiper:e,on:s,setTranslate:()=>{const{width:t,height:s,slides:a,slidesSizesGrid:i}=e,r=e.params.coverflowEffect,n=e.isHorizontal(),l=e.translate,o=n?t/2-l:s/2-l,d=n?r.rotate:-r.rotate,c=r.depth;for(let e=0,t=a.length;e0?l:0),s.length&&(s[0].style.opacity=-l>0?-l:0)}}},setTransition:t=>{const{transformEl:s}=e.params.coverflowEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(t)},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0})})}function EffectCreative({swiper:e,extendParams:t,on:s}){t({creativeEffect:{transformEl:null,limitProgress:1,shadowPerProgress:!1,progressMultiplier:1,perspective:!0,prev:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1},next:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1}}});const a=e=>"string"==typeof e?e:`${e}px`;effectInit({effect:"creative",swiper:e,on:s,setTranslate:()=>{const{slides:t,$wrapperEl:s,slidesSizesGrid:i}=e,r=e.params.creativeEffect,{progressMultiplier:n}=r,l=e.params.centeredSlides;if(l){const t=i[0]/2-e.params.slidesOffsetBefore||0;s.transform(`translateX(calc(50% - ${t}px))`)}for(let s=0;s0&&(f=r.prev,m=!0),u.forEach(((e,t)=>{u[t]=`calc(${e}px + (${a(f.translate[t])} * ${Math.abs(d*n)}))`})),h.forEach(((e,t)=>{h[t]=f.rotate[t]*Math.abs(d*n)})),i[0].style.zIndex=-Math.abs(Math.round(o))+t.length;const g=u.join(", "),v=`rotateX(${h[0]}deg) rotateY(${h[1]}deg) rotateZ(${h[2]}deg)`,w=c<0?`scale(${1+(1-f.scale)*c*n})`:`scale(${1-(1-f.scale)*c*n})`,b=c<0?1+(1-f.opacity)*c*n:1-(1-f.opacity)*c*n,x=`translate3d(${g}) ${v} ${w}`;if(m&&f.shadow||!m){let e=i.children(".swiper-slide-shadow");if(0===e.length&&f.shadow&&(e=createShadow(r,i)),e.length){const t=r.shadowPerProgress?d*(1/r.limitProgress):d;e[0].style.opacity=Math.min(Math.max(Math.abs(t),0),1)}}const y=effectTarget(r,i);y.transform(x).css({opacity:b}),f.origin&&y.css("transform-origin",f.origin)}},setTransition:t=>{const{transformEl:s}=e.params.creativeEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow").transition(t),effectVirtualTransitionEnd({swiper:e,duration:t,transformEl:s,allSlides:!0})},perspective:()=>e.params.creativeEffect.perspective,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!e.params.cssMode})})}function EffectCards({swiper:e,extendParams:t,on:s}){t({cardsEffect:{slideShadows:!0,transformEl:null}});effectInit({effect:"cards",swiper:e,on:s,setTranslate:()=>{const{slides:t,activeIndex:s}=e,a=e.params.cardsEffect,{startTranslate:i,isTouched:r}=e.touchEventsData,n=e.translate;for(let l=0;l0&&c<1&&(r||e.params.cssMode)&&n-1&&(r||e.params.cssMode)&&n>i;if(w||b){const e=(1-Math.abs((Math.abs(c)-.5)/.5))**.5;g+=-28*c*e,f+=-.5*e,v+=96*e,h=-25*e*Math.abs(c)+"%"}if(u=c<0?`calc(${u}px + (${v*Math.abs(c)}%))`:c>0?`calc(${u}px + (-${v*Math.abs(c)}%))`:`${u}px`,!e.isHorizontal()){const e=h;h=u,u=e}const x=`\n translate3d(${u}, ${h}, ${m}px)\n rotateZ(${g}deg)\n scale(${c<0?""+(1+(1-f)*c):""+(1-(1-f)*c)})\n `;if(a.slideShadows){let e=o.find(".swiper-slide-shadow");0===e.length&&(e=createShadow(a,o)),e.length&&(e[0].style.opacity=Math.min(Math.max((Math.abs(c)-.5)/.5,0),1))}o[0].style.zIndex=-Math.abs(Math.round(d))+t.length;effectTarget(a,o).transform(x)}},setTransition:t=>{const{transformEl:s}=e.params.cardsEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow").transition(t),effectVirtualTransitionEnd({swiper:e,duration:t,transformEl:s})},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!e.params.cssMode})})}Object.keys(prototypes).forEach((e=>{Object.keys(prototypes[e]).forEach((t=>{Swiper.prototype[t]=prototypes[e][t]}))})),Swiper.use([Resize,Observer]);const modules=[Virtual,Keyboard,Mousewheel,Navigation,Pagination,Scrollbar,Parallax,Zoom,Lazy,Controller,A11y,History,HashNavigation,Autoplay,Thumb,freeMode,Grid,Manipulation,EffectFade,EffectCube,EffectFlip,EffectCoverflow,EffectCreative,EffectCards];Swiper.use(modules);export{Swiper,Swiper as default}; +//# sourceMappingURL=swiper-bundle.esm.browser.min.js.map \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.min.js.map b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.min.js.map new file mode 100644 index 0000000..1e2ec71 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.browser.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../node_modules/ssr-window/ssr-window.esm.js","../node_modules/dom7/dom7.esm.js","../src/shared/dom.js","../src/shared/utils.js","../src/shared/get-support.js","../src/shared/get-device.js","../src/shared/get-browser.js","../src/core/modules/resize/resize.js","../src/core/modules/observer/observer.js","../src/core/events-emitter.js","../src/core/update/updateSize.js","../src/core/update/updateSlides.js","../src/core/update/updateAutoHeight.js","../src/core/update/updateSlidesOffset.js","../src/core/update/updateSlidesProgress.js","../src/core/update/updateProgress.js","../src/core/update/updateSlidesClasses.js","../src/core/update/updateActiveIndex.js","../src/core/update/updateClickedSlide.js","../src/core/update/index.js","../src/core/translate/getTranslate.js","../src/core/translate/setTranslate.js","../src/core/translate/minTranslate.js","../src/core/translate/maxTranslate.js","../src/core/translate/translateTo.js","../src/core/translate/index.js","../src/core/transition/setTransition.js","../src/core/transition/transitionEmit.js","../src/core/transition/transitionStart.js","../src/core/transition/transitionEnd.js","../src/core/transition/index.js","../src/core/slide/slideTo.js","../src/core/slide/slideToLoop.js","../src/core/slide/slideNext.js","../src/core/slide/slidePrev.js","../src/core/slide/slideReset.js","../src/core/slide/slideToClosest.js","../src/core/slide/slideToClickedSlide.js","../src/core/slide/index.js","../src/core/loop/loopCreate.js","../src/core/loop/loopFix.js","../src/core/loop/loopDestroy.js","../src/core/loop/index.js","../src/core/grab-cursor/setGrabCursor.js","../src/core/grab-cursor/unsetGrabCursor.js","../src/core/grab-cursor/index.js","../src/core/events/onTouchStart.js","../src/core/events/onTouchMove.js","../src/core/events/onTouchEnd.js","../src/core/events/onResize.js","../src/core/events/onClick.js","../src/core/events/onScroll.js","../src/core/events/index.js","../src/core/breakpoints/setBreakpoint.js","../src/core/breakpoints/getBreakpoint.js","../src/core/breakpoints/index.js","../src/core/classes/addClasses.js","../src/core/classes/removeClasses.js","../src/core/classes/index.js","../src/core/images/loadImage.js","../src/core/images/preloadImages.js","../src/core/images/index.js","../src/core/check-overflow/index.js","../src/core/defaults.js","../src/core/moduleExtendParams.js","../src/core/core.js","../src/modules/virtual/virtual.js","../src/modules/keyboard/keyboard.js","../src/modules/mousewheel/mousewheel.js","../src/shared/create-element-if-not-defined.js","../src/modules/navigation/navigation.js","../src/shared/classes-to-selector.js","../src/modules/pagination/pagination.js","../src/modules/scrollbar/scrollbar.js","../src/modules/parallax/parallax.js","../src/modules/zoom/zoom.js","../src/modules/lazy/lazy.js","../src/modules/controller/controller.js","../src/modules/a11y/a11y.js","../src/modules/history/history.js","../src/modules/hash-navigation/hash-navigation.js","../src/modules/autoplay/autoplay.js","../src/modules/thumbs/thumbs.js","../src/modules/free-mode/free-mode.js","../src/modules/grid/grid.js","../src/modules/manipulation/methods/appendSlide.js","../src/modules/manipulation/methods/prependSlide.js","../src/modules/manipulation/methods/addSlide.js","../src/modules/manipulation/methods/removeSlide.js","../src/modules/manipulation/methods/removeAllSlides.js","../src/modules/manipulation/manipulation.js","../src/shared/effect-init.js","../src/shared/effect-target.js","../src/shared/effect-virtual-transition-end.js","../src/modules/effect-fade/effect-fade.js","../src/modules/effect-cube/effect-cube.js","../src/shared/create-shadow.js","../src/modules/effect-flip/effect-flip.js","../src/modules/effect-coverflow/effect-coverflow.js","../src/modules/effect-creative/effect-creative.js","../src/modules/effect-cards/effect-cards.js","../src/swiper.js"],"names":["isObject","obj","constructor","Object","extend","target","src","keys","forEach","key","length","ssrDocument","body","addEventListener","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","createElement","children","childNodes","style","setAttribute","getElementsByTagName","createElementNS","importNode","location","hash","host","hostname","href","origin","pathname","protocol","search","getDocument","doc","document","ssrWindow","navigator","userAgent","history","replaceState","pushState","go","back","CustomEvent","this","getComputedStyle","getPropertyValue","Image","Date","screen","setTimeout","clearTimeout","matchMedia","requestAnimationFrame","callback","cancelAnimationFrame","id","getWindow","win","window","makeReactive","proto","__proto__","defineProperty","get","set","value","Dom7","Array","items","super","arrayFlat","arr","res","el","isArray","push","arrayFilter","prototype","filter","call","arrayUnique","uniqueArray","i","indexOf","qsa","selector","context","a","$","html","trim","toCreate","tempParent","innerHTML","nodeType","addClass","classes","classNames","map","c","split","classList","add","removeClass","remove","toggleClass","className","toggle","hasClass","contains","attr","attrs","arguments","getAttribute","attrName","removeAttr","removeAttribute","transform","transition","duration","transitionDuration","on","args","eventType","targetSelector","listener","capture","handleLiveEvent","e","eventData","dom7EventData","unshift","is","apply","parents","k","handleEvent","undefined","events","j","event","dom7LiveListeners","proxyListener","dom7Listeners","off","handlers","handler","dom7proxy","splice","trigger","evt","detail","bubbles","cancelable","data","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","offsetWidth","parseFloat","outerHeight","offsetHeight","offset","box","getBoundingClientRect","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","top","left","css","props","prop","each","index","text","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","append","els","newChild","tempDiv","firstChild","appendChild","prepend","insertBefore","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parent","parentNode","closest","find","foundElements","found","removeChild","fn","Methods","deleteProps","object","nextTick","delay","now","currentStyle","getTranslate","axis","matrix","curTransform","transformMatrix","curStyle","WebKitCSSMatrix","webkitTransform","replace","join","MozTransform","OTransform","MsTransform","msTransform","toString","m41","m42","o","slice","isNode","node","HTMLElement","to","noExtend","nextSource","keysArray","nextIndex","len","nextKey","desc","getOwnPropertyDescriptor","enumerable","__swiper__","setCSSProperty","varName","varValue","setProperty","animateCSSModeScroll","swiper","targetPosition","side","startPosition","translate","time","startTime","params","speed","wrapperEl","scrollSnapType","cssModeFrameID","dir","isOutOfBound","current","animate","getTime","progress","Math","max","min","easeProgress","cos","PI","currentPosition","scrollTo","overflow","support","deviceCached","browser","calcSupport","smoothScroll","documentElement","touch","DocumentTouch","passiveListener","supportsPassive","opts","gestures","getSupport","calcDevice","platform","ua","device","ios","android","screenWidth","width","screenHeight","height","match","ipad","ipod","iphone","windows","macos","os","getDevice","overrides","calcBrowser","isSafari","toLowerCase","isWebView","test","getBrowser","Resize","emit","observer","resizeHandler","destroyed","initialized","orientationChangeHandler","resizeObserver","ResizeObserver","entries","newWidth","newHeight","contentBoxSize","contentRect","inlineSize","blockSize","observe","unobserve","Observer","extendParams","observers","attach","options","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","attributes","childList","characterData","observeParents","observeSlideChildren","containerParents","$el","$wrapperEl","disconnect","methodName","writable","eventsEmitter","priority","self","method","eventsListeners","once","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","eventHandler","updateSize","clientWidth","clientHeight","isHorizontal","isVertical","parseInt","Number","isNaN","assign","size","updateSlides","getDirectionLabel","property","marginRight","getDirectionPropertyValue","label","swiperSize","rtlTranslate","rtl","wrongRTL","isVirtual","virtual","enabled","previousSlidesLength","slides","slideClass","slidesLength","snapGrid","slidesGrid","slidesSizesGrid","offsetBefore","slidesOffsetBefore","offsetAfter","slidesOffsetAfter","previousSnapGridLength","previousSlidesGridLength","spaceBetween","slidePosition","prevSlideSize","virtualSize","marginLeft","marginBottom","marginTop","centeredSlides","cssMode","gridEnabled","grid","rows","slideSize","initSlides","shouldResetSlideSize","slidesPerView","breakpoints","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","roundLengths","paddingLeft","paddingRight","boxSizing","floor","swiperSlideSize","abs","slidesPerGroup","slidesPerGroupSkip","effect","setWrapperSize","updateWrapperSize","newSlidesGrid","slidesGridItem","_","slideIndex","centeredSlidesBounds","allSlidesSize","slideSizeValue","maxSnap","snap","centerInsufficientSlides","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","v","watchOverflow","checkOverflow","watchSlidesProgress","updateSlidesOffset","updateAutoHeight","activeSlides","setTransition","getSlideByIndex","visibleSlides","ceil","activeIndex","swiperSlideOffset","offsetLeft","offsetTop","updateSlidesProgress","offsetCenter","slideVisibleClass","visibleSlidesIndexes","slideOffset","slideProgress","minTranslate","originalSlideProgress","slideBefore","slideAfter","originalProgress","updateProgress","multiplier","translatesDiff","maxTranslate","isBeginning","isEnd","wasBeginning","wasEnd","autoHeight","updateSlidesClasses","realIndex","activeSlide","slideActiveClass","slideNextClass","slidePrevClass","slideDuplicateActiveClass","slideDuplicateNextClass","slideDuplicatePrevClass","loop","slideDuplicateClass","nextSlide","prevSlide","emitSlidesClasses","updateActiveIndex","newActiveIndex","previousIndex","previousRealIndex","previousSnapIndex","normalizeSlideIndex","skip","runCallbacksOnInit","updateClickedSlide","slideFound","clickedSlide","clickedIndex","slideToClickedSlide","update","getSwiperTranslate","virtualTranslate","currentTranslate","setTranslate","byController","x","y","newProgress","previousTranslate","translateTo","runCallbacks","translateBounds","internal","animating","preventInteractionOnTransition","newTranslate","isH","behavior","onTranslateToWrapperTransitionEnd","transitionEmit","direction","step","transitionStart","slideTo","initial","Error","indexAsNumber","isFinite","initialSlide","normalizedTranslate","normalizedGrid","normalizedGridNext","allowSlideNext","allowSlidePrev","t","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","loopedSlides","slideNext","perGroup","slidesPerGroupAuto","slidesPerViewDynamic","increment","loopPreventsSlide","loopFix","_clientLeft","slidePrev","normalize","val","normalizedSnapGrid","prevSnap","prevSnapIndex","prevIndex","slideReset","slideToClosest","threshold","currentSnap","slideToIndex","loopCreate","$selector","loopFillGroupWithBlank","blankSlidesNum","blankNode","slideBlankClass","loopAdditionalSlides","prependSlides","appendSlides","cloneNode","diff","loopDestroy","setGrabCursor","moving","simulateTouch","isLocked","touchEventsTarget","cursor","unsetGrabCursor","grabCursor","closestElement","base","__closestFrom","assignedSlot","getRootNode","onTouchStart","touchEventsData","touches","originalEvent","$targetEl","isTouchEvent","type","which","button","isTouched","isMoved","noSwipingClass","shadowRoot","path","noSwipingSelector","isTargetShadow","noSwiping","allowClick","swipeHandler","currentX","targetTouches","pageX","currentY","pageY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","innerWidth","preventDefault","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","swipeDirection","allowThresholdMove","focusableElements","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","isContentEditable","onTouchMove","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","diffX","diffY","sqrt","touchAngle","atan2","touchMoveStopPropagation","nested","stopPropagation","startTranslate","allowMomentumBounce","touchRatio","disableParentSwiper","resistanceRatio","resistance","followFinger","freeMode","onTouchEnd","touchEndTime","timeDiff","lastClickTime","currentPos","stopIndex","groupSize","ratio","longSwipesMs","longSwipes","longSwipesRatio","shortSwipes","navigation","nextEl","prevEl","onResize","setBreakpoint","autoplay","running","paused","run","onClick","preventClicks","preventClicksPropagation","stopImmediatePropagation","onScroll","dummyEventAttached","dummyEventListener","touchEvents","domMethod","swiperMethod","start","passiveListeners","passive","move","end","cancel","updateOnWindowResize","attachEvents","bind","detachEvents","events$1","isGridEnabled","breakpoint","getBreakpoint","breakpointsBase","currentBreakpoint","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","containerModifierClass","emitContainerClasses","fill","directionChanged","needsReLoop","changeDirection","isEnabled","disable","enable","containerEl","currentHeight","innerHeight","points","point","minRatio","substr","sort","b","prepareClasses","prefix","resultClasses","item","addClasses","suffixes","autoheight","centered","removeClasses","loadImage","imageEl","srcset","sizes","checkForComplete","image","onReady","complete","onload","onerror","preloadImages","imagesLoaded","imagesToLoad","updateOnImagesReady","currentSrc","images","wasLocked","lastSlideIndex","lastSlideRightEdge","checkOverflow$1","defaults","init","createElements","url","uniqueNavElements","wrapperClass","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","extendedDefaults","Swiper","swipers","newParams","modules","__modules__","mod","swiperParams","passedParams","eventName","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","setProgress","cls","getSlideClasses","slideEl","updates","view","exact","spv","breakLoop","translateValue","translated","newDirection","needUpdate","currentDirection","mount","mounted","getWrapperSelector","getWrapper","wrapper","destroy","deleteInstance","cleanStyles","extendDefaults","newDefaults","installModule","use","module","m","Virtual","cssModeTimeout","renderSlide","cache","$slideEl","force","addSlidesBefore","addSlidesAfter","from","previousFrom","previousTo","previousSlidesGrid","previousOffset","offsetProp","slidesAfter","slidesBefore","onRendered","lazy","load","renderExternal","slidesToRender","renderExternalUpdate","prependIndexes","appendIndexes","appendSlide","prependSlide","numberOfNewSlides","newCache","cachedIndex","$cachedEl","cachedElIndex","removeSlide","slidesIndexes","removeAllSlides","Keyboard","handle","kc","keyCode","charCode","pageUpDown","keyboard","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","shiftKey","altKey","ctrlKey","metaKey","onlyInViewport","inView","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","swiperCoord","returnValue","Mousewheel","timeout","mousewheel","releaseOnEdges","invert","forceToAxis","sensitivity","eventsTarget","thresholdDelta","thresholdTime","lastEventBeforeSnap","lastScrollTime","recentWheelEvents","handleMouseEnter","mouseEntered","handleMouseLeave","animateSlider","newEvent","delta","raw","rtlFactor","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","spinY","pixelX","pixelY","positions","sign","ignoreWheelEvents","position","sticky","shift","prevEvent","firstEvent","snapToThreshold","autoplayDisableOnInteraction","stop","releaseScroll","createElementIfNotDefined","checkProps","element","Navigation","getEl","toggleEl","disabled","disabledClass","tagName","lockClass","$nextEl","$prevEl","onPrevClick","onNextClick","hideOnClick","hiddenClass","_s","targetEl","pagination","clickable","isHidden","classesToSelector","Pagination","pfx","bulletSize","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","number","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","bullets","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","total","paginationType","firstIndex","lastIndex","midIndex","suffix","bullet","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","progressbarDirection","scale","scaleX","scaleY","render","paginationHTML","numberOfBullets","Scrollbar","dragStartPos","dragSize","trackSize","divider","dragTimeout","scrollbar","$dragEl","newSize","newPos","hide","opacity","display","getPointerPosition","clientX","clientY","setDragPosition","positionRatio","onDragStart","onDragMove","onDragEnd","snapOnRelease","activeListener","eventMethod","$swiperEl","dragClass","dragEl","draggable","Parallax","parallax","setTransform","p","currentOpacity","currentScale","_swiper","parallaxEl","$parallaxEl","parallaxDuration","Zoom","zoom","maxRatio","containerClass","zoomedSlideClass","gesturesEnabled","fakeGestureTouched","fakeGestureMoved","isScaling","gesture","slideWidth","slideHeight","$imageEl","$imageWrapEl","minX","minY","maxX","maxY","touchesStart","touchesCurrent","prevPositionX","prevPositionY","prevTime","getDistanceBetweenTouches","x1","y1","x2","y2","onGestureStart","scaleStart","onGestureChange","scaleMove","onGestureEnd","scaledWidth","scaledHeight","onTransitionEnd","zoomIn","touchX","touchY","offsetX","offsetY","translateX","translateY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","touchAction","zoomOut","zoomToggle","getListeners","activeListenerWithCapture","getSlideSelector","toggleGestures","slideSelector","enableGestures","disableGestures","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","momentumDuration","in","out","Lazy","checkInView","loadPrevNext","loadPrevNextAmount","loadOnTransitionStart","scrollingElement","elementClass","loadingClass","loadedClass","preloaderClass","scrollHandlerAttached","initialImageLoaded","loadInSlide","loadInDuplicate","$images","background","$pictureEl","sourceEl","$source","slideOriginalIndex","slideExist","amount","maxIndex","minIndex","checkInViewOnLoad","$scrollElement","isWindow","scrollElementWidth","scrollElementHeight","Controller","LinearSpline","binarySearch","guess","array","i1","i3","interpolate","removeSpline","controller","control","spline","inverse","by","_t","controlled","controlledTranslate","setControlledTranslate","getInterpolateFunction","setControlledTransition","A11y","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","liveRegion","notify","message","notification","makeElFocusable","makeElNotFocusable","addElRole","role","addElRoleDescription","description","addElLabel","disableEl","enableEl","onEnterOrSpaceKey","click","updateNavigation","hasPagination","initNavEl","wrapperId","controls","addElControls","$containerEl","repeat","round","random","getRandomNumber","live","addElLive","bulletEl","updatePagination","History","root","paths","slugify","getPathValues","urlOverride","URL","pathArray","part","setHistory","includes","currentState","state","scrollToSlide","setHistoryPopState","hashNavigation","HashNavigation","watchState","onHashChange","newHash","setHash","Autoplay","$activeSlideEl","autoplayResult","reverseDirection","stopOnLastSlide","pause","waitForTransition","onVisibilityChange","visibilityState","onMouseEnter","disableOnInteraction","onMouseLeave","pauseOnMouseEnter","Thumb","thumbs","multipleActiveThumbs","autoScrollOffset","slideThumbActiveClass","thumbsContainerClass","swiperCreated","onThumbClick","thumbsSwiper","currentIndex","thumbsParams","SwiperClass","thumbsSwiperParams","useOffset","newThumbsIndex","currentThumbsIndex","prevThumbsIndex","nextThumbsIndex","thumbsToActivate","thumbActiveClass","momentum","momentumRatio","momentumBounce","momentumBounceRatio","momentumVelocityRatio","minimumVelocity","lastMoveEvent","pop","velocityEvent","distance","momentumDistance","newPosition","afterBouncePosition","doBounce","bounceAmount","needsLoopFix","moveDistance","currentSlideSize","Grid","slidesNumberEvenToRows","slidesPerRow","numFullColumns","newSlideOrderIndex","column","row","groupIndex","slideIndexInGroup","columnsInGroup","order","addSlide","activeIndexBuffer","baseLength","slidesBuffer","currentSlide","indexToRemove","Manipulation","effectInit","overwriteParams","perspective","overwriteParamsResult","effectTarget","effectParams","transformEl","effectVirtualTransitionEnd","allSlides","$transitionEndTarget","eventTriggered","triggerEvents","EffectFade","fadeEffect","crossFade","tx","ty","slideOpacity","EffectCube","cubeEffect","slideShadows","shadow","shadowOffset","shadowScale","$cubeShadowEl","wrapperRotate","slideAngle","tz","shadowBefore","shadowAfter","shadowAngle","sin","scale1","scale2","zFactor","createShadow","shadowClass","$shadowContainer","$shadowEl","EffectFlip","flipEffect","limitRotation","rotateY","rotateX","zIndex","EffectCoverflow","coverflowEffect","rotate","stretch","depth","modifier","center","offsetMultiplier","translateZ","slideTransform","$shadowBeforeEl","$shadowAfterEl","EffectCreative","creativeEffect","limitProgress","shadowPerProgress","progressMultiplier","getTranslateValue","isCenteredSlides","margin","r","custom","translateString","rotateString","scaleString","opacityString","shadowOpacity","EffectCards","cardsEffect","tX","tY","tZ","tXAdd","isSwipeToNext","isSwipeToPrev","subProgress","prevY","prototypeGroup","protoMethod"],"mappings":"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","file":"swiper-bundle.esm.browser.min.js","sourcesContent":["/**\n * SSR Window 4.0.1\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n return (obj !== null &&\n typeof obj === 'object' &&\n 'constructor' in obj &&\n obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n Object.keys(src).forEach((key) => {\n if (typeof target[key] === 'undefined')\n target[key] = src[key];\n else if (isObject(src[key]) &&\n isObject(target[key]) &&\n Object.keys(src[key]).length > 0) {\n extend(target[key], src[key]);\n }\n });\n}\n\nconst ssrDocument = {\n body: {},\n addEventListener() { },\n removeEventListener() { },\n activeElement: {\n blur() { },\n nodeName: '',\n },\n querySelector() {\n return null;\n },\n querySelectorAll() {\n return [];\n },\n getElementById() {\n return null;\n },\n createEvent() {\n return {\n initEvent() { },\n };\n },\n createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute() { },\n getElementsByTagName() {\n return [];\n },\n };\n },\n createElementNS() {\n return {};\n },\n importNode() {\n return null;\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n};\nfunction getDocument() {\n const doc = typeof document !== 'undefined' ? document : {};\n extend(doc, ssrDocument);\n return doc;\n}\n\nconst ssrWindow = {\n document: ssrDocument,\n navigator: {\n userAgent: '',\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n history: {\n replaceState() { },\n pushState() { },\n go() { },\n back() { },\n },\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener() { },\n removeEventListener() { },\n getComputedStyle() {\n return {\n getPropertyValue() {\n return '';\n },\n };\n },\n Image() { },\n Date() { },\n screen: {},\n setTimeout() { },\n clearTimeout() { },\n matchMedia() {\n return {};\n },\n requestAnimationFrame(callback) {\n if (typeof setTimeout === 'undefined') {\n callback();\n return null;\n }\n return setTimeout(callback, 0);\n },\n cancelAnimationFrame(id) {\n if (typeof setTimeout === 'undefined') {\n return;\n }\n clearTimeout(id);\n },\n};\nfunction getWindow() {\n const win = typeof window !== 'undefined' ? window : {};\n extend(win, ssrWindow);\n return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.1\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n const proto = obj.__proto__;\n Object.defineProperty(obj, '__proto__', {\n get() {\n return proto;\n },\n\n set(value) {\n proto.__proto__ = value;\n }\n\n });\n}\n\nclass Dom7 extends Array {\n constructor(items) {\n super(...(items || []));\n makeReactive(this);\n }\n\n}\n\nfunction arrayFlat(arr = []) {\n const res = [];\n arr.forEach(el => {\n if (Array.isArray(el)) {\n res.push(...arrayFlat(el));\n } else {\n res.push(el);\n }\n });\n return res;\n}\nfunction arrayFilter(arr, callback) {\n return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n const uniqueArray = [];\n\n for (let i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n }\n\n return uniqueArray;\n}\nfunction toCamelCase(string) {\n return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n if (typeof selector !== 'string') {\n return [selector];\n }\n\n const a = [];\n const res = context.querySelectorAll(selector);\n\n for (let i = 0; i < res.length; i += 1) {\n a.push(res[i]);\n }\n\n return a;\n}\n\nfunction $(selector, context) {\n const window = getWindow();\n const document = getDocument();\n let arr = [];\n\n if (!context && selector instanceof Dom7) {\n return selector;\n }\n\n if (!selector) {\n return new Dom7(arr);\n }\n\n if (typeof selector === 'string') {\n const html = selector.trim();\n\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n let toCreate = 'div';\n if (html.indexOf(' c.split(' ')));\n this.forEach(el => {\n el.classList.add(...classNames);\n });\n return this;\n}\n\nfunction removeClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n el.classList.remove(...classNames);\n });\n return this;\n}\n\nfunction toggleClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n classNames.forEach(className => {\n el.classList.toggle(className);\n });\n });\n}\n\nfunction hasClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n return arrayFilter(this, el => {\n return classNames.filter(className => el.classList.contains(className)).length > 0;\n }).length > 0;\n}\n\nfunction attr(attrs, value) {\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) return this[0].getAttribute(attrs);\n return undefined;\n } // Set attrs\n\n\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n for (const attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n\n return this;\n}\n\nfunction removeAttr(attr) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n\n return this;\n}\n\nfunction prop(props, value) {\n if (arguments.length === 1 && typeof props === 'string') {\n // Get prop\n if (this[0]) return this[0][props];\n } else {\n // Set props\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i][props] = value;\n } else {\n // Object\n for (const propName in props) {\n this[i][propName] = props[propName];\n }\n }\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction data(key, value) {\n let el;\n\n if (typeof value === 'undefined') {\n el = this[0];\n if (!el) return undefined; // Get value\n\n if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n return el.dom7ElementDataStorage[key];\n }\n\n const dataKey = el.getAttribute(`data-${key}`);\n\n if (dataKey) {\n return dataKey;\n }\n\n return undefined;\n } // Set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n el.dom7ElementDataStorage[key] = value;\n }\n\n return this;\n}\n\nfunction removeData(key) {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n el.dom7ElementDataStorage[key] = null;\n delete el.dom7ElementDataStorage[key];\n }\n }\n}\n\nfunction dataset() {\n const el = this[0];\n if (!el) return undefined;\n const dataset = {}; // eslint-disable-line\n\n if (el.dataset) {\n for (const dataKey in el.dataset) {\n dataset[dataKey] = el.dataset[dataKey];\n }\n } else {\n for (let i = 0; i < el.attributes.length; i += 1) {\n const attr = el.attributes[i];\n\n if (attr.name.indexOf('data-') >= 0) {\n dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n }\n }\n }\n\n for (const key in dataset) {\n if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n }\n\n return dataset;\n}\n\nfunction val(value) {\n if (typeof value === 'undefined') {\n // get value\n const el = this[0];\n if (!el) return undefined;\n\n if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n const values = [];\n\n for (let i = 0; i < el.selectedOptions.length; i += 1) {\n values.push(el.selectedOptions[i].value);\n }\n\n return values;\n }\n\n return el.value;\n } // set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n for (let j = 0; j < el.options.length; j += 1) {\n el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n }\n } else {\n el.value = value;\n }\n }\n\n return this;\n}\n\nfunction value(value) {\n return this.val(value);\n}\n\nfunction transform(transform) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transform = transform;\n }\n\n return this;\n}\n\nfunction transition(duration) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n }\n\n return this;\n}\n\nfunction on(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n\n function handleLiveEvent(e) {\n const target = e.target;\n if (!target) return;\n const eventData = e.target.dom7EventData || [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n const parents = $(target).parents(); // eslint-disable-line\n\n for (let k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n }\n }\n }\n\n function handleEvent(e) {\n const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n listener.apply(this, eventData);\n }\n\n const events = eventType.split(' ');\n let j;\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7Listeners) el.dom7Listeners = {};\n if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n el.dom7Listeners[event].push({\n listener,\n proxyListener: handleEvent\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n el.dom7LiveListeners[event].push({\n listener,\n proxyListener: handleLiveEvent\n });\n el.addEventListener(event, handleLiveEvent, capture);\n }\n }\n }\n\n return this;\n}\n\nfunction off(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n const events = eventType.split(' ');\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n let handlers;\n\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n\n if (handlers && handlers.length) {\n for (let k = handlers.length - 1; k >= 0; k -= 1) {\n const handler = handlers[k];\n\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n\n return this;\n}\n\nfunction once(...args) {\n const dom = this;\n let [eventName, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventName, listener, capture] = args;\n targetSelector = undefined;\n }\n\n function onceHandler(...eventArgs) {\n listener.apply(this, eventArgs);\n dom.off(eventName, targetSelector, onceHandler, capture);\n\n if (onceHandler.dom7proxy) {\n delete onceHandler.dom7proxy;\n }\n }\n\n onceHandler.dom7proxy = listener;\n return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n const window = getWindow();\n const events = args[0].split(' ');\n const eventData = args[1];\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n\n if (window.CustomEvent) {\n const evt = new window.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true\n });\n el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n }\n\n return this;\n}\n\nfunction transitionEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('transitionend', fireCallBack);\n }\n\n if (callback) {\n dom.on('transitionend', fireCallBack);\n }\n\n return this;\n}\n\nfunction animationEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('animationend', fireCallBack);\n }\n\n if (callback) {\n dom.on('animationend', fireCallBack);\n }\n\n return this;\n}\n\nfunction width() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerWidth;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('width'));\n }\n\n return null;\n}\n\nfunction outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n }\n\n return this[0].offsetWidth;\n }\n\n return null;\n}\n\nfunction height() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerHeight;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('height'));\n }\n\n return null;\n}\n\nfunction outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n }\n\n return this[0].offsetHeight;\n }\n\n return null;\n}\n\nfunction offset() {\n if (this.length > 0) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n const box = el.getBoundingClientRect();\n const body = document.body;\n const clientTop = el.clientTop || body.clientTop || 0;\n const clientLeft = el.clientLeft || body.clientLeft || 0;\n const scrollTop = el === window ? window.scrollY : el.scrollTop;\n const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n return {\n top: box.top + scrollTop - clientTop,\n left: box.left + scrollLeft - clientLeft\n };\n }\n\n return null;\n}\n\nfunction hide() {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.display = 'none';\n }\n\n return this;\n}\n\nfunction show() {\n const window = getWindow();\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.style.display === 'none') {\n el.style.display = '';\n }\n\n if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n // Still not visible\n el.style.display = 'block';\n }\n }\n\n return this;\n}\n\nfunction styles() {\n const window = getWindow();\n if (this[0]) return window.getComputedStyle(this[0], null);\n return {};\n}\n\nfunction css(props, value) {\n const window = getWindow();\n let i;\n\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n // .css('width')\n if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n } else {\n // .css({ width: '100px' })\n for (i = 0; i < this.length; i += 1) {\n for (const prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n\n return this;\n }\n }\n\n if (arguments.length === 2 && typeof props === 'string') {\n // .css('width', '100px')\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction each(callback) {\n if (!callback) return this;\n this.forEach((el, index) => {\n callback.apply(el, [el, index]);\n });\n return this;\n}\n\nfunction filter(callback) {\n const result = arrayFilter(this, callback);\n return $(result);\n}\n\nfunction html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n\n return this;\n}\n\nfunction text(text) {\n if (typeof text === 'undefined') {\n return this[0] ? this[0].textContent.trim() : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n\n return this;\n}\n\nfunction is(selector) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n let compareWith;\n let i;\n if (!el || typeof selector === 'undefined') return false;\n\n if (typeof selector === 'string') {\n if (el.matches) return el.matches(selector);\n if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n compareWith = $(selector);\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n if (selector === document) {\n return el === document;\n }\n\n if (selector === window) {\n return el === window;\n }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n return false;\n}\n\nfunction index() {\n let child = this[0];\n let i;\n\n if (child) {\n i = 0; // eslint-disable-next-line\n\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) i += 1;\n }\n\n return i;\n }\n\n return undefined;\n}\n\nfunction eq(index) {\n if (typeof index === 'undefined') return this;\n const length = this.length;\n\n if (index > length - 1) {\n return $([]);\n }\n\n if (index < 0) {\n const returnIndex = length + index;\n if (returnIndex < 0) return $([]);\n return $([this[returnIndex]]);\n }\n\n return $([this[index]]);\n}\n\nfunction append(...els) {\n let newChild;\n const document = getDocument();\n\n for (let k = 0; k < els.length; k += 1) {\n newChild = els[k];\n\n for (let i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (let j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n}\n\nfunction appendTo(parent) {\n $(parent).append(this);\n return this;\n}\n\nfunction prepend(newChild) {\n const document = getDocument();\n let i;\n let j;\n\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n\n return this;\n}\n\nfunction prependTo(parent) {\n $(parent).prepend(this);\n return this;\n}\n\nfunction insertBefore(selector) {\n const before = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (before.length === 1) {\n before[0].parentNode.insertBefore(this[i], before[0]);\n } else if (before.length > 1) {\n for (let j = 0; j < before.length; j += 1) {\n before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n }\n }\n }\n}\n\nfunction insertAfter(selector) {\n const after = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (after.length === 1) {\n after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n } else if (after.length > 1) {\n for (let j = 0; j < after.length; j += 1) {\n after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n }\n }\n }\n}\n\nfunction next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n return $([this[0].nextElementSibling]);\n }\n\n return $([]);\n }\n\n if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction nextAll(selector) {\n const nextEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.nextElementSibling) {\n const next = el.nextElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(next).is(selector)) nextEls.push(next);\n } else nextEls.push(next);\n\n el = next;\n }\n\n return $(nextEls);\n}\n\nfunction prev(selector) {\n if (this.length > 0) {\n const el = this[0];\n\n if (selector) {\n if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n return $([el.previousElementSibling]);\n }\n\n return $([]);\n }\n\n if (el.previousElementSibling) return $([el.previousElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction prevAll(selector) {\n const prevEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.previousElementSibling) {\n const prev = el.previousElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(prev).is(selector)) prevEls.push(prev);\n } else prevEls.push(prev);\n\n el = prev;\n }\n\n return $(prevEls);\n}\n\nfunction siblings(selector) {\n return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n\n return $(parents);\n}\n\nfunction parents(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n let parent = this[i].parentNode; // eslint-disable-line\n\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) parents.push(parent);\n } else {\n parents.push(parent);\n }\n\n parent = parent.parentNode;\n }\n }\n\n return $(parents);\n}\n\nfunction closest(selector) {\n let closest = this; // eslint-disable-line\n\n if (typeof selector === 'undefined') {\n return $([]);\n }\n\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n\n return closest;\n}\n\nfunction find(selector) {\n const foundElements = [];\n\n for (let i = 0; i < this.length; i += 1) {\n const found = this[i].querySelectorAll(selector);\n\n for (let j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n\n return $(foundElements);\n}\n\nfunction children(selector) {\n const children = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n const childNodes = this[i].children;\n\n for (let j = 0; j < childNodes.length; j += 1) {\n if (!selector || $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n\n return $(children);\n}\n\nfunction remove() {\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n }\n\n return this;\n}\n\nfunction detach() {\n return this.remove();\n}\n\nfunction add(...els) {\n const dom = this;\n let i;\n let j;\n\n for (i = 0; i < els.length; i += 1) {\n const toAdd = $(els[i]);\n\n for (j = 0; j < toAdd.length; j += 1) {\n dom.push(toAdd[j]);\n }\n }\n\n return dom;\n}\n\nfunction empty() {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.nodeType === 1) {\n for (let j = 0; j < el.childNodes.length; j += 1) {\n if (el.childNodes[j].parentNode) {\n el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n }\n }\n\n el.textContent = '';\n }\n }\n\n return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n const window = getWindow();\n let [left, top, duration, easing, callback] = args;\n\n if (args.length === 4 && typeof easing === 'function') {\n callback = easing;\n [left, top, duration, callback, easing] = args;\n }\n\n if (typeof easing === 'undefined') easing = 'swing';\n return this.each(function animate() {\n const el = this;\n let currentTop;\n let currentLeft;\n let maxTop;\n let maxLeft;\n let newTop;\n let newLeft;\n let scrollTop; // eslint-disable-line\n\n let scrollLeft; // eslint-disable-line\n\n let animateTop = top > 0 || top === 0;\n let animateLeft = left > 0 || left === 0;\n\n if (typeof easing === 'undefined') {\n easing = 'swing';\n }\n\n if (animateTop) {\n currentTop = el.scrollTop;\n\n if (!duration) {\n el.scrollTop = top;\n }\n }\n\n if (animateLeft) {\n currentLeft = el.scrollLeft;\n\n if (!duration) {\n el.scrollLeft = left;\n }\n }\n\n if (!duration) return;\n\n if (animateTop) {\n maxTop = el.scrollHeight - el.offsetHeight;\n newTop = Math.max(Math.min(top, maxTop), 0);\n }\n\n if (animateLeft) {\n maxLeft = el.scrollWidth - el.offsetWidth;\n newLeft = Math.max(Math.min(left, maxLeft), 0);\n }\n\n let startTime = null;\n if (animateTop && newTop === currentTop) animateTop = false;\n if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n function render(time = new Date().getTime()) {\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n let done;\n if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (done) {\n if (callback) callback();\n return;\n }\n\n if (animateTop) el.scrollTop = scrollTop;\n if (animateLeft) el.scrollLeft = scrollLeft;\n window.requestAnimationFrame(render);\n }\n\n window.requestAnimationFrame(render);\n });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n let [top, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [top, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof top === 'undefined') {\n if (dom.length > 0) return dom[0].scrollTop;\n return null;\n }\n\n return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n let [left, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [left, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof left === 'undefined') {\n if (dom.length > 0) return dom[0].scrollLeft;\n return null;\n }\n\n return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n const window = getWindow();\n const els = this;\n const a = {\n props: Object.assign({}, initialProps),\n params: Object.assign({\n duration: 300,\n easing: 'swing' // or 'linear'\n\n /* Callbacks\n begin(elements)\n complete(elements)\n progress(elements, complete, remaining, start, tweenValue)\n */\n\n }, initialParams),\n elements: els,\n animating: false,\n que: [],\n\n easingProgress(easing, progress) {\n if (easing === 'swing') {\n return 0.5 - Math.cos(progress * Math.PI) / 2;\n }\n\n if (typeof easing === 'function') {\n return easing(progress);\n }\n\n return progress;\n },\n\n stop() {\n if (a.frameId) {\n window.cancelAnimationFrame(a.frameId);\n }\n\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n a.que = [];\n },\n\n done(complete) {\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n if (complete) complete(els);\n\n if (a.que.length > 0) {\n const que = a.que.shift();\n a.animate(que[0], que[1]);\n }\n },\n\n animate(props, params) {\n if (a.animating) {\n a.que.push([props, params]);\n return a;\n }\n\n const elements = []; // Define & Cache Initials & Units\n\n a.elements.each((el, index) => {\n let initialFullValue;\n let initialValue;\n let unit;\n let finalValue;\n let finalFullValue;\n if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n elements[index] = {\n container: el\n };\n Object.keys(props).forEach(prop => {\n initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n initialValue = parseFloat(initialFullValue);\n unit = initialFullValue.replace(initialValue, '');\n finalValue = parseFloat(props[prop]);\n finalFullValue = props[prop] + unit;\n elements[index][prop] = {\n initialFullValue,\n initialValue,\n unit,\n finalValue,\n finalFullValue,\n currentValue: initialValue\n };\n });\n });\n let startTime = null;\n let time;\n let elementsDone = 0;\n let propsDone = 0;\n let done;\n let began = false;\n a.animating = true;\n\n function render() {\n time = new Date().getTime();\n let progress;\n let easeProgress; // let el;\n\n if (!began) {\n began = true;\n if (params.begin) params.begin(els);\n }\n\n if (startTime === null) {\n startTime = time;\n }\n\n if (params.progress) {\n // eslint-disable-next-line\n params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n }\n\n elements.forEach(element => {\n const el = element;\n if (done || el.done) return;\n Object.keys(props).forEach(prop => {\n if (done || el.done) return;\n progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n easeProgress = a.easingProgress(params.easing, progress);\n const {\n initialValue,\n finalValue,\n unit\n } = el[prop];\n el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n const currentValue = el[prop].currentValue;\n\n if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n el.container.style[prop] = finalValue + unit;\n propsDone += 1;\n\n if (propsDone === Object.keys(props).length) {\n el.done = true;\n elementsDone += 1;\n }\n\n if (elementsDone === elements.length) {\n done = true;\n }\n }\n\n if (done) {\n a.done(params.complete);\n return;\n }\n\n el.container.style[prop] = currentValue + unit;\n });\n });\n if (done) return; // Then call\n\n a.frameId = window.requestAnimationFrame(render);\n }\n\n a.frameId = window.requestAnimationFrame(render);\n return a;\n }\n\n };\n\n if (a.elements.length === 0) {\n return els;\n }\n\n let animateInstance;\n\n for (let i = 0; i < a.elements.length; i += 1) {\n if (a.elements[i].dom7AnimateInstance) {\n animateInstance = a.elements[i].dom7AnimateInstance;\n } else a.elements[i].dom7AnimateInstance = a;\n }\n\n if (!animateInstance) {\n animateInstance = a;\n }\n\n if (initialProps === 'stop') {\n animateInstance.stop();\n } else {\n animateInstance.animate(a.props, a.params);\n }\n\n return els;\n}\n\nfunction stop() {\n const els = this;\n\n for (let i = 0; i < els.length; i += 1) {\n if (els[i].dom7AnimateInstance) {\n els[i].dom7AnimateInstance.stop();\n }\n }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n function eventHandler(...args) {\n if (typeof args[0] === 'undefined') {\n for (let i = 0; i < this.length; i += 1) {\n if (noTrigger.indexOf(name) < 0) {\n if (name in this[i]) this[i][name]();else {\n $(this[i]).trigger(name);\n }\n }\n }\n\n return this;\n }\n\n return this.on(name, ...args);\n }\n\n return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import {\n $,\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n} from 'dom7';\n\nconst Methods = {\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n};\n\nObject.keys(Methods).forEach((methodName) => {\n Object.defineProperty($.fn, methodName, { value: Methods[methodName], writable: true });\n});\n\nexport default $;\n","import { getWindow } from 'ssr-window';\n\nfunction deleteProps(obj) {\n const object = obj;\n Object.keys(object).forEach((key) => {\n try {\n object[key] = null;\n } catch (e) {\n // no getter for object\n }\n try {\n delete object[key];\n } catch (e) {\n // something got wrong\n }\n });\n}\nfunction nextTick(callback, delay = 0) {\n return setTimeout(callback, delay);\n}\nfunction now() {\n return Date.now();\n}\nfunction getComputedStyle(el) {\n const window = getWindow();\n let style;\n if (window.getComputedStyle) {\n style = window.getComputedStyle(el, null);\n }\n if (!style && el.currentStyle) {\n style = el.currentStyle;\n }\n if (!style) {\n style = el.style;\n }\n\n return style;\n}\nfunction getTranslate(el, axis = 'x') {\n const window = getWindow();\n let matrix;\n let curTransform;\n let transformMatrix;\n\n const curStyle = getComputedStyle(el, null);\n\n if (window.WebKitCSSMatrix) {\n curTransform = curStyle.transform || curStyle.webkitTransform;\n if (curTransform.split(',').length > 6) {\n curTransform = curTransform\n .split(', ')\n .map((a) => a.replace(',', '.'))\n .join(', ');\n }\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n } else {\n transformMatrix =\n curStyle.MozTransform ||\n curStyle.OTransform ||\n curStyle.MsTransform ||\n curStyle.msTransform ||\n curStyle.transform ||\n curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n\n if (axis === 'x') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[4]);\n }\n if (axis === 'y') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[5]);\n }\n return curTransform || 0;\n}\nfunction isObject(o) {\n return (\n typeof o === 'object' &&\n o !== null &&\n o.constructor &&\n Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n );\n}\nfunction isNode(node) {\n // eslint-disable-next-line\n if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n return node instanceof HTMLElement;\n }\n return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend(...args) {\n const to = Object(args[0]);\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n for (let i = 1; i < args.length; i += 1) {\n const nextSource = args[i];\n if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0);\n for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n const nextKey = keysArray[nextIndex];\n const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({ swiper, targetPosition, side }) {\n const window = getWindow();\n const startPosition = -swiper.translate;\n let startTime = null;\n let time;\n const duration = swiper.params.speed;\n\n swiper.wrapperEl.style.scrollSnapType = 'none';\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n\n const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n const isOutOfBound = (current, target) => {\n return (dir === 'next' && current >= target) || (dir === 'prev' && current <= target);\n };\n\n const animate = () => {\n time = new Date().getTime();\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n if (isOutOfBound(currentPosition, targetPosition)) {\n currentPosition = targetPosition;\n }\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n if (isOutOfBound(currentPosition, targetPosition)) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.scrollSnapType = '';\n setTimeout(() => {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n });\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n return;\n }\n swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n };\n animate();\n}\n\nexport {\n animateCSSModeScroll,\n deleteProps,\n nextTick,\n now,\n getTranslate,\n isObject,\n extend,\n getComputedStyle,\n setCSSProperty,\n};\n","import { getWindow, getDocument } from 'ssr-window';\n\nlet support;\n\nfunction calcSupport() {\n const window = getWindow();\n const document = getDocument();\n\n return {\n smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n\n touch: !!(\n 'ontouchstart' in window ||\n (window.DocumentTouch && document instanceof window.DocumentTouch)\n ),\n\n passiveListener: (function checkPassiveListener() {\n let supportsPassive = false;\n try {\n const opts = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line\n get() {\n supportsPassive = true;\n },\n });\n window.addEventListener('testPassiveListener', null, opts);\n } catch (e) {\n // No support\n }\n return supportsPassive;\n })(),\n\n gestures: (function checkGestures() {\n return 'ongesturestart' in window;\n })(),\n };\n}\n\nfunction getSupport() {\n if (!support) {\n support = calcSupport();\n }\n return support;\n}\n\nexport { getSupport };\n","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\n\nlet deviceCached;\n\nfunction calcDevice({ userAgent } = {}) {\n const support = getSupport();\n const window = getWindow();\n const platform = window.navigator.platform;\n const ua = userAgent || window.navigator.userAgent;\n\n const device = {\n ios: false,\n android: false,\n };\n\n const screenWidth = window.screen.width;\n const screenHeight = window.screen.height;\n\n const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n const windows = platform === 'Win32';\n let macos = platform === 'MacIntel';\n\n // iPadOs 13 fix\n const iPadScreens = [\n '1024x1366',\n '1366x1024',\n '834x1194',\n '1194x834',\n '834x1112',\n '1112x834',\n '768x1024',\n '1024x768',\n '820x1180',\n '1180x820',\n '810x1080',\n '1080x810',\n ];\n if (\n !ipad &&\n macos &&\n support.touch &&\n iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0\n ) {\n ipad = ua.match(/(Version)\\/([\\d.]+)/);\n if (!ipad) ipad = [0, 1, '13_0_0'];\n macos = false;\n }\n\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.android = true;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n\n // Export object\n return device;\n}\n\nfunction getDevice(overrides = {}) {\n if (!deviceCached) {\n deviceCached = calcDevice(overrides);\n }\n return deviceCached;\n}\n\nexport { getDevice };\n","import { getWindow } from 'ssr-window';\n\nlet browser;\n\nfunction calcBrowser() {\n const window = getWindow();\n function isSafari() {\n const ua = window.navigator.userAgent.toLowerCase();\n return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n }\n return {\n isSafari: isSafari(),\n isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),\n };\n}\n\nfunction getBrowser() {\n if (!browser) {\n browser = calcBrowser();\n }\n return browser;\n}\n\nexport { getBrowser };\n","import { getWindow } from 'ssr-window';\n\nexport default function Resize({ swiper, on, emit }) {\n const window = getWindow();\n let observer = null;\n\n const resizeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('beforeResize');\n emit('resize');\n };\n\n const createObserver = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n observer = new ResizeObserver((entries) => {\n const { width, height } = swiper;\n let newWidth = width;\n let newHeight = height;\n entries.forEach(({ contentBoxSize, contentRect, target }) => {\n if (target && target !== swiper.el) return;\n newWidth = contentRect\n ? contentRect.width\n : (contentBoxSize[0] || contentBoxSize).inlineSize;\n newHeight = contentRect\n ? contentRect.height\n : (contentBoxSize[0] || contentBoxSize).blockSize;\n });\n if (newWidth !== width || newHeight !== height) {\n resizeHandler();\n }\n });\n observer.observe(swiper.el);\n };\n\n const removeObserver = () => {\n if (observer && observer.unobserve && swiper.el) {\n observer.unobserve(swiper.el);\n observer = null;\n }\n };\n\n const orientationChangeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('orientationchange');\n };\n\n on('init', () => {\n if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n createObserver();\n return;\n }\n window.addEventListener('resize', resizeHandler);\n window.addEventListener('orientationchange', orientationChangeHandler);\n });\n\n on('destroy', () => {\n removeObserver();\n window.removeEventListener('resize', resizeHandler);\n window.removeEventListener('orientationchange', orientationChangeHandler);\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Observer({ swiper, extendParams, on, emit }) {\n const observers = [];\n const window = getWindow();\n const attach = (target, options = {}) => {\n const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n const observer = new ObserverFunc((mutations) => {\n // The observerUpdate event should only be triggered\n // once despite the number of mutations. Additional\n // triggers are redundant and are very costly\n if (mutations.length === 1) {\n emit('observerUpdate', mutations[0]);\n return;\n }\n const observerUpdate = function observerUpdate() {\n emit('observerUpdate', mutations[0]);\n };\n\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(observerUpdate);\n } else {\n window.setTimeout(observerUpdate, 0);\n }\n });\n\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n });\n\n observers.push(observer);\n };\n const init = () => {\n if (!swiper.params.observer) return;\n if (swiper.params.observeParents) {\n const containerParents = swiper.$el.parents();\n for (let i = 0; i < containerParents.length; i += 1) {\n attach(containerParents[i]);\n }\n }\n // Observe container\n attach(swiper.$el[0], {\n childList: swiper.params.observeSlideChildren,\n });\n\n // Observe wrapper\n attach(swiper.$wrapperEl[0], { attributes: false });\n };\n const destroy = () => {\n observers.forEach((observer) => {\n observer.disconnect();\n });\n observers.splice(0, observers.length);\n };\n\n extendParams({\n observer: false,\n observeParents: false,\n observeSlideChildren: false,\n });\n on('init', init);\n on('destroy', destroy);\n}\n","/* eslint-disable no-underscore-dangle */\n\nexport default {\n on(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n events.split(' ').forEach((event) => {\n if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n self.eventsListeners[event][method](handler);\n });\n return self;\n },\n\n once(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n function onceHandler(...args) {\n self.off(events, onceHandler);\n if (onceHandler.__emitterProxy) {\n delete onceHandler.__emitterProxy;\n }\n handler.apply(self, args);\n }\n onceHandler.__emitterProxy = handler;\n return self.on(events, onceHandler, priority);\n },\n\n onAny(handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n if (self.eventsAnyListeners.indexOf(handler) < 0) {\n self.eventsAnyListeners[method](handler);\n }\n return self;\n },\n\n offAny(handler) {\n const self = this;\n if (!self.eventsAnyListeners) return self;\n const index = self.eventsAnyListeners.indexOf(handler);\n if (index >= 0) {\n self.eventsAnyListeners.splice(index, 1);\n }\n return self;\n },\n\n off(events, handler) {\n const self = this;\n if (!self.eventsListeners) return self;\n events.split(' ').forEach((event) => {\n if (typeof handler === 'undefined') {\n self.eventsListeners[event] = [];\n } else if (self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler, index) => {\n if (\n eventHandler === handler ||\n (eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler)\n ) {\n self.eventsListeners[event].splice(index, 1);\n }\n });\n }\n });\n return self;\n },\n\n emit(...args) {\n const self = this;\n if (!self.eventsListeners) return self;\n let events;\n let data;\n let context;\n if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n events = args[0];\n data = args.slice(1, args.length);\n context = self;\n } else {\n events = args[0].events;\n data = args[0].data;\n context = args[0].context || self;\n }\n data.unshift(context);\n const eventsArray = Array.isArray(events) ? events : events.split(' ');\n\n eventsArray.forEach((event) => {\n if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n self.eventsAnyListeners.forEach((eventHandler) => {\n eventHandler.apply(context, [event, ...data]);\n });\n }\n if (self.eventsListeners && self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler) => {\n eventHandler.apply(context, data);\n });\n }\n });\n return self;\n },\n};\n","export default function updateSize() {\n const swiper = this;\n let width;\n let height;\n const $el = swiper.$el;\n if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n width = swiper.params.width;\n } else {\n width = $el[0].clientWidth;\n }\n if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n height = swiper.params.height;\n } else {\n height = $el[0].clientHeight;\n }\n if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n return;\n }\n\n // Subtract paddings\n width =\n width -\n parseInt($el.css('padding-left') || 0, 10) -\n parseInt($el.css('padding-right') || 0, 10);\n height =\n height -\n parseInt($el.css('padding-top') || 0, 10) -\n parseInt($el.css('padding-bottom') || 0, 10);\n\n if (Number.isNaN(width)) width = 0;\n if (Number.isNaN(height)) height = 0;\n\n Object.assign(swiper, {\n width,\n height,\n size: swiper.isHorizontal() ? width : height,\n });\n}\n","import { setCSSProperty } from '../../shared/utils.js';\n\nexport default function updateSlides() {\n const swiper = this;\n function getDirectionLabel(property) {\n if (swiper.isHorizontal()) {\n return property;\n }\n // prettier-ignore\n return {\n 'width': 'height',\n 'margin-top': 'margin-left',\n 'margin-bottom ': 'margin-right',\n 'margin-left': 'margin-top',\n 'margin-right': 'margin-bottom',\n 'padding-left': 'padding-top',\n 'padding-right': 'padding-bottom',\n 'marginRight': 'marginBottom',\n }[property];\n }\n function getDirectionPropertyValue(node, label) {\n return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n }\n\n const params = swiper.params;\n\n const { $wrapperEl, size: swiperSize, rtlTranslate: rtl, wrongRTL } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n let snapGrid = [];\n const slidesGrid = [];\n const slidesSizesGrid = [];\n\n let offsetBefore = params.slidesOffsetBefore;\n if (typeof offsetBefore === 'function') {\n offsetBefore = params.slidesOffsetBefore.call(swiper);\n }\n\n let offsetAfter = params.slidesOffsetAfter;\n if (typeof offsetAfter === 'function') {\n offsetAfter = params.slidesOffsetAfter.call(swiper);\n }\n\n const previousSnapGridLength = swiper.snapGrid.length;\n const previousSlidesGridLength = swiper.slidesGrid.length;\n\n let spaceBetween = params.spaceBetween;\n let slidePosition = -offsetBefore;\n let prevSlideSize = 0;\n let index = 0;\n if (typeof swiperSize === 'undefined') {\n return;\n }\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n }\n\n swiper.virtualSize = -spaceBetween;\n\n // reset margins\n if (rtl) slides.css({ marginLeft: '', marginBottom: '', marginTop: '' });\n else slides.css({ marginRight: '', marginBottom: '', marginTop: '' });\n\n // reset cssMode offsets\n if (params.centeredSlides && params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n }\n\n const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n if (gridEnabled) {\n swiper.grid.initSlides(slidesLength);\n }\n\n // Calc slides\n let slideSize;\n\n const shouldResetSlideSize =\n params.slidesPerView === 'auto' &&\n params.breakpoints &&\n Object.keys(params.breakpoints).filter((key) => {\n return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n }).length > 0;\n\n for (let i = 0; i < slidesLength; i += 1) {\n slideSize = 0;\n const slide = slides.eq(i);\n if (gridEnabled) {\n swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n }\n if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n if (params.slidesPerView === 'auto') {\n if (shouldResetSlideSize) {\n slides[i].style[getDirectionLabel('width')] = ``;\n }\n const slideStyles = getComputedStyle(slide[0]);\n const currentTransform = slide[0].style.transform;\n const currentWebKitTransform = slide[0].style.webkitTransform;\n if (currentTransform) {\n slide[0].style.transform = 'none';\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = 'none';\n }\n if (params.roundLengths) {\n slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n } else {\n // eslint-disable-next-line\n const width = getDirectionPropertyValue(slideStyles, 'width');\n const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n const boxSizing = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing && boxSizing === 'border-box') {\n slideSize = width + marginLeft + marginRight;\n } else {\n const { clientWidth, offsetWidth } = slide[0];\n slideSize =\n width +\n paddingLeft +\n paddingRight +\n marginLeft +\n marginRight +\n (offsetWidth - clientWidth);\n }\n }\n if (currentTransform) {\n slide[0].style.transform = currentTransform;\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = currentWebKitTransform;\n }\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n } else {\n slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n if (slides[i]) {\n slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n }\n }\n if (slides[i]) {\n slides[i].swiperSlideSize = slideSize;\n }\n slidesSizesGrid.push(slideSize);\n\n if (params.centeredSlides) {\n slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n if (prevSlideSize === 0 && i !== 0)\n slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n } else {\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (\n (index - Math.min(swiper.params.slidesPerGroupSkip, index)) %\n swiper.params.slidesPerGroup ===\n 0\n )\n snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n slidePosition = slidePosition + slideSize + spaceBetween;\n }\n\n swiper.virtualSize += slideSize + spaceBetween;\n\n prevSlideSize = slideSize;\n\n index += 1;\n }\n swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` });\n }\n if (params.setWrapperSize) {\n $wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`,\n });\n }\n\n if (gridEnabled) {\n swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n }\n\n // Remove last grid elements depending on width\n if (!params.centeredSlides) {\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n newSlidesGrid.push(slidesGridItem);\n }\n }\n snapGrid = newSlidesGrid;\n\n if (\n Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) >\n 1\n ) {\n snapGrid.push(swiper.virtualSize - swiperSize);\n }\n }\n if (snapGrid.length === 0) snapGrid = [0];\n\n if (params.spaceBetween !== 0) {\n const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n slides\n .filter((_, slideIndex) => {\n if (!params.cssMode) return true;\n if (slideIndex === slides.length - 1) {\n return false;\n }\n return true;\n })\n .css({ [key]: `${spaceBetween}px` });\n }\n\n if (params.centeredSlides && params.centeredSlidesBounds) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n const maxSnap = allSlidesSize - swiperSize;\n snapGrid = snapGrid.map((snap) => {\n if (snap < 0) return -offsetBefore;\n if (snap > maxSnap) return maxSnap + offsetAfter;\n return snap;\n });\n }\n\n if (params.centerInsufficientSlides) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n if (allSlidesSize < swiperSize) {\n const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n snapGrid.forEach((snap, snapIndex) => {\n snapGrid[snapIndex] = snap - allSlidesOffset;\n });\n slidesGrid.forEach((snap, snapIndex) => {\n slidesGrid[snapIndex] = snap + allSlidesOffset;\n });\n }\n }\n\n Object.assign(swiper, {\n slides,\n snapGrid,\n slidesGrid,\n slidesSizesGrid,\n });\n\n if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n setCSSProperty(\n swiper.wrapperEl,\n '--swiper-centered-offset-after',\n `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`,\n );\n const addToSnapGrid = -swiper.snapGrid[0];\n const addToSlidesGrid = -swiper.slidesGrid[0];\n swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid);\n swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid);\n }\n\n if (slidesLength !== previousSlidesLength) {\n swiper.emit('slidesLengthChange');\n }\n if (snapGrid.length !== previousSnapGridLength) {\n if (swiper.params.watchOverflow) swiper.checkOverflow();\n swiper.emit('snapGridLengthChange');\n }\n if (slidesGrid.length !== previousSlidesGridLength) {\n swiper.emit('slidesGridLengthChange');\n }\n\n if (params.watchSlidesProgress) {\n swiper.updateSlidesOffset();\n }\n}\n","export default function updateAutoHeight(speed) {\n const swiper = this;\n const activeSlides = [];\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let newHeight = 0;\n let i;\n if (typeof speed === 'number') {\n swiper.setTransition(speed);\n } else if (speed === true) {\n swiper.setTransition(swiper.params.speed);\n }\n\n const getSlideByIndex = (index) => {\n if (isVirtual) {\n return swiper.slides.filter(\n (el) => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index,\n )[0];\n }\n return swiper.slides.eq(index)[0];\n };\n // Find slides currently in view\n if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n if (swiper.params.centeredSlides) {\n swiper.visibleSlides.each((slide) => {\n activeSlides.push(slide);\n });\n } else {\n for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n const index = swiper.activeIndex + i;\n if (index > swiper.slides.length && !isVirtual) break;\n activeSlides.push(getSlideByIndex(index));\n }\n }\n } else {\n activeSlides.push(getSlideByIndex(swiper.activeIndex));\n }\n\n // Find new height from highest slide in view\n for (i = 0; i < activeSlides.length; i += 1) {\n if (typeof activeSlides[i] !== 'undefined') {\n const height = activeSlides[i].offsetHeight;\n newHeight = height > newHeight ? height : newHeight;\n }\n }\n\n // Update Height\n if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}\n","export default function updateSlidesOffset() {\n const swiper = this;\n const slides = swiper.slides;\n for (let i = 0; i < slides.length; i += 1) {\n slides[i].swiperSlideOffset = swiper.isHorizontal()\n ? slides[i].offsetLeft\n : slides[i].offsetTop;\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateSlidesProgress(translate = (this && this.translate) || 0) {\n const swiper = this;\n const params = swiper.params;\n\n const { slides, rtlTranslate: rtl, snapGrid } = swiper;\n\n if (slides.length === 0) return;\n if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n\n let offsetCenter = -translate;\n if (rtl) offsetCenter = translate;\n\n // Visible Slides\n slides.removeClass(params.slideVisibleClass);\n\n swiper.visibleSlidesIndexes = [];\n swiper.visibleSlides = [];\n\n for (let i = 0; i < slides.length; i += 1) {\n const slide = slides[i];\n let slideOffset = slide.swiperSlideOffset;\n if (params.cssMode && params.centeredSlides) {\n slideOffset -= slides[0].swiperSlideOffset;\n }\n\n const slideProgress =\n (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const originalSlideProgress =\n (offsetCenter -\n snapGrid[0] +\n (params.centeredSlides ? swiper.minTranslate() : 0) -\n slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const slideBefore = -(offsetCenter - slideOffset);\n const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n const isVisible =\n (slideBefore >= 0 && slideBefore < swiper.size - 1) ||\n (slideAfter > 1 && slideAfter <= swiper.size) ||\n (slideBefore <= 0 && slideAfter >= swiper.size);\n if (isVisible) {\n swiper.visibleSlides.push(slide);\n swiper.visibleSlidesIndexes.push(i);\n slides.eq(i).addClass(params.slideVisibleClass);\n }\n slide.progress = rtl ? -slideProgress : slideProgress;\n slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n }\n swiper.visibleSlides = $(swiper.visibleSlides);\n}\n","export default function updateProgress(translate) {\n const swiper = this;\n if (typeof translate === 'undefined') {\n const multiplier = swiper.rtlTranslate ? -1 : 1;\n // eslint-disable-next-line\n translate = (swiper && swiper.translate && swiper.translate * multiplier) || 0;\n }\n const params = swiper.params;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n let { progress, isBeginning, isEnd } = swiper;\n const wasBeginning = isBeginning;\n const wasEnd = isEnd;\n if (translatesDiff === 0) {\n progress = 0;\n isBeginning = true;\n isEnd = true;\n } else {\n progress = (translate - swiper.minTranslate()) / translatesDiff;\n isBeginning = progress <= 0;\n isEnd = progress >= 1;\n }\n Object.assign(swiper, {\n progress,\n isBeginning,\n isEnd,\n });\n\n if (params.watchSlidesProgress || (params.centeredSlides && params.autoHeight))\n swiper.updateSlidesProgress(translate);\n\n if (isBeginning && !wasBeginning) {\n swiper.emit('reachBeginning toEdge');\n }\n if (isEnd && !wasEnd) {\n swiper.emit('reachEnd toEdge');\n }\n if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n swiper.emit('fromEdge');\n }\n\n swiper.emit('progress', progress);\n}\n","export default function updateSlidesClasses() {\n const swiper = this;\n\n const { slides, params, $wrapperEl, activeIndex, realIndex } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n\n slides.removeClass(\n `${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`,\n );\n\n let activeSlide;\n if (isVirtual) {\n activeSlide = swiper.$wrapperEl.find(\n `.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`,\n );\n } else {\n activeSlide = slides.eq(activeIndex);\n }\n\n // Active classes\n activeSlide.addClass(params.slideActiveClass);\n\n if (params.loop) {\n // Duplicate to all looped slides\n if (activeSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n }\n }\n // Next Slide\n let nextSlide = activeSlide\n .nextAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slideNextClass);\n if (params.loop && nextSlide.length === 0) {\n nextSlide = slides.eq(0);\n nextSlide.addClass(params.slideNextClass);\n }\n // Prev Slide\n let prevSlide = activeSlide\n .prevAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slidePrevClass);\n if (params.loop && prevSlide.length === 0) {\n prevSlide = slides.eq(-1);\n prevSlide.addClass(params.slidePrevClass);\n }\n if (params.loop) {\n // Duplicate to all looped slides\n if (nextSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n }\n if (prevSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n }\n }\n swiper.emitSlidesClasses();\n}\n","export default function updateActiveIndex(newActiveIndex) {\n const swiper = this;\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n const {\n slidesGrid,\n snapGrid,\n params,\n activeIndex: previousIndex,\n realIndex: previousRealIndex,\n snapIndex: previousSnapIndex,\n } = swiper;\n let activeIndex = newActiveIndex;\n let snapIndex;\n if (typeof activeIndex === 'undefined') {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n translate >= slidesGrid[i] &&\n translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2\n ) {\n activeIndex = i;\n } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n activeIndex = i + 1;\n }\n } else if (translate >= slidesGrid[i]) {\n activeIndex = i;\n }\n }\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n }\n }\n if (snapGrid.indexOf(translate) >= 0) {\n snapIndex = snapGrid.indexOf(translate);\n } else {\n const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n }\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n if (activeIndex === previousIndex) {\n if (snapIndex !== previousSnapIndex) {\n swiper.snapIndex = snapIndex;\n swiper.emit('snapIndexChange');\n }\n return;\n }\n\n // Get real index\n const realIndex = parseInt(\n swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex,\n 10,\n );\n\n Object.assign(swiper, {\n snapIndex,\n realIndex,\n previousIndex,\n activeIndex,\n });\n swiper.emit('activeIndexChange');\n swiper.emit('snapIndexChange');\n if (previousRealIndex !== realIndex) {\n swiper.emit('realIndexChange');\n }\n if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n swiper.emit('slideChange');\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateClickedSlide(e) {\n const swiper = this;\n const params = swiper.params;\n const slide = $(e.target).closest(`.${params.slideClass}`)[0];\n let slideFound = false;\n let slideIndex;\n\n if (slide) {\n for (let i = 0; i < swiper.slides.length; i += 1) {\n if (swiper.slides[i] === slide) {\n slideFound = true;\n slideIndex = i;\n break;\n }\n }\n }\n\n if (slide && slideFound) {\n swiper.clickedSlide = slide;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n } else {\n swiper.clickedIndex = slideIndex;\n }\n } else {\n swiper.clickedSlide = undefined;\n swiper.clickedIndex = undefined;\n return;\n }\n if (\n params.slideToClickedSlide &&\n swiper.clickedIndex !== undefined &&\n swiper.clickedIndex !== swiper.activeIndex\n ) {\n swiper.slideToClickedSlide();\n }\n}\n","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\n\nexport default {\n updateSize,\n updateSlides,\n updateAutoHeight,\n updateSlidesOffset,\n updateSlidesProgress,\n updateProgress,\n updateSlidesClasses,\n updateActiveIndex,\n updateClickedSlide,\n};\n","import { getTranslate } from '../../shared/utils.js';\n\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n const swiper = this;\n\n const { params, rtlTranslate: rtl, translate, $wrapperEl } = swiper;\n\n if (params.virtualTranslate) {\n return rtl ? -translate : translate;\n }\n if (params.cssMode) {\n return translate;\n }\n\n let currentTranslate = getTranslate($wrapperEl[0], axis);\n if (rtl) currentTranslate = -currentTranslate;\n\n return currentTranslate || 0;\n}\n","export default function setTranslate(translate, byController) {\n const swiper = this;\n const { rtlTranslate: rtl, params, $wrapperEl, wrapperEl, progress } = swiper;\n let x = 0;\n let y = 0;\n const z = 0;\n\n if (swiper.isHorizontal()) {\n x = rtl ? -translate : translate;\n } else {\n y = translate;\n }\n\n if (params.roundLengths) {\n x = Math.floor(x);\n y = Math.floor(y);\n }\n\n if (params.cssMode) {\n wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n } else if (!params.virtualTranslate) {\n $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n }\n swiper.previousTranslate = swiper.translate;\n swiper.translate = swiper.isHorizontal() ? x : y;\n\n // Check if we need to update progress\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== progress) {\n swiper.updateProgress(translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, byController);\n}\n","export default function minTranslate() {\n return -this.snapGrid[0];\n}\n","export default function maxTranslate() {\n return -this.snapGrid[this.snapGrid.length - 1];\n}\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function translateTo(\n translate = 0,\n speed = this.params.speed,\n runCallbacks = true,\n translateBounds = true,\n internal,\n) {\n const swiper = this;\n\n const { params, wrapperEl } = swiper;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return false;\n }\n\n const minTranslate = swiper.minTranslate();\n const maxTranslate = swiper.maxTranslate();\n let newTranslate;\n if (translateBounds && translate > minTranslate) newTranslate = minTranslate;\n else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;\n else newTranslate = translate;\n\n // Update progress\n swiper.updateProgress(newTranslate);\n\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n if (speed === 0) {\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: -newTranslate, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: -newTranslate,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionEnd');\n }\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionStart');\n }\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onTranslateToWrapperTransitionEnd) {\n swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.onTranslateToWrapperTransitionEnd = null;\n delete swiper.onTranslateToWrapperTransitionEnd;\n if (runCallbacks) {\n swiper.emit('transitionEnd');\n }\n };\n }\n swiper.$wrapperEl[0].addEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\n\nexport default {\n getTranslate,\n setTranslate,\n minTranslate,\n maxTranslate,\n translateTo,\n};\n","export default function setTransition(duration, byController) {\n const swiper = this;\n\n if (!swiper.params.cssMode) {\n swiper.$wrapperEl.transition(duration);\n }\n\n swiper.emit('setTransition', duration, byController);\n}\n","export default function transitionEmit({ swiper, runCallbacks, direction, step }) {\n const { activeIndex, previousIndex } = swiper;\n let dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) dir = 'next';\n else if (activeIndex < previousIndex) dir = 'prev';\n else dir = 'reset';\n }\n\n swiper.emit(`transition${step}`);\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit(`slideResetTransition${step}`);\n return;\n }\n swiper.emit(`slideChangeTransition${step}`);\n if (dir === 'next') {\n swiper.emit(`slideNextTransition${step}`);\n } else {\n swiper.emit(`slidePrevTransition${step}`);\n }\n }\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionStart(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n if (params.cssMode) return;\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'Start' });\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionEnd(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n swiper.animating = false;\n if (params.cssMode) return;\n swiper.setTransition(0);\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'End' });\n}\n","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\n\nexport default {\n setTransition,\n transitionStart,\n transitionEnd,\n};\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function slideTo(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n initial,\n) {\n if (typeof index !== 'number' && typeof index !== 'string') {\n throw new Error(\n `The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`,\n );\n }\n\n if (typeof index === 'string') {\n /**\n * The `index` argument converted from `string` to `number`.\n * @type {number}\n */\n const indexAsNumber = parseInt(index, 10);\n\n /**\n * Determines whether the `index` argument is a valid `number`\n * after being converted from the `string` type.\n * @type {boolean}\n */\n const isValidNumber = isFinite(indexAsNumber);\n\n if (!isValidNumber) {\n throw new Error(\n `The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`,\n );\n }\n\n // Knowing that the converted `index` is a valid number,\n // we can update the original argument's value.\n index = indexAsNumber;\n }\n\n const swiper = this;\n let slideIndex = index;\n if (slideIndex < 0) slideIndex = 0;\n\n const {\n params,\n snapGrid,\n slidesGrid,\n previousIndex,\n activeIndex,\n rtlTranslate: rtl,\n wrapperEl,\n enabled,\n } = swiper;\n\n if (\n (swiper.animating && params.preventInteractionOnTransition) ||\n (!enabled && !internal && !initial)\n ) {\n return false;\n }\n\n const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n const translate = -snapGrid[snapIndex];\n\n // Update progress\n swiper.updateProgress(translate);\n\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n const normalizedTranslate = -Math.floor(translate * 100);\n const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2\n ) {\n slideIndex = i;\n } else if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext\n ) {\n slideIndex = i + 1;\n }\n } else if (normalizedTranslate >= normalizedGrid) {\n slideIndex = i;\n }\n }\n }\n // Directions locks\n if (swiper.initialized && slideIndex !== activeIndex) {\n if (\n !swiper.allowSlideNext &&\n translate < swiper.translate &&\n translate < swiper.minTranslate()\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n translate > swiper.translate &&\n translate > swiper.maxTranslate()\n ) {\n if ((activeIndex || 0) !== slideIndex) return false;\n }\n }\n\n let direction;\n if (slideIndex > activeIndex) direction = 'next';\n else if (slideIndex < activeIndex) direction = 'prev';\n else direction = 'reset';\n\n // Update Index\n if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n if (direction !== 'reset') {\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n }\n return false;\n }\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n const t = rtl ? translate : -translate;\n if (speed === 0) {\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n if (isVirtual) {\n swiper.wrapperEl.style.scrollSnapType = 'none';\n swiper._immediateVirtual = true;\n }\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n if (isVirtual) {\n requestAnimationFrame(() => {\n swiper.wrapperEl.style.scrollSnapType = '';\n swiper._swiperImmediateVirtual = false;\n });\n }\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: t, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: t,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onSlideToWrapperTransitionEnd) {\n swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.onSlideToWrapperTransitionEnd = null;\n delete swiper.onSlideToWrapperTransitionEnd;\n swiper.transitionEnd(runCallbacks, direction);\n };\n }\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","export default function slideToLoop(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n) {\n const swiper = this;\n let newIndex = index;\n if (swiper.params.loop) {\n newIndex += swiper.loopedSlides;\n }\n\n return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { animating, enabled, params } = swiper;\n if (!enabled) return swiper;\n let perGroup = params.slidesPerGroup;\n if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n }\n const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { params, animating, snapGrid, slidesGrid, rtlTranslate, enabled } = swiper;\n if (!enabled) return swiper;\n\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n function normalize(val) {\n if (val < 0) return -Math.floor(Math.abs(val));\n return Math.floor(val);\n }\n const normalizedTranslate = normalize(translate);\n const normalizedSnapGrid = snapGrid.map((val) => normalize(val));\n\n let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n if (typeof prevSnap === 'undefined' && params.cssMode) {\n let prevSnapIndex;\n snapGrid.forEach((snap, snapIndex) => {\n if (normalizedTranslate >= snap) {\n // prevSnap = snap;\n prevSnapIndex = snapIndex;\n }\n });\n if (typeof prevSnapIndex !== 'undefined') {\n prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n }\n }\n let prevIndex = 0;\n if (typeof prevSnap !== 'undefined') {\n prevIndex = slidesGrid.indexOf(prevSnap);\n if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n if (\n params.slidesPerView === 'auto' &&\n params.slidesPerGroup === 1 &&\n params.slidesPerGroupAuto\n ) {\n prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n prevIndex = Math.max(prevIndex, 0);\n }\n }\n return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n threshold = 0.5,\n) {\n const swiper = this;\n let index = swiper.activeIndex;\n const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n if (translate >= swiper.snapGrid[snapIndex]) {\n // The current translate is on or after the current snap index, so the choice\n // is between the current index and the one after it.\n const currentSnap = swiper.snapGrid[snapIndex];\n const nextSnap = swiper.snapGrid[snapIndex + 1];\n if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n index += swiper.params.slidesPerGroup;\n }\n } else {\n // The current translate is before the current snap index, so the choice\n // is between the current index and the one before it.\n const prevSnap = swiper.snapGrid[snapIndex - 1];\n const currentSnap = swiper.snapGrid[snapIndex];\n if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n index -= swiper.params.slidesPerGroup;\n }\n }\n index = Math.max(index, 0);\n index = Math.min(index, swiper.slidesGrid.length - 1);\n\n return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function slideToClickedSlide() {\n const swiper = this;\n const { params, $wrapperEl } = swiper;\n\n const slidesPerView =\n params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n let slideToIndex = swiper.clickedIndex;\n let realIndex;\n if (params.loop) {\n if (swiper.animating) return;\n realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (\n slideToIndex < swiper.loopedSlides - slidesPerView / 2 ||\n slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2\n ) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n}\n","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\n\nexport default {\n slideTo,\n slideToLoop,\n slideNext,\n slidePrev,\n slideReset,\n slideToClosest,\n slideToClickedSlide,\n};\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loopCreate() {\n const swiper = this;\n const document = getDocument();\n const { params, $wrapperEl } = swiper;\n // Remove duplicated slides\n const $selector = $($wrapperEl.children()[0].parentNode);\n $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n\n let slides = $selector.children(`.${params.slideClass}`);\n\n if (params.loopFillGroupWithBlank) {\n const blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n if (blankSlidesNum !== params.slidesPerGroup) {\n for (let i = 0; i < blankSlidesNum; i += 1) {\n const blankNode = $(document.createElement('div')).addClass(\n `${params.slideClass} ${params.slideBlankClass}`,\n );\n $selector.append(blankNode);\n }\n slides = $selector.children(`.${params.slideClass}`);\n }\n }\n\n if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n\n swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n swiper.loopedSlides += params.loopAdditionalSlides;\n if (swiper.loopedSlides > slides.length) {\n swiper.loopedSlides = slides.length;\n }\n\n const prependSlides = [];\n const appendSlides = [];\n slides.each((el, index) => {\n const slide = $(el);\n if (index < swiper.loopedSlides) {\n appendSlides.push(el);\n }\n if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n prependSlides.push(el);\n }\n slide.attr('data-swiper-slide-index', index);\n });\n for (let i = 0; i < appendSlides.length; i += 1) {\n $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n}\n","export default function loopFix() {\n const swiper = this;\n\n swiper.emit('beforeLoopFix');\n\n const {\n activeIndex,\n slides,\n loopedSlides,\n allowSlidePrev,\n allowSlideNext,\n snapGrid,\n rtlTranslate: rtl,\n } = swiper;\n let newIndex;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n\n const snapTranslate = -snapGrid[activeIndex];\n const diff = snapTranslate - swiper.getTranslate();\n\n // Fix For Negative Oversliding\n if (activeIndex < loopedSlides) {\n newIndex = slides.length - loopedSlides * 3 + activeIndex;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n } else if (activeIndex >= slides.length - loopedSlides) {\n // Fix For Positive Oversliding\n newIndex = -slides.length + activeIndex + loopedSlides;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n swiper.emit('loopFix');\n}\n","export default function loopDestroy() {\n const swiper = this;\n const { $wrapperEl, params, slides } = swiper;\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`,\n )\n .remove();\n slides.removeAttr('data-swiper-slide-index');\n}\n","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\n\nexport default {\n loopCreate,\n loopFix,\n loopDestroy,\n};\n","export default function setGrabCursor(moving) {\n const swiper = this;\n if (\n swiper.support.touch ||\n !swiper.params.simulateTouch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n )\n return;\n const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n el.style.cursor = 'move';\n el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n}\n","export default function unsetGrabCursor() {\n const swiper = this;\n if (\n swiper.support.touch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n ) {\n return;\n }\n swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}\n","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\n\nexport default {\n setGrabCursor,\n unsetGrabCursor,\n};\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base = this) {\n function __closestFrom(el) {\n if (!el || el === getDocument() || el === getWindow()) return null;\n if (el.assignedSlot) el = el.assignedSlot;\n const found = el.closest(selector);\n return found || __closestFrom(el.getRootNode().host);\n }\n return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n const swiper = this;\n const document = getDocument();\n const window = getWindow();\n\n const data = swiper.touchEventsData;\n const { params, touches, enabled } = swiper;\n if (!enabled) return;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return;\n }\n if (!swiper.animating && params.cssMode && params.loop) {\n swiper.loopFix();\n }\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n let $targetEl = $(e.target);\n\n if (params.touchEventsTarget === 'wrapper') {\n if (!$targetEl.closest(swiper.wrapperEl).length) return;\n }\n data.isTouchEvent = e.type === 'touchstart';\n if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n if (data.isTouched && data.isMoved) return;\n\n // change target el for shadow root component\n const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n $targetEl = $(event.path[0]);\n }\n\n const noSwipingSelector = params.noSwipingSelector\n ? params.noSwipingSelector\n : `.${params.noSwipingClass}`;\n const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n // use closestElement for shadow root element to get the actual closest for nested shadow root element\n if (\n params.noSwiping &&\n (isTargetShadow\n ? closestElement(noSwipingSelector, e.target)\n : $targetEl.closest(noSwipingSelector)[0])\n ) {\n swiper.allowClick = true;\n return;\n }\n\n if (params.swipeHandler) {\n if (!$targetEl.closest(params.swipeHandler)[0]) return;\n }\n\n touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n const startX = touches.currentX;\n const startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n if (\n edgeSwipeDetection &&\n (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)\n ) {\n if (edgeSwipeDetection === 'prevent') {\n event.preventDefault();\n } else {\n return;\n }\n }\n\n Object.assign(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined,\n });\n\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) data.allowThresholdMove = false;\n if (e.type !== 'touchstart') {\n let preventDefault = true;\n if ($targetEl.is(data.focusableElements)) preventDefault = false;\n if (\n document.activeElement &&\n $(document.activeElement).is(data.focusableElements) &&\n document.activeElement !== $targetEl[0]\n ) {\n document.activeElement.blur();\n }\n\n const shouldPreventDefault =\n preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n if (\n (params.touchStartForcePreventDefault || shouldPreventDefault) &&\n !$targetEl[0].isContentEditable\n ) {\n e.preventDefault();\n }\n }\n swiper.emit('touchStart', e);\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\nexport default function onTouchMove(event) {\n const document = getDocument();\n const swiper = this;\n const data = swiper.touchEventsData;\n const { params, touches, rtlTranslate: rtl, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (!data.isTouched) {\n if (data.startMoving && data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n return;\n }\n if (data.isTouchEvent && e.type !== 'touchmove') return;\n const targetTouch =\n e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n // isMoved = true;\n swiper.allowClick = false;\n if (data.isTouched) {\n Object.assign(touches, {\n startX: pageX,\n startY: pageY,\n currentX: pageX,\n currentY: pageY,\n });\n data.touchStartTime = now();\n }\n return;\n }\n if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (\n (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) ||\n (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n ) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (\n (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) ||\n (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n ) {\n return;\n }\n }\n if (data.isTouchEvent && document.activeElement) {\n if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) return;\n\n touches.currentX = pageX;\n touches.currentY = pageY;\n\n const diffX = touches.currentX - touches.startX;\n const diffY = touches.currentY - touches.startY;\n if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold)\n return;\n\n if (typeof data.isScrolling === 'undefined') {\n let touchAngle;\n if (\n (swiper.isHorizontal() && touches.currentY === touches.startY) ||\n (swiper.isVertical() && touches.currentX === touches.startX)\n ) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if (diffX * diffX + diffY * diffY >= 25) {\n touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n data.isScrolling = swiper.isHorizontal()\n ? touchAngle > params.touchAngle\n : 90 - touchAngle > params.touchAngle;\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof data.startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (data.isScrolling) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n if (!params.cssMode && e.cancelable) {\n e.preventDefault();\n }\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n\n if (!data.isMoved) {\n if (params.loop && !params.cssMode) {\n swiper.loopFix();\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n\n let diff = swiper.isHorizontal() ? diffX : diffY;\n touches.diff = diff;\n\n diff *= params.touchRatio;\n if (rtl) diff = -diff;\n\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n data.currentTranslate = diff + data.startTranslate;\n\n let disableParentSwiper = true;\n let resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.minTranslate() -\n 1 +\n (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.maxTranslate() +\n 1 -\n (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n }\n\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n swiper.swipeDirection === 'next' &&\n data.currentTranslate < data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (\n !swiper.allowSlidePrev &&\n swiper.swipeDirection === 'prev' &&\n data.currentTranslate > data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n data.currentTranslate = data.startTranslate;\n }\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal()\n ? touches.currentX - touches.startX\n : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n\n if (!params.followFinger || params.cssMode) return;\n\n // Update active index in free mode\n if (\n (params.freeMode && params.freeMode.enabled && swiper.freeMode) ||\n params.watchSlidesProgress\n ) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n swiper.freeMode.onTouchMove();\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n}\n","import { now, nextTick } from '../../shared/utils.js';\n\nexport default function onTouchEnd(event) {\n const swiper = this;\n const data = swiper.touchEventsData;\n\n const { params, touches, rtlTranslate: rtl, slidesGrid, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) {\n if (data.isMoved && params.grabCursor) {\n swiper.setGrabCursor(false);\n }\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n // Return Grab Cursor\n if (\n params.grabCursor &&\n data.isMoved &&\n data.isTouched &&\n (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)\n ) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n swiper.updateClickedSlide(e);\n swiper.emit('tap click', e);\n if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n swiper.emit('doubleTap doubleClick', e);\n }\n }\n\n data.lastClickTime = now();\n nextTick(() => {\n if (!swiper.destroyed) swiper.allowClick = true;\n });\n\n if (\n !data.isTouched ||\n !data.isMoved ||\n !swiper.swipeDirection ||\n touches.diff === 0 ||\n data.currentTranslate === data.startTranslate\n ) {\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n\n let currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n\n if (params.cssMode) {\n return;\n }\n\n if (swiper.params.freeMode && params.freeMode.enabled) {\n swiper.freeMode.onTouchEnd({ currentPos });\n return;\n }\n\n // Find current slide\n let stopIndex = 0;\n let groupSize = swiper.slidesSizesGrid[0];\n for (\n let i = 0;\n i < slidesGrid.length;\n i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup\n ) {\n const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n if (typeof slidesGrid[i + increment] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n stopIndex = i;\n groupSize = slidesGrid[i + increment] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n\n // Find current slide size\n const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n const isNavButtonTarget =\n swiper.navigation &&\n (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n if (!isNavButtonTarget) {\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(stopIndex + increment);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(stopIndex);\n }\n } else if (e.target === swiper.navigation.nextEl) {\n swiper.slideTo(stopIndex + increment);\n } else {\n swiper.slideTo(stopIndex);\n }\n }\n}\n","export default function onResize() {\n const swiper = this;\n\n const { params, el } = swiper;\n\n if (el && el.offsetWidth === 0) return;\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n const { allowSlideNext, allowSlidePrev, snapGrid } = swiper;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n\n swiper.updateSize();\n swiper.updateSlides();\n\n swiper.updateSlidesClasses();\n if (\n (params.slidesPerView === 'auto' || params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.isBeginning &&\n !swiper.params.centeredSlides\n ) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n\n if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n swiper.autoplay.run();\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n}\n","export default function onClick(e) {\n const swiper = this;\n if (!swiper.enabled) return;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) e.preventDefault();\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n}\n","export default function onScroll() {\n const swiper = this;\n const { wrapperEl, rtlTranslate, enabled } = swiper;\n if (!enabled) return;\n swiper.previousTranslate = swiper.translate;\n if (swiper.isHorizontal()) {\n swiper.translate = -wrapperEl.scrollLeft;\n } else {\n swiper.translate = -wrapperEl.scrollTop;\n }\n // eslint-disable-next-line\n if (swiper.translate === -0) swiper.translate = 0;\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== swiper.progress) {\n swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, false);\n}\n","import { getDocument } from 'ssr-window';\n\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\n\nlet dummyEventAttached = false;\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n const document = getDocument();\n const { params, touchEvents, el, wrapperEl, device, support } = swiper;\n const capture = !!params.nested;\n const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n const swiperMethod = method;\n\n // Touch Events\n if (!support.touch) {\n el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n } else {\n const passiveListener =\n touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n el[domMethod](\n touchEvents.move,\n swiper.onTouchMove,\n support.passiveListener ? { passive: false, capture } : capture,\n );\n el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n if (touchEvents.cancel) {\n el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n el[domMethod]('click', swiper.onClick, true);\n }\n if (params.cssMode) {\n wrapperEl[domMethod]('scroll', swiper.onScroll);\n }\n\n // Resize handler\n if (params.updateOnWindowResize) {\n swiper[swiperMethod](\n device.ios || device.android\n ? 'resize orientationchange observerUpdate'\n : 'resize observerUpdate',\n onResize,\n true,\n );\n } else {\n swiper[swiperMethod]('observerUpdate', onResize, true);\n }\n};\n\nfunction attachEvents() {\n const swiper = this;\n const document = getDocument();\n const { params, support } = swiper;\n\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n if (params.cssMode) {\n swiper.onScroll = onScroll.bind(swiper);\n }\n\n swiper.onClick = onClick.bind(swiper);\n\n if (support.touch && !dummyEventAttached) {\n document.addEventListener('touchstart', dummyEventListener);\n dummyEventAttached = true;\n }\n\n events(swiper, 'on');\n}\n\nfunction detachEvents() {\n const swiper = this;\n events(swiper, 'off');\n}\n\nexport default {\n attachEvents,\n detachEvents,\n};\n","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n const swiper = this;\n const { activeIndex, initialized, loopedSlides = 0, params, $el } = swiper;\n const breakpoints = params.breakpoints;\n if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) return;\n\n // Get breakpoint for window width and update parameters\n const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n\n if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n\n const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n const wasMultiRow = isGridEnabled(swiper, params);\n const isMultiRow = isGridEnabled(swiper, breakpointParams);\n\n const wasEnabled = params.enabled;\n\n if (wasMultiRow && !isMultiRow) {\n $el.removeClass(\n `${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`,\n );\n swiper.emitContainerClasses();\n } else if (!wasMultiRow && isMultiRow) {\n $el.addClass(`${params.containerModifierClass}grid`);\n if (\n (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column') ||\n (!breakpointParams.grid.fill && params.grid.fill === 'column')\n ) {\n $el.addClass(`${params.containerModifierClass}grid-column`);\n }\n swiper.emitContainerClasses();\n }\n\n const directionChanged =\n breakpointParams.direction && breakpointParams.direction !== params.direction;\n const needsReLoop =\n params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n if (directionChanged && initialized) {\n swiper.changeDirection();\n }\n extend(swiper.params, breakpointParams);\n\n const isEnabled = swiper.params.enabled;\n\n Object.assign(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n });\n\n if (wasEnabled && !isEnabled) {\n swiper.disable();\n } else if (!wasEnabled && isEnabled) {\n swiper.enable();\n }\n\n swiper.currentBreakpoint = breakpoint;\n\n swiper.emit('_beforeBreakpoint', breakpointParams);\n\n if (needsReLoop && initialized) {\n swiper.loopDestroy();\n swiper.loopCreate();\n swiper.updateSlides();\n swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n }\n\n swiper.emit('breakpoint', breakpointParams);\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n if (!breakpoints || (base === 'container' && !containerEl)) return undefined;\n let breakpoint = false;\n\n const window = getWindow();\n const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n\n const points = Object.keys(breakpoints).map((point) => {\n if (typeof point === 'string' && point.indexOf('@') === 0) {\n const minRatio = parseFloat(point.substr(1));\n const value = currentHeight * minRatio;\n return { value, point };\n }\n return { value: point, point };\n });\n\n points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n for (let i = 0; i < points.length; i += 1) {\n const { point, value } = points[i];\n if (base === 'window') {\n if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n breakpoint = point;\n }\n } else if (value <= containerEl.clientWidth) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n}\n","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\n\nexport default { setBreakpoint, getBreakpoint };\n","function prepareClasses(entries, prefix) {\n const resultClasses = [];\n entries.forEach((item) => {\n if (typeof item === 'object') {\n Object.keys(item).forEach((classNames) => {\n if (item[classNames]) {\n resultClasses.push(prefix + classNames);\n }\n });\n } else if (typeof item === 'string') {\n resultClasses.push(prefix + item);\n }\n });\n return resultClasses;\n}\n\nexport default function addClasses() {\n const swiper = this;\n const { classNames, params, rtl, $el, device, support } = swiper;\n // prettier-ignore\n const suffixes = prepareClasses([\n 'initialized',\n params.direction,\n { 'pointer-events': !support.touch },\n { 'free-mode': swiper.params.freeMode && params.freeMode.enabled },\n { 'autoheight': params.autoHeight },\n { 'rtl': rtl },\n { 'grid': params.grid && params.grid.rows > 1 },\n { 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' },\n { 'android': device.android },\n { 'ios': device.ios },\n { 'css-mode': params.cssMode },\n { 'centered': params.cssMode && params.centeredSlides },\n ], params.containerModifierClass);\n classNames.push(...suffixes);\n $el.addClass([...classNames].join(' '));\n swiper.emitContainerClasses();\n}\n","export default function removeClasses() {\n const swiper = this;\n const { $el, classNames } = swiper;\n\n $el.removeClass(classNames.join(' '));\n swiper.emitContainerClasses();\n}\n","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\n\nexport default { addClasses, removeClasses };\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n const window = getWindow();\n let image;\n function onReady() {\n if (callback) callback();\n }\n const isPicture = $(imageEl).parent('picture')[0];\n\n if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n if (src) {\n image = new window.Image();\n image.onload = onReady;\n image.onerror = onReady;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcset) {\n image.srcset = srcset;\n }\n if (src) {\n image.src = src;\n }\n } else {\n onReady();\n }\n } else {\n // image already loaded...\n onReady();\n }\n}\n","export default function preloadImages() {\n const swiper = this;\n swiper.imagesToLoad = swiper.$el.find('img');\n function onReady() {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n if (swiper.params.updateOnImagesReady) swiper.update();\n swiper.emit('imagesReady');\n }\n }\n for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n const imageEl = swiper.imagesToLoad[i];\n swiper.loadImage(\n imageEl,\n imageEl.currentSrc || imageEl.getAttribute('src'),\n imageEl.srcset || imageEl.getAttribute('srcset'),\n imageEl.sizes || imageEl.getAttribute('sizes'),\n true,\n onReady,\n );\n }\n}\n","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\n\nexport default {\n loadImage,\n preloadImages,\n};\n","function checkOverflow() {\n const swiper = this;\n const { isLocked: wasLocked, params } = swiper;\n const { slidesOffsetBefore } = params;\n\n if (slidesOffsetBefore) {\n const lastSlideIndex = swiper.slides.length - 1;\n const lastSlideRightEdge =\n swiper.slidesGrid[lastSlideIndex] +\n swiper.slidesSizesGrid[lastSlideIndex] +\n slidesOffsetBefore * 2;\n swiper.isLocked = swiper.size > lastSlideRightEdge;\n } else {\n swiper.isLocked = swiper.snapGrid.length === 1;\n }\n if (params.allowSlideNext === true) {\n swiper.allowSlideNext = !swiper.isLocked;\n }\n if (params.allowSlidePrev === true) {\n swiper.allowSlidePrev = !swiper.isLocked;\n }\n\n if (wasLocked && wasLocked !== swiper.isLocked) {\n swiper.isEnd = false;\n }\n if (wasLocked !== swiper.isLocked) {\n swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n }\n}\n\nexport default { checkOverflow };\n","export default {\n init: true,\n direction: 'horizontal',\n touchEventsTarget: 'wrapper',\n initialSlide: 0,\n speed: 300,\n cssMode: false,\n updateOnWindowResize: true,\n resizeObserver: true,\n nested: false,\n createElements: false,\n enabled: true,\n focusableElements: 'input, select, option, textarea, button, video, label',\n\n // Overrides\n width: null,\n height: null,\n\n //\n preventInteractionOnTransition: false,\n\n // ssr\n userAgent: null,\n url: null,\n\n // To support iOS's swipe-to-go-back gesture (when being used in-app).\n edgeSwipeDetection: false,\n edgeSwipeThreshold: 20,\n\n // Autoheight\n autoHeight: false,\n\n // Set wrapper width\n setWrapperSize: false,\n\n // Virtual Translate\n virtualTranslate: false,\n\n // Effects\n effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n breakpointsBase: 'window',\n\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerGroup: 1,\n slidesPerGroupSkip: 0,\n slidesPerGroupAuto: false,\n centeredSlides: false,\n centeredSlidesBounds: false,\n slidesOffsetBefore: 0, // in px\n slidesOffsetAfter: 0, // in px\n normalizeSlideIndex: true,\n centerInsufficientSlides: false,\n\n // Disable swiper and hide navigation when container not overflow\n watchOverflow: true,\n\n // Round length\n roundLengths: false,\n\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 0,\n touchMoveStopPropagation: false,\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchReleaseOnEdges: false,\n\n // Unique Navigation Elements\n uniqueNavElements: true,\n\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n\n // Progress\n watchSlidesProgress: false,\n\n // Cursor\n grabCursor: false,\n\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n\n // Images\n preloadImages: true,\n updateOnImagesReady: true,\n\n // loop\n loop: false,\n loopAdditionalSlides: 0,\n loopedSlides: null,\n loopFillGroupWithBlank: false,\n loopPreventsSlide: true,\n\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null, // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n noSwipingSelector: null,\n\n // Passive Listeners\n passiveListeners: true,\n\n // NS\n containerModifierClass: 'swiper-', // NEW\n slideClass: 'swiper-slide',\n slideBlankClass: 'swiper-slide-invisible-blank',\n slideActiveClass: 'swiper-slide-active',\n slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideDuplicateClass: 'swiper-slide-duplicate',\n slideNextClass: 'swiper-slide-next',\n slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n slidePrevClass: 'swiper-slide-prev',\n slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n wrapperClass: 'swiper-wrapper',\n\n // Callbacks\n runCallbacksOnInit: true,\n\n // Internals\n _emitClasses: false,\n};\n","import { extend } from '../shared/utils.js';\n\nexport default function moduleExtendParams(params, allModulesParams) {\n return function extendParams(obj = {}) {\n const moduleParamName = Object.keys(obj)[0];\n const moduleParams = obj[moduleParamName];\n if (typeof moduleParams !== 'object' || moduleParams === null) {\n extend(allModulesParams, obj);\n return;\n }\n if (\n ['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 &&\n params[moduleParamName] === true\n ) {\n params[moduleParamName] = { auto: true };\n }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n extend(allModulesParams, obj);\n return;\n }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = { enabled: true };\n }\n if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) params[moduleParamName] = { enabled: false };\n extend(allModulesParams, obj);\n };\n}\n","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\n\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\n\nimport eventsEmitter from './events-emitter.js';\n\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\n\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\n\nconst prototypes = {\n eventsEmitter,\n update,\n translate,\n transition,\n slide,\n loop,\n grabCursor,\n events,\n breakpoints,\n checkOverflow,\n classes,\n images,\n};\n\nconst extendedDefaults = {};\n\nclass Swiper {\n constructor(...args) {\n let el;\n let params;\n if (\n args.length === 1 &&\n args[0].constructor &&\n Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object'\n ) {\n params = args[0];\n } else {\n [el, params] = args;\n }\n if (!params) params = {};\n\n params = extend({}, params);\n if (el && !params.el) params.el = el;\n\n if (params.el && $(params.el).length > 1) {\n const swipers = [];\n $(params.el).each((containerEl) => {\n const newParams = extend({}, params, { el: containerEl });\n swipers.push(new Swiper(newParams));\n });\n return swipers;\n }\n\n // Swiper Instance\n const swiper = this;\n swiper.__swiper__ = true;\n swiper.support = getSupport();\n swiper.device = getDevice({ userAgent: params.userAgent });\n swiper.browser = getBrowser();\n\n swiper.eventsListeners = {};\n swiper.eventsAnyListeners = [];\n swiper.modules = [...swiper.__modules__];\n if (params.modules && Array.isArray(params.modules)) {\n swiper.modules.push(...params.modules);\n }\n\n const allModulesParams = {};\n\n swiper.modules.forEach((mod) => {\n mod({\n swiper,\n extendParams: moduleExtendParams(params, allModulesParams),\n on: swiper.on.bind(swiper),\n once: swiper.once.bind(swiper),\n off: swiper.off.bind(swiper),\n emit: swiper.emit.bind(swiper),\n });\n });\n\n // Extend defaults with modules params\n const swiperParams = extend({}, defaults, allModulesParams);\n\n // Extend defaults with passed params\n swiper.params = extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = extend({}, swiper.params);\n swiper.passedParams = extend({}, params);\n\n // add event listeners\n if (swiper.params && swiper.params.on) {\n Object.keys(swiper.params.on).forEach((eventName) => {\n swiper.on(eventName, swiper.params.on[eventName]);\n });\n }\n if (swiper.params && swiper.params.onAny) {\n swiper.onAny(swiper.params.onAny);\n }\n\n // Save Dom lib\n swiper.$ = $;\n\n // Extend Swiper\n Object.assign(swiper, {\n enabled: swiper.params.enabled,\n el,\n\n // Classes\n classNames: [],\n\n // Slides\n slides: $(),\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n\n // isDirection\n isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical() {\n return swiper.params.direction === 'vertical';\n },\n\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n\n //\n isBeginning: true,\n isEnd: false,\n\n // Props\n translate: 0,\n previousTranslate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n\n // Touch Events\n touchEvents: (function touchEvents() {\n const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n\n swiper.touchEventsTouch = {\n start: touch[0],\n move: touch[1],\n end: touch[2],\n cancel: touch[3],\n };\n swiper.touchEventsDesktop = {\n start: desktop[0],\n move: desktop[1],\n end: desktop[2],\n };\n return swiper.support.touch || !swiper.params.simulateTouch\n ? swiper.touchEventsTouch\n : swiper.touchEventsDesktop;\n })(),\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n focusableElements: swiper.params.focusableElements,\n // Last click time\n lastClickTime: now(),\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n isTouchEvent: undefined,\n startMoving: undefined,\n },\n\n // Clicks\n allowClick: true,\n\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0,\n },\n\n // Images\n imagesToLoad: [],\n imagesLoaded: 0,\n });\n\n swiper.emit('_swiper');\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n return swiper;\n }\n\n enable() {\n const swiper = this;\n if (swiper.enabled) return;\n swiper.enabled = true;\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n swiper.emit('enable');\n }\n\n disable() {\n const swiper = this;\n if (!swiper.enabled) return;\n swiper.enabled = false;\n if (swiper.params.grabCursor) {\n swiper.unsetGrabCursor();\n }\n swiper.emit('disable');\n }\n\n setProgress(progress, speed) {\n const swiper = this;\n progress = Math.min(Math.max(progress, 0), 1);\n const min = swiper.minTranslate();\n const max = swiper.maxTranslate();\n const current = (max - min) * progress + min;\n swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n\n emitContainerClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const cls = swiper.el.className.split(' ').filter((className) => {\n return (\n className.indexOf('swiper') === 0 ||\n className.indexOf(swiper.params.containerModifierClass) === 0\n );\n });\n swiper.emit('_containerClasses', cls.join(' '));\n }\n\n getSlideClasses(slideEl) {\n const swiper = this;\n\n return slideEl.className\n .split(' ')\n .filter((className) => {\n return (\n className.indexOf('swiper-slide') === 0 ||\n className.indexOf(swiper.params.slideClass) === 0\n );\n })\n .join(' ');\n }\n\n emitSlidesClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const updates = [];\n swiper.slides.each((slideEl) => {\n const classNames = swiper.getSlideClasses(slideEl);\n updates.push({ slideEl, classNames });\n swiper.emit('_slideClass', slideEl, classNames);\n });\n swiper.emit('_slideClasses', updates);\n }\n\n slidesPerViewDynamic(view = 'current', exact = false) {\n const swiper = this;\n const { params, slides, slidesGrid, slidesSizesGrid, size: swiperSize, activeIndex } = swiper;\n let spv = 1;\n if (params.centeredSlides) {\n let slideSize = slides[activeIndex].swiperSlideSize;\n let breakLoop;\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n } else {\n // eslint-disable-next-line\n if (view === 'current') {\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n const slideInView = exact\n ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize\n : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n } else {\n // previous\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n }\n }\n return spv;\n }\n\n update() {\n const swiper = this;\n if (!swiper || swiper.destroyed) return;\n const { snapGrid, params } = swiper;\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n\n function setTranslate() {\n const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n const newTranslate = Math.min(\n Math.max(translateValue, swiper.maxTranslate()),\n swiper.minTranslate(),\n );\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n let translated;\n if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n setTranslate();\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if (\n (swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.params.centeredSlides\n ) {\n translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n swiper.emit('update');\n }\n\n changeDirection(newDirection, needUpdate = true) {\n const swiper = this;\n const currentDirection = swiper.params.direction;\n if (!newDirection) {\n // eslint-disable-next-line\n newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n }\n if (\n newDirection === currentDirection ||\n (newDirection !== 'horizontal' && newDirection !== 'vertical')\n ) {\n return swiper;\n }\n\n swiper.$el\n .removeClass(`${swiper.params.containerModifierClass}${currentDirection}`)\n .addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n swiper.emitContainerClasses();\n\n swiper.params.direction = newDirection;\n\n swiper.slides.each((slideEl) => {\n if (newDirection === 'vertical') {\n slideEl.style.width = '';\n } else {\n slideEl.style.height = '';\n }\n });\n\n swiper.emit('changeDirection');\n if (needUpdate) swiper.update();\n\n return swiper;\n }\n\n mount(el) {\n const swiper = this;\n if (swiper.mounted) return true;\n\n // Find el\n const $el = $(el || swiper.params.el);\n el = $el[0];\n\n if (!el) {\n return false;\n }\n\n el.swiper = swiper;\n\n const getWrapperSelector = () => {\n return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n };\n\n const getWrapper = () => {\n if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n const res = $(el.shadowRoot.querySelector(getWrapperSelector()));\n // Children needs to return slot items\n res.children = (options) => $el.children(options);\n return res;\n }\n return $el.children(getWrapperSelector());\n };\n // Find Wrapper\n let $wrapperEl = getWrapper();\n if ($wrapperEl.length === 0 && swiper.params.createElements) {\n const document = getDocument();\n const wrapper = document.createElement('div');\n $wrapperEl = $(wrapper);\n wrapper.className = swiper.params.wrapperClass;\n $el.append(wrapper);\n $el.children(`.${swiper.params.slideClass}`).each((slideEl) => {\n $wrapperEl.append(slideEl);\n });\n }\n\n Object.assign(swiper, {\n $el,\n el,\n $wrapperEl,\n wrapperEl: $wrapperEl[0],\n mounted: true,\n\n // RTL\n rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n rtlTranslate:\n swiper.params.direction === 'horizontal' &&\n (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n });\n\n return true;\n }\n\n init(el) {\n const swiper = this;\n if (swiper.initialized) return swiper;\n\n const mounted = swiper.mount(el);\n if (mounted === false) return swiper;\n\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n\n if (swiper.params.watchOverflow) {\n swiper.checkOverflow();\n }\n\n // Set Grab Cursor\n if (swiper.params.grabCursor && swiper.enabled) {\n swiper.setGrabCursor();\n }\n\n if (swiper.params.preloadImages) {\n swiper.preloadImages();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop) {\n swiper.slideTo(\n swiper.params.initialSlide + swiper.loopedSlides,\n 0,\n swiper.params.runCallbacksOnInit,\n false,\n true,\n );\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n }\n\n // Attach events\n swiper.attachEvents();\n\n // Init Flag\n swiper.initialized = true;\n\n // Emit\n swiper.emit('init');\n swiper.emit('afterInit');\n\n return swiper;\n }\n\n destroy(deleteInstance = true, cleanStyles = true) {\n const swiper = this;\n const { params, $el, $wrapperEl, slides } = swiper;\n\n if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n return null;\n }\n\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n $el.removeAttr('style');\n $wrapperEl.removeAttr('style');\n if (slides && slides.length) {\n slides\n .removeClass(\n [\n params.slideVisibleClass,\n params.slideActiveClass,\n params.slideNextClass,\n params.slidePrevClass,\n ].join(' '),\n )\n .removeAttr('style')\n .removeAttr('data-swiper-slide-index');\n }\n }\n\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach((eventName) => {\n swiper.off(eventName);\n });\n\n if (deleteInstance !== false) {\n swiper.$el[0].swiper = null;\n deleteProps(swiper);\n }\n swiper.destroyed = true;\n\n return null;\n }\n\n static extendDefaults(newDefaults) {\n extend(extendedDefaults, newDefaults);\n }\n\n static get extendedDefaults() {\n return extendedDefaults;\n }\n\n static get defaults() {\n return defaults;\n }\n\n static installModule(mod) {\n if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n const modules = Swiper.prototype.__modules__;\n\n if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n modules.push(mod);\n }\n }\n\n static use(module) {\n if (Array.isArray(module)) {\n module.forEach((m) => Swiper.installModule(m));\n return Swiper;\n }\n Swiper.installModule(module);\n return Swiper;\n }\n}\n\nObject.keys(prototypes).forEach((prototypeGroup) => {\n Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n });\n});\n\nSwiper.use([Resize, Observer]);\n\nexport default Swiper;\n","import $ from '../../shared/dom.js';\nimport { setCSSProperty } from '../../shared/utils.js';\n\nexport default function Virtual({ swiper, extendParams, on }) {\n extendParams({\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n renderExternalUpdate: true,\n addSlidesBefore: 0,\n addSlidesAfter: 0,\n },\n });\n\n let cssModeTimeout;\n\n swiper.virtual = {\n cache: {},\n from: undefined,\n to: undefined,\n slides: [],\n offset: 0,\n slidesGrid: [],\n };\n\n function renderSlide(slide, index) {\n const params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n const $slideEl = params.renderSlide\n ? $(params.renderSlide.call(swiper, slide, index))\n : $(\n `
${slide}
`,\n );\n if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);\n if (params.cache) swiper.virtual.cache[index] = $slideEl;\n return $slideEl;\n }\n\n function update(force) {\n const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params;\n const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual;\n const {\n from: previousFrom,\n to: previousTo,\n slides,\n slidesGrid: previousSlidesGrid,\n offset: previousOffset,\n } = swiper.virtual;\n if (!swiper.params.cssMode) {\n swiper.updateActiveIndex();\n }\n\n const activeIndex = swiper.activeIndex || 0;\n\n let offsetProp;\n if (swiper.rtlTranslate) offsetProp = 'right';\n else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n\n let slidesAfter;\n let slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;\n slidesBefore = slidesPerGroup + addSlidesBefore;\n }\n const from = Math.max((activeIndex || 0) - slidesBefore, 0);\n const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n Object.assign(swiper.virtual, {\n from,\n to,\n offset,\n slidesGrid: swiper.slidesGrid,\n });\n\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.lazy && swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n }\n\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.css(offsetProp, `${offset}px`);\n }\n swiper.updateProgress();\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset,\n from,\n to,\n slides: (function getSlides() {\n const slidesToRender = [];\n for (let i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n })(),\n });\n if (swiper.params.virtual.renderExternalUpdate) {\n onRendered();\n }\n return;\n }\n const prependIndexes = [];\n const appendIndexes = [];\n if (force) {\n swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove();\n } else {\n for (let i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n swiper.$wrapperEl\n .find(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${i}\"]`)\n .remove();\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n if (i >= from && i <= to) {\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(i);\n } else {\n if (i > previousTo) appendIndexes.push(i);\n if (i < previousFrom) prependIndexes.push(i);\n }\n }\n }\n appendIndexes.forEach((index) => {\n swiper.$wrapperEl.append(renderSlide(slides[index], index));\n });\n prependIndexes\n .sort((a, b) => b - a)\n .forEach((index) => {\n swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n });\n swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`);\n onRendered();\n }\n\n function appendSlide(slides) {\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.push(slides[i]);\n }\n } else {\n swiper.virtual.slides.push(slides);\n }\n update(true);\n }\n function prependSlide(slides) {\n const activeIndex = swiper.activeIndex;\n let newActiveIndex = activeIndex + 1;\n let numberOfNewSlides = 1;\n\n if (Array.isArray(slides)) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n numberOfNewSlides = slides.length;\n } else {\n swiper.virtual.slides.unshift(slides);\n }\n if (swiper.params.virtual.cache) {\n const cache = swiper.virtual.cache;\n const newCache = {};\n Object.keys(cache).forEach((cachedIndex) => {\n const $cachedEl = cache[cachedIndex];\n const cachedElIndex = $cachedEl.attr('data-swiper-slide-index');\n if (cachedElIndex) {\n $cachedEl.attr(\n 'data-swiper-slide-index',\n parseInt(cachedElIndex, 10) + numberOfNewSlides,\n );\n }\n newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;\n });\n swiper.virtual.cache = newCache;\n }\n update(true);\n swiper.slideTo(newActiveIndex, 0);\n }\n function removeSlide(slidesIndexes) {\n if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n let activeIndex = swiper.activeIndex;\n if (Array.isArray(slidesIndexes)) {\n for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n swiper.virtual.slides.splice(slidesIndexes[i], 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes[i]];\n }\n if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n } else {\n swiper.virtual.slides.splice(slidesIndexes, 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes];\n }\n if (slidesIndexes < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n update(true);\n swiper.slideTo(activeIndex, 0);\n }\n function removeAllSlides() {\n swiper.virtual.slides = [];\n if (swiper.params.virtual.cache) {\n swiper.virtual.cache = {};\n }\n update(true);\n swiper.slideTo(0, 0);\n }\n\n on('beforeInit', () => {\n if (!swiper.params.virtual.enabled) return;\n swiper.virtual.slides = swiper.params.virtual.slides;\n swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n\n if (!swiper.params.initialSlide) {\n update();\n }\n });\n on('setTranslate', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode && !swiper._immediateVirtual) {\n clearTimeout(cssModeTimeout);\n cssModeTimeout = setTimeout(() => {\n update();\n }, 100);\n } else {\n update();\n }\n });\n on('init update resize', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n }\n });\n\n Object.assign(swiper.virtual, {\n appendSlide,\n prependSlide,\n removeSlide,\n removeAllSlides,\n update,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Keyboard({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n const window = getWindow();\n swiper.keyboard = {\n enabled: false,\n };\n extendParams({\n keyboard: {\n enabled: false,\n onlyInViewport: true,\n pageUpDown: true,\n },\n });\n\n function handle(event) {\n if (!swiper.enabled) return;\n\n const { rtlTranslate: rtl } = swiper;\n let e = event;\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n const kc = e.keyCode || e.charCode;\n const pageUpDown = swiper.params.keyboard.pageUpDown;\n const isPageUp = pageUpDown && kc === 33;\n const isPageDown = pageUpDown && kc === 34;\n const isArrowLeft = kc === 37;\n const isArrowRight = kc === 39;\n const isArrowUp = kc === 38;\n const isArrowDown = kc === 40;\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n ((swiper.isHorizontal() && isArrowRight) ||\n (swiper.isVertical() && isArrowDown) ||\n isPageDown)\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n ((swiper.isHorizontal() && isArrowLeft) || (swiper.isVertical() && isArrowUp) || isPageUp)\n ) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (\n document.activeElement &&\n document.activeElement.nodeName &&\n (document.activeElement.nodeName.toLowerCase() === 'input' ||\n document.activeElement.nodeName.toLowerCase() === 'textarea')\n ) {\n return undefined;\n }\n if (\n swiper.params.keyboard.onlyInViewport &&\n (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)\n ) {\n let inView = false;\n // Check that swiper should be inside of visible area of window\n if (\n swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 &&\n swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0\n ) {\n return undefined;\n }\n\n const $el = swiper.$el;\n const swiperWidth = $el[0].clientWidth;\n const swiperHeight = $el[0].clientHeight;\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const swiperOffset = swiper.$el.offset();\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiperWidth, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiperHeight],\n [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n if (!inView) return undefined;\n }\n if (swiper.isHorizontal()) {\n if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (((isPageDown || isArrowRight) && !rtl) || ((isPageUp || isArrowLeft) && rtl))\n swiper.slideNext();\n if (((isPageUp || isArrowLeft) && !rtl) || ((isPageDown || isArrowRight) && rtl))\n swiper.slidePrev();\n } else {\n if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (isPageDown || isArrowDown) swiper.slideNext();\n if (isPageUp || isArrowUp) swiper.slidePrev();\n }\n emit('keyPress', kc);\n return undefined;\n }\n function enable() {\n if (swiper.keyboard.enabled) return;\n $(document).on('keydown', handle);\n swiper.keyboard.enabled = true;\n }\n function disable() {\n if (!swiper.keyboard.enabled) return;\n $(document).off('keydown', handle);\n swiper.keyboard.enabled = false;\n }\n\n on('init', () => {\n if (swiper.params.keyboard.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n if (swiper.keyboard.enabled) {\n disable();\n }\n });\n\n Object.assign(swiper.keyboard, {\n enable,\n disable,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now, nextTick } from '../../shared/utils.js';\n\nexport default function Mousewheel({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n\n extendParams({\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarget: 'container',\n thresholdDelta: null,\n thresholdTime: null,\n },\n });\n\n swiper.mousewheel = {\n enabled: false,\n };\n\n let timeout;\n let lastScrollTime = now();\n let lastEventBeforeSnap;\n const recentWheelEvents = [];\n\n function normalize(e) {\n // Reasonable defaults\n const PIXEL_STEP = 10;\n const LINE_HEIGHT = 40;\n const PAGE_HEIGHT = 800;\n\n let sX = 0;\n let sY = 0; // spinX, spinY\n let pX = 0;\n let pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n\n if (e.shiftKey && !pX) {\n // if user scrolls with shift he wants horizontal scroll\n pX = pY;\n pY = 0;\n }\n\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) {\n // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else {\n // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = pX < 1 ? -1 : 1;\n }\n if (pY && !sY) {\n sY = pY < 1 ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY,\n };\n }\n function handleMouseEnter() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = true;\n }\n function handleMouseLeave() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = false;\n }\n function animateSlider(newEvent) {\n if (\n swiper.params.mousewheel.thresholdDelta &&\n newEvent.delta < swiper.params.mousewheel.thresholdDelta\n ) {\n // Prevent if delta of wheel scroll delta is below configured threshold\n return false;\n }\n\n if (\n swiper.params.mousewheel.thresholdTime &&\n now() - lastScrollTime < swiper.params.mousewheel.thresholdTime\n ) {\n // Prevent if time between scrolls is below configured threshold\n return false;\n }\n\n // If the movement is NOT big enough and\n // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n // Don't go any further (avoid insignificant scroll movement).\n if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n // Return false as a default\n return true;\n }\n // If user is scrolling towards the end:\n // If the slider hasn't hit the latest slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to next slide and\n // emit a scroll event.\n // Else (the user is scrolling towards the beginning) and\n // if the slider hasn't hit the first slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to prev slide and\n // emit a scroll event.\n if (newEvent.direction < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n emit('scroll', newEvent.raw);\n }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n emit('scroll', newEvent.raw);\n }\n // If you got here is because an animation has been triggered so store the current time\n lastScrollTime = new window.Date().getTime();\n // Return false as a default\n return false;\n }\n function releaseScroll(newEvent) {\n const params = swiper.params.mousewheel;\n if (newEvent.direction < 0) {\n if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n return false;\n }\n function handle(event) {\n let e = event;\n let disableParentSwiper = true;\n if (!swiper.enabled) return;\n const params = swiper.params.mousewheel;\n\n if (swiper.params.cssMode) {\n e.preventDefault();\n }\n\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges)\n return true;\n\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n let delta = 0;\n const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n const data = normalize(e);\n\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;\n else return true;\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;\n else return true;\n } else {\n delta =\n Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n\n if (delta === 0) return true;\n\n if (params.invert) delta = -delta;\n\n // Get the scroll positions\n let positions = swiper.getTranslate() + delta * params.sensitivity;\n\n if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n // When loop is true:\n // the disableParentSwiper will be true.\n // When loop is false:\n // if the scroll positions is not on edge,\n // then the disableParentSwiper will be true.\n // if the scroll on edge positions,\n // then the disableParentSwiper will be false.\n disableParentSwiper = swiper.params.loop\n ? true\n : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n\n if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n\n if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n // Register the new event in a variable which stores the relevant data\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n raw: event,\n };\n\n // Keep the most recent events\n if (recentWheelEvents.length >= 2) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n recentWheelEvents.push(newEvent);\n\n // If there is at least one previous recorded event:\n // If direction has changed or\n // if the scroll is quicker than the previous one:\n // Animate the slider.\n // Else (this is the first time the wheel is moved):\n // Animate the slider.\n if (prevEvent) {\n if (\n newEvent.direction !== prevEvent.direction ||\n newEvent.delta > prevEvent.delta ||\n newEvent.time > prevEvent.time + 150\n ) {\n animateSlider(newEvent);\n }\n } else {\n animateSlider(newEvent);\n }\n\n // If it's time to release the scroll:\n // Return now so you don't hit the preventDefault.\n if (releaseScroll(newEvent)) {\n return true;\n }\n } else {\n // Freemode or scrollContainer:\n\n // If we recently snapped after a momentum scroll, then ignore wheel events\n // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n // or if it's a new scroll (larger delta or inverse sign as last event before\n // an end-of-momentum snap).\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n };\n const ignoreWheelEvents =\n lastEventBeforeSnap &&\n newEvent.time < lastEventBeforeSnap.time + 500 &&\n newEvent.delta <= lastEventBeforeSnap.delta &&\n newEvent.direction === lastEventBeforeSnap.direction;\n if (!ignoreWheelEvents) {\n lastEventBeforeSnap = undefined;\n\n if (swiper.params.loop) {\n swiper.loopFix();\n }\n let position = swiper.getTranslate() + delta * params.sensitivity;\n const wasBeginning = swiper.isBeginning;\n const wasEnd = swiper.isEnd;\n\n if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n swiper.updateSlidesClasses();\n }\n\n if (swiper.params.freeMode.sticky) {\n // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n // the end of a momentum scroll by storing recent (N=15?) wheel events.\n // 1. do all N events have decreasing or same (absolute value) delta?\n // 2. did all N events arrive in the last M (M=500?) msecs?\n // 3. does the earliest event have an (absolute value) delta that's\n // at least P (P=1?) larger than the most recent event's delta?\n // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n // Snap immediately and ignore remaining wheel events in this scroll.\n // See comment above for \"remaining wheel events in this scroll\" determination.\n // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n clearTimeout(timeout);\n timeout = undefined;\n if (recentWheelEvents.length >= 15) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n const firstEvent = recentWheelEvents[0];\n recentWheelEvents.push(newEvent);\n if (\n prevEvent &&\n (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)\n ) {\n // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n recentWheelEvents.splice(0);\n } else if (\n recentWheelEvents.length >= 15 &&\n newEvent.time - firstEvent.time < 500 &&\n firstEvent.delta - newEvent.delta >= 1 &&\n newEvent.delta <= 6\n ) {\n // We're at the end of the deceleration of a momentum scroll, so there's no need\n // to wait for more events. Snap ASAP on the next tick.\n // Also, because there's some remaining momentum we'll bias the snap in the\n // direction of the ongoing scroll because it's better UX for the scroll to snap\n // in the same direction as the scroll instead of reversing to snap. Therefore,\n // if it's already scrolled more than 20% in the current direction, keep going.\n const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n timeout = nextTick(() => {\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 0); // no delay; move on next tick\n }\n if (!timeout) {\n // if we get here, then we haven't detected the end of a momentum scroll, so\n // we'll consider a scroll \"complete\" when there haven't been any wheel events\n // for 500ms.\n timeout = nextTick(() => {\n const snapToThreshold = 0.5;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 500);\n }\n }\n\n // Emit event\n if (!ignoreWheelEvents) emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction)\n swiper.autoplay.stop();\n // Return page scroll on edge positions\n if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;\n }\n }\n\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n return false;\n }\n\n function events(method) {\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n target[method]('mouseenter', handleMouseEnter);\n target[method]('mouseleave', handleMouseLeave);\n target[method]('wheel', handle);\n }\n\n function enable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.removeEventListener('wheel', handle);\n return true;\n }\n if (swiper.mousewheel.enabled) return false;\n events('on');\n swiper.mousewheel.enabled = true;\n return true;\n }\n function disable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.addEventListener(event, handle);\n return true;\n }\n if (!swiper.mousewheel.enabled) return false;\n events('off');\n swiper.mousewheel.enabled = false;\n return true;\n }\n\n on('init', () => {\n if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n disable();\n }\n if (swiper.params.mousewheel.enabled) enable();\n });\n on('destroy', () => {\n if (swiper.params.cssMode) {\n enable();\n }\n if (swiper.mousewheel.enabled) disable();\n });\n\n Object.assign(swiper.mousewheel, {\n enable,\n disable,\n });\n}\n","import { getDocument } from 'ssr-window';\n\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n const document = getDocument();\n if (swiper.params.createElements) {\n Object.keys(checkProps).forEach((key) => {\n if (!params[key] && params.auto === true) {\n let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n if (!element) {\n element = document.createElement('div');\n element.className = checkProps[key];\n swiper.$el.append(element);\n }\n params[key] = element;\n originalParams[key] = element;\n }\n });\n }\n return params;\n}\n","import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Navigation({ swiper, extendParams, on, emit }) {\n extendParams({\n navigation: {\n nextEl: null,\n prevEl: null,\n\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n lockClass: 'swiper-button-lock',\n },\n });\n\n swiper.navigation = {\n nextEl: null,\n $nextEl: null,\n prevEl: null,\n $prevEl: null,\n };\n\n function getEl(el) {\n let $el;\n if (el) {\n $el = $(el);\n if (\n swiper.params.uniqueNavElements &&\n typeof el === 'string' &&\n $el.length > 1 &&\n swiper.$el.find(el).length === 1\n ) {\n $el = swiper.$el.find(el);\n }\n }\n return $el;\n }\n\n function toggleEl($el, disabled) {\n const params = swiper.params.navigation;\n if ($el && $el.length > 0) {\n $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n }\n function update() {\n // Update Navigation Buttons\n if (swiper.params.loop) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n toggleEl($prevEl, swiper.isBeginning);\n toggleEl($nextEl, swiper.isEnd);\n }\n function onPrevClick(e) {\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop) return;\n swiper.slidePrev();\n }\n function onNextClick(e) {\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop) return;\n swiper.slideNext();\n }\n function init() {\n const params = swiper.params.navigation;\n\n swiper.params.navigation = createElementIfNotDefined(\n swiper,\n swiper.originalParams.navigation,\n swiper.params.navigation,\n {\n nextEl: 'swiper-button-next',\n prevEl: 'swiper-button-prev',\n },\n );\n if (!(params.nextEl || params.prevEl)) return;\n\n const $nextEl = getEl(params.nextEl);\n const $prevEl = getEl(params.prevEl);\n\n if ($nextEl && $nextEl.length > 0) {\n $nextEl.on('click', onNextClick);\n }\n if ($prevEl && $prevEl.length > 0) {\n $prevEl.on('click', onPrevClick);\n }\n\n Object.assign(swiper.navigation, {\n $nextEl,\n nextEl: $nextEl && $nextEl[0],\n $prevEl,\n prevEl: $prevEl && $prevEl[0],\n });\n\n if (!swiper.enabled) {\n if ($nextEl) $nextEl.addClass(params.lockClass);\n if ($prevEl) $prevEl.addClass(params.lockClass);\n }\n }\n function destroy() {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl && $nextEl.length) {\n $nextEl.off('click', onNextClick);\n $nextEl.removeClass(swiper.params.navigation.disabledClass);\n }\n if ($prevEl && $prevEl.length) {\n $prevEl.off('click', onPrevClick);\n $prevEl.removeClass(swiper.params.navigation.disabledClass);\n }\n }\n\n on('init', () => {\n init();\n update();\n });\n on('toEdge fromEdge lock unlock', () => {\n update();\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl) {\n $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n if ($prevEl) {\n $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n });\n on('click', (_s, e) => {\n const { $nextEl, $prevEl } = swiper.navigation;\n const targetEl = e.target;\n if (\n swiper.params.navigation.hideOnClick &&\n !$(targetEl).is($prevEl) &&\n !$(targetEl).is($nextEl)\n ) {\n if (\n swiper.pagination &&\n swiper.params.pagination &&\n swiper.params.pagination.clickable &&\n (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))\n )\n return;\n let isHidden;\n if ($nextEl) {\n isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n } else if ($prevEl) {\n isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n }\n if (isHidden === true) {\n emit('navigationShow');\n } else {\n emit('navigationHide');\n }\n if ($nextEl) {\n $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n if ($prevEl) {\n $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n }\n });\n\n Object.assign(swiper.navigation, {\n update,\n init,\n destroy,\n });\n}\n","export default function classesToSelector(classes = '') {\n return `.${classes\n .trim()\n .replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n .replace(/ /g, '.')}`;\n}\n","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Pagination({ swiper, extendParams, on, emit }) {\n const pfx = 'swiper-pagination';\n extendParams({\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n progressbarOpposite: false,\n type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n dynamicMainBullets: 1,\n formatFractionCurrent: (number) => number,\n formatFractionTotal: (number) => number,\n bulletClass: `${pfx}-bullet`,\n bulletActiveClass: `${pfx}-bullet-active`,\n modifierClass: `${pfx}-`,\n currentClass: `${pfx}-current`,\n totalClass: `${pfx}-total`,\n hiddenClass: `${pfx}-hidden`,\n progressbarFillClass: `${pfx}-progressbar-fill`,\n progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n clickableClass: `${pfx}-clickable`,\n lockClass: `${pfx}-lock`,\n horizontalClass: `${pfx}-horizontal`,\n verticalClass: `${pfx}-vertical`,\n },\n });\n\n swiper.pagination = {\n el: null,\n $el: null,\n bullets: [],\n };\n\n let bulletSize;\n let dynamicBulletIndex = 0;\n\n function isPaginationDisabled() {\n return (\n !swiper.params.pagination.el ||\n !swiper.pagination.el ||\n !swiper.pagination.$el ||\n swiper.pagination.$el.length === 0\n );\n }\n\n function setSideBullets($bulletEl, position) {\n const { bulletActiveClass } = swiper.params.pagination;\n $bulletEl[position]()\n .addClass(`${bulletActiveClass}-${position}`)\n [position]()\n .addClass(`${bulletActiveClass}-${position}-${position}`);\n }\n\n function update() {\n // Render || Update Pagination bullets/items\n const rtl = swiper.rtl;\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n const $el = swiper.pagination.$el;\n // Current/Total\n let current;\n const total = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (swiper.params.loop) {\n current = Math.ceil(\n (swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup,\n );\n if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n current -= slidesLength - swiper.loopedSlides * 2;\n }\n if (current > total - 1) current -= total;\n if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n } else {\n current = swiper.activeIndex || 0;\n }\n // Types\n if (\n params.type === 'bullets' &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length > 0\n ) {\n const bullets = swiper.pagination.bullets;\n let firstIndex;\n let lastIndex;\n let midIndex;\n if (params.dynamicBullets) {\n bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n $el.css(\n swiper.isHorizontal() ? 'width' : 'height',\n `${bulletSize * (params.dynamicMainBullets + 4)}px`,\n );\n if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n dynamicBulletIndex += current - swiper.previousIndex;\n if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n dynamicBulletIndex = params.dynamicMainBullets - 1;\n } else if (dynamicBulletIndex < 0) {\n dynamicBulletIndex = 0;\n }\n }\n firstIndex = current - dynamicBulletIndex;\n lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n midIndex = (lastIndex + firstIndex) / 2;\n }\n bullets.removeClass(\n ['', '-next', '-next-next', '-prev', '-prev-prev', '-main']\n .map((suffix) => `${params.bulletActiveClass}${suffix}`)\n .join(' '),\n );\n if ($el.length > 1) {\n bullets.each((bullet) => {\n const $bullet = $(bullet);\n const bulletIndex = $bullet.index();\n if (bulletIndex === current) {\n $bullet.addClass(params.bulletActiveClass);\n }\n if (params.dynamicBullets) {\n if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n $bullet.addClass(`${params.bulletActiveClass}-main`);\n }\n if (bulletIndex === firstIndex) {\n setSideBullets($bullet, 'prev');\n }\n if (bulletIndex === lastIndex) {\n setSideBullets($bullet, 'next');\n }\n }\n });\n } else {\n const $bullet = bullets.eq(current);\n const bulletIndex = $bullet.index();\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n const $firstDisplayedBullet = bullets.eq(firstIndex);\n const $lastDisplayedBullet = bullets.eq(lastIndex);\n for (let i = firstIndex; i <= lastIndex; i += 1) {\n bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n }\n if (swiper.params.loop) {\n if (bulletIndex >= bullets.length - params.dynamicMainBullets) {\n for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n }\n bullets\n .eq(bullets.length - params.dynamicMainBullets - 1)\n .addClass(`${params.bulletActiveClass}-prev`);\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n }\n }\n if (params.dynamicBullets) {\n const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n const bulletsOffset =\n (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n const offsetProp = rtl ? 'right' : 'left';\n bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n }\n }\n if (params.type === 'fraction') {\n $el\n .find(classesToSelector(params.currentClass))\n .text(params.formatFractionCurrent(current + 1));\n $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n }\n if (params.type === 'progressbar') {\n let progressbarDirection;\n if (params.progressbarOpposite) {\n progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n } else {\n progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n }\n const scale = (current + 1) / total;\n let scaleX = 1;\n let scaleY = 1;\n if (progressbarDirection === 'horizontal') {\n scaleX = scale;\n } else {\n scaleY = scale;\n }\n $el\n .find(classesToSelector(params.progressbarFillClass))\n .transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`)\n .transition(swiper.params.speed);\n }\n if (params.type === 'custom' && params.renderCustom) {\n $el.html(params.renderCustom(swiper, current + 1, total));\n emit('paginationRender', $el[0]);\n } else {\n emit('paginationUpdate', $el[0]);\n }\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n function render() {\n // Render Container\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n\n const $el = swiper.pagination.$el;\n let paginationHTML = '';\n if (params.type === 'bullets') {\n let numberOfBullets = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.loop &&\n numberOfBullets > slidesLength\n ) {\n numberOfBullets = slidesLength;\n }\n for (let i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\">`;\n }\n }\n $el.html(paginationHTML);\n\n swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML =\n `` +\n ' / ' +\n ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type !== 'custom') {\n emit('paginationRender', swiper.pagination.$el[0]);\n }\n }\n function init() {\n swiper.params.pagination = createElementIfNotDefined(\n swiper,\n swiper.originalParams.pagination,\n swiper.params.pagination,\n { el: 'swiper-pagination' },\n );\n const params = swiper.params.pagination;\n if (!params.el) return;\n\n let $el = $(params.el);\n if ($el.length === 0) return;\n\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n $el = swiper.$el.find(params.el);\n // check if it belongs to another nested Swiper\n if ($el.length > 1) {\n $el = $el.filter((el) => {\n if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n return true;\n });\n }\n }\n\n if (params.type === 'bullets' && params.clickable) {\n $el.addClass(params.clickableClass);\n }\n\n $el.addClass(params.modifierClass + params.type);\n $el.addClass(params.modifierClass + swiper.params.direction);\n\n if (params.type === 'bullets' && params.dynamicBullets) {\n $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n dynamicBulletIndex = 0;\n if (params.dynamicMainBullets < 1) {\n params.dynamicMainBullets = 1;\n }\n }\n if (params.type === 'progressbar' && params.progressbarOpposite) {\n $el.addClass(params.progressbarOppositeClass);\n }\n\n if (params.clickable) {\n $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n e.preventDefault();\n let index = $(this).index() * swiper.params.slidesPerGroup;\n if (swiper.params.loop) index += swiper.loopedSlides;\n swiper.slideTo(index);\n });\n }\n\n Object.assign(swiper.pagination, {\n $el,\n el: $el[0],\n });\n\n if (!swiper.enabled) {\n $el.addClass(params.lockClass);\n }\n }\n function destroy() {\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const $el = swiper.pagination.$el;\n\n $el.removeClass(params.hiddenClass);\n $el.removeClass(params.modifierClass + params.type);\n $el.removeClass(params.modifierClass + swiper.params.direction);\n if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass)\n swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n if (params.clickable) {\n $el.off('click', classesToSelector(params.bulletClass));\n }\n }\n\n on('init', () => {\n init();\n render();\n update();\n });\n on('activeIndexChange', () => {\n if (swiper.params.loop) {\n update();\n } else if (typeof swiper.snapIndex === 'undefined') {\n update();\n }\n });\n on('snapIndexChange', () => {\n if (!swiper.params.loop) {\n update();\n }\n });\n on('slidesLengthChange', () => {\n if (swiper.params.loop) {\n render();\n update();\n }\n });\n on('snapGridLengthChange', () => {\n if (!swiper.params.loop) {\n render();\n update();\n }\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $el } = swiper.pagination;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n }\n });\n on('lock unlock', () => {\n update();\n });\n on('click', (_s, e) => {\n const targetEl = e.target;\n const { $el } = swiper.pagination;\n if (\n swiper.params.pagination.el &&\n swiper.params.pagination.hideOnClick &&\n $el.length > 0 &&\n !$(targetEl).hasClass(swiper.params.pagination.bulletClass)\n ) {\n if (\n swiper.navigation &&\n ((swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) ||\n (swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl))\n )\n return;\n const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n if (isHidden === true) {\n emit('paginationShow');\n } else {\n emit('paginationHide');\n }\n $el.toggleClass(swiper.params.pagination.hiddenClass);\n }\n });\n\n Object.assign(swiper.pagination, {\n render,\n update,\n init,\n destroy,\n });\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Scrollbar({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n\n let isTouched = false;\n let timeout = null;\n let dragTimeout = null;\n let dragStartPos;\n let dragSize;\n let trackSize;\n let divider;\n\n extendParams({\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n lockClass: 'swiper-scrollbar-lock',\n dragClass: 'swiper-scrollbar-drag',\n },\n });\n\n swiper.scrollbar = {\n el: null,\n dragEl: null,\n $el: null,\n $dragEl: null,\n };\n\n function setTranslate() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n const { scrollbar, rtlTranslate: rtl, progress } = swiper;\n const { $dragEl, $el } = scrollbar;\n const params = swiper.params.scrollbar;\n\n let newSize = dragSize;\n let newPos = (trackSize - dragSize) * progress;\n if (rtl) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n $dragEl.transform(`translate3d(${newPos}px, 0, 0)`);\n $dragEl[0].style.width = `${newSize}px`;\n } else {\n $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n $dragEl[0].style.height = `${newSize}px`;\n }\n if (params.hide) {\n clearTimeout(timeout);\n $el[0].style.opacity = 1;\n timeout = setTimeout(() => {\n $el[0].style.opacity = 0;\n $el.transition(400);\n }, 1000);\n }\n }\n function setTransition(duration) {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n swiper.scrollbar.$dragEl.transition(duration);\n }\n function updateSize() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n\n const { scrollbar } = swiper;\n const { $dragEl, $el } = scrollbar;\n\n $dragEl[0].style.width = '';\n $dragEl[0].style.height = '';\n trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n divider =\n swiper.size /\n (swiper.virtualSize +\n swiper.params.slidesOffsetBefore -\n (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n\n if (swiper.isHorizontal()) {\n $dragEl[0].style.width = `${dragSize}px`;\n } else {\n $dragEl[0].style.height = `${dragSize}px`;\n }\n\n if (divider >= 1) {\n $el[0].style.display = 'none';\n } else {\n $el[0].style.display = '';\n }\n if (swiper.params.scrollbar.hide) {\n $el[0].style.opacity = 0;\n }\n\n if (swiper.params.watchOverflow && swiper.enabled) {\n scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](\n swiper.params.scrollbar.lockClass,\n );\n }\n }\n function getPointerPosition(e) {\n if (swiper.isHorizontal()) {\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientX\n : e.clientX;\n }\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientY\n : e.clientY;\n }\n function setDragPosition(e) {\n const { scrollbar, rtlTranslate: rtl } = swiper;\n const { $el } = scrollbar;\n\n let positionRatio;\n positionRatio =\n (getPointerPosition(e) -\n $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] -\n (dragStartPos !== null ? dragStartPos : dragSize / 2)) /\n (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (rtl) {\n positionRatio = 1 - positionRatio;\n }\n\n const position =\n swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n function onDragStart(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n isTouched = true;\n dragStartPos =\n e.target === $dragEl[0] || e.target === $dragEl\n ? getPointerPosition(e) -\n e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top']\n : null;\n e.preventDefault();\n e.stopPropagation();\n\n $wrapperEl.transition(100);\n $dragEl.transition(100);\n setDragPosition(e);\n\n clearTimeout(dragTimeout);\n\n $el.transition(0);\n if (params.hide) {\n $el.css('opacity', 1);\n }\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', 'none');\n }\n emit('scrollbarDragStart', e);\n }\n function onDragMove(e) {\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n\n if (!isTouched) return;\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n setDragPosition(e);\n $wrapperEl.transition(0);\n $el.transition(0);\n $dragEl.transition(0);\n emit('scrollbarDragMove', e);\n }\n function onDragEnd(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el } = scrollbar;\n\n if (!isTouched) return;\n isTouched = false;\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', '');\n $wrapperEl.transition('');\n }\n if (params.hide) {\n clearTimeout(dragTimeout);\n dragTimeout = nextTick(() => {\n $el.css('opacity', 0);\n $el.transition(400);\n }, 1000);\n }\n emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideToClosest();\n }\n }\n\n function events(method) {\n const { scrollbar, touchEventsTouch, touchEventsDesktop, params, support } = swiper;\n const $el = scrollbar.$el;\n const target = $el[0];\n const activeListener =\n support.passiveListener && params.passiveListeners\n ? { passive: false, capture: false }\n : false;\n const passiveListener =\n support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n if (!target) return;\n const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n if (!support.touch) {\n target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n } else {\n target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n }\n }\n\n function enableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('on');\n }\n function disableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('off');\n }\n function init() {\n const { scrollbar, $el: $swiperEl } = swiper;\n swiper.params.scrollbar = createElementIfNotDefined(\n swiper,\n swiper.originalParams.scrollbar,\n swiper.params.scrollbar,\n { el: 'swiper-scrollbar' },\n );\n const params = swiper.params.scrollbar;\n if (!params.el) return;\n\n let $el = $(params.el);\n if (\n swiper.params.uniqueNavElements &&\n typeof params.el === 'string' &&\n $el.length > 1 &&\n $swiperEl.find(params.el).length === 1\n ) {\n $el = $swiperEl.find(params.el);\n }\n\n let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n if ($dragEl.length === 0) {\n $dragEl = $(`
`);\n $el.append($dragEl);\n }\n\n Object.assign(scrollbar, {\n $el,\n el: $el[0],\n $dragEl,\n dragEl: $dragEl[0],\n });\n\n if (params.draggable) {\n enableDraggable();\n }\n\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n }\n function destroy() {\n disableDraggable();\n }\n\n on('init', () => {\n init();\n updateSize();\n setTranslate();\n });\n on('update resize observerUpdate lock unlock', () => {\n updateSize();\n });\n on('setTranslate', () => {\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n setTransition(duration);\n });\n on('enable disable', () => {\n const { $el } = swiper.scrollbar;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n });\n on('destroy', () => {\n destroy();\n });\n\n Object.assign(swiper.scrollbar, {\n updateSize,\n setTranslate,\n init,\n destroy,\n });\n}\n","import $ from '../../shared/dom.js';\n\nexport default function Parallax({ swiper, extendParams, on }) {\n extendParams({\n parallax: {\n enabled: false,\n },\n });\n\n const setTransform = (el, progress) => {\n const { rtl } = swiper;\n\n const $el = $(el);\n const rtlFactor = rtl ? -1 : 1;\n\n const p = $el.attr('data-swiper-parallax') || '0';\n let x = $el.attr('data-swiper-parallax-x');\n let y = $el.attr('data-swiper-parallax-y');\n const scale = $el.attr('data-swiper-parallax-scale');\n const opacity = $el.attr('data-swiper-parallax-opacity');\n\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n\n if (x.indexOf('%') >= 0) {\n x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n } else {\n x = `${x * progress * rtlFactor}px`;\n }\n if (y.indexOf('%') >= 0) {\n y = `${parseInt(y, 10) * progress}%`;\n } else {\n y = `${y * progress}px`;\n }\n\n if (typeof opacity !== 'undefined' && opacity !== null) {\n const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n $el[0].style.opacity = currentOpacity;\n }\n if (typeof scale === 'undefined' || scale === null) {\n $el.transform(`translate3d(${x}, ${y}, 0px)`);\n } else {\n const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`);\n }\n };\n\n const setTranslate = () => {\n const { $el, slides, progress, snapGrid } = swiper;\n $el\n .children(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, progress);\n });\n slides.each((slideEl, slideIndex) => {\n let slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n $(slideEl)\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, slideProgress);\n });\n });\n };\n\n const setTransition = (duration = swiper.params.speed) => {\n const { $el } = swiper;\n $el\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((parallaxEl) => {\n const $parallaxEl = $(parallaxEl);\n let parallaxDuration =\n parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) parallaxDuration = 0;\n $parallaxEl.transition(parallaxDuration);\n });\n };\n\n on('beforeInit', () => {\n if (!swiper.params.parallax.enabled) return;\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n });\n on('init', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTranslate', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTransition', (_swiper, duration) => {\n if (!swiper.params.parallax.enabled) return;\n setTransition(duration);\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { getTranslate } from '../../shared/utils.js';\n\nexport default function Zoom({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n extendParams({\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed',\n },\n });\n\n swiper.zoom = {\n enabled: false,\n };\n\n let currentScale = 1;\n let isScaling = false;\n let gesturesEnabled;\n let fakeGestureTouched;\n let fakeGestureMoved;\n const gesture = {\n $slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n $imageEl: undefined,\n $imageWrapEl: undefined,\n maxRatio: 3,\n };\n const image = {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {},\n };\n const velocity = {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined,\n };\n\n let scale = 1;\n Object.defineProperty(swiper.zoom, 'scale', {\n get() {\n return scale;\n },\n set(value) {\n if (scale !== value) {\n const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined;\n const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined;\n emit('zoomChange', value, imageEl, slideEl);\n }\n scale = value;\n },\n });\n\n function getDistanceBetweenTouches(e) {\n if (e.targetTouches.length < 2) return 1;\n const x1 = e.targetTouches[0].pageX;\n const y1 = e.targetTouches[0].pageY;\n const x2 = e.targetTouches[1].pageX;\n const y2 = e.targetTouches[1].pageY;\n const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n return distance;\n }\n\n // Events\n function onGestureStart(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n if (!support.gestures) {\n if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureTouched = true;\n gesture.scaleStart = getDistanceBetweenTouches(e);\n }\n if (!gesture.$slideEl || !gesture.$slideEl.length) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (gesture.$imageWrapEl.length === 0) {\n gesture.$imageEl = undefined;\n return;\n }\n }\n if (gesture.$imageEl) {\n gesture.$imageEl.transition(0);\n }\n isScaling = true;\n }\n function onGestureChange(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureMoved = true;\n gesture.scaleMove = getDistanceBetweenTouches(e);\n }\n\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) {\n if (e.type === 'gesturechange') onGestureStart(e);\n return;\n }\n if (support.gestures) {\n zoom.scale = e.scale * currentScale;\n } else {\n zoom.scale = (gesture.scaleMove / gesture.scaleStart) * currentScale;\n }\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n }\n gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function onGestureEnd(e) {\n const device = swiper.device;\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (!fakeGestureTouched || !fakeGestureMoved) {\n return;\n }\n if (\n e.type !== 'touchend' ||\n (e.type === 'touchend' && e.changedTouches.length < 2 && !device.android)\n ) {\n return;\n }\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.$imageEl\n .transition(swiper.params.speed)\n .transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n currentScale = zoom.scale;\n isScaling = false;\n if (zoom.scale === 1) gesture.$slideEl = undefined;\n }\n function onTouchStart(e) {\n const device = swiper.device;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (image.isTouched) return;\n if (device.android && e.cancelable) e.preventDefault();\n image.isTouched = true;\n image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n }\n function onTouchMove(e) {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n swiper.allowClick = false;\n if (!image.isTouched || !gesture.$slideEl) return;\n\n if (!image.isMoved) {\n image.width = gesture.$imageEl[0].offsetWidth;\n image.height = gesture.$imageEl[0].offsetHeight;\n image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n gesture.$imageWrapEl.transition(0);\n }\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;\n\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n\n image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n if (!image.isMoved && !isScaling) {\n if (\n swiper.isHorizontal() &&\n ((Math.floor(image.minX) === Math.floor(image.startX) &&\n image.touchesCurrent.x < image.touchesStart.x) ||\n (Math.floor(image.maxX) === Math.floor(image.startX) &&\n image.touchesCurrent.x > image.touchesStart.x))\n ) {\n image.isTouched = false;\n return;\n }\n if (\n !swiper.isHorizontal() &&\n ((Math.floor(image.minY) === Math.floor(image.startY) &&\n image.touchesCurrent.y < image.touchesStart.y) ||\n (Math.floor(image.maxY) === Math.floor(image.startY) &&\n image.touchesCurrent.y > image.touchesStart.y))\n ) {\n image.isTouched = false;\n return;\n }\n }\n if (e.cancelable) {\n e.preventDefault();\n }\n e.stopPropagation();\n\n image.isMoved = true;\n image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;\n image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;\n\n if (image.currentX < image.minX) {\n image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n }\n if (image.currentX > image.maxX) {\n image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n }\n\n if (image.currentY < image.minY) {\n image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n }\n if (image.currentY > image.maxY) {\n image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n }\n\n // Velocity\n if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n if (!velocity.prevTime) velocity.prevTime = Date.now();\n velocity.x =\n (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y =\n (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n\n gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTouchEnd() {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n let momentumDurationX = 300;\n let momentumDurationY = 300;\n const momentumDistanceX = velocity.x * momentumDurationX;\n const newPositionX = image.currentX + momentumDistanceX;\n const momentumDistanceY = velocity.y * momentumDurationY;\n const newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0)\n momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n if (velocity.y !== 0)\n momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n gesture.$imageWrapEl\n .transition(momentumDuration)\n .transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTransitionEnd() {\n const zoom = swiper.zoom;\n if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n if (gesture.$imageEl) {\n gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n }\n if (gesture.$imageWrapEl) {\n gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n }\n\n zoom.scale = 1;\n currentScale = 1;\n\n gesture.$slideEl = undefined;\n gesture.$imageEl = undefined;\n gesture.$imageWrapEl = undefined;\n }\n }\n\n function zoomIn(e) {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (e && e.target) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n }\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n }\n\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.touchAction = 'none';\n }\n\n gesture.$slideEl.addClass(`${params.zoomedSlideClass}`);\n\n let touchX;\n let touchY;\n let offsetX;\n let offsetY;\n let diffX;\n let diffY;\n let translateX;\n let translateY;\n let imageWidth;\n let imageHeight;\n let scaledWidth;\n let scaledHeight;\n let translateMinX;\n let translateMinY;\n let translateMaxX;\n let translateMaxY;\n let slideWidth;\n let slideHeight;\n\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n\n zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (e) {\n slideWidth = gesture.$slideEl[0].offsetWidth;\n slideHeight = gesture.$slideEl[0].offsetHeight;\n offsetX = gesture.$slideEl.offset().left + window.scrollX;\n offsetY = gesture.$slideEl.offset().top + window.scrollY;\n diffX = offsetX + slideWidth / 2 - touchX;\n diffY = offsetY + slideHeight / 2 - touchY;\n\n imageWidth = gesture.$imageEl[0].offsetWidth;\n imageHeight = gesture.$imageEl[0].offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n\n translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n gesture.$imageWrapEl\n .transition(300)\n .transform(`translate3d(${translateX}px, ${translateY}px,0)`);\n gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function zoomOut() {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.style.touchAction = '';\n }\n zoom.scale = 1;\n currentScale = 1;\n gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`);\n gesture.$slideEl = undefined;\n }\n\n // Toggle Zoom\n function zoomToggle(e) {\n const zoom = swiper.zoom;\n\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoomOut();\n } else {\n // Zoom In\n zoomIn(e);\n }\n }\n\n function getListeners() {\n const support = swiper.support;\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n const activeListenerWithCapture = support.passiveListener\n ? { passive: false, capture: true }\n : true;\n return { passiveListener, activeListenerWithCapture };\n }\n\n function getSlideSelector() {\n return `.${swiper.params.slideClass}`;\n }\n\n function toggleGestures(method) {\n const { passiveListener } = getListeners();\n const slideSelector = getSlideSelector();\n swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener);\n swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener);\n swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener);\n }\n function enableGestures() {\n if (gesturesEnabled) return;\n gesturesEnabled = true;\n toggleGestures('on');\n }\n function disableGestures() {\n if (!gesturesEnabled) return;\n gesturesEnabled = false;\n toggleGestures('off');\n }\n\n // Attach/Detach Events\n function enable() {\n const zoom = swiper.zoom;\n if (zoom.enabled) return;\n zoom.enabled = true;\n const support = swiper.support;\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.on(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.on(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n function disable() {\n const zoom = swiper.zoom;\n if (!zoom.enabled) return;\n const support = swiper.support;\n zoom.enabled = false;\n\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.off(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.off(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n\n on('init', () => {\n if (swiper.params.zoom.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n disable();\n });\n on('touchStart', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchStart(e);\n });\n on('touchEnd', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchEnd(e);\n });\n on('doubleTap', (_s, e) => {\n if (\n !swiper.animating &&\n swiper.params.zoom.enabled &&\n swiper.zoom.enabled &&\n swiper.params.zoom.toggle\n ) {\n zoomToggle(e);\n }\n });\n on('transitionEnd', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n onTransitionEnd();\n }\n });\n on('slideChange', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n onTransitionEnd();\n }\n });\n\n Object.assign(swiper.zoom, {\n enable,\n disable,\n in: zoomIn,\n out: zoomOut,\n toggle: zoomToggle,\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Lazy({ swiper, extendParams, on, emit }) {\n extendParams({\n lazy: {\n checkInView: false,\n enabled: false,\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n scrollingElement: '',\n\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n },\n });\n\n swiper.lazy = {};\n\n let scrollHandlerAttached = false;\n let initialImageLoaded = false;\n\n function loadInSlide(index, loadInDuplicate = true) {\n const params = swiper.params.lazy;\n if (typeof index === 'undefined') return;\n if (swiper.slides.length === 0) return;\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n const $slideEl = isVirtual\n ? swiper.$wrapperEl.children(\n `.${swiper.params.slideClass}[data-swiper-slide-index=\"${index}\"]`,\n )\n : swiper.slides.eq(index);\n\n const $images = $slideEl.find(\n `.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`,\n );\n if (\n $slideEl.hasClass(params.elementClass) &&\n !$slideEl.hasClass(params.loadedClass) &&\n !$slideEl.hasClass(params.loadingClass)\n ) {\n $images.push($slideEl[0]);\n }\n if ($images.length === 0) return;\n\n $images.each((imageEl) => {\n const $imageEl = $(imageEl);\n $imageEl.addClass(params.loadingClass);\n\n const background = $imageEl.attr('data-background');\n const src = $imageEl.attr('data-src');\n const srcset = $imageEl.attr('data-srcset');\n const sizes = $imageEl.attr('data-sizes');\n const $pictureEl = $imageEl.parent('picture');\n\n swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => {\n if (\n typeof swiper === 'undefined' ||\n swiper === null ||\n !swiper ||\n (swiper && !swiper.params) ||\n swiper.destroyed\n )\n return;\n if (background) {\n $imageEl.css('background-image', `url(\"${background}\")`);\n $imageEl.removeAttr('data-background');\n } else {\n if (srcset) {\n $imageEl.attr('srcset', srcset);\n $imageEl.removeAttr('data-srcset');\n }\n if (sizes) {\n $imageEl.attr('sizes', sizes);\n $imageEl.removeAttr('data-sizes');\n }\n if ($pictureEl.length) {\n $pictureEl.children('source').each((sourceEl) => {\n const $source = $(sourceEl);\n\n if ($source.attr('data-srcset')) {\n $source.attr('srcset', $source.attr('data-srcset'));\n $source.removeAttr('data-srcset');\n }\n });\n }\n if (src) {\n $imageEl.attr('src', src);\n $imageEl.removeAttr('data-src');\n }\n }\n\n $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n $slideEl.find(`.${params.preloaderClass}`).remove();\n if (swiper.params.loop && loadInDuplicate) {\n const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n const originalSlide = swiper.$wrapperEl.children(\n `[data-swiper-slide-index=\"${slideOriginalIndex}\"]:not(.${swiper.params.slideDuplicateClass})`,\n );\n loadInSlide(originalSlide.index(), false);\n } else {\n const duplicatedSlide = swiper.$wrapperEl.children(\n `.${swiper.params.slideDuplicateClass}[data-swiper-slide-index=\"${slideOriginalIndex}\"]`,\n );\n loadInSlide(duplicatedSlide.index(), false);\n }\n }\n emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n });\n\n emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n });\n }\n\n function load() {\n const { $wrapperEl, params: swiperParams, slides, activeIndex } = swiper;\n const isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n const params = swiperParams.lazy;\n\n let slidesPerView = swiperParams.slidesPerView;\n if (slidesPerView === 'auto') {\n slidesPerView = 0;\n }\n\n function slideExist(index) {\n if (isVirtual) {\n if (\n $wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index=\"${index}\"]`)\n .length\n ) {\n return true;\n }\n } else if (slides[index]) return true;\n return false;\n }\n\n function slideIndex(slideEl) {\n if (isVirtual) {\n return $(slideEl).attr('data-swiper-slide-index');\n }\n return $(slideEl).index();\n }\n\n if (!initialImageLoaded) initialImageLoaded = true;\n if (swiper.params.watchSlidesProgress) {\n $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each((slideEl) => {\n const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n loadInSlide(index);\n });\n } else if (slidesPerView > 1) {\n for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n loadInSlide(activeIndex);\n }\n if (params.loadPrevNext) {\n if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n const amount = params.loadPrevNextAmount;\n const spv = slidesPerView;\n const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n // Next Slides\n for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n // Prev Slides\n for (let i = minIndex; i < activeIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`);\n if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide));\n\n const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`);\n if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide));\n }\n }\n }\n function checkInViewOnLoad() {\n const window = getWindow();\n if (!swiper || swiper.destroyed) return;\n const $scrollElement = swiper.params.lazy.scrollingElement\n ? $(swiper.params.lazy.scrollingElement)\n : $(window);\n const isWindow = $scrollElement[0] === window;\n const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;\n const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;\n const swiperOffset = swiper.$el.offset();\n const { rtlTranslate: rtl } = swiper;\n\n let inView = false;\n\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiper.width, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiper.height],\n [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (\n point[0] >= 0 &&\n point[0] <= scrollElementWidth &&\n point[1] >= 0 &&\n point[1] <= scrollElementHeight\n ) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n swiper.support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n\n if (inView) {\n load();\n $scrollElement.off('scroll', checkInViewOnLoad, passiveListener);\n } else if (!scrollHandlerAttached) {\n scrollHandlerAttached = true;\n $scrollElement.on('scroll', checkInViewOnLoad, passiveListener);\n }\n }\n\n on('beforeInit', () => {\n if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n swiper.params.preloadImages = false;\n }\n });\n on('init', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('scroll', () => {\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.freeMode.sticky\n ) {\n load();\n }\n });\n on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('transitionStart', () => {\n if (swiper.params.lazy.enabled) {\n if (\n swiper.params.lazy.loadOnTransitionStart ||\n (!swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded)\n ) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n }\n });\n on('transitionEnd', () => {\n if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('slideChange', () => {\n const { lazy, cssMode, watchSlidesProgress, touchReleaseOnEdges, resistanceRatio } =\n swiper.params;\n if (\n lazy.enabled &&\n (cssMode || (watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0)))\n ) {\n load();\n }\n });\n\n Object.assign(swiper.lazy, {\n load,\n loadInSlide,\n });\n}\n","/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Controller({ swiper, extendParams, on }) {\n extendParams({\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide', // or 'container'\n },\n });\n\n swiper.controller = {\n control: undefined,\n };\n\n function LinearSpline(x, y) {\n const binarySearch = (function search() {\n let maxIndex;\n let minIndex;\n let guess;\n return (array, val) => {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = (maxIndex + minIndex) >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n })();\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n let i1;\n let i3;\n\n this.interpolate = function interpolate(x2) {\n if (!x2) return 0;\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (\n ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]\n );\n };\n return this;\n }\n // xxx: for now i will just save one spline function to to\n function getInterpolateFunction(c) {\n if (!swiper.controller.spline) {\n swiper.controller.spline = swiper.params.loop\n ? new LinearSpline(swiper.slidesGrid, c.slidesGrid)\n : new LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n }\n function setTranslate(_t, byController) {\n const controlled = swiper.controller.control;\n let multiplier;\n let controlledTranslate;\n const Swiper = swiper.constructor;\n function setControlledTranslate(c) {\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier =\n (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n }\n\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (let i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n }\n function setTransition(duration, byController) {\n const Swiper = swiper.constructor;\n const controlled = swiper.controller.control;\n let i;\n function setControlledTransition(c) {\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n if (c.params.autoHeight) {\n nextTick(() => {\n c.updateAutoHeight();\n });\n }\n c.$wrapperEl.transitionEnd(() => {\n if (!controlled) return;\n if (c.params.loop && swiper.params.controller.by === 'slide') {\n c.loopFix();\n }\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTransition(controlled);\n }\n }\n\n function removeSpline() {\n if (!swiper.controller.control) return;\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n }\n on('beforeInit', () => {\n swiper.controller.control = swiper.params.controller.control;\n });\n on('update', () => {\n removeSpline();\n });\n on('resize', () => {\n removeSpline();\n });\n on('observerUpdate', () => {\n removeSpline();\n });\n on('setTranslate', (_s, translate, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTranslate(translate, byController);\n });\n on('setTransition', (_s, duration, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTransition(duration, byController);\n });\n\n Object.assign(swiper.controller, {\n setTranslate,\n setTransition,\n });\n}\n","import classesToSelector from '../../shared/classes-to-selector.js';\nimport $ from '../../shared/dom.js';\n\nexport default function A11y({ swiper, extendParams, on }) {\n extendParams({\n a11y: {\n enabled: true,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n slideLabelMessage: '{{index}} / {{slidesLength}}',\n containerMessage: null,\n containerRoleDescriptionMessage: null,\n itemRoleDescriptionMessage: null,\n slideRole: 'group',\n },\n });\n\n let liveRegion = null;\n\n function notify(message) {\n const notification = liveRegion;\n if (notification.length === 0) return;\n notification.html('');\n notification.html(message);\n }\n\n function getRandomNumber(size = 16) {\n const randomChar = () => Math.round(16 * Math.random()).toString(16);\n return 'x'.repeat(size).replace(/x/g, randomChar);\n }\n function makeElFocusable($el) {\n $el.attr('tabIndex', '0');\n }\n function makeElNotFocusable($el) {\n $el.attr('tabIndex', '-1');\n }\n function addElRole($el, role) {\n $el.attr('role', role);\n }\n function addElRoleDescription($el, description) {\n $el.attr('aria-roledescription', description);\n }\n function addElControls($el, controls) {\n $el.attr('aria-controls', controls);\n }\n function addElLabel($el, label) {\n $el.attr('aria-label', label);\n }\n function addElId($el, id) {\n $el.attr('id', id);\n }\n function addElLive($el, live) {\n $el.attr('aria-live', live);\n }\n function disableEl($el) {\n $el.attr('aria-disabled', true);\n }\n function enableEl($el) {\n $el.attr('aria-disabled', false);\n }\n\n function onEnterOrSpaceKey(e) {\n if (e.keyCode !== 13 && e.keyCode !== 32) return;\n const params = swiper.params.a11y;\n const $targetEl = $(e.target);\n if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n notify(params.lastSlideMessage);\n } else {\n notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n notify(params.firstSlideMessage);\n } else {\n notify(params.prevSlideMessage);\n }\n }\n\n if (\n swiper.pagination &&\n $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))\n ) {\n $targetEl[0].click();\n }\n }\n\n function updateNavigation() {\n if (swiper.params.loop || !swiper.navigation) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n disableEl($prevEl);\n makeElNotFocusable($prevEl);\n } else {\n enableEl($prevEl);\n makeElFocusable($prevEl);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n disableEl($nextEl);\n makeElNotFocusable($nextEl);\n } else {\n enableEl($nextEl);\n makeElFocusable($nextEl);\n }\n }\n }\n\n function hasPagination() {\n return (\n swiper.pagination &&\n swiper.params.pagination.clickable &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length\n );\n }\n\n function updatePagination() {\n const params = swiper.params.a11y;\n if (hasPagination()) {\n swiper.pagination.bullets.each((bulletEl) => {\n const $bulletEl = $(bulletEl);\n makeElFocusable($bulletEl);\n if (!swiper.params.pagination.renderBullet) {\n addElRole($bulletEl, 'button');\n addElLabel(\n $bulletEl,\n params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1),\n );\n }\n });\n }\n }\n\n const initNavEl = ($el, wrapperId, message) => {\n makeElFocusable($el);\n if ($el[0].tagName !== 'BUTTON') {\n addElRole($el, 'button');\n $el.on('keydown', onEnterOrSpaceKey);\n }\n addElLabel($el, message);\n addElControls($el, wrapperId);\n };\n\n function init() {\n const params = swiper.params.a11y;\n\n swiper.$el.append(liveRegion);\n\n // Container\n const $containerEl = swiper.$el;\n if (params.containerRoleDescriptionMessage) {\n addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n }\n if (params.containerMessage) {\n addElLabel($containerEl, params.containerMessage);\n }\n\n // Wrapper\n const $wrapperEl = swiper.$wrapperEl;\n const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n addElId($wrapperEl, wrapperId);\n addElLive($wrapperEl, live);\n\n // Slide\n if (params.itemRoleDescriptionMessage) {\n addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);\n }\n addElRole($(swiper.slides), params.slideRole);\n\n const slidesLength = swiper.params.loop\n ? swiper.slides.filter((el) => !el.classList.contains(swiper.params.slideDuplicateClass))\n .length\n : swiper.slides.length;\n swiper.slides.each((slideEl, index) => {\n const $slideEl = $(slideEl);\n const slideIndex = swiper.params.loop\n ? parseInt($slideEl.attr('data-swiper-slide-index'), 10)\n : index;\n const ariaLabelMessage = params.slideLabelMessage\n .replace(/\\{\\{index\\}\\}/, slideIndex + 1)\n .replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n addElLabel($slideEl, ariaLabelMessage);\n });\n\n // Navigation\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n\n if ($nextEl && $nextEl.length) {\n initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n }\n if ($prevEl && $prevEl.length) {\n initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.on(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n function destroy() {\n if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n $nextEl.off('keydown', onEnterOrSpaceKey);\n }\n if ($prevEl) {\n $prevEl.off('keydown', onEnterOrSpaceKey);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.off(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n\n on('beforeInit', () => {\n liveRegion = $(\n ``,\n );\n });\n\n on('afterInit', () => {\n if (!swiper.params.a11y.enabled) return;\n init();\n updateNavigation();\n });\n on('toEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('fromEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('paginationUpdate', () => {\n if (!swiper.params.a11y.enabled) return;\n updatePagination();\n });\n on('destroy', () => {\n if (!swiper.params.a11y.enabled) return;\n destroy();\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function History({ swiper, extendParams, on }) {\n extendParams({\n history: {\n enabled: false,\n root: '',\n replaceState: false,\n key: 'slides',\n },\n });\n\n let initialized = false;\n let paths = {};\n\n const slugify = (text) => {\n return text\n .toString()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n };\n\n const getPathValues = (urlOverride) => {\n const window = getWindow();\n let location;\n if (urlOverride) {\n location = new URL(urlOverride);\n } else {\n location = window.location;\n }\n const pathArray = location.pathname\n .slice(1)\n .split('/')\n .filter((part) => part !== '');\n const total = pathArray.length;\n const key = pathArray[total - 2];\n const value = pathArray[total - 1];\n return { key, value };\n };\n const setHistory = (key, index) => {\n const window = getWindow();\n if (!initialized || !swiper.params.history.enabled) return;\n let location;\n if (swiper.params.url) {\n location = new URL(swiper.params.url);\n } else {\n location = window.location;\n }\n const slide = swiper.slides.eq(index);\n let value = slugify(slide.attr('data-history'));\n if (swiper.params.history.root.length > 0) {\n let root = swiper.params.history.root;\n if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n value = `${root}/${key}/${value}`;\n } else if (!location.pathname.includes(key)) {\n value = `${key}/${value}`;\n }\n const currentState = window.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n window.history.replaceState({ value }, null, value);\n } else {\n window.history.pushState({ value }, null, value);\n }\n };\n\n const scrollToSlide = (speed, value, runCallbacks) => {\n if (value) {\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHistory = slugify(slide.attr('data-history'));\n if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n };\n\n const setHistoryPopState = () => {\n paths = getPathValues(swiper.params.url);\n scrollToSlide(swiper.params.speed, swiper.paths.value, false);\n };\n\n const init = () => {\n const window = getWindow();\n if (!swiper.params.history) return;\n if (!window.history || !window.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n initialized = true;\n paths = getPathValues(swiper.params.url);\n if (!paths.key && !paths.value) return;\n scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n window.addEventListener('popstate', setHistoryPopState);\n }\n };\n const destroy = () => {\n const window = getWindow();\n if (!swiper.params.history.replaceState) {\n window.removeEventListener('popstate', setHistoryPopState);\n }\n };\n\n on('init', () => {\n if (swiper.params.history.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.history.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function HashNavigation({ swiper, extendParams, emit, on }) {\n let initialized = false;\n const document = getDocument();\n const window = getWindow();\n extendParams({\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n },\n });\n const onHashChange = () => {\n emit('hashChange');\n const newHash = document.location.hash.replace('#', '');\n const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n if (newHash !== activeSlideHash) {\n const newIndex = swiper.$wrapperEl\n .children(`.${swiper.params.slideClass}[data-hash=\"${newHash}\"]`)\n .index();\n if (typeof newIndex === 'undefined') return;\n swiper.slideTo(newIndex);\n }\n };\n const setHash = () => {\n if (!initialized || !swiper.params.hashNavigation.enabled) return;\n if (\n swiper.params.hashNavigation.replaceState &&\n window.history &&\n window.history.replaceState\n ) {\n window.history.replaceState(\n null,\n null,\n `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '',\n );\n emit('hashSet');\n } else {\n const slide = swiper.slides.eq(swiper.activeIndex);\n const hash = slide.attr('data-hash') || slide.attr('data-history');\n document.location.hash = hash || '';\n emit('hashSet');\n }\n };\n const init = () => {\n if (\n !swiper.params.hashNavigation.enabled ||\n (swiper.params.history && swiper.params.history.enabled)\n )\n return;\n initialized = true;\n const hash = document.location.hash.replace('#', '');\n if (hash) {\n const speed = 0;\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHash = slide.attr('data-hash') || slide.attr('data-history');\n if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n }\n }\n }\n if (swiper.params.hashNavigation.watchState) {\n $(window).on('hashchange', onHashChange);\n }\n };\n const destroy = () => {\n if (swiper.params.hashNavigation.watchState) {\n $(window).off('hashchange', onHashChange);\n }\n };\n\n on('init', () => {\n if (swiper.params.hashNavigation.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.hashNavigation.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHash();\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHash();\n }\n });\n}\n","/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Autoplay({ swiper, extendParams, on, emit }) {\n let timeout;\n\n swiper.autoplay = {\n running: false,\n paused: false,\n };\n\n extendParams({\n autoplay: {\n enabled: false,\n delay: 3000,\n waitForTransition: true,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n reverseDirection: false,\n pauseOnMouseEnter: false,\n },\n });\n\n function run() {\n const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n let delay = swiper.params.autoplay.delay;\n if ($activeSlideEl.attr('data-swiper-autoplay')) {\n delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n }\n clearTimeout(timeout);\n timeout = nextTick(() => {\n let autoplayResult;\n if (swiper.params.autoplay.reverseDirection) {\n if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isBeginning) {\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(\n swiper.slides.length - 1,\n swiper.params.speed,\n true,\n true,\n );\n emit('autoplay');\n } else {\n stop();\n }\n } else if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isEnd) {\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n emit('autoplay');\n } else {\n stop();\n }\n if (swiper.params.cssMode && swiper.autoplay.running) run();\n else if (autoplayResult === false) {\n run();\n }\n }, delay);\n }\n function start() {\n if (typeof timeout !== 'undefined') return false;\n if (swiper.autoplay.running) return false;\n swiper.autoplay.running = true;\n emit('autoplayStart');\n run();\n return true;\n }\n function stop() {\n if (!swiper.autoplay.running) return false;\n if (typeof timeout === 'undefined') return false;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n swiper.autoplay.running = false;\n emit('autoplayStop');\n return true;\n }\n function pause(speed) {\n if (!swiper.autoplay.running) return;\n if (swiper.autoplay.paused) return;\n if (timeout) clearTimeout(timeout);\n swiper.autoplay.paused = true;\n if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n swiper.autoplay.paused = false;\n run();\n } else {\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n });\n }\n }\n function onVisibilityChange() {\n const document = getDocument();\n if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n pause();\n }\n if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n run();\n swiper.autoplay.paused = false;\n }\n }\n function onTransitionEnd(e) {\n if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n if (e.target !== swiper.$wrapperEl[0]) return;\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n swiper.autoplay.paused = false;\n if (!swiper.autoplay.running) {\n stop();\n } else {\n run();\n }\n }\n function onMouseEnter() {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n }\n function onMouseLeave() {\n if (swiper.params.autoplay.disableOnInteraction) {\n return;\n }\n swiper.autoplay.paused = false;\n run();\n }\n function attachMouseEvents() {\n if (swiper.params.autoplay.pauseOnMouseEnter) {\n swiper.$el.on('mouseenter', onMouseEnter);\n swiper.$el.on('mouseleave', onMouseLeave);\n }\n }\n function detachMouseEvents() {\n swiper.$el.off('mouseenter', onMouseEnter);\n swiper.$el.off('mouseleave', onMouseLeave);\n }\n\n on('init', () => {\n if (swiper.params.autoplay.enabled) {\n start();\n const document = getDocument();\n document.addEventListener('visibilitychange', onVisibilityChange);\n attachMouseEvents();\n }\n });\n on('beforeTransitionStart', (_s, speed, internal) => {\n if (swiper.autoplay.running) {\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.pause(speed);\n } else {\n stop();\n }\n }\n });\n on('sliderFirstMove', () => {\n if (swiper.autoplay.running) {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n }\n });\n on('touchEnd', () => {\n if (\n swiper.params.cssMode &&\n swiper.autoplay.paused &&\n !swiper.params.autoplay.disableOnInteraction\n ) {\n run();\n }\n });\n on('destroy', () => {\n detachMouseEvents();\n if (swiper.autoplay.running) {\n stop();\n }\n const document = getDocument();\n document.removeEventListener('visibilitychange', onVisibilityChange);\n });\n\n Object.assign(swiper.autoplay, {\n pause,\n run,\n start,\n stop,\n });\n}\n","import { isObject } from '../../shared/utils.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Thumb({ swiper, extendParams, on }) {\n extendParams({\n thumbs: {\n swiper: null,\n multipleActiveThumbs: true,\n autoScrollOffset: 0,\n slideThumbActiveClass: 'swiper-slide-thumb-active',\n thumbsContainerClass: 'swiper-thumbs',\n },\n });\n\n let initialized = false;\n let swiperCreated = false;\n\n swiper.thumbs = {\n swiper: null,\n };\n\n function onThumbClick() {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n const clickedIndex = thumbsSwiper.clickedIndex;\n const clickedSlide = thumbsSwiper.clickedSlide;\n if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass))\n return;\n if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n let slideToIndex;\n if (thumbsSwiper.params.loop) {\n slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n } else {\n slideToIndex = clickedIndex;\n }\n if (swiper.params.loop) {\n let currentIndex = swiper.activeIndex;\n if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n currentIndex = swiper.activeIndex;\n }\n const prevIndex = swiper.slides\n .eq(currentIndex)\n .prevAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n const nextIndex = swiper.slides\n .eq(currentIndex)\n .nextAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;\n else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;\n else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;\n else slideToIndex = prevIndex;\n }\n swiper.slideTo(slideToIndex);\n }\n\n function init() {\n const { thumbs: thumbsParams } = swiper.params;\n if (initialized) return false;\n initialized = true;\n const SwiperClass = swiper.constructor;\n if (thumbsParams.swiper instanceof SwiperClass) {\n swiper.thumbs.swiper = thumbsParams.swiper;\n Object.assign(swiper.thumbs.swiper.originalParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n Object.assign(swiper.thumbs.swiper.params, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n } else if (isObject(thumbsParams.swiper)) {\n const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n Object.assign(thumbsSwiperParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n swiperCreated = true;\n }\n swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n swiper.thumbs.swiper.on('tap', onThumbClick);\n return true;\n }\n\n function update(initial) {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n\n const slidesPerView =\n thumbsSwiper.params.slidesPerView === 'auto'\n ? thumbsSwiper.slidesPerViewDynamic()\n : thumbsSwiper.params.slidesPerView;\n\n const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n let currentThumbsIndex = thumbsSwiper.activeIndex;\n let newThumbsIndex;\n let direction;\n if (thumbsSwiper.params.loop) {\n if (\n thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .hasClass(thumbsSwiper.params.slideDuplicateClass)\n ) {\n thumbsSwiper.loopFix();\n // eslint-disable-next-line\n thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n currentThumbsIndex = thumbsSwiper.activeIndex;\n }\n // Find actual thumbs index to slide to\n const prevThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .prevAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n const nextThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .nextAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevThumbsIndex === 'undefined') {\n newThumbsIndex = nextThumbsIndex;\n } else if (typeof nextThumbsIndex === 'undefined') {\n newThumbsIndex = prevThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex =\n thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex = nextThumbsIndex;\n } else {\n newThumbsIndex = prevThumbsIndex;\n }\n direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n } else {\n newThumbsIndex = swiper.realIndex;\n direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n }\n if (useOffset) {\n newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n }\n\n if (\n thumbsSwiper.visibleSlidesIndexes &&\n thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0\n ) {\n if (thumbsSwiper.params.centeredSlides) {\n if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n } else {\n newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n }\n } else if (\n newThumbsIndex > currentThumbsIndex &&\n thumbsSwiper.params.slidesPerGroup === 1\n ) {\n // newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n }\n thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n }\n }\n\n // Activate thumbs\n let thumbsToActivate = 1;\n const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n thumbsToActivate = swiper.params.slidesPerView;\n }\n\n if (!swiper.params.thumbs.multipleActiveThumbs) {\n thumbsToActivate = 1;\n }\n\n thumbsToActivate = Math.floor(thumbsToActivate);\n\n thumbsSwiper.slides.removeClass(thumbActiveClass);\n if (\n thumbsSwiper.params.loop ||\n (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)\n ) {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.$wrapperEl\n .children(`[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`)\n .addClass(thumbActiveClass);\n }\n } else {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass);\n }\n }\n }\n\n on('beforeInit', () => {\n const { thumbs } = swiper.params;\n if (!thumbs || !thumbs.swiper) return;\n init();\n update(true);\n });\n on('slideChange update resize observerUpdate', () => {\n if (!swiper.thumbs.swiper) return;\n update();\n });\n on('setTransition', (_s, duration) => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n thumbsSwiper.setTransition(duration);\n });\n on('beforeDestroy', () => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n if (swiperCreated && thumbsSwiper) {\n thumbsSwiper.destroy();\n }\n });\n\n Object.assign(swiper.thumbs, {\n init,\n update,\n });\n}\n","import { now } from '../../shared/utils.js';\n\nexport default function freeMode({ swiper, extendParams, emit, once }) {\n extendParams({\n freeMode: {\n enabled: false,\n momentum: true,\n momentumRatio: 1,\n momentumBounce: true,\n momentumBounceRatio: 1,\n momentumVelocityRatio: 1,\n sticky: false,\n minimumVelocity: 0.02,\n },\n });\n\n function onTouchMove() {\n const { touchEventsData: data, touches } = swiper;\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime,\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: now(),\n });\n }\n\n function onTouchEnd({ currentPos }) {\n const { params, $wrapperEl, rtlTranslate: rtl, snapGrid, touchEventsData: data } = swiper;\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n\n if (params.freeMode.momentum) {\n if (data.velocities.length > 1) {\n const lastMoveEvent = data.velocities.pop();\n const velocityEvent = data.velocities.pop();\n\n const distance = lastMoveEvent.position - velocityEvent.position;\n const time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || now() - lastMoveEvent.time > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeMode.momentumVelocityRatio;\n\n data.velocities.length = 0;\n let momentumDuration = 1000 * params.freeMode.momentumRatio;\n const momentumDistance = swiper.velocity * momentumDuration;\n\n let newPosition = swiper.translate + momentumDistance;\n if (rtl) newPosition = -newPosition;\n\n let doBounce = false;\n let afterBouncePosition;\n const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n let needsLoopFix;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (params.freeMode.sticky) {\n let nextSlide;\n for (let j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n\n if (\n Math.abs(snapGrid[nextSlide] - newPosition) <\n Math.abs(snapGrid[nextSlide - 1] - newPosition) ||\n swiper.swipeDirection === 'next'\n ) {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n if (needsLoopFix) {\n once('transitionEnd', () => {\n swiper.loopFix();\n });\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n if (params.freeMode.sticky) {\n // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n // It's easy to see this when simulating touch with mouse events. To fix this,\n // limit single-slide swipes to the default slide duration. This also has the\n // nice side effect of matching slide speed if the user stopped moving before\n // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n // For faster swipes, also apply limits (albeit higher ones).\n const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n if (moveDistance < currentSlideSize) {\n momentumDuration = params.speed;\n } else if (moveDistance < 2 * currentSlideSize) {\n momentumDuration = params.speed * 1.5;\n } else {\n momentumDuration = params.speed * 2.5;\n }\n }\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (params.freeMode.momentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n emit('momentumBounce');\n swiper.setTransition(params.speed);\n setTimeout(() => {\n swiper.setTranslate(afterBouncePosition);\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }, 0);\n });\n } else if (swiper.velocity) {\n emit('_freeModeNoMomentumRelease');\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n } else if (params.freeMode) {\n emit('_freeModeNoMomentumRelease');\n }\n\n if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n }\n\n Object.assign(swiper, {\n freeMode: {\n onTouchMove,\n onTouchEnd,\n },\n });\n}\n","export default function Grid({ swiper, extendParams }) {\n extendParams({\n grid: {\n rows: 1,\n fill: 'column',\n },\n });\n\n let slidesNumberEvenToRows;\n let slidesPerRow;\n let numFullColumns;\n\n const initSlides = (slidesLength) => {\n const { slidesPerView } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n slidesPerRow = slidesNumberEvenToRows / rows;\n numFullColumns = Math.floor(slidesLength / rows);\n if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n slidesNumberEvenToRows = slidesLength;\n } else {\n slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n }\n if (slidesPerView !== 'auto' && fill === 'row') {\n slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n }\n };\n\n const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {\n const { slidesPerGroup, spaceBetween } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n // Set slides order\n let newSlideOrderIndex;\n let column;\n let row;\n if (fill === 'row' && slidesPerGroup > 1) {\n const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n const columnsInGroup =\n groupIndex === 0\n ? slidesPerGroup\n : Math.min(\n Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows),\n slidesPerGroup,\n );\n row = Math.floor(slideIndexInGroup / columnsInGroup);\n column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n\n newSlideOrderIndex = column + (row * slidesNumberEvenToRows) / rows;\n slide.css({\n '-webkit-order': newSlideOrderIndex,\n order: newSlideOrderIndex,\n });\n } else if (fill === 'column') {\n column = Math.floor(i / rows);\n row = i - column * rows;\n if (column > numFullColumns || (column === numFullColumns && row === rows - 1)) {\n row += 1;\n if (row >= rows) {\n row = 0;\n column += 1;\n }\n }\n } else {\n row = Math.floor(i / slidesPerRow);\n column = i - row * slidesPerRow;\n }\n slide.css(\n getDirectionLabel('margin-top'),\n row !== 0 ? spaceBetween && `${spaceBetween}px` : '',\n );\n };\n\n const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {\n const { spaceBetween, centeredSlides, roundLengths } = swiper.params;\n const { rows } = swiper.params.grid;\n swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n swiper.$wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px`,\n });\n if (centeredSlides) {\n snapGrid.splice(0, snapGrid.length);\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n }\n snapGrid.push(...newSlidesGrid);\n }\n };\n\n swiper.grid = {\n initSlides,\n updateSlide,\n updateWrapperSize,\n };\n}\n","export default function appendSlide(slides) {\n const swiper = this;\n const { $wrapperEl, params } = swiper;\n if (params.loop) {\n swiper.loopDestroy();\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n } else {\n $wrapperEl.append(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n}\n","export default function prependSlide(slides) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n if (params.loop) {\n swiper.loopDestroy();\n }\n let newActiveIndex = activeIndex + 1;\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.prepend(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n $wrapperEl.prepend(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n}\n","export default function addSlide(index, slides) {\n const swiper = this;\n const { $wrapperEl, params, activeIndex } = swiper;\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n const baseLength = swiper.slides.length;\n if (index <= 0) {\n swiper.prependSlide(slides);\n return;\n }\n if (index >= baseLength) {\n swiper.appendSlide(slides);\n return;\n }\n let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n const slidesBuffer = [];\n for (let i = baseLength - 1; i >= index; i -= 1) {\n const currentSlide = swiper.slides.eq(i);\n currentSlide.remove();\n slidesBuffer.unshift(currentSlide);\n }\n\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n newActiveIndex =\n activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n } else {\n $wrapperEl.append(slides);\n }\n\n for (let i = 0; i < slidesBuffer.length; i += 1) {\n $wrapperEl.append(slidesBuffer[i]);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeSlide(slidesIndexes) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n let newActiveIndex = activeIndexBuffer;\n let indexToRemove;\n\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (let i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeAllSlides() {\n const swiper = this;\n\n const slidesIndexes = [];\n for (let i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n}\n","import appendSlide from './methods/appendSlide.js';\nimport prependSlide from './methods/prependSlide.js';\nimport addSlide from './methods/addSlide.js';\nimport removeSlide from './methods/removeSlide.js';\nimport removeAllSlides from './methods/removeAllSlides.js';\n\nexport default function Manipulation({ swiper }) {\n Object.assign(swiper, {\n appendSlide: appendSlide.bind(swiper),\n prependSlide: prependSlide.bind(swiper),\n addSlide: addSlide.bind(swiper),\n removeSlide: removeSlide.bind(swiper),\n removeAllSlides: removeAllSlides.bind(swiper),\n });\n}\n","export default function effectInit(params) {\n const { effect, swiper, on, setTranslate, setTransition, overwriteParams, perspective } = params;\n\n on('beforeInit', () => {\n if (swiper.params.effect !== effect) return;\n swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n if (perspective && perspective()) {\n swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n }\n\n const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n\n Object.assign(swiper.params, overwriteParamsResult);\n Object.assign(swiper.originalParams, overwriteParamsResult);\n });\n on('setTranslate', () => {\n if (swiper.params.effect !== effect) return;\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n if (swiper.params.effect !== effect) return;\n setTransition(duration);\n });\n}\n","export default function effectTarget(effectParams, $slideEl) {\n if (effectParams.transformEl) {\n return $slideEl.find(effectParams.transformEl).css({\n 'backface-visibility': 'hidden',\n '-webkit-backface-visibility': 'hidden',\n });\n }\n return $slideEl;\n}\n","export default function effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides }) {\n const { slides, activeIndex, $wrapperEl } = swiper;\n if (swiper.params.virtualTranslate && duration !== 0) {\n let eventTriggered = false;\n let $transitionEndTarget;\n if (allSlides) {\n $transitionEndTarget = transformEl ? slides.find(transformEl) : slides;\n } else {\n $transitionEndTarget = transformEl\n ? slides.eq(activeIndex).find(transformEl)\n : slides.eq(activeIndex);\n }\n $transitionEndTarget.transitionEnd(() => {\n if (eventTriggered) return;\n if (!swiper || swiper.destroyed) return;\n eventTriggered = true;\n swiper.animating = false;\n const triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (let i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n}\n","import effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFade({ swiper, extendParams, on }) {\n extendParams({\n fadeEffect: {\n crossFade: false,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides } = swiper;\n const params = swiper.params.fadeEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = swiper.slides.eq(i);\n const offset = $slideEl[0].swiperSlideOffset;\n let tx = -offset;\n if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n const slideOpacity = swiper.params.fadeEffect.crossFade\n ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl\n .css({\n opacity: slideOpacity,\n })\n .transform(`translate3d(${tx}px, ${ty}px, 0px)`);\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.fadeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'fade',\n swiper,\n on,\n setTranslate,\n setTransition,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import $ from '../../shared/dom.js';\nimport effectInit from '../../shared/effect-init.js';\n\nexport default function EffectCube({ swiper, extendParams, on }) {\n extendParams({\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n });\n\n const setTranslate = () => {\n const {\n $el,\n $wrapperEl,\n slides,\n width: swiperWidth,\n height: swiperHeight,\n rtlTranslate: rtl,\n size: swiperSize,\n browser,\n } = swiper;\n const params = swiper.params.cubeEffect;\n const isHorizontal = swiper.isHorizontal();\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let wrapperRotate = 0;\n let $cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
');\n $wrapperEl.append($cubeShadowEl);\n }\n $cubeShadowEl.css({ height: `${swiperWidth}px` });\n } else {\n $cubeShadowEl = $el.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
');\n $el.append($cubeShadowEl);\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n }\n let slideAngle = slideIndex * 90;\n let round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n const progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n let tx = 0;\n let ty = 0;\n let tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + round * 4 * swiperSize;\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = 3 * swiperSize + swiperSize * 4 * round;\n }\n if (rtl) {\n tx = -tx;\n }\n\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n\n const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${\n isHorizontal ? slideAngle : 0\n }deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n if (progress <= 1 && progress > -1) {\n wrapperRotate = slideIndex * 90 + progress * 90;\n if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n }\n $slideEl.transform(transform);\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $(\n `
`,\n );\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $(\n `
`,\n );\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n }\n $wrapperEl.css({\n '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`,\n 'transform-origin': `50% 50% -${swiperSize / 2}px`,\n });\n\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl.transform(\n `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${\n -swiperWidth / 2\n }px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`,\n );\n } else {\n const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n const multiplier =\n 1.5 -\n (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2 +\n Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2);\n const scale1 = params.shadowScale;\n const scale2 = params.shadowScale / multiplier;\n const offset = params.shadowOffset;\n $cubeShadowEl.transform(\n `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${\n -swiperHeight / 2 / scale2\n }px) rotateX(-90deg)`,\n );\n }\n }\n const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;\n $wrapperEl.transform(\n `translate3d(0px,0,${zFactor}px) rotateX(${\n swiper.isHorizontal() ? 0 : wrapperRotate\n }deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`,\n );\n };\n const setTransition = (duration) => {\n const { $el, slides } = swiper;\n slides\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n $el.find('.swiper-cube-shadow').transition(duration);\n }\n };\n\n effectInit({\n effect: 'cube',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true,\n }),\n });\n}\n","import $ from './dom.js';\n\nexport default function createShadow(params, $slideEl, side) {\n const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`;\n const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl;\n let $shadowEl = $shadowContainer.children(`.${shadowClass}`);\n\n if (!$shadowEl.length) {\n $shadowEl = $(`
`);\n $shadowContainer.append($shadowEl);\n }\n return $shadowEl;\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFlip({ swiper, extendParams, on }) {\n extendParams({\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, rtlTranslate: rtl } = swiper;\n const params = swiper.params.flipEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let progress = $slideEl[0].progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n }\n const offset = $slideEl[0].swiperSlideOffset;\n const rotate = -180 * progress;\n let rotateY = rotate;\n let rotateX = 0;\n let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (rtl) {\n rotateY = -rotateY;\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top');\n }\n if (shadowAfter.length === 0) {\n shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.flipEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'flip',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\n\nexport default function EffectCoverflow({ swiper, extendParams, on }) {\n extendParams({\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n scale: 1,\n modifier: 1,\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { width: swiperWidth, height: swiperHeight, slides, slidesSizesGrid } = swiper;\n const params = swiper.params.coverflowEffect;\n const isHorizontal = swiper.isHorizontal();\n const transform = swiper.translate;\n const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n const rotate = isHorizontal ? params.rotate : -params.rotate;\n const translate = params.depth;\n // Each slide offset from center\n for (let i = 0, length = slides.length; i < length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideSize = slidesSizesGrid[i];\n const slideOffset = $slideEl[0].swiperSlideOffset;\n const offsetMultiplier =\n ((center - slideOffset - slideSize / 2) / slideSize) * params.modifier;\n\n let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n let translateZ = -translate * Math.abs(offsetMultiplier);\n\n let stretch = params.stretch;\n // Allow percentage to make a relative stretch for responsive sliders\n if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n stretch = (parseFloat(params.stretch) / 100) * slideSize;\n }\n let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n\n let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) translateX = 0;\n if (Math.abs(translateY) < 0.001) translateY = 0;\n if (Math.abs(translateZ) < 0.001) translateZ = 0;\n if (Math.abs(rotateY) < 0.001) rotateY = 0;\n if (Math.abs(rotateX) < 0.001) rotateX = 0;\n if (Math.abs(scale) < 0.001) scale = 0;\n\n const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(slideTransform);\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowBeforeEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let $shadowAfterEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if ($shadowBeforeEl.length === 0) {\n $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top');\n }\n if ($shadowAfterEl.length === 0) {\n $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom');\n }\n if ($shadowBeforeEl.length)\n $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n if ($shadowAfterEl.length)\n $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n }\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.coverflowEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n };\n\n effectInit({\n effect: 'coverflow',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCreative({ swiper, extendParams, on }) {\n extendParams({\n creativeEffect: {\n transformEl: null,\n limitProgress: 1,\n shadowPerProgress: false,\n progressMultiplier: 1,\n perspective: true,\n prev: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n next: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n },\n });\n\n const getTranslateValue = (value) => {\n if (typeof value === 'string') return value;\n return `${value}px`;\n };\n\n const setTranslate = () => {\n const { slides, $wrapperEl, slidesSizesGrid } = swiper;\n const params = swiper.params.creativeEffect;\n const { progressMultiplier: multiplier } = params;\n\n const isCenteredSlides = swiper.params.centeredSlides;\n\n if (isCenteredSlides) {\n const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;\n $wrapperEl.transform(`translateX(calc(50% - ${margin}px))`);\n }\n\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(\n Math.max($slideEl[0].progress, -params.limitProgress),\n params.limitProgress,\n );\n let originalProgress = progress;\n\n if (!isCenteredSlides) {\n originalProgress = Math.min(\n Math.max($slideEl[0].originalProgress, -params.limitProgress),\n params.limitProgress,\n );\n }\n\n const offset = $slideEl[0].swiperSlideOffset;\n const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n const r = [0, 0, 0];\n let custom = false;\n if (!swiper.isHorizontal()) {\n t[1] = t[0];\n t[0] = 0;\n }\n let data = {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n scale: 1,\n opacity: 1,\n };\n if (progress < 0) {\n data = params.next;\n custom = true;\n } else if (progress > 0) {\n data = params.prev;\n custom = true;\n }\n // set translate\n t.forEach((value, index) => {\n t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(\n progress * multiplier,\n )}))`;\n });\n // set rotates\n r.forEach((value, index) => {\n r[index] = data.rotate[index] * Math.abs(progress * multiplier);\n });\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n\n const translateString = t.join(', ');\n const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;\n const scaleString =\n originalProgress < 0\n ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})`\n : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;\n const opacityString =\n originalProgress < 0\n ? 1 + (1 - data.opacity) * originalProgress * multiplier\n : 1 - (1 - data.opacity) * originalProgress * multiplier;\n const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n // Set shadows\n if ((custom && data.shadow) || !custom) {\n let $shadowEl = $slideEl.children('.swiper-slide-shadow');\n if ($shadowEl.length === 0 && data.shadow) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length) {\n const shadowOpacity = params.shadowPerProgress\n ? progress * (1 / params.limitProgress)\n : progress;\n $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n }\n }\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform).css({ opacity: opacityString });\n if (data.origin) {\n $targetEl.css('transform-origin', data.origin);\n }\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.creativeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'creative',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => swiper.params.creativeEffect.perspective,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCards({ swiper, extendParams, on }) {\n extendParams({\n cardsEffect: {\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, activeIndex } = swiper;\n const params = swiper.params.cardsEffect;\n const { startTranslate, isTouched } = swiper.touchEventsData;\n const currentTranslate = swiper.translate;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(Math.max(slideProgress, -4), 4);\n let offset = $slideEl[0].swiperSlideOffset;\n if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`);\n }\n if (swiper.params.centeredSlides && swiper.params.cssMode) {\n offset -= slides[0].swiperSlideOffset;\n }\n let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let tY = 0;\n const tZ = -100 * Math.abs(progress);\n let scale = 1;\n let rotate = -2 * progress;\n\n let tXAdd = 8 - Math.abs(progress) * 0.75;\n\n const isSwipeToNext =\n (i === activeIndex || i === activeIndex - 1) &&\n progress > 0 &&\n progress < 1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate < startTranslate;\n const isSwipeToPrev =\n (i === activeIndex || i === activeIndex + 1) &&\n progress < 0 &&\n progress > -1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate > startTranslate;\n if (isSwipeToNext || isSwipeToPrev) {\n const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n rotate += -28 * progress * subProgress;\n scale += -0.5 * subProgress;\n tXAdd += 96 * subProgress;\n tY = `${-25 * subProgress * Math.abs(progress)}%`;\n }\n\n if (progress < 0) {\n // next\n tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`;\n } else if (progress > 0) {\n // prev\n tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`;\n } else {\n tX = `${tX}px`;\n }\n if (!swiper.isHorizontal()) {\n const prevY = tY;\n tY = tX;\n tX = prevY;\n }\n\n const scaleString =\n progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n const transform = `\n translate3d(${tX}, ${tY}, ${tZ}px)\n rotateZ(${rotate}deg)\n scale(${scaleString})\n `;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowEl = $slideEl.find('.swiper-slide-shadow');\n if ($shadowEl.length === 0) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length)\n $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.cardsEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'cards',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","// Swiper Class\nimport Swiper from './core/core.js';\n\n//IMPORT_MODULES\n\nconst modules = [\n //INSTALL_MODULES\n];\n\nSwiper.use(modules);\n\n//EXPORT\n"]} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.js b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.js new file mode 100644 index 0000000..53bcad1 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.esm.js @@ -0,0 +1,42 @@ +/** + * Swiper 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +import Swiper from './core/core.js'; +export { default as Swiper, default } from './core/core.js'; +import Virtual from './modules/virtual/virtual.js'; +import Keyboard from './modules/keyboard/keyboard.js'; +import Mousewheel from './modules/mousewheel/mousewheel.js'; +import Navigation from './modules/navigation/navigation.js'; +import Pagination from './modules/pagination/pagination.js'; +import Scrollbar from './modules/scrollbar/scrollbar.js'; +import Parallax from './modules/parallax/parallax.js'; +import Zoom from './modules/zoom/zoom.js'; +import Lazy from './modules/lazy/lazy.js'; +import Controller from './modules/controller/controller.js'; +import A11y from './modules/a11y/a11y.js'; +import History from './modules/history/history.js'; +import HashNavigation from './modules/hash-navigation/hash-navigation.js'; +import Autoplay from './modules/autoplay/autoplay.js'; +import Thumbs from './modules/thumbs/thumbs.js'; +import FreeMode from './modules/free-mode/free-mode.js'; +import Grid from './modules/grid/grid.js'; +import Manipulation from './modules/manipulation/manipulation.js'; +import EffectFade from './modules/effect-fade/effect-fade.js'; +import EffectCube from './modules/effect-cube/effect-cube.js'; +import EffectFlip from './modules/effect-flip/effect-flip.js'; +import EffectCoverflow from './modules/effect-coverflow/effect-coverflow.js'; +import EffectCreative from './modules/effect-creative/effect-creative.js'; +import EffectCards from './modules/effect-cards/effect-cards.js'; + +// Swiper Class +const modules = [Virtual, Keyboard, Mousewheel, Navigation, Pagination, Scrollbar, Parallax, Zoom, Lazy, Controller, A11y, History, HashNavigation, Autoplay, Thumbs, FreeMode, Grid, Manipulation, EffectFade, EffectCube, EffectFlip, EffectCoverflow, EffectCreative, EffectCards]; +Swiper.use(modules); diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.js b/src/main/resources/static/assets/js/swiper/swiper-bundle.js new file mode 100644 index 0000000..c7c191e --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.js @@ -0,0 +1,10068 @@ +/** + * Swiper 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +(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.Swiper = factory()); +}(this, (function () { 'use strict'; + + /** + * SSR Window 4.0.1 + * Better handling for window object in SSR environment + * https://github.com/nolimits4web/ssr-window + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ + + /* eslint-disable no-param-reassign */ + function isObject$1(obj) { + return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object; + } + + function extend$1(target = {}, src = {}) { + Object.keys(src).forEach(key => { + if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject$1(src[key]) && isObject$1(target[key]) && Object.keys(src[key]).length > 0) { + extend$1(target[key], src[key]); + } + }); + } + + const ssrDocument = { + body: {}, + + addEventListener() {}, + + removeEventListener() {}, + + activeElement: { + blur() {}, + + nodeName: '' + }, + + querySelector() { + return null; + }, + + querySelectorAll() { + return []; + }, + + getElementById() { + return null; + }, + + createEvent() { + return { + initEvent() {} + + }; + }, + + createElement() { + return { + children: [], + childNodes: [], + style: {}, + + setAttribute() {}, + + getElementsByTagName() { + return []; + } + + }; + }, + + createElementNS() { + return {}; + }, + + importNode() { + return null; + }, + + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '' + } + }; + + function getDocument() { + const doc = typeof document !== 'undefined' ? document : {}; + extend$1(doc, ssrDocument); + return doc; + } + + const ssrWindow = { + document: ssrDocument, + navigator: { + userAgent: '' + }, + location: { + hash: '', + host: '', + hostname: '', + href: '', + origin: '', + pathname: '', + protocol: '', + search: '' + }, + history: { + replaceState() {}, + + pushState() {}, + + go() {}, + + back() {} + + }, + CustomEvent: function CustomEvent() { + return this; + }, + + addEventListener() {}, + + removeEventListener() {}, + + getComputedStyle() { + return { + getPropertyValue() { + return ''; + } + + }; + }, + + Image() {}, + + Date() {}, + + screen: {}, + + setTimeout() {}, + + clearTimeout() {}, + + matchMedia() { + return {}; + }, + + requestAnimationFrame(callback) { + if (typeof setTimeout === 'undefined') { + callback(); + return null; + } + + return setTimeout(callback, 0); + }, + + cancelAnimationFrame(id) { + if (typeof setTimeout === 'undefined') { + return; + } + + clearTimeout(id); + } + + }; + + function getWindow() { + const win = typeof window !== 'undefined' ? window : {}; + extend$1(win, ssrWindow); + return win; + } + + /** + * Dom7 4.0.1 + * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API + * https://framework7.io/docs/dom7.html + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: October 27, 2021 + */ + /* eslint-disable no-proto */ + + function makeReactive(obj) { + const proto = obj.__proto__; + Object.defineProperty(obj, '__proto__', { + get() { + return proto; + }, + + set(value) { + proto.__proto__ = value; + } + + }); + } + + class Dom7 extends Array { + constructor(items) { + super(...(items || [])); + makeReactive(this); + } + + } + + function arrayFlat(arr = []) { + const res = []; + arr.forEach(el => { + if (Array.isArray(el)) { + res.push(...arrayFlat(el)); + } else { + res.push(el); + } + }); + return res; + } + + function arrayFilter(arr, callback) { + return Array.prototype.filter.call(arr, callback); + } + + function arrayUnique(arr) { + const uniqueArray = []; + + for (let i = 0; i < arr.length; i += 1) { + if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]); + } + + return uniqueArray; + } + + + function qsa(selector, context) { + if (typeof selector !== 'string') { + return [selector]; + } + + const a = []; + const res = context.querySelectorAll(selector); + + for (let i = 0; i < res.length; i += 1) { + a.push(res[i]); + } + + return a; + } + + function $(selector, context) { + const window = getWindow(); + const document = getDocument(); + let arr = []; + + if (!context && selector instanceof Dom7) { + return selector; + } + + if (!selector) { + return new Dom7(arr); + } + + if (typeof selector === 'string') { + const html = selector.trim(); + + if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) { + let toCreate = 'div'; + if (html.indexOf(' c.split(' '))); + this.forEach(el => { + el.classList.add(...classNames); + }); + return this; + } + + function removeClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + this.forEach(el => { + el.classList.remove(...classNames); + }); + return this; + } + + function toggleClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + this.forEach(el => { + classNames.forEach(className => { + el.classList.toggle(className); + }); + }); + } + + function hasClass(...classes) { + const classNames = arrayFlat(classes.map(c => c.split(' '))); + return arrayFilter(this, el => { + return classNames.filter(className => el.classList.contains(className)).length > 0; + }).length > 0; + } + + function attr(attrs, value) { + if (arguments.length === 1 && typeof attrs === 'string') { + // Get attr + if (this[0]) return this[0].getAttribute(attrs); + return undefined; + } // Set attrs + + + for (let i = 0; i < this.length; i += 1) { + if (arguments.length === 2) { + // String + this[i].setAttribute(attrs, value); + } else { + // Object + for (const attrName in attrs) { + this[i][attrName] = attrs[attrName]; + this[i].setAttribute(attrName, attrs[attrName]); + } + } + } + + return this; + } + + function removeAttr(attr) { + for (let i = 0; i < this.length; i += 1) { + this[i].removeAttribute(attr); + } + + return this; + } + + function transform(transform) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transform = transform; + } + + return this; + } + + function transition$1(duration) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration; + } + + return this; + } + + function on(...args) { + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + + function handleLiveEvent(e) { + const target = e.target; + if (!target) return; + const eventData = e.target.dom7EventData || []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + if ($(target).is(targetSelector)) listener.apply(target, eventData);else { + const parents = $(target).parents(); // eslint-disable-line + + for (let k = 0; k < parents.length; k += 1) { + if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData); + } + } + } + + function handleEvent(e) { + const eventData = e && e.target ? e.target.dom7EventData || [] : []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + listener.apply(this, eventData); + } + + const events = eventType.split(' '); + let j; + + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (!targetSelector) { + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7Listeners) el.dom7Listeners = {}; + if (!el.dom7Listeners[event]) el.dom7Listeners[event] = []; + el.dom7Listeners[event].push({ + listener, + proxyListener: handleEvent + }); + el.addEventListener(event, handleEvent, capture); + } + } else { + // Live events + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7LiveListeners) el.dom7LiveListeners = {}; + if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = []; + el.dom7LiveListeners[event].push({ + listener, + proxyListener: handleLiveEvent + }); + el.addEventListener(event, handleLiveEvent, capture); + } + } + } + + return this; + } + + function off(...args) { + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === 'function') { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + const events = eventType.split(' '); + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + let handlers; + + if (!targetSelector && el.dom7Listeners) { + handlers = el.dom7Listeners[event]; + } else if (targetSelector && el.dom7LiveListeners) { + handlers = el.dom7LiveListeners[event]; + } + + if (handlers && handlers.length) { + for (let k = handlers.length - 1; k >= 0; k -= 1) { + const handler = handlers[k]; + + if (listener && handler.listener === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (!listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } + } + } + } + } + + return this; + } + + function trigger(...args) { + const window = getWindow(); + const events = args[0].split(' '); + const eventData = args[1]; + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + + if (window.CustomEvent) { + const evt = new window.CustomEvent(event, { + detail: eventData, + bubbles: true, + cancelable: true + }); + el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0); + el.dispatchEvent(evt); + el.dom7EventData = []; + delete el.dom7EventData; + } + } + } + + return this; + } + + function transitionEnd$1(callback) { + const dom = this; + + function fireCallBack(e) { + if (e.target !== this) return; + callback.call(this, e); + dom.off('transitionend', fireCallBack); + } + + if (callback) { + dom.on('transitionend', fireCallBack); + } + + return this; + } + + function outerWidth(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left')); + } + + return this[0].offsetWidth; + } + + return null; + } + + function outerHeight(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom')); + } + + return this[0].offsetHeight; + } + + return null; + } + + function offset() { + if (this.length > 0) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + const box = el.getBoundingClientRect(); + const body = document.body; + const clientTop = el.clientTop || body.clientTop || 0; + const clientLeft = el.clientLeft || body.clientLeft || 0; + const scrollTop = el === window ? window.scrollY : el.scrollTop; + const scrollLeft = el === window ? window.scrollX : el.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft + }; + } + + return null; + } + + function styles() { + const window = getWindow(); + if (this[0]) return window.getComputedStyle(this[0], null); + return {}; + } + + function css(props, value) { + const window = getWindow(); + let i; + + if (arguments.length === 1) { + if (typeof props === 'string') { + // .css('width') + if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props); + } else { + // .css({ width: '100px' }) + for (i = 0; i < this.length; i += 1) { + for (const prop in props) { + this[i].style[prop] = props[prop]; + } + } + + return this; + } + } + + if (arguments.length === 2 && typeof props === 'string') { + // .css('width', '100px') + for (i = 0; i < this.length; i += 1) { + this[i].style[props] = value; + } + + return this; + } + + return this; + } + + function each(callback) { + if (!callback) return this; + this.forEach((el, index) => { + callback.apply(el, [el, index]); + }); + return this; + } + + function filter(callback) { + const result = arrayFilter(this, callback); + return $(result); + } + + function html(html) { + if (typeof html === 'undefined') { + return this[0] ? this[0].innerHTML : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].innerHTML = html; + } + + return this; + } + + function text(text) { + if (typeof text === 'undefined') { + return this[0] ? this[0].textContent.trim() : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].textContent = text; + } + + return this; + } + + function is(selector) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + let compareWith; + let i; + if (!el || typeof selector === 'undefined') return false; + + if (typeof selector === 'string') { + if (el.matches) return el.matches(selector); + if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector); + if (el.msMatchesSelector) return el.msMatchesSelector(selector); + compareWith = $(selector); + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + if (selector === document) { + return el === document; + } + + if (selector === window) { + return el === window; + } + + if (selector.nodeType || selector instanceof Dom7) { + compareWith = selector.nodeType ? [selector] : selector; + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + return false; + } + + function index() { + let child = this[0]; + let i; + + if (child) { + i = 0; // eslint-disable-next-line + + while ((child = child.previousSibling) !== null) { + if (child.nodeType === 1) i += 1; + } + + return i; + } + + return undefined; + } + + function eq(index) { + if (typeof index === 'undefined') return this; + const length = this.length; + + if (index > length - 1) { + return $([]); + } + + if (index < 0) { + const returnIndex = length + index; + if (returnIndex < 0) return $([]); + return $([this[returnIndex]]); + } + + return $([this[index]]); + } + + function append(...els) { + let newChild; + const document = getDocument(); + + for (let k = 0; k < els.length; k += 1) { + newChild = els[k]; + + for (let i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + + while (tempDiv.firstChild) { + this[i].appendChild(tempDiv.firstChild); + } + } else if (newChild instanceof Dom7) { + for (let j = 0; j < newChild.length; j += 1) { + this[i].appendChild(newChild[j]); + } + } else { + this[i].appendChild(newChild); + } + } + } + + return this; + } + + function prepend(newChild) { + const document = getDocument(); + let i; + let j; + + for (i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + + for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) { + this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); + } + } else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j += 1) { + this[i].insertBefore(newChild[j], this[i].childNodes[0]); + } + } else { + this[i].insertBefore(newChild, this[i].childNodes[0]); + } + } + + return this; + } + + function next(selector) { + if (this.length > 0) { + if (selector) { + if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) { + return $([this[0].nextElementSibling]); + } + + return $([]); + } + + if (this[0].nextElementSibling) return $([this[0].nextElementSibling]); + return $([]); + } + + return $([]); + } + + function nextAll(selector) { + const nextEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.nextElementSibling) { + const next = el.nextElementSibling; // eslint-disable-line + + if (selector) { + if ($(next).is(selector)) nextEls.push(next); + } else nextEls.push(next); + + el = next; + } + + return $(nextEls); + } + + function prev(selector) { + if (this.length > 0) { + const el = this[0]; + + if (selector) { + if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) { + return $([el.previousElementSibling]); + } + + return $([]); + } + + if (el.previousElementSibling) return $([el.previousElementSibling]); + return $([]); + } + + return $([]); + } + + function prevAll(selector) { + const prevEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.previousElementSibling) { + const prev = el.previousElementSibling; // eslint-disable-line + + if (selector) { + if ($(prev).is(selector)) prevEls.push(prev); + } else prevEls.push(prev); + + el = prev; + } + + return $(prevEls); + } + + function parent(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode !== null) { + if (selector) { + if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode); + } else { + parents.push(this[i].parentNode); + } + } + } + + return $(parents); + } + + function parents(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + let parent = this[i].parentNode; // eslint-disable-line + + while (parent) { + if (selector) { + if ($(parent).is(selector)) parents.push(parent); + } else { + parents.push(parent); + } + + parent = parent.parentNode; + } + } + + return $(parents); + } + + function closest(selector) { + let closest = this; // eslint-disable-line + + if (typeof selector === 'undefined') { + return $([]); + } + + if (!closest.is(selector)) { + closest = closest.parents(selector).eq(0); + } + + return closest; + } + + function find(selector) { + const foundElements = []; + + for (let i = 0; i < this.length; i += 1) { + const found = this[i].querySelectorAll(selector); + + for (let j = 0; j < found.length; j += 1) { + foundElements.push(found[j]); + } + } + + return $(foundElements); + } + + function children(selector) { + const children = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + const childNodes = this[i].children; + + for (let j = 0; j < childNodes.length; j += 1) { + if (!selector || $(childNodes[j]).is(selector)) { + children.push(childNodes[j]); + } + } + } + + return $(children); + } + + function remove() { + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode) this[i].parentNode.removeChild(this[i]); + } + + return this; + } + + const Methods = { + addClass, + removeClass, + hasClass, + toggleClass, + attr, + removeAttr, + transform, + transition: transition$1, + on, + off, + trigger, + transitionEnd: transitionEnd$1, + outerWidth, + outerHeight, + styles, + offset, + css, + each, + html, + text, + is, + index, + eq, + append, + prepend, + next, + nextAll, + prev, + prevAll, + parent, + parents, + closest, + find, + children, + filter, + remove + }; + Object.keys(Methods).forEach(methodName => { + Object.defineProperty($.fn, methodName, { + value: Methods[methodName], + writable: true + }); + }); + + function deleteProps(obj) { + const object = obj; + Object.keys(object).forEach(key => { + try { + object[key] = null; + } catch (e) {// no getter for object + } + + try { + delete object[key]; + } catch (e) {// something got wrong + } + }); + } + + function nextTick(callback, delay = 0) { + return setTimeout(callback, delay); + } + + function now() { + return Date.now(); + } + + function getComputedStyle$1(el) { + const window = getWindow(); + let style; + + if (window.getComputedStyle) { + style = window.getComputedStyle(el, null); + } + + if (!style && el.currentStyle) { + style = el.currentStyle; + } + + if (!style) { + style = el.style; + } + + return style; + } + + function getTranslate(el, axis = 'x') { + const window = getWindow(); + let matrix; + let curTransform; + let transformMatrix; + const curStyle = getComputedStyle$1(el); + + if (window.WebKitCSSMatrix) { + curTransform = curStyle.transform || curStyle.webkitTransform; + + if (curTransform.split(',').length > 6) { + curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', '); + } // Some old versions of Webkit choke when 'none' is passed; pass + // empty string instead in this case + + + transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); + } else { + transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); + matrix = transformMatrix.toString().split(','); + } + + if (axis === 'x') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers + else curTransform = parseFloat(matrix[4]); + } + + if (axis === 'y') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers + else curTransform = parseFloat(matrix[5]); + } + + return curTransform || 0; + } + + function isObject(o) { + return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object'; + } + + function isNode(node) { + // eslint-disable-next-line + if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') { + return node instanceof HTMLElement; + } + + return node && (node.nodeType === 1 || node.nodeType === 11); + } + + function extend(...args) { + const to = Object(args[0]); + const noExtend = ['__proto__', 'constructor', 'prototype']; + + for (let i = 1; i < args.length; i += 1) { + const nextSource = args[i]; + + if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) { + const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0); + + for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { + const nextKey = keysArray[nextIndex]; + const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); + + if (desc !== undefined && desc.enumerable) { + if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) { + if (nextSource[nextKey].__swiper__) { + to[nextKey] = nextSource[nextKey]; + } else { + extend(to[nextKey], nextSource[nextKey]); + } + } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) { + to[nextKey] = {}; + + if (nextSource[nextKey].__swiper__) { + to[nextKey] = nextSource[nextKey]; + } else { + extend(to[nextKey], nextSource[nextKey]); + } + } else { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + } + + return to; + } + + function setCSSProperty(el, varName, varValue) { + el.style.setProperty(varName, varValue); + } + + function animateCSSModeScroll({ + swiper, + targetPosition, + side + }) { + const window = getWindow(); + const startPosition = -swiper.translate; + let startTime = null; + let time; + const duration = swiper.params.speed; + swiper.wrapperEl.style.scrollSnapType = 'none'; + window.cancelAnimationFrame(swiper.cssModeFrameID); + const dir = targetPosition > startPosition ? 'next' : 'prev'; + + const isOutOfBound = (current, target) => { + return dir === 'next' && current >= target || dir === 'prev' && current <= target; + }; + + const animate = () => { + time = new Date().getTime(); + + if (startTime === null) { + startTime = time; + } + + const progress = Math.max(Math.min((time - startTime) / duration, 1), 0); + const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2; + let currentPosition = startPosition + easeProgress * (targetPosition - startPosition); + + if (isOutOfBound(currentPosition, targetPosition)) { + currentPosition = targetPosition; + } + + swiper.wrapperEl.scrollTo({ + [side]: currentPosition + }); + + if (isOutOfBound(currentPosition, targetPosition)) { + swiper.wrapperEl.style.overflow = 'hidden'; + swiper.wrapperEl.style.scrollSnapType = ''; + setTimeout(() => { + swiper.wrapperEl.style.overflow = ''; + swiper.wrapperEl.scrollTo({ + [side]: currentPosition + }); + }); + window.cancelAnimationFrame(swiper.cssModeFrameID); + return; + } + + swiper.cssModeFrameID = window.requestAnimationFrame(animate); + }; + + animate(); + } + + let support; + + function calcSupport() { + const window = getWindow(); + const document = getDocument(); + return { + smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style, + touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch), + passiveListener: function checkPassiveListener() { + let supportsPassive = false; + + try { + const opts = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line + get() { + supportsPassive = true; + } + + }); + window.addEventListener('testPassiveListener', null, opts); + } catch (e) {// No support + } + + return supportsPassive; + }(), + gestures: function checkGestures() { + return 'ongesturestart' in window; + }() + }; + } + + function getSupport() { + if (!support) { + support = calcSupport(); + } + + return support; + } + + let deviceCached; + + function calcDevice({ + userAgent + } = {}) { + const support = getSupport(); + const window = getWindow(); + const platform = window.navigator.platform; + const ua = userAgent || window.navigator.userAgent; + const device = { + ios: false, + android: false + }; + const screenWidth = window.screen.width; + const screenHeight = window.screen.height; + const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line + + let ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); + const windows = platform === 'Win32'; + let macos = platform === 'MacIntel'; // iPadOs 13 fix + + const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810']; + + if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) { + ipad = ua.match(/(Version)\/([\d.]+)/); + if (!ipad) ipad = [0, 1, '13_0_0']; + macos = false; + } // Android + + + if (android && !windows) { + device.os = 'android'; + device.android = true; + } + + if (ipad || iphone || ipod) { + device.os = 'ios'; + device.ios = true; + } // Export object + + + return device; + } + + function getDevice(overrides = {}) { + if (!deviceCached) { + deviceCached = calcDevice(overrides); + } + + return deviceCached; + } + + let browser; + + function calcBrowser() { + const window = getWindow(); + + function isSafari() { + const ua = window.navigator.userAgent.toLowerCase(); + return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0; + } + + return { + isSafari: isSafari(), + isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent) + }; + } + + function getBrowser() { + if (!browser) { + browser = calcBrowser(); + } + + return browser; + } + + function Resize({ + swiper, + on, + emit + }) { + const window = getWindow(); + let observer = null; + + const resizeHandler = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + emit('beforeResize'); + emit('resize'); + }; + + const createObserver = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + observer = new ResizeObserver(entries => { + const { + width, + height + } = swiper; + let newWidth = width; + let newHeight = height; + entries.forEach(({ + contentBoxSize, + contentRect, + target + }) => { + if (target && target !== swiper.el) return; + newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize; + newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize; + }); + + if (newWidth !== width || newHeight !== height) { + resizeHandler(); + } + }); + observer.observe(swiper.el); + }; + + const removeObserver = () => { + if (observer && observer.unobserve && swiper.el) { + observer.unobserve(swiper.el); + observer = null; + } + }; + + const orientationChangeHandler = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + emit('orientationchange'); + }; + + on('init', () => { + if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') { + createObserver(); + return; + } + + window.addEventListener('resize', resizeHandler); + window.addEventListener('orientationchange', orientationChangeHandler); + }); + on('destroy', () => { + removeObserver(); + window.removeEventListener('resize', resizeHandler); + window.removeEventListener('orientationchange', orientationChangeHandler); + }); + } + + function Observer({ + swiper, + extendParams, + on, + emit + }) { + const observers = []; + const window = getWindow(); + + const attach = (target, options = {}) => { + const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver; + const observer = new ObserverFunc(mutations => { + // The observerUpdate event should only be triggered + // once despite the number of mutations. Additional + // triggers are redundant and are very costly + if (mutations.length === 1) { + emit('observerUpdate', mutations[0]); + return; + } + + const observerUpdate = function observerUpdate() { + emit('observerUpdate', mutations[0]); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(observerUpdate); + } else { + window.setTimeout(observerUpdate, 0); + } + }); + observer.observe(target, { + attributes: typeof options.attributes === 'undefined' ? true : options.attributes, + childList: typeof options.childList === 'undefined' ? true : options.childList, + characterData: typeof options.characterData === 'undefined' ? true : options.characterData + }); + observers.push(observer); + }; + + const init = () => { + if (!swiper.params.observer) return; + + if (swiper.params.observeParents) { + const containerParents = swiper.$el.parents(); + + for (let i = 0; i < containerParents.length; i += 1) { + attach(containerParents[i]); + } + } // Observe container + + + attach(swiper.$el[0], { + childList: swiper.params.observeSlideChildren + }); // Observe wrapper + + attach(swiper.$wrapperEl[0], { + attributes: false + }); + }; + + const destroy = () => { + observers.forEach(observer => { + observer.disconnect(); + }); + observers.splice(0, observers.length); + }; + + extendParams({ + observer: false, + observeParents: false, + observeSlideChildren: false + }); + on('init', init); + on('destroy', destroy); + } + + /* eslint-disable no-underscore-dangle */ + var eventsEmitter = { + on(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + const method = priority ? 'unshift' : 'push'; + events.split(' ').forEach(event => { + if (!self.eventsListeners[event]) self.eventsListeners[event] = []; + self.eventsListeners[event][method](handler); + }); + return self; + }, + + once(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + + function onceHandler(...args) { + self.off(events, onceHandler); + + if (onceHandler.__emitterProxy) { + delete onceHandler.__emitterProxy; + } + + handler.apply(self, args); + } + + onceHandler.__emitterProxy = handler; + return self.on(events, onceHandler, priority); + }, + + onAny(handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + const method = priority ? 'unshift' : 'push'; + + if (self.eventsAnyListeners.indexOf(handler) < 0) { + self.eventsAnyListeners[method](handler); + } + + return self; + }, + + offAny(handler) { + const self = this; + if (!self.eventsAnyListeners) return self; + const index = self.eventsAnyListeners.indexOf(handler); + + if (index >= 0) { + self.eventsAnyListeners.splice(index, 1); + } + + return self; + }, + + off(events, handler) { + const self = this; + if (!self.eventsListeners) return self; + events.split(' ').forEach(event => { + if (typeof handler === 'undefined') { + self.eventsListeners[event] = []; + } else if (self.eventsListeners[event]) { + self.eventsListeners[event].forEach((eventHandler, index) => { + if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) { + self.eventsListeners[event].splice(index, 1); + } + }); + } + }); + return self; + }, + + emit(...args) { + const self = this; + if (!self.eventsListeners) return self; + let events; + let data; + let context; + + if (typeof args[0] === 'string' || Array.isArray(args[0])) { + events = args[0]; + data = args.slice(1, args.length); + context = self; + } else { + events = args[0].events; + data = args[0].data; + context = args[0].context || self; + } + + data.unshift(context); + const eventsArray = Array.isArray(events) ? events : events.split(' '); + eventsArray.forEach(event => { + if (self.eventsAnyListeners && self.eventsAnyListeners.length) { + self.eventsAnyListeners.forEach(eventHandler => { + eventHandler.apply(context, [event, ...data]); + }); + } + + if (self.eventsListeners && self.eventsListeners[event]) { + self.eventsListeners[event].forEach(eventHandler => { + eventHandler.apply(context, data); + }); + } + }); + return self; + } + + }; + + function updateSize() { + const swiper = this; + let width; + let height; + const $el = swiper.$el; + + if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) { + width = swiper.params.width; + } else { + width = $el[0].clientWidth; + } + + if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) { + height = swiper.params.height; + } else { + height = $el[0].clientHeight; + } + + if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) { + return; + } // Subtract paddings + + + width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10); + height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10); + if (Number.isNaN(width)) width = 0; + if (Number.isNaN(height)) height = 0; + Object.assign(swiper, { + width, + height, + size: swiper.isHorizontal() ? width : height + }); + } + + function updateSlides() { + const swiper = this; + + function getDirectionLabel(property) { + if (swiper.isHorizontal()) { + return property; + } // prettier-ignore + + + return { + 'width': 'height', + 'margin-top': 'margin-left', + 'margin-bottom ': 'margin-right', + 'margin-left': 'margin-top', + 'margin-right': 'margin-bottom', + 'padding-left': 'padding-top', + 'padding-right': 'padding-bottom', + 'marginRight': 'marginBottom' + }[property]; + } + + function getDirectionPropertyValue(node, label) { + return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0); + } + + const params = swiper.params; + const { + $wrapperEl, + size: swiperSize, + rtlTranslate: rtl, + wrongRTL + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; + const slides = $wrapperEl.children(`.${swiper.params.slideClass}`); + const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; + let snapGrid = []; + const slidesGrid = []; + const slidesSizesGrid = []; + let offsetBefore = params.slidesOffsetBefore; + + if (typeof offsetBefore === 'function') { + offsetBefore = params.slidesOffsetBefore.call(swiper); + } + + let offsetAfter = params.slidesOffsetAfter; + + if (typeof offsetAfter === 'function') { + offsetAfter = params.slidesOffsetAfter.call(swiper); + } + + const previousSnapGridLength = swiper.snapGrid.length; + const previousSlidesGridLength = swiper.slidesGrid.length; + let spaceBetween = params.spaceBetween; + let slidePosition = -offsetBefore; + let prevSlideSize = 0; + let index = 0; + + if (typeof swiperSize === 'undefined') { + return; + } + + if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { + spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize; + } + + swiper.virtualSize = -spaceBetween; // reset margins + + if (rtl) slides.css({ + marginLeft: '', + marginBottom: '', + marginTop: '' + });else slides.css({ + marginRight: '', + marginBottom: '', + marginTop: '' + }); // reset cssMode offsets + + if (params.centeredSlides && params.cssMode) { + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', ''); + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', ''); + } + + const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid; + + if (gridEnabled) { + swiper.grid.initSlides(slidesLength); + } // Calc slides + + + let slideSize; + const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => { + return typeof params.breakpoints[key].slidesPerView !== 'undefined'; + }).length > 0; + + for (let i = 0; i < slidesLength; i += 1) { + slideSize = 0; + const slide = slides.eq(i); + + if (gridEnabled) { + swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel); + } + + if (slide.css('display') === 'none') continue; // eslint-disable-line + + if (params.slidesPerView === 'auto') { + if (shouldResetSlideSize) { + slides[i].style[getDirectionLabel('width')] = ``; + } + + const slideStyles = getComputedStyle(slide[0]); + const currentTransform = slide[0].style.transform; + const currentWebKitTransform = slide[0].style.webkitTransform; + + if (currentTransform) { + slide[0].style.transform = 'none'; + } + + if (currentWebKitTransform) { + slide[0].style.webkitTransform = 'none'; + } + + if (params.roundLengths) { + slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true); + } else { + // eslint-disable-next-line + const width = getDirectionPropertyValue(slideStyles, 'width'); + const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left'); + const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right'); + const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left'); + const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right'); + const boxSizing = slideStyles.getPropertyValue('box-sizing'); + + if (boxSizing && boxSizing === 'border-box') { + slideSize = width + marginLeft + marginRight; + } else { + const { + clientWidth, + offsetWidth + } = slide[0]; + slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth); + } + } + + if (currentTransform) { + slide[0].style.transform = currentTransform; + } + + if (currentWebKitTransform) { + slide[0].style.webkitTransform = currentWebKitTransform; + } + + if (params.roundLengths) slideSize = Math.floor(slideSize); + } else { + slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView; + if (params.roundLengths) slideSize = Math.floor(slideSize); + + if (slides[i]) { + slides[i].style[getDirectionLabel('width')] = `${slideSize}px`; + } + } + + if (slides[i]) { + slides[i].swiperSlideSize = slideSize; + } + + slidesSizesGrid.push(slideSize); + + if (params.centeredSlides) { + slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; + if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; + if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; + if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + } else { + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + slidePosition = slidePosition + slideSize + spaceBetween; + } + + swiper.virtualSize += slideSize + spaceBetween; + prevSlideSize = slideSize; + index += 1; + } + + swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; + + if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) { + $wrapperEl.css({ + width: `${swiper.virtualSize + params.spaceBetween}px` + }); + } + + if (params.setWrapperSize) { + $wrapperEl.css({ + [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px` + }); + } + + if (gridEnabled) { + swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel); + } // Remove last grid elements depending on width + + + if (!params.centeredSlides) { + const newSlidesGrid = []; + + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); + + if (snapGrid[i] <= swiper.virtualSize - swiperSize) { + newSlidesGrid.push(slidesGridItem); + } + } + + snapGrid = newSlidesGrid; + + if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { + snapGrid.push(swiper.virtualSize - swiperSize); + } + } + + if (snapGrid.length === 0) snapGrid = [0]; + + if (params.spaceBetween !== 0) { + const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight'); + slides.filter((_, slideIndex) => { + if (!params.cssMode) return true; + + if (slideIndex === slides.length - 1) { + return false; + } + + return true; + }).css({ + [key]: `${spaceBetween}px` + }); + } + + if (params.centeredSlides && params.centeredSlidesBounds) { + let allSlidesSize = 0; + slidesSizesGrid.forEach(slideSizeValue => { + allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + const maxSnap = allSlidesSize - swiperSize; + snapGrid = snapGrid.map(snap => { + if (snap < 0) return -offsetBefore; + if (snap > maxSnap) return maxSnap + offsetAfter; + return snap; + }); + } + + if (params.centerInsufficientSlides) { + let allSlidesSize = 0; + slidesSizesGrid.forEach(slideSizeValue => { + allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + + if (allSlidesSize < swiperSize) { + const allSlidesOffset = (swiperSize - allSlidesSize) / 2; + snapGrid.forEach((snap, snapIndex) => { + snapGrid[snapIndex] = snap - allSlidesOffset; + }); + slidesGrid.forEach((snap, snapIndex) => { + slidesGrid[snapIndex] = snap + allSlidesOffset; + }); + } + } + + Object.assign(swiper, { + slides, + snapGrid, + slidesGrid, + slidesSizesGrid + }); + + if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) { + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`); + setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`); + const addToSnapGrid = -swiper.snapGrid[0]; + const addToSlidesGrid = -swiper.slidesGrid[0]; + swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid); + swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid); + } + + if (slidesLength !== previousSlidesLength) { + swiper.emit('slidesLengthChange'); + } + + if (snapGrid.length !== previousSnapGridLength) { + if (swiper.params.watchOverflow) swiper.checkOverflow(); + swiper.emit('snapGridLengthChange'); + } + + if (slidesGrid.length !== previousSlidesGridLength) { + swiper.emit('slidesGridLengthChange'); + } + + if (params.watchSlidesProgress) { + swiper.updateSlidesOffset(); + } + } + + function updateAutoHeight(speed) { + const swiper = this; + const activeSlides = []; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let newHeight = 0; + let i; + + if (typeof speed === 'number') { + swiper.setTransition(speed); + } else if (speed === true) { + swiper.setTransition(swiper.params.speed); + } + + const getSlideByIndex = index => { + if (isVirtual) { + return swiper.slides.filter(el => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index)[0]; + } + + return swiper.slides.eq(index)[0]; + }; // Find slides currently in view + + + if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) { + if (swiper.params.centeredSlides) { + swiper.visibleSlides.each(slide => { + activeSlides.push(slide); + }); + } else { + for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { + const index = swiper.activeIndex + i; + if (index > swiper.slides.length && !isVirtual) break; + activeSlides.push(getSlideByIndex(index)); + } + } + } else { + activeSlides.push(getSlideByIndex(swiper.activeIndex)); + } // Find new height from highest slide in view + + + for (i = 0; i < activeSlides.length; i += 1) { + if (typeof activeSlides[i] !== 'undefined') { + const height = activeSlides[i].offsetHeight; + newHeight = height > newHeight ? height : newHeight; + } + } // Update Height + + + if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`); + } + + function updateSlidesOffset() { + const swiper = this; + const slides = swiper.slides; + + for (let i = 0; i < slides.length; i += 1) { + slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop; + } + } + + function updateSlidesProgress(translate = this && this.translate || 0) { + const swiper = this; + const params = swiper.params; + const { + slides, + rtlTranslate: rtl, + snapGrid + } = swiper; + if (slides.length === 0) return; + if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset(); + let offsetCenter = -translate; + if (rtl) offsetCenter = translate; // Visible Slides + + slides.removeClass(params.slideVisibleClass); + swiper.visibleSlidesIndexes = []; + swiper.visibleSlides = []; + + for (let i = 0; i < slides.length; i += 1) { + const slide = slides[i]; + let slideOffset = slide.swiperSlideOffset; + + if (params.cssMode && params.centeredSlides) { + slideOffset -= slides[0].swiperSlideOffset; + } + + const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween); + const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween); + const slideBefore = -(offsetCenter - slideOffset); + const slideAfter = slideBefore + swiper.slidesSizesGrid[i]; + const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size; + + if (isVisible) { + swiper.visibleSlides.push(slide); + swiper.visibleSlidesIndexes.push(i); + slides.eq(i).addClass(params.slideVisibleClass); + } + + slide.progress = rtl ? -slideProgress : slideProgress; + slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress; + } + + swiper.visibleSlides = $(swiper.visibleSlides); + } + + function updateProgress(translate) { + const swiper = this; + + if (typeof translate === 'undefined') { + const multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line + + translate = swiper && swiper.translate && swiper.translate * multiplier || 0; + } + + const params = swiper.params; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + let { + progress, + isBeginning, + isEnd + } = swiper; + const wasBeginning = isBeginning; + const wasEnd = isEnd; + + if (translatesDiff === 0) { + progress = 0; + isBeginning = true; + isEnd = true; + } else { + progress = (translate - swiper.minTranslate()) / translatesDiff; + isBeginning = progress <= 0; + isEnd = progress >= 1; + } + + Object.assign(swiper, { + progress, + isBeginning, + isEnd + }); + if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate); + + if (isBeginning && !wasBeginning) { + swiper.emit('reachBeginning toEdge'); + } + + if (isEnd && !wasEnd) { + swiper.emit('reachEnd toEdge'); + } + + if (wasBeginning && !isBeginning || wasEnd && !isEnd) { + swiper.emit('fromEdge'); + } + + swiper.emit('progress', progress); + } + + function updateSlidesClasses() { + const swiper = this; + const { + slides, + params, + $wrapperEl, + activeIndex, + realIndex + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`); + let activeSlide; + + if (isVirtual) { + activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index="${activeIndex}"]`); + } else { + activeSlide = slides.eq(activeIndex); + } // Active classes + + + activeSlide.addClass(params.slideActiveClass); + + if (params.loop) { + // Duplicate to all looped slides + if (activeSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${realIndex}"]`).addClass(params.slideDuplicateActiveClass); + } else { + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${realIndex}"]`).addClass(params.slideDuplicateActiveClass); + } + } // Next Slide + + + let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass); + + if (params.loop && nextSlide.length === 0) { + nextSlide = slides.eq(0); + nextSlide.addClass(params.slideNextClass); + } // Prev Slide + + + let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass); + + if (params.loop && prevSlide.length === 0) { + prevSlide = slides.eq(-1); + prevSlide.addClass(params.slidePrevClass); + } + + if (params.loop) { + // Duplicate to all looped slides + if (nextSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicateNextClass); + } else { + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicateNextClass); + } + + if (prevSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicatePrevClass); + } else { + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicatePrevClass); + } + } + + swiper.emitSlidesClasses(); + } + + function updateActiveIndex(newActiveIndex) { + const swiper = this; + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + const { + slidesGrid, + snapGrid, + params, + activeIndex: previousIndex, + realIndex: previousRealIndex, + snapIndex: previousSnapIndex + } = swiper; + let activeIndex = newActiveIndex; + let snapIndex; + + if (typeof activeIndex === 'undefined') { + for (let i = 0; i < slidesGrid.length; i += 1) { + if (typeof slidesGrid[i + 1] !== 'undefined') { + if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) { + activeIndex = i; + } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) { + activeIndex = i + 1; + } + } else if (translate >= slidesGrid[i]) { + activeIndex = i; + } + } // Normalize slideIndex + + + if (params.normalizeSlideIndex) { + if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0; + } + } + + if (snapGrid.indexOf(translate) >= 0) { + snapIndex = snapGrid.indexOf(translate); + } else { + const skip = Math.min(params.slidesPerGroupSkip, activeIndex); + snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup); + } + + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if (activeIndex === previousIndex) { + if (snapIndex !== previousSnapIndex) { + swiper.snapIndex = snapIndex; + swiper.emit('snapIndexChange'); + } + + return; + } // Get real index + + + const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10); + Object.assign(swiper, { + snapIndex, + realIndex, + previousIndex, + activeIndex + }); + swiper.emit('activeIndexChange'); + swiper.emit('snapIndexChange'); + + if (previousRealIndex !== realIndex) { + swiper.emit('realIndexChange'); + } + + if (swiper.initialized || swiper.params.runCallbacksOnInit) { + swiper.emit('slideChange'); + } + } + + function updateClickedSlide(e) { + const swiper = this; + const params = swiper.params; + const slide = $(e.target).closest(`.${params.slideClass}`)[0]; + let slideFound = false; + let slideIndex; + + if (slide) { + for (let i = 0; i < swiper.slides.length; i += 1) { + if (swiper.slides[i] === slide) { + slideFound = true; + slideIndex = i; + break; + } + } + } + + if (slide && slideFound) { + swiper.clickedSlide = slide; + + if (swiper.virtual && swiper.params.virtual.enabled) { + swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10); + } else { + swiper.clickedIndex = slideIndex; + } + } else { + swiper.clickedSlide = undefined; + swiper.clickedIndex = undefined; + return; + } + + if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) { + swiper.slideToClickedSlide(); + } + } + + var update = { + updateSize, + updateSlides, + updateAutoHeight, + updateSlidesOffset, + updateSlidesProgress, + updateProgress, + updateSlidesClasses, + updateActiveIndex, + updateClickedSlide + }; + + function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') { + const swiper = this; + const { + params, + rtlTranslate: rtl, + translate, + $wrapperEl + } = swiper; + + if (params.virtualTranslate) { + return rtl ? -translate : translate; + } + + if (params.cssMode) { + return translate; + } + + let currentTranslate = getTranslate($wrapperEl[0], axis); + if (rtl) currentTranslate = -currentTranslate; + return currentTranslate || 0; + } + + function setTranslate(translate, byController) { + const swiper = this; + const { + rtlTranslate: rtl, + params, + $wrapperEl, + wrapperEl, + progress + } = swiper; + let x = 0; + let y = 0; + const z = 0; + + if (swiper.isHorizontal()) { + x = rtl ? -translate : translate; + } else { + y = translate; + } + + if (params.roundLengths) { + x = Math.floor(x); + y = Math.floor(y); + } + + if (params.cssMode) { + wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y; + } else if (!params.virtualTranslate) { + $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`); + } + + swiper.previousTranslate = swiper.translate; + swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress + + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (translate - swiper.minTranslate()) / translatesDiff; + } + + if (newProgress !== progress) { + swiper.updateProgress(translate); + } + + swiper.emit('setTranslate', swiper.translate, byController); + } + + function minTranslate() { + return -this.snapGrid[0]; + } + + function maxTranslate() { + return -this.snapGrid[this.snapGrid.length - 1]; + } + + function translateTo(translate = 0, speed = this.params.speed, runCallbacks = true, translateBounds = true, internal) { + const swiper = this; + const { + params, + wrapperEl + } = swiper; + + if (swiper.animating && params.preventInteractionOnTransition) { + return false; + } + + const minTranslate = swiper.minTranslate(); + const maxTranslate = swiper.maxTranslate(); + let newTranslate; + if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress + + swiper.updateProgress(newTranslate); + + if (params.cssMode) { + const isH = swiper.isHorizontal(); + + if (speed === 0) { + wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate; + } else { + if (!swiper.support.smoothScroll) { + animateCSSModeScroll({ + swiper, + targetPosition: -newTranslate, + side: isH ? 'left' : 'top' + }); + return true; + } + + wrapperEl.scrollTo({ + [isH ? 'left' : 'top']: -newTranslate, + behavior: 'smooth' + }); + } + + return true; + } + + if (speed === 0) { + swiper.setTransition(0); + swiper.setTranslate(newTranslate); + + if (runCallbacks) { + swiper.emit('beforeTransitionStart', speed, internal); + swiper.emit('transitionEnd'); + } + } else { + swiper.setTransition(speed); + swiper.setTranslate(newTranslate); + + if (runCallbacks) { + swiper.emit('beforeTransitionStart', speed, internal); + swiper.emit('transitionStart'); + } + + if (!swiper.animating) { + swiper.animating = true; + + if (!swiper.onTranslateToWrapperTransitionEnd) { + swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd); + swiper.onTranslateToWrapperTransitionEnd = null; + delete swiper.onTranslateToWrapperTransitionEnd; + + if (runCallbacks) { + swiper.emit('transitionEnd'); + } + }; + } + + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd); + } + } + + return true; + } + + var translate = { + getTranslate: getSwiperTranslate, + setTranslate, + minTranslate, + maxTranslate, + translateTo + }; + + function setTransition(duration, byController) { + const swiper = this; + + if (!swiper.params.cssMode) { + swiper.$wrapperEl.transition(duration); + } + + swiper.emit('setTransition', duration, byController); + } + + function transitionEmit({ + swiper, + runCallbacks, + direction, + step + }) { + const { + activeIndex, + previousIndex + } = swiper; + let dir = direction; + + if (!dir) { + if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset'; + } + + swiper.emit(`transition${step}`); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === 'reset') { + swiper.emit(`slideResetTransition${step}`); + return; + } + + swiper.emit(`slideChangeTransition${step}`); + + if (dir === 'next') { + swiper.emit(`slideNextTransition${step}`); + } else { + swiper.emit(`slidePrevTransition${step}`); + } + } + } + + function transitionStart(runCallbacks = true, direction) { + const swiper = this; + const { + params + } = swiper; + if (params.cssMode) return; + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + transitionEmit({ + swiper, + runCallbacks, + direction, + step: 'Start' + }); + } + + function transitionEnd(runCallbacks = true, direction) { + const swiper = this; + const { + params + } = swiper; + swiper.animating = false; + if (params.cssMode) return; + swiper.setTransition(0); + transitionEmit({ + swiper, + runCallbacks, + direction, + step: 'End' + }); + } + + var transition = { + setTransition, + transitionStart, + transitionEnd + }; + + function slideTo(index = 0, speed = this.params.speed, runCallbacks = true, internal, initial) { + if (typeof index !== 'number' && typeof index !== 'string') { + throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`); + } + + if (typeof index === 'string') { + /** + * The `index` argument converted from `string` to `number`. + * @type {number} + */ + const indexAsNumber = parseInt(index, 10); + /** + * Determines whether the `index` argument is a valid `number` + * after being converted from the `string` type. + * @type {boolean} + */ + + const isValidNumber = isFinite(indexAsNumber); + + if (!isValidNumber) { + throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`); + } // Knowing that the converted `index` is a valid number, + // we can update the original argument's value. + + + index = indexAsNumber; + } + + const swiper = this; + let slideIndex = index; + if (slideIndex < 0) slideIndex = 0; + const { + params, + snapGrid, + slidesGrid, + previousIndex, + activeIndex, + rtlTranslate: rtl, + wrapperEl, + enabled + } = swiper; + + if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) { + return false; + } + + const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex); + let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup); + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) { + swiper.emit('beforeSlideChangeStart'); + } + + const translate = -snapGrid[snapIndex]; // Update progress + + swiper.updateProgress(translate); // Normalize slideIndex + + if (params.normalizeSlideIndex) { + for (let i = 0; i < slidesGrid.length; i += 1) { + const normalizedTranslate = -Math.floor(translate * 100); + const normalizedGrid = Math.floor(slidesGrid[i] * 100); + const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100); + + if (typeof slidesGrid[i + 1] !== 'undefined') { + if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) { + slideIndex = i; + } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) { + slideIndex = i + 1; + } + } else if (normalizedTranslate >= normalizedGrid) { + slideIndex = i; + } + } + } // Directions locks + + + if (swiper.initialized && slideIndex !== activeIndex) { + if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) { + return false; + } + + if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) { + if ((activeIndex || 0) !== slideIndex) return false; + } + } + + let direction; + if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index + + if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) { + swiper.updateActiveIndex(slideIndex); // Update Height + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + swiper.updateSlidesClasses(); + + if (params.effect !== 'slide') { + swiper.setTranslate(translate); + } + + if (direction !== 'reset') { + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } + + return false; + } + + if (params.cssMode) { + const isH = swiper.isHorizontal(); + const t = rtl ? translate : -translate; + + if (speed === 0) { + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + + if (isVirtual) { + swiper.wrapperEl.style.scrollSnapType = 'none'; + swiper._immediateVirtual = true; + } + + wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t; + + if (isVirtual) { + requestAnimationFrame(() => { + swiper.wrapperEl.style.scrollSnapType = ''; + swiper._swiperImmediateVirtual = false; + }); + } + } else { + if (!swiper.support.smoothScroll) { + animateCSSModeScroll({ + swiper, + targetPosition: t, + side: isH ? 'left' : 'top' + }); + return true; + } + + wrapperEl.scrollTo({ + [isH ? 'left' : 'top']: t, + behavior: 'smooth' + }); + } + + return true; + } + + if (speed === 0) { + swiper.setTransition(0); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } else { + swiper.setTransition(speed); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + + if (!swiper.animating) { + swiper.animating = true; + + if (!swiper.onSlideToWrapperTransitionEnd) { + swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + swiper.onSlideToWrapperTransitionEnd = null; + delete swiper.onSlideToWrapperTransitionEnd; + swiper.transitionEnd(runCallbacks, direction); + }; + } + + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + } + } + + return true; + } + + function slideToLoop(index = 0, speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + let newIndex = index; + + if (swiper.params.loop) { + newIndex += swiper.loopedSlides; + } + + return swiper.slideTo(newIndex, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slideNext(speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { + animating, + enabled, + params + } = swiper; + if (!enabled) return swiper; + let perGroup = params.slidesPerGroup; + + if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { + perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1); + } + + const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup; + + if (params.loop) { + if (animating && params.loopPreventsSlide) return false; + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + + return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slidePrev(speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { + params, + animating, + snapGrid, + slidesGrid, + rtlTranslate, + enabled + } = swiper; + if (!enabled) return swiper; + + if (params.loop) { + if (animating && params.loopPreventsSlide) return false; + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + + const translate = rtlTranslate ? swiper.translate : -swiper.translate; + + function normalize(val) { + if (val < 0) return -Math.floor(Math.abs(val)); + return Math.floor(val); + } + + const normalizedTranslate = normalize(translate); + const normalizedSnapGrid = snapGrid.map(val => normalize(val)); + let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; + + if (typeof prevSnap === 'undefined' && params.cssMode) { + let prevSnapIndex; + snapGrid.forEach((snap, snapIndex) => { + if (normalizedTranslate >= snap) { + // prevSnap = snap; + prevSnapIndex = snapIndex; + } + }); + + if (typeof prevSnapIndex !== 'undefined') { + prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex]; + } + } + + let prevIndex = 0; + + if (typeof prevSnap !== 'undefined') { + prevIndex = slidesGrid.indexOf(prevSnap); + if (prevIndex < 0) prevIndex = swiper.activeIndex - 1; + + if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { + prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1; + prevIndex = Math.max(prevIndex, 0); + } + } + + return swiper.slideTo(prevIndex, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slideReset(speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slideToClosest(speed = this.params.speed, runCallbacks = true, internal, threshold = 0.5) { + const swiper = this; + let index = swiper.activeIndex; + const skip = Math.min(swiper.params.slidesPerGroupSkip, index); + const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup); + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + + if (translate >= swiper.snapGrid[snapIndex]) { + // The current translate is on or after the current snap index, so the choice + // is between the current index and the one after it. + const currentSnap = swiper.snapGrid[snapIndex]; + const nextSnap = swiper.snapGrid[snapIndex + 1]; + + if (translate - currentSnap > (nextSnap - currentSnap) * threshold) { + index += swiper.params.slidesPerGroup; + } + } else { + // The current translate is before the current snap index, so the choice + // is between the current index and the one before it. + const prevSnap = swiper.snapGrid[snapIndex - 1]; + const currentSnap = swiper.snapGrid[snapIndex]; + + if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) { + index -= swiper.params.slidesPerGroup; + } + } + + index = Math.max(index, 0); + index = Math.min(index, swiper.slidesGrid.length - 1); + return swiper.slideTo(index, speed, runCallbacks, internal); + } + + function slideToClickedSlide() { + const swiper = this; + const { + params, + $wrapperEl + } = swiper; + const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView; + let slideToIndex = swiper.clickedIndex; + let realIndex; + + if (params.loop) { + if (swiper.animating) return; + realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10); + + if (params.centeredSlides) { + if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) { + swiper.loopFix(); + slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`).eq(0).index(); + nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else if (slideToIndex > swiper.slides.length - slidesPerView) { + swiper.loopFix(); + slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`).eq(0).index(); + nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else { + swiper.slideTo(slideToIndex); + } + } + + var slide = { + slideTo, + slideToLoop, + slideNext, + slidePrev, + slideReset, + slideToClosest, + slideToClickedSlide + }; + + function loopCreate() { + const swiper = this; + const document = getDocument(); + const { + params, + $wrapperEl + } = swiper; // Remove duplicated slides + + const $selector = $($wrapperEl.children()[0].parentNode); + $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove(); + let slides = $selector.children(`.${params.slideClass}`); + + if (params.loopFillGroupWithBlank) { + const blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup; + + if (blankSlidesNum !== params.slidesPerGroup) { + for (let i = 0; i < blankSlidesNum; i += 1) { + const blankNode = $(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`); + $selector.append(blankNode); + } + + slides = $selector.children(`.${params.slideClass}`); + } + } + + if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length; + swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10)); + swiper.loopedSlides += params.loopAdditionalSlides; + + if (swiper.loopedSlides > slides.length) { + swiper.loopedSlides = slides.length; + } + + const prependSlides = []; + const appendSlides = []; + slides.each((el, index) => { + const slide = $(el); + + if (index < swiper.loopedSlides) { + appendSlides.push(el); + } + + if (index < slides.length && index >= slides.length - swiper.loopedSlides) { + prependSlides.push(el); + } + + slide.attr('data-swiper-slide-index', index); + }); + + for (let i = 0; i < appendSlides.length; i += 1) { + $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } + + for (let i = prependSlides.length - 1; i >= 0; i -= 1) { + $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } + } + + function loopFix() { + const swiper = this; + swiper.emit('beforeLoopFix'); + const { + activeIndex, + slides, + loopedSlides, + allowSlidePrev, + allowSlideNext, + snapGrid, + rtlTranslate: rtl + } = swiper; + let newIndex; + swiper.allowSlidePrev = true; + swiper.allowSlideNext = true; + const snapTranslate = -snapGrid[activeIndex]; + const diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding + + if (activeIndex < loopedSlides) { + newIndex = slides.length - loopedSlides * 3 + activeIndex; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } else if (activeIndex >= slides.length - loopedSlides) { + // Fix For Positive Oversliding + newIndex = -slides.length + activeIndex + loopedSlides; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } + + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + swiper.emit('loopFix'); + } + + function loopDestroy() { + const swiper = this; + const { + $wrapperEl, + params, + slides + } = swiper; + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove(); + slides.removeAttr('data-swiper-slide-index'); + } + + var loop = { + loopCreate, + loopFix, + loopDestroy + }; + + function setGrabCursor(moving) { + const swiper = this; + if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return; + const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl; + el.style.cursor = 'move'; + el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab'; + el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab'; + el.style.cursor = moving ? 'grabbing' : 'grab'; + } + + function unsetGrabCursor() { + const swiper = this; + + if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) { + return; + } + + swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = ''; + } + + var grabCursor = { + setGrabCursor, + unsetGrabCursor + }; + + function closestElement(selector, base = this) { + function __closestFrom(el) { + if (!el || el === getDocument() || el === getWindow()) return null; + if (el.assignedSlot) el = el.assignedSlot; + const found = el.closest(selector); + return found || __closestFrom(el.getRootNode().host); + } + + return __closestFrom(base); + } + + function onTouchStart(event) { + const swiper = this; + const document = getDocument(); + const window = getWindow(); + const data = swiper.touchEventsData; + const { + params, + touches, + enabled + } = swiper; + if (!enabled) return; + + if (swiper.animating && params.preventInteractionOnTransition) { + return; + } + + if (!swiper.animating && params.cssMode && params.loop) { + swiper.loopFix(); + } + + let e = event; + if (e.originalEvent) e = e.originalEvent; + let $targetEl = $(e.target); + + if (params.touchEventsTarget === 'wrapper') { + if (!$targetEl.closest(swiper.wrapperEl).length) return; + } + + data.isTouchEvent = e.type === 'touchstart'; + if (!data.isTouchEvent && 'which' in e && e.which === 3) return; + if (!data.isTouchEvent && 'button' in e && e.button > 0) return; + if (data.isTouched && data.isMoved) return; // change target el for shadow root component + + const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== ''; + + if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) { + $targetEl = $(event.path[0]); + } + + const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`; + const isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element + + if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, e.target) : $targetEl.closest(noSwipingSelector)[0])) { + swiper.allowClick = true; + return; + } + + if (params.swipeHandler) { + if (!$targetEl.closest(params.swipeHandler)[0]) return; + } + + touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + const startX = touches.currentX; + const startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore + + const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; + const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; + + if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) { + if (edgeSwipeDetection === 'prevent') { + event.preventDefault(); + } else { + return; + } + } + + Object.assign(data, { + isTouched: true, + isMoved: false, + allowTouchCallbacks: true, + isScrolling: undefined, + startMoving: undefined + }); + touches.startX = startX; + touches.startY = startY; + data.touchStartTime = now(); + swiper.allowClick = true; + swiper.updateSize(); + swiper.swipeDirection = undefined; + if (params.threshold > 0) data.allowThresholdMove = false; + + if (e.type !== 'touchstart') { + let preventDefault = true; + if ($targetEl.is(data.focusableElements)) preventDefault = false; + + if (document.activeElement && $(document.activeElement).is(data.focusableElements) && document.activeElement !== $targetEl[0]) { + document.activeElement.blur(); + } + + const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; + + if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) { + e.preventDefault(); + } + } + + swiper.emit('touchStart', e); + } + + function onTouchMove(event) { + const document = getDocument(); + const swiper = this; + const data = swiper.touchEventsData; + const { + params, + touches, + rtlTranslate: rtl, + enabled + } = swiper; + if (!enabled) return; + let e = event; + if (e.originalEvent) e = e.originalEvent; + + if (!data.isTouched) { + if (data.startMoving && data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + + return; + } + + if (data.isTouchEvent && e.type !== 'touchmove') return; + const targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]); + const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX; + const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY; + + if (e.preventedByNestedSwiper) { + touches.startX = pageX; + touches.startY = pageY; + return; + } + + if (!swiper.allowTouchMove) { + // isMoved = true; + swiper.allowClick = false; + + if (data.isTouched) { + Object.assign(touches, { + startX: pageX, + startY: pageY, + currentX: pageX, + currentY: pageY + }); + data.touchStartTime = now(); + } + + return; + } + + if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) { + if (swiper.isVertical()) { + // Vertical + if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) { + data.isTouched = false; + data.isMoved = false; + return; + } + } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) { + return; + } + } + + if (data.isTouchEvent && document.activeElement) { + if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) { + data.isMoved = true; + swiper.allowClick = false; + return; + } + } + + if (data.allowTouchCallbacks) { + swiper.emit('touchMove', e); + } + + if (e.targetTouches && e.targetTouches.length > 1) return; + touches.currentX = pageX; + touches.currentY = pageY; + const diffX = touches.currentX - touches.startX; + const diffY = touches.currentY - touches.startY; + if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return; + + if (typeof data.isScrolling === 'undefined') { + let touchAngle; + + if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) { + data.isScrolling = false; + } else { + // eslint-disable-next-line + if (diffX * diffX + diffY * diffY >= 25) { + touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI; + data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle; + } + } + } + + if (data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + + if (typeof data.startMoving === 'undefined') { + if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { + data.startMoving = true; + } + } + + if (data.isScrolling) { + data.isTouched = false; + return; + } + + if (!data.startMoving) { + return; + } + + swiper.allowClick = false; + + if (!params.cssMode && e.cancelable) { + e.preventDefault(); + } + + if (params.touchMoveStopPropagation && !params.nested) { + e.stopPropagation(); + } + + if (!data.isMoved) { + if (params.loop && !params.cssMode) { + swiper.loopFix(); + } + + data.startTranslate = swiper.getTranslate(); + swiper.setTransition(0); + + if (swiper.animating) { + swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend'); + } + + data.allowMomentumBounce = false; // Grab Cursor + + if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(true); + } + + swiper.emit('sliderFirstMove', e); + } + + swiper.emit('sliderMove', e); + data.isMoved = true; + let diff = swiper.isHorizontal() ? diffX : diffY; + touches.diff = diff; + diff *= params.touchRatio; + if (rtl) diff = -diff; + swiper.swipeDirection = diff > 0 ? 'prev' : 'next'; + data.currentTranslate = diff + data.startTranslate; + let disableParentSwiper = true; + let resistanceRatio = params.resistanceRatio; + + if (params.touchReleaseOnEdges) { + resistanceRatio = 0; + } + + if (diff > 0 && data.currentTranslate > swiper.minTranslate()) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio; + } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio; + } + + if (disableParentSwiper) { + e.preventedByNestedSwiper = true; + } // Directions locks + + + if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + + if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + + if (!swiper.allowSlidePrev && !swiper.allowSlideNext) { + data.currentTranslate = data.startTranslate; + } // Threshold + + + if (params.threshold > 0) { + if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { + if (!data.allowThresholdMove) { + data.allowThresholdMove = true; + touches.startX = touches.currentX; + touches.startY = touches.currentY; + data.currentTranslate = data.startTranslate; + touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; + return; + } + } else { + data.currentTranslate = data.startTranslate; + return; + } + } + + if (!params.followFinger || params.cssMode) return; // Update active index in free mode + + if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) { + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) { + swiper.freeMode.onTouchMove(); + } // Update progress + + + swiper.updateProgress(data.currentTranslate); // Update translate + + swiper.setTranslate(data.currentTranslate); + } + + function onTouchEnd(event) { + const swiper = this; + const data = swiper.touchEventsData; + const { + params, + touches, + rtlTranslate: rtl, + slidesGrid, + enabled + } = swiper; + if (!enabled) return; + let e = event; + if (e.originalEvent) e = e.originalEvent; + + if (data.allowTouchCallbacks) { + swiper.emit('touchEnd', e); + } + + data.allowTouchCallbacks = false; + + if (!data.isTouched) { + if (data.isMoved && params.grabCursor) { + swiper.setGrabCursor(false); + } + + data.isMoved = false; + data.startMoving = false; + return; + } // Return Grab Cursor + + + if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(false); + } // Time diff + + + const touchEndTime = now(); + const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click + + if (swiper.allowClick) { + swiper.updateClickedSlide(e); + swiper.emit('tap click', e); + + if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) { + swiper.emit('doubleTap doubleClick', e); + } + } + + data.lastClickTime = now(); + nextTick(() => { + if (!swiper.destroyed) swiper.allowClick = true; + }); + + if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) { + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + return; + } + + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + let currentPos; + + if (params.followFinger) { + currentPos = rtl ? swiper.translate : -swiper.translate; + } else { + currentPos = -data.currentTranslate; + } + + if (params.cssMode) { + return; + } + + if (swiper.params.freeMode && params.freeMode.enabled) { + swiper.freeMode.onTouchEnd({ + currentPos + }); + return; + } // Find current slide + + + let stopIndex = 0; + let groupSize = swiper.slidesSizesGrid[0]; + + for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) { + const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; + + if (typeof slidesGrid[i + increment] !== 'undefined') { + if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) { + stopIndex = i; + groupSize = slidesGrid[i + increment] - slidesGrid[i]; + } + } else if (currentPos >= slidesGrid[i]) { + stopIndex = i; + groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; + } + } // Find current slide size + + + const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; + const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; + + if (timeDiff > params.longSwipesMs) { + // Long touches + if (!params.longSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + + if (swiper.swipeDirection === 'next') { + if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex); + } + + if (swiper.swipeDirection === 'prev') { + if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex); + } + } else { + // Short swipes + if (!params.shortSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + + const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl); + + if (!isNavButtonTarget) { + if (swiper.swipeDirection === 'next') { + swiper.slideTo(stopIndex + increment); + } + + if (swiper.swipeDirection === 'prev') { + swiper.slideTo(stopIndex); + } + } else if (e.target === swiper.navigation.nextEl) { + swiper.slideTo(stopIndex + increment); + } else { + swiper.slideTo(stopIndex); + } + } + } + + function onResize() { + const swiper = this; + const { + params, + el + } = swiper; + if (el && el.offsetWidth === 0) return; // Breakpoints + + if (params.breakpoints) { + swiper.setBreakpoint(); + } // Save locks + + + const { + allowSlideNext, + allowSlidePrev, + snapGrid + } = swiper; // Disable locks on resize + + swiper.allowSlideNext = true; + swiper.allowSlidePrev = true; + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateSlidesClasses(); + + if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) { + swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + swiper.slideTo(swiper.activeIndex, 0, false, true); + } + + if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { + swiper.autoplay.run(); + } // Return locks after resize + + + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + + if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + } + + function onClick(e) { + const swiper = this; + if (!swiper.enabled) return; + + if (!swiper.allowClick) { + if (swiper.params.preventClicks) e.preventDefault(); + + if (swiper.params.preventClicksPropagation && swiper.animating) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } + } + + function onScroll() { + const swiper = this; + const { + wrapperEl, + rtlTranslate, + enabled + } = swiper; + if (!enabled) return; + swiper.previousTranslate = swiper.translate; + + if (swiper.isHorizontal()) { + swiper.translate = -wrapperEl.scrollLeft; + } else { + swiper.translate = -wrapperEl.scrollTop; + } // eslint-disable-next-line + + + if (swiper.translate === -0) swiper.translate = 0; + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff; + } + + if (newProgress !== swiper.progress) { + swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate); + } + + swiper.emit('setTranslate', swiper.translate, false); + } + + let dummyEventAttached = false; + + function dummyEventListener() {} + + const events = (swiper, method) => { + const document = getDocument(); + const { + params, + touchEvents, + el, + wrapperEl, + device, + support + } = swiper; + const capture = !!params.nested; + const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener'; + const swiperMethod = method; // Touch Events + + if (!support.touch) { + el[domMethod](touchEvents.start, swiper.onTouchStart, false); + document[domMethod](touchEvents.move, swiper.onTouchMove, capture); + document[domMethod](touchEvents.end, swiper.onTouchEnd, false); + } else { + const passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? { + passive: true, + capture: false + } : false; + el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener); + el[domMethod](touchEvents.move, swiper.onTouchMove, support.passiveListener ? { + passive: false, + capture + } : capture); + el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener); + + if (touchEvents.cancel) { + el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener); + } + } // Prevent Links Clicks + + + if (params.preventClicks || params.preventClicksPropagation) { + el[domMethod]('click', swiper.onClick, true); + } + + if (params.cssMode) { + wrapperEl[domMethod]('scroll', swiper.onScroll); + } // Resize handler + + + if (params.updateOnWindowResize) { + swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true); + } else { + swiper[swiperMethod]('observerUpdate', onResize, true); + } + }; + + function attachEvents() { + const swiper = this; + const document = getDocument(); + const { + params, + support + } = swiper; + swiper.onTouchStart = onTouchStart.bind(swiper); + swiper.onTouchMove = onTouchMove.bind(swiper); + swiper.onTouchEnd = onTouchEnd.bind(swiper); + + if (params.cssMode) { + swiper.onScroll = onScroll.bind(swiper); + } + + swiper.onClick = onClick.bind(swiper); + + if (support.touch && !dummyEventAttached) { + document.addEventListener('touchstart', dummyEventListener); + dummyEventAttached = true; + } + + events(swiper, 'on'); + } + + function detachEvents() { + const swiper = this; + events(swiper, 'off'); + } + + var events$1 = { + attachEvents, + detachEvents + }; + + const isGridEnabled = (swiper, params) => { + return swiper.grid && params.grid && params.grid.rows > 1; + }; + + function setBreakpoint() { + const swiper = this; + const { + activeIndex, + initialized, + loopedSlides = 0, + params, + $el + } = swiper; + const breakpoints = params.breakpoints; + if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters + + const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el); + if (!breakpoint || swiper.currentBreakpoint === breakpoint) return; + const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined; + const breakpointParams = breakpointOnlyParams || swiper.originalParams; + const wasMultiRow = isGridEnabled(swiper, params); + const isMultiRow = isGridEnabled(swiper, breakpointParams); + const wasEnabled = params.enabled; + + if (wasMultiRow && !isMultiRow) { + $el.removeClass(`${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`); + swiper.emitContainerClasses(); + } else if (!wasMultiRow && isMultiRow) { + $el.addClass(`${params.containerModifierClass}grid`); + + if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') { + $el.addClass(`${params.containerModifierClass}grid-column`); + } + + swiper.emitContainerClasses(); + } + + const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; + const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); + + if (directionChanged && initialized) { + swiper.changeDirection(); + } + + extend(swiper.params, breakpointParams); + const isEnabled = swiper.params.enabled; + Object.assign(swiper, { + allowTouchMove: swiper.params.allowTouchMove, + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev + }); + + if (wasEnabled && !isEnabled) { + swiper.disable(); + } else if (!wasEnabled && isEnabled) { + swiper.enable(); + } + + swiper.currentBreakpoint = breakpoint; + swiper.emit('_beforeBreakpoint', breakpointParams); + + if (needsReLoop && initialized) { + swiper.loopDestroy(); + swiper.loopCreate(); + swiper.updateSlides(); + swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false); + } + + swiper.emit('breakpoint', breakpointParams); + } + + function getBreakpoint(breakpoints, base = 'window', containerEl) { + if (!breakpoints || base === 'container' && !containerEl) return undefined; + let breakpoint = false; + const window = getWindow(); + const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight; + const points = Object.keys(breakpoints).map(point => { + if (typeof point === 'string' && point.indexOf('@') === 0) { + const minRatio = parseFloat(point.substr(1)); + const value = currentHeight * minRatio; + return { + value, + point + }; + } + + return { + value: point, + point + }; + }); + points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10)); + + for (let i = 0; i < points.length; i += 1) { + const { + point, + value + } = points[i]; + + if (base === 'window') { + if (window.matchMedia(`(min-width: ${value}px)`).matches) { + breakpoint = point; + } + } else if (value <= containerEl.clientWidth) { + breakpoint = point; + } + } + + return breakpoint || 'max'; + } + + var breakpoints = { + setBreakpoint, + getBreakpoint + }; + + function prepareClasses(entries, prefix) { + const resultClasses = []; + entries.forEach(item => { + if (typeof item === 'object') { + Object.keys(item).forEach(classNames => { + if (item[classNames]) { + resultClasses.push(prefix + classNames); + } + }); + } else if (typeof item === 'string') { + resultClasses.push(prefix + item); + } + }); + return resultClasses; + } + + function addClasses() { + const swiper = this; + const { + classNames, + params, + rtl, + $el, + device, + support + } = swiper; // prettier-ignore + + const suffixes = prepareClasses(['initialized', params.direction, { + 'pointer-events': !support.touch + }, { + 'free-mode': swiper.params.freeMode && params.freeMode.enabled + }, { + 'autoheight': params.autoHeight + }, { + 'rtl': rtl + }, { + 'grid': params.grid && params.grid.rows > 1 + }, { + 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' + }, { + 'android': device.android + }, { + 'ios': device.ios + }, { + 'css-mode': params.cssMode + }, { + 'centered': params.cssMode && params.centeredSlides + }], params.containerModifierClass); + classNames.push(...suffixes); + $el.addClass([...classNames].join(' ')); + swiper.emitContainerClasses(); + } + + function removeClasses() { + const swiper = this; + const { + $el, + classNames + } = swiper; + $el.removeClass(classNames.join(' ')); + swiper.emitContainerClasses(); + } + + var classes = { + addClasses, + removeClasses + }; + + function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) { + const window = getWindow(); + let image; + + function onReady() { + if (callback) callback(); + } + + const isPicture = $(imageEl).parent('picture')[0]; + + if (!isPicture && (!imageEl.complete || !checkForComplete)) { + if (src) { + image = new window.Image(); + image.onload = onReady; + image.onerror = onReady; + + if (sizes) { + image.sizes = sizes; + } + + if (srcset) { + image.srcset = srcset; + } + + if (src) { + image.src = src; + } + } else { + onReady(); + } + } else { + // image already loaded... + onReady(); + } + } + + function preloadImages() { + const swiper = this; + swiper.imagesToLoad = swiper.$el.find('img'); + + function onReady() { + if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return; + if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1; + + if (swiper.imagesLoaded === swiper.imagesToLoad.length) { + if (swiper.params.updateOnImagesReady) swiper.update(); + swiper.emit('imagesReady'); + } + } + + for (let i = 0; i < swiper.imagesToLoad.length; i += 1) { + const imageEl = swiper.imagesToLoad[i]; + swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady); + } + } + + var images = { + loadImage, + preloadImages + }; + + function checkOverflow() { + const swiper = this; + const { + isLocked: wasLocked, + params + } = swiper; + const { + slidesOffsetBefore + } = params; + + if (slidesOffsetBefore) { + const lastSlideIndex = swiper.slides.length - 1; + const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2; + swiper.isLocked = swiper.size > lastSlideRightEdge; + } else { + swiper.isLocked = swiper.snapGrid.length === 1; + } + + if (params.allowSlideNext === true) { + swiper.allowSlideNext = !swiper.isLocked; + } + + if (params.allowSlidePrev === true) { + swiper.allowSlidePrev = !swiper.isLocked; + } + + if (wasLocked && wasLocked !== swiper.isLocked) { + swiper.isEnd = false; + } + + if (wasLocked !== swiper.isLocked) { + swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); + } + } + + var checkOverflow$1 = { + checkOverflow + }; + + var defaults = { + init: true, + direction: 'horizontal', + touchEventsTarget: 'wrapper', + initialSlide: 0, + speed: 300, + cssMode: false, + updateOnWindowResize: true, + resizeObserver: true, + nested: false, + createElements: false, + enabled: true, + focusableElements: 'input, select, option, textarea, button, video, label', + // Overrides + width: null, + height: null, + // + preventInteractionOnTransition: false, + // ssr + userAgent: null, + url: null, + // To support iOS's swipe-to-go-back gesture (when being used in-app). + edgeSwipeDetection: false, + edgeSwipeThreshold: 20, + // Autoheight + autoHeight: false, + // Set wrapper width + setWrapperSize: false, + // Virtual Translate + virtualTranslate: false, + // Effects + effect: 'slide', + // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' + // Breakpoints + breakpoints: undefined, + breakpointsBase: 'window', + // Slides grid + spaceBetween: 0, + slidesPerView: 1, + slidesPerGroup: 1, + slidesPerGroupSkip: 0, + slidesPerGroupAuto: false, + centeredSlides: false, + centeredSlidesBounds: false, + slidesOffsetBefore: 0, + // in px + slidesOffsetAfter: 0, + // in px + normalizeSlideIndex: true, + centerInsufficientSlides: false, + // Disable swiper and hide navigation when container not overflow + watchOverflow: true, + // Round length + roundLengths: false, + // Touches + touchRatio: 1, + touchAngle: 45, + simulateTouch: true, + shortSwipes: true, + longSwipes: true, + longSwipesRatio: 0.5, + longSwipesMs: 300, + followFinger: true, + allowTouchMove: true, + threshold: 0, + touchMoveStopPropagation: false, + touchStartPreventDefault: true, + touchStartForcePreventDefault: false, + touchReleaseOnEdges: false, + // Unique Navigation Elements + uniqueNavElements: true, + // Resistance + resistance: true, + resistanceRatio: 0.85, + // Progress + watchSlidesProgress: false, + // Cursor + grabCursor: false, + // Clicks + preventClicks: true, + preventClicksPropagation: true, + slideToClickedSlide: false, + // Images + preloadImages: true, + updateOnImagesReady: true, + // loop + loop: false, + loopAdditionalSlides: 0, + loopedSlides: null, + loopFillGroupWithBlank: false, + loopPreventsSlide: true, + // Swiping/no swiping + allowSlidePrev: true, + allowSlideNext: true, + swipeHandler: null, + // '.swipe-handler', + noSwiping: true, + noSwipingClass: 'swiper-no-swiping', + noSwipingSelector: null, + // Passive Listeners + passiveListeners: true, + // NS + containerModifierClass: 'swiper-', + // NEW + slideClass: 'swiper-slide', + slideBlankClass: 'swiper-slide-invisible-blank', + slideActiveClass: 'swiper-slide-active', + slideDuplicateActiveClass: 'swiper-slide-duplicate-active', + slideVisibleClass: 'swiper-slide-visible', + slideDuplicateClass: 'swiper-slide-duplicate', + slideNextClass: 'swiper-slide-next', + slideDuplicateNextClass: 'swiper-slide-duplicate-next', + slidePrevClass: 'swiper-slide-prev', + slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', + wrapperClass: 'swiper-wrapper', + // Callbacks + runCallbacksOnInit: true, + // Internals + _emitClasses: false + }; + + function moduleExtendParams(params, allModulesParams) { + return function extendParams(obj = {}) { + const moduleParamName = Object.keys(obj)[0]; + const moduleParams = obj[moduleParamName]; + + if (typeof moduleParams !== 'object' || moduleParams === null) { + extend(allModulesParams, obj); + return; + } + + if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) { + params[moduleParamName] = { + auto: true + }; + } + + if (!(moduleParamName in params && 'enabled' in moduleParams)) { + extend(allModulesParams, obj); + return; + } + + if (params[moduleParamName] === true) { + params[moduleParamName] = { + enabled: true + }; + } + + if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) { + params[moduleParamName].enabled = true; + } + + if (!params[moduleParamName]) params[moduleParamName] = { + enabled: false + }; + extend(allModulesParams, obj); + }; + } + + /* eslint no-param-reassign: "off" */ + const prototypes = { + eventsEmitter, + update, + translate, + transition, + slide, + loop, + grabCursor, + events: events$1, + breakpoints, + checkOverflow: checkOverflow$1, + classes, + images + }; + const extendedDefaults = {}; + + class Swiper { + constructor(...args) { + let el; + let params; + + if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') { + params = args[0]; + } else { + [el, params] = args; + } + + if (!params) params = {}; + params = extend({}, params); + if (el && !params.el) params.el = el; + + if (params.el && $(params.el).length > 1) { + const swipers = []; + $(params.el).each(containerEl => { + const newParams = extend({}, params, { + el: containerEl + }); + swipers.push(new Swiper(newParams)); + }); + return swipers; + } // Swiper Instance + + + const swiper = this; + swiper.__swiper__ = true; + swiper.support = getSupport(); + swiper.device = getDevice({ + userAgent: params.userAgent + }); + swiper.browser = getBrowser(); + swiper.eventsListeners = {}; + swiper.eventsAnyListeners = []; + swiper.modules = [...swiper.__modules__]; + + if (params.modules && Array.isArray(params.modules)) { + swiper.modules.push(...params.modules); + } + + const allModulesParams = {}; + swiper.modules.forEach(mod => { + mod({ + swiper, + extendParams: moduleExtendParams(params, allModulesParams), + on: swiper.on.bind(swiper), + once: swiper.once.bind(swiper), + off: swiper.off.bind(swiper), + emit: swiper.emit.bind(swiper) + }); + }); // Extend defaults with modules params + + const swiperParams = extend({}, defaults, allModulesParams); // Extend defaults with passed params + + swiper.params = extend({}, swiperParams, extendedDefaults, params); + swiper.originalParams = extend({}, swiper.params); + swiper.passedParams = extend({}, params); // add event listeners + + if (swiper.params && swiper.params.on) { + Object.keys(swiper.params.on).forEach(eventName => { + swiper.on(eventName, swiper.params.on[eventName]); + }); + } + + if (swiper.params && swiper.params.onAny) { + swiper.onAny(swiper.params.onAny); + } // Save Dom lib + + + swiper.$ = $; // Extend Swiper + + Object.assign(swiper, { + enabled: swiper.params.enabled, + el, + // Classes + classNames: [], + // Slides + slides: $(), + slidesGrid: [], + snapGrid: [], + slidesSizesGrid: [], + + // isDirection + isHorizontal() { + return swiper.params.direction === 'horizontal'; + }, + + isVertical() { + return swiper.params.direction === 'vertical'; + }, + + // Indexes + activeIndex: 0, + realIndex: 0, + // + isBeginning: true, + isEnd: false, + // Props + translate: 0, + previousTranslate: 0, + progress: 0, + velocity: 0, + animating: false, + // Locks + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + // Touch Events + touchEvents: function touchEvents() { + const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel']; + const desktop = ['pointerdown', 'pointermove', 'pointerup']; + swiper.touchEventsTouch = { + start: touch[0], + move: touch[1], + end: touch[2], + cancel: touch[3] + }; + swiper.touchEventsDesktop = { + start: desktop[0], + move: desktop[1], + end: desktop[2] + }; + return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop; + }(), + touchEventsData: { + isTouched: undefined, + isMoved: undefined, + allowTouchCallbacks: undefined, + touchStartTime: undefined, + isScrolling: undefined, + currentTranslate: undefined, + startTranslate: undefined, + allowThresholdMove: undefined, + // Form elements to match + focusableElements: swiper.params.focusableElements, + // Last click time + lastClickTime: now(), + clickTimeout: undefined, + // Velocities + velocities: [], + allowMomentumBounce: undefined, + isTouchEvent: undefined, + startMoving: undefined + }, + // Clicks + allowClick: true, + // Touches + allowTouchMove: swiper.params.allowTouchMove, + touches: { + startX: 0, + startY: 0, + currentX: 0, + currentY: 0, + diff: 0 + }, + // Images + imagesToLoad: [], + imagesLoaded: 0 + }); + swiper.emit('_swiper'); // Init + + if (swiper.params.init) { + swiper.init(); + } // Return app instance + + + return swiper; + } + + enable() { + const swiper = this; + if (swiper.enabled) return; + swiper.enabled = true; + + if (swiper.params.grabCursor) { + swiper.setGrabCursor(); + } + + swiper.emit('enable'); + } + + disable() { + const swiper = this; + if (!swiper.enabled) return; + swiper.enabled = false; + + if (swiper.params.grabCursor) { + swiper.unsetGrabCursor(); + } + + swiper.emit('disable'); + } + + setProgress(progress, speed) { + const swiper = this; + progress = Math.min(Math.max(progress, 0), 1); + const min = swiper.minTranslate(); + const max = swiper.maxTranslate(); + const current = (max - min) * progress + min; + swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + emitContainerClasses() { + const swiper = this; + if (!swiper.params._emitClasses || !swiper.el) return; + const cls = swiper.el.className.split(' ').filter(className => { + return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0; + }); + swiper.emit('_containerClasses', cls.join(' ')); + } + + getSlideClasses(slideEl) { + const swiper = this; + return slideEl.className.split(' ').filter(className => { + return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0; + }).join(' '); + } + + emitSlidesClasses() { + const swiper = this; + if (!swiper.params._emitClasses || !swiper.el) return; + const updates = []; + swiper.slides.each(slideEl => { + const classNames = swiper.getSlideClasses(slideEl); + updates.push({ + slideEl, + classNames + }); + swiper.emit('_slideClass', slideEl, classNames); + }); + swiper.emit('_slideClasses', updates); + } + + slidesPerViewDynamic(view = 'current', exact = false) { + const swiper = this; + const { + params, + slides, + slidesGrid, + slidesSizesGrid, + size: swiperSize, + activeIndex + } = swiper; + let spv = 1; + + if (params.centeredSlides) { + let slideSize = slides[activeIndex].swiperSlideSize; + let breakLoop; + + for (let i = activeIndex + 1; i < slides.length; i += 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + + for (let i = activeIndex - 1; i >= 0; i -= 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + } else { + // eslint-disable-next-line + if (view === 'current') { + for (let i = activeIndex + 1; i < slides.length; i += 1) { + const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize; + + if (slideInView) { + spv += 1; + } + } + } else { + // previous + for (let i = activeIndex - 1; i >= 0; i -= 1) { + const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize; + + if (slideInView) { + spv += 1; + } + } + } + } + + return spv; + } + + update() { + const swiper = this; + if (!swiper || swiper.destroyed) return; + const { + snapGrid, + params + } = swiper; // Breakpoints + + if (params.breakpoints) { + swiper.setBreakpoint(); + } + + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + function setTranslate() { + const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; + const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + let translated; + + if (swiper.params.freeMode && swiper.params.freeMode.enabled) { + setTranslate(); + + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { + translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + translated = swiper.slideTo(swiper.activeIndex, 0, false, true); + } + + if (!translated) { + setTranslate(); + } + } + + if (params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + + swiper.emit('update'); + } + + changeDirection(newDirection, needUpdate = true) { + const swiper = this; + const currentDirection = swiper.params.direction; + + if (!newDirection) { + // eslint-disable-next-line + newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal'; + } + + if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') { + return swiper; + } + + swiper.$el.removeClass(`${swiper.params.containerModifierClass}${currentDirection}`).addClass(`${swiper.params.containerModifierClass}${newDirection}`); + swiper.emitContainerClasses(); + swiper.params.direction = newDirection; + swiper.slides.each(slideEl => { + if (newDirection === 'vertical') { + slideEl.style.width = ''; + } else { + slideEl.style.height = ''; + } + }); + swiper.emit('changeDirection'); + if (needUpdate) swiper.update(); + return swiper; + } + + mount(el) { + const swiper = this; + if (swiper.mounted) return true; // Find el + + const $el = $(el || swiper.params.el); + el = $el[0]; + + if (!el) { + return false; + } + + el.swiper = swiper; + + const getWrapperSelector = () => { + return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`; + }; + + const getWrapper = () => { + if (el && el.shadowRoot && el.shadowRoot.querySelector) { + const res = $(el.shadowRoot.querySelector(getWrapperSelector())); // Children needs to return slot items + + res.children = options => $el.children(options); + + return res; + } + + return $el.children(getWrapperSelector()); + }; // Find Wrapper + + + let $wrapperEl = getWrapper(); + + if ($wrapperEl.length === 0 && swiper.params.createElements) { + const document = getDocument(); + const wrapper = document.createElement('div'); + $wrapperEl = $(wrapper); + wrapper.className = swiper.params.wrapperClass; + $el.append(wrapper); + $el.children(`.${swiper.params.slideClass}`).each(slideEl => { + $wrapperEl.append(slideEl); + }); + } + + Object.assign(swiper, { + $el, + el, + $wrapperEl, + wrapperEl: $wrapperEl[0], + mounted: true, + // RTL + rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl', + rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), + wrongRTL: $wrapperEl.css('display') === '-webkit-box' + }); + return true; + } + + init(el) { + const swiper = this; + if (swiper.initialized) return swiper; + const mounted = swiper.mount(el); + if (mounted === false) return swiper; + swiper.emit('beforeInit'); // Set breakpoint + + if (swiper.params.breakpoints) { + swiper.setBreakpoint(); + } // Add Classes + + + swiper.addClasses(); // Create loop + + if (swiper.params.loop) { + swiper.loopCreate(); + } // Update size + + + swiper.updateSize(); // Update slides + + swiper.updateSlides(); + + if (swiper.params.watchOverflow) { + swiper.checkOverflow(); + } // Set Grab Cursor + + + if (swiper.params.grabCursor && swiper.enabled) { + swiper.setGrabCursor(); + } + + if (swiper.params.preloadImages) { + swiper.preloadImages(); + } // Slide To Initial Slide + + + if (swiper.params.loop) { + swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit, false, true); + } else { + swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true); + } // Attach events + + + swiper.attachEvents(); // Init Flag + + swiper.initialized = true; // Emit + + swiper.emit('init'); + swiper.emit('afterInit'); + return swiper; + } + + destroy(deleteInstance = true, cleanStyles = true) { + const swiper = this; + const { + params, + $el, + $wrapperEl, + slides + } = swiper; + + if (typeof swiper.params === 'undefined' || swiper.destroyed) { + return null; + } + + swiper.emit('beforeDestroy'); // Init Flag + + swiper.initialized = false; // Detach events + + swiper.detachEvents(); // Destroy loop + + if (params.loop) { + swiper.loopDestroy(); + } // Cleanup styles + + + if (cleanStyles) { + swiper.removeClasses(); + $el.removeAttr('style'); + $wrapperEl.removeAttr('style'); + + if (slides && slides.length) { + slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index'); + } + } + + swiper.emit('destroy'); // Detach emitter events + + Object.keys(swiper.eventsListeners).forEach(eventName => { + swiper.off(eventName); + }); + + if (deleteInstance !== false) { + swiper.$el[0].swiper = null; + deleteProps(swiper); + } + + swiper.destroyed = true; + return null; + } + + static extendDefaults(newDefaults) { + extend(extendedDefaults, newDefaults); + } + + static get extendedDefaults() { + return extendedDefaults; + } + + static get defaults() { + return defaults; + } + + static installModule(mod) { + if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = []; + const modules = Swiper.prototype.__modules__; + + if (typeof mod === 'function' && modules.indexOf(mod) < 0) { + modules.push(mod); + } + } + + static use(module) { + if (Array.isArray(module)) { + module.forEach(m => Swiper.installModule(m)); + return Swiper; + } + + Swiper.installModule(module); + return Swiper; + } + + } + + Object.keys(prototypes).forEach(prototypeGroup => { + Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => { + Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; + }); + }); + Swiper.use([Resize, Observer]); + + function Virtual({ + swiper, + extendParams, + on + }) { + extendParams({ + virtual: { + enabled: false, + slides: [], + cache: true, + renderSlide: null, + renderExternal: null, + renderExternalUpdate: true, + addSlidesBefore: 0, + addSlidesAfter: 0 + } + }); + let cssModeTimeout; + swiper.virtual = { + cache: {}, + from: undefined, + to: undefined, + slides: [], + offset: 0, + slidesGrid: [] + }; + + function renderSlide(slide, index) { + const params = swiper.params.virtual; + + if (params.cache && swiper.virtual.cache[index]) { + return swiper.virtual.cache[index]; + } + + const $slideEl = params.renderSlide ? $(params.renderSlide.call(swiper, slide, index)) : $(`
${slide}
`); + if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index); + if (params.cache) swiper.virtual.cache[index] = $slideEl; + return $slideEl; + } + + function update(force) { + const { + slidesPerView, + slidesPerGroup, + centeredSlides + } = swiper.params; + const { + addSlidesBefore, + addSlidesAfter + } = swiper.params.virtual; + const { + from: previousFrom, + to: previousTo, + slides, + slidesGrid: previousSlidesGrid, + offset: previousOffset + } = swiper.virtual; + + if (!swiper.params.cssMode) { + swiper.updateActiveIndex(); + } + + const activeIndex = swiper.activeIndex || 0; + let offsetProp; + if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top'; + let slidesAfter; + let slidesBefore; + + if (centeredSlides) { + slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter; + slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore; + } else { + slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter; + slidesBefore = slidesPerGroup + addSlidesBefore; + } + + const from = Math.max((activeIndex || 0) - slidesBefore, 0); + const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1); + const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0); + Object.assign(swiper.virtual, { + from, + to, + offset, + slidesGrid: swiper.slidesGrid + }); + + function onRendered() { + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + if (swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + } + + if (previousFrom === from && previousTo === to && !force) { + if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) { + swiper.slides.css(offsetProp, `${offset}px`); + } + + swiper.updateProgress(); + return; + } + + if (swiper.params.virtual.renderExternal) { + swiper.params.virtual.renderExternal.call(swiper, { + offset, + from, + to, + slides: function getSlides() { + const slidesToRender = []; + + for (let i = from; i <= to; i += 1) { + slidesToRender.push(slides[i]); + } + + return slidesToRender; + }() + }); + + if (swiper.params.virtual.renderExternalUpdate) { + onRendered(); + } + + return; + } + + const prependIndexes = []; + const appendIndexes = []; + + if (force) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove(); + } else { + for (let i = previousFrom; i <= previousTo; i += 1) { + if (i < from || i > to) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}[data-swiper-slide-index="${i}"]`).remove(); + } + } + } + + for (let i = 0; i < slides.length; i += 1) { + if (i >= from && i <= to) { + if (typeof previousTo === 'undefined' || force) { + appendIndexes.push(i); + } else { + if (i > previousTo) appendIndexes.push(i); + if (i < previousFrom) prependIndexes.push(i); + } + } + } + + appendIndexes.forEach(index => { + swiper.$wrapperEl.append(renderSlide(slides[index], index)); + }); + prependIndexes.sort((a, b) => b - a).forEach(index => { + swiper.$wrapperEl.prepend(renderSlide(slides[index], index)); + }); + swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`); + onRendered(); + } + + function appendSlide(slides) { + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.push(slides[i]); + } + } else { + swiper.virtual.slides.push(slides); + } + + update(true); + } + + function prependSlide(slides) { + const activeIndex = swiper.activeIndex; + let newActiveIndex = activeIndex + 1; + let numberOfNewSlides = 1; + + if (Array.isArray(slides)) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.unshift(slides[i]); + } + + newActiveIndex = activeIndex + slides.length; + numberOfNewSlides = slides.length; + } else { + swiper.virtual.slides.unshift(slides); + } + + if (swiper.params.virtual.cache) { + const cache = swiper.virtual.cache; + const newCache = {}; + Object.keys(cache).forEach(cachedIndex => { + const $cachedEl = cache[cachedIndex]; + const cachedElIndex = $cachedEl.attr('data-swiper-slide-index'); + + if (cachedElIndex) { + $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides); + } + + newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl; + }); + swiper.virtual.cache = newCache; + } + + update(true); + swiper.slideTo(newActiveIndex, 0); + } + + function removeSlide(slidesIndexes) { + if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return; + let activeIndex = swiper.activeIndex; + + if (Array.isArray(slidesIndexes)) { + for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) { + swiper.virtual.slides.splice(slidesIndexes[i], 1); + + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes[i]]; + } + + if (slidesIndexes[i] < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + } else { + swiper.virtual.slides.splice(slidesIndexes, 1); + + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes]; + } + + if (slidesIndexes < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + + update(true); + swiper.slideTo(activeIndex, 0); + } + + function removeAllSlides() { + swiper.virtual.slides = []; + + if (swiper.params.virtual.cache) { + swiper.virtual.cache = {}; + } + + update(true); + swiper.slideTo(0, 0); + } + + on('beforeInit', () => { + if (!swiper.params.virtual.enabled) return; + swiper.virtual.slides = swiper.params.virtual.slides; + swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`); + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + + if (!swiper.params.initialSlide) { + update(); + } + }); + on('setTranslate', () => { + if (!swiper.params.virtual.enabled) return; + + if (swiper.params.cssMode && !swiper._immediateVirtual) { + clearTimeout(cssModeTimeout); + cssModeTimeout = setTimeout(() => { + update(); + }, 100); + } else { + update(); + } + }); + on('init update resize', () => { + if (!swiper.params.virtual.enabled) return; + + if (swiper.params.cssMode) { + setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`); + } + }); + Object.assign(swiper.virtual, { + appendSlide, + prependSlide, + removeSlide, + removeAllSlides, + update + }); + } + + /* eslint-disable consistent-return */ + function Keyboard({ + swiper, + extendParams, + on, + emit + }) { + const document = getDocument(); + const window = getWindow(); + swiper.keyboard = { + enabled: false + }; + extendParams({ + keyboard: { + enabled: false, + onlyInViewport: true, + pageUpDown: true + } + }); + + function handle(event) { + if (!swiper.enabled) return; + const { + rtlTranslate: rtl + } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; // jquery fix + + const kc = e.keyCode || e.charCode; + const pageUpDown = swiper.params.keyboard.pageUpDown; + const isPageUp = pageUpDown && kc === 33; + const isPageDown = pageUpDown && kc === 34; + const isArrowLeft = kc === 37; + const isArrowRight = kc === 39; + const isArrowUp = kc === 38; + const isArrowDown = kc === 40; // Directions locks + + if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) { + return false; + } + + if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) { + return false; + } + + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { + return undefined; + } + + if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) { + return undefined; + } + + if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) { + let inView = false; // Check that swiper should be inside of visible area of window + + if (swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 && swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0) { + return undefined; + } + + const $el = swiper.$el; + const swiperWidth = $el[0].clientWidth; + const swiperHeight = $el[0].clientHeight; + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + const swiperOffset = swiper.$el.offset(); + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]]; + + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + + if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) { + if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line + + inView = true; + } + } + + if (!inView) return undefined; + } + + if (swiper.isHorizontal()) { + if (isPageUp || isPageDown || isArrowLeft || isArrowRight) { + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + } + + if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext(); + if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev(); + } else { + if (isPageUp || isPageDown || isArrowUp || isArrowDown) { + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + } + + if (isPageDown || isArrowDown) swiper.slideNext(); + if (isPageUp || isArrowUp) swiper.slidePrev(); + } + + emit('keyPress', kc); + return undefined; + } + + function enable() { + if (swiper.keyboard.enabled) return; + $(document).on('keydown', handle); + swiper.keyboard.enabled = true; + } + + function disable() { + if (!swiper.keyboard.enabled) return; + $(document).off('keydown', handle); + swiper.keyboard.enabled = false; + } + + on('init', () => { + if (swiper.params.keyboard.enabled) { + enable(); + } + }); + on('destroy', () => { + if (swiper.keyboard.enabled) { + disable(); + } + }); + Object.assign(swiper.keyboard, { + enable, + disable + }); + } + + /* eslint-disable consistent-return */ + function Mousewheel({ + swiper, + extendParams, + on, + emit + }) { + const window = getWindow(); + extendParams({ + mousewheel: { + enabled: false, + releaseOnEdges: false, + invert: false, + forceToAxis: false, + sensitivity: 1, + eventsTarget: 'container', + thresholdDelta: null, + thresholdTime: null + } + }); + swiper.mousewheel = { + enabled: false + }; + let timeout; + let lastScrollTime = now(); + let lastEventBeforeSnap; + const recentWheelEvents = []; + + function normalize(e) { + // Reasonable defaults + const PIXEL_STEP = 10; + const LINE_HEIGHT = 40; + const PAGE_HEIGHT = 800; + let sX = 0; + let sY = 0; // spinX, spinY + + let pX = 0; + let pY = 0; // pixelX, pixelY + // Legacy + + if ('detail' in e) { + sY = e.detail; + } + + if ('wheelDelta' in e) { + sY = -e.wheelDelta / 120; + } + + if ('wheelDeltaY' in e) { + sY = -e.wheelDeltaY / 120; + } + + if ('wheelDeltaX' in e) { + sX = -e.wheelDeltaX / 120; + } // side scrolling on FF with DOMMouseScroll + + + if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) { + sX = sY; + sY = 0; + } + + pX = sX * PIXEL_STEP; + pY = sY * PIXEL_STEP; + + if ('deltaY' in e) { + pY = e.deltaY; + } + + if ('deltaX' in e) { + pX = e.deltaX; + } + + if (e.shiftKey && !pX) { + // if user scrolls with shift he wants horizontal scroll + pX = pY; + pY = 0; + } + + if ((pX || pY) && e.deltaMode) { + if (e.deltaMode === 1) { + // delta in LINE units + pX *= LINE_HEIGHT; + pY *= LINE_HEIGHT; + } else { + // delta in PAGE units + pX *= PAGE_HEIGHT; + pY *= PAGE_HEIGHT; + } + } // Fall-back if spin cannot be determined + + + if (pX && !sX) { + sX = pX < 1 ? -1 : 1; + } + + if (pY && !sY) { + sY = pY < 1 ? -1 : 1; + } + + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY + }; + } + + function handleMouseEnter() { + if (!swiper.enabled) return; + swiper.mouseEntered = true; + } + + function handleMouseLeave() { + if (!swiper.enabled) return; + swiper.mouseEntered = false; + } + + function animateSlider(newEvent) { + if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) { + // Prevent if delta of wheel scroll delta is below configured threshold + return false; + } + + if (swiper.params.mousewheel.thresholdTime && now() - lastScrollTime < swiper.params.mousewheel.thresholdTime) { + // Prevent if time between scrolls is below configured threshold + return false; + } // If the movement is NOT big enough and + // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider): + // Don't go any further (avoid insignificant scroll movement). + + + if (newEvent.delta >= 6 && now() - lastScrollTime < 60) { + // Return false as a default + return true; + } // If user is scrolling towards the end: + // If the slider hasn't hit the latest slide or + // if the slider is a loop and + // if the slider isn't moving right now: + // Go to next slide and + // emit a scroll event. + // Else (the user is scrolling towards the beginning) and + // if the slider hasn't hit the first slide or + // if the slider is a loop and + // if the slider isn't moving right now: + // Go to prev slide and + // emit a scroll event. + + + if (newEvent.direction < 0) { + if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) { + swiper.slideNext(); + emit('scroll', newEvent.raw); + } + } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) { + swiper.slidePrev(); + emit('scroll', newEvent.raw); + } // If you got here is because an animation has been triggered so store the current time + + + lastScrollTime = new window.Date().getTime(); // Return false as a default + + return false; + } + + function releaseScroll(newEvent) { + const params = swiper.params.mousewheel; + + if (newEvent.direction < 0) { + if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) { + // Return true to animate scroll on edges + return true; + } + } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) { + // Return true to animate scroll on edges + return true; + } + + return false; + } + + function handle(event) { + let e = event; + let disableParentSwiper = true; + if (!swiper.enabled) return; + const params = swiper.params.mousewheel; + + if (swiper.params.cssMode) { + e.preventDefault(); + } + + let target = swiper.$el; + + if (swiper.params.mousewheel.eventsTarget !== 'container') { + target = $(swiper.params.mousewheel.eventsTarget); + } + + if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) return true; + if (e.originalEvent) e = e.originalEvent; // jquery fix + + let delta = 0; + const rtlFactor = swiper.rtlTranslate ? -1 : 1; + const data = normalize(e); + + if (params.forceToAxis) { + if (swiper.isHorizontal()) { + if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true; + } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true; + } else { + delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY; + } + + if (delta === 0) return true; + if (params.invert) delta = -delta; // Get the scroll positions + + let positions = swiper.getTranslate() + delta * params.sensitivity; + if (positions >= swiper.minTranslate()) positions = swiper.minTranslate(); + if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); // When loop is true: + // the disableParentSwiper will be true. + // When loop is false: + // if the scroll positions is not on edge, + // then the disableParentSwiper will be true. + // if the scroll on edge positions, + // then the disableParentSwiper will be false. + + disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate()); + if (disableParentSwiper && swiper.params.nested) e.stopPropagation(); + + if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) { + // Register the new event in a variable which stores the relevant data + const newEvent = { + time: now(), + delta: Math.abs(delta), + direction: Math.sign(delta), + raw: event + }; // Keep the most recent events + + if (recentWheelEvents.length >= 2) { + recentWheelEvents.shift(); // only store the last N events + } + + const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined; + recentWheelEvents.push(newEvent); // If there is at least one previous recorded event: + // If direction has changed or + // if the scroll is quicker than the previous one: + // Animate the slider. + // Else (this is the first time the wheel is moved): + // Animate the slider. + + if (prevEvent) { + if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) { + animateSlider(newEvent); + } + } else { + animateSlider(newEvent); + } // If it's time to release the scroll: + // Return now so you don't hit the preventDefault. + + + if (releaseScroll(newEvent)) { + return true; + } + } else { + // Freemode or scrollContainer: + // If we recently snapped after a momentum scroll, then ignore wheel events + // to give time for the deceleration to finish. Stop ignoring after 500 msecs + // or if it's a new scroll (larger delta or inverse sign as last event before + // an end-of-momentum snap). + const newEvent = { + time: now(), + delta: Math.abs(delta), + direction: Math.sign(delta) + }; + const ignoreWheelEvents = lastEventBeforeSnap && newEvent.time < lastEventBeforeSnap.time + 500 && newEvent.delta <= lastEventBeforeSnap.delta && newEvent.direction === lastEventBeforeSnap.direction; + + if (!ignoreWheelEvents) { + lastEventBeforeSnap = undefined; + + if (swiper.params.loop) { + swiper.loopFix(); + } + + let position = swiper.getTranslate() + delta * params.sensitivity; + const wasBeginning = swiper.isBeginning; + const wasEnd = swiper.isEnd; + if (position >= swiper.minTranslate()) position = swiper.minTranslate(); + if (position <= swiper.maxTranslate()) position = swiper.maxTranslate(); + swiper.setTransition(0); + swiper.setTranslate(position); + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) { + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeMode.sticky) { + // When wheel scrolling starts with sticky (aka snap) enabled, then detect + // the end of a momentum scroll by storing recent (N=15?) wheel events. + // 1. do all N events have decreasing or same (absolute value) delta? + // 2. did all N events arrive in the last M (M=500?) msecs? + // 3. does the earliest event have an (absolute value) delta that's + // at least P (P=1?) larger than the most recent event's delta? + // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels? + // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration. + // Snap immediately and ignore remaining wheel events in this scroll. + // See comment above for "remaining wheel events in this scroll" determination. + // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event. + clearTimeout(timeout); + timeout = undefined; + + if (recentWheelEvents.length >= 15) { + recentWheelEvents.shift(); // only store the last N events + } + + const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined; + const firstEvent = recentWheelEvents[0]; + recentWheelEvents.push(newEvent); + + if (prevEvent && (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)) { + // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log. + recentWheelEvents.splice(0); + } else if (recentWheelEvents.length >= 15 && newEvent.time - firstEvent.time < 500 && firstEvent.delta - newEvent.delta >= 1 && newEvent.delta <= 6) { + // We're at the end of the deceleration of a momentum scroll, so there's no need + // to wait for more events. Snap ASAP on the next tick. + // Also, because there's some remaining momentum we'll bias the snap in the + // direction of the ongoing scroll because it's better UX for the scroll to snap + // in the same direction as the scroll instead of reversing to snap. Therefore, + // if it's already scrolled more than 20% in the current direction, keep going. + const snapToThreshold = delta > 0 ? 0.8 : 0.2; + lastEventBeforeSnap = newEvent; + recentWheelEvents.splice(0); + timeout = nextTick(() => { + swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold); + }, 0); // no delay; move on next tick + } + + if (!timeout) { + // if we get here, then we haven't detected the end of a momentum scroll, so + // we'll consider a scroll "complete" when there haven't been any wheel events + // for 500ms. + timeout = nextTick(() => { + const snapToThreshold = 0.5; + lastEventBeforeSnap = newEvent; + recentWheelEvents.splice(0); + swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold); + }, 500); + } + } // Emit event + + + if (!ignoreWheelEvents) emit('scroll', e); // Stop autoplay + + if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); // Return page scroll on edge positions + + if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true; + } + } + + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + return false; + } + + function events(method) { + let target = swiper.$el; + + if (swiper.params.mousewheel.eventsTarget !== 'container') { + target = $(swiper.params.mousewheel.eventsTarget); + } + + target[method]('mouseenter', handleMouseEnter); + target[method]('mouseleave', handleMouseLeave); + target[method]('wheel', handle); + } + + function enable() { + if (swiper.params.cssMode) { + swiper.wrapperEl.removeEventListener('wheel', handle); + return true; + } + + if (swiper.mousewheel.enabled) return false; + events('on'); + swiper.mousewheel.enabled = true; + return true; + } + + function disable() { + if (swiper.params.cssMode) { + swiper.wrapperEl.addEventListener(event, handle); + return true; + } + + if (!swiper.mousewheel.enabled) return false; + events('off'); + swiper.mousewheel.enabled = false; + return true; + } + + on('init', () => { + if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) { + disable(); + } + + if (swiper.params.mousewheel.enabled) enable(); + }); + on('destroy', () => { + if (swiper.params.cssMode) { + enable(); + } + + if (swiper.mousewheel.enabled) disable(); + }); + Object.assign(swiper.mousewheel, { + enable, + disable + }); + } + + function createElementIfNotDefined(swiper, originalParams, params, checkProps) { + const document = getDocument(); + + if (swiper.params.createElements) { + Object.keys(checkProps).forEach(key => { + if (!params[key] && params.auto === true) { + let element = swiper.$el.children(`.${checkProps[key]}`)[0]; + + if (!element) { + element = document.createElement('div'); + element.className = checkProps[key]; + swiper.$el.append(element); + } + + params[key] = element; + originalParams[key] = element; + } + }); + } + + return params; + } + + function Navigation({ + swiper, + extendParams, + on, + emit + }) { + extendParams({ + navigation: { + nextEl: null, + prevEl: null, + hideOnClick: false, + disabledClass: 'swiper-button-disabled', + hiddenClass: 'swiper-button-hidden', + lockClass: 'swiper-button-lock' + } + }); + swiper.navigation = { + nextEl: null, + $nextEl: null, + prevEl: null, + $prevEl: null + }; + + function getEl(el) { + let $el; + + if (el) { + $el = $(el); + + if (swiper.params.uniqueNavElements && typeof el === 'string' && $el.length > 1 && swiper.$el.find(el).length === 1) { + $el = swiper.$el.find(el); + } + } + + return $el; + } + + function toggleEl($el, disabled) { + const params = swiper.params.navigation; + + if ($el && $el.length > 0) { + $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass); + if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled; + + if (swiper.params.watchOverflow && swiper.enabled) { + $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + } + } + + function update() { + // Update Navigation Buttons + if (swiper.params.loop) return; + const { + $nextEl, + $prevEl + } = swiper.navigation; + toggleEl($prevEl, swiper.isBeginning); + toggleEl($nextEl, swiper.isEnd); + } + + function onPrevClick(e) { + e.preventDefault(); + if (swiper.isBeginning && !swiper.params.loop) return; + swiper.slidePrev(); + } + + function onNextClick(e) { + e.preventDefault(); + if (swiper.isEnd && !swiper.params.loop) return; + swiper.slideNext(); + } + + function init() { + const params = swiper.params.navigation; + swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, { + nextEl: 'swiper-button-next', + prevEl: 'swiper-button-prev' + }); + if (!(params.nextEl || params.prevEl)) return; + const $nextEl = getEl(params.nextEl); + const $prevEl = getEl(params.prevEl); + + if ($nextEl && $nextEl.length > 0) { + $nextEl.on('click', onNextClick); + } + + if ($prevEl && $prevEl.length > 0) { + $prevEl.on('click', onPrevClick); + } + + Object.assign(swiper.navigation, { + $nextEl, + nextEl: $nextEl && $nextEl[0], + $prevEl, + prevEl: $prevEl && $prevEl[0] + }); + + if (!swiper.enabled) { + if ($nextEl) $nextEl.addClass(params.lockClass); + if ($prevEl) $prevEl.addClass(params.lockClass); + } + } + + function destroy() { + const { + $nextEl, + $prevEl + } = swiper.navigation; + + if ($nextEl && $nextEl.length) { + $nextEl.off('click', onNextClick); + $nextEl.removeClass(swiper.params.navigation.disabledClass); + } + + if ($prevEl && $prevEl.length) { + $prevEl.off('click', onPrevClick); + $prevEl.removeClass(swiper.params.navigation.disabledClass); + } + } + + on('init', () => { + init(); + update(); + }); + on('toEdge fromEdge lock unlock', () => { + update(); + }); + on('destroy', () => { + destroy(); + }); + on('enable disable', () => { + const { + $nextEl, + $prevEl + } = swiper.navigation; + + if ($nextEl) { + $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass); + } + + if ($prevEl) { + $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass); + } + }); + on('click', (_s, e) => { + const { + $nextEl, + $prevEl + } = swiper.navigation; + const targetEl = e.target; + + if (swiper.params.navigation.hideOnClick && !$(targetEl).is($prevEl) && !$(targetEl).is($nextEl)) { + if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return; + let isHidden; + + if ($nextEl) { + isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass); + } else if ($prevEl) { + isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass); + } + + if (isHidden === true) { + emit('navigationShow'); + } else { + emit('navigationHide'); + } + + if ($nextEl) { + $nextEl.toggleClass(swiper.params.navigation.hiddenClass); + } + + if ($prevEl) { + $prevEl.toggleClass(swiper.params.navigation.hiddenClass); + } + } + }); + Object.assign(swiper.navigation, { + update, + init, + destroy + }); + } + + function classesToSelector(classes = '') { + return `.${classes.trim().replace(/([\.:!\/])/g, '\\$1') // eslint-disable-line + .replace(/ /g, '.')}`; + } + + function Pagination({ + swiper, + extendParams, + on, + emit + }) { + const pfx = 'swiper-pagination'; + extendParams({ + pagination: { + el: null, + bulletElement: 'span', + clickable: false, + hideOnClick: false, + renderBullet: null, + renderProgressbar: null, + renderFraction: null, + renderCustom: null, + progressbarOpposite: false, + type: 'bullets', + // 'bullets' or 'progressbar' or 'fraction' or 'custom' + dynamicBullets: false, + dynamicMainBullets: 1, + formatFractionCurrent: number => number, + formatFractionTotal: number => number, + bulletClass: `${pfx}-bullet`, + bulletActiveClass: `${pfx}-bullet-active`, + modifierClass: `${pfx}-`, + currentClass: `${pfx}-current`, + totalClass: `${pfx}-total`, + hiddenClass: `${pfx}-hidden`, + progressbarFillClass: `${pfx}-progressbar-fill`, + progressbarOppositeClass: `${pfx}-progressbar-opposite`, + clickableClass: `${pfx}-clickable`, + lockClass: `${pfx}-lock`, + horizontalClass: `${pfx}-horizontal`, + verticalClass: `${pfx}-vertical` + } + }); + swiper.pagination = { + el: null, + $el: null, + bullets: [] + }; + let bulletSize; + let dynamicBulletIndex = 0; + + function isPaginationDisabled() { + return !swiper.params.pagination.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0; + } + + function setSideBullets($bulletEl, position) { + const { + bulletActiveClass + } = swiper.params.pagination; + $bulletEl[position]().addClass(`${bulletActiveClass}-${position}`)[position]().addClass(`${bulletActiveClass}-${position}-${position}`); + } + + function update() { + // Render || Update Pagination bullets/items + const rtl = swiper.rtl; + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + const $el = swiper.pagination.$el; // Current/Total + + let current; + const total = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + + if (swiper.params.loop) { + current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup); + + if (current > slidesLength - 1 - swiper.loopedSlides * 2) { + current -= slidesLength - swiper.loopedSlides * 2; + } + + if (current > total - 1) current -= total; + if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current; + } else if (typeof swiper.snapIndex !== 'undefined') { + current = swiper.snapIndex; + } else { + current = swiper.activeIndex || 0; + } // Types + + + if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) { + const bullets = swiper.pagination.bullets; + let firstIndex; + let lastIndex; + let midIndex; + + if (params.dynamicBullets) { + bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true); + $el.css(swiper.isHorizontal() ? 'width' : 'height', `${bulletSize * (params.dynamicMainBullets + 4)}px`); + + if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) { + dynamicBulletIndex += current - swiper.previousIndex; + + if (dynamicBulletIndex > params.dynamicMainBullets - 1) { + dynamicBulletIndex = params.dynamicMainBullets - 1; + } else if (dynamicBulletIndex < 0) { + dynamicBulletIndex = 0; + } + } + + firstIndex = current - dynamicBulletIndex; + lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1); + midIndex = (lastIndex + firstIndex) / 2; + } + + bullets.removeClass(['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`).join(' ')); + + if ($el.length > 1) { + bullets.each(bullet => { + const $bullet = $(bullet); + const bulletIndex = $bullet.index(); + + if (bulletIndex === current) { + $bullet.addClass(params.bulletActiveClass); + } + + if (params.dynamicBullets) { + if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { + $bullet.addClass(`${params.bulletActiveClass}-main`); + } + + if (bulletIndex === firstIndex) { + setSideBullets($bullet, 'prev'); + } + + if (bulletIndex === lastIndex) { + setSideBullets($bullet, 'next'); + } + } + }); + } else { + const $bullet = bullets.eq(current); + const bulletIndex = $bullet.index(); + $bullet.addClass(params.bulletActiveClass); + + if (params.dynamicBullets) { + const $firstDisplayedBullet = bullets.eq(firstIndex); + const $lastDisplayedBullet = bullets.eq(lastIndex); + + for (let i = firstIndex; i <= lastIndex; i += 1) { + bullets.eq(i).addClass(`${params.bulletActiveClass}-main`); + } + + if (swiper.params.loop) { + if (bulletIndex >= bullets.length - params.dynamicMainBullets) { + for (let i = params.dynamicMainBullets; i >= 0; i -= 1) { + bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`); + } + + bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(`${params.bulletActiveClass}-prev`); + } else { + setSideBullets($firstDisplayedBullet, 'prev'); + setSideBullets($lastDisplayedBullet, 'next'); + } + } else { + setSideBullets($firstDisplayedBullet, 'prev'); + setSideBullets($lastDisplayedBullet, 'next'); + } + } + } + + if (params.dynamicBullets) { + const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4); + const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize; + const offsetProp = rtl ? 'right' : 'left'; + bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`); + } + } + + if (params.type === 'fraction') { + $el.find(classesToSelector(params.currentClass)).text(params.formatFractionCurrent(current + 1)); + $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total)); + } + + if (params.type === 'progressbar') { + let progressbarDirection; + + if (params.progressbarOpposite) { + progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal'; + } else { + progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical'; + } + + const scale = (current + 1) / total; + let scaleX = 1; + let scaleY = 1; + + if (progressbarDirection === 'horizontal') { + scaleX = scale; + } else { + scaleY = scale; + } + + $el.find(classesToSelector(params.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`).transition(swiper.params.speed); + } + + if (params.type === 'custom' && params.renderCustom) { + $el.html(params.renderCustom(swiper, current + 1, total)); + emit('paginationRender', $el[0]); + } else { + emit('paginationUpdate', $el[0]); + } + + if (swiper.params.watchOverflow && swiper.enabled) { + $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + } + + function render() { + // Render Container + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + const $el = swiper.pagination.$el; + let paginationHTML = ''; + + if (params.type === 'bullets') { + let numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + + if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.loop && numberOfBullets > slidesLength) { + numberOfBullets = slidesLength; + } + + for (let i = 0; i < numberOfBullets; i += 1) { + if (params.renderBullet) { + paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass); + } else { + paginationHTML += `<${params.bulletElement} class="${params.bulletClass}">`; + } + } + + $el.html(paginationHTML); + swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass)); + } + + if (params.type === 'fraction') { + if (params.renderFraction) { + paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass); + } else { + paginationHTML = `` + ' / ' + ``; + } + + $el.html(paginationHTML); + } + + if (params.type === 'progressbar') { + if (params.renderProgressbar) { + paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass); + } else { + paginationHTML = ``; + } + + $el.html(paginationHTML); + } + + if (params.type !== 'custom') { + emit('paginationRender', swiper.pagination.$el[0]); + } + } + + function init() { + swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, { + el: 'swiper-pagination' + }); + const params = swiper.params.pagination; + if (!params.el) return; + let $el = $(params.el); + if ($el.length === 0) return; + + if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) { + $el = swiper.$el.find(params.el); // check if it belongs to another nested Swiper + + if ($el.length > 1) { + $el = $el.filter(el => { + if ($(el).parents('.swiper')[0] !== swiper.el) return false; + return true; + }); + } + } + + if (params.type === 'bullets' && params.clickable) { + $el.addClass(params.clickableClass); + } + + $el.addClass(params.modifierClass + params.type); + $el.addClass(params.modifierClass + swiper.params.direction); + + if (params.type === 'bullets' && params.dynamicBullets) { + $el.addClass(`${params.modifierClass}${params.type}-dynamic`); + dynamicBulletIndex = 0; + + if (params.dynamicMainBullets < 1) { + params.dynamicMainBullets = 1; + } + } + + if (params.type === 'progressbar' && params.progressbarOpposite) { + $el.addClass(params.progressbarOppositeClass); + } + + if (params.clickable) { + $el.on('click', classesToSelector(params.bulletClass), function onClick(e) { + e.preventDefault(); + let index = $(this).index() * swiper.params.slidesPerGroup; + if (swiper.params.loop) index += swiper.loopedSlides; + swiper.slideTo(index); + }); + } + + Object.assign(swiper.pagination, { + $el, + el: $el[0] + }); + + if (!swiper.enabled) { + $el.addClass(params.lockClass); + } + } + + function destroy() { + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const $el = swiper.pagination.$el; + $el.removeClass(params.hiddenClass); + $el.removeClass(params.modifierClass + params.type); + $el.removeClass(params.modifierClass + swiper.params.direction); + if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass) swiper.pagination.bullets.removeClass(params.bulletActiveClass); + + if (params.clickable) { + $el.off('click', classesToSelector(params.bulletClass)); + } + } + + on('init', () => { + init(); + render(); + update(); + }); + on('activeIndexChange', () => { + if (swiper.params.loop) { + update(); + } else if (typeof swiper.snapIndex === 'undefined') { + update(); + } + }); + on('snapIndexChange', () => { + if (!swiper.params.loop) { + update(); + } + }); + on('slidesLengthChange', () => { + if (swiper.params.loop) { + render(); + update(); + } + }); + on('snapGridLengthChange', () => { + if (!swiper.params.loop) { + render(); + update(); + } + }); + on('destroy', () => { + destroy(); + }); + on('enable disable', () => { + const { + $el + } = swiper.pagination; + + if ($el) { + $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass); + } + }); + on('lock unlock', () => { + update(); + }); + on('click', (_s, e) => { + const targetEl = e.target; + const { + $el + } = swiper.pagination; + + if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && $el.length > 0 && !$(targetEl).hasClass(swiper.params.pagination.bulletClass)) { + if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return; + const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass); + + if (isHidden === true) { + emit('paginationShow'); + } else { + emit('paginationHide'); + } + + $el.toggleClass(swiper.params.pagination.hiddenClass); + } + }); + Object.assign(swiper.pagination, { + render, + update, + init, + destroy + }); + } + + function Scrollbar({ + swiper, + extendParams, + on, + emit + }) { + const document = getDocument(); + let isTouched = false; + let timeout = null; + let dragTimeout = null; + let dragStartPos; + let dragSize; + let trackSize; + let divider; + extendParams({ + scrollbar: { + el: null, + dragSize: 'auto', + hide: false, + draggable: false, + snapOnRelease: true, + lockClass: 'swiper-scrollbar-lock', + dragClass: 'swiper-scrollbar-drag' + } + }); + swiper.scrollbar = { + el: null, + dragEl: null, + $el: null, + $dragEl: null + }; + + function setTranslate() { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { + scrollbar, + rtlTranslate: rtl, + progress + } = swiper; + const { + $dragEl, + $el + } = scrollbar; + const params = swiper.params.scrollbar; + let newSize = dragSize; + let newPos = (trackSize - dragSize) * progress; + + if (rtl) { + newPos = -newPos; + + if (newPos > 0) { + newSize = dragSize - newPos; + newPos = 0; + } else if (-newPos + dragSize > trackSize) { + newSize = trackSize + newPos; + } + } else if (newPos < 0) { + newSize = dragSize + newPos; + newPos = 0; + } else if (newPos + dragSize > trackSize) { + newSize = trackSize - newPos; + } + + if (swiper.isHorizontal()) { + $dragEl.transform(`translate3d(${newPos}px, 0, 0)`); + $dragEl[0].style.width = `${newSize}px`; + } else { + $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`); + $dragEl[0].style.height = `${newSize}px`; + } + + if (params.hide) { + clearTimeout(timeout); + $el[0].style.opacity = 1; + timeout = setTimeout(() => { + $el[0].style.opacity = 0; + $el.transition(400); + }, 1000); + } + } + + function setTransition(duration) { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + swiper.scrollbar.$dragEl.transition(duration); + } + + function updateSize() { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { + scrollbar + } = swiper; + const { + $dragEl, + $el + } = scrollbar; + $dragEl[0].style.width = ''; + $dragEl[0].style.height = ''; + trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight; + divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0)); + + if (swiper.params.scrollbar.dragSize === 'auto') { + dragSize = trackSize * divider; + } else { + dragSize = parseInt(swiper.params.scrollbar.dragSize, 10); + } + + if (swiper.isHorizontal()) { + $dragEl[0].style.width = `${dragSize}px`; + } else { + $dragEl[0].style.height = `${dragSize}px`; + } + + if (divider >= 1) { + $el[0].style.display = 'none'; + } else { + $el[0].style.display = ''; + } + + if (swiper.params.scrollbar.hide) { + $el[0].style.opacity = 0; + } + + if (swiper.params.watchOverflow && swiper.enabled) { + scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass); + } + } + + function getPointerPosition(e) { + if (swiper.isHorizontal()) { + return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientX : e.clientX; + } + + return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientY : e.clientY; + } + + function setDragPosition(e) { + const { + scrollbar, + rtlTranslate: rtl + } = swiper; + const { + $el + } = scrollbar; + let positionRatio; + positionRatio = (getPointerPosition(e) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize); + positionRatio = Math.max(Math.min(positionRatio, 1), 0); + + if (rtl) { + positionRatio = 1 - positionRatio; + } + + const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio; + swiper.updateProgress(position); + swiper.setTranslate(position); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + function onDragStart(e) { + const params = swiper.params.scrollbar; + const { + scrollbar, + $wrapperEl + } = swiper; + const { + $el, + $dragEl + } = scrollbar; + isTouched = true; + dragStartPos = e.target === $dragEl[0] || e.target === $dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null; + e.preventDefault(); + e.stopPropagation(); + $wrapperEl.transition(100); + $dragEl.transition(100); + setDragPosition(e); + clearTimeout(dragTimeout); + $el.transition(0); + + if (params.hide) { + $el.css('opacity', 1); + } + + if (swiper.params.cssMode) { + swiper.$wrapperEl.css('scroll-snap-type', 'none'); + } + + emit('scrollbarDragStart', e); + } + + function onDragMove(e) { + const { + scrollbar, + $wrapperEl + } = swiper; + const { + $el, + $dragEl + } = scrollbar; + if (!isTouched) return; + if (e.preventDefault) e.preventDefault();else e.returnValue = false; + setDragPosition(e); + $wrapperEl.transition(0); + $el.transition(0); + $dragEl.transition(0); + emit('scrollbarDragMove', e); + } + + function onDragEnd(e) { + const params = swiper.params.scrollbar; + const { + scrollbar, + $wrapperEl + } = swiper; + const { + $el + } = scrollbar; + if (!isTouched) return; + isTouched = false; + + if (swiper.params.cssMode) { + swiper.$wrapperEl.css('scroll-snap-type', ''); + $wrapperEl.transition(''); + } + + if (params.hide) { + clearTimeout(dragTimeout); + dragTimeout = nextTick(() => { + $el.css('opacity', 0); + $el.transition(400); + }, 1000); + } + + emit('scrollbarDragEnd', e); + + if (params.snapOnRelease) { + swiper.slideToClosest(); + } + } + + function events(method) { + const { + scrollbar, + touchEventsTouch, + touchEventsDesktop, + params, + support + } = swiper; + const $el = scrollbar.$el; + const target = $el[0]; + const activeListener = support.passiveListener && params.passiveListeners ? { + passive: false, + capture: false + } : false; + const passiveListener = support.passiveListener && params.passiveListeners ? { + passive: true, + capture: false + } : false; + if (!target) return; + const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener'; + + if (!support.touch) { + target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener); + document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener); + document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener); + } else { + target[eventMethod](touchEventsTouch.start, onDragStart, activeListener); + target[eventMethod](touchEventsTouch.move, onDragMove, activeListener); + target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener); + } + } + + function enableDraggable() { + if (!swiper.params.scrollbar.el) return; + events('on'); + } + + function disableDraggable() { + if (!swiper.params.scrollbar.el) return; + events('off'); + } + + function init() { + const { + scrollbar, + $el: $swiperEl + } = swiper; + swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, { + el: 'swiper-scrollbar' + }); + const params = swiper.params.scrollbar; + if (!params.el) return; + let $el = $(params.el); + + if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) { + $el = $swiperEl.find(params.el); + } + + let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`); + + if ($dragEl.length === 0) { + $dragEl = $(`
`); + $el.append($dragEl); + } + + Object.assign(scrollbar, { + $el, + el: $el[0], + $dragEl, + dragEl: $dragEl[0] + }); + + if (params.draggable) { + enableDraggable(); + } + + if ($el) { + $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass); + } + } + + function destroy() { + disableDraggable(); + } + + on('init', () => { + init(); + updateSize(); + setTranslate(); + }); + on('update resize observerUpdate lock unlock', () => { + updateSize(); + }); + on('setTranslate', () => { + setTranslate(); + }); + on('setTransition', (_s, duration) => { + setTransition(duration); + }); + on('enable disable', () => { + const { + $el + } = swiper.scrollbar; + + if ($el) { + $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass); + } + }); + on('destroy', () => { + destroy(); + }); + Object.assign(swiper.scrollbar, { + updateSize, + setTranslate, + init, + destroy + }); + } + + function Parallax({ + swiper, + extendParams, + on + }) { + extendParams({ + parallax: { + enabled: false + } + }); + + const setTransform = (el, progress) => { + const { + rtl + } = swiper; + const $el = $(el); + const rtlFactor = rtl ? -1 : 1; + const p = $el.attr('data-swiper-parallax') || '0'; + let x = $el.attr('data-swiper-parallax-x'); + let y = $el.attr('data-swiper-parallax-y'); + const scale = $el.attr('data-swiper-parallax-scale'); + const opacity = $el.attr('data-swiper-parallax-opacity'); + + if (x || y) { + x = x || '0'; + y = y || '0'; + } else if (swiper.isHorizontal()) { + x = p; + y = '0'; + } else { + y = p; + x = '0'; + } + + if (x.indexOf('%') >= 0) { + x = `${parseInt(x, 10) * progress * rtlFactor}%`; + } else { + x = `${x * progress * rtlFactor}px`; + } + + if (y.indexOf('%') >= 0) { + y = `${parseInt(y, 10) * progress}%`; + } else { + y = `${y * progress}px`; + } + + if (typeof opacity !== 'undefined' && opacity !== null) { + const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress)); + $el[0].style.opacity = currentOpacity; + } + + if (typeof scale === 'undefined' || scale === null) { + $el.transform(`translate3d(${x}, ${y}, 0px)`); + } else { + const currentScale = scale - (scale - 1) * (1 - Math.abs(progress)); + $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`); + } + }; + + const setTranslate = () => { + const { + $el, + slides, + progress, + snapGrid + } = swiper; + $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(el => { + setTransform(el, progress); + }); + slides.each((slideEl, slideIndex) => { + let slideProgress = slideEl.progress; + + if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') { + slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1); + } + + slideProgress = Math.min(Math.max(slideProgress, -1), 1); + $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(el => { + setTransform(el, slideProgress); + }); + }); + }; + + const setTransition = (duration = swiper.params.speed) => { + const { + $el + } = swiper; + $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(parallaxEl => { + const $parallaxEl = $(parallaxEl); + let parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration; + if (duration === 0) parallaxDuration = 0; + $parallaxEl.transition(parallaxDuration); + }); + }; + + on('beforeInit', () => { + if (!swiper.params.parallax.enabled) return; + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }); + on('init', () => { + if (!swiper.params.parallax.enabled) return; + setTranslate(); + }); + on('setTranslate', () => { + if (!swiper.params.parallax.enabled) return; + setTranslate(); + }); + on('setTransition', (_swiper, duration) => { + if (!swiper.params.parallax.enabled) return; + setTransition(duration); + }); + } + + function Zoom({ + swiper, + extendParams, + on, + emit + }) { + const window = getWindow(); + extendParams({ + zoom: { + enabled: false, + maxRatio: 3, + minRatio: 1, + toggle: true, + containerClass: 'swiper-zoom-container', + zoomedSlideClass: 'swiper-slide-zoomed' + } + }); + swiper.zoom = { + enabled: false + }; + let currentScale = 1; + let isScaling = false; + let gesturesEnabled; + let fakeGestureTouched; + let fakeGestureMoved; + const gesture = { + $slideEl: undefined, + slideWidth: undefined, + slideHeight: undefined, + $imageEl: undefined, + $imageWrapEl: undefined, + maxRatio: 3 + }; + const image = { + isTouched: undefined, + isMoved: undefined, + currentX: undefined, + currentY: undefined, + minX: undefined, + minY: undefined, + maxX: undefined, + maxY: undefined, + width: undefined, + height: undefined, + startX: undefined, + startY: undefined, + touchesStart: {}, + touchesCurrent: {} + }; + const velocity = { + x: undefined, + y: undefined, + prevPositionX: undefined, + prevPositionY: undefined, + prevTime: undefined + }; + let scale = 1; + Object.defineProperty(swiper.zoom, 'scale', { + get() { + return scale; + }, + + set(value) { + if (scale !== value) { + const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined; + const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined; + emit('zoomChange', value, imageEl, slideEl); + } + + scale = value; + } + + }); + + function getDistanceBetweenTouches(e) { + if (e.targetTouches.length < 2) return 1; + const x1 = e.targetTouches[0].pageX; + const y1 = e.targetTouches[0].pageY; + const x2 = e.targetTouches[1].pageX; + const y2 = e.targetTouches[1].pageY; + const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); + return distance; + } // Events + + + function onGestureStart(e) { + const support = swiper.support; + const params = swiper.params.zoom; + fakeGestureTouched = false; + fakeGestureMoved = false; + + if (!support.gestures) { + if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) { + return; + } + + fakeGestureTouched = true; + gesture.scaleStart = getDistanceBetweenTouches(e); + } + + if (!gesture.$slideEl || !gesture.$slideEl.length) { + gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`); + if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('img, svg, canvas, picture, .swiper-zoom-target'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + + if (gesture.$imageWrapEl.length === 0) { + gesture.$imageEl = undefined; + return; + } + } + + if (gesture.$imageEl) { + gesture.$imageEl.transition(0); + } + + isScaling = true; + } + + function onGestureChange(e) { + const support = swiper.support; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + + if (!support.gestures) { + if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) { + return; + } + + fakeGestureMoved = true; + gesture.scaleMove = getDistanceBetweenTouches(e); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { + if (e.type === 'gesturechange') onGestureStart(e); + return; + } + + if (support.gestures) { + zoom.scale = e.scale * currentScale; + } else { + zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale; + } + + if (zoom.scale > gesture.maxRatio) { + zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5; + } + + if (zoom.scale < params.minRatio) { + zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5; + } + + gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`); + } + + function onGestureEnd(e) { + const device = swiper.device; + const support = swiper.support; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + + if (!support.gestures) { + if (!fakeGestureTouched || !fakeGestureMoved) { + return; + } + + if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2 && !device.android) { + return; + } + + fakeGestureTouched = false; + fakeGestureMoved = false; + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio); + gesture.$imageEl.transition(swiper.params.speed).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + currentScale = zoom.scale; + isScaling = false; + if (zoom.scale === 1) gesture.$slideEl = undefined; + } + + function onTouchStart(e) { + const device = swiper.device; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (image.isTouched) return; + if (device.android && e.cancelable) e.preventDefault(); + image.isTouched = true; + image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + } + + function onTouchMove(e) { + const zoom = swiper.zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + swiper.allowClick = false; + if (!image.isTouched || !gesture.$slideEl) return; + + if (!image.isMoved) { + image.width = gesture.$imageEl[0].offsetWidth; + image.height = gesture.$imageEl[0].offsetHeight; + image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0; + image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0; + gesture.slideWidth = gesture.$slideEl[0].offsetWidth; + gesture.slideHeight = gesture.$slideEl[0].offsetHeight; + gesture.$imageWrapEl.transition(0); + } // Define if we need image drag + + + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return; + image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); + image.maxX = -image.minX; + image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); + image.maxY = -image.minY; + image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (!image.isMoved && !isScaling) { + if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) { + image.isTouched = false; + return; + } + + if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) { + image.isTouched = false; + return; + } + } + + if (e.cancelable) { + e.preventDefault(); + } + + e.stopPropagation(); + image.isMoved = true; + image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX; + image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY; + + if (image.currentX < image.minX) { + image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8; + } + + if (image.currentX > image.maxX) { + image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8; + } + + if (image.currentY < image.minY) { + image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8; + } + + if (image.currentY > image.maxY) { + image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8; + } // Velocity + + + if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x; + if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y; + if (!velocity.prevTime) velocity.prevTime = Date.now(); + velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2; + velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2; + if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0; + if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0; + velocity.prevPositionX = image.touchesCurrent.x; + velocity.prevPositionY = image.touchesCurrent.y; + velocity.prevTime = Date.now(); + gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + } + + function onTouchEnd() { + const zoom = swiper.zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + + if (!image.isTouched || !image.isMoved) { + image.isTouched = false; + image.isMoved = false; + return; + } + + image.isTouched = false; + image.isMoved = false; + let momentumDurationX = 300; + let momentumDurationY = 300; + const momentumDistanceX = velocity.x * momentumDurationX; + const newPositionX = image.currentX + momentumDistanceX; + const momentumDistanceY = velocity.y * momentumDurationY; + const newPositionY = image.currentY + momentumDistanceY; // Fix duration + + if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); + if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); + const momentumDuration = Math.max(momentumDurationX, momentumDurationY); + image.currentX = newPositionX; + image.currentY = newPositionY; // Define if we need image drag + + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); + image.maxX = -image.minX; + image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); + image.maxY = -image.minY; + image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX); + image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY); + gesture.$imageWrapEl.transition(momentumDuration).transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + } + + function onTransitionEnd() { + const zoom = swiper.zoom; + + if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) { + if (gesture.$imageEl) { + gesture.$imageEl.transform('translate3d(0,0,0) scale(1)'); + } + + if (gesture.$imageWrapEl) { + gesture.$imageWrapEl.transform('translate3d(0,0,0)'); + } + + zoom.scale = 1; + currentScale = 1; + gesture.$slideEl = undefined; + gesture.$imageEl = undefined; + gesture.$imageWrapEl = undefined; + } + } + + function zoomIn(e) { + const zoom = swiper.zoom; + const params = swiper.params.zoom; + + if (!gesture.$slideEl) { + if (e && e.target) { + gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`); + } + + if (!gesture.$slideEl) { + if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) { + gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`); + } else { + gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + } + } + + gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('img, svg, canvas, picture, .swiper-zoom-target'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return; + + if (swiper.params.cssMode) { + swiper.wrapperEl.style.overflow = 'hidden'; + swiper.wrapperEl.style.touchAction = 'none'; + } + + gesture.$slideEl.addClass(`${params.zoomedSlideClass}`); + let touchX; + let touchY; + let offsetX; + let offsetY; + let diffX; + let diffY; + let translateX; + let translateY; + let imageWidth; + let imageHeight; + let scaledWidth; + let scaledHeight; + let translateMinX; + let translateMinY; + let translateMaxX; + let translateMaxY; + let slideWidth; + let slideHeight; + + if (typeof image.touchesStart.x === 'undefined' && e) { + touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX; + touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY; + } else { + touchX = image.touchesStart.x; + touchY = image.touchesStart.y; + } + + zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + + if (e) { + slideWidth = gesture.$slideEl[0].offsetWidth; + slideHeight = gesture.$slideEl[0].offsetHeight; + offsetX = gesture.$slideEl.offset().left + window.scrollX; + offsetY = gesture.$slideEl.offset().top + window.scrollY; + diffX = offsetX + slideWidth / 2 - touchX; + diffY = offsetY + slideHeight / 2 - touchY; + imageWidth = gesture.$imageEl[0].offsetWidth; + imageHeight = gesture.$imageEl[0].offsetHeight; + scaledWidth = imageWidth * zoom.scale; + scaledHeight = imageHeight * zoom.scale; + translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0); + translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0); + translateMaxX = -translateMinX; + translateMaxY = -translateMinY; + translateX = diffX * zoom.scale; + translateY = diffY * zoom.scale; + + if (translateX < translateMinX) { + translateX = translateMinX; + } + + if (translateX > translateMaxX) { + translateX = translateMaxX; + } + + if (translateY < translateMinY) { + translateY = translateMinY; + } + + if (translateY > translateMaxY) { + translateY = translateMaxY; + } + } else { + translateX = 0; + translateY = 0; + } + + gesture.$imageWrapEl.transition(300).transform(`translate3d(${translateX}px, ${translateY}px,0)`); + gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + } + + function zoomOut() { + const zoom = swiper.zoom; + const params = swiper.params.zoom; + + if (!gesture.$slideEl) { + if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) { + gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`); + } else { + gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + } + + gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('img, svg, canvas, picture, .swiper-zoom-target'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return; + + if (swiper.params.cssMode) { + swiper.wrapperEl.style.overflow = ''; + swiper.wrapperEl.style.touchAction = ''; + } + + zoom.scale = 1; + currentScale = 1; + gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)'); + gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)'); + gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`); + gesture.$slideEl = undefined; + } // Toggle Zoom + + + function zoomToggle(e) { + const zoom = swiper.zoom; + + if (zoom.scale && zoom.scale !== 1) { + // Zoom Out + zoomOut(); + } else { + // Zoom In + zoomIn(e); + } + } + + function getListeners() { + const support = swiper.support; + const passiveListener = swiper.touchEvents.start === 'touchstart' && support.passiveListener && swiper.params.passiveListeners ? { + passive: true, + capture: false + } : false; + const activeListenerWithCapture = support.passiveListener ? { + passive: false, + capture: true + } : true; + return { + passiveListener, + activeListenerWithCapture + }; + } + + function getSlideSelector() { + return `.${swiper.params.slideClass}`; + } + + function toggleGestures(method) { + const { + passiveListener + } = getListeners(); + const slideSelector = getSlideSelector(); + swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener); + swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener); + swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener); + } + + function enableGestures() { + if (gesturesEnabled) return; + gesturesEnabled = true; + toggleGestures('on'); + } + + function disableGestures() { + if (!gesturesEnabled) return; + gesturesEnabled = false; + toggleGestures('off'); + } // Attach/Detach Events + + + function enable() { + const zoom = swiper.zoom; + if (zoom.enabled) return; + zoom.enabled = true; + const support = swiper.support; + const { + passiveListener, + activeListenerWithCapture + } = getListeners(); + const slideSelector = getSlideSelector(); // Scale image + + if (support.gestures) { + swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, onGestureStart, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, onGestureChange, activeListenerWithCapture); + swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener); + + if (swiper.touchEvents.cancel) { + swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, onGestureEnd, passiveListener); + } + } // Move image + + + swiper.$wrapperEl.on(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, onTouchMove, activeListenerWithCapture); + } + + function disable() { + const zoom = swiper.zoom; + if (!zoom.enabled) return; + const support = swiper.support; + zoom.enabled = false; + const { + passiveListener, + activeListenerWithCapture + } = getListeners(); + const slideSelector = getSlideSelector(); // Scale image + + if (support.gestures) { + swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, onGestureStart, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, onGestureChange, activeListenerWithCapture); + swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener); + + if (swiper.touchEvents.cancel) { + swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, onGestureEnd, passiveListener); + } + } // Move image + + + swiper.$wrapperEl.off(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, onTouchMove, activeListenerWithCapture); + } + + on('init', () => { + if (swiper.params.zoom.enabled) { + enable(); + } + }); + on('destroy', () => { + disable(); + }); + on('touchStart', (_s, e) => { + if (!swiper.zoom.enabled) return; + onTouchStart(e); + }); + on('touchEnd', (_s, e) => { + if (!swiper.zoom.enabled) return; + onTouchEnd(); + }); + on('doubleTap', (_s, e) => { + if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) { + zoomToggle(e); + } + }); + on('transitionEnd', () => { + if (swiper.zoom.enabled && swiper.params.zoom.enabled) { + onTransitionEnd(); + } + }); + on('slideChange', () => { + if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) { + onTransitionEnd(); + } + }); + Object.assign(swiper.zoom, { + enable, + disable, + in: zoomIn, + out: zoomOut, + toggle: zoomToggle + }); + } + + function Lazy({ + swiper, + extendParams, + on, + emit + }) { + extendParams({ + lazy: { + checkInView: false, + enabled: false, + loadPrevNext: false, + loadPrevNextAmount: 1, + loadOnTransitionStart: false, + scrollingElement: '', + elementClass: 'swiper-lazy', + loadingClass: 'swiper-lazy-loading', + loadedClass: 'swiper-lazy-loaded', + preloaderClass: 'swiper-lazy-preloader' + } + }); + swiper.lazy = {}; + let scrollHandlerAttached = false; + let initialImageLoaded = false; + + function loadInSlide(index, loadInDuplicate = true) { + const params = swiper.params.lazy; + if (typeof index === 'undefined') return; + if (swiper.slides.length === 0) return; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + const $slideEl = isVirtual ? swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-swiper-slide-index="${index}"]`) : swiper.slides.eq(index); + const $images = $slideEl.find(`.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`); + + if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) { + $images.push($slideEl[0]); + } + + if ($images.length === 0) return; + $images.each(imageEl => { + const $imageEl = $(imageEl); + $imageEl.addClass(params.loadingClass); + const background = $imageEl.attr('data-background'); + const src = $imageEl.attr('data-src'); + const srcset = $imageEl.attr('data-srcset'); + const sizes = $imageEl.attr('data-sizes'); + const $pictureEl = $imageEl.parent('picture'); + swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => { + if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper && !swiper.params || swiper.destroyed) return; + + if (background) { + $imageEl.css('background-image', `url("${background}")`); + $imageEl.removeAttr('data-background'); + } else { + if (srcset) { + $imageEl.attr('srcset', srcset); + $imageEl.removeAttr('data-srcset'); + } + + if (sizes) { + $imageEl.attr('sizes', sizes); + $imageEl.removeAttr('data-sizes'); + } + + if ($pictureEl.length) { + $pictureEl.children('source').each(sourceEl => { + const $source = $(sourceEl); + + if ($source.attr('data-srcset')) { + $source.attr('srcset', $source.attr('data-srcset')); + $source.removeAttr('data-srcset'); + } + }); + } + + if (src) { + $imageEl.attr('src', src); + $imageEl.removeAttr('data-src'); + } + } + + $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass); + $slideEl.find(`.${params.preloaderClass}`).remove(); + + if (swiper.params.loop && loadInDuplicate) { + const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index'); + + if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) { + const originalSlide = swiper.$wrapperEl.children(`[data-swiper-slide-index="${slideOriginalIndex}"]:not(.${swiper.params.slideDuplicateClass})`); + loadInSlide(originalSlide.index(), false); + } else { + const duplicatedSlide = swiper.$wrapperEl.children(`.${swiper.params.slideDuplicateClass}[data-swiper-slide-index="${slideOriginalIndex}"]`); + loadInSlide(duplicatedSlide.index(), false); + } + } + + emit('lazyImageReady', $slideEl[0], $imageEl[0]); + + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + }); + emit('lazyImageLoad', $slideEl[0], $imageEl[0]); + }); + } + + function load() { + const { + $wrapperEl, + params: swiperParams, + slides, + activeIndex + } = swiper; + const isVirtual = swiper.virtual && swiperParams.virtual.enabled; + const params = swiperParams.lazy; + let slidesPerView = swiperParams.slidesPerView; + + if (slidesPerView === 'auto') { + slidesPerView = 0; + } + + function slideExist(index) { + if (isVirtual) { + if ($wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index="${index}"]`).length) { + return true; + } + } else if (slides[index]) return true; + + return false; + } + + function slideIndex(slideEl) { + if (isVirtual) { + return $(slideEl).attr('data-swiper-slide-index'); + } + + return $(slideEl).index(); + } + + if (!initialImageLoaded) initialImageLoaded = true; + + if (swiper.params.watchSlidesProgress) { + $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each(slideEl => { + const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index(); + loadInSlide(index); + }); + } else if (slidesPerView > 1) { + for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) { + if (slideExist(i)) loadInSlide(i); + } + } else { + loadInSlide(activeIndex); + } + + if (params.loadPrevNext) { + if (slidesPerView > 1 || params.loadPrevNextAmount && params.loadPrevNextAmount > 1) { + const amount = params.loadPrevNextAmount; + const spv = slidesPerView; + const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length); + const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); // Next Slides + + for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) { + if (slideExist(i)) loadInSlide(i); + } // Prev Slides + + + for (let i = minIndex; i < activeIndex; i += 1) { + if (slideExist(i)) loadInSlide(i); + } + } else { + const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`); + if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide)); + const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`); + if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide)); + } + } + } + + function checkInViewOnLoad() { + const window = getWindow(); + if (!swiper || swiper.destroyed) return; + const $scrollElement = swiper.params.lazy.scrollingElement ? $(swiper.params.lazy.scrollingElement) : $(window); + const isWindow = $scrollElement[0] === window; + const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth; + const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight; + const swiperOffset = swiper.$el.offset(); + const { + rtlTranslate: rtl + } = swiper; + let inView = false; + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiper.width, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiper.height], [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height]]; + + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + + if (point[0] >= 0 && point[0] <= scrollElementWidth && point[1] >= 0 && point[1] <= scrollElementHeight) { + if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line + + inView = true; + } + } + + const passiveListener = swiper.touchEvents.start === 'touchstart' && swiper.support.passiveListener && swiper.params.passiveListeners ? { + passive: true, + capture: false + } : false; + + if (inView) { + load(); + $scrollElement.off('scroll', checkInViewOnLoad, passiveListener); + } else if (!scrollHandlerAttached) { + scrollHandlerAttached = true; + $scrollElement.on('scroll', checkInViewOnLoad, passiveListener); + } + } + + on('beforeInit', () => { + if (swiper.params.lazy.enabled && swiper.params.preloadImages) { + swiper.params.preloadImages = false; + } + }); + on('init', () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on('scroll', () => { + if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.freeMode.sticky) { + load(); + } + }); + on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on('transitionStart', () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.loadOnTransitionStart || !swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + } + }); + on('transitionEnd', () => { + if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on('slideChange', () => { + const { + lazy, + cssMode, + watchSlidesProgress, + touchReleaseOnEdges, + resistanceRatio + } = swiper.params; + + if (lazy.enabled && (cssMode || watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0))) { + load(); + } + }); + Object.assign(swiper.lazy, { + load, + loadInSlide + }); + } + + /* eslint no-bitwise: ["error", { "allow": [">>"] }] */ + function Controller({ + swiper, + extendParams, + on + }) { + extendParams({ + controller: { + control: undefined, + inverse: false, + by: 'slide' // or 'container' + + } + }); + swiper.controller = { + control: undefined + }; + + function LinearSpline(x, y) { + const binarySearch = function search() { + let maxIndex; + let minIndex; + let guess; + return (array, val) => { + minIndex = -1; + maxIndex = array.length; + + while (maxIndex - minIndex > 1) { + guess = maxIndex + minIndex >> 1; + + if (array[guess] <= val) { + minIndex = guess; + } else { + maxIndex = guess; + } + } + + return maxIndex; + }; + }(); + + this.x = x; + this.y = y; + this.lastIndex = x.length - 1; // Given an x value (x2), return the expected y2 value: + // (x1,y1) is the known point before given value, + // (x3,y3) is the known point after given value. + + let i1; + let i3; + + this.interpolate = function interpolate(x2) { + if (!x2) return 0; // Get the indexes of x1 and x3 (the array indexes before and after given x2): + + i3 = binarySearch(this.x, x2); + i1 = i3 - 1; // We have our indexes i1 & i3, so we can calculate already: + // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1 + + return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1]; + }; + + return this; + } // xxx: for now i will just save one spline function to to + + + function getInterpolateFunction(c) { + if (!swiper.controller.spline) { + swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid); + } + } + + function setTranslate(_t, byController) { + const controlled = swiper.controller.control; + let multiplier; + let controlledTranslate; + const Swiper = swiper.constructor; + + function setControlledTranslate(c) { + // this will create an Interpolate function based on the snapGrids + // x is the Grid of the scrolled scroller and y will be the controlled scroller + // it makes sense to create this only once and recall it for the interpolation + // the function does a lot of value caching for performance + const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate; + + if (swiper.params.controller.by === 'slide') { + getInterpolateFunction(c); // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid + // but it did not work out + + controlledTranslate = -swiper.controller.spline.interpolate(-translate); + } + + if (!controlledTranslate || swiper.params.controller.by === 'container') { + multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate()); + controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate(); + } + + if (swiper.params.controller.inverse) { + controlledTranslate = c.maxTranslate() - controlledTranslate; + } + + c.updateProgress(controlledTranslate); + c.setTranslate(controlledTranslate, swiper); + c.updateActiveIndex(); + c.updateSlidesClasses(); + } + + if (Array.isArray(controlled)) { + for (let i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTranslate(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTranslate(controlled); + } + } + + function setTransition(duration, byController) { + const Swiper = swiper.constructor; + const controlled = swiper.controller.control; + let i; + + function setControlledTransition(c) { + c.setTransition(duration, swiper); + + if (duration !== 0) { + c.transitionStart(); + + if (c.params.autoHeight) { + nextTick(() => { + c.updateAutoHeight(); + }); + } + + c.$wrapperEl.transitionEnd(() => { + if (!controlled) return; + + if (c.params.loop && swiper.params.controller.by === 'slide') { + c.loopFix(); + } + + c.transitionEnd(); + }); + } + } + + if (Array.isArray(controlled)) { + for (i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTransition(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTransition(controlled); + } + } + + function removeSpline() { + if (!swiper.controller.control) return; + + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + } + + on('beforeInit', () => { + swiper.controller.control = swiper.params.controller.control; + }); + on('update', () => { + removeSpline(); + }); + on('resize', () => { + removeSpline(); + }); + on('observerUpdate', () => { + removeSpline(); + }); + on('setTranslate', (_s, translate, byController) => { + if (!swiper.controller.control) return; + swiper.controller.setTranslate(translate, byController); + }); + on('setTransition', (_s, duration, byController) => { + if (!swiper.controller.control) return; + swiper.controller.setTransition(duration, byController); + }); + Object.assign(swiper.controller, { + setTranslate, + setTransition + }); + } + + function A11y({ + swiper, + extendParams, + on + }) { + extendParams({ + a11y: { + enabled: true, + notificationClass: 'swiper-notification', + prevSlideMessage: 'Previous slide', + nextSlideMessage: 'Next slide', + firstSlideMessage: 'This is the first slide', + lastSlideMessage: 'This is the last slide', + paginationBulletMessage: 'Go to slide {{index}}', + slideLabelMessage: '{{index}} / {{slidesLength}}', + containerMessage: null, + containerRoleDescriptionMessage: null, + itemRoleDescriptionMessage: null, + slideRole: 'group' + } + }); + let liveRegion = null; + + function notify(message) { + const notification = liveRegion; + if (notification.length === 0) return; + notification.html(''); + notification.html(message); + } + + function getRandomNumber(size = 16) { + const randomChar = () => Math.round(16 * Math.random()).toString(16); + + return 'x'.repeat(size).replace(/x/g, randomChar); + } + + function makeElFocusable($el) { + $el.attr('tabIndex', '0'); + } + + function makeElNotFocusable($el) { + $el.attr('tabIndex', '-1'); + } + + function addElRole($el, role) { + $el.attr('role', role); + } + + function addElRoleDescription($el, description) { + $el.attr('aria-roledescription', description); + } + + function addElControls($el, controls) { + $el.attr('aria-controls', controls); + } + + function addElLabel($el, label) { + $el.attr('aria-label', label); + } + + function addElId($el, id) { + $el.attr('id', id); + } + + function addElLive($el, live) { + $el.attr('aria-live', live); + } + + function disableEl($el) { + $el.attr('aria-disabled', true); + } + + function enableEl($el) { + $el.attr('aria-disabled', false); + } + + function onEnterOrSpaceKey(e) { + if (e.keyCode !== 13 && e.keyCode !== 32) return; + const params = swiper.params.a11y; + const $targetEl = $(e.target); + + if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) { + if (!(swiper.isEnd && !swiper.params.loop)) { + swiper.slideNext(); + } + + if (swiper.isEnd) { + notify(params.lastSlideMessage); + } else { + notify(params.nextSlideMessage); + } + } + + if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) { + if (!(swiper.isBeginning && !swiper.params.loop)) { + swiper.slidePrev(); + } + + if (swiper.isBeginning) { + notify(params.firstSlideMessage); + } else { + notify(params.prevSlideMessage); + } + } + + if (swiper.pagination && $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))) { + $targetEl[0].click(); + } + } + + function updateNavigation() { + if (swiper.params.loop || !swiper.navigation) return; + const { + $nextEl, + $prevEl + } = swiper.navigation; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + disableEl($prevEl); + makeElNotFocusable($prevEl); + } else { + enableEl($prevEl); + makeElFocusable($prevEl); + } + } + + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + disableEl($nextEl); + makeElNotFocusable($nextEl); + } else { + enableEl($nextEl); + makeElFocusable($nextEl); + } + } + } + + function hasPagination() { + return swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length; + } + + function updatePagination() { + const params = swiper.params.a11y; + + if (hasPagination()) { + swiper.pagination.bullets.each(bulletEl => { + const $bulletEl = $(bulletEl); + makeElFocusable($bulletEl); + + if (!swiper.params.pagination.renderBullet) { + addElRole($bulletEl, 'button'); + addElLabel($bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, $bulletEl.index() + 1)); + } + }); + } + } + + const initNavEl = ($el, wrapperId, message) => { + makeElFocusable($el); + + if ($el[0].tagName !== 'BUTTON') { + addElRole($el, 'button'); + $el.on('keydown', onEnterOrSpaceKey); + } + + addElLabel($el, message); + addElControls($el, wrapperId); + }; + + function init() { + const params = swiper.params.a11y; + swiper.$el.append(liveRegion); // Container + + const $containerEl = swiper.$el; + + if (params.containerRoleDescriptionMessage) { + addElRoleDescription($containerEl, params.containerRoleDescriptionMessage); + } + + if (params.containerMessage) { + addElLabel($containerEl, params.containerMessage); + } // Wrapper + + + const $wrapperEl = swiper.$wrapperEl; + const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`; + const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite'; + addElId($wrapperEl, wrapperId); + addElLive($wrapperEl, live); // Slide + + if (params.itemRoleDescriptionMessage) { + addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage); + } + + addElRole($(swiper.slides), params.slideRole); + const slidesLength = swiper.params.loop ? swiper.slides.filter(el => !el.classList.contains(swiper.params.slideDuplicateClass)).length : swiper.slides.length; + swiper.slides.each((slideEl, index) => { + const $slideEl = $(slideEl); + const slideIndex = swiper.params.loop ? parseInt($slideEl.attr('data-swiper-slide-index'), 10) : index; + const ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength); + addElLabel($slideEl, ariaLabelMessage); + }); // Navigation + + let $nextEl; + let $prevEl; + + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + + if ($nextEl && $nextEl.length) { + initNavEl($nextEl, wrapperId, params.nextSlideMessage); + } + + if ($prevEl && $prevEl.length) { + initNavEl($prevEl, wrapperId, params.prevSlideMessage); + } // Pagination + + + if (hasPagination()) { + swiper.pagination.$el.on('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey); + } + } + + function destroy() { + if (liveRegion && liveRegion.length > 0) liveRegion.remove(); + let $nextEl; + let $prevEl; + + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + + if ($nextEl) { + $nextEl.off('keydown', onEnterOrSpaceKey); + } + + if ($prevEl) { + $prevEl.off('keydown', onEnterOrSpaceKey); + } // Pagination + + + if (hasPagination()) { + swiper.pagination.$el.off('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey); + } + } + + on('beforeInit', () => { + liveRegion = $(``); + }); + on('afterInit', () => { + if (!swiper.params.a11y.enabled) return; + init(); + updateNavigation(); + }); + on('toEdge', () => { + if (!swiper.params.a11y.enabled) return; + updateNavigation(); + }); + on('fromEdge', () => { + if (!swiper.params.a11y.enabled) return; + updateNavigation(); + }); + on('paginationUpdate', () => { + if (!swiper.params.a11y.enabled) return; + updatePagination(); + }); + on('destroy', () => { + if (!swiper.params.a11y.enabled) return; + destroy(); + }); + } + + function History({ + swiper, + extendParams, + on + }) { + extendParams({ + history: { + enabled: false, + root: '', + replaceState: false, + key: 'slides' + } + }); + let initialized = false; + let paths = {}; + + const slugify = text => { + return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, ''); + }; + + const getPathValues = urlOverride => { + const window = getWindow(); + let location; + + if (urlOverride) { + location = new URL(urlOverride); + } else { + location = window.location; + } + + const pathArray = location.pathname.slice(1).split('/').filter(part => part !== ''); + const total = pathArray.length; + const key = pathArray[total - 2]; + const value = pathArray[total - 1]; + return { + key, + value + }; + }; + + const setHistory = (key, index) => { + const window = getWindow(); + if (!initialized || !swiper.params.history.enabled) return; + let location; + + if (swiper.params.url) { + location = new URL(swiper.params.url); + } else { + location = window.location; + } + + const slide = swiper.slides.eq(index); + let value = slugify(slide.attr('data-history')); + + if (swiper.params.history.root.length > 0) { + let root = swiper.params.history.root; + if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1); + value = `${root}/${key}/${value}`; + } else if (!location.pathname.includes(key)) { + value = `${key}/${value}`; + } + + const currentState = window.history.state; + + if (currentState && currentState.value === value) { + return; + } + + if (swiper.params.history.replaceState) { + window.history.replaceState({ + value + }, null, value); + } else { + window.history.pushState({ + value + }, null, value); + } + }; + + const scrollToSlide = (speed, value, runCallbacks) => { + if (value) { + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHistory = slugify(slide.attr('data-history')); + + if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, runCallbacks); + } + } + } else { + swiper.slideTo(0, speed, runCallbacks); + } + }; + + const setHistoryPopState = () => { + paths = getPathValues(swiper.params.url); + scrollToSlide(swiper.params.speed, swiper.paths.value, false); + }; + + const init = () => { + const window = getWindow(); + if (!swiper.params.history) return; + + if (!window.history || !window.history.pushState) { + swiper.params.history.enabled = false; + swiper.params.hashNavigation.enabled = true; + return; + } + + initialized = true; + paths = getPathValues(swiper.params.url); + if (!paths.key && !paths.value) return; + scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit); + + if (!swiper.params.history.replaceState) { + window.addEventListener('popstate', setHistoryPopState); + } + }; + + const destroy = () => { + const window = getWindow(); + + if (!swiper.params.history.replaceState) { + window.removeEventListener('popstate', setHistoryPopState); + } + }; + + on('init', () => { + if (swiper.params.history.enabled) { + init(); + } + }); + on('destroy', () => { + if (swiper.params.history.enabled) { + destroy(); + } + }); + on('transitionEnd _freeModeNoMomentumRelease', () => { + if (initialized) { + setHistory(swiper.params.history.key, swiper.activeIndex); + } + }); + on('slideChange', () => { + if (initialized && swiper.params.cssMode) { + setHistory(swiper.params.history.key, swiper.activeIndex); + } + }); + } + + function HashNavigation({ + swiper, + extendParams, + emit, + on + }) { + let initialized = false; + const document = getDocument(); + const window = getWindow(); + extendParams({ + hashNavigation: { + enabled: false, + replaceState: false, + watchState: false + } + }); + + const onHashChange = () => { + emit('hashChange'); + const newHash = document.location.hash.replace('#', ''); + const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash'); + + if (newHash !== activeSlideHash) { + const newIndex = swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-hash="${newHash}"]`).index(); + if (typeof newIndex === 'undefined') return; + swiper.slideTo(newIndex); + } + }; + + const setHash = () => { + if (!initialized || !swiper.params.hashNavigation.enabled) return; + + if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) { + window.history.replaceState(null, null, `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || ''); + emit('hashSet'); + } else { + const slide = swiper.slides.eq(swiper.activeIndex); + const hash = slide.attr('data-hash') || slide.attr('data-history'); + document.location.hash = hash || ''; + emit('hashSet'); + } + }; + + const init = () => { + if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return; + initialized = true; + const hash = document.location.hash.replace('#', ''); + + if (hash) { + const speed = 0; + + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHash = slide.attr('data-hash') || slide.attr('data-history'); + + if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true); + } + } + } + + if (swiper.params.hashNavigation.watchState) { + $(window).on('hashchange', onHashChange); + } + }; + + const destroy = () => { + if (swiper.params.hashNavigation.watchState) { + $(window).off('hashchange', onHashChange); + } + }; + + on('init', () => { + if (swiper.params.hashNavigation.enabled) { + init(); + } + }); + on('destroy', () => { + if (swiper.params.hashNavigation.enabled) { + destroy(); + } + }); + on('transitionEnd _freeModeNoMomentumRelease', () => { + if (initialized) { + setHash(); + } + }); + on('slideChange', () => { + if (initialized && swiper.params.cssMode) { + setHash(); + } + }); + } + + /* eslint no-underscore-dangle: "off" */ + function Autoplay({ + swiper, + extendParams, + on, + emit + }) { + let timeout; + swiper.autoplay = { + running: false, + paused: false + }; + extendParams({ + autoplay: { + enabled: false, + delay: 3000, + waitForTransition: true, + disableOnInteraction: true, + stopOnLastSlide: false, + reverseDirection: false, + pauseOnMouseEnter: false + } + }); + + function run() { + const $activeSlideEl = swiper.slides.eq(swiper.activeIndex); + let delay = swiper.params.autoplay.delay; + + if ($activeSlideEl.attr('data-swiper-autoplay')) { + delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay; + } + + clearTimeout(timeout); + timeout = nextTick(() => { + let autoplayResult; + + if (swiper.params.autoplay.reverseDirection) { + if (swiper.params.loop) { + swiper.loopFix(); + autoplayResult = swiper.slidePrev(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.isBeginning) { + autoplayResult = swiper.slidePrev(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true); + emit('autoplay'); + } else { + stop(); + } + } else if (swiper.params.loop) { + swiper.loopFix(); + autoplayResult = swiper.slideNext(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.isEnd) { + autoplayResult = swiper.slideNext(swiper.params.speed, true, true); + emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true); + emit('autoplay'); + } else { + stop(); + } + + if (swiper.params.cssMode && swiper.autoplay.running) run();else if (autoplayResult === false) { + run(); + } + }, delay); + } + + function start() { + if (typeof timeout !== 'undefined') return false; + if (swiper.autoplay.running) return false; + swiper.autoplay.running = true; + emit('autoplayStart'); + run(); + return true; + } + + function stop() { + if (!swiper.autoplay.running) return false; + if (typeof timeout === 'undefined') return false; + + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + + swiper.autoplay.running = false; + emit('autoplayStop'); + return true; + } + + function pause(speed) { + if (!swiper.autoplay.running) return; + if (swiper.autoplay.paused) return; + if (timeout) clearTimeout(timeout); + swiper.autoplay.paused = true; + + if (speed === 0 || !swiper.params.autoplay.waitForTransition) { + swiper.autoplay.paused = false; + run(); + } else { + ['transitionend', 'webkitTransitionEnd'].forEach(event => { + swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd); + }); + } + } + + function onVisibilityChange() { + const document = getDocument(); + + if (document.visibilityState === 'hidden' && swiper.autoplay.running) { + pause(); + } + + if (document.visibilityState === 'visible' && swiper.autoplay.paused) { + run(); + swiper.autoplay.paused = false; + } + } + + function onTransitionEnd(e) { + if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return; + if (e.target !== swiper.$wrapperEl[0]) return; + ['transitionend', 'webkitTransitionEnd'].forEach(event => { + swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd); + }); + swiper.autoplay.paused = false; + + if (!swiper.autoplay.running) { + stop(); + } else { + run(); + } + } + + function onMouseEnter() { + if (swiper.params.autoplay.disableOnInteraction) { + stop(); + } else { + pause(); + } + + ['transitionend', 'webkitTransitionEnd'].forEach(event => { + swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd); + }); + } + + function onMouseLeave() { + if (swiper.params.autoplay.disableOnInteraction) { + return; + } + + swiper.autoplay.paused = false; + run(); + } + + function attachMouseEvents() { + if (swiper.params.autoplay.pauseOnMouseEnter) { + swiper.$el.on('mouseenter', onMouseEnter); + swiper.$el.on('mouseleave', onMouseLeave); + } + } + + function detachMouseEvents() { + swiper.$el.off('mouseenter', onMouseEnter); + swiper.$el.off('mouseleave', onMouseLeave); + } + + on('init', () => { + if (swiper.params.autoplay.enabled) { + start(); + const document = getDocument(); + document.addEventListener('visibilitychange', onVisibilityChange); + attachMouseEvents(); + } + }); + on('beforeTransitionStart', (_s, speed, internal) => { + if (swiper.autoplay.running) { + if (internal || !swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.pause(speed); + } else { + stop(); + } + } + }); + on('sliderFirstMove', () => { + if (swiper.autoplay.running) { + if (swiper.params.autoplay.disableOnInteraction) { + stop(); + } else { + pause(); + } + } + }); + on('touchEnd', () => { + if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) { + run(); + } + }); + on('destroy', () => { + detachMouseEvents(); + + if (swiper.autoplay.running) { + stop(); + } + + const document = getDocument(); + document.removeEventListener('visibilitychange', onVisibilityChange); + }); + Object.assign(swiper.autoplay, { + pause, + run, + start, + stop + }); + } + + function Thumb({ + swiper, + extendParams, + on + }) { + extendParams({ + thumbs: { + swiper: null, + multipleActiveThumbs: true, + autoScrollOffset: 0, + slideThumbActiveClass: 'swiper-slide-thumb-active', + thumbsContainerClass: 'swiper-thumbs' + } + }); + let initialized = false; + let swiperCreated = false; + swiper.thumbs = { + swiper: null + }; + + function onThumbClick() { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const clickedIndex = thumbsSwiper.clickedIndex; + const clickedSlide = thumbsSwiper.clickedSlide; + if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) return; + if (typeof clickedIndex === 'undefined' || clickedIndex === null) return; + let slideToIndex; + + if (thumbsSwiper.params.loop) { + slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10); + } else { + slideToIndex = clickedIndex; + } + + if (swiper.params.loop) { + let currentIndex = swiper.activeIndex; + + if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) { + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + currentIndex = swiper.activeIndex; + } + + const prevIndex = swiper.slides.eq(currentIndex).prevAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + const nextIndex = swiper.slides.eq(currentIndex).nextAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;else slideToIndex = prevIndex; + } + + swiper.slideTo(slideToIndex); + } + + function init() { + const { + thumbs: thumbsParams + } = swiper.params; + if (initialized) return false; + initialized = true; + const SwiperClass = swiper.constructor; + + if (thumbsParams.swiper instanceof SwiperClass) { + swiper.thumbs.swiper = thumbsParams.swiper; + Object.assign(swiper.thumbs.swiper.originalParams, { + watchSlidesProgress: true, + slideToClickedSlide: false + }); + Object.assign(swiper.thumbs.swiper.params, { + watchSlidesProgress: true, + slideToClickedSlide: false + }); + } else if (isObject(thumbsParams.swiper)) { + const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper); + Object.assign(thumbsSwiperParams, { + watchSlidesProgress: true, + slideToClickedSlide: false + }); + swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams); + swiperCreated = true; + } + + swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass); + swiper.thumbs.swiper.on('tap', onThumbClick); + return true; + } + + function update(initial) { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView; + const autoScrollOffset = swiper.params.thumbs.autoScrollOffset; + const useOffset = autoScrollOffset && !thumbsSwiper.params.loop; + + if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) { + let currentThumbsIndex = thumbsSwiper.activeIndex; + let newThumbsIndex; + let direction; + + if (thumbsSwiper.params.loop) { + if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) { + thumbsSwiper.loopFix(); // eslint-disable-next-line + + thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft; + currentThumbsIndex = thumbsSwiper.activeIndex; + } // Find actual thumbs index to slide to + + + const prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + const nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + + if (typeof prevThumbsIndex === 'undefined') { + newThumbsIndex = nextThumbsIndex; + } else if (typeof nextThumbsIndex === 'undefined') { + newThumbsIndex = prevThumbsIndex; + } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { + newThumbsIndex = thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex; + } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { + newThumbsIndex = nextThumbsIndex; + } else { + newThumbsIndex = prevThumbsIndex; + } + + direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev'; + } else { + newThumbsIndex = swiper.realIndex; + direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev'; + } + + if (useOffset) { + newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset; + } + + if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) { + if (thumbsSwiper.params.centeredSlides) { + if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1; + } else { + newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1; + } + } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ; + + thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined); + } + } // Activate thumbs + + + let thumbsToActivate = 1; + const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass; + + if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) { + thumbsToActivate = swiper.params.slidesPerView; + } + + if (!swiper.params.thumbs.multipleActiveThumbs) { + thumbsToActivate = 1; + } + + thumbsToActivate = Math.floor(thumbsToActivate); + thumbsSwiper.slides.removeClass(thumbActiveClass); + + if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.$wrapperEl.children(`[data-swiper-slide-index="${swiper.realIndex + i}"]`).addClass(thumbActiveClass); + } + } else { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass); + } + } + } + + on('beforeInit', () => { + const { + thumbs + } = swiper.params; + if (!thumbs || !thumbs.swiper) return; + init(); + update(true); + }); + on('slideChange update resize observerUpdate', () => { + if (!swiper.thumbs.swiper) return; + update(); + }); + on('setTransition', (_s, duration) => { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + thumbsSwiper.setTransition(duration); + }); + on('beforeDestroy', () => { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + + if (swiperCreated && thumbsSwiper) { + thumbsSwiper.destroy(); + } + }); + Object.assign(swiper.thumbs, { + init, + update + }); + } + + function freeMode({ + swiper, + extendParams, + emit, + once + }) { + extendParams({ + freeMode: { + enabled: false, + momentum: true, + momentumRatio: 1, + momentumBounce: true, + momentumBounceRatio: 1, + momentumVelocityRatio: 1, + sticky: false, + minimumVelocity: 0.02 + } + }); + + function onTouchMove() { + const { + touchEventsData: data, + touches + } = swiper; // Velocity + + if (data.velocities.length === 0) { + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'startX' : 'startY'], + time: data.touchStartTime + }); + } + + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'], + time: now() + }); + } + + function onTouchEnd({ + currentPos + }) { + const { + params, + $wrapperEl, + rtlTranslate: rtl, + snapGrid, + touchEventsData: data + } = swiper; // Time diff + + const touchEndTime = now(); + const timeDiff = touchEndTime - data.touchStartTime; + + if (currentPos < -swiper.minTranslate()) { + swiper.slideTo(swiper.activeIndex); + return; + } + + if (currentPos > -swiper.maxTranslate()) { + if (swiper.slides.length < snapGrid.length) { + swiper.slideTo(snapGrid.length - 1); + } else { + swiper.slideTo(swiper.slides.length - 1); + } + + return; + } + + if (params.freeMode.momentum) { + if (data.velocities.length > 1) { + const lastMoveEvent = data.velocities.pop(); + const velocityEvent = data.velocities.pop(); + const distance = lastMoveEvent.position - velocityEvent.position; + const time = lastMoveEvent.time - velocityEvent.time; + swiper.velocity = distance / time; + swiper.velocity /= 2; + + if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) { + swiper.velocity = 0; + } // this implies that the user stopped moving a finger then released. + // There would be no events with distance zero, so the last event is stale. + + + if (time > 150 || now() - lastMoveEvent.time > 300) { + swiper.velocity = 0; + } + } else { + swiper.velocity = 0; + } + + swiper.velocity *= params.freeMode.momentumVelocityRatio; + data.velocities.length = 0; + let momentumDuration = 1000 * params.freeMode.momentumRatio; + const momentumDistance = swiper.velocity * momentumDuration; + let newPosition = swiper.translate + momentumDistance; + if (rtl) newPosition = -newPosition; + let doBounce = false; + let afterBouncePosition; + const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio; + let needsLoopFix; + + if (newPosition < swiper.maxTranslate()) { + if (params.freeMode.momentumBounce) { + if (newPosition + swiper.maxTranslate() < -bounceAmount) { + newPosition = swiper.maxTranslate() - bounceAmount; + } + + afterBouncePosition = swiper.maxTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.maxTranslate(); + } + + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (newPosition > swiper.minTranslate()) { + if (params.freeMode.momentumBounce) { + if (newPosition - swiper.minTranslate() > bounceAmount) { + newPosition = swiper.minTranslate() + bounceAmount; + } + + afterBouncePosition = swiper.minTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.minTranslate(); + } + + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (params.freeMode.sticky) { + let nextSlide; + + for (let j = 0; j < snapGrid.length; j += 1) { + if (snapGrid[j] > -newPosition) { + nextSlide = j; + break; + } + } + + if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') { + newPosition = snapGrid[nextSlide]; + } else { + newPosition = snapGrid[nextSlide - 1]; + } + + newPosition = -newPosition; + } + + if (needsLoopFix) { + once('transitionEnd', () => { + swiper.loopFix(); + }); + } // Fix duration + + + if (swiper.velocity !== 0) { + if (rtl) { + momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity); + } else { + momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity); + } + + if (params.freeMode.sticky) { + // If freeMode.sticky is active and the user ends a swipe with a slow-velocity + // event, then durations can be 20+ seconds to slide one (or zero!) slides. + // It's easy to see this when simulating touch with mouse events. To fix this, + // limit single-slide swipes to the default slide duration. This also has the + // nice side effect of matching slide speed if the user stopped moving before + // lifting finger or mouse vs. moving slowly before lifting the finger/mouse. + // For faster swipes, also apply limits (albeit higher ones). + const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate); + const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex]; + + if (moveDistance < currentSlideSize) { + momentumDuration = params.speed; + } else if (moveDistance < 2 * currentSlideSize) { + momentumDuration = params.speed * 1.5; + } else { + momentumDuration = params.speed * 2.5; + } + } + } else if (params.freeMode.sticky) { + swiper.slideToClosest(); + return; + } + + if (params.freeMode.momentumBounce && doBounce) { + swiper.updateProgress(afterBouncePosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return; + emit('momentumBounce'); + swiper.setTransition(params.speed); + setTimeout(() => { + swiper.setTranslate(afterBouncePosition); + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + }, 0); + }); + } else if (swiper.velocity) { + emit('_freeModeNoMomentumRelease'); + swiper.updateProgress(newPosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + + if (!swiper.animating) { + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + } + } else { + swiper.updateProgress(newPosition); + } + + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } else if (params.freeMode.sticky) { + swiper.slideToClosest(); + return; + } else if (params.freeMode) { + emit('_freeModeNoMomentumRelease'); + } + + if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) { + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + } + + Object.assign(swiper, { + freeMode: { + onTouchMove, + onTouchEnd + } + }); + } + + function Grid({ + swiper, + extendParams + }) { + extendParams({ + grid: { + rows: 1, + fill: 'column' + } + }); + let slidesNumberEvenToRows; + let slidesPerRow; + let numFullColumns; + + const initSlides = slidesLength => { + const { + slidesPerView + } = swiper.params; + const { + rows, + fill + } = swiper.params.grid; + slidesPerRow = slidesNumberEvenToRows / rows; + numFullColumns = Math.floor(slidesLength / rows); + + if (Math.floor(slidesLength / rows) === slidesLength / rows) { + slidesNumberEvenToRows = slidesLength; + } else { + slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows; + } + + if (slidesPerView !== 'auto' && fill === 'row') { + slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows); + } + }; + + const updateSlide = (i, slide, slidesLength, getDirectionLabel) => { + const { + slidesPerGroup, + spaceBetween + } = swiper.params; + const { + rows, + fill + } = swiper.params.grid; // Set slides order + + let newSlideOrderIndex; + let column; + let row; + + if (fill === 'row' && slidesPerGroup > 1) { + const groupIndex = Math.floor(i / (slidesPerGroup * rows)); + const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex; + const columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup); + row = Math.floor(slideIndexInGroup / columnsInGroup); + column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup; + newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows; + slide.css({ + '-webkit-order': newSlideOrderIndex, + order: newSlideOrderIndex + }); + } else if (fill === 'column') { + column = Math.floor(i / rows); + row = i - column * rows; + + if (column > numFullColumns || column === numFullColumns && row === rows - 1) { + row += 1; + + if (row >= rows) { + row = 0; + column += 1; + } + } + } else { + row = Math.floor(i / slidesPerRow); + column = i - row * slidesPerRow; + } + + slide.css(getDirectionLabel('margin-top'), row !== 0 ? spaceBetween && `${spaceBetween}px` : ''); + }; + + const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => { + const { + spaceBetween, + centeredSlides, + roundLengths + } = swiper.params; + const { + rows + } = swiper.params.grid; + swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows; + swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween; + swiper.$wrapperEl.css({ + [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px` + }); + + if (centeredSlides) { + snapGrid.splice(0, snapGrid.length); + const newSlidesGrid = []; + + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (roundLengths) slidesGridItem = Math.floor(slidesGridItem); + if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem); + } + + snapGrid.push(...newSlidesGrid); + } + }; + + swiper.grid = { + initSlides, + updateSlide, + updateWrapperSize + }; + } + + function appendSlide(slides) { + const swiper = this; + const { + $wrapperEl, + params + } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + } else { + $wrapperEl.append(slides); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + } + + function prependSlide(slides) { + const swiper = this; + const { + params, + $wrapperEl, + activeIndex + } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + + let newActiveIndex = activeIndex + 1; + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.prepend(slides[i]); + } + + newActiveIndex = activeIndex + slides.length; + } else { + $wrapperEl.prepend(slides); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + swiper.slideTo(newActiveIndex, 0, false); + } + + function addSlide(index, slides) { + const swiper = this; + const { + $wrapperEl, + params, + activeIndex + } = swiper; + let activeIndexBuffer = activeIndex; + + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + + const baseLength = swiper.slides.length; + + if (index <= 0) { + swiper.prependSlide(slides); + return; + } + + if (index >= baseLength) { + swiper.appendSlide(slides); + return; + } + + let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer; + const slidesBuffer = []; + + for (let i = baseLength - 1; i >= index; i -= 1) { + const currentSlide = swiper.slides.eq(i); + currentSlide.remove(); + slidesBuffer.unshift(currentSlide); + } + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + + newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer; + } else { + $wrapperEl.append(slides); + } + + for (let i = 0; i < slidesBuffer.length; i += 1) { + $wrapperEl.append(slidesBuffer[i]); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } + } + + function removeSlide(slidesIndexes) { + const swiper = this; + const { + params, + $wrapperEl, + activeIndex + } = swiper; + let activeIndexBuffer = activeIndex; + + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + + let newActiveIndex = activeIndexBuffer; + let indexToRemove; + + if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) { + for (let i = 0; i < slidesIndexes.length; i += 1) { + indexToRemove = slidesIndexes[i]; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + } + + newActiveIndex = Math.max(newActiveIndex, 0); + } else { + indexToRemove = slidesIndexes; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + newActiveIndex = Math.max(newActiveIndex, 0); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } + } + + function removeAllSlides() { + const swiper = this; + const slidesIndexes = []; + + for (let i = 0; i < swiper.slides.length; i += 1) { + slidesIndexes.push(i); + } + + swiper.removeSlide(slidesIndexes); + } + + function Manipulation({ + swiper + }) { + Object.assign(swiper, { + appendSlide: appendSlide.bind(swiper), + prependSlide: prependSlide.bind(swiper), + addSlide: addSlide.bind(swiper), + removeSlide: removeSlide.bind(swiper), + removeAllSlides: removeAllSlides.bind(swiper) + }); + } + + function effectInit(params) { + const { + effect, + swiper, + on, + setTranslate, + setTransition, + overwriteParams, + perspective + } = params; + on('beforeInit', () => { + if (swiper.params.effect !== effect) return; + swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`); + + if (perspective && perspective()) { + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + } + + const overwriteParamsResult = overwriteParams ? overwriteParams() : {}; + Object.assign(swiper.params, overwriteParamsResult); + Object.assign(swiper.originalParams, overwriteParamsResult); + }); + on('setTranslate', () => { + if (swiper.params.effect !== effect) return; + setTranslate(); + }); + on('setTransition', (_s, duration) => { + if (swiper.params.effect !== effect) return; + setTransition(duration); + }); + } + + function effectTarget(effectParams, $slideEl) { + if (effectParams.transformEl) { + return $slideEl.find(effectParams.transformEl).css({ + 'backface-visibility': 'hidden', + '-webkit-backface-visibility': 'hidden' + }); + } + + return $slideEl; + } + + function effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides + }) { + const { + slides, + activeIndex, + $wrapperEl + } = swiper; + + if (swiper.params.virtualTranslate && duration !== 0) { + let eventTriggered = false; + let $transitionEndTarget; + + if (allSlides) { + $transitionEndTarget = transformEl ? slides.find(transformEl) : slides; + } else { + $transitionEndTarget = transformEl ? slides.eq(activeIndex).find(transformEl) : slides.eq(activeIndex); + } + + $transitionEndTarget.transitionEnd(() => { + if (eventTriggered) return; + if (!swiper || swiper.destroyed) return; + eventTriggered = true; + swiper.animating = false; + const triggerEvents = ['webkitTransitionEnd', 'transitionend']; + + for (let i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } + } + + function EffectFade({ + swiper, + extendParams, + on + }) { + extendParams({ + fadeEffect: { + crossFade: false, + transformEl: null + } + }); + + const setTranslate = () => { + const { + slides + } = swiper; + const params = swiper.params.fadeEffect; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = swiper.slides.eq(i); + const offset = $slideEl[0].swiperSlideOffset; + let tx = -offset; + if (!swiper.params.virtualTranslate) tx -= swiper.translate; + let ty = 0; + + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + } + + const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs($slideEl[0].progress), 0) : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0); + const $targetEl = effectTarget(params, $slideEl); + $targetEl.css({ + opacity: slideOpacity + }).transform(`translate3d(${tx}px, ${ty}px, 0px)`); + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.fadeEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides: true + }); + }; + + effectInit({ + effect: 'fade', + swiper, + on, + setTranslate, + setTransition, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: !swiper.params.cssMode + }) + }); + } + + function EffectCube({ + swiper, + extendParams, + on + }) { + extendParams({ + cubeEffect: { + slideShadows: true, + shadow: true, + shadowOffset: 20, + shadowScale: 0.94 + } + }); + + const setTranslate = () => { + const { + $el, + $wrapperEl, + slides, + width: swiperWidth, + height: swiperHeight, + rtlTranslate: rtl, + size: swiperSize, + browser + } = swiper; + const params = swiper.params.cubeEffect; + const isHorizontal = swiper.isHorizontal(); + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let wrapperRotate = 0; + let $cubeShadowEl; + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow'); + + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
'); + $wrapperEl.append($cubeShadowEl); + } + + $cubeShadowEl.css({ + height: `${swiperWidth}px` + }); + } else { + $cubeShadowEl = $el.find('.swiper-cube-shadow'); + + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
'); + $el.append($cubeShadowEl); + } + } + } + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let slideIndex = i; + + if (isVirtual) { + slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10); + } + + let slideAngle = slideIndex * 90; + let round = Math.floor(slideAngle / 360); + + if (rtl) { + slideAngle = -slideAngle; + round = Math.floor(-slideAngle / 360); + } + + const progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + let tx = 0; + let ty = 0; + let tz = 0; + + if (slideIndex % 4 === 0) { + tx = -round * 4 * swiperSize; + tz = 0; + } else if ((slideIndex - 1) % 4 === 0) { + tx = 0; + tz = -round * 4 * swiperSize; + } else if ((slideIndex - 2) % 4 === 0) { + tx = swiperSize + round * 4 * swiperSize; + tz = swiperSize; + } else if ((slideIndex - 3) % 4 === 0) { + tx = -swiperSize; + tz = 3 * swiperSize + swiperSize * 4 * round; + } + + if (rtl) { + tx = -tx; + } + + if (!isHorizontal) { + ty = tx; + tx = 0; + } + + const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${isHorizontal ? slideAngle : 0}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`; + + if (progress <= 1 && progress > -1) { + wrapperRotate = slideIndex * 90 + progress * 90; + if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90; + } + + $slideEl.transform(transform); + + if (params.slideShadows) { + // Set shadows + let shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + + if (shadowBefore.length === 0) { + shadowBefore = $(`
`); + $slideEl.append(shadowBefore); + } + + if (shadowAfter.length === 0) { + shadowAfter = $(`
`); + $slideEl.append(shadowAfter); + } + + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + } + + $wrapperEl.css({ + '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`, + 'transform-origin': `50% 50% -${swiperSize / 2}px` + }); + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl.transform(`translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`); + } else { + const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90; + const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2); + const scale1 = params.shadowScale; + const scale2 = params.shadowScale / multiplier; + const offset = params.shadowOffset; + $cubeShadowEl.transform(`scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-90deg)`); + } + } + + const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0; + $wrapperEl.transform(`translate3d(0px,0,${zFactor}px) rotateX(${swiper.isHorizontal() ? 0 : wrapperRotate}deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`); + }; + + const setTransition = duration => { + const { + $el, + slides + } = swiper; + slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + + if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) { + $el.find('.swiper-cube-shadow').transition(duration); + } + }; + + effectInit({ + effect: 'cube', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + resistanceRatio: 0, + spaceBetween: 0, + centeredSlides: false, + virtualTranslate: true + }) + }); + } + + function createShadow(params, $slideEl, side) { + const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`; + const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl; + let $shadowEl = $shadowContainer.children(`.${shadowClass}`); + + if (!$shadowEl.length) { + $shadowEl = $(`
`); + $shadowContainer.append($shadowEl); + } + + return $shadowEl; + } + + function EffectFlip({ + swiper, + extendParams, + on + }) { + extendParams({ + flipEffect: { + slideShadows: true, + limitRotation: true, + transformEl: null + } + }); + + const setTranslate = () => { + const { + slides, + rtlTranslate: rtl + } = swiper; + const params = swiper.params.flipEffect; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let progress = $slideEl[0].progress; + + if (swiper.params.flipEffect.limitRotation) { + progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + } + + const offset = $slideEl[0].swiperSlideOffset; + const rotate = -180 * progress; + let rotateY = rotate; + let rotateX = 0; + let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset; + let ty = 0; + + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + rotateX = -rotateY; + rotateY = 0; + } else if (rtl) { + rotateY = -rotateY; + } + + $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length; + + if (params.slideShadows) { + // Set shadows + let shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + + if (shadowBefore.length === 0) { + shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top'); + } + + if (shadowAfter.length === 0) { + shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom'); + } + + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + + const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform); + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.flipEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl + }); + }; + + effectInit({ + effect: 'flip', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: !swiper.params.cssMode + }) + }); + } + + function EffectCoverflow({ + swiper, + extendParams, + on + }) { + extendParams({ + coverflowEffect: { + rotate: 50, + stretch: 0, + depth: 100, + scale: 1, + modifier: 1, + slideShadows: true, + transformEl: null + } + }); + + const setTranslate = () => { + const { + width: swiperWidth, + height: swiperHeight, + slides, + slidesSizesGrid + } = swiper; + const params = swiper.params.coverflowEffect; + const isHorizontal = swiper.isHorizontal(); + const transform = swiper.translate; + const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2; + const rotate = isHorizontal ? params.rotate : -params.rotate; + const translate = params.depth; // Each slide offset from center + + for (let i = 0, length = slides.length; i < length; i += 1) { + const $slideEl = slides.eq(i); + const slideSize = slidesSizesGrid[i]; + const slideOffset = $slideEl[0].swiperSlideOffset; + const offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * params.modifier; + let rotateY = isHorizontal ? rotate * offsetMultiplier : 0; + let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; // var rotateZ = 0 + + let translateZ = -translate * Math.abs(offsetMultiplier); + let stretch = params.stretch; // Allow percentage to make a relative stretch for responsive sliders + + if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) { + stretch = parseFloat(params.stretch) / 100 * slideSize; + } + + let translateY = isHorizontal ? 0 : stretch * offsetMultiplier; + let translateX = isHorizontal ? stretch * offsetMultiplier : 0; + let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier); // Fix for ultra small values + + if (Math.abs(translateX) < 0.001) translateX = 0; + if (Math.abs(translateY) < 0.001) translateY = 0; + if (Math.abs(translateZ) < 0.001) translateZ = 0; + if (Math.abs(rotateY) < 0.001) rotateY = 0; + if (Math.abs(rotateX) < 0.001) rotateX = 0; + if (Math.abs(scale) < 0.001) scale = 0; + const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(slideTransform); + $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; + + if (params.slideShadows) { + // Set shadows + let $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + + if ($shadowBeforeEl.length === 0) { + $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top'); + } + + if ($shadowAfterEl.length === 0) { + $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom'); + } + + if ($shadowBeforeEl.length) $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; + if ($shadowAfterEl.length) $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0; + } + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.coverflowEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + }; + + effectInit({ + effect: 'coverflow', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + watchSlidesProgress: true + }) + }); + } + + function EffectCreative({ + swiper, + extendParams, + on + }) { + extendParams({ + creativeEffect: { + transformEl: null, + limitProgress: 1, + shadowPerProgress: false, + progressMultiplier: 1, + perspective: true, + prev: { + translate: [0, 0, 0], + rotate: [0, 0, 0], + opacity: 1, + scale: 1 + }, + next: { + translate: [0, 0, 0], + rotate: [0, 0, 0], + opacity: 1, + scale: 1 + } + } + }); + + const getTranslateValue = value => { + if (typeof value === 'string') return value; + return `${value}px`; + }; + + const setTranslate = () => { + const { + slides, + $wrapperEl, + slidesSizesGrid + } = swiper; + const params = swiper.params.creativeEffect; + const { + progressMultiplier: multiplier + } = params; + const isCenteredSlides = swiper.params.centeredSlides; + + if (isCenteredSlides) { + const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0; + $wrapperEl.transform(`translateX(calc(50% - ${margin}px))`); + } + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + const slideProgress = $slideEl[0].progress; + const progress = Math.min(Math.max($slideEl[0].progress, -params.limitProgress), params.limitProgress); + let originalProgress = progress; + + if (!isCenteredSlides) { + originalProgress = Math.min(Math.max($slideEl[0].originalProgress, -params.limitProgress), params.limitProgress); + } + + const offset = $slideEl[0].swiperSlideOffset; + const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0]; + const r = [0, 0, 0]; + let custom = false; + + if (!swiper.isHorizontal()) { + t[1] = t[0]; + t[0] = 0; + } + + let data = { + translate: [0, 0, 0], + rotate: [0, 0, 0], + scale: 1, + opacity: 1 + }; + + if (progress < 0) { + data = params.next; + custom = true; + } else if (progress > 0) { + data = params.prev; + custom = true; + } // set translate + + + t.forEach((value, index) => { + t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`; + }); // set rotates + + r.forEach((value, index) => { + r[index] = data.rotate[index] * Math.abs(progress * multiplier); + }); + $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length; + const translateString = t.join(', '); + const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`; + const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`; + const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier; + const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`; // Set shadows + + if (custom && data.shadow || !custom) { + let $shadowEl = $slideEl.children('.swiper-slide-shadow'); + + if ($shadowEl.length === 0 && data.shadow) { + $shadowEl = createShadow(params, $slideEl); + } + + if ($shadowEl.length) { + const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress; + $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1); + } + } + + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform).css({ + opacity: opacityString + }); + + if (data.origin) { + $targetEl.css('transform-origin', data.origin); + } + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.creativeEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides: true + }); + }; + + effectInit({ + effect: 'creative', + swiper, + on, + setTranslate, + setTransition, + perspective: () => swiper.params.creativeEffect.perspective, + overwriteParams: () => ({ + watchSlidesProgress: true, + virtualTranslate: !swiper.params.cssMode + }) + }); + } + + function EffectCards({ + swiper, + extendParams, + on + }) { + extendParams({ + cardsEffect: { + slideShadows: true, + transformEl: null + } + }); + + const setTranslate = () => { + const { + slides, + activeIndex + } = swiper; + const params = swiper.params.cardsEffect; + const { + startTranslate, + isTouched + } = swiper.touchEventsData; + const currentTranslate = swiper.translate; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + const slideProgress = $slideEl[0].progress; + const progress = Math.min(Math.max(slideProgress, -4), 4); + let offset = $slideEl[0].swiperSlideOffset; + + if (swiper.params.centeredSlides && !swiper.params.cssMode) { + swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`); + } + + if (swiper.params.centeredSlides && swiper.params.cssMode) { + offset -= slides[0].swiperSlideOffset; + } + + let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset; + let tY = 0; + const tZ = -100 * Math.abs(progress); + let scale = 1; + let rotate = -2 * progress; + let tXAdd = 8 - Math.abs(progress) * 0.75; + const isSwipeToNext = (i === activeIndex || i === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate; + const isSwipeToPrev = (i === activeIndex || i === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate; + + if (isSwipeToNext || isSwipeToPrev) { + const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5; + rotate += -28 * progress * subProgress; + scale += -0.5 * subProgress; + tXAdd += 96 * subProgress; + tY = `${-25 * subProgress * Math.abs(progress)}%`; + } + + if (progress < 0) { + // next + tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`; + } else if (progress > 0) { + // prev + tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`; + } else { + tX = `${tX}px`; + } + + if (!swiper.isHorizontal()) { + const prevY = tY; + tY = tX; + tX = prevY; + } + + const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`; + const transform = ` + translate3d(${tX}, ${tY}, ${tZ}px) + rotateZ(${rotate}deg) + scale(${scaleString}) + `; + + if (params.slideShadows) { + // Set shadows + let $shadowEl = $slideEl.find('.swiper-slide-shadow'); + + if ($shadowEl.length === 0) { + $shadowEl = createShadow(params, $slideEl); + } + + if ($shadowEl.length) $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1); + } + + $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform); + } + }; + + const setTransition = duration => { + const { + transformEl + } = swiper.params.cardsEffect; + const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides; + $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl + }); + }; + + effectInit({ + effect: 'cards', + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + watchSlidesProgress: true, + virtualTranslate: !swiper.params.cssMode + }) + }); + } + + // Swiper Class + const modules = [Virtual, Keyboard, Mousewheel, Navigation, Pagination, Scrollbar, Parallax, Zoom, Lazy, Controller, A11y, History, HashNavigation, Autoplay, Thumb, freeMode, Grid, Manipulation, EffectFade, EffectCube, EffectFlip, EffectCoverflow, EffectCreative, EffectCards]; + Swiper.use(modules); + + return Swiper; + +}))); +//# sourceMappingURL=swiper-bundle.js.map diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.js.map b/src/main/resources/static/assets/js/swiper/swiper-bundle.js.map new file mode 100644 index 0000000..a334e41 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swiper-bundle.js.map","sources":["../node_modules/ssr-window/ssr-window.esm.js","../node_modules/dom7/dom7.esm.js","../src/shared/dom.js","../src/shared/utils.js","../src/shared/get-support.js","../src/shared/get-device.js","../src/shared/get-browser.js","../src/core/modules/resize/resize.js","../src/core/modules/observer/observer.js","../src/core/events-emitter.js","../src/core/update/updateSize.js","../src/core/update/updateSlides.js","../src/core/update/updateAutoHeight.js","../src/core/update/updateSlidesOffset.js","../src/core/update/updateSlidesProgress.js","../src/core/update/updateProgress.js","../src/core/update/updateSlidesClasses.js","../src/core/update/updateActiveIndex.js","../src/core/update/updateClickedSlide.js","../src/core/update/index.js","../src/core/translate/getTranslate.js","../src/core/translate/setTranslate.js","../src/core/translate/minTranslate.js","../src/core/translate/maxTranslate.js","../src/core/translate/translateTo.js","../src/core/translate/index.js","../src/core/transition/setTransition.js","../src/core/transition/transitionEmit.js","../src/core/transition/transitionStart.js","../src/core/transition/transitionEnd.js","../src/core/transition/index.js","../src/core/slide/slideTo.js","../src/core/slide/slideToLoop.js","../src/core/slide/slideNext.js","../src/core/slide/slidePrev.js","../src/core/slide/slideReset.js","../src/core/slide/slideToClosest.js","../src/core/slide/slideToClickedSlide.js","../src/core/slide/index.js","../src/core/loop/loopCreate.js","../src/core/loop/loopFix.js","../src/core/loop/loopDestroy.js","../src/core/loop/index.js","../src/core/grab-cursor/setGrabCursor.js","../src/core/grab-cursor/unsetGrabCursor.js","../src/core/grab-cursor/index.js","../src/core/events/onTouchStart.js","../src/core/events/onTouchMove.js","../src/core/events/onTouchEnd.js","../src/core/events/onResize.js","../src/core/events/onClick.js","../src/core/events/onScroll.js","../src/core/events/index.js","../src/core/breakpoints/setBreakpoint.js","../src/core/breakpoints/getBreakpoint.js","../src/core/breakpoints/index.js","../src/core/classes/addClasses.js","../src/core/classes/removeClasses.js","../src/core/classes/index.js","../src/core/images/loadImage.js","../src/core/images/preloadImages.js","../src/core/images/index.js","../src/core/check-overflow/index.js","../src/core/defaults.js","../src/core/moduleExtendParams.js","../src/core/core.js","../src/modules/virtual/virtual.js","../src/modules/keyboard/keyboard.js","../src/modules/mousewheel/mousewheel.js","../src/shared/create-element-if-not-defined.js","../src/modules/navigation/navigation.js","../src/shared/classes-to-selector.js","../src/modules/pagination/pagination.js","../src/modules/scrollbar/scrollbar.js","../src/modules/parallax/parallax.js","../src/modules/zoom/zoom.js","../src/modules/lazy/lazy.js","../src/modules/controller/controller.js","../src/modules/a11y/a11y.js","../src/modules/history/history.js","../src/modules/hash-navigation/hash-navigation.js","../src/modules/autoplay/autoplay.js","../src/modules/thumbs/thumbs.js","../src/modules/free-mode/free-mode.js","../src/modules/grid/grid.js","../src/modules/manipulation/methods/appendSlide.js","../src/modules/manipulation/methods/prependSlide.js","../src/modules/manipulation/methods/addSlide.js","../src/modules/manipulation/methods/removeSlide.js","../src/modules/manipulation/methods/removeAllSlides.js","../src/modules/manipulation/manipulation.js","../src/shared/effect-init.js","../src/shared/effect-target.js","../src/shared/effect-virtual-transition-end.js","../src/modules/effect-fade/effect-fade.js","../src/modules/effect-cube/effect-cube.js","../src/shared/create-shadow.js","../src/modules/effect-flip/effect-flip.js","../src/modules/effect-coverflow/effect-coverflow.js","../src/modules/effect-creative/effect-creative.js","../src/modules/effect-cards/effect-cards.js","../src/swiper.js"],"sourcesContent":["/**\n * SSR Window 4.0.1\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n return (obj !== null &&\n typeof obj === 'object' &&\n 'constructor' in obj &&\n obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n Object.keys(src).forEach((key) => {\n if (typeof target[key] === 'undefined')\n target[key] = src[key];\n else if (isObject(src[key]) &&\n isObject(target[key]) &&\n Object.keys(src[key]).length > 0) {\n extend(target[key], src[key]);\n }\n });\n}\n\nconst ssrDocument = {\n body: {},\n addEventListener() { },\n removeEventListener() { },\n activeElement: {\n blur() { },\n nodeName: '',\n },\n querySelector() {\n return null;\n },\n querySelectorAll() {\n return [];\n },\n getElementById() {\n return null;\n },\n createEvent() {\n return {\n initEvent() { },\n };\n },\n createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute() { },\n getElementsByTagName() {\n return [];\n },\n };\n },\n createElementNS() {\n return {};\n },\n importNode() {\n return null;\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n};\nfunction getDocument() {\n const doc = typeof document !== 'undefined' ? document : {};\n extend(doc, ssrDocument);\n return doc;\n}\n\nconst ssrWindow = {\n document: ssrDocument,\n navigator: {\n userAgent: '',\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n history: {\n replaceState() { },\n pushState() { },\n go() { },\n back() { },\n },\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener() { },\n removeEventListener() { },\n getComputedStyle() {\n return {\n getPropertyValue() {\n return '';\n },\n };\n },\n Image() { },\n Date() { },\n screen: {},\n setTimeout() { },\n clearTimeout() { },\n matchMedia() {\n return {};\n },\n requestAnimationFrame(callback) {\n if (typeof setTimeout === 'undefined') {\n callback();\n return null;\n }\n return setTimeout(callback, 0);\n },\n cancelAnimationFrame(id) {\n if (typeof setTimeout === 'undefined') {\n return;\n }\n clearTimeout(id);\n },\n};\nfunction getWindow() {\n const win = typeof window !== 'undefined' ? window : {};\n extend(win, ssrWindow);\n return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.1\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n const proto = obj.__proto__;\n Object.defineProperty(obj, '__proto__', {\n get() {\n return proto;\n },\n\n set(value) {\n proto.__proto__ = value;\n }\n\n });\n}\n\nclass Dom7 extends Array {\n constructor(items) {\n super(...(items || []));\n makeReactive(this);\n }\n\n}\n\nfunction arrayFlat(arr = []) {\n const res = [];\n arr.forEach(el => {\n if (Array.isArray(el)) {\n res.push(...arrayFlat(el));\n } else {\n res.push(el);\n }\n });\n return res;\n}\nfunction arrayFilter(arr, callback) {\n return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n const uniqueArray = [];\n\n for (let i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n }\n\n return uniqueArray;\n}\nfunction toCamelCase(string) {\n return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n if (typeof selector !== 'string') {\n return [selector];\n }\n\n const a = [];\n const res = context.querySelectorAll(selector);\n\n for (let i = 0; i < res.length; i += 1) {\n a.push(res[i]);\n }\n\n return a;\n}\n\nfunction $(selector, context) {\n const window = getWindow();\n const document = getDocument();\n let arr = [];\n\n if (!context && selector instanceof Dom7) {\n return selector;\n }\n\n if (!selector) {\n return new Dom7(arr);\n }\n\n if (typeof selector === 'string') {\n const html = selector.trim();\n\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n let toCreate = 'div';\n if (html.indexOf(' c.split(' ')));\n this.forEach(el => {\n el.classList.add(...classNames);\n });\n return this;\n}\n\nfunction removeClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n el.classList.remove(...classNames);\n });\n return this;\n}\n\nfunction toggleClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n classNames.forEach(className => {\n el.classList.toggle(className);\n });\n });\n}\n\nfunction hasClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n return arrayFilter(this, el => {\n return classNames.filter(className => el.classList.contains(className)).length > 0;\n }).length > 0;\n}\n\nfunction attr(attrs, value) {\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) return this[0].getAttribute(attrs);\n return undefined;\n } // Set attrs\n\n\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n for (const attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n\n return this;\n}\n\nfunction removeAttr(attr) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n\n return this;\n}\n\nfunction prop(props, value) {\n if (arguments.length === 1 && typeof props === 'string') {\n // Get prop\n if (this[0]) return this[0][props];\n } else {\n // Set props\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i][props] = value;\n } else {\n // Object\n for (const propName in props) {\n this[i][propName] = props[propName];\n }\n }\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction data(key, value) {\n let el;\n\n if (typeof value === 'undefined') {\n el = this[0];\n if (!el) return undefined; // Get value\n\n if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n return el.dom7ElementDataStorage[key];\n }\n\n const dataKey = el.getAttribute(`data-${key}`);\n\n if (dataKey) {\n return dataKey;\n }\n\n return undefined;\n } // Set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n el.dom7ElementDataStorage[key] = value;\n }\n\n return this;\n}\n\nfunction removeData(key) {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n el.dom7ElementDataStorage[key] = null;\n delete el.dom7ElementDataStorage[key];\n }\n }\n}\n\nfunction dataset() {\n const el = this[0];\n if (!el) return undefined;\n const dataset = {}; // eslint-disable-line\n\n if (el.dataset) {\n for (const dataKey in el.dataset) {\n dataset[dataKey] = el.dataset[dataKey];\n }\n } else {\n for (let i = 0; i < el.attributes.length; i += 1) {\n const attr = el.attributes[i];\n\n if (attr.name.indexOf('data-') >= 0) {\n dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n }\n }\n }\n\n for (const key in dataset) {\n if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n }\n\n return dataset;\n}\n\nfunction val(value) {\n if (typeof value === 'undefined') {\n // get value\n const el = this[0];\n if (!el) return undefined;\n\n if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n const values = [];\n\n for (let i = 0; i < el.selectedOptions.length; i += 1) {\n values.push(el.selectedOptions[i].value);\n }\n\n return values;\n }\n\n return el.value;\n } // set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n for (let j = 0; j < el.options.length; j += 1) {\n el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n }\n } else {\n el.value = value;\n }\n }\n\n return this;\n}\n\nfunction value(value) {\n return this.val(value);\n}\n\nfunction transform(transform) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transform = transform;\n }\n\n return this;\n}\n\nfunction transition(duration) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n }\n\n return this;\n}\n\nfunction on(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n\n function handleLiveEvent(e) {\n const target = e.target;\n if (!target) return;\n const eventData = e.target.dom7EventData || [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n const parents = $(target).parents(); // eslint-disable-line\n\n for (let k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n }\n }\n }\n\n function handleEvent(e) {\n const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n listener.apply(this, eventData);\n }\n\n const events = eventType.split(' ');\n let j;\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7Listeners) el.dom7Listeners = {};\n if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n el.dom7Listeners[event].push({\n listener,\n proxyListener: handleEvent\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n el.dom7LiveListeners[event].push({\n listener,\n proxyListener: handleLiveEvent\n });\n el.addEventListener(event, handleLiveEvent, capture);\n }\n }\n }\n\n return this;\n}\n\nfunction off(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n const events = eventType.split(' ');\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n let handlers;\n\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n\n if (handlers && handlers.length) {\n for (let k = handlers.length - 1; k >= 0; k -= 1) {\n const handler = handlers[k];\n\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n\n return this;\n}\n\nfunction once(...args) {\n const dom = this;\n let [eventName, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventName, listener, capture] = args;\n targetSelector = undefined;\n }\n\n function onceHandler(...eventArgs) {\n listener.apply(this, eventArgs);\n dom.off(eventName, targetSelector, onceHandler, capture);\n\n if (onceHandler.dom7proxy) {\n delete onceHandler.dom7proxy;\n }\n }\n\n onceHandler.dom7proxy = listener;\n return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n const window = getWindow();\n const events = args[0].split(' ');\n const eventData = args[1];\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n\n if (window.CustomEvent) {\n const evt = new window.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true\n });\n el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n }\n\n return this;\n}\n\nfunction transitionEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('transitionend', fireCallBack);\n }\n\n if (callback) {\n dom.on('transitionend', fireCallBack);\n }\n\n return this;\n}\n\nfunction animationEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('animationend', fireCallBack);\n }\n\n if (callback) {\n dom.on('animationend', fireCallBack);\n }\n\n return this;\n}\n\nfunction width() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerWidth;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('width'));\n }\n\n return null;\n}\n\nfunction outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n }\n\n return this[0].offsetWidth;\n }\n\n return null;\n}\n\nfunction height() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerHeight;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('height'));\n }\n\n return null;\n}\n\nfunction outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n }\n\n return this[0].offsetHeight;\n }\n\n return null;\n}\n\nfunction offset() {\n if (this.length > 0) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n const box = el.getBoundingClientRect();\n const body = document.body;\n const clientTop = el.clientTop || body.clientTop || 0;\n const clientLeft = el.clientLeft || body.clientLeft || 0;\n const scrollTop = el === window ? window.scrollY : el.scrollTop;\n const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n return {\n top: box.top + scrollTop - clientTop,\n left: box.left + scrollLeft - clientLeft\n };\n }\n\n return null;\n}\n\nfunction hide() {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.display = 'none';\n }\n\n return this;\n}\n\nfunction show() {\n const window = getWindow();\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.style.display === 'none') {\n el.style.display = '';\n }\n\n if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n // Still not visible\n el.style.display = 'block';\n }\n }\n\n return this;\n}\n\nfunction styles() {\n const window = getWindow();\n if (this[0]) return window.getComputedStyle(this[0], null);\n return {};\n}\n\nfunction css(props, value) {\n const window = getWindow();\n let i;\n\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n // .css('width')\n if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n } else {\n // .css({ width: '100px' })\n for (i = 0; i < this.length; i += 1) {\n for (const prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n\n return this;\n }\n }\n\n if (arguments.length === 2 && typeof props === 'string') {\n // .css('width', '100px')\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction each(callback) {\n if (!callback) return this;\n this.forEach((el, index) => {\n callback.apply(el, [el, index]);\n });\n return this;\n}\n\nfunction filter(callback) {\n const result = arrayFilter(this, callback);\n return $(result);\n}\n\nfunction html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n\n return this;\n}\n\nfunction text(text) {\n if (typeof text === 'undefined') {\n return this[0] ? this[0].textContent.trim() : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n\n return this;\n}\n\nfunction is(selector) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n let compareWith;\n let i;\n if (!el || typeof selector === 'undefined') return false;\n\n if (typeof selector === 'string') {\n if (el.matches) return el.matches(selector);\n if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n compareWith = $(selector);\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n if (selector === document) {\n return el === document;\n }\n\n if (selector === window) {\n return el === window;\n }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n return false;\n}\n\nfunction index() {\n let child = this[0];\n let i;\n\n if (child) {\n i = 0; // eslint-disable-next-line\n\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) i += 1;\n }\n\n return i;\n }\n\n return undefined;\n}\n\nfunction eq(index) {\n if (typeof index === 'undefined') return this;\n const length = this.length;\n\n if (index > length - 1) {\n return $([]);\n }\n\n if (index < 0) {\n const returnIndex = length + index;\n if (returnIndex < 0) return $([]);\n return $([this[returnIndex]]);\n }\n\n return $([this[index]]);\n}\n\nfunction append(...els) {\n let newChild;\n const document = getDocument();\n\n for (let k = 0; k < els.length; k += 1) {\n newChild = els[k];\n\n for (let i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (let j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n}\n\nfunction appendTo(parent) {\n $(parent).append(this);\n return this;\n}\n\nfunction prepend(newChild) {\n const document = getDocument();\n let i;\n let j;\n\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n\n return this;\n}\n\nfunction prependTo(parent) {\n $(parent).prepend(this);\n return this;\n}\n\nfunction insertBefore(selector) {\n const before = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (before.length === 1) {\n before[0].parentNode.insertBefore(this[i], before[0]);\n } else if (before.length > 1) {\n for (let j = 0; j < before.length; j += 1) {\n before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n }\n }\n }\n}\n\nfunction insertAfter(selector) {\n const after = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (after.length === 1) {\n after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n } else if (after.length > 1) {\n for (let j = 0; j < after.length; j += 1) {\n after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n }\n }\n }\n}\n\nfunction next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n return $([this[0].nextElementSibling]);\n }\n\n return $([]);\n }\n\n if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction nextAll(selector) {\n const nextEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.nextElementSibling) {\n const next = el.nextElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(next).is(selector)) nextEls.push(next);\n } else nextEls.push(next);\n\n el = next;\n }\n\n return $(nextEls);\n}\n\nfunction prev(selector) {\n if (this.length > 0) {\n const el = this[0];\n\n if (selector) {\n if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n return $([el.previousElementSibling]);\n }\n\n return $([]);\n }\n\n if (el.previousElementSibling) return $([el.previousElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction prevAll(selector) {\n const prevEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.previousElementSibling) {\n const prev = el.previousElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(prev).is(selector)) prevEls.push(prev);\n } else prevEls.push(prev);\n\n el = prev;\n }\n\n return $(prevEls);\n}\n\nfunction siblings(selector) {\n return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n\n return $(parents);\n}\n\nfunction parents(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n let parent = this[i].parentNode; // eslint-disable-line\n\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) parents.push(parent);\n } else {\n parents.push(parent);\n }\n\n parent = parent.parentNode;\n }\n }\n\n return $(parents);\n}\n\nfunction closest(selector) {\n let closest = this; // eslint-disable-line\n\n if (typeof selector === 'undefined') {\n return $([]);\n }\n\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n\n return closest;\n}\n\nfunction find(selector) {\n const foundElements = [];\n\n for (let i = 0; i < this.length; i += 1) {\n const found = this[i].querySelectorAll(selector);\n\n for (let j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n\n return $(foundElements);\n}\n\nfunction children(selector) {\n const children = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n const childNodes = this[i].children;\n\n for (let j = 0; j < childNodes.length; j += 1) {\n if (!selector || $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n\n return $(children);\n}\n\nfunction remove() {\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n }\n\n return this;\n}\n\nfunction detach() {\n return this.remove();\n}\n\nfunction add(...els) {\n const dom = this;\n let i;\n let j;\n\n for (i = 0; i < els.length; i += 1) {\n const toAdd = $(els[i]);\n\n for (j = 0; j < toAdd.length; j += 1) {\n dom.push(toAdd[j]);\n }\n }\n\n return dom;\n}\n\nfunction empty() {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.nodeType === 1) {\n for (let j = 0; j < el.childNodes.length; j += 1) {\n if (el.childNodes[j].parentNode) {\n el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n }\n }\n\n el.textContent = '';\n }\n }\n\n return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n const window = getWindow();\n let [left, top, duration, easing, callback] = args;\n\n if (args.length === 4 && typeof easing === 'function') {\n callback = easing;\n [left, top, duration, callback, easing] = args;\n }\n\n if (typeof easing === 'undefined') easing = 'swing';\n return this.each(function animate() {\n const el = this;\n let currentTop;\n let currentLeft;\n let maxTop;\n let maxLeft;\n let newTop;\n let newLeft;\n let scrollTop; // eslint-disable-line\n\n let scrollLeft; // eslint-disable-line\n\n let animateTop = top > 0 || top === 0;\n let animateLeft = left > 0 || left === 0;\n\n if (typeof easing === 'undefined') {\n easing = 'swing';\n }\n\n if (animateTop) {\n currentTop = el.scrollTop;\n\n if (!duration) {\n el.scrollTop = top;\n }\n }\n\n if (animateLeft) {\n currentLeft = el.scrollLeft;\n\n if (!duration) {\n el.scrollLeft = left;\n }\n }\n\n if (!duration) return;\n\n if (animateTop) {\n maxTop = el.scrollHeight - el.offsetHeight;\n newTop = Math.max(Math.min(top, maxTop), 0);\n }\n\n if (animateLeft) {\n maxLeft = el.scrollWidth - el.offsetWidth;\n newLeft = Math.max(Math.min(left, maxLeft), 0);\n }\n\n let startTime = null;\n if (animateTop && newTop === currentTop) animateTop = false;\n if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n function render(time = new Date().getTime()) {\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n let done;\n if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (done) {\n if (callback) callback();\n return;\n }\n\n if (animateTop) el.scrollTop = scrollTop;\n if (animateLeft) el.scrollLeft = scrollLeft;\n window.requestAnimationFrame(render);\n }\n\n window.requestAnimationFrame(render);\n });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n let [top, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [top, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof top === 'undefined') {\n if (dom.length > 0) return dom[0].scrollTop;\n return null;\n }\n\n return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n let [left, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [left, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof left === 'undefined') {\n if (dom.length > 0) return dom[0].scrollLeft;\n return null;\n }\n\n return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n const window = getWindow();\n const els = this;\n const a = {\n props: Object.assign({}, initialProps),\n params: Object.assign({\n duration: 300,\n easing: 'swing' // or 'linear'\n\n /* Callbacks\n begin(elements)\n complete(elements)\n progress(elements, complete, remaining, start, tweenValue)\n */\n\n }, initialParams),\n elements: els,\n animating: false,\n que: [],\n\n easingProgress(easing, progress) {\n if (easing === 'swing') {\n return 0.5 - Math.cos(progress * Math.PI) / 2;\n }\n\n if (typeof easing === 'function') {\n return easing(progress);\n }\n\n return progress;\n },\n\n stop() {\n if (a.frameId) {\n window.cancelAnimationFrame(a.frameId);\n }\n\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n a.que = [];\n },\n\n done(complete) {\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n if (complete) complete(els);\n\n if (a.que.length > 0) {\n const que = a.que.shift();\n a.animate(que[0], que[1]);\n }\n },\n\n animate(props, params) {\n if (a.animating) {\n a.que.push([props, params]);\n return a;\n }\n\n const elements = []; // Define & Cache Initials & Units\n\n a.elements.each((el, index) => {\n let initialFullValue;\n let initialValue;\n let unit;\n let finalValue;\n let finalFullValue;\n if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n elements[index] = {\n container: el\n };\n Object.keys(props).forEach(prop => {\n initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n initialValue = parseFloat(initialFullValue);\n unit = initialFullValue.replace(initialValue, '');\n finalValue = parseFloat(props[prop]);\n finalFullValue = props[prop] + unit;\n elements[index][prop] = {\n initialFullValue,\n initialValue,\n unit,\n finalValue,\n finalFullValue,\n currentValue: initialValue\n };\n });\n });\n let startTime = null;\n let time;\n let elementsDone = 0;\n let propsDone = 0;\n let done;\n let began = false;\n a.animating = true;\n\n function render() {\n time = new Date().getTime();\n let progress;\n let easeProgress; // let el;\n\n if (!began) {\n began = true;\n if (params.begin) params.begin(els);\n }\n\n if (startTime === null) {\n startTime = time;\n }\n\n if (params.progress) {\n // eslint-disable-next-line\n params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n }\n\n elements.forEach(element => {\n const el = element;\n if (done || el.done) return;\n Object.keys(props).forEach(prop => {\n if (done || el.done) return;\n progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n easeProgress = a.easingProgress(params.easing, progress);\n const {\n initialValue,\n finalValue,\n unit\n } = el[prop];\n el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n const currentValue = el[prop].currentValue;\n\n if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n el.container.style[prop] = finalValue + unit;\n propsDone += 1;\n\n if (propsDone === Object.keys(props).length) {\n el.done = true;\n elementsDone += 1;\n }\n\n if (elementsDone === elements.length) {\n done = true;\n }\n }\n\n if (done) {\n a.done(params.complete);\n return;\n }\n\n el.container.style[prop] = currentValue + unit;\n });\n });\n if (done) return; // Then call\n\n a.frameId = window.requestAnimationFrame(render);\n }\n\n a.frameId = window.requestAnimationFrame(render);\n return a;\n }\n\n };\n\n if (a.elements.length === 0) {\n return els;\n }\n\n let animateInstance;\n\n for (let i = 0; i < a.elements.length; i += 1) {\n if (a.elements[i].dom7AnimateInstance) {\n animateInstance = a.elements[i].dom7AnimateInstance;\n } else a.elements[i].dom7AnimateInstance = a;\n }\n\n if (!animateInstance) {\n animateInstance = a;\n }\n\n if (initialProps === 'stop') {\n animateInstance.stop();\n } else {\n animateInstance.animate(a.props, a.params);\n }\n\n return els;\n}\n\nfunction stop() {\n const els = this;\n\n for (let i = 0; i < els.length; i += 1) {\n if (els[i].dom7AnimateInstance) {\n els[i].dom7AnimateInstance.stop();\n }\n }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n function eventHandler(...args) {\n if (typeof args[0] === 'undefined') {\n for (let i = 0; i < this.length; i += 1) {\n if (noTrigger.indexOf(name) < 0) {\n if (name in this[i]) this[i][name]();else {\n $(this[i]).trigger(name);\n }\n }\n }\n\n return this;\n }\n\n return this.on(name, ...args);\n }\n\n return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import {\n $,\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n} from 'dom7';\n\nconst Methods = {\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n};\n\nObject.keys(Methods).forEach((methodName) => {\n Object.defineProperty($.fn, methodName, { value: Methods[methodName], writable: true });\n});\n\nexport default $;\n","import { getWindow } from 'ssr-window';\n\nfunction deleteProps(obj) {\n const object = obj;\n Object.keys(object).forEach((key) => {\n try {\n object[key] = null;\n } catch (e) {\n // no getter for object\n }\n try {\n delete object[key];\n } catch (e) {\n // something got wrong\n }\n });\n}\nfunction nextTick(callback, delay = 0) {\n return setTimeout(callback, delay);\n}\nfunction now() {\n return Date.now();\n}\nfunction getComputedStyle(el) {\n const window = getWindow();\n let style;\n if (window.getComputedStyle) {\n style = window.getComputedStyle(el, null);\n }\n if (!style && el.currentStyle) {\n style = el.currentStyle;\n }\n if (!style) {\n style = el.style;\n }\n\n return style;\n}\nfunction getTranslate(el, axis = 'x') {\n const window = getWindow();\n let matrix;\n let curTransform;\n let transformMatrix;\n\n const curStyle = getComputedStyle(el, null);\n\n if (window.WebKitCSSMatrix) {\n curTransform = curStyle.transform || curStyle.webkitTransform;\n if (curTransform.split(',').length > 6) {\n curTransform = curTransform\n .split(', ')\n .map((a) => a.replace(',', '.'))\n .join(', ');\n }\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n } else {\n transformMatrix =\n curStyle.MozTransform ||\n curStyle.OTransform ||\n curStyle.MsTransform ||\n curStyle.msTransform ||\n curStyle.transform ||\n curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n\n if (axis === 'x') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[4]);\n }\n if (axis === 'y') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[5]);\n }\n return curTransform || 0;\n}\nfunction isObject(o) {\n return (\n typeof o === 'object' &&\n o !== null &&\n o.constructor &&\n Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n );\n}\nfunction isNode(node) {\n // eslint-disable-next-line\n if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n return node instanceof HTMLElement;\n }\n return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend(...args) {\n const to = Object(args[0]);\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n for (let i = 1; i < args.length; i += 1) {\n const nextSource = args[i];\n if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0);\n for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n const nextKey = keysArray[nextIndex];\n const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({ swiper, targetPosition, side }) {\n const window = getWindow();\n const startPosition = -swiper.translate;\n let startTime = null;\n let time;\n const duration = swiper.params.speed;\n\n swiper.wrapperEl.style.scrollSnapType = 'none';\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n\n const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n const isOutOfBound = (current, target) => {\n return (dir === 'next' && current >= target) || (dir === 'prev' && current <= target);\n };\n\n const animate = () => {\n time = new Date().getTime();\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n if (isOutOfBound(currentPosition, targetPosition)) {\n currentPosition = targetPosition;\n }\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n if (isOutOfBound(currentPosition, targetPosition)) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.scrollSnapType = '';\n setTimeout(() => {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n });\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n return;\n }\n swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n };\n animate();\n}\n\nexport {\n animateCSSModeScroll,\n deleteProps,\n nextTick,\n now,\n getTranslate,\n isObject,\n extend,\n getComputedStyle,\n setCSSProperty,\n};\n","import { getWindow, getDocument } from 'ssr-window';\n\nlet support;\n\nfunction calcSupport() {\n const window = getWindow();\n const document = getDocument();\n\n return {\n smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n\n touch: !!(\n 'ontouchstart' in window ||\n (window.DocumentTouch && document instanceof window.DocumentTouch)\n ),\n\n passiveListener: (function checkPassiveListener() {\n let supportsPassive = false;\n try {\n const opts = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line\n get() {\n supportsPassive = true;\n },\n });\n window.addEventListener('testPassiveListener', null, opts);\n } catch (e) {\n // No support\n }\n return supportsPassive;\n })(),\n\n gestures: (function checkGestures() {\n return 'ongesturestart' in window;\n })(),\n };\n}\n\nfunction getSupport() {\n if (!support) {\n support = calcSupport();\n }\n return support;\n}\n\nexport { getSupport };\n","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\n\nlet deviceCached;\n\nfunction calcDevice({ userAgent } = {}) {\n const support = getSupport();\n const window = getWindow();\n const platform = window.navigator.platform;\n const ua = userAgent || window.navigator.userAgent;\n\n const device = {\n ios: false,\n android: false,\n };\n\n const screenWidth = window.screen.width;\n const screenHeight = window.screen.height;\n\n const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n const windows = platform === 'Win32';\n let macos = platform === 'MacIntel';\n\n // iPadOs 13 fix\n const iPadScreens = [\n '1024x1366',\n '1366x1024',\n '834x1194',\n '1194x834',\n '834x1112',\n '1112x834',\n '768x1024',\n '1024x768',\n '820x1180',\n '1180x820',\n '810x1080',\n '1080x810',\n ];\n if (\n !ipad &&\n macos &&\n support.touch &&\n iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0\n ) {\n ipad = ua.match(/(Version)\\/([\\d.]+)/);\n if (!ipad) ipad = [0, 1, '13_0_0'];\n macos = false;\n }\n\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.android = true;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n\n // Export object\n return device;\n}\n\nfunction getDevice(overrides = {}) {\n if (!deviceCached) {\n deviceCached = calcDevice(overrides);\n }\n return deviceCached;\n}\n\nexport { getDevice };\n","import { getWindow } from 'ssr-window';\n\nlet browser;\n\nfunction calcBrowser() {\n const window = getWindow();\n function isSafari() {\n const ua = window.navigator.userAgent.toLowerCase();\n return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n }\n return {\n isSafari: isSafari(),\n isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),\n };\n}\n\nfunction getBrowser() {\n if (!browser) {\n browser = calcBrowser();\n }\n return browser;\n}\n\nexport { getBrowser };\n","import { getWindow } from 'ssr-window';\n\nexport default function Resize({ swiper, on, emit }) {\n const window = getWindow();\n let observer = null;\n\n const resizeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('beforeResize');\n emit('resize');\n };\n\n const createObserver = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n observer = new ResizeObserver((entries) => {\n const { width, height } = swiper;\n let newWidth = width;\n let newHeight = height;\n entries.forEach(({ contentBoxSize, contentRect, target }) => {\n if (target && target !== swiper.el) return;\n newWidth = contentRect\n ? contentRect.width\n : (contentBoxSize[0] || contentBoxSize).inlineSize;\n newHeight = contentRect\n ? contentRect.height\n : (contentBoxSize[0] || contentBoxSize).blockSize;\n });\n if (newWidth !== width || newHeight !== height) {\n resizeHandler();\n }\n });\n observer.observe(swiper.el);\n };\n\n const removeObserver = () => {\n if (observer && observer.unobserve && swiper.el) {\n observer.unobserve(swiper.el);\n observer = null;\n }\n };\n\n const orientationChangeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('orientationchange');\n };\n\n on('init', () => {\n if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n createObserver();\n return;\n }\n window.addEventListener('resize', resizeHandler);\n window.addEventListener('orientationchange', orientationChangeHandler);\n });\n\n on('destroy', () => {\n removeObserver();\n window.removeEventListener('resize', resizeHandler);\n window.removeEventListener('orientationchange', orientationChangeHandler);\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Observer({ swiper, extendParams, on, emit }) {\n const observers = [];\n const window = getWindow();\n const attach = (target, options = {}) => {\n const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n const observer = new ObserverFunc((mutations) => {\n // The observerUpdate event should only be triggered\n // once despite the number of mutations. Additional\n // triggers are redundant and are very costly\n if (mutations.length === 1) {\n emit('observerUpdate', mutations[0]);\n return;\n }\n const observerUpdate = function observerUpdate() {\n emit('observerUpdate', mutations[0]);\n };\n\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(observerUpdate);\n } else {\n window.setTimeout(observerUpdate, 0);\n }\n });\n\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n });\n\n observers.push(observer);\n };\n const init = () => {\n if (!swiper.params.observer) return;\n if (swiper.params.observeParents) {\n const containerParents = swiper.$el.parents();\n for (let i = 0; i < containerParents.length; i += 1) {\n attach(containerParents[i]);\n }\n }\n // Observe container\n attach(swiper.$el[0], {\n childList: swiper.params.observeSlideChildren,\n });\n\n // Observe wrapper\n attach(swiper.$wrapperEl[0], { attributes: false });\n };\n const destroy = () => {\n observers.forEach((observer) => {\n observer.disconnect();\n });\n observers.splice(0, observers.length);\n };\n\n extendParams({\n observer: false,\n observeParents: false,\n observeSlideChildren: false,\n });\n on('init', init);\n on('destroy', destroy);\n}\n","/* eslint-disable no-underscore-dangle */\n\nexport default {\n on(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n events.split(' ').forEach((event) => {\n if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n self.eventsListeners[event][method](handler);\n });\n return self;\n },\n\n once(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n function onceHandler(...args) {\n self.off(events, onceHandler);\n if (onceHandler.__emitterProxy) {\n delete onceHandler.__emitterProxy;\n }\n handler.apply(self, args);\n }\n onceHandler.__emitterProxy = handler;\n return self.on(events, onceHandler, priority);\n },\n\n onAny(handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n if (self.eventsAnyListeners.indexOf(handler) < 0) {\n self.eventsAnyListeners[method](handler);\n }\n return self;\n },\n\n offAny(handler) {\n const self = this;\n if (!self.eventsAnyListeners) return self;\n const index = self.eventsAnyListeners.indexOf(handler);\n if (index >= 0) {\n self.eventsAnyListeners.splice(index, 1);\n }\n return self;\n },\n\n off(events, handler) {\n const self = this;\n if (!self.eventsListeners) return self;\n events.split(' ').forEach((event) => {\n if (typeof handler === 'undefined') {\n self.eventsListeners[event] = [];\n } else if (self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler, index) => {\n if (\n eventHandler === handler ||\n (eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler)\n ) {\n self.eventsListeners[event].splice(index, 1);\n }\n });\n }\n });\n return self;\n },\n\n emit(...args) {\n const self = this;\n if (!self.eventsListeners) return self;\n let events;\n let data;\n let context;\n if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n events = args[0];\n data = args.slice(1, args.length);\n context = self;\n } else {\n events = args[0].events;\n data = args[0].data;\n context = args[0].context || self;\n }\n data.unshift(context);\n const eventsArray = Array.isArray(events) ? events : events.split(' ');\n\n eventsArray.forEach((event) => {\n if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n self.eventsAnyListeners.forEach((eventHandler) => {\n eventHandler.apply(context, [event, ...data]);\n });\n }\n if (self.eventsListeners && self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler) => {\n eventHandler.apply(context, data);\n });\n }\n });\n return self;\n },\n};\n","export default function updateSize() {\n const swiper = this;\n let width;\n let height;\n const $el = swiper.$el;\n if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n width = swiper.params.width;\n } else {\n width = $el[0].clientWidth;\n }\n if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n height = swiper.params.height;\n } else {\n height = $el[0].clientHeight;\n }\n if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n return;\n }\n\n // Subtract paddings\n width =\n width -\n parseInt($el.css('padding-left') || 0, 10) -\n parseInt($el.css('padding-right') || 0, 10);\n height =\n height -\n parseInt($el.css('padding-top') || 0, 10) -\n parseInt($el.css('padding-bottom') || 0, 10);\n\n if (Number.isNaN(width)) width = 0;\n if (Number.isNaN(height)) height = 0;\n\n Object.assign(swiper, {\n width,\n height,\n size: swiper.isHorizontal() ? width : height,\n });\n}\n","import { setCSSProperty } from '../../shared/utils.js';\n\nexport default function updateSlides() {\n const swiper = this;\n function getDirectionLabel(property) {\n if (swiper.isHorizontal()) {\n return property;\n }\n // prettier-ignore\n return {\n 'width': 'height',\n 'margin-top': 'margin-left',\n 'margin-bottom ': 'margin-right',\n 'margin-left': 'margin-top',\n 'margin-right': 'margin-bottom',\n 'padding-left': 'padding-top',\n 'padding-right': 'padding-bottom',\n 'marginRight': 'marginBottom',\n }[property];\n }\n function getDirectionPropertyValue(node, label) {\n return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n }\n\n const params = swiper.params;\n\n const { $wrapperEl, size: swiperSize, rtlTranslate: rtl, wrongRTL } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n let snapGrid = [];\n const slidesGrid = [];\n const slidesSizesGrid = [];\n\n let offsetBefore = params.slidesOffsetBefore;\n if (typeof offsetBefore === 'function') {\n offsetBefore = params.slidesOffsetBefore.call(swiper);\n }\n\n let offsetAfter = params.slidesOffsetAfter;\n if (typeof offsetAfter === 'function') {\n offsetAfter = params.slidesOffsetAfter.call(swiper);\n }\n\n const previousSnapGridLength = swiper.snapGrid.length;\n const previousSlidesGridLength = swiper.slidesGrid.length;\n\n let spaceBetween = params.spaceBetween;\n let slidePosition = -offsetBefore;\n let prevSlideSize = 0;\n let index = 0;\n if (typeof swiperSize === 'undefined') {\n return;\n }\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n }\n\n swiper.virtualSize = -spaceBetween;\n\n // reset margins\n if (rtl) slides.css({ marginLeft: '', marginBottom: '', marginTop: '' });\n else slides.css({ marginRight: '', marginBottom: '', marginTop: '' });\n\n // reset cssMode offsets\n if (params.centeredSlides && params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n }\n\n const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n if (gridEnabled) {\n swiper.grid.initSlides(slidesLength);\n }\n\n // Calc slides\n let slideSize;\n\n const shouldResetSlideSize =\n params.slidesPerView === 'auto' &&\n params.breakpoints &&\n Object.keys(params.breakpoints).filter((key) => {\n return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n }).length > 0;\n\n for (let i = 0; i < slidesLength; i += 1) {\n slideSize = 0;\n const slide = slides.eq(i);\n if (gridEnabled) {\n swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n }\n if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n if (params.slidesPerView === 'auto') {\n if (shouldResetSlideSize) {\n slides[i].style[getDirectionLabel('width')] = ``;\n }\n const slideStyles = getComputedStyle(slide[0]);\n const currentTransform = slide[0].style.transform;\n const currentWebKitTransform = slide[0].style.webkitTransform;\n if (currentTransform) {\n slide[0].style.transform = 'none';\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = 'none';\n }\n if (params.roundLengths) {\n slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n } else {\n // eslint-disable-next-line\n const width = getDirectionPropertyValue(slideStyles, 'width');\n const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n const boxSizing = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing && boxSizing === 'border-box') {\n slideSize = width + marginLeft + marginRight;\n } else {\n const { clientWidth, offsetWidth } = slide[0];\n slideSize =\n width +\n paddingLeft +\n paddingRight +\n marginLeft +\n marginRight +\n (offsetWidth - clientWidth);\n }\n }\n if (currentTransform) {\n slide[0].style.transform = currentTransform;\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = currentWebKitTransform;\n }\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n } else {\n slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n if (slides[i]) {\n slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n }\n }\n if (slides[i]) {\n slides[i].swiperSlideSize = slideSize;\n }\n slidesSizesGrid.push(slideSize);\n\n if (params.centeredSlides) {\n slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n if (prevSlideSize === 0 && i !== 0)\n slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n } else {\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (\n (index - Math.min(swiper.params.slidesPerGroupSkip, index)) %\n swiper.params.slidesPerGroup ===\n 0\n )\n snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n slidePosition = slidePosition + slideSize + spaceBetween;\n }\n\n swiper.virtualSize += slideSize + spaceBetween;\n\n prevSlideSize = slideSize;\n\n index += 1;\n }\n swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` });\n }\n if (params.setWrapperSize) {\n $wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`,\n });\n }\n\n if (gridEnabled) {\n swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n }\n\n // Remove last grid elements depending on width\n if (!params.centeredSlides) {\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n newSlidesGrid.push(slidesGridItem);\n }\n }\n snapGrid = newSlidesGrid;\n\n if (\n Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) >\n 1\n ) {\n snapGrid.push(swiper.virtualSize - swiperSize);\n }\n }\n if (snapGrid.length === 0) snapGrid = [0];\n\n if (params.spaceBetween !== 0) {\n const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n slides\n .filter((_, slideIndex) => {\n if (!params.cssMode) return true;\n if (slideIndex === slides.length - 1) {\n return false;\n }\n return true;\n })\n .css({ [key]: `${spaceBetween}px` });\n }\n\n if (params.centeredSlides && params.centeredSlidesBounds) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n const maxSnap = allSlidesSize - swiperSize;\n snapGrid = snapGrid.map((snap) => {\n if (snap < 0) return -offsetBefore;\n if (snap > maxSnap) return maxSnap + offsetAfter;\n return snap;\n });\n }\n\n if (params.centerInsufficientSlides) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n if (allSlidesSize < swiperSize) {\n const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n snapGrid.forEach((snap, snapIndex) => {\n snapGrid[snapIndex] = snap - allSlidesOffset;\n });\n slidesGrid.forEach((snap, snapIndex) => {\n slidesGrid[snapIndex] = snap + allSlidesOffset;\n });\n }\n }\n\n Object.assign(swiper, {\n slides,\n snapGrid,\n slidesGrid,\n slidesSizesGrid,\n });\n\n if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n setCSSProperty(\n swiper.wrapperEl,\n '--swiper-centered-offset-after',\n `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`,\n );\n const addToSnapGrid = -swiper.snapGrid[0];\n const addToSlidesGrid = -swiper.slidesGrid[0];\n swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid);\n swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid);\n }\n\n if (slidesLength !== previousSlidesLength) {\n swiper.emit('slidesLengthChange');\n }\n if (snapGrid.length !== previousSnapGridLength) {\n if (swiper.params.watchOverflow) swiper.checkOverflow();\n swiper.emit('snapGridLengthChange');\n }\n if (slidesGrid.length !== previousSlidesGridLength) {\n swiper.emit('slidesGridLengthChange');\n }\n\n if (params.watchSlidesProgress) {\n swiper.updateSlidesOffset();\n }\n}\n","export default function updateAutoHeight(speed) {\n const swiper = this;\n const activeSlides = [];\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let newHeight = 0;\n let i;\n if (typeof speed === 'number') {\n swiper.setTransition(speed);\n } else if (speed === true) {\n swiper.setTransition(swiper.params.speed);\n }\n\n const getSlideByIndex = (index) => {\n if (isVirtual) {\n return swiper.slides.filter(\n (el) => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index,\n )[0];\n }\n return swiper.slides.eq(index)[0];\n };\n // Find slides currently in view\n if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n if (swiper.params.centeredSlides) {\n swiper.visibleSlides.each((slide) => {\n activeSlides.push(slide);\n });\n } else {\n for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n const index = swiper.activeIndex + i;\n if (index > swiper.slides.length && !isVirtual) break;\n activeSlides.push(getSlideByIndex(index));\n }\n }\n } else {\n activeSlides.push(getSlideByIndex(swiper.activeIndex));\n }\n\n // Find new height from highest slide in view\n for (i = 0; i < activeSlides.length; i += 1) {\n if (typeof activeSlides[i] !== 'undefined') {\n const height = activeSlides[i].offsetHeight;\n newHeight = height > newHeight ? height : newHeight;\n }\n }\n\n // Update Height\n if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}\n","export default function updateSlidesOffset() {\n const swiper = this;\n const slides = swiper.slides;\n for (let i = 0; i < slides.length; i += 1) {\n slides[i].swiperSlideOffset = swiper.isHorizontal()\n ? slides[i].offsetLeft\n : slides[i].offsetTop;\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateSlidesProgress(translate = (this && this.translate) || 0) {\n const swiper = this;\n const params = swiper.params;\n\n const { slides, rtlTranslate: rtl, snapGrid } = swiper;\n\n if (slides.length === 0) return;\n if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n\n let offsetCenter = -translate;\n if (rtl) offsetCenter = translate;\n\n // Visible Slides\n slides.removeClass(params.slideVisibleClass);\n\n swiper.visibleSlidesIndexes = [];\n swiper.visibleSlides = [];\n\n for (let i = 0; i < slides.length; i += 1) {\n const slide = slides[i];\n let slideOffset = slide.swiperSlideOffset;\n if (params.cssMode && params.centeredSlides) {\n slideOffset -= slides[0].swiperSlideOffset;\n }\n\n const slideProgress =\n (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const originalSlideProgress =\n (offsetCenter -\n snapGrid[0] +\n (params.centeredSlides ? swiper.minTranslate() : 0) -\n slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const slideBefore = -(offsetCenter - slideOffset);\n const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n const isVisible =\n (slideBefore >= 0 && slideBefore < swiper.size - 1) ||\n (slideAfter > 1 && slideAfter <= swiper.size) ||\n (slideBefore <= 0 && slideAfter >= swiper.size);\n if (isVisible) {\n swiper.visibleSlides.push(slide);\n swiper.visibleSlidesIndexes.push(i);\n slides.eq(i).addClass(params.slideVisibleClass);\n }\n slide.progress = rtl ? -slideProgress : slideProgress;\n slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n }\n swiper.visibleSlides = $(swiper.visibleSlides);\n}\n","export default function updateProgress(translate) {\n const swiper = this;\n if (typeof translate === 'undefined') {\n const multiplier = swiper.rtlTranslate ? -1 : 1;\n // eslint-disable-next-line\n translate = (swiper && swiper.translate && swiper.translate * multiplier) || 0;\n }\n const params = swiper.params;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n let { progress, isBeginning, isEnd } = swiper;\n const wasBeginning = isBeginning;\n const wasEnd = isEnd;\n if (translatesDiff === 0) {\n progress = 0;\n isBeginning = true;\n isEnd = true;\n } else {\n progress = (translate - swiper.minTranslate()) / translatesDiff;\n isBeginning = progress <= 0;\n isEnd = progress >= 1;\n }\n Object.assign(swiper, {\n progress,\n isBeginning,\n isEnd,\n });\n\n if (params.watchSlidesProgress || (params.centeredSlides && params.autoHeight))\n swiper.updateSlidesProgress(translate);\n\n if (isBeginning && !wasBeginning) {\n swiper.emit('reachBeginning toEdge');\n }\n if (isEnd && !wasEnd) {\n swiper.emit('reachEnd toEdge');\n }\n if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n swiper.emit('fromEdge');\n }\n\n swiper.emit('progress', progress);\n}\n","export default function updateSlidesClasses() {\n const swiper = this;\n\n const { slides, params, $wrapperEl, activeIndex, realIndex } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n\n slides.removeClass(\n `${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`,\n );\n\n let activeSlide;\n if (isVirtual) {\n activeSlide = swiper.$wrapperEl.find(\n `.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`,\n );\n } else {\n activeSlide = slides.eq(activeIndex);\n }\n\n // Active classes\n activeSlide.addClass(params.slideActiveClass);\n\n if (params.loop) {\n // Duplicate to all looped slides\n if (activeSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n }\n }\n // Next Slide\n let nextSlide = activeSlide\n .nextAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slideNextClass);\n if (params.loop && nextSlide.length === 0) {\n nextSlide = slides.eq(0);\n nextSlide.addClass(params.slideNextClass);\n }\n // Prev Slide\n let prevSlide = activeSlide\n .prevAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slidePrevClass);\n if (params.loop && prevSlide.length === 0) {\n prevSlide = slides.eq(-1);\n prevSlide.addClass(params.slidePrevClass);\n }\n if (params.loop) {\n // Duplicate to all looped slides\n if (nextSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n }\n if (prevSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n }\n }\n swiper.emitSlidesClasses();\n}\n","export default function updateActiveIndex(newActiveIndex) {\n const swiper = this;\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n const {\n slidesGrid,\n snapGrid,\n params,\n activeIndex: previousIndex,\n realIndex: previousRealIndex,\n snapIndex: previousSnapIndex,\n } = swiper;\n let activeIndex = newActiveIndex;\n let snapIndex;\n if (typeof activeIndex === 'undefined') {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n translate >= slidesGrid[i] &&\n translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2\n ) {\n activeIndex = i;\n } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n activeIndex = i + 1;\n }\n } else if (translate >= slidesGrid[i]) {\n activeIndex = i;\n }\n }\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n }\n }\n if (snapGrid.indexOf(translate) >= 0) {\n snapIndex = snapGrid.indexOf(translate);\n } else {\n const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n }\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n if (activeIndex === previousIndex) {\n if (snapIndex !== previousSnapIndex) {\n swiper.snapIndex = snapIndex;\n swiper.emit('snapIndexChange');\n }\n return;\n }\n\n // Get real index\n const realIndex = parseInt(\n swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex,\n 10,\n );\n\n Object.assign(swiper, {\n snapIndex,\n realIndex,\n previousIndex,\n activeIndex,\n });\n swiper.emit('activeIndexChange');\n swiper.emit('snapIndexChange');\n if (previousRealIndex !== realIndex) {\n swiper.emit('realIndexChange');\n }\n if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n swiper.emit('slideChange');\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateClickedSlide(e) {\n const swiper = this;\n const params = swiper.params;\n const slide = $(e.target).closest(`.${params.slideClass}`)[0];\n let slideFound = false;\n let slideIndex;\n\n if (slide) {\n for (let i = 0; i < swiper.slides.length; i += 1) {\n if (swiper.slides[i] === slide) {\n slideFound = true;\n slideIndex = i;\n break;\n }\n }\n }\n\n if (slide && slideFound) {\n swiper.clickedSlide = slide;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n } else {\n swiper.clickedIndex = slideIndex;\n }\n } else {\n swiper.clickedSlide = undefined;\n swiper.clickedIndex = undefined;\n return;\n }\n if (\n params.slideToClickedSlide &&\n swiper.clickedIndex !== undefined &&\n swiper.clickedIndex !== swiper.activeIndex\n ) {\n swiper.slideToClickedSlide();\n }\n}\n","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\n\nexport default {\n updateSize,\n updateSlides,\n updateAutoHeight,\n updateSlidesOffset,\n updateSlidesProgress,\n updateProgress,\n updateSlidesClasses,\n updateActiveIndex,\n updateClickedSlide,\n};\n","import { getTranslate } from '../../shared/utils.js';\n\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n const swiper = this;\n\n const { params, rtlTranslate: rtl, translate, $wrapperEl } = swiper;\n\n if (params.virtualTranslate) {\n return rtl ? -translate : translate;\n }\n if (params.cssMode) {\n return translate;\n }\n\n let currentTranslate = getTranslate($wrapperEl[0], axis);\n if (rtl) currentTranslate = -currentTranslate;\n\n return currentTranslate || 0;\n}\n","export default function setTranslate(translate, byController) {\n const swiper = this;\n const { rtlTranslate: rtl, params, $wrapperEl, wrapperEl, progress } = swiper;\n let x = 0;\n let y = 0;\n const z = 0;\n\n if (swiper.isHorizontal()) {\n x = rtl ? -translate : translate;\n } else {\n y = translate;\n }\n\n if (params.roundLengths) {\n x = Math.floor(x);\n y = Math.floor(y);\n }\n\n if (params.cssMode) {\n wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n } else if (!params.virtualTranslate) {\n $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n }\n swiper.previousTranslate = swiper.translate;\n swiper.translate = swiper.isHorizontal() ? x : y;\n\n // Check if we need to update progress\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== progress) {\n swiper.updateProgress(translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, byController);\n}\n","export default function minTranslate() {\n return -this.snapGrid[0];\n}\n","export default function maxTranslate() {\n return -this.snapGrid[this.snapGrid.length - 1];\n}\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function translateTo(\n translate = 0,\n speed = this.params.speed,\n runCallbacks = true,\n translateBounds = true,\n internal,\n) {\n const swiper = this;\n\n const { params, wrapperEl } = swiper;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return false;\n }\n\n const minTranslate = swiper.minTranslate();\n const maxTranslate = swiper.maxTranslate();\n let newTranslate;\n if (translateBounds && translate > minTranslate) newTranslate = minTranslate;\n else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;\n else newTranslate = translate;\n\n // Update progress\n swiper.updateProgress(newTranslate);\n\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n if (speed === 0) {\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: -newTranslate, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: -newTranslate,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionEnd');\n }\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionStart');\n }\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onTranslateToWrapperTransitionEnd) {\n swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.onTranslateToWrapperTransitionEnd = null;\n delete swiper.onTranslateToWrapperTransitionEnd;\n if (runCallbacks) {\n swiper.emit('transitionEnd');\n }\n };\n }\n swiper.$wrapperEl[0].addEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\n\nexport default {\n getTranslate,\n setTranslate,\n minTranslate,\n maxTranslate,\n translateTo,\n};\n","export default function setTransition(duration, byController) {\n const swiper = this;\n\n if (!swiper.params.cssMode) {\n swiper.$wrapperEl.transition(duration);\n }\n\n swiper.emit('setTransition', duration, byController);\n}\n","export default function transitionEmit({ swiper, runCallbacks, direction, step }) {\n const { activeIndex, previousIndex } = swiper;\n let dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) dir = 'next';\n else if (activeIndex < previousIndex) dir = 'prev';\n else dir = 'reset';\n }\n\n swiper.emit(`transition${step}`);\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit(`slideResetTransition${step}`);\n return;\n }\n swiper.emit(`slideChangeTransition${step}`);\n if (dir === 'next') {\n swiper.emit(`slideNextTransition${step}`);\n } else {\n swiper.emit(`slidePrevTransition${step}`);\n }\n }\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionStart(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n if (params.cssMode) return;\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'Start' });\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionEnd(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n swiper.animating = false;\n if (params.cssMode) return;\n swiper.setTransition(0);\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'End' });\n}\n","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\n\nexport default {\n setTransition,\n transitionStart,\n transitionEnd,\n};\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function slideTo(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n initial,\n) {\n if (typeof index !== 'number' && typeof index !== 'string') {\n throw new Error(\n `The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`,\n );\n }\n\n if (typeof index === 'string') {\n /**\n * The `index` argument converted from `string` to `number`.\n * @type {number}\n */\n const indexAsNumber = parseInt(index, 10);\n\n /**\n * Determines whether the `index` argument is a valid `number`\n * after being converted from the `string` type.\n * @type {boolean}\n */\n const isValidNumber = isFinite(indexAsNumber);\n\n if (!isValidNumber) {\n throw new Error(\n `The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`,\n );\n }\n\n // Knowing that the converted `index` is a valid number,\n // we can update the original argument's value.\n index = indexAsNumber;\n }\n\n const swiper = this;\n let slideIndex = index;\n if (slideIndex < 0) slideIndex = 0;\n\n const {\n params,\n snapGrid,\n slidesGrid,\n previousIndex,\n activeIndex,\n rtlTranslate: rtl,\n wrapperEl,\n enabled,\n } = swiper;\n\n if (\n (swiper.animating && params.preventInteractionOnTransition) ||\n (!enabled && !internal && !initial)\n ) {\n return false;\n }\n\n const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n const translate = -snapGrid[snapIndex];\n\n // Update progress\n swiper.updateProgress(translate);\n\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n const normalizedTranslate = -Math.floor(translate * 100);\n const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2\n ) {\n slideIndex = i;\n } else if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext\n ) {\n slideIndex = i + 1;\n }\n } else if (normalizedTranslate >= normalizedGrid) {\n slideIndex = i;\n }\n }\n }\n // Directions locks\n if (swiper.initialized && slideIndex !== activeIndex) {\n if (\n !swiper.allowSlideNext &&\n translate < swiper.translate &&\n translate < swiper.minTranslate()\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n translate > swiper.translate &&\n translate > swiper.maxTranslate()\n ) {\n if ((activeIndex || 0) !== slideIndex) return false;\n }\n }\n\n let direction;\n if (slideIndex > activeIndex) direction = 'next';\n else if (slideIndex < activeIndex) direction = 'prev';\n else direction = 'reset';\n\n // Update Index\n if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n if (direction !== 'reset') {\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n }\n return false;\n }\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n const t = rtl ? translate : -translate;\n if (speed === 0) {\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n if (isVirtual) {\n swiper.wrapperEl.style.scrollSnapType = 'none';\n swiper._immediateVirtual = true;\n }\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n if (isVirtual) {\n requestAnimationFrame(() => {\n swiper.wrapperEl.style.scrollSnapType = '';\n swiper._swiperImmediateVirtual = false;\n });\n }\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: t, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: t,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onSlideToWrapperTransitionEnd) {\n swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.onSlideToWrapperTransitionEnd = null;\n delete swiper.onSlideToWrapperTransitionEnd;\n swiper.transitionEnd(runCallbacks, direction);\n };\n }\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","export default function slideToLoop(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n) {\n const swiper = this;\n let newIndex = index;\n if (swiper.params.loop) {\n newIndex += swiper.loopedSlides;\n }\n\n return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { animating, enabled, params } = swiper;\n if (!enabled) return swiper;\n let perGroup = params.slidesPerGroup;\n if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n }\n const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { params, animating, snapGrid, slidesGrid, rtlTranslate, enabled } = swiper;\n if (!enabled) return swiper;\n\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n function normalize(val) {\n if (val < 0) return -Math.floor(Math.abs(val));\n return Math.floor(val);\n }\n const normalizedTranslate = normalize(translate);\n const normalizedSnapGrid = snapGrid.map((val) => normalize(val));\n\n let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n if (typeof prevSnap === 'undefined' && params.cssMode) {\n let prevSnapIndex;\n snapGrid.forEach((snap, snapIndex) => {\n if (normalizedTranslate >= snap) {\n // prevSnap = snap;\n prevSnapIndex = snapIndex;\n }\n });\n if (typeof prevSnapIndex !== 'undefined') {\n prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n }\n }\n let prevIndex = 0;\n if (typeof prevSnap !== 'undefined') {\n prevIndex = slidesGrid.indexOf(prevSnap);\n if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n if (\n params.slidesPerView === 'auto' &&\n params.slidesPerGroup === 1 &&\n params.slidesPerGroupAuto\n ) {\n prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n prevIndex = Math.max(prevIndex, 0);\n }\n }\n return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n threshold = 0.5,\n) {\n const swiper = this;\n let index = swiper.activeIndex;\n const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n if (translate >= swiper.snapGrid[snapIndex]) {\n // The current translate is on or after the current snap index, so the choice\n // is between the current index and the one after it.\n const currentSnap = swiper.snapGrid[snapIndex];\n const nextSnap = swiper.snapGrid[snapIndex + 1];\n if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n index += swiper.params.slidesPerGroup;\n }\n } else {\n // The current translate is before the current snap index, so the choice\n // is between the current index and the one before it.\n const prevSnap = swiper.snapGrid[snapIndex - 1];\n const currentSnap = swiper.snapGrid[snapIndex];\n if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n index -= swiper.params.slidesPerGroup;\n }\n }\n index = Math.max(index, 0);\n index = Math.min(index, swiper.slidesGrid.length - 1);\n\n return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function slideToClickedSlide() {\n const swiper = this;\n const { params, $wrapperEl } = swiper;\n\n const slidesPerView =\n params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n let slideToIndex = swiper.clickedIndex;\n let realIndex;\n if (params.loop) {\n if (swiper.animating) return;\n realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (\n slideToIndex < swiper.loopedSlides - slidesPerView / 2 ||\n slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2\n ) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n}\n","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\n\nexport default {\n slideTo,\n slideToLoop,\n slideNext,\n slidePrev,\n slideReset,\n slideToClosest,\n slideToClickedSlide,\n};\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loopCreate() {\n const swiper = this;\n const document = getDocument();\n const { params, $wrapperEl } = swiper;\n // Remove duplicated slides\n const $selector = $($wrapperEl.children()[0].parentNode);\n $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n\n let slides = $selector.children(`.${params.slideClass}`);\n\n if (params.loopFillGroupWithBlank) {\n const blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n if (blankSlidesNum !== params.slidesPerGroup) {\n for (let i = 0; i < blankSlidesNum; i += 1) {\n const blankNode = $(document.createElement('div')).addClass(\n `${params.slideClass} ${params.slideBlankClass}`,\n );\n $selector.append(blankNode);\n }\n slides = $selector.children(`.${params.slideClass}`);\n }\n }\n\n if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n\n swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n swiper.loopedSlides += params.loopAdditionalSlides;\n if (swiper.loopedSlides > slides.length) {\n swiper.loopedSlides = slides.length;\n }\n\n const prependSlides = [];\n const appendSlides = [];\n slides.each((el, index) => {\n const slide = $(el);\n if (index < swiper.loopedSlides) {\n appendSlides.push(el);\n }\n if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n prependSlides.push(el);\n }\n slide.attr('data-swiper-slide-index', index);\n });\n for (let i = 0; i < appendSlides.length; i += 1) {\n $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n}\n","export default function loopFix() {\n const swiper = this;\n\n swiper.emit('beforeLoopFix');\n\n const {\n activeIndex,\n slides,\n loopedSlides,\n allowSlidePrev,\n allowSlideNext,\n snapGrid,\n rtlTranslate: rtl,\n } = swiper;\n let newIndex;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n\n const snapTranslate = -snapGrid[activeIndex];\n const diff = snapTranslate - swiper.getTranslate();\n\n // Fix For Negative Oversliding\n if (activeIndex < loopedSlides) {\n newIndex = slides.length - loopedSlides * 3 + activeIndex;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n } else if (activeIndex >= slides.length - loopedSlides) {\n // Fix For Positive Oversliding\n newIndex = -slides.length + activeIndex + loopedSlides;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n swiper.emit('loopFix');\n}\n","export default function loopDestroy() {\n const swiper = this;\n const { $wrapperEl, params, slides } = swiper;\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`,\n )\n .remove();\n slides.removeAttr('data-swiper-slide-index');\n}\n","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\n\nexport default {\n loopCreate,\n loopFix,\n loopDestroy,\n};\n","export default function setGrabCursor(moving) {\n const swiper = this;\n if (\n swiper.support.touch ||\n !swiper.params.simulateTouch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n )\n return;\n const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n el.style.cursor = 'move';\n el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n}\n","export default function unsetGrabCursor() {\n const swiper = this;\n if (\n swiper.support.touch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n ) {\n return;\n }\n swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}\n","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\n\nexport default {\n setGrabCursor,\n unsetGrabCursor,\n};\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base = this) {\n function __closestFrom(el) {\n if (!el || el === getDocument() || el === getWindow()) return null;\n if (el.assignedSlot) el = el.assignedSlot;\n const found = el.closest(selector);\n return found || __closestFrom(el.getRootNode().host);\n }\n return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n const swiper = this;\n const document = getDocument();\n const window = getWindow();\n\n const data = swiper.touchEventsData;\n const { params, touches, enabled } = swiper;\n if (!enabled) return;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return;\n }\n if (!swiper.animating && params.cssMode && params.loop) {\n swiper.loopFix();\n }\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n let $targetEl = $(e.target);\n\n if (params.touchEventsTarget === 'wrapper') {\n if (!$targetEl.closest(swiper.wrapperEl).length) return;\n }\n data.isTouchEvent = e.type === 'touchstart';\n if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n if (data.isTouched && data.isMoved) return;\n\n // change target el for shadow root component\n const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n $targetEl = $(event.path[0]);\n }\n\n const noSwipingSelector = params.noSwipingSelector\n ? params.noSwipingSelector\n : `.${params.noSwipingClass}`;\n const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n // use closestElement for shadow root element to get the actual closest for nested shadow root element\n if (\n params.noSwiping &&\n (isTargetShadow\n ? closestElement(noSwipingSelector, e.target)\n : $targetEl.closest(noSwipingSelector)[0])\n ) {\n swiper.allowClick = true;\n return;\n }\n\n if (params.swipeHandler) {\n if (!$targetEl.closest(params.swipeHandler)[0]) return;\n }\n\n touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n const startX = touches.currentX;\n const startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n if (\n edgeSwipeDetection &&\n (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)\n ) {\n if (edgeSwipeDetection === 'prevent') {\n event.preventDefault();\n } else {\n return;\n }\n }\n\n Object.assign(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined,\n });\n\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) data.allowThresholdMove = false;\n if (e.type !== 'touchstart') {\n let preventDefault = true;\n if ($targetEl.is(data.focusableElements)) preventDefault = false;\n if (\n document.activeElement &&\n $(document.activeElement).is(data.focusableElements) &&\n document.activeElement !== $targetEl[0]\n ) {\n document.activeElement.blur();\n }\n\n const shouldPreventDefault =\n preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n if (\n (params.touchStartForcePreventDefault || shouldPreventDefault) &&\n !$targetEl[0].isContentEditable\n ) {\n e.preventDefault();\n }\n }\n swiper.emit('touchStart', e);\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\nexport default function onTouchMove(event) {\n const document = getDocument();\n const swiper = this;\n const data = swiper.touchEventsData;\n const { params, touches, rtlTranslate: rtl, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (!data.isTouched) {\n if (data.startMoving && data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n return;\n }\n if (data.isTouchEvent && e.type !== 'touchmove') return;\n const targetTouch =\n e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n // isMoved = true;\n swiper.allowClick = false;\n if (data.isTouched) {\n Object.assign(touches, {\n startX: pageX,\n startY: pageY,\n currentX: pageX,\n currentY: pageY,\n });\n data.touchStartTime = now();\n }\n return;\n }\n if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (\n (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) ||\n (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n ) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (\n (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) ||\n (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n ) {\n return;\n }\n }\n if (data.isTouchEvent && document.activeElement) {\n if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) return;\n\n touches.currentX = pageX;\n touches.currentY = pageY;\n\n const diffX = touches.currentX - touches.startX;\n const diffY = touches.currentY - touches.startY;\n if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold)\n return;\n\n if (typeof data.isScrolling === 'undefined') {\n let touchAngle;\n if (\n (swiper.isHorizontal() && touches.currentY === touches.startY) ||\n (swiper.isVertical() && touches.currentX === touches.startX)\n ) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if (diffX * diffX + diffY * diffY >= 25) {\n touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n data.isScrolling = swiper.isHorizontal()\n ? touchAngle > params.touchAngle\n : 90 - touchAngle > params.touchAngle;\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof data.startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (data.isScrolling) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n if (!params.cssMode && e.cancelable) {\n e.preventDefault();\n }\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n\n if (!data.isMoved) {\n if (params.loop && !params.cssMode) {\n swiper.loopFix();\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n\n let diff = swiper.isHorizontal() ? diffX : diffY;\n touches.diff = diff;\n\n diff *= params.touchRatio;\n if (rtl) diff = -diff;\n\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n data.currentTranslate = diff + data.startTranslate;\n\n let disableParentSwiper = true;\n let resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.minTranslate() -\n 1 +\n (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.maxTranslate() +\n 1 -\n (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n }\n\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n swiper.swipeDirection === 'next' &&\n data.currentTranslate < data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (\n !swiper.allowSlidePrev &&\n swiper.swipeDirection === 'prev' &&\n data.currentTranslate > data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n data.currentTranslate = data.startTranslate;\n }\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal()\n ? touches.currentX - touches.startX\n : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n\n if (!params.followFinger || params.cssMode) return;\n\n // Update active index in free mode\n if (\n (params.freeMode && params.freeMode.enabled && swiper.freeMode) ||\n params.watchSlidesProgress\n ) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n swiper.freeMode.onTouchMove();\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n}\n","import { now, nextTick } from '../../shared/utils.js';\n\nexport default function onTouchEnd(event) {\n const swiper = this;\n const data = swiper.touchEventsData;\n\n const { params, touches, rtlTranslate: rtl, slidesGrid, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) {\n if (data.isMoved && params.grabCursor) {\n swiper.setGrabCursor(false);\n }\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n // Return Grab Cursor\n if (\n params.grabCursor &&\n data.isMoved &&\n data.isTouched &&\n (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)\n ) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n swiper.updateClickedSlide(e);\n swiper.emit('tap click', e);\n if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n swiper.emit('doubleTap doubleClick', e);\n }\n }\n\n data.lastClickTime = now();\n nextTick(() => {\n if (!swiper.destroyed) swiper.allowClick = true;\n });\n\n if (\n !data.isTouched ||\n !data.isMoved ||\n !swiper.swipeDirection ||\n touches.diff === 0 ||\n data.currentTranslate === data.startTranslate\n ) {\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n\n let currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n\n if (params.cssMode) {\n return;\n }\n\n if (swiper.params.freeMode && params.freeMode.enabled) {\n swiper.freeMode.onTouchEnd({ currentPos });\n return;\n }\n\n // Find current slide\n let stopIndex = 0;\n let groupSize = swiper.slidesSizesGrid[0];\n for (\n let i = 0;\n i < slidesGrid.length;\n i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup\n ) {\n const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n if (typeof slidesGrid[i + increment] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n stopIndex = i;\n groupSize = slidesGrid[i + increment] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n\n // Find current slide size\n const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n const isNavButtonTarget =\n swiper.navigation &&\n (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n if (!isNavButtonTarget) {\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(stopIndex + increment);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(stopIndex);\n }\n } else if (e.target === swiper.navigation.nextEl) {\n swiper.slideTo(stopIndex + increment);\n } else {\n swiper.slideTo(stopIndex);\n }\n }\n}\n","export default function onResize() {\n const swiper = this;\n\n const { params, el } = swiper;\n\n if (el && el.offsetWidth === 0) return;\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n const { allowSlideNext, allowSlidePrev, snapGrid } = swiper;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n\n swiper.updateSize();\n swiper.updateSlides();\n\n swiper.updateSlidesClasses();\n if (\n (params.slidesPerView === 'auto' || params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.isBeginning &&\n !swiper.params.centeredSlides\n ) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n\n if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n swiper.autoplay.run();\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n}\n","export default function onClick(e) {\n const swiper = this;\n if (!swiper.enabled) return;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) e.preventDefault();\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n}\n","export default function onScroll() {\n const swiper = this;\n const { wrapperEl, rtlTranslate, enabled } = swiper;\n if (!enabled) return;\n swiper.previousTranslate = swiper.translate;\n if (swiper.isHorizontal()) {\n swiper.translate = -wrapperEl.scrollLeft;\n } else {\n swiper.translate = -wrapperEl.scrollTop;\n }\n // eslint-disable-next-line\n if (swiper.translate === -0) swiper.translate = 0;\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== swiper.progress) {\n swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, false);\n}\n","import { getDocument } from 'ssr-window';\n\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\n\nlet dummyEventAttached = false;\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n const document = getDocument();\n const { params, touchEvents, el, wrapperEl, device, support } = swiper;\n const capture = !!params.nested;\n const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n const swiperMethod = method;\n\n // Touch Events\n if (!support.touch) {\n el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n } else {\n const passiveListener =\n touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n el[domMethod](\n touchEvents.move,\n swiper.onTouchMove,\n support.passiveListener ? { passive: false, capture } : capture,\n );\n el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n if (touchEvents.cancel) {\n el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n el[domMethod]('click', swiper.onClick, true);\n }\n if (params.cssMode) {\n wrapperEl[domMethod]('scroll', swiper.onScroll);\n }\n\n // Resize handler\n if (params.updateOnWindowResize) {\n swiper[swiperMethod](\n device.ios || device.android\n ? 'resize orientationchange observerUpdate'\n : 'resize observerUpdate',\n onResize,\n true,\n );\n } else {\n swiper[swiperMethod]('observerUpdate', onResize, true);\n }\n};\n\nfunction attachEvents() {\n const swiper = this;\n const document = getDocument();\n const { params, support } = swiper;\n\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n if (params.cssMode) {\n swiper.onScroll = onScroll.bind(swiper);\n }\n\n swiper.onClick = onClick.bind(swiper);\n\n if (support.touch && !dummyEventAttached) {\n document.addEventListener('touchstart', dummyEventListener);\n dummyEventAttached = true;\n }\n\n events(swiper, 'on');\n}\n\nfunction detachEvents() {\n const swiper = this;\n events(swiper, 'off');\n}\n\nexport default {\n attachEvents,\n detachEvents,\n};\n","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n const swiper = this;\n const { activeIndex, initialized, loopedSlides = 0, params, $el } = swiper;\n const breakpoints = params.breakpoints;\n if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) return;\n\n // Get breakpoint for window width and update parameters\n const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n\n if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n\n const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n const wasMultiRow = isGridEnabled(swiper, params);\n const isMultiRow = isGridEnabled(swiper, breakpointParams);\n\n const wasEnabled = params.enabled;\n\n if (wasMultiRow && !isMultiRow) {\n $el.removeClass(\n `${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`,\n );\n swiper.emitContainerClasses();\n } else if (!wasMultiRow && isMultiRow) {\n $el.addClass(`${params.containerModifierClass}grid`);\n if (\n (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column') ||\n (!breakpointParams.grid.fill && params.grid.fill === 'column')\n ) {\n $el.addClass(`${params.containerModifierClass}grid-column`);\n }\n swiper.emitContainerClasses();\n }\n\n const directionChanged =\n breakpointParams.direction && breakpointParams.direction !== params.direction;\n const needsReLoop =\n params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n if (directionChanged && initialized) {\n swiper.changeDirection();\n }\n extend(swiper.params, breakpointParams);\n\n const isEnabled = swiper.params.enabled;\n\n Object.assign(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n });\n\n if (wasEnabled && !isEnabled) {\n swiper.disable();\n } else if (!wasEnabled && isEnabled) {\n swiper.enable();\n }\n\n swiper.currentBreakpoint = breakpoint;\n\n swiper.emit('_beforeBreakpoint', breakpointParams);\n\n if (needsReLoop && initialized) {\n swiper.loopDestroy();\n swiper.loopCreate();\n swiper.updateSlides();\n swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n }\n\n swiper.emit('breakpoint', breakpointParams);\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n if (!breakpoints || (base === 'container' && !containerEl)) return undefined;\n let breakpoint = false;\n\n const window = getWindow();\n const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n\n const points = Object.keys(breakpoints).map((point) => {\n if (typeof point === 'string' && point.indexOf('@') === 0) {\n const minRatio = parseFloat(point.substr(1));\n const value = currentHeight * minRatio;\n return { value, point };\n }\n return { value: point, point };\n });\n\n points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n for (let i = 0; i < points.length; i += 1) {\n const { point, value } = points[i];\n if (base === 'window') {\n if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n breakpoint = point;\n }\n } else if (value <= containerEl.clientWidth) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n}\n","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\n\nexport default { setBreakpoint, getBreakpoint };\n","function prepareClasses(entries, prefix) {\n const resultClasses = [];\n entries.forEach((item) => {\n if (typeof item === 'object') {\n Object.keys(item).forEach((classNames) => {\n if (item[classNames]) {\n resultClasses.push(prefix + classNames);\n }\n });\n } else if (typeof item === 'string') {\n resultClasses.push(prefix + item);\n }\n });\n return resultClasses;\n}\n\nexport default function addClasses() {\n const swiper = this;\n const { classNames, params, rtl, $el, device, support } = swiper;\n // prettier-ignore\n const suffixes = prepareClasses([\n 'initialized',\n params.direction,\n { 'pointer-events': !support.touch },\n { 'free-mode': swiper.params.freeMode && params.freeMode.enabled },\n { 'autoheight': params.autoHeight },\n { 'rtl': rtl },\n { 'grid': params.grid && params.grid.rows > 1 },\n { 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' },\n { 'android': device.android },\n { 'ios': device.ios },\n { 'css-mode': params.cssMode },\n { 'centered': params.cssMode && params.centeredSlides },\n ], params.containerModifierClass);\n classNames.push(...suffixes);\n $el.addClass([...classNames].join(' '));\n swiper.emitContainerClasses();\n}\n","export default function removeClasses() {\n const swiper = this;\n const { $el, classNames } = swiper;\n\n $el.removeClass(classNames.join(' '));\n swiper.emitContainerClasses();\n}\n","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\n\nexport default { addClasses, removeClasses };\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n const window = getWindow();\n let image;\n function onReady() {\n if (callback) callback();\n }\n const isPicture = $(imageEl).parent('picture')[0];\n\n if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n if (src) {\n image = new window.Image();\n image.onload = onReady;\n image.onerror = onReady;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcset) {\n image.srcset = srcset;\n }\n if (src) {\n image.src = src;\n }\n } else {\n onReady();\n }\n } else {\n // image already loaded...\n onReady();\n }\n}\n","export default function preloadImages() {\n const swiper = this;\n swiper.imagesToLoad = swiper.$el.find('img');\n function onReady() {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n if (swiper.params.updateOnImagesReady) swiper.update();\n swiper.emit('imagesReady');\n }\n }\n for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n const imageEl = swiper.imagesToLoad[i];\n swiper.loadImage(\n imageEl,\n imageEl.currentSrc || imageEl.getAttribute('src'),\n imageEl.srcset || imageEl.getAttribute('srcset'),\n imageEl.sizes || imageEl.getAttribute('sizes'),\n true,\n onReady,\n );\n }\n}\n","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\n\nexport default {\n loadImage,\n preloadImages,\n};\n","function checkOverflow() {\n const swiper = this;\n const { isLocked: wasLocked, params } = swiper;\n const { slidesOffsetBefore } = params;\n\n if (slidesOffsetBefore) {\n const lastSlideIndex = swiper.slides.length - 1;\n const lastSlideRightEdge =\n swiper.slidesGrid[lastSlideIndex] +\n swiper.slidesSizesGrid[lastSlideIndex] +\n slidesOffsetBefore * 2;\n swiper.isLocked = swiper.size > lastSlideRightEdge;\n } else {\n swiper.isLocked = swiper.snapGrid.length === 1;\n }\n if (params.allowSlideNext === true) {\n swiper.allowSlideNext = !swiper.isLocked;\n }\n if (params.allowSlidePrev === true) {\n swiper.allowSlidePrev = !swiper.isLocked;\n }\n\n if (wasLocked && wasLocked !== swiper.isLocked) {\n swiper.isEnd = false;\n }\n if (wasLocked !== swiper.isLocked) {\n swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n }\n}\n\nexport default { checkOverflow };\n","export default {\n init: true,\n direction: 'horizontal',\n touchEventsTarget: 'wrapper',\n initialSlide: 0,\n speed: 300,\n cssMode: false,\n updateOnWindowResize: true,\n resizeObserver: true,\n nested: false,\n createElements: false,\n enabled: true,\n focusableElements: 'input, select, option, textarea, button, video, label',\n\n // Overrides\n width: null,\n height: null,\n\n //\n preventInteractionOnTransition: false,\n\n // ssr\n userAgent: null,\n url: null,\n\n // To support iOS's swipe-to-go-back gesture (when being used in-app).\n edgeSwipeDetection: false,\n edgeSwipeThreshold: 20,\n\n // Autoheight\n autoHeight: false,\n\n // Set wrapper width\n setWrapperSize: false,\n\n // Virtual Translate\n virtualTranslate: false,\n\n // Effects\n effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n breakpointsBase: 'window',\n\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerGroup: 1,\n slidesPerGroupSkip: 0,\n slidesPerGroupAuto: false,\n centeredSlides: false,\n centeredSlidesBounds: false,\n slidesOffsetBefore: 0, // in px\n slidesOffsetAfter: 0, // in px\n normalizeSlideIndex: true,\n centerInsufficientSlides: false,\n\n // Disable swiper and hide navigation when container not overflow\n watchOverflow: true,\n\n // Round length\n roundLengths: false,\n\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 0,\n touchMoveStopPropagation: false,\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchReleaseOnEdges: false,\n\n // Unique Navigation Elements\n uniqueNavElements: true,\n\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n\n // Progress\n watchSlidesProgress: false,\n\n // Cursor\n grabCursor: false,\n\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n\n // Images\n preloadImages: true,\n updateOnImagesReady: true,\n\n // loop\n loop: false,\n loopAdditionalSlides: 0,\n loopedSlides: null,\n loopFillGroupWithBlank: false,\n loopPreventsSlide: true,\n\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null, // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n noSwipingSelector: null,\n\n // Passive Listeners\n passiveListeners: true,\n\n // NS\n containerModifierClass: 'swiper-', // NEW\n slideClass: 'swiper-slide',\n slideBlankClass: 'swiper-slide-invisible-blank',\n slideActiveClass: 'swiper-slide-active',\n slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideDuplicateClass: 'swiper-slide-duplicate',\n slideNextClass: 'swiper-slide-next',\n slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n slidePrevClass: 'swiper-slide-prev',\n slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n wrapperClass: 'swiper-wrapper',\n\n // Callbacks\n runCallbacksOnInit: true,\n\n // Internals\n _emitClasses: false,\n};\n","import { extend } from '../shared/utils.js';\n\nexport default function moduleExtendParams(params, allModulesParams) {\n return function extendParams(obj = {}) {\n const moduleParamName = Object.keys(obj)[0];\n const moduleParams = obj[moduleParamName];\n if (typeof moduleParams !== 'object' || moduleParams === null) {\n extend(allModulesParams, obj);\n return;\n }\n if (\n ['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 &&\n params[moduleParamName] === true\n ) {\n params[moduleParamName] = { auto: true };\n }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n extend(allModulesParams, obj);\n return;\n }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = { enabled: true };\n }\n if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) params[moduleParamName] = { enabled: false };\n extend(allModulesParams, obj);\n };\n}\n","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\n\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\n\nimport eventsEmitter from './events-emitter.js';\n\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\n\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\n\nconst prototypes = {\n eventsEmitter,\n update,\n translate,\n transition,\n slide,\n loop,\n grabCursor,\n events,\n breakpoints,\n checkOverflow,\n classes,\n images,\n};\n\nconst extendedDefaults = {};\n\nclass Swiper {\n constructor(...args) {\n let el;\n let params;\n if (\n args.length === 1 &&\n args[0].constructor &&\n Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object'\n ) {\n params = args[0];\n } else {\n [el, params] = args;\n }\n if (!params) params = {};\n\n params = extend({}, params);\n if (el && !params.el) params.el = el;\n\n if (params.el && $(params.el).length > 1) {\n const swipers = [];\n $(params.el).each((containerEl) => {\n const newParams = extend({}, params, { el: containerEl });\n swipers.push(new Swiper(newParams));\n });\n return swipers;\n }\n\n // Swiper Instance\n const swiper = this;\n swiper.__swiper__ = true;\n swiper.support = getSupport();\n swiper.device = getDevice({ userAgent: params.userAgent });\n swiper.browser = getBrowser();\n\n swiper.eventsListeners = {};\n swiper.eventsAnyListeners = [];\n swiper.modules = [...swiper.__modules__];\n if (params.modules && Array.isArray(params.modules)) {\n swiper.modules.push(...params.modules);\n }\n\n const allModulesParams = {};\n\n swiper.modules.forEach((mod) => {\n mod({\n swiper,\n extendParams: moduleExtendParams(params, allModulesParams),\n on: swiper.on.bind(swiper),\n once: swiper.once.bind(swiper),\n off: swiper.off.bind(swiper),\n emit: swiper.emit.bind(swiper),\n });\n });\n\n // Extend defaults with modules params\n const swiperParams = extend({}, defaults, allModulesParams);\n\n // Extend defaults with passed params\n swiper.params = extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = extend({}, swiper.params);\n swiper.passedParams = extend({}, params);\n\n // add event listeners\n if (swiper.params && swiper.params.on) {\n Object.keys(swiper.params.on).forEach((eventName) => {\n swiper.on(eventName, swiper.params.on[eventName]);\n });\n }\n if (swiper.params && swiper.params.onAny) {\n swiper.onAny(swiper.params.onAny);\n }\n\n // Save Dom lib\n swiper.$ = $;\n\n // Extend Swiper\n Object.assign(swiper, {\n enabled: swiper.params.enabled,\n el,\n\n // Classes\n classNames: [],\n\n // Slides\n slides: $(),\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n\n // isDirection\n isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical() {\n return swiper.params.direction === 'vertical';\n },\n\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n\n //\n isBeginning: true,\n isEnd: false,\n\n // Props\n translate: 0,\n previousTranslate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n\n // Touch Events\n touchEvents: (function touchEvents() {\n const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n\n swiper.touchEventsTouch = {\n start: touch[0],\n move: touch[1],\n end: touch[2],\n cancel: touch[3],\n };\n swiper.touchEventsDesktop = {\n start: desktop[0],\n move: desktop[1],\n end: desktop[2],\n };\n return swiper.support.touch || !swiper.params.simulateTouch\n ? swiper.touchEventsTouch\n : swiper.touchEventsDesktop;\n })(),\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n focusableElements: swiper.params.focusableElements,\n // Last click time\n lastClickTime: now(),\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n isTouchEvent: undefined,\n startMoving: undefined,\n },\n\n // Clicks\n allowClick: true,\n\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0,\n },\n\n // Images\n imagesToLoad: [],\n imagesLoaded: 0,\n });\n\n swiper.emit('_swiper');\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n return swiper;\n }\n\n enable() {\n const swiper = this;\n if (swiper.enabled) return;\n swiper.enabled = true;\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n swiper.emit('enable');\n }\n\n disable() {\n const swiper = this;\n if (!swiper.enabled) return;\n swiper.enabled = false;\n if (swiper.params.grabCursor) {\n swiper.unsetGrabCursor();\n }\n swiper.emit('disable');\n }\n\n setProgress(progress, speed) {\n const swiper = this;\n progress = Math.min(Math.max(progress, 0), 1);\n const min = swiper.minTranslate();\n const max = swiper.maxTranslate();\n const current = (max - min) * progress + min;\n swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n\n emitContainerClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const cls = swiper.el.className.split(' ').filter((className) => {\n return (\n className.indexOf('swiper') === 0 ||\n className.indexOf(swiper.params.containerModifierClass) === 0\n );\n });\n swiper.emit('_containerClasses', cls.join(' '));\n }\n\n getSlideClasses(slideEl) {\n const swiper = this;\n\n return slideEl.className\n .split(' ')\n .filter((className) => {\n return (\n className.indexOf('swiper-slide') === 0 ||\n className.indexOf(swiper.params.slideClass) === 0\n );\n })\n .join(' ');\n }\n\n emitSlidesClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const updates = [];\n swiper.slides.each((slideEl) => {\n const classNames = swiper.getSlideClasses(slideEl);\n updates.push({ slideEl, classNames });\n swiper.emit('_slideClass', slideEl, classNames);\n });\n swiper.emit('_slideClasses', updates);\n }\n\n slidesPerViewDynamic(view = 'current', exact = false) {\n const swiper = this;\n const { params, slides, slidesGrid, slidesSizesGrid, size: swiperSize, activeIndex } = swiper;\n let spv = 1;\n if (params.centeredSlides) {\n let slideSize = slides[activeIndex].swiperSlideSize;\n let breakLoop;\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n } else {\n // eslint-disable-next-line\n if (view === 'current') {\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n const slideInView = exact\n ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize\n : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n } else {\n // previous\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n }\n }\n return spv;\n }\n\n update() {\n const swiper = this;\n if (!swiper || swiper.destroyed) return;\n const { snapGrid, params } = swiper;\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n\n function setTranslate() {\n const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n const newTranslate = Math.min(\n Math.max(translateValue, swiper.maxTranslate()),\n swiper.minTranslate(),\n );\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n let translated;\n if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n setTranslate();\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if (\n (swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.params.centeredSlides\n ) {\n translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n swiper.emit('update');\n }\n\n changeDirection(newDirection, needUpdate = true) {\n const swiper = this;\n const currentDirection = swiper.params.direction;\n if (!newDirection) {\n // eslint-disable-next-line\n newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n }\n if (\n newDirection === currentDirection ||\n (newDirection !== 'horizontal' && newDirection !== 'vertical')\n ) {\n return swiper;\n }\n\n swiper.$el\n .removeClass(`${swiper.params.containerModifierClass}${currentDirection}`)\n .addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n swiper.emitContainerClasses();\n\n swiper.params.direction = newDirection;\n\n swiper.slides.each((slideEl) => {\n if (newDirection === 'vertical') {\n slideEl.style.width = '';\n } else {\n slideEl.style.height = '';\n }\n });\n\n swiper.emit('changeDirection');\n if (needUpdate) swiper.update();\n\n return swiper;\n }\n\n mount(el) {\n const swiper = this;\n if (swiper.mounted) return true;\n\n // Find el\n const $el = $(el || swiper.params.el);\n el = $el[0];\n\n if (!el) {\n return false;\n }\n\n el.swiper = swiper;\n\n const getWrapperSelector = () => {\n return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n };\n\n const getWrapper = () => {\n if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n const res = $(el.shadowRoot.querySelector(getWrapperSelector()));\n // Children needs to return slot items\n res.children = (options) => $el.children(options);\n return res;\n }\n return $el.children(getWrapperSelector());\n };\n // Find Wrapper\n let $wrapperEl = getWrapper();\n if ($wrapperEl.length === 0 && swiper.params.createElements) {\n const document = getDocument();\n const wrapper = document.createElement('div');\n $wrapperEl = $(wrapper);\n wrapper.className = swiper.params.wrapperClass;\n $el.append(wrapper);\n $el.children(`.${swiper.params.slideClass}`).each((slideEl) => {\n $wrapperEl.append(slideEl);\n });\n }\n\n Object.assign(swiper, {\n $el,\n el,\n $wrapperEl,\n wrapperEl: $wrapperEl[0],\n mounted: true,\n\n // RTL\n rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n rtlTranslate:\n swiper.params.direction === 'horizontal' &&\n (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n });\n\n return true;\n }\n\n init(el) {\n const swiper = this;\n if (swiper.initialized) return swiper;\n\n const mounted = swiper.mount(el);\n if (mounted === false) return swiper;\n\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n\n if (swiper.params.watchOverflow) {\n swiper.checkOverflow();\n }\n\n // Set Grab Cursor\n if (swiper.params.grabCursor && swiper.enabled) {\n swiper.setGrabCursor();\n }\n\n if (swiper.params.preloadImages) {\n swiper.preloadImages();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop) {\n swiper.slideTo(\n swiper.params.initialSlide + swiper.loopedSlides,\n 0,\n swiper.params.runCallbacksOnInit,\n false,\n true,\n );\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n }\n\n // Attach events\n swiper.attachEvents();\n\n // Init Flag\n swiper.initialized = true;\n\n // Emit\n swiper.emit('init');\n swiper.emit('afterInit');\n\n return swiper;\n }\n\n destroy(deleteInstance = true, cleanStyles = true) {\n const swiper = this;\n const { params, $el, $wrapperEl, slides } = swiper;\n\n if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n return null;\n }\n\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n $el.removeAttr('style');\n $wrapperEl.removeAttr('style');\n if (slides && slides.length) {\n slides\n .removeClass(\n [\n params.slideVisibleClass,\n params.slideActiveClass,\n params.slideNextClass,\n params.slidePrevClass,\n ].join(' '),\n )\n .removeAttr('style')\n .removeAttr('data-swiper-slide-index');\n }\n }\n\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach((eventName) => {\n swiper.off(eventName);\n });\n\n if (deleteInstance !== false) {\n swiper.$el[0].swiper = null;\n deleteProps(swiper);\n }\n swiper.destroyed = true;\n\n return null;\n }\n\n static extendDefaults(newDefaults) {\n extend(extendedDefaults, newDefaults);\n }\n\n static get extendedDefaults() {\n return extendedDefaults;\n }\n\n static get defaults() {\n return defaults;\n }\n\n static installModule(mod) {\n if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n const modules = Swiper.prototype.__modules__;\n\n if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n modules.push(mod);\n }\n }\n\n static use(module) {\n if (Array.isArray(module)) {\n module.forEach((m) => Swiper.installModule(m));\n return Swiper;\n }\n Swiper.installModule(module);\n return Swiper;\n }\n}\n\nObject.keys(prototypes).forEach((prototypeGroup) => {\n Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n });\n});\n\nSwiper.use([Resize, Observer]);\n\nexport default Swiper;\n","import $ from '../../shared/dom.js';\nimport { setCSSProperty } from '../../shared/utils.js';\n\nexport default function Virtual({ swiper, extendParams, on }) {\n extendParams({\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n renderExternalUpdate: true,\n addSlidesBefore: 0,\n addSlidesAfter: 0,\n },\n });\n\n let cssModeTimeout;\n\n swiper.virtual = {\n cache: {},\n from: undefined,\n to: undefined,\n slides: [],\n offset: 0,\n slidesGrid: [],\n };\n\n function renderSlide(slide, index) {\n const params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n const $slideEl = params.renderSlide\n ? $(params.renderSlide.call(swiper, slide, index))\n : $(\n `
${slide}
`,\n );\n if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);\n if (params.cache) swiper.virtual.cache[index] = $slideEl;\n return $slideEl;\n }\n\n function update(force) {\n const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params;\n const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual;\n const {\n from: previousFrom,\n to: previousTo,\n slides,\n slidesGrid: previousSlidesGrid,\n offset: previousOffset,\n } = swiper.virtual;\n if (!swiper.params.cssMode) {\n swiper.updateActiveIndex();\n }\n\n const activeIndex = swiper.activeIndex || 0;\n\n let offsetProp;\n if (swiper.rtlTranslate) offsetProp = 'right';\n else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n\n let slidesAfter;\n let slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;\n slidesBefore = slidesPerGroup + addSlidesBefore;\n }\n const from = Math.max((activeIndex || 0) - slidesBefore, 0);\n const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n Object.assign(swiper.virtual, {\n from,\n to,\n offset,\n slidesGrid: swiper.slidesGrid,\n });\n\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.lazy && swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n }\n\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.css(offsetProp, `${offset}px`);\n }\n swiper.updateProgress();\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset,\n from,\n to,\n slides: (function getSlides() {\n const slidesToRender = [];\n for (let i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n })(),\n });\n if (swiper.params.virtual.renderExternalUpdate) {\n onRendered();\n }\n return;\n }\n const prependIndexes = [];\n const appendIndexes = [];\n if (force) {\n swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove();\n } else {\n for (let i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n swiper.$wrapperEl\n .find(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${i}\"]`)\n .remove();\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n if (i >= from && i <= to) {\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(i);\n } else {\n if (i > previousTo) appendIndexes.push(i);\n if (i < previousFrom) prependIndexes.push(i);\n }\n }\n }\n appendIndexes.forEach((index) => {\n swiper.$wrapperEl.append(renderSlide(slides[index], index));\n });\n prependIndexes\n .sort((a, b) => b - a)\n .forEach((index) => {\n swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n });\n swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`);\n onRendered();\n }\n\n function appendSlide(slides) {\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.push(slides[i]);\n }\n } else {\n swiper.virtual.slides.push(slides);\n }\n update(true);\n }\n function prependSlide(slides) {\n const activeIndex = swiper.activeIndex;\n let newActiveIndex = activeIndex + 1;\n let numberOfNewSlides = 1;\n\n if (Array.isArray(slides)) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n numberOfNewSlides = slides.length;\n } else {\n swiper.virtual.slides.unshift(slides);\n }\n if (swiper.params.virtual.cache) {\n const cache = swiper.virtual.cache;\n const newCache = {};\n Object.keys(cache).forEach((cachedIndex) => {\n const $cachedEl = cache[cachedIndex];\n const cachedElIndex = $cachedEl.attr('data-swiper-slide-index');\n if (cachedElIndex) {\n $cachedEl.attr(\n 'data-swiper-slide-index',\n parseInt(cachedElIndex, 10) + numberOfNewSlides,\n );\n }\n newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;\n });\n swiper.virtual.cache = newCache;\n }\n update(true);\n swiper.slideTo(newActiveIndex, 0);\n }\n function removeSlide(slidesIndexes) {\n if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n let activeIndex = swiper.activeIndex;\n if (Array.isArray(slidesIndexes)) {\n for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n swiper.virtual.slides.splice(slidesIndexes[i], 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes[i]];\n }\n if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n } else {\n swiper.virtual.slides.splice(slidesIndexes, 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes];\n }\n if (slidesIndexes < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n update(true);\n swiper.slideTo(activeIndex, 0);\n }\n function removeAllSlides() {\n swiper.virtual.slides = [];\n if (swiper.params.virtual.cache) {\n swiper.virtual.cache = {};\n }\n update(true);\n swiper.slideTo(0, 0);\n }\n\n on('beforeInit', () => {\n if (!swiper.params.virtual.enabled) return;\n swiper.virtual.slides = swiper.params.virtual.slides;\n swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n\n if (!swiper.params.initialSlide) {\n update();\n }\n });\n on('setTranslate', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode && !swiper._immediateVirtual) {\n clearTimeout(cssModeTimeout);\n cssModeTimeout = setTimeout(() => {\n update();\n }, 100);\n } else {\n update();\n }\n });\n on('init update resize', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n }\n });\n\n Object.assign(swiper.virtual, {\n appendSlide,\n prependSlide,\n removeSlide,\n removeAllSlides,\n update,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Keyboard({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n const window = getWindow();\n swiper.keyboard = {\n enabled: false,\n };\n extendParams({\n keyboard: {\n enabled: false,\n onlyInViewport: true,\n pageUpDown: true,\n },\n });\n\n function handle(event) {\n if (!swiper.enabled) return;\n\n const { rtlTranslate: rtl } = swiper;\n let e = event;\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n const kc = e.keyCode || e.charCode;\n const pageUpDown = swiper.params.keyboard.pageUpDown;\n const isPageUp = pageUpDown && kc === 33;\n const isPageDown = pageUpDown && kc === 34;\n const isArrowLeft = kc === 37;\n const isArrowRight = kc === 39;\n const isArrowUp = kc === 38;\n const isArrowDown = kc === 40;\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n ((swiper.isHorizontal() && isArrowRight) ||\n (swiper.isVertical() && isArrowDown) ||\n isPageDown)\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n ((swiper.isHorizontal() && isArrowLeft) || (swiper.isVertical() && isArrowUp) || isPageUp)\n ) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (\n document.activeElement &&\n document.activeElement.nodeName &&\n (document.activeElement.nodeName.toLowerCase() === 'input' ||\n document.activeElement.nodeName.toLowerCase() === 'textarea')\n ) {\n return undefined;\n }\n if (\n swiper.params.keyboard.onlyInViewport &&\n (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)\n ) {\n let inView = false;\n // Check that swiper should be inside of visible area of window\n if (\n swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 &&\n swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0\n ) {\n return undefined;\n }\n\n const $el = swiper.$el;\n const swiperWidth = $el[0].clientWidth;\n const swiperHeight = $el[0].clientHeight;\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const swiperOffset = swiper.$el.offset();\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiperWidth, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiperHeight],\n [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n if (!inView) return undefined;\n }\n if (swiper.isHorizontal()) {\n if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (((isPageDown || isArrowRight) && !rtl) || ((isPageUp || isArrowLeft) && rtl))\n swiper.slideNext();\n if (((isPageUp || isArrowLeft) && !rtl) || ((isPageDown || isArrowRight) && rtl))\n swiper.slidePrev();\n } else {\n if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (isPageDown || isArrowDown) swiper.slideNext();\n if (isPageUp || isArrowUp) swiper.slidePrev();\n }\n emit('keyPress', kc);\n return undefined;\n }\n function enable() {\n if (swiper.keyboard.enabled) return;\n $(document).on('keydown', handle);\n swiper.keyboard.enabled = true;\n }\n function disable() {\n if (!swiper.keyboard.enabled) return;\n $(document).off('keydown', handle);\n swiper.keyboard.enabled = false;\n }\n\n on('init', () => {\n if (swiper.params.keyboard.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n if (swiper.keyboard.enabled) {\n disable();\n }\n });\n\n Object.assign(swiper.keyboard, {\n enable,\n disable,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now, nextTick } from '../../shared/utils.js';\n\nexport default function Mousewheel({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n\n extendParams({\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarget: 'container',\n thresholdDelta: null,\n thresholdTime: null,\n },\n });\n\n swiper.mousewheel = {\n enabled: false,\n };\n\n let timeout;\n let lastScrollTime = now();\n let lastEventBeforeSnap;\n const recentWheelEvents = [];\n\n function normalize(e) {\n // Reasonable defaults\n const PIXEL_STEP = 10;\n const LINE_HEIGHT = 40;\n const PAGE_HEIGHT = 800;\n\n let sX = 0;\n let sY = 0; // spinX, spinY\n let pX = 0;\n let pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n\n if (e.shiftKey && !pX) {\n // if user scrolls with shift he wants horizontal scroll\n pX = pY;\n pY = 0;\n }\n\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) {\n // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else {\n // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = pX < 1 ? -1 : 1;\n }\n if (pY && !sY) {\n sY = pY < 1 ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY,\n };\n }\n function handleMouseEnter() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = true;\n }\n function handleMouseLeave() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = false;\n }\n function animateSlider(newEvent) {\n if (\n swiper.params.mousewheel.thresholdDelta &&\n newEvent.delta < swiper.params.mousewheel.thresholdDelta\n ) {\n // Prevent if delta of wheel scroll delta is below configured threshold\n return false;\n }\n\n if (\n swiper.params.mousewheel.thresholdTime &&\n now() - lastScrollTime < swiper.params.mousewheel.thresholdTime\n ) {\n // Prevent if time between scrolls is below configured threshold\n return false;\n }\n\n // If the movement is NOT big enough and\n // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n // Don't go any further (avoid insignificant scroll movement).\n if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n // Return false as a default\n return true;\n }\n // If user is scrolling towards the end:\n // If the slider hasn't hit the latest slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to next slide and\n // emit a scroll event.\n // Else (the user is scrolling towards the beginning) and\n // if the slider hasn't hit the first slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to prev slide and\n // emit a scroll event.\n if (newEvent.direction < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n emit('scroll', newEvent.raw);\n }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n emit('scroll', newEvent.raw);\n }\n // If you got here is because an animation has been triggered so store the current time\n lastScrollTime = new window.Date().getTime();\n // Return false as a default\n return false;\n }\n function releaseScroll(newEvent) {\n const params = swiper.params.mousewheel;\n if (newEvent.direction < 0) {\n if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n return false;\n }\n function handle(event) {\n let e = event;\n let disableParentSwiper = true;\n if (!swiper.enabled) return;\n const params = swiper.params.mousewheel;\n\n if (swiper.params.cssMode) {\n e.preventDefault();\n }\n\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges)\n return true;\n\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n let delta = 0;\n const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n const data = normalize(e);\n\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;\n else return true;\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;\n else return true;\n } else {\n delta =\n Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n\n if (delta === 0) return true;\n\n if (params.invert) delta = -delta;\n\n // Get the scroll positions\n let positions = swiper.getTranslate() + delta * params.sensitivity;\n\n if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n // When loop is true:\n // the disableParentSwiper will be true.\n // When loop is false:\n // if the scroll positions is not on edge,\n // then the disableParentSwiper will be true.\n // if the scroll on edge positions,\n // then the disableParentSwiper will be false.\n disableParentSwiper = swiper.params.loop\n ? true\n : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n\n if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n\n if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n // Register the new event in a variable which stores the relevant data\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n raw: event,\n };\n\n // Keep the most recent events\n if (recentWheelEvents.length >= 2) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n recentWheelEvents.push(newEvent);\n\n // If there is at least one previous recorded event:\n // If direction has changed or\n // if the scroll is quicker than the previous one:\n // Animate the slider.\n // Else (this is the first time the wheel is moved):\n // Animate the slider.\n if (prevEvent) {\n if (\n newEvent.direction !== prevEvent.direction ||\n newEvent.delta > prevEvent.delta ||\n newEvent.time > prevEvent.time + 150\n ) {\n animateSlider(newEvent);\n }\n } else {\n animateSlider(newEvent);\n }\n\n // If it's time to release the scroll:\n // Return now so you don't hit the preventDefault.\n if (releaseScroll(newEvent)) {\n return true;\n }\n } else {\n // Freemode or scrollContainer:\n\n // If we recently snapped after a momentum scroll, then ignore wheel events\n // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n // or if it's a new scroll (larger delta or inverse sign as last event before\n // an end-of-momentum snap).\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n };\n const ignoreWheelEvents =\n lastEventBeforeSnap &&\n newEvent.time < lastEventBeforeSnap.time + 500 &&\n newEvent.delta <= lastEventBeforeSnap.delta &&\n newEvent.direction === lastEventBeforeSnap.direction;\n if (!ignoreWheelEvents) {\n lastEventBeforeSnap = undefined;\n\n if (swiper.params.loop) {\n swiper.loopFix();\n }\n let position = swiper.getTranslate() + delta * params.sensitivity;\n const wasBeginning = swiper.isBeginning;\n const wasEnd = swiper.isEnd;\n\n if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n swiper.updateSlidesClasses();\n }\n\n if (swiper.params.freeMode.sticky) {\n // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n // the end of a momentum scroll by storing recent (N=15?) wheel events.\n // 1. do all N events have decreasing or same (absolute value) delta?\n // 2. did all N events arrive in the last M (M=500?) msecs?\n // 3. does the earliest event have an (absolute value) delta that's\n // at least P (P=1?) larger than the most recent event's delta?\n // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n // Snap immediately and ignore remaining wheel events in this scroll.\n // See comment above for \"remaining wheel events in this scroll\" determination.\n // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n clearTimeout(timeout);\n timeout = undefined;\n if (recentWheelEvents.length >= 15) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n const firstEvent = recentWheelEvents[0];\n recentWheelEvents.push(newEvent);\n if (\n prevEvent &&\n (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)\n ) {\n // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n recentWheelEvents.splice(0);\n } else if (\n recentWheelEvents.length >= 15 &&\n newEvent.time - firstEvent.time < 500 &&\n firstEvent.delta - newEvent.delta >= 1 &&\n newEvent.delta <= 6\n ) {\n // We're at the end of the deceleration of a momentum scroll, so there's no need\n // to wait for more events. Snap ASAP on the next tick.\n // Also, because there's some remaining momentum we'll bias the snap in the\n // direction of the ongoing scroll because it's better UX for the scroll to snap\n // in the same direction as the scroll instead of reversing to snap. Therefore,\n // if it's already scrolled more than 20% in the current direction, keep going.\n const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n timeout = nextTick(() => {\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 0); // no delay; move on next tick\n }\n if (!timeout) {\n // if we get here, then we haven't detected the end of a momentum scroll, so\n // we'll consider a scroll \"complete\" when there haven't been any wheel events\n // for 500ms.\n timeout = nextTick(() => {\n const snapToThreshold = 0.5;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 500);\n }\n }\n\n // Emit event\n if (!ignoreWheelEvents) emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction)\n swiper.autoplay.stop();\n // Return page scroll on edge positions\n if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;\n }\n }\n\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n return false;\n }\n\n function events(method) {\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n target[method]('mouseenter', handleMouseEnter);\n target[method]('mouseleave', handleMouseLeave);\n target[method]('wheel', handle);\n }\n\n function enable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.removeEventListener('wheel', handle);\n return true;\n }\n if (swiper.mousewheel.enabled) return false;\n events('on');\n swiper.mousewheel.enabled = true;\n return true;\n }\n function disable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.addEventListener(event, handle);\n return true;\n }\n if (!swiper.mousewheel.enabled) return false;\n events('off');\n swiper.mousewheel.enabled = false;\n return true;\n }\n\n on('init', () => {\n if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n disable();\n }\n if (swiper.params.mousewheel.enabled) enable();\n });\n on('destroy', () => {\n if (swiper.params.cssMode) {\n enable();\n }\n if (swiper.mousewheel.enabled) disable();\n });\n\n Object.assign(swiper.mousewheel, {\n enable,\n disable,\n });\n}\n","import { getDocument } from 'ssr-window';\n\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n const document = getDocument();\n if (swiper.params.createElements) {\n Object.keys(checkProps).forEach((key) => {\n if (!params[key] && params.auto === true) {\n let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n if (!element) {\n element = document.createElement('div');\n element.className = checkProps[key];\n swiper.$el.append(element);\n }\n params[key] = element;\n originalParams[key] = element;\n }\n });\n }\n return params;\n}\n","import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Navigation({ swiper, extendParams, on, emit }) {\n extendParams({\n navigation: {\n nextEl: null,\n prevEl: null,\n\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n lockClass: 'swiper-button-lock',\n },\n });\n\n swiper.navigation = {\n nextEl: null,\n $nextEl: null,\n prevEl: null,\n $prevEl: null,\n };\n\n function getEl(el) {\n let $el;\n if (el) {\n $el = $(el);\n if (\n swiper.params.uniqueNavElements &&\n typeof el === 'string' &&\n $el.length > 1 &&\n swiper.$el.find(el).length === 1\n ) {\n $el = swiper.$el.find(el);\n }\n }\n return $el;\n }\n\n function toggleEl($el, disabled) {\n const params = swiper.params.navigation;\n if ($el && $el.length > 0) {\n $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n }\n function update() {\n // Update Navigation Buttons\n if (swiper.params.loop) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n toggleEl($prevEl, swiper.isBeginning);\n toggleEl($nextEl, swiper.isEnd);\n }\n function onPrevClick(e) {\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop) return;\n swiper.slidePrev();\n }\n function onNextClick(e) {\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop) return;\n swiper.slideNext();\n }\n function init() {\n const params = swiper.params.navigation;\n\n swiper.params.navigation = createElementIfNotDefined(\n swiper,\n swiper.originalParams.navigation,\n swiper.params.navigation,\n {\n nextEl: 'swiper-button-next',\n prevEl: 'swiper-button-prev',\n },\n );\n if (!(params.nextEl || params.prevEl)) return;\n\n const $nextEl = getEl(params.nextEl);\n const $prevEl = getEl(params.prevEl);\n\n if ($nextEl && $nextEl.length > 0) {\n $nextEl.on('click', onNextClick);\n }\n if ($prevEl && $prevEl.length > 0) {\n $prevEl.on('click', onPrevClick);\n }\n\n Object.assign(swiper.navigation, {\n $nextEl,\n nextEl: $nextEl && $nextEl[0],\n $prevEl,\n prevEl: $prevEl && $prevEl[0],\n });\n\n if (!swiper.enabled) {\n if ($nextEl) $nextEl.addClass(params.lockClass);\n if ($prevEl) $prevEl.addClass(params.lockClass);\n }\n }\n function destroy() {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl && $nextEl.length) {\n $nextEl.off('click', onNextClick);\n $nextEl.removeClass(swiper.params.navigation.disabledClass);\n }\n if ($prevEl && $prevEl.length) {\n $prevEl.off('click', onPrevClick);\n $prevEl.removeClass(swiper.params.navigation.disabledClass);\n }\n }\n\n on('init', () => {\n init();\n update();\n });\n on('toEdge fromEdge lock unlock', () => {\n update();\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl) {\n $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n if ($prevEl) {\n $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n });\n on('click', (_s, e) => {\n const { $nextEl, $prevEl } = swiper.navigation;\n const targetEl = e.target;\n if (\n swiper.params.navigation.hideOnClick &&\n !$(targetEl).is($prevEl) &&\n !$(targetEl).is($nextEl)\n ) {\n if (\n swiper.pagination &&\n swiper.params.pagination &&\n swiper.params.pagination.clickable &&\n (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))\n )\n return;\n let isHidden;\n if ($nextEl) {\n isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n } else if ($prevEl) {\n isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n }\n if (isHidden === true) {\n emit('navigationShow');\n } else {\n emit('navigationHide');\n }\n if ($nextEl) {\n $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n if ($prevEl) {\n $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n }\n });\n\n Object.assign(swiper.navigation, {\n update,\n init,\n destroy,\n });\n}\n","export default function classesToSelector(classes = '') {\n return `.${classes\n .trim()\n .replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n .replace(/ /g, '.')}`;\n}\n","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Pagination({ swiper, extendParams, on, emit }) {\n const pfx = 'swiper-pagination';\n extendParams({\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n progressbarOpposite: false,\n type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n dynamicMainBullets: 1,\n formatFractionCurrent: (number) => number,\n formatFractionTotal: (number) => number,\n bulletClass: `${pfx}-bullet`,\n bulletActiveClass: `${pfx}-bullet-active`,\n modifierClass: `${pfx}-`,\n currentClass: `${pfx}-current`,\n totalClass: `${pfx}-total`,\n hiddenClass: `${pfx}-hidden`,\n progressbarFillClass: `${pfx}-progressbar-fill`,\n progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n clickableClass: `${pfx}-clickable`,\n lockClass: `${pfx}-lock`,\n horizontalClass: `${pfx}-horizontal`,\n verticalClass: `${pfx}-vertical`,\n },\n });\n\n swiper.pagination = {\n el: null,\n $el: null,\n bullets: [],\n };\n\n let bulletSize;\n let dynamicBulletIndex = 0;\n\n function isPaginationDisabled() {\n return (\n !swiper.params.pagination.el ||\n !swiper.pagination.el ||\n !swiper.pagination.$el ||\n swiper.pagination.$el.length === 0\n );\n }\n\n function setSideBullets($bulletEl, position) {\n const { bulletActiveClass } = swiper.params.pagination;\n $bulletEl[position]()\n .addClass(`${bulletActiveClass}-${position}`)\n [position]()\n .addClass(`${bulletActiveClass}-${position}-${position}`);\n }\n\n function update() {\n // Render || Update Pagination bullets/items\n const rtl = swiper.rtl;\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n const $el = swiper.pagination.$el;\n // Current/Total\n let current;\n const total = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (swiper.params.loop) {\n current = Math.ceil(\n (swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup,\n );\n if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n current -= slidesLength - swiper.loopedSlides * 2;\n }\n if (current > total - 1) current -= total;\n if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n } else {\n current = swiper.activeIndex || 0;\n }\n // Types\n if (\n params.type === 'bullets' &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length > 0\n ) {\n const bullets = swiper.pagination.bullets;\n let firstIndex;\n let lastIndex;\n let midIndex;\n if (params.dynamicBullets) {\n bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n $el.css(\n swiper.isHorizontal() ? 'width' : 'height',\n `${bulletSize * (params.dynamicMainBullets + 4)}px`,\n );\n if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n dynamicBulletIndex += current - swiper.previousIndex;\n if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n dynamicBulletIndex = params.dynamicMainBullets - 1;\n } else if (dynamicBulletIndex < 0) {\n dynamicBulletIndex = 0;\n }\n }\n firstIndex = current - dynamicBulletIndex;\n lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n midIndex = (lastIndex + firstIndex) / 2;\n }\n bullets.removeClass(\n ['', '-next', '-next-next', '-prev', '-prev-prev', '-main']\n .map((suffix) => `${params.bulletActiveClass}${suffix}`)\n .join(' '),\n );\n if ($el.length > 1) {\n bullets.each((bullet) => {\n const $bullet = $(bullet);\n const bulletIndex = $bullet.index();\n if (bulletIndex === current) {\n $bullet.addClass(params.bulletActiveClass);\n }\n if (params.dynamicBullets) {\n if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n $bullet.addClass(`${params.bulletActiveClass}-main`);\n }\n if (bulletIndex === firstIndex) {\n setSideBullets($bullet, 'prev');\n }\n if (bulletIndex === lastIndex) {\n setSideBullets($bullet, 'next');\n }\n }\n });\n } else {\n const $bullet = bullets.eq(current);\n const bulletIndex = $bullet.index();\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n const $firstDisplayedBullet = bullets.eq(firstIndex);\n const $lastDisplayedBullet = bullets.eq(lastIndex);\n for (let i = firstIndex; i <= lastIndex; i += 1) {\n bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n }\n if (swiper.params.loop) {\n if (bulletIndex >= bullets.length - params.dynamicMainBullets) {\n for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n }\n bullets\n .eq(bullets.length - params.dynamicMainBullets - 1)\n .addClass(`${params.bulletActiveClass}-prev`);\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n }\n }\n if (params.dynamicBullets) {\n const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n const bulletsOffset =\n (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n const offsetProp = rtl ? 'right' : 'left';\n bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n }\n }\n if (params.type === 'fraction') {\n $el\n .find(classesToSelector(params.currentClass))\n .text(params.formatFractionCurrent(current + 1));\n $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n }\n if (params.type === 'progressbar') {\n let progressbarDirection;\n if (params.progressbarOpposite) {\n progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n } else {\n progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n }\n const scale = (current + 1) / total;\n let scaleX = 1;\n let scaleY = 1;\n if (progressbarDirection === 'horizontal') {\n scaleX = scale;\n } else {\n scaleY = scale;\n }\n $el\n .find(classesToSelector(params.progressbarFillClass))\n .transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`)\n .transition(swiper.params.speed);\n }\n if (params.type === 'custom' && params.renderCustom) {\n $el.html(params.renderCustom(swiper, current + 1, total));\n emit('paginationRender', $el[0]);\n } else {\n emit('paginationUpdate', $el[0]);\n }\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n function render() {\n // Render Container\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n\n const $el = swiper.pagination.$el;\n let paginationHTML = '';\n if (params.type === 'bullets') {\n let numberOfBullets = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.loop &&\n numberOfBullets > slidesLength\n ) {\n numberOfBullets = slidesLength;\n }\n for (let i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\">`;\n }\n }\n $el.html(paginationHTML);\n\n swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML =\n `` +\n ' / ' +\n ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type !== 'custom') {\n emit('paginationRender', swiper.pagination.$el[0]);\n }\n }\n function init() {\n swiper.params.pagination = createElementIfNotDefined(\n swiper,\n swiper.originalParams.pagination,\n swiper.params.pagination,\n { el: 'swiper-pagination' },\n );\n const params = swiper.params.pagination;\n if (!params.el) return;\n\n let $el = $(params.el);\n if ($el.length === 0) return;\n\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n $el = swiper.$el.find(params.el);\n // check if it belongs to another nested Swiper\n if ($el.length > 1) {\n $el = $el.filter((el) => {\n if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n return true;\n });\n }\n }\n\n if (params.type === 'bullets' && params.clickable) {\n $el.addClass(params.clickableClass);\n }\n\n $el.addClass(params.modifierClass + params.type);\n $el.addClass(params.modifierClass + swiper.params.direction);\n\n if (params.type === 'bullets' && params.dynamicBullets) {\n $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n dynamicBulletIndex = 0;\n if (params.dynamicMainBullets < 1) {\n params.dynamicMainBullets = 1;\n }\n }\n if (params.type === 'progressbar' && params.progressbarOpposite) {\n $el.addClass(params.progressbarOppositeClass);\n }\n\n if (params.clickable) {\n $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n e.preventDefault();\n let index = $(this).index() * swiper.params.slidesPerGroup;\n if (swiper.params.loop) index += swiper.loopedSlides;\n swiper.slideTo(index);\n });\n }\n\n Object.assign(swiper.pagination, {\n $el,\n el: $el[0],\n });\n\n if (!swiper.enabled) {\n $el.addClass(params.lockClass);\n }\n }\n function destroy() {\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const $el = swiper.pagination.$el;\n\n $el.removeClass(params.hiddenClass);\n $el.removeClass(params.modifierClass + params.type);\n $el.removeClass(params.modifierClass + swiper.params.direction);\n if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass)\n swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n if (params.clickable) {\n $el.off('click', classesToSelector(params.bulletClass));\n }\n }\n\n on('init', () => {\n init();\n render();\n update();\n });\n on('activeIndexChange', () => {\n if (swiper.params.loop) {\n update();\n } else if (typeof swiper.snapIndex === 'undefined') {\n update();\n }\n });\n on('snapIndexChange', () => {\n if (!swiper.params.loop) {\n update();\n }\n });\n on('slidesLengthChange', () => {\n if (swiper.params.loop) {\n render();\n update();\n }\n });\n on('snapGridLengthChange', () => {\n if (!swiper.params.loop) {\n render();\n update();\n }\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $el } = swiper.pagination;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n }\n });\n on('lock unlock', () => {\n update();\n });\n on('click', (_s, e) => {\n const targetEl = e.target;\n const { $el } = swiper.pagination;\n if (\n swiper.params.pagination.el &&\n swiper.params.pagination.hideOnClick &&\n $el.length > 0 &&\n !$(targetEl).hasClass(swiper.params.pagination.bulletClass)\n ) {\n if (\n swiper.navigation &&\n ((swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) ||\n (swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl))\n )\n return;\n const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n if (isHidden === true) {\n emit('paginationShow');\n } else {\n emit('paginationHide');\n }\n $el.toggleClass(swiper.params.pagination.hiddenClass);\n }\n });\n\n Object.assign(swiper.pagination, {\n render,\n update,\n init,\n destroy,\n });\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Scrollbar({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n\n let isTouched = false;\n let timeout = null;\n let dragTimeout = null;\n let dragStartPos;\n let dragSize;\n let trackSize;\n let divider;\n\n extendParams({\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n lockClass: 'swiper-scrollbar-lock',\n dragClass: 'swiper-scrollbar-drag',\n },\n });\n\n swiper.scrollbar = {\n el: null,\n dragEl: null,\n $el: null,\n $dragEl: null,\n };\n\n function setTranslate() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n const { scrollbar, rtlTranslate: rtl, progress } = swiper;\n const { $dragEl, $el } = scrollbar;\n const params = swiper.params.scrollbar;\n\n let newSize = dragSize;\n let newPos = (trackSize - dragSize) * progress;\n if (rtl) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n $dragEl.transform(`translate3d(${newPos}px, 0, 0)`);\n $dragEl[0].style.width = `${newSize}px`;\n } else {\n $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n $dragEl[0].style.height = `${newSize}px`;\n }\n if (params.hide) {\n clearTimeout(timeout);\n $el[0].style.opacity = 1;\n timeout = setTimeout(() => {\n $el[0].style.opacity = 0;\n $el.transition(400);\n }, 1000);\n }\n }\n function setTransition(duration) {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n swiper.scrollbar.$dragEl.transition(duration);\n }\n function updateSize() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n\n const { scrollbar } = swiper;\n const { $dragEl, $el } = scrollbar;\n\n $dragEl[0].style.width = '';\n $dragEl[0].style.height = '';\n trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n divider =\n swiper.size /\n (swiper.virtualSize +\n swiper.params.slidesOffsetBefore -\n (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n\n if (swiper.isHorizontal()) {\n $dragEl[0].style.width = `${dragSize}px`;\n } else {\n $dragEl[0].style.height = `${dragSize}px`;\n }\n\n if (divider >= 1) {\n $el[0].style.display = 'none';\n } else {\n $el[0].style.display = '';\n }\n if (swiper.params.scrollbar.hide) {\n $el[0].style.opacity = 0;\n }\n\n if (swiper.params.watchOverflow && swiper.enabled) {\n scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](\n swiper.params.scrollbar.lockClass,\n );\n }\n }\n function getPointerPosition(e) {\n if (swiper.isHorizontal()) {\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientX\n : e.clientX;\n }\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientY\n : e.clientY;\n }\n function setDragPosition(e) {\n const { scrollbar, rtlTranslate: rtl } = swiper;\n const { $el } = scrollbar;\n\n let positionRatio;\n positionRatio =\n (getPointerPosition(e) -\n $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] -\n (dragStartPos !== null ? dragStartPos : dragSize / 2)) /\n (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (rtl) {\n positionRatio = 1 - positionRatio;\n }\n\n const position =\n swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n function onDragStart(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n isTouched = true;\n dragStartPos =\n e.target === $dragEl[0] || e.target === $dragEl\n ? getPointerPosition(e) -\n e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top']\n : null;\n e.preventDefault();\n e.stopPropagation();\n\n $wrapperEl.transition(100);\n $dragEl.transition(100);\n setDragPosition(e);\n\n clearTimeout(dragTimeout);\n\n $el.transition(0);\n if (params.hide) {\n $el.css('opacity', 1);\n }\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', 'none');\n }\n emit('scrollbarDragStart', e);\n }\n function onDragMove(e) {\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n\n if (!isTouched) return;\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n setDragPosition(e);\n $wrapperEl.transition(0);\n $el.transition(0);\n $dragEl.transition(0);\n emit('scrollbarDragMove', e);\n }\n function onDragEnd(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el } = scrollbar;\n\n if (!isTouched) return;\n isTouched = false;\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', '');\n $wrapperEl.transition('');\n }\n if (params.hide) {\n clearTimeout(dragTimeout);\n dragTimeout = nextTick(() => {\n $el.css('opacity', 0);\n $el.transition(400);\n }, 1000);\n }\n emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideToClosest();\n }\n }\n\n function events(method) {\n const { scrollbar, touchEventsTouch, touchEventsDesktop, params, support } = swiper;\n const $el = scrollbar.$el;\n const target = $el[0];\n const activeListener =\n support.passiveListener && params.passiveListeners\n ? { passive: false, capture: false }\n : false;\n const passiveListener =\n support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n if (!target) return;\n const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n if (!support.touch) {\n target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n } else {\n target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n }\n }\n\n function enableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('on');\n }\n function disableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('off');\n }\n function init() {\n const { scrollbar, $el: $swiperEl } = swiper;\n swiper.params.scrollbar = createElementIfNotDefined(\n swiper,\n swiper.originalParams.scrollbar,\n swiper.params.scrollbar,\n { el: 'swiper-scrollbar' },\n );\n const params = swiper.params.scrollbar;\n if (!params.el) return;\n\n let $el = $(params.el);\n if (\n swiper.params.uniqueNavElements &&\n typeof params.el === 'string' &&\n $el.length > 1 &&\n $swiperEl.find(params.el).length === 1\n ) {\n $el = $swiperEl.find(params.el);\n }\n\n let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n if ($dragEl.length === 0) {\n $dragEl = $(`
`);\n $el.append($dragEl);\n }\n\n Object.assign(scrollbar, {\n $el,\n el: $el[0],\n $dragEl,\n dragEl: $dragEl[0],\n });\n\n if (params.draggable) {\n enableDraggable();\n }\n\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n }\n function destroy() {\n disableDraggable();\n }\n\n on('init', () => {\n init();\n updateSize();\n setTranslate();\n });\n on('update resize observerUpdate lock unlock', () => {\n updateSize();\n });\n on('setTranslate', () => {\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n setTransition(duration);\n });\n on('enable disable', () => {\n const { $el } = swiper.scrollbar;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n });\n on('destroy', () => {\n destroy();\n });\n\n Object.assign(swiper.scrollbar, {\n updateSize,\n setTranslate,\n init,\n destroy,\n });\n}\n","import $ from '../../shared/dom.js';\n\nexport default function Parallax({ swiper, extendParams, on }) {\n extendParams({\n parallax: {\n enabled: false,\n },\n });\n\n const setTransform = (el, progress) => {\n const { rtl } = swiper;\n\n const $el = $(el);\n const rtlFactor = rtl ? -1 : 1;\n\n const p = $el.attr('data-swiper-parallax') || '0';\n let x = $el.attr('data-swiper-parallax-x');\n let y = $el.attr('data-swiper-parallax-y');\n const scale = $el.attr('data-swiper-parallax-scale');\n const opacity = $el.attr('data-swiper-parallax-opacity');\n\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n\n if (x.indexOf('%') >= 0) {\n x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n } else {\n x = `${x * progress * rtlFactor}px`;\n }\n if (y.indexOf('%') >= 0) {\n y = `${parseInt(y, 10) * progress}%`;\n } else {\n y = `${y * progress}px`;\n }\n\n if (typeof opacity !== 'undefined' && opacity !== null) {\n const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n $el[0].style.opacity = currentOpacity;\n }\n if (typeof scale === 'undefined' || scale === null) {\n $el.transform(`translate3d(${x}, ${y}, 0px)`);\n } else {\n const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`);\n }\n };\n\n const setTranslate = () => {\n const { $el, slides, progress, snapGrid } = swiper;\n $el\n .children(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, progress);\n });\n slides.each((slideEl, slideIndex) => {\n let slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n $(slideEl)\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, slideProgress);\n });\n });\n };\n\n const setTransition = (duration = swiper.params.speed) => {\n const { $el } = swiper;\n $el\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((parallaxEl) => {\n const $parallaxEl = $(parallaxEl);\n let parallaxDuration =\n parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) parallaxDuration = 0;\n $parallaxEl.transition(parallaxDuration);\n });\n };\n\n on('beforeInit', () => {\n if (!swiper.params.parallax.enabled) return;\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n });\n on('init', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTranslate', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTransition', (_swiper, duration) => {\n if (!swiper.params.parallax.enabled) return;\n setTransition(duration);\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { getTranslate } from '../../shared/utils.js';\n\nexport default function Zoom({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n extendParams({\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed',\n },\n });\n\n swiper.zoom = {\n enabled: false,\n };\n\n let currentScale = 1;\n let isScaling = false;\n let gesturesEnabled;\n let fakeGestureTouched;\n let fakeGestureMoved;\n const gesture = {\n $slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n $imageEl: undefined,\n $imageWrapEl: undefined,\n maxRatio: 3,\n };\n const image = {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {},\n };\n const velocity = {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined,\n };\n\n let scale = 1;\n Object.defineProperty(swiper.zoom, 'scale', {\n get() {\n return scale;\n },\n set(value) {\n if (scale !== value) {\n const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined;\n const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined;\n emit('zoomChange', value, imageEl, slideEl);\n }\n scale = value;\n },\n });\n\n function getDistanceBetweenTouches(e) {\n if (e.targetTouches.length < 2) return 1;\n const x1 = e.targetTouches[0].pageX;\n const y1 = e.targetTouches[0].pageY;\n const x2 = e.targetTouches[1].pageX;\n const y2 = e.targetTouches[1].pageY;\n const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n return distance;\n }\n\n // Events\n function onGestureStart(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n if (!support.gestures) {\n if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureTouched = true;\n gesture.scaleStart = getDistanceBetweenTouches(e);\n }\n if (!gesture.$slideEl || !gesture.$slideEl.length) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (gesture.$imageWrapEl.length === 0) {\n gesture.$imageEl = undefined;\n return;\n }\n }\n if (gesture.$imageEl) {\n gesture.$imageEl.transition(0);\n }\n isScaling = true;\n }\n function onGestureChange(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureMoved = true;\n gesture.scaleMove = getDistanceBetweenTouches(e);\n }\n\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) {\n if (e.type === 'gesturechange') onGestureStart(e);\n return;\n }\n if (support.gestures) {\n zoom.scale = e.scale * currentScale;\n } else {\n zoom.scale = (gesture.scaleMove / gesture.scaleStart) * currentScale;\n }\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n }\n gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function onGestureEnd(e) {\n const device = swiper.device;\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (!fakeGestureTouched || !fakeGestureMoved) {\n return;\n }\n if (\n e.type !== 'touchend' ||\n (e.type === 'touchend' && e.changedTouches.length < 2 && !device.android)\n ) {\n return;\n }\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.$imageEl\n .transition(swiper.params.speed)\n .transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n currentScale = zoom.scale;\n isScaling = false;\n if (zoom.scale === 1) gesture.$slideEl = undefined;\n }\n function onTouchStart(e) {\n const device = swiper.device;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (image.isTouched) return;\n if (device.android && e.cancelable) e.preventDefault();\n image.isTouched = true;\n image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n }\n function onTouchMove(e) {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n swiper.allowClick = false;\n if (!image.isTouched || !gesture.$slideEl) return;\n\n if (!image.isMoved) {\n image.width = gesture.$imageEl[0].offsetWidth;\n image.height = gesture.$imageEl[0].offsetHeight;\n image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n gesture.$imageWrapEl.transition(0);\n }\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;\n\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n\n image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n if (!image.isMoved && !isScaling) {\n if (\n swiper.isHorizontal() &&\n ((Math.floor(image.minX) === Math.floor(image.startX) &&\n image.touchesCurrent.x < image.touchesStart.x) ||\n (Math.floor(image.maxX) === Math.floor(image.startX) &&\n image.touchesCurrent.x > image.touchesStart.x))\n ) {\n image.isTouched = false;\n return;\n }\n if (\n !swiper.isHorizontal() &&\n ((Math.floor(image.minY) === Math.floor(image.startY) &&\n image.touchesCurrent.y < image.touchesStart.y) ||\n (Math.floor(image.maxY) === Math.floor(image.startY) &&\n image.touchesCurrent.y > image.touchesStart.y))\n ) {\n image.isTouched = false;\n return;\n }\n }\n if (e.cancelable) {\n e.preventDefault();\n }\n e.stopPropagation();\n\n image.isMoved = true;\n image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;\n image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;\n\n if (image.currentX < image.minX) {\n image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n }\n if (image.currentX > image.maxX) {\n image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n }\n\n if (image.currentY < image.minY) {\n image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n }\n if (image.currentY > image.maxY) {\n image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n }\n\n // Velocity\n if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n if (!velocity.prevTime) velocity.prevTime = Date.now();\n velocity.x =\n (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y =\n (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n\n gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTouchEnd() {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n let momentumDurationX = 300;\n let momentumDurationY = 300;\n const momentumDistanceX = velocity.x * momentumDurationX;\n const newPositionX = image.currentX + momentumDistanceX;\n const momentumDistanceY = velocity.y * momentumDurationY;\n const newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0)\n momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n if (velocity.y !== 0)\n momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n gesture.$imageWrapEl\n .transition(momentumDuration)\n .transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTransitionEnd() {\n const zoom = swiper.zoom;\n if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n if (gesture.$imageEl) {\n gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n }\n if (gesture.$imageWrapEl) {\n gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n }\n\n zoom.scale = 1;\n currentScale = 1;\n\n gesture.$slideEl = undefined;\n gesture.$imageEl = undefined;\n gesture.$imageWrapEl = undefined;\n }\n }\n\n function zoomIn(e) {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (e && e.target) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n }\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n }\n\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.touchAction = 'none';\n }\n\n gesture.$slideEl.addClass(`${params.zoomedSlideClass}`);\n\n let touchX;\n let touchY;\n let offsetX;\n let offsetY;\n let diffX;\n let diffY;\n let translateX;\n let translateY;\n let imageWidth;\n let imageHeight;\n let scaledWidth;\n let scaledHeight;\n let translateMinX;\n let translateMinY;\n let translateMaxX;\n let translateMaxY;\n let slideWidth;\n let slideHeight;\n\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n\n zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (e) {\n slideWidth = gesture.$slideEl[0].offsetWidth;\n slideHeight = gesture.$slideEl[0].offsetHeight;\n offsetX = gesture.$slideEl.offset().left + window.scrollX;\n offsetY = gesture.$slideEl.offset().top + window.scrollY;\n diffX = offsetX + slideWidth / 2 - touchX;\n diffY = offsetY + slideHeight / 2 - touchY;\n\n imageWidth = gesture.$imageEl[0].offsetWidth;\n imageHeight = gesture.$imageEl[0].offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n\n translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n gesture.$imageWrapEl\n .transition(300)\n .transform(`translate3d(${translateX}px, ${translateY}px,0)`);\n gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function zoomOut() {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.style.touchAction = '';\n }\n zoom.scale = 1;\n currentScale = 1;\n gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`);\n gesture.$slideEl = undefined;\n }\n\n // Toggle Zoom\n function zoomToggle(e) {\n const zoom = swiper.zoom;\n\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoomOut();\n } else {\n // Zoom In\n zoomIn(e);\n }\n }\n\n function getListeners() {\n const support = swiper.support;\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n const activeListenerWithCapture = support.passiveListener\n ? { passive: false, capture: true }\n : true;\n return { passiveListener, activeListenerWithCapture };\n }\n\n function getSlideSelector() {\n return `.${swiper.params.slideClass}`;\n }\n\n function toggleGestures(method) {\n const { passiveListener } = getListeners();\n const slideSelector = getSlideSelector();\n swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener);\n swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener);\n swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener);\n }\n function enableGestures() {\n if (gesturesEnabled) return;\n gesturesEnabled = true;\n toggleGestures('on');\n }\n function disableGestures() {\n if (!gesturesEnabled) return;\n gesturesEnabled = false;\n toggleGestures('off');\n }\n\n // Attach/Detach Events\n function enable() {\n const zoom = swiper.zoom;\n if (zoom.enabled) return;\n zoom.enabled = true;\n const support = swiper.support;\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.on(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.on(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n function disable() {\n const zoom = swiper.zoom;\n if (!zoom.enabled) return;\n const support = swiper.support;\n zoom.enabled = false;\n\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.off(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.off(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n\n on('init', () => {\n if (swiper.params.zoom.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n disable();\n });\n on('touchStart', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchStart(e);\n });\n on('touchEnd', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchEnd(e);\n });\n on('doubleTap', (_s, e) => {\n if (\n !swiper.animating &&\n swiper.params.zoom.enabled &&\n swiper.zoom.enabled &&\n swiper.params.zoom.toggle\n ) {\n zoomToggle(e);\n }\n });\n on('transitionEnd', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n onTransitionEnd();\n }\n });\n on('slideChange', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n onTransitionEnd();\n }\n });\n\n Object.assign(swiper.zoom, {\n enable,\n disable,\n in: zoomIn,\n out: zoomOut,\n toggle: zoomToggle,\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Lazy({ swiper, extendParams, on, emit }) {\n extendParams({\n lazy: {\n checkInView: false,\n enabled: false,\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n scrollingElement: '',\n\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n },\n });\n\n swiper.lazy = {};\n\n let scrollHandlerAttached = false;\n let initialImageLoaded = false;\n\n function loadInSlide(index, loadInDuplicate = true) {\n const params = swiper.params.lazy;\n if (typeof index === 'undefined') return;\n if (swiper.slides.length === 0) return;\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n const $slideEl = isVirtual\n ? swiper.$wrapperEl.children(\n `.${swiper.params.slideClass}[data-swiper-slide-index=\"${index}\"]`,\n )\n : swiper.slides.eq(index);\n\n const $images = $slideEl.find(\n `.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`,\n );\n if (\n $slideEl.hasClass(params.elementClass) &&\n !$slideEl.hasClass(params.loadedClass) &&\n !$slideEl.hasClass(params.loadingClass)\n ) {\n $images.push($slideEl[0]);\n }\n if ($images.length === 0) return;\n\n $images.each((imageEl) => {\n const $imageEl = $(imageEl);\n $imageEl.addClass(params.loadingClass);\n\n const background = $imageEl.attr('data-background');\n const src = $imageEl.attr('data-src');\n const srcset = $imageEl.attr('data-srcset');\n const sizes = $imageEl.attr('data-sizes');\n const $pictureEl = $imageEl.parent('picture');\n\n swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => {\n if (\n typeof swiper === 'undefined' ||\n swiper === null ||\n !swiper ||\n (swiper && !swiper.params) ||\n swiper.destroyed\n )\n return;\n if (background) {\n $imageEl.css('background-image', `url(\"${background}\")`);\n $imageEl.removeAttr('data-background');\n } else {\n if (srcset) {\n $imageEl.attr('srcset', srcset);\n $imageEl.removeAttr('data-srcset');\n }\n if (sizes) {\n $imageEl.attr('sizes', sizes);\n $imageEl.removeAttr('data-sizes');\n }\n if ($pictureEl.length) {\n $pictureEl.children('source').each((sourceEl) => {\n const $source = $(sourceEl);\n\n if ($source.attr('data-srcset')) {\n $source.attr('srcset', $source.attr('data-srcset'));\n $source.removeAttr('data-srcset');\n }\n });\n }\n if (src) {\n $imageEl.attr('src', src);\n $imageEl.removeAttr('data-src');\n }\n }\n\n $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n $slideEl.find(`.${params.preloaderClass}`).remove();\n if (swiper.params.loop && loadInDuplicate) {\n const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n const originalSlide = swiper.$wrapperEl.children(\n `[data-swiper-slide-index=\"${slideOriginalIndex}\"]:not(.${swiper.params.slideDuplicateClass})`,\n );\n loadInSlide(originalSlide.index(), false);\n } else {\n const duplicatedSlide = swiper.$wrapperEl.children(\n `.${swiper.params.slideDuplicateClass}[data-swiper-slide-index=\"${slideOriginalIndex}\"]`,\n );\n loadInSlide(duplicatedSlide.index(), false);\n }\n }\n emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n });\n\n emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n });\n }\n\n function load() {\n const { $wrapperEl, params: swiperParams, slides, activeIndex } = swiper;\n const isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n const params = swiperParams.lazy;\n\n let slidesPerView = swiperParams.slidesPerView;\n if (slidesPerView === 'auto') {\n slidesPerView = 0;\n }\n\n function slideExist(index) {\n if (isVirtual) {\n if (\n $wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index=\"${index}\"]`)\n .length\n ) {\n return true;\n }\n } else if (slides[index]) return true;\n return false;\n }\n\n function slideIndex(slideEl) {\n if (isVirtual) {\n return $(slideEl).attr('data-swiper-slide-index');\n }\n return $(slideEl).index();\n }\n\n if (!initialImageLoaded) initialImageLoaded = true;\n if (swiper.params.watchSlidesProgress) {\n $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each((slideEl) => {\n const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n loadInSlide(index);\n });\n } else if (slidesPerView > 1) {\n for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n loadInSlide(activeIndex);\n }\n if (params.loadPrevNext) {\n if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n const amount = params.loadPrevNextAmount;\n const spv = slidesPerView;\n const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n // Next Slides\n for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n // Prev Slides\n for (let i = minIndex; i < activeIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`);\n if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide));\n\n const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`);\n if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide));\n }\n }\n }\n function checkInViewOnLoad() {\n const window = getWindow();\n if (!swiper || swiper.destroyed) return;\n const $scrollElement = swiper.params.lazy.scrollingElement\n ? $(swiper.params.lazy.scrollingElement)\n : $(window);\n const isWindow = $scrollElement[0] === window;\n const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;\n const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;\n const swiperOffset = swiper.$el.offset();\n const { rtlTranslate: rtl } = swiper;\n\n let inView = false;\n\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiper.width, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiper.height],\n [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (\n point[0] >= 0 &&\n point[0] <= scrollElementWidth &&\n point[1] >= 0 &&\n point[1] <= scrollElementHeight\n ) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n swiper.support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n\n if (inView) {\n load();\n $scrollElement.off('scroll', checkInViewOnLoad, passiveListener);\n } else if (!scrollHandlerAttached) {\n scrollHandlerAttached = true;\n $scrollElement.on('scroll', checkInViewOnLoad, passiveListener);\n }\n }\n\n on('beforeInit', () => {\n if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n swiper.params.preloadImages = false;\n }\n });\n on('init', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('scroll', () => {\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.freeMode.sticky\n ) {\n load();\n }\n });\n on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('transitionStart', () => {\n if (swiper.params.lazy.enabled) {\n if (\n swiper.params.lazy.loadOnTransitionStart ||\n (!swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded)\n ) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n }\n });\n on('transitionEnd', () => {\n if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('slideChange', () => {\n const { lazy, cssMode, watchSlidesProgress, touchReleaseOnEdges, resistanceRatio } =\n swiper.params;\n if (\n lazy.enabled &&\n (cssMode || (watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0)))\n ) {\n load();\n }\n });\n\n Object.assign(swiper.lazy, {\n load,\n loadInSlide,\n });\n}\n","/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Controller({ swiper, extendParams, on }) {\n extendParams({\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide', // or 'container'\n },\n });\n\n swiper.controller = {\n control: undefined,\n };\n\n function LinearSpline(x, y) {\n const binarySearch = (function search() {\n let maxIndex;\n let minIndex;\n let guess;\n return (array, val) => {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = (maxIndex + minIndex) >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n })();\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n let i1;\n let i3;\n\n this.interpolate = function interpolate(x2) {\n if (!x2) return 0;\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (\n ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]\n );\n };\n return this;\n }\n // xxx: for now i will just save one spline function to to\n function getInterpolateFunction(c) {\n if (!swiper.controller.spline) {\n swiper.controller.spline = swiper.params.loop\n ? new LinearSpline(swiper.slidesGrid, c.slidesGrid)\n : new LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n }\n function setTranslate(_t, byController) {\n const controlled = swiper.controller.control;\n let multiplier;\n let controlledTranslate;\n const Swiper = swiper.constructor;\n function setControlledTranslate(c) {\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier =\n (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n }\n\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (let i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n }\n function setTransition(duration, byController) {\n const Swiper = swiper.constructor;\n const controlled = swiper.controller.control;\n let i;\n function setControlledTransition(c) {\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n if (c.params.autoHeight) {\n nextTick(() => {\n c.updateAutoHeight();\n });\n }\n c.$wrapperEl.transitionEnd(() => {\n if (!controlled) return;\n if (c.params.loop && swiper.params.controller.by === 'slide') {\n c.loopFix();\n }\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTransition(controlled);\n }\n }\n\n function removeSpline() {\n if (!swiper.controller.control) return;\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n }\n on('beforeInit', () => {\n swiper.controller.control = swiper.params.controller.control;\n });\n on('update', () => {\n removeSpline();\n });\n on('resize', () => {\n removeSpline();\n });\n on('observerUpdate', () => {\n removeSpline();\n });\n on('setTranslate', (_s, translate, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTranslate(translate, byController);\n });\n on('setTransition', (_s, duration, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTransition(duration, byController);\n });\n\n Object.assign(swiper.controller, {\n setTranslate,\n setTransition,\n });\n}\n","import classesToSelector from '../../shared/classes-to-selector.js';\nimport $ from '../../shared/dom.js';\n\nexport default function A11y({ swiper, extendParams, on }) {\n extendParams({\n a11y: {\n enabled: true,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n slideLabelMessage: '{{index}} / {{slidesLength}}',\n containerMessage: null,\n containerRoleDescriptionMessage: null,\n itemRoleDescriptionMessage: null,\n slideRole: 'group',\n },\n });\n\n let liveRegion = null;\n\n function notify(message) {\n const notification = liveRegion;\n if (notification.length === 0) return;\n notification.html('');\n notification.html(message);\n }\n\n function getRandomNumber(size = 16) {\n const randomChar = () => Math.round(16 * Math.random()).toString(16);\n return 'x'.repeat(size).replace(/x/g, randomChar);\n }\n function makeElFocusable($el) {\n $el.attr('tabIndex', '0');\n }\n function makeElNotFocusable($el) {\n $el.attr('tabIndex', '-1');\n }\n function addElRole($el, role) {\n $el.attr('role', role);\n }\n function addElRoleDescription($el, description) {\n $el.attr('aria-roledescription', description);\n }\n function addElControls($el, controls) {\n $el.attr('aria-controls', controls);\n }\n function addElLabel($el, label) {\n $el.attr('aria-label', label);\n }\n function addElId($el, id) {\n $el.attr('id', id);\n }\n function addElLive($el, live) {\n $el.attr('aria-live', live);\n }\n function disableEl($el) {\n $el.attr('aria-disabled', true);\n }\n function enableEl($el) {\n $el.attr('aria-disabled', false);\n }\n\n function onEnterOrSpaceKey(e) {\n if (e.keyCode !== 13 && e.keyCode !== 32) return;\n const params = swiper.params.a11y;\n const $targetEl = $(e.target);\n if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n notify(params.lastSlideMessage);\n } else {\n notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n notify(params.firstSlideMessage);\n } else {\n notify(params.prevSlideMessage);\n }\n }\n\n if (\n swiper.pagination &&\n $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))\n ) {\n $targetEl[0].click();\n }\n }\n\n function updateNavigation() {\n if (swiper.params.loop || !swiper.navigation) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n disableEl($prevEl);\n makeElNotFocusable($prevEl);\n } else {\n enableEl($prevEl);\n makeElFocusable($prevEl);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n disableEl($nextEl);\n makeElNotFocusable($nextEl);\n } else {\n enableEl($nextEl);\n makeElFocusable($nextEl);\n }\n }\n }\n\n function hasPagination() {\n return (\n swiper.pagination &&\n swiper.params.pagination.clickable &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length\n );\n }\n\n function updatePagination() {\n const params = swiper.params.a11y;\n if (hasPagination()) {\n swiper.pagination.bullets.each((bulletEl) => {\n const $bulletEl = $(bulletEl);\n makeElFocusable($bulletEl);\n if (!swiper.params.pagination.renderBullet) {\n addElRole($bulletEl, 'button');\n addElLabel(\n $bulletEl,\n params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1),\n );\n }\n });\n }\n }\n\n const initNavEl = ($el, wrapperId, message) => {\n makeElFocusable($el);\n if ($el[0].tagName !== 'BUTTON') {\n addElRole($el, 'button');\n $el.on('keydown', onEnterOrSpaceKey);\n }\n addElLabel($el, message);\n addElControls($el, wrapperId);\n };\n\n function init() {\n const params = swiper.params.a11y;\n\n swiper.$el.append(liveRegion);\n\n // Container\n const $containerEl = swiper.$el;\n if (params.containerRoleDescriptionMessage) {\n addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n }\n if (params.containerMessage) {\n addElLabel($containerEl, params.containerMessage);\n }\n\n // Wrapper\n const $wrapperEl = swiper.$wrapperEl;\n const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n addElId($wrapperEl, wrapperId);\n addElLive($wrapperEl, live);\n\n // Slide\n if (params.itemRoleDescriptionMessage) {\n addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);\n }\n addElRole($(swiper.slides), params.slideRole);\n\n const slidesLength = swiper.params.loop\n ? swiper.slides.filter((el) => !el.classList.contains(swiper.params.slideDuplicateClass))\n .length\n : swiper.slides.length;\n swiper.slides.each((slideEl, index) => {\n const $slideEl = $(slideEl);\n const slideIndex = swiper.params.loop\n ? parseInt($slideEl.attr('data-swiper-slide-index'), 10)\n : index;\n const ariaLabelMessage = params.slideLabelMessage\n .replace(/\\{\\{index\\}\\}/, slideIndex + 1)\n .replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n addElLabel($slideEl, ariaLabelMessage);\n });\n\n // Navigation\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n\n if ($nextEl && $nextEl.length) {\n initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n }\n if ($prevEl && $prevEl.length) {\n initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.on(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n function destroy() {\n if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n $nextEl.off('keydown', onEnterOrSpaceKey);\n }\n if ($prevEl) {\n $prevEl.off('keydown', onEnterOrSpaceKey);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.off(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n\n on('beforeInit', () => {\n liveRegion = $(\n ``,\n );\n });\n\n on('afterInit', () => {\n if (!swiper.params.a11y.enabled) return;\n init();\n updateNavigation();\n });\n on('toEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('fromEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('paginationUpdate', () => {\n if (!swiper.params.a11y.enabled) return;\n updatePagination();\n });\n on('destroy', () => {\n if (!swiper.params.a11y.enabled) return;\n destroy();\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function History({ swiper, extendParams, on }) {\n extendParams({\n history: {\n enabled: false,\n root: '',\n replaceState: false,\n key: 'slides',\n },\n });\n\n let initialized = false;\n let paths = {};\n\n const slugify = (text) => {\n return text\n .toString()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n };\n\n const getPathValues = (urlOverride) => {\n const window = getWindow();\n let location;\n if (urlOverride) {\n location = new URL(urlOverride);\n } else {\n location = window.location;\n }\n const pathArray = location.pathname\n .slice(1)\n .split('/')\n .filter((part) => part !== '');\n const total = pathArray.length;\n const key = pathArray[total - 2];\n const value = pathArray[total - 1];\n return { key, value };\n };\n const setHistory = (key, index) => {\n const window = getWindow();\n if (!initialized || !swiper.params.history.enabled) return;\n let location;\n if (swiper.params.url) {\n location = new URL(swiper.params.url);\n } else {\n location = window.location;\n }\n const slide = swiper.slides.eq(index);\n let value = slugify(slide.attr('data-history'));\n if (swiper.params.history.root.length > 0) {\n let root = swiper.params.history.root;\n if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n value = `${root}/${key}/${value}`;\n } else if (!location.pathname.includes(key)) {\n value = `${key}/${value}`;\n }\n const currentState = window.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n window.history.replaceState({ value }, null, value);\n } else {\n window.history.pushState({ value }, null, value);\n }\n };\n\n const scrollToSlide = (speed, value, runCallbacks) => {\n if (value) {\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHistory = slugify(slide.attr('data-history'));\n if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n };\n\n const setHistoryPopState = () => {\n paths = getPathValues(swiper.params.url);\n scrollToSlide(swiper.params.speed, swiper.paths.value, false);\n };\n\n const init = () => {\n const window = getWindow();\n if (!swiper.params.history) return;\n if (!window.history || !window.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n initialized = true;\n paths = getPathValues(swiper.params.url);\n if (!paths.key && !paths.value) return;\n scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n window.addEventListener('popstate', setHistoryPopState);\n }\n };\n const destroy = () => {\n const window = getWindow();\n if (!swiper.params.history.replaceState) {\n window.removeEventListener('popstate', setHistoryPopState);\n }\n };\n\n on('init', () => {\n if (swiper.params.history.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.history.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function HashNavigation({ swiper, extendParams, emit, on }) {\n let initialized = false;\n const document = getDocument();\n const window = getWindow();\n extendParams({\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n },\n });\n const onHashChange = () => {\n emit('hashChange');\n const newHash = document.location.hash.replace('#', '');\n const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n if (newHash !== activeSlideHash) {\n const newIndex = swiper.$wrapperEl\n .children(`.${swiper.params.slideClass}[data-hash=\"${newHash}\"]`)\n .index();\n if (typeof newIndex === 'undefined') return;\n swiper.slideTo(newIndex);\n }\n };\n const setHash = () => {\n if (!initialized || !swiper.params.hashNavigation.enabled) return;\n if (\n swiper.params.hashNavigation.replaceState &&\n window.history &&\n window.history.replaceState\n ) {\n window.history.replaceState(\n null,\n null,\n `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '',\n );\n emit('hashSet');\n } else {\n const slide = swiper.slides.eq(swiper.activeIndex);\n const hash = slide.attr('data-hash') || slide.attr('data-history');\n document.location.hash = hash || '';\n emit('hashSet');\n }\n };\n const init = () => {\n if (\n !swiper.params.hashNavigation.enabled ||\n (swiper.params.history && swiper.params.history.enabled)\n )\n return;\n initialized = true;\n const hash = document.location.hash.replace('#', '');\n if (hash) {\n const speed = 0;\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHash = slide.attr('data-hash') || slide.attr('data-history');\n if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n }\n }\n }\n if (swiper.params.hashNavigation.watchState) {\n $(window).on('hashchange', onHashChange);\n }\n };\n const destroy = () => {\n if (swiper.params.hashNavigation.watchState) {\n $(window).off('hashchange', onHashChange);\n }\n };\n\n on('init', () => {\n if (swiper.params.hashNavigation.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.hashNavigation.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHash();\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHash();\n }\n });\n}\n","/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Autoplay({ swiper, extendParams, on, emit }) {\n let timeout;\n\n swiper.autoplay = {\n running: false,\n paused: false,\n };\n\n extendParams({\n autoplay: {\n enabled: false,\n delay: 3000,\n waitForTransition: true,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n reverseDirection: false,\n pauseOnMouseEnter: false,\n },\n });\n\n function run() {\n const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n let delay = swiper.params.autoplay.delay;\n if ($activeSlideEl.attr('data-swiper-autoplay')) {\n delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n }\n clearTimeout(timeout);\n timeout = nextTick(() => {\n let autoplayResult;\n if (swiper.params.autoplay.reverseDirection) {\n if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isBeginning) {\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(\n swiper.slides.length - 1,\n swiper.params.speed,\n true,\n true,\n );\n emit('autoplay');\n } else {\n stop();\n }\n } else if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isEnd) {\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n emit('autoplay');\n } else {\n stop();\n }\n if (swiper.params.cssMode && swiper.autoplay.running) run();\n else if (autoplayResult === false) {\n run();\n }\n }, delay);\n }\n function start() {\n if (typeof timeout !== 'undefined') return false;\n if (swiper.autoplay.running) return false;\n swiper.autoplay.running = true;\n emit('autoplayStart');\n run();\n return true;\n }\n function stop() {\n if (!swiper.autoplay.running) return false;\n if (typeof timeout === 'undefined') return false;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n swiper.autoplay.running = false;\n emit('autoplayStop');\n return true;\n }\n function pause(speed) {\n if (!swiper.autoplay.running) return;\n if (swiper.autoplay.paused) return;\n if (timeout) clearTimeout(timeout);\n swiper.autoplay.paused = true;\n if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n swiper.autoplay.paused = false;\n run();\n } else {\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n });\n }\n }\n function onVisibilityChange() {\n const document = getDocument();\n if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n pause();\n }\n if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n run();\n swiper.autoplay.paused = false;\n }\n }\n function onTransitionEnd(e) {\n if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n if (e.target !== swiper.$wrapperEl[0]) return;\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n swiper.autoplay.paused = false;\n if (!swiper.autoplay.running) {\n stop();\n } else {\n run();\n }\n }\n function onMouseEnter() {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n }\n function onMouseLeave() {\n if (swiper.params.autoplay.disableOnInteraction) {\n return;\n }\n swiper.autoplay.paused = false;\n run();\n }\n function attachMouseEvents() {\n if (swiper.params.autoplay.pauseOnMouseEnter) {\n swiper.$el.on('mouseenter', onMouseEnter);\n swiper.$el.on('mouseleave', onMouseLeave);\n }\n }\n function detachMouseEvents() {\n swiper.$el.off('mouseenter', onMouseEnter);\n swiper.$el.off('mouseleave', onMouseLeave);\n }\n\n on('init', () => {\n if (swiper.params.autoplay.enabled) {\n start();\n const document = getDocument();\n document.addEventListener('visibilitychange', onVisibilityChange);\n attachMouseEvents();\n }\n });\n on('beforeTransitionStart', (_s, speed, internal) => {\n if (swiper.autoplay.running) {\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.pause(speed);\n } else {\n stop();\n }\n }\n });\n on('sliderFirstMove', () => {\n if (swiper.autoplay.running) {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n }\n });\n on('touchEnd', () => {\n if (\n swiper.params.cssMode &&\n swiper.autoplay.paused &&\n !swiper.params.autoplay.disableOnInteraction\n ) {\n run();\n }\n });\n on('destroy', () => {\n detachMouseEvents();\n if (swiper.autoplay.running) {\n stop();\n }\n const document = getDocument();\n document.removeEventListener('visibilitychange', onVisibilityChange);\n });\n\n Object.assign(swiper.autoplay, {\n pause,\n run,\n start,\n stop,\n });\n}\n","import { isObject } from '../../shared/utils.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Thumb({ swiper, extendParams, on }) {\n extendParams({\n thumbs: {\n swiper: null,\n multipleActiveThumbs: true,\n autoScrollOffset: 0,\n slideThumbActiveClass: 'swiper-slide-thumb-active',\n thumbsContainerClass: 'swiper-thumbs',\n },\n });\n\n let initialized = false;\n let swiperCreated = false;\n\n swiper.thumbs = {\n swiper: null,\n };\n\n function onThumbClick() {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n const clickedIndex = thumbsSwiper.clickedIndex;\n const clickedSlide = thumbsSwiper.clickedSlide;\n if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass))\n return;\n if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n let slideToIndex;\n if (thumbsSwiper.params.loop) {\n slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n } else {\n slideToIndex = clickedIndex;\n }\n if (swiper.params.loop) {\n let currentIndex = swiper.activeIndex;\n if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n currentIndex = swiper.activeIndex;\n }\n const prevIndex = swiper.slides\n .eq(currentIndex)\n .prevAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n const nextIndex = swiper.slides\n .eq(currentIndex)\n .nextAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;\n else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;\n else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;\n else slideToIndex = prevIndex;\n }\n swiper.slideTo(slideToIndex);\n }\n\n function init() {\n const { thumbs: thumbsParams } = swiper.params;\n if (initialized) return false;\n initialized = true;\n const SwiperClass = swiper.constructor;\n if (thumbsParams.swiper instanceof SwiperClass) {\n swiper.thumbs.swiper = thumbsParams.swiper;\n Object.assign(swiper.thumbs.swiper.originalParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n Object.assign(swiper.thumbs.swiper.params, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n } else if (isObject(thumbsParams.swiper)) {\n const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n Object.assign(thumbsSwiperParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n swiperCreated = true;\n }\n swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n swiper.thumbs.swiper.on('tap', onThumbClick);\n return true;\n }\n\n function update(initial) {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n\n const slidesPerView =\n thumbsSwiper.params.slidesPerView === 'auto'\n ? thumbsSwiper.slidesPerViewDynamic()\n : thumbsSwiper.params.slidesPerView;\n\n const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n let currentThumbsIndex = thumbsSwiper.activeIndex;\n let newThumbsIndex;\n let direction;\n if (thumbsSwiper.params.loop) {\n if (\n thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .hasClass(thumbsSwiper.params.slideDuplicateClass)\n ) {\n thumbsSwiper.loopFix();\n // eslint-disable-next-line\n thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n currentThumbsIndex = thumbsSwiper.activeIndex;\n }\n // Find actual thumbs index to slide to\n const prevThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .prevAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n const nextThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .nextAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevThumbsIndex === 'undefined') {\n newThumbsIndex = nextThumbsIndex;\n } else if (typeof nextThumbsIndex === 'undefined') {\n newThumbsIndex = prevThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex =\n thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex = nextThumbsIndex;\n } else {\n newThumbsIndex = prevThumbsIndex;\n }\n direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n } else {\n newThumbsIndex = swiper.realIndex;\n direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n }\n if (useOffset) {\n newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n }\n\n if (\n thumbsSwiper.visibleSlidesIndexes &&\n thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0\n ) {\n if (thumbsSwiper.params.centeredSlides) {\n if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n } else {\n newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n }\n } else if (\n newThumbsIndex > currentThumbsIndex &&\n thumbsSwiper.params.slidesPerGroup === 1\n ) {\n // newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n }\n thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n }\n }\n\n // Activate thumbs\n let thumbsToActivate = 1;\n const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n thumbsToActivate = swiper.params.slidesPerView;\n }\n\n if (!swiper.params.thumbs.multipleActiveThumbs) {\n thumbsToActivate = 1;\n }\n\n thumbsToActivate = Math.floor(thumbsToActivate);\n\n thumbsSwiper.slides.removeClass(thumbActiveClass);\n if (\n thumbsSwiper.params.loop ||\n (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)\n ) {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.$wrapperEl\n .children(`[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`)\n .addClass(thumbActiveClass);\n }\n } else {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass);\n }\n }\n }\n\n on('beforeInit', () => {\n const { thumbs } = swiper.params;\n if (!thumbs || !thumbs.swiper) return;\n init();\n update(true);\n });\n on('slideChange update resize observerUpdate', () => {\n if (!swiper.thumbs.swiper) return;\n update();\n });\n on('setTransition', (_s, duration) => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n thumbsSwiper.setTransition(duration);\n });\n on('beforeDestroy', () => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n if (swiperCreated && thumbsSwiper) {\n thumbsSwiper.destroy();\n }\n });\n\n Object.assign(swiper.thumbs, {\n init,\n update,\n });\n}\n","import { now } from '../../shared/utils.js';\n\nexport default function freeMode({ swiper, extendParams, emit, once }) {\n extendParams({\n freeMode: {\n enabled: false,\n momentum: true,\n momentumRatio: 1,\n momentumBounce: true,\n momentumBounceRatio: 1,\n momentumVelocityRatio: 1,\n sticky: false,\n minimumVelocity: 0.02,\n },\n });\n\n function onTouchMove() {\n const { touchEventsData: data, touches } = swiper;\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime,\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: now(),\n });\n }\n\n function onTouchEnd({ currentPos }) {\n const { params, $wrapperEl, rtlTranslate: rtl, snapGrid, touchEventsData: data } = swiper;\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n\n if (params.freeMode.momentum) {\n if (data.velocities.length > 1) {\n const lastMoveEvent = data.velocities.pop();\n const velocityEvent = data.velocities.pop();\n\n const distance = lastMoveEvent.position - velocityEvent.position;\n const time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || now() - lastMoveEvent.time > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeMode.momentumVelocityRatio;\n\n data.velocities.length = 0;\n let momentumDuration = 1000 * params.freeMode.momentumRatio;\n const momentumDistance = swiper.velocity * momentumDuration;\n\n let newPosition = swiper.translate + momentumDistance;\n if (rtl) newPosition = -newPosition;\n\n let doBounce = false;\n let afterBouncePosition;\n const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n let needsLoopFix;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (params.freeMode.sticky) {\n let nextSlide;\n for (let j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n\n if (\n Math.abs(snapGrid[nextSlide] - newPosition) <\n Math.abs(snapGrid[nextSlide - 1] - newPosition) ||\n swiper.swipeDirection === 'next'\n ) {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n if (needsLoopFix) {\n once('transitionEnd', () => {\n swiper.loopFix();\n });\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n if (params.freeMode.sticky) {\n // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n // It's easy to see this when simulating touch with mouse events. To fix this,\n // limit single-slide swipes to the default slide duration. This also has the\n // nice side effect of matching slide speed if the user stopped moving before\n // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n // For faster swipes, also apply limits (albeit higher ones).\n const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n if (moveDistance < currentSlideSize) {\n momentumDuration = params.speed;\n } else if (moveDistance < 2 * currentSlideSize) {\n momentumDuration = params.speed * 1.5;\n } else {\n momentumDuration = params.speed * 2.5;\n }\n }\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (params.freeMode.momentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n emit('momentumBounce');\n swiper.setTransition(params.speed);\n setTimeout(() => {\n swiper.setTranslate(afterBouncePosition);\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }, 0);\n });\n } else if (swiper.velocity) {\n emit('_freeModeNoMomentumRelease');\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n } else if (params.freeMode) {\n emit('_freeModeNoMomentumRelease');\n }\n\n if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n }\n\n Object.assign(swiper, {\n freeMode: {\n onTouchMove,\n onTouchEnd,\n },\n });\n}\n","export default function Grid({ swiper, extendParams }) {\n extendParams({\n grid: {\n rows: 1,\n fill: 'column',\n },\n });\n\n let slidesNumberEvenToRows;\n let slidesPerRow;\n let numFullColumns;\n\n const initSlides = (slidesLength) => {\n const { slidesPerView } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n slidesPerRow = slidesNumberEvenToRows / rows;\n numFullColumns = Math.floor(slidesLength / rows);\n if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n slidesNumberEvenToRows = slidesLength;\n } else {\n slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n }\n if (slidesPerView !== 'auto' && fill === 'row') {\n slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n }\n };\n\n const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {\n const { slidesPerGroup, spaceBetween } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n // Set slides order\n let newSlideOrderIndex;\n let column;\n let row;\n if (fill === 'row' && slidesPerGroup > 1) {\n const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n const columnsInGroup =\n groupIndex === 0\n ? slidesPerGroup\n : Math.min(\n Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows),\n slidesPerGroup,\n );\n row = Math.floor(slideIndexInGroup / columnsInGroup);\n column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n\n newSlideOrderIndex = column + (row * slidesNumberEvenToRows) / rows;\n slide.css({\n '-webkit-order': newSlideOrderIndex,\n order: newSlideOrderIndex,\n });\n } else if (fill === 'column') {\n column = Math.floor(i / rows);\n row = i - column * rows;\n if (column > numFullColumns || (column === numFullColumns && row === rows - 1)) {\n row += 1;\n if (row >= rows) {\n row = 0;\n column += 1;\n }\n }\n } else {\n row = Math.floor(i / slidesPerRow);\n column = i - row * slidesPerRow;\n }\n slide.css(\n getDirectionLabel('margin-top'),\n row !== 0 ? spaceBetween && `${spaceBetween}px` : '',\n );\n };\n\n const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {\n const { spaceBetween, centeredSlides, roundLengths } = swiper.params;\n const { rows } = swiper.params.grid;\n swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n swiper.$wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px`,\n });\n if (centeredSlides) {\n snapGrid.splice(0, snapGrid.length);\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n }\n snapGrid.push(...newSlidesGrid);\n }\n };\n\n swiper.grid = {\n initSlides,\n updateSlide,\n updateWrapperSize,\n };\n}\n","export default function appendSlide(slides) {\n const swiper = this;\n const { $wrapperEl, params } = swiper;\n if (params.loop) {\n swiper.loopDestroy();\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n } else {\n $wrapperEl.append(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n}\n","export default function prependSlide(slides) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n if (params.loop) {\n swiper.loopDestroy();\n }\n let newActiveIndex = activeIndex + 1;\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.prepend(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n $wrapperEl.prepend(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n}\n","export default function addSlide(index, slides) {\n const swiper = this;\n const { $wrapperEl, params, activeIndex } = swiper;\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n const baseLength = swiper.slides.length;\n if (index <= 0) {\n swiper.prependSlide(slides);\n return;\n }\n if (index >= baseLength) {\n swiper.appendSlide(slides);\n return;\n }\n let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n const slidesBuffer = [];\n for (let i = baseLength - 1; i >= index; i -= 1) {\n const currentSlide = swiper.slides.eq(i);\n currentSlide.remove();\n slidesBuffer.unshift(currentSlide);\n }\n\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n newActiveIndex =\n activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n } else {\n $wrapperEl.append(slides);\n }\n\n for (let i = 0; i < slidesBuffer.length; i += 1) {\n $wrapperEl.append(slidesBuffer[i]);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeSlide(slidesIndexes) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n let newActiveIndex = activeIndexBuffer;\n let indexToRemove;\n\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (let i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeAllSlides() {\n const swiper = this;\n\n const slidesIndexes = [];\n for (let i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n}\n","import appendSlide from './methods/appendSlide.js';\nimport prependSlide from './methods/prependSlide.js';\nimport addSlide from './methods/addSlide.js';\nimport removeSlide from './methods/removeSlide.js';\nimport removeAllSlides from './methods/removeAllSlides.js';\n\nexport default function Manipulation({ swiper }) {\n Object.assign(swiper, {\n appendSlide: appendSlide.bind(swiper),\n prependSlide: prependSlide.bind(swiper),\n addSlide: addSlide.bind(swiper),\n removeSlide: removeSlide.bind(swiper),\n removeAllSlides: removeAllSlides.bind(swiper),\n });\n}\n","export default function effectInit(params) {\n const { effect, swiper, on, setTranslate, setTransition, overwriteParams, perspective } = params;\n\n on('beforeInit', () => {\n if (swiper.params.effect !== effect) return;\n swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n if (perspective && perspective()) {\n swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n }\n\n const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n\n Object.assign(swiper.params, overwriteParamsResult);\n Object.assign(swiper.originalParams, overwriteParamsResult);\n });\n on('setTranslate', () => {\n if (swiper.params.effect !== effect) return;\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n if (swiper.params.effect !== effect) return;\n setTransition(duration);\n });\n}\n","export default function effectTarget(effectParams, $slideEl) {\n if (effectParams.transformEl) {\n return $slideEl.find(effectParams.transformEl).css({\n 'backface-visibility': 'hidden',\n '-webkit-backface-visibility': 'hidden',\n });\n }\n return $slideEl;\n}\n","export default function effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides }) {\n const { slides, activeIndex, $wrapperEl } = swiper;\n if (swiper.params.virtualTranslate && duration !== 0) {\n let eventTriggered = false;\n let $transitionEndTarget;\n if (allSlides) {\n $transitionEndTarget = transformEl ? slides.find(transformEl) : slides;\n } else {\n $transitionEndTarget = transformEl\n ? slides.eq(activeIndex).find(transformEl)\n : slides.eq(activeIndex);\n }\n $transitionEndTarget.transitionEnd(() => {\n if (eventTriggered) return;\n if (!swiper || swiper.destroyed) return;\n eventTriggered = true;\n swiper.animating = false;\n const triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (let i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n}\n","import effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFade({ swiper, extendParams, on }) {\n extendParams({\n fadeEffect: {\n crossFade: false,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides } = swiper;\n const params = swiper.params.fadeEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = swiper.slides.eq(i);\n const offset = $slideEl[0].swiperSlideOffset;\n let tx = -offset;\n if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n const slideOpacity = swiper.params.fadeEffect.crossFade\n ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl\n .css({\n opacity: slideOpacity,\n })\n .transform(`translate3d(${tx}px, ${ty}px, 0px)`);\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.fadeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'fade',\n swiper,\n on,\n setTranslate,\n setTransition,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import $ from '../../shared/dom.js';\nimport effectInit from '../../shared/effect-init.js';\n\nexport default function EffectCube({ swiper, extendParams, on }) {\n extendParams({\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n });\n\n const setTranslate = () => {\n const {\n $el,\n $wrapperEl,\n slides,\n width: swiperWidth,\n height: swiperHeight,\n rtlTranslate: rtl,\n size: swiperSize,\n browser,\n } = swiper;\n const params = swiper.params.cubeEffect;\n const isHorizontal = swiper.isHorizontal();\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let wrapperRotate = 0;\n let $cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
');\n $wrapperEl.append($cubeShadowEl);\n }\n $cubeShadowEl.css({ height: `${swiperWidth}px` });\n } else {\n $cubeShadowEl = $el.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
');\n $el.append($cubeShadowEl);\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n }\n let slideAngle = slideIndex * 90;\n let round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n const progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n let tx = 0;\n let ty = 0;\n let tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + round * 4 * swiperSize;\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = 3 * swiperSize + swiperSize * 4 * round;\n }\n if (rtl) {\n tx = -tx;\n }\n\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n\n const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${\n isHorizontal ? slideAngle : 0\n }deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n if (progress <= 1 && progress > -1) {\n wrapperRotate = slideIndex * 90 + progress * 90;\n if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n }\n $slideEl.transform(transform);\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $(\n `
`,\n );\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $(\n `
`,\n );\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n }\n $wrapperEl.css({\n '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`,\n 'transform-origin': `50% 50% -${swiperSize / 2}px`,\n });\n\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl.transform(\n `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${\n -swiperWidth / 2\n }px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`,\n );\n } else {\n const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n const multiplier =\n 1.5 -\n (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2 +\n Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2);\n const scale1 = params.shadowScale;\n const scale2 = params.shadowScale / multiplier;\n const offset = params.shadowOffset;\n $cubeShadowEl.transform(\n `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${\n -swiperHeight / 2 / scale2\n }px) rotateX(-90deg)`,\n );\n }\n }\n const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;\n $wrapperEl.transform(\n `translate3d(0px,0,${zFactor}px) rotateX(${\n swiper.isHorizontal() ? 0 : wrapperRotate\n }deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`,\n );\n };\n const setTransition = (duration) => {\n const { $el, slides } = swiper;\n slides\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n $el.find('.swiper-cube-shadow').transition(duration);\n }\n };\n\n effectInit({\n effect: 'cube',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true,\n }),\n });\n}\n","import $ from './dom.js';\n\nexport default function createShadow(params, $slideEl, side) {\n const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`;\n const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl;\n let $shadowEl = $shadowContainer.children(`.${shadowClass}`);\n\n if (!$shadowEl.length) {\n $shadowEl = $(`
`);\n $shadowContainer.append($shadowEl);\n }\n return $shadowEl;\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFlip({ swiper, extendParams, on }) {\n extendParams({\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, rtlTranslate: rtl } = swiper;\n const params = swiper.params.flipEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let progress = $slideEl[0].progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n }\n const offset = $slideEl[0].swiperSlideOffset;\n const rotate = -180 * progress;\n let rotateY = rotate;\n let rotateX = 0;\n let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (rtl) {\n rotateY = -rotateY;\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top');\n }\n if (shadowAfter.length === 0) {\n shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.flipEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'flip',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\n\nexport default function EffectCoverflow({ swiper, extendParams, on }) {\n extendParams({\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n scale: 1,\n modifier: 1,\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { width: swiperWidth, height: swiperHeight, slides, slidesSizesGrid } = swiper;\n const params = swiper.params.coverflowEffect;\n const isHorizontal = swiper.isHorizontal();\n const transform = swiper.translate;\n const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n const rotate = isHorizontal ? params.rotate : -params.rotate;\n const translate = params.depth;\n // Each slide offset from center\n for (let i = 0, length = slides.length; i < length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideSize = slidesSizesGrid[i];\n const slideOffset = $slideEl[0].swiperSlideOffset;\n const offsetMultiplier =\n ((center - slideOffset - slideSize / 2) / slideSize) * params.modifier;\n\n let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n let translateZ = -translate * Math.abs(offsetMultiplier);\n\n let stretch = params.stretch;\n // Allow percentage to make a relative stretch for responsive sliders\n if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n stretch = (parseFloat(params.stretch) / 100) * slideSize;\n }\n let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n\n let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) translateX = 0;\n if (Math.abs(translateY) < 0.001) translateY = 0;\n if (Math.abs(translateZ) < 0.001) translateZ = 0;\n if (Math.abs(rotateY) < 0.001) rotateY = 0;\n if (Math.abs(rotateX) < 0.001) rotateX = 0;\n if (Math.abs(scale) < 0.001) scale = 0;\n\n const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(slideTransform);\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowBeforeEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let $shadowAfterEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if ($shadowBeforeEl.length === 0) {\n $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top');\n }\n if ($shadowAfterEl.length === 0) {\n $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom');\n }\n if ($shadowBeforeEl.length)\n $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n if ($shadowAfterEl.length)\n $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n }\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.coverflowEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n };\n\n effectInit({\n effect: 'coverflow',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCreative({ swiper, extendParams, on }) {\n extendParams({\n creativeEffect: {\n transformEl: null,\n limitProgress: 1,\n shadowPerProgress: false,\n progressMultiplier: 1,\n perspective: true,\n prev: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n next: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n },\n });\n\n const getTranslateValue = (value) => {\n if (typeof value === 'string') return value;\n return `${value}px`;\n };\n\n const setTranslate = () => {\n const { slides, $wrapperEl, slidesSizesGrid } = swiper;\n const params = swiper.params.creativeEffect;\n const { progressMultiplier: multiplier } = params;\n\n const isCenteredSlides = swiper.params.centeredSlides;\n\n if (isCenteredSlides) {\n const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;\n $wrapperEl.transform(`translateX(calc(50% - ${margin}px))`);\n }\n\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(\n Math.max($slideEl[0].progress, -params.limitProgress),\n params.limitProgress,\n );\n let originalProgress = progress;\n\n if (!isCenteredSlides) {\n originalProgress = Math.min(\n Math.max($slideEl[0].originalProgress, -params.limitProgress),\n params.limitProgress,\n );\n }\n\n const offset = $slideEl[0].swiperSlideOffset;\n const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n const r = [0, 0, 0];\n let custom = false;\n if (!swiper.isHorizontal()) {\n t[1] = t[0];\n t[0] = 0;\n }\n let data = {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n scale: 1,\n opacity: 1,\n };\n if (progress < 0) {\n data = params.next;\n custom = true;\n } else if (progress > 0) {\n data = params.prev;\n custom = true;\n }\n // set translate\n t.forEach((value, index) => {\n t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(\n progress * multiplier,\n )}))`;\n });\n // set rotates\n r.forEach((value, index) => {\n r[index] = data.rotate[index] * Math.abs(progress * multiplier);\n });\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n\n const translateString = t.join(', ');\n const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;\n const scaleString =\n originalProgress < 0\n ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})`\n : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;\n const opacityString =\n originalProgress < 0\n ? 1 + (1 - data.opacity) * originalProgress * multiplier\n : 1 - (1 - data.opacity) * originalProgress * multiplier;\n const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n // Set shadows\n if ((custom && data.shadow) || !custom) {\n let $shadowEl = $slideEl.children('.swiper-slide-shadow');\n if ($shadowEl.length === 0 && data.shadow) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length) {\n const shadowOpacity = params.shadowPerProgress\n ? progress * (1 / params.limitProgress)\n : progress;\n $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n }\n }\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform).css({ opacity: opacityString });\n if (data.origin) {\n $targetEl.css('transform-origin', data.origin);\n }\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.creativeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'creative',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => swiper.params.creativeEffect.perspective,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCards({ swiper, extendParams, on }) {\n extendParams({\n cardsEffect: {\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, activeIndex } = swiper;\n const params = swiper.params.cardsEffect;\n const { startTranslate, isTouched } = swiper.touchEventsData;\n const currentTranslate = swiper.translate;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(Math.max(slideProgress, -4), 4);\n let offset = $slideEl[0].swiperSlideOffset;\n if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`);\n }\n if (swiper.params.centeredSlides && swiper.params.cssMode) {\n offset -= slides[0].swiperSlideOffset;\n }\n let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let tY = 0;\n const tZ = -100 * Math.abs(progress);\n let scale = 1;\n let rotate = -2 * progress;\n\n let tXAdd = 8 - Math.abs(progress) * 0.75;\n\n const isSwipeToNext =\n (i === activeIndex || i === activeIndex - 1) &&\n progress > 0 &&\n progress < 1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate < startTranslate;\n const isSwipeToPrev =\n (i === activeIndex || i === activeIndex + 1) &&\n progress < 0 &&\n progress > -1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate > startTranslate;\n if (isSwipeToNext || isSwipeToPrev) {\n const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n rotate += -28 * progress * subProgress;\n scale += -0.5 * subProgress;\n tXAdd += 96 * subProgress;\n tY = `${-25 * subProgress * Math.abs(progress)}%`;\n }\n\n if (progress < 0) {\n // next\n tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`;\n } else if (progress > 0) {\n // prev\n tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`;\n } else {\n tX = `${tX}px`;\n }\n if (!swiper.isHorizontal()) {\n const prevY = tY;\n tY = tX;\n tX = prevY;\n }\n\n const scaleString =\n progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n const transform = `\n translate3d(${tX}, ${tY}, ${tZ}px)\n rotateZ(${rotate}deg)\n scale(${scaleString})\n `;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowEl = $slideEl.find('.swiper-slide-shadow');\n if ($shadowEl.length === 0) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length)\n $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.cardsEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'cards',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","// Swiper Class\nimport Swiper from './core/core.js';\n\n//IMPORT_MODULES\n\nconst modules = [\n //INSTALL_MODULES\n];\n\nSwiper.use(modules);\n\n//EXPORT\n"],"names":["isObject","obj","constructor","Object","extend","target","src","keys","forEach","key","length","ssrDocument","body","addEventListener","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","createElement","children","childNodes","style","setAttribute","getElementsByTagName","createElementNS","importNode","location","hash","host","hostname","href","origin","pathname","protocol","search","getDocument","doc","document","ssrWindow","navigator","userAgent","history","replaceState","pushState","go","back","CustomEvent","getComputedStyle","getPropertyValue","Image","Date","screen","setTimeout","clearTimeout","matchMedia","requestAnimationFrame","callback","cancelAnimationFrame","id","getWindow","win","window","makeReactive","proto","__proto__","defineProperty","get","set","value","Dom7","Array","items","arrayFlat","arr","res","el","isArray","push","arrayFilter","prototype","filter","call","arrayUnique","uniqueArray","i","indexOf","qsa","selector","context","a","$","html","trim","toCreate","tempParent","innerHTML","nodeType","fn","addClass","classes","classNames","map","c","split","classList","add","removeClass","remove","toggleClass","className","toggle","hasClass","contains","attr","attrs","arguments","getAttribute","undefined","attrName","removeAttr","removeAttribute","transform","transition","duration","transitionDuration","on","args","eventType","targetSelector","listener","capture","handleLiveEvent","e","eventData","dom7EventData","unshift","is","apply","parents","k","handleEvent","events","j","event","dom7Listeners","proxyListener","dom7LiveListeners","off","handlers","handler","splice","dom7proxy","trigger","evt","detail","bubbles","cancelable","data","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","offsetWidth","parseFloat","outerHeight","offsetHeight","offset","box","getBoundingClientRect","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","top","left","css","props","prop","each","index","result","text","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","append","els","newChild","tempDiv","firstChild","appendChild","prepend","insertBefore","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parent","parentNode","closest","find","foundElements","found","removeChild","Methods","methodName","writable","deleteProps","object","nextTick","delay","now","currentStyle","getTranslate","axis","matrix","curTransform","transformMatrix","curStyle","WebKitCSSMatrix","webkitTransform","replace","join","MozTransform","OTransform","MsTransform","msTransform","toString","m41","m42","o","slice","isNode","node","HTMLElement","to","noExtend","nextSource","keysArray","nextIndex","len","nextKey","desc","getOwnPropertyDescriptor","enumerable","__swiper__","setCSSProperty","varName","varValue","setProperty","animateCSSModeScroll","swiper","targetPosition","side","startPosition","translate","startTime","time","params","speed","wrapperEl","scrollSnapType","cssModeFrameID","dir","isOutOfBound","current","animate","getTime","progress","Math","max","min","easeProgress","cos","PI","currentPosition","scrollTo","overflow","support","calcSupport","smoothScroll","documentElement","touch","DocumentTouch","passiveListener","checkPassiveListener","supportsPassive","opts","gestures","checkGestures","getSupport","deviceCached","calcDevice","platform","ua","device","ios","android","screenWidth","width","screenHeight","height","match","ipad","ipod","iphone","windows","macos","iPadScreens","os","getDevice","overrides","browser","calcBrowser","isSafari","toLowerCase","isWebView","test","getBrowser","Resize","emit","observer","resizeHandler","destroyed","initialized","createObserver","ResizeObserver","entries","newWidth","newHeight","contentBoxSize","contentRect","inlineSize","blockSize","observe","removeObserver","unobserve","orientationChangeHandler","resizeObserver","Observer","extendParams","observers","attach","options","ObserverFunc","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","attributes","childList","characterData","init","observeParents","containerParents","$el","observeSlideChildren","$wrapperEl","destroy","disconnect","priority","self","method","eventsListeners","once","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","eventHandler","eventsArray","updateSize","clientWidth","clientHeight","isHorizontal","isVertical","parseInt","Number","isNaN","assign","size","updateSlides","getDirectionLabel","property","getDirectionPropertyValue","label","swiperSize","rtlTranslate","rtl","wrongRTL","isVirtual","virtual","enabled","previousSlidesLength","slides","slideClass","slidesLength","snapGrid","slidesGrid","slidesSizesGrid","offsetBefore","slidesOffsetBefore","offsetAfter","slidesOffsetAfter","previousSnapGridLength","previousSlidesGridLength","spaceBetween","slidePosition","prevSlideSize","virtualSize","marginLeft","marginBottom","marginTop","marginRight","centeredSlides","cssMode","gridEnabled","grid","rows","initSlides","slideSize","shouldResetSlideSize","slidesPerView","breakpoints","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","roundLengths","paddingLeft","paddingRight","boxSizing","floor","swiperSlideSize","abs","slidesPerGroup","slidesPerGroupSkip","effect","setWrapperSize","updateWrapperSize","newSlidesGrid","slidesGridItem","_","slideIndex","centeredSlidesBounds","allSlidesSize","slideSizeValue","maxSnap","snap","centerInsufficientSlides","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","v","watchOverflow","checkOverflow","watchSlidesProgress","updateSlidesOffset","updateAutoHeight","activeSlides","setTransition","getSlideByIndex","visibleSlides","ceil","activeIndex","swiperSlideOffset","offsetLeft","offsetTop","updateSlidesProgress","offsetCenter","slideVisibleClass","visibleSlidesIndexes","slideOffset","slideProgress","minTranslate","originalSlideProgress","slideBefore","slideAfter","isVisible","originalProgress","updateProgress","multiplier","translatesDiff","maxTranslate","isBeginning","isEnd","wasBeginning","wasEnd","autoHeight","updateSlidesClasses","realIndex","slideActiveClass","slideNextClass","slidePrevClass","slideDuplicateActiveClass","slideDuplicateNextClass","slideDuplicatePrevClass","activeSlide","loop","slideDuplicateClass","nextSlide","prevSlide","emitSlidesClasses","updateActiveIndex","newActiveIndex","previousIndex","previousRealIndex","previousSnapIndex","normalizeSlideIndex","skip","runCallbacksOnInit","updateClickedSlide","slideFound","clickedSlide","clickedIndex","slideToClickedSlide","getSwiperTranslate","virtualTranslate","currentTranslate","setTranslate","byController","x","y","z","previousTranslate","newProgress","translateTo","runCallbacks","translateBounds","internal","animating","preventInteractionOnTransition","newTranslate","isH","behavior","onTranslateToWrapperTransitionEnd","transitionEmit","direction","step","transitionStart","slideTo","initial","Error","indexAsNumber","isValidNumber","isFinite","initialSlide","normalizedTranslate","normalizedGrid","normalizedGridNext","allowSlideNext","allowSlidePrev","t","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","loopedSlides","slideNext","perGroup","slidesPerGroupAuto","slidesPerViewDynamic","increment","loopPreventsSlide","loopFix","_clientLeft","slidePrev","normalize","val","normalizedSnapGrid","prevSnap","prevSnapIndex","prevIndex","slideReset","slideToClosest","threshold","currentSnap","nextSnap","slideToIndex","loopCreate","$selector","loopFillGroupWithBlank","blankSlidesNum","blankNode","slideBlankClass","loopAdditionalSlides","prependSlides","appendSlides","cloneNode","snapTranslate","diff","slideChanged","loopDestroy","setGrabCursor","moving","simulateTouch","isLocked","touchEventsTarget","cursor","unsetGrabCursor","closestElement","base","__closestFrom","assignedSlot","getRootNode","onTouchStart","touchEventsData","touches","originalEvent","$targetEl","isTouchEvent","type","which","button","isTouched","isMoved","swipingClassHasValue","noSwipingClass","shadowRoot","path","noSwipingSelector","isTargetShadow","noSwiping","allowClick","swipeHandler","currentX","targetTouches","pageX","currentY","pageY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","innerWidth","preventDefault","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","swipeDirection","allowThresholdMove","focusableElements","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","isContentEditable","onTouchMove","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","diffX","diffY","sqrt","touchAngle","atan2","touchMoveStopPropagation","nested","stopPropagation","startTranslate","allowMomentumBounce","grabCursor","touchRatio","disableParentSwiper","resistanceRatio","resistance","followFinger","freeMode","onTouchEnd","touchEndTime","timeDiff","lastClickTime","currentPos","stopIndex","groupSize","ratio","longSwipesMs","longSwipes","longSwipesRatio","shortSwipes","isNavButtonTarget","navigation","nextEl","prevEl","onResize","setBreakpoint","autoplay","running","paused","run","onClick","preventClicks","preventClicksPropagation","stopImmediatePropagation","onScroll","dummyEventAttached","dummyEventListener","touchEvents","domMethod","swiperMethod","start","move","end","passiveListeners","passive","cancel","updateOnWindowResize","attachEvents","bind","detachEvents","isGridEnabled","breakpoint","getBreakpoint","breakpointsBase","currentBreakpoint","breakpointOnlyParams","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","containerModifierClass","emitContainerClasses","fill","directionChanged","needsReLoop","changeDirection","isEnabled","disable","enable","containerEl","currentHeight","innerHeight","points","point","minRatio","substr","sort","b","prepareClasses","prefix","resultClasses","item","addClasses","suffixes","removeClasses","loadImage","imageEl","srcset","sizes","checkForComplete","image","onReady","isPicture","complete","onload","onerror","preloadImages","imagesToLoad","imagesLoaded","updateOnImagesReady","update","currentSrc","wasLocked","lastSlideIndex","lastSlideRightEdge","createElements","url","uniqueNavElements","wrapperClass","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","eventsEmitter","images","extendedDefaults","Swiper","swipers","newParams","modules","__modules__","mod","swiperParams","defaults","passedParams","eventName","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","setProgress","cls","getSlideClasses","slideEl","updates","view","exact","spv","breakLoop","slideInView","translateValue","translated","newDirection","needUpdate","currentDirection","mount","mounted","getWrapperSelector","getWrapper","wrapper","deleteInstance","cleanStyles","extendDefaults","newDefaults","installModule","use","module","m","prototypeGroup","protoMethod","Virtual","cache","renderSlide","renderExternal","renderExternalUpdate","addSlidesBefore","addSlidesAfter","cssModeTimeout","from","$slideEl","force","previousFrom","previousTo","previousSlidesGrid","previousOffset","offsetProp","slidesAfter","slidesBefore","onRendered","lazy","load","getSlides","slidesToRender","prependIndexes","appendIndexes","appendSlide","prependSlide","numberOfNewSlides","newCache","cachedIndex","$cachedEl","cachedElIndex","removeSlide","slidesIndexes","removeAllSlides","Keyboard","keyboard","onlyInViewport","pageUpDown","handle","kc","keyCode","charCode","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","shiftKey","altKey","ctrlKey","metaKey","inView","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","swiperCoord","returnValue","Mousewheel","mousewheel","releaseOnEdges","invert","forceToAxis","sensitivity","eventsTarget","thresholdDelta","thresholdTime","timeout","lastScrollTime","lastEventBeforeSnap","recentWheelEvents","PIXEL_STEP","LINE_HEIGHT","PAGE_HEIGHT","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","spinY","pixelX","pixelY","handleMouseEnter","mouseEntered","handleMouseLeave","animateSlider","newEvent","delta","raw","releaseScroll","rtlFactor","positions","sign","shift","prevEvent","ignoreWheelEvents","position","sticky","firstEvent","snapToThreshold","autoplayDisableOnInteraction","stop","createElementIfNotDefined","checkProps","element","Navigation","hideOnClick","disabledClass","hiddenClass","lockClass","$nextEl","$prevEl","getEl","toggleEl","disabled","tagName","onPrevClick","onNextClick","_s","targetEl","pagination","clickable","isHidden","classesToSelector","Pagination","pfx","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","number","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","bullets","bulletSize","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","total","paginationType","firstIndex","lastIndex","midIndex","suffix","bullet","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","progressbarDirection","scale","scaleX","scaleY","render","paginationHTML","numberOfBullets","Scrollbar","dragTimeout","dragStartPos","dragSize","trackSize","divider","scrollbar","hide","draggable","snapOnRelease","dragClass","dragEl","$dragEl","newSize","newPos","opacity","display","getPointerPosition","clientX","clientY","setDragPosition","positionRatio","onDragStart","onDragMove","onDragEnd","activeListener","eventMethod","enableDraggable","disableDraggable","$swiperEl","Parallax","parallax","setTransform","p","currentOpacity","currentScale","parallaxEl","$parallaxEl","parallaxDuration","_swiper","Zoom","zoom","maxRatio","containerClass","zoomedSlideClass","isScaling","gesturesEnabled","fakeGestureTouched","fakeGestureMoved","gesture","slideWidth","slideHeight","$imageEl","$imageWrapEl","minX","minY","maxX","maxY","touchesStart","touchesCurrent","prevPositionX","prevPositionY","prevTime","getDistanceBetweenTouches","x1","y1","x2","y2","distance","onGestureStart","scaleStart","onGestureChange","scaleMove","onGestureEnd","scaledWidth","scaledHeight","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","momentumDuration","onTransitionEnd","zoomIn","touchAction","touchX","touchY","offsetX","offsetY","translateX","translateY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","zoomOut","zoomToggle","getListeners","activeListenerWithCapture","getSlideSelector","toggleGestures","slideSelector","enableGestures","disableGestures","in","out","Lazy","checkInView","loadPrevNext","loadPrevNextAmount","loadOnTransitionStart","scrollingElement","elementClass","loadingClass","loadedClass","preloaderClass","scrollHandlerAttached","initialImageLoaded","loadInSlide","loadInDuplicate","$images","background","$pictureEl","sourceEl","$source","slideOriginalIndex","originalSlide","duplicatedSlide","slideExist","amount","maxIndex","minIndex","checkInViewOnLoad","$scrollElement","isWindow","scrollElementWidth","scrollElementHeight","Controller","controller","control","inverse","by","LinearSpline","binarySearch","guess","array","i1","i3","interpolate","getInterpolateFunction","spline","_t","controlled","controlledTranslate","setControlledTranslate","setControlledTransition","removeSpline","A11y","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","liveRegion","notify","message","notification","getRandomNumber","randomChar","round","random","repeat","makeElFocusable","makeElNotFocusable","addElRole","role","addElRoleDescription","description","addElControls","controls","addElLabel","addElId","addElLive","live","disableEl","enableEl","onEnterOrSpaceKey","click","updateNavigation","hasPagination","updatePagination","bulletEl","initNavEl","wrapperId","$containerEl","ariaLabelMessage","History","root","paths","slugify","getPathValues","urlOverride","URL","pathArray","part","setHistory","includes","currentState","state","scrollToSlide","slideHistory","setHistoryPopState","hashNavigation","HashNavigation","watchState","onHashChange","newHash","activeSlideHash","setHash","slideHash","Autoplay","waitForTransition","disableOnInteraction","stopOnLastSlide","reverseDirection","pauseOnMouseEnter","$activeSlideEl","autoplayResult","pause","onVisibilityChange","visibilityState","onMouseEnter","onMouseLeave","attachMouseEvents","detachMouseEvents","Thumb","thumbs","multipleActiveThumbs","autoScrollOffset","slideThumbActiveClass","thumbsContainerClass","swiperCreated","onThumbClick","thumbsSwiper","currentIndex","thumbsParams","SwiperClass","thumbsSwiperParams","useOffset","currentThumbsIndex","newThumbsIndex","prevThumbsIndex","nextThumbsIndex","thumbsToActivate","thumbActiveClass","momentum","momentumRatio","momentumBounce","momentumBounceRatio","momentumVelocityRatio","minimumVelocity","lastMoveEvent","pop","velocityEvent","momentumDistance","newPosition","doBounce","afterBouncePosition","bounceAmount","needsLoopFix","moveDistance","currentSlideSize","Grid","slidesNumberEvenToRows","slidesPerRow","numFullColumns","newSlideOrderIndex","column","row","groupIndex","slideIndexInGroup","columnsInGroup","order","addSlide","activeIndexBuffer","baseLength","slidesBuffer","currentSlide","indexToRemove","Manipulation","effectInit","overwriteParams","perspective","overwriteParamsResult","effectTarget","effectParams","transformEl","effectVirtualTransitionEnd","allSlides","eventTriggered","$transitionEndTarget","triggerEvents","EffectFade","fadeEffect","crossFade","tx","ty","slideOpacity","$transitionElements","EffectCube","cubeEffect","slideShadows","shadow","shadowOffset","shadowScale","wrapperRotate","$cubeShadowEl","slideAngle","tz","shadowBefore","shadowAfter","shadowAngle","sin","scale1","scale2","zFactor","createShadow","shadowClass","$shadowContainer","$shadowEl","EffectFlip","flipEffect","limitRotation","rotate","rotateY","rotateX","zIndex","EffectCoverflow","coverflowEffect","stretch","depth","modifier","center","offsetMultiplier","translateZ","slideTransform","$shadowBeforeEl","$shadowAfterEl","EffectCreative","creativeEffect","limitProgress","shadowPerProgress","progressMultiplier","getTranslateValue","isCenteredSlides","margin","r","custom","translateString","rotateString","scaleString","opacityString","shadowOpacity","EffectCards","cardsEffect","tX","tY","tZ","tXAdd","isSwipeToNext","isSwipeToPrev","subProgress","prevY"],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.min.css b/src/main/resources/static/assets/js/swiper/swiper-bundle.min.css new file mode 100644 index 0000000..cb566f2 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.min.css @@ -0,0 +1,638 @@ +/** + * Swiper 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +@font-face { + font-family: swiper-icons; + src: url('data:application/font-woff;charset=utf-8;base64, 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'); + font-weight: 400; + font-style: normal +} + +:root { + --swiper-theme-color: #ffffff +} + +.swiper { + margin-left: auto; + margin-right: auto; + position: relative; + overflow: hidden; + list-style: none; + padding: 0; + z-index: 1 +} + +.swiper-vertical > .swiper-wrapper { + flex-direction: column +} + +.swiper-wrapper { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: flex; + transition-property: transform; + box-sizing: content-box +} + +.swiper-android .swiper-slide, .swiper-wrapper { + transform: translate3d(0px, 0, 0) +} + +.swiper-pointer-events { + touch-action: pan-y +} + +.swiper-pointer-events.swiper-vertical { + touch-action: pan-x +} + +.swiper-slide { + flex-shrink: 0; + width: 100%; + height: 100%; + position: relative; + transition-property: transform +} + +.swiper-slide-invisible-blank { + visibility: hidden +} + +.swiper-autoheight, .swiper-autoheight .swiper-slide { + height: auto +} + +.swiper-autoheight .swiper-wrapper { + align-items: flex-start; + transition-property: transform, height +} + +.swiper-3d, .swiper-3d.swiper-css-mode .swiper-wrapper { + perspective: 1200px +} + +.swiper-3d .swiper-cube-shadow, .swiper-3d .swiper-slide, .swiper-3d .swiper-slide-shadow, .swiper-3d .swiper-slide-shadow-bottom, .swiper-3d .swiper-slide-shadow-left, .swiper-3d .swiper-slide-shadow-right, .swiper-3d .swiper-slide-shadow-top, .swiper-3d .swiper-wrapper { + transform-style: preserve-3d +} + +.swiper-3d .swiper-slide-shadow, .swiper-3d .swiper-slide-shadow-bottom, .swiper-3d .swiper-slide-shadow-left, .swiper-3d .swiper-slide-shadow-right, .swiper-3d .swiper-slide-shadow-top { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10 +} + +.swiper-3d .swiper-slide-shadow { + background: rgba(0, 0, 0, .15) +} + +.swiper-3d .swiper-slide-shadow-left { + background-image: linear-gradient(to left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0)) +} + +.swiper-3d .swiper-slide-shadow-right { + background-image: linear-gradient(to right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0)) +} + +.swiper-3d .swiper-slide-shadow-top { + background-image: linear-gradient(to top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0)) +} + +.swiper-3d .swiper-slide-shadow-bottom { + background-image: linear-gradient(to bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0)) +} + +.swiper-css-mode > .swiper-wrapper { + overflow: auto; + scrollbar-width: none; + -ms-overflow-style: none +} + +.swiper-css-mode > .swiper-wrapper::-webkit-scrollbar { + display: none +} + +.swiper-css-mode > .swiper-wrapper > .swiper-slide { + scroll-snap-align: start start +} + +.swiper-horizontal.swiper-css-mode > .swiper-wrapper { + scroll-snap-type: x mandatory +} + +.swiper-vertical.swiper-css-mode > .swiper-wrapper { + scroll-snap-type: y mandatory +} + +.swiper-centered > .swiper-wrapper::before { + content: ''; + flex-shrink: 0; + order: 9999 +} + +.swiper-centered.swiper-horizontal > .swiper-wrapper > .swiper-slide:first-child { + margin-inline-start: var(--swiper-centered-offset-before) +} + +.swiper-centered.swiper-horizontal > .swiper-wrapper::before { + height: 100%; + min-height: 1px; + width: var(--swiper-centered-offset-after) +} + +.swiper-centered.swiper-vertical > .swiper-wrapper > .swiper-slide:first-child { + margin-block-start: var(--swiper-centered-offset-before) +} + +.swiper-centered.swiper-vertical > .swiper-wrapper::before { + width: 100%; + min-width: 1px; + height: var(--swiper-centered-offset-after) +} + +.swiper-centered > .swiper-wrapper > .swiper-slide { + scroll-snap-align: center center +} + +.swiper-virtual.swiper-css-mode .swiper-wrapper::after { + content: ''; + position: absolute; + left: 0; + top: 0; + pointer-events: none +} + +.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after { + height: 1px; + width: var(--swiper-virtual-size) +} + +.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after { + width: 1px; + height: var(--swiper-virtual-size) +} + +:root { + --swiper-navigation-size: 44px +} + +.swiper-button-next, .swiper-button-prev { + position: absolute; + top: 50%; + width: calc(var(--swiper-navigation-size) / 44 * 27); + height: var(--swiper-navigation-size); + margin-top: calc(0px - (var(--swiper-navigation-size) / 2)); + z-index: 10; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--swiper-navigation-color, var(--swiper-theme-color)) +} + +.swiper-button-next.swiper-button-disabled, .swiper-button-prev.swiper-button-disabled { + opacity: .35; + cursor: auto; + pointer-events: none +} + +.swiper-button-next:after, .swiper-button-prev:after { + font-family: swiper-icons; + font-size: var(--swiper-navigation-size); + text-transform: none !important; + letter-spacing: 0; + text-transform: none; + font-variant: initial; + line-height: 1 +} + +.swiper-button-prev, .swiper-rtl .swiper-button-next { + left: 10px; + right: auto +} + +.swiper-button-prev:after, .swiper-rtl .swiper-button-next:after { + content: 'prev' +} + +.swiper-button-next, .swiper-rtl .swiper-button-prev { + right: 10px; + left: auto +} + +.swiper-button-next:after, .swiper-rtl .swiper-button-prev:after { + content: 'next' +} + +.swiper-button-lock { + display: none +} + +.swiper-pagination { + position: absolute; + text-align: center; + transition: .3s opacity; + transform: translate3d(0, 0, 0); + z-index: 10 +} + +.swiper-pagination.swiper-pagination-hidden { + opacity: 0 +} + +.swiper-horizontal > .swiper-pagination-bullets, .swiper-pagination-bullets.swiper-pagination-horizontal, .swiper-pagination-custom, .swiper-pagination-fraction { + bottom: 10px; + left: 0; + width: 100% +} + +.swiper-pagination-bullets-dynamic { + overflow: hidden; + font-size: 0 +} + +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + transform: scale(.33); + position: relative +} + +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active { + transform: scale(1) +} + +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main { + transform: scale(1) +} + +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev { + transform: scale(.66) +} + +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev { + transform: scale(.33) +} + +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next { + transform: scale(.66) +} + +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next { + transform: scale(.33) +} + +.swiper-pagination-bullet { + width: var(--swiper-pagination-bullet-width, var(--swiper-pagination-bullet-size, 15px)); + height: var(--swiper-pagination-bullet-height, var(--swiper-pagination-bullet-size, 5px)); + display: inline-block; + background: var(--swiper-pagination-bullet-inactive-color, #FFF); + opacity: var(--swiper-pagination-bullet-inactive-opacity, .2) +} + +button.swiper-pagination-bullet { + border: none; + margin: 0; + padding: 0; + box-shadow: none; + -webkit-appearance: none; + appearance: none +} + +.swiper-pagination-clickable .swiper-pagination-bullet { + cursor: pointer +} + +.swiper-pagination-bullet:only-child { + display: none !important +} + +.swiper-pagination-bullet-active { + opacity: var(--swiper-pagination-bullet-opacity, 1); + background: var(--swiper-pagination-color, var(--swiper-theme-color)) +} + +.swiper-pagination-vertical.swiper-pagination-bullets, .swiper-vertical > .swiper-pagination-bullets { + right: 10px; + top: 50%; + transform: translate3d(0px, -50%, 0) +} + +.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet, .swiper-vertical > .swiper-pagination-bullets .swiper-pagination-bullet { + margin: var(--swiper-pagination-bullet-vertical-gap, 6px) 0; + display: block +} + +.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic, .swiper-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic { + top: 50%; + transform: translateY(-50%); + width: 8px +} + +.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet, .swiper-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + display: inline-block; + transition: .2s transform, .2s top +} + +.swiper-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet, .swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet { + margin: 0 var(--swiper-pagination-bullet-horizontal-gap, 4px) +} + +.swiper-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic, .swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic { + left: 50%; + transform: translateX(-50%); + white-space: nowrap +} + +.swiper-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet, .swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + transition: .2s transform, .2s left +} + +.swiper-horizontal.swiper-rtl > .swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + transition: .2s transform, .2s right +} + +.swiper-pagination-progressbar { + background: rgba(0, 0, 0, .25); + position: absolute +} + +.swiper-pagination-progressbar .swiper-pagination-progressbar-fill { + background: var(--swiper-pagination-color, var(--swiper-theme-color)); + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + transform: scale(0); + transform-origin: left top +} + +.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill { + transform-origin: right top +} + +.swiper-horizontal > .swiper-pagination-progressbar, .swiper-pagination-progressbar.swiper-pagination-horizontal, .swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite, .swiper-vertical > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite { + width: 100%; + height: 4px; + left: 0; + top: 0 +} + +.swiper-horizontal > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite, .swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite, .swiper-pagination-progressbar.swiper-pagination-vertical, .swiper-vertical > .swiper-pagination-progressbar { + width: 4px; + height: 100%; + left: 0; + top: 0 +} + +.swiper-pagination-lock { + display: none +} + +.swiper-scrollbar { + border-radius: 10px; + position: relative; + -ms-touch-action: none; + background: rgba(0, 0, 0, .1) +} + +.swiper-horizontal > .swiper-scrollbar { + position: absolute; + left: 1%; + bottom: 3px; + z-index: 50; + height: 5px; + width: 98% +} + +.swiper-vertical > .swiper-scrollbar { + position: absolute; + right: 3px; + top: 1%; + z-index: 50; + width: 5px; + height: 98% +} + +.swiper-scrollbar-drag { + height: 100%; + width: 100%; + position: relative; + background: rgba(0, 0, 0, .5); + border-radius: 10px; + left: 0; + top: 0 +} + +.swiper-scrollbar-cursor-drag { + cursor: move +} + +.swiper-scrollbar-lock { + display: none +} + +.swiper-zoom-container { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + text-align: center +} + +.swiper-zoom-container > canvas, .swiper-zoom-container > img, .swiper-zoom-container > svg { + max-width: 100%; + max-height: 100%; + object-fit: contain +} + +.swiper-slide-zoomed { + cursor: move +} + +.swiper-lazy-preloader { + width: 42px; + height: 42px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -21px; + margin-top: -21px; + z-index: 10; + transform-origin: 50%; + animation: swiper-preloader-spin 1s infinite linear; + box-sizing: border-box; + border: 4px solid var(--swiper-preloader-color, var(--swiper-theme-color)); + border-radius: 50%; + border-top-color: transparent +} + +.swiper-lazy-preloader-white { + --swiper-preloader-color: #fff +} + +.swiper-lazy-preloader-black { + --swiper-preloader-color: #000 +} + +@keyframes swiper-preloader-spin { + 100% { + transform: rotate(360deg) + } +} + +.swiper .swiper-notification { + position: absolute; + left: 0; + top: 0; + pointer-events: none; + opacity: 0; + z-index: -1000 +} + +.swiper-free-mode > .swiper-wrapper { + transition-timing-function: ease-out; + margin: 0 auto +} + +.swiper-grid > .swiper-wrapper { + flex-wrap: wrap +} + +.swiper-grid-column > .swiper-wrapper { + flex-wrap: wrap; + flex-direction: column +} + +.swiper-fade.swiper-free-mode .swiper-slide { + transition-timing-function: ease-out +} + +.swiper-fade .swiper-slide { + pointer-events: none; + transition-property: opacity +} + +.swiper-fade .swiper-slide .swiper-slide { + pointer-events: none +} + +.swiper-fade .swiper-slide-active, .swiper-fade .swiper-slide-active .swiper-slide-active { + pointer-events: auto +} + +.swiper-cube { + overflow: visible +} + +.swiper-cube .swiper-slide { + pointer-events: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1; + visibility: hidden; + transform-origin: 0 0; + width: 100%; + height: 100% +} + +.swiper-cube .swiper-slide .swiper-slide { + pointer-events: none +} + +.swiper-cube.swiper-rtl .swiper-slide { + transform-origin: 100% 0 +} + +.swiper-cube .swiper-slide-active, .swiper-cube .swiper-slide-active .swiper-slide-active { + pointer-events: auto +} + +.swiper-cube .swiper-slide-active, .swiper-cube .swiper-slide-next, .swiper-cube .swiper-slide-next + .swiper-slide, .swiper-cube .swiper-slide-prev { + pointer-events: auto; + visibility: visible +} + +.swiper-cube .swiper-slide-shadow-bottom, .swiper-cube .swiper-slide-shadow-left, .swiper-cube .swiper-slide-shadow-right, .swiper-cube .swiper-slide-shadow-top { + z-index: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden +} + +.swiper-cube .swiper-cube-shadow { + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 100%; + opacity: .6; + z-index: 0 +} + +.swiper-cube .swiper-cube-shadow:before { + content: ''; + background: #000; + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + filter: blur(50px) +} + +.swiper-flip { + overflow: visible +} + +.swiper-flip .swiper-slide { + pointer-events: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1 +} + +.swiper-flip .swiper-slide .swiper-slide { + pointer-events: none +} + +.swiper-flip .swiper-slide-active, .swiper-flip .swiper-slide-active .swiper-slide-active { + pointer-events: auto +} + +.swiper-flip .swiper-slide-shadow-bottom, .swiper-flip .swiper-slide-shadow-left, .swiper-flip .swiper-slide-shadow-right, .swiper-flip .swiper-slide-shadow-top { + z-index: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden +} + +.swiper-creative .swiper-slide { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + overflow: hidden; + transition-property: transform, opacity, height +} + +.swiper-cards { + overflow: visible +} + +.swiper-cards .swiper-slide { + transform-origin: center bottom; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + overflow: hidden +} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.min.js b/src/main/resources/static/assets/js/swiper/swiper-bundle.min.js new file mode 100644 index 0000000..3a0b446 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.min.js @@ -0,0 +1,14 @@ +/** + * Swiper 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +!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).Swiper=t()}(this,(function(){"use strict";function e(e){return null!==e&&"object"==typeof e&&"constructor"in e&&e.constructor===Object}function t(s={},a={}){Object.keys(a).forEach((i=>{void 0===s[i]?s[i]=a[i]:e(a[i])&&e(s[i])&&Object.keys(a[i]).length>0&&t(s[i],a[i])}))}const s={body:{},addEventListener(){},removeEventListener(){},activeElement:{blur(){},nodeName:""},querySelector:()=>null,querySelectorAll:()=>[],getElementById:()=>null,createEvent:()=>({initEvent(){}}),createElement:()=>({children:[],childNodes:[],style:{},setAttribute(){},getElementsByTagName:()=>[]}),createElementNS:()=>({}),importNode:()=>null,location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function a(){const e="undefined"!=typeof document?document:{};return t(e,s),e}const i={document:s,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState(){},pushState(){},go(){},back(){}},CustomEvent:function(){return this},addEventListener(){},removeEventListener(){},getComputedStyle:()=>({getPropertyValue:()=>""}),Image(){},Date(){},screen:{},setTimeout(){},clearTimeout(){},matchMedia:()=>({}),requestAnimationFrame:e=>"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0),cancelAnimationFrame(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function r(){const e="undefined"!=typeof window?window:{};return t(e,i),e}class n extends Array{constructor(e){super(...e||[]),function(e){const t=e.__proto__;Object.defineProperty(e,"__proto__",{get:()=>t,set(e){t.__proto__=e}})}(this)}}function l(e=[]){const t=[];return e.forEach((e=>{Array.isArray(e)?t.push(...l(e)):t.push(e)})),t}function o(e,t){return Array.prototype.filter.call(e,t)}function d(e,t){const s=r(),i=a();let l=[];if(!t&&e instanceof n)return e;if(!e)return new n(l);if("string"==typeof e){const s=e.trim();if(s.indexOf("<")>=0&&s.indexOf(">")>=0){let e="div";0===s.indexOf("e.split(" "))));return this.forEach((e=>{e.classList.add(...t)})),this},removeClass:function(...e){const t=l(e.map((e=>e.split(" "))));return this.forEach((e=>{e.classList.remove(...t)})),this},hasClass:function(...e){const t=l(e.map((e=>e.split(" "))));return o(this,(e=>t.filter((t=>e.classList.contains(t))).length>0)).length>0},toggleClass:function(...e){const t=l(e.map((e=>e.split(" "))));this.forEach((e=>{t.forEach((t=>{e.classList.toggle(t)}))}))},attr:function(e,t){if(1===arguments.length&&"string"==typeof e)return this[0]?this[0].getAttribute(e):void 0;for(let s=0;s=0;e-=1){const s=n[e];a&&s.listener===a||a&&s.listener&&s.listener.dom7proxy&&s.listener.dom7proxy===a?(r.removeEventListener(t,s.proxyListener,i),n.splice(e,1)):a||(r.removeEventListener(t,s.proxyListener,i),n.splice(e,1))}}}return this},trigger:function(...e){const t=r(),s=e[0].split(" "),a=e[1];for(let i=0;it>0)),i.dispatchEvent(s),i.dom7EventData=[],delete i.dom7EventData}}}return this},transitionEnd:function(e){const t=this;return e&&t.on("transitionend",(function s(a){a.target===this&&(e.call(this,a),t.off("transitionend",s))})),this},outerWidth:function(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetWidth+parseFloat(e.getPropertyValue("margin-right"))+parseFloat(e.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},outerHeight:function(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetHeight+parseFloat(e.getPropertyValue("margin-top"))+parseFloat(e.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},styles:function(){const e=r();return this[0]?e.getComputedStyle(this[0],null):{}},offset:function(){if(this.length>0){const e=r(),t=a(),s=this[0],i=s.getBoundingClientRect(),n=t.body,l=s.clientTop||n.clientTop||0,o=s.clientLeft||n.clientLeft||0,d=s===e?e.scrollY:s.scrollTop,c=s===e?e.scrollX:s.scrollLeft;return{top:i.top+d-l,left:i.left+c-o}}return null},css:function(e,t){const s=r();let a;if(1===arguments.length){if("string"!=typeof e){for(a=0;a{e.apply(t,[t,s])})),this):this},html:function(e){if(void 0===e)return this[0]?this[0].innerHTML:null;for(let t=0;tt-1)return d([]);if(e<0){const s=t+e;return d(s<0?[]:[this[s]])}return d([this[e]])},append:function(...e){let t;const s=a();for(let a=0;a=0;i-=1)this[s].insertBefore(a.childNodes[i],this[s].childNodes[0])}else if(e instanceof n)for(i=0;i0?e?this[0].nextElementSibling&&d(this[0].nextElementSibling).is(e)?d([this[0].nextElementSibling]):d([]):this[0].nextElementSibling?d([this[0].nextElementSibling]):d([]):d([])},nextAll:function(e){const t=[];let s=this[0];if(!s)return d([]);for(;s.nextElementSibling;){const a=s.nextElementSibling;e?d(a).is(e)&&t.push(a):t.push(a),s=a}return d(t)},prev:function(e){if(this.length>0){const t=this[0];return e?t.previousElementSibling&&d(t.previousElementSibling).is(e)?d([t.previousElementSibling]):d([]):t.previousElementSibling?d([t.previousElementSibling]):d([])}return d([])},prevAll:function(e){const t=[];let s=this[0];if(!s)return d([]);for(;s.previousElementSibling;){const a=s.previousElementSibling;e?d(a).is(e)&&t.push(a):t.push(a),s=a}return d(t)},parent:function(e){const t=[];for(let s=0;s6&&(i=i.split(", ").map((e=>e.replace(",","."))).join(", ")),n=new s.WebKitCSSMatrix("none"===i?"":i)):(n=l.MozTransform||l.OTransform||l.MsTransform||l.msTransform||l.transform||l.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),a=n.toString().split(",")),"x"===t&&(i=s.WebKitCSSMatrix?n.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=s.WebKitCSSMatrix?n.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function m(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function f(...e){const t=Object(e[0]),s=["__proto__","constructor","prototype"];for(let i=1;is.indexOf(e)<0));for(let s=0,a=e.length;si?"next":"prev",c=(e,t)=>"next"===d&&e>=t||"prev"===d&&e<=t,p=()=>{n=(new Date).getTime(),null===l&&(l=n);const r=Math.max(Math.min((n-l)/o,1),0),d=.5-Math.cos(r*Math.PI)/2;let u=i+d*(t-i);if(c(u,t)&&(u=t),e.wrapperEl.scrollTo({[s]:u}),c(u,t))return e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.scrollSnapType="",setTimeout((()=>{e.wrapperEl.style.overflow="",e.wrapperEl.scrollTo({[s]:u})})),void a.cancelAnimationFrame(e.cssModeFrameID);e.cssModeFrameID=a.requestAnimationFrame(p)};p()}let w,b,x;function y(){return w||(w=function(){const e=r(),t=a();return{smoothScroll:t.documentElement&&"scrollBehavior"in t.documentElement.style,touch:!!("ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch),passiveListener:function(){let t=!1;try{const s=Object.defineProperty({},"passive",{get(){t=!0}});e.addEventListener("testPassiveListener",null,s)}catch(e){}return t}(),gestures:"ongesturestart"in e}}()),w}function E(e={}){return b||(b=function({userAgent:e}={}){const t=y(),s=r(),a=s.navigator.platform,i=e||s.navigator.userAgent,n={ios:!1,android:!1},l=s.screen.width,o=s.screen.height,d=i.match(/(Android);?[\s\/]+([\d.]+)?/);let c=i.match(/(iPad).*OS\s([\d_]+)/);const p=i.match(/(iPod)(.*OS\s([\d_]+))?/),u=!c&&i.match(/(iPhone\sOS|iOS)\s([\d_]+)/),h="Win32"===a;let m="MacIntel"===a;return!c&&m&&t.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(`${l}x${o}`)>=0&&(c=i.match(/(Version)\/([\d.]+)/),c||(c=[0,1,"13_0_0"]),m=!1),d&&!h&&(n.os="android",n.android=!0),(c||u||p)&&(n.os="ios",n.ios=!0),n}(e)),b}function T(){return x||(x=function(){const e=r();return{isSafari:function(){const t=e.navigator.userAgent.toLowerCase();return t.indexOf("safari")>=0&&t.indexOf("chrome")<0&&t.indexOf("android")<0}(),isWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent)}}()),x}Object.keys(c).forEach((e=>{Object.defineProperty(d.fn,e,{value:c[e],writable:!0})}));var C={on(e,t,s){const a=this;if("function"!=typeof t)return a;const i=s?"unshift":"push";return e.split(" ").forEach((e=>{a.eventsListeners[e]||(a.eventsListeners[e]=[]),a.eventsListeners[e][i](t)})),a},once(e,t,s){const a=this;if("function"!=typeof t)return a;function i(...s){a.off(e,i),i.__emitterProxy&&delete i.__emitterProxy,t.apply(a,s)}return i.__emitterProxy=t,a.on(e,i,s)},onAny(e,t){const s=this;if("function"!=typeof e)return s;const a=t?"unshift":"push";return s.eventsAnyListeners.indexOf(e)<0&&s.eventsAnyListeners[a](e),s},offAny(e){const t=this;if(!t.eventsAnyListeners)return t;const s=t.eventsAnyListeners.indexOf(e);return s>=0&&t.eventsAnyListeners.splice(s,1),t},off(e,t){const s=this;return s.eventsListeners?(e.split(" ").forEach((e=>{void 0===t?s.eventsListeners[e]=[]:s.eventsListeners[e]&&s.eventsListeners[e].forEach(((a,i)=>{(a===t||a.__emitterProxy&&a.__emitterProxy===t)&&s.eventsListeners[e].splice(i,1)}))})),s):s},emit(...e){const t=this;if(!t.eventsListeners)return t;let s,a,i;"string"==typeof e[0]||Array.isArray(e[0])?(s=e[0],a=e.slice(1,e.length),i=t):(s=e[0].events,a=e[0].data,i=e[0].context||t),a.unshift(i);return(Array.isArray(s)?s:s.split(" ")).forEach((e=>{t.eventsAnyListeners&&t.eventsAnyListeners.length&&t.eventsAnyListeners.forEach((t=>{t.apply(i,[e,...a])})),t.eventsListeners&&t.eventsListeners[e]&&t.eventsListeners[e].forEach((e=>{e.apply(i,a)}))})),t}};function $({swiper:e,runCallbacks:t,direction:s,step:a}){const{activeIndex:i,previousIndex:r}=e;let n=s;if(n||(n=i>r?"next":i0)return;if(n.isTouched&&n.isMoved)return;!!l.noSwipingClass&&""!==l.noSwipingClass&&p.target&&p.target.shadowRoot&&e.path&&e.path[0]&&(h=d(e.path[0]));const m=l.noSwipingSelector?l.noSwipingSelector:`.${l.noSwipingClass}`,f=!(!p.target||!p.target.shadowRoot);if(l.noSwiping&&(f?function(e,t=this){return function t(s){return s&&s!==a()&&s!==r()?(s.assignedSlot&&(s=s.assignedSlot),s.closest(e)||t(s.getRootNode().host)):null}(t)}(m,p.target):h.closest(m)[0]))return void(t.allowClick=!0);if(l.swipeHandler&&!h.closest(l.swipeHandler)[0])return;o.currentX="touchstart"===p.type?p.targetTouches[0].pageX:p.pageX,o.currentY="touchstart"===p.type?p.targetTouches[0].pageY:p.pageY;const g=o.currentX,v=o.currentY,w=l.edgeSwipeDetection||l.iOSEdgeSwipeDetection,b=l.edgeSwipeThreshold||l.iOSEdgeSwipeThreshold;if(w&&(g<=b||g>=i.innerWidth-b)){if("prevent"!==w)return;e.preventDefault()}if(Object.assign(n,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),o.startX=g,o.startY=v,n.touchStartTime=u(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,l.threshold>0&&(n.allowThresholdMove=!1),"touchstart"!==p.type){let e=!0;h.is(n.focusableElements)&&(e=!1),s.activeElement&&d(s.activeElement).is(n.focusableElements)&&s.activeElement!==h[0]&&s.activeElement.blur();const a=e&&t.allowTouchMove&&l.touchStartPreventDefault;!l.touchStartForcePreventDefault&&!a||h[0].isContentEditable||p.preventDefault()}t.emit("touchStart",p)}function M(e){const t=a(),s=this,i=s.touchEventsData,{params:r,touches:n,rtlTranslate:l,enabled:o}=s;if(!o)return;let c=e;if(c.originalEvent&&(c=c.originalEvent),!i.isTouched)return void(i.startMoving&&i.isScrolling&&s.emit("touchMoveOpposite",c));if(i.isTouchEvent&&"touchmove"!==c.type)return;const p="touchmove"===c.type&&c.targetTouches&&(c.targetTouches[0]||c.changedTouches[0]),h="touchmove"===c.type?p.pageX:c.pageX,m="touchmove"===c.type?p.pageY:c.pageY;if(c.preventedByNestedSwiper)return n.startX=h,void(n.startY=m);if(!s.allowTouchMove)return s.allowClick=!1,void(i.isTouched&&(Object.assign(n,{startX:h,startY:m,currentX:h,currentY:m}),i.touchStartTime=u()));if(i.isTouchEvent&&r.touchReleaseOnEdges&&!r.loop)if(s.isVertical()){if(mn.startY&&s.translate>=s.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else if(hn.startX&&s.translate>=s.minTranslate())return;if(i.isTouchEvent&&t.activeElement&&c.target===t.activeElement&&d(c.target).is(i.focusableElements))return i.isMoved=!0,void(s.allowClick=!1);if(i.allowTouchCallbacks&&s.emit("touchMove",c),c.targetTouches&&c.targetTouches.length>1)return;n.currentX=h,n.currentY=m;const f=n.currentX-n.startX,g=n.currentY-n.startY;if(s.params.threshold&&Math.sqrt(f**2+g**2)=25&&(e=180*Math.atan2(Math.abs(g),Math.abs(f))/Math.PI,i.isScrolling=s.isHorizontal()?e>r.touchAngle:90-e>r.touchAngle)}if(i.isScrolling&&s.emit("touchMoveOpposite",c),void 0===i.startMoving&&(n.currentX===n.startX&&n.currentY===n.startY||(i.startMoving=!0)),i.isScrolling)return void(i.isTouched=!1);if(!i.startMoving)return;s.allowClick=!1,!r.cssMode&&c.cancelable&&c.preventDefault(),r.touchMoveStopPropagation&&!r.nested&&c.stopPropagation(),i.isMoved||(r.loop&&!r.cssMode&&s.loopFix(),i.startTranslate=s.getTranslate(),s.setTransition(0),s.animating&&s.$wrapperEl.trigger("webkitTransitionEnd transitionend"),i.allowMomentumBounce=!1,!r.grabCursor||!0!==s.allowSlideNext&&!0!==s.allowSlidePrev||s.setGrabCursor(!0),s.emit("sliderFirstMove",c)),s.emit("sliderMove",c),i.isMoved=!0;let v=s.isHorizontal()?f:g;n.diff=v,v*=r.touchRatio,l&&(v=-v),s.swipeDirection=v>0?"prev":"next",i.currentTranslate=v+i.startTranslate;let w=!0,b=r.resistanceRatio;if(r.touchReleaseOnEdges&&(b=0),v>0&&i.currentTranslate>s.minTranslate()?(w=!1,r.resistance&&(i.currentTranslate=s.minTranslate()-1+(-s.minTranslate()+i.startTranslate+v)**b)):v<0&&i.currentTranslatei.startTranslate&&(i.currentTranslate=i.startTranslate),s.allowSlidePrev||s.allowSlideNext||(i.currentTranslate=i.startTranslate),r.threshold>0){if(!(Math.abs(v)>r.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,n.startX=n.currentX,n.startY=n.currentY,i.currentTranslate=i.startTranslate,void(n.diff=s.isHorizontal()?n.currentX-n.startX:n.currentY-n.startY)}r.followFinger&&!r.cssMode&&((r.freeMode&&r.freeMode.enabled&&s.freeMode||r.watchSlidesProgress)&&(s.updateActiveIndex(),s.updateSlidesClasses()),s.params.freeMode&&r.freeMode.enabled&&s.freeMode&&s.freeMode.onTouchMove(),s.updateProgress(i.currentTranslate),s.setTranslate(i.currentTranslate))}function P(e){const t=this,s=t.touchEventsData,{params:a,touches:i,rtlTranslate:r,slidesGrid:n,enabled:l}=t;if(!l)return;let o=e;if(o.originalEvent&&(o=o.originalEvent),s.allowTouchCallbacks&&t.emit("touchEnd",o),s.allowTouchCallbacks=!1,!s.isTouched)return s.isMoved&&a.grabCursor&&t.setGrabCursor(!1),s.isMoved=!1,void(s.startMoving=!1);a.grabCursor&&s.isMoved&&s.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);const d=u(),c=d-s.touchStartTime;if(t.allowClick&&(t.updateClickedSlide(o),t.emit("tap click",o),c<300&&d-s.lastClickTime<300&&t.emit("doubleTap doubleClick",o)),s.lastClickTime=u(),p((()=>{t.destroyed||(t.allowClick=!0)})),!s.isTouched||!s.isMoved||!t.swipeDirection||0===i.diff||s.currentTranslate===s.startTranslate)return s.isTouched=!1,s.isMoved=!1,void(s.startMoving=!1);let h;if(s.isTouched=!1,s.isMoved=!1,s.startMoving=!1,h=a.followFinger?r?t.translate:-t.translate:-s.currentTranslate,a.cssMode)return;if(t.params.freeMode&&a.freeMode.enabled)return void t.freeMode.onTouchEnd({currentPos:h});let m=0,f=t.slidesSizesGrid[0];for(let e=0;e=n[e]&&h=n[e]&&(m=e,f=n[n.length-1]-n[n.length-2])}const g=(h-n[m])/f,v=ma.longSwipesMs){if(!a.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(g>=a.longSwipesRatio?t.slideTo(m+v):t.slideTo(m)),"prev"===t.swipeDirection&&(g>1-a.longSwipesRatio?t.slideTo(m+v):t.slideTo(m))}else{if(!a.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(o.target===t.navigation.nextEl||o.target===t.navigation.prevEl)?o.target===t.navigation.nextEl?t.slideTo(m+v):t.slideTo(m):("next"===t.swipeDirection&&t.slideTo(m+v),"prev"===t.swipeDirection&&t.slideTo(m))}}function k(){const e=this,{params:t,el:s}=e;if(s&&0===s.offsetWidth)return;t.breakpoints&&e.setBreakpoint();const{allowSlideNext:a,allowSlidePrev:i,snapGrid:r}=e;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses(),("auto"===t.slidesPerView||t.slidesPerView>1)&&e.isEnd&&!e.isBeginning&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.run(),e.allowSlidePrev=i,e.allowSlideNext=a,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}function z(e){const t=this;t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function O(){const e=this,{wrapperEl:t,rtlTranslate:s,enabled:a}=e;if(!a)return;let i;e.previousTranslate=e.translate,e.isHorizontal()?e.translate=-t.scrollLeft:e.translate=-t.scrollTop,-0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();const r=e.maxTranslate()-e.minTranslate();i=0===r?0:(e.translate-e.minTranslate())/r,i!==e.progress&&e.updateProgress(s?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}let I=!1;function L(){}const A=(e,t)=>{const s=a(),{params:i,touchEvents:r,el:n,wrapperEl:l,device:o,support:d}=e,c=!!i.nested,p="on"===t?"addEventListener":"removeEventListener",u=t;if(d.touch){const t=!("touchstart"!==r.start||!d.passiveListener||!i.passiveListeners)&&{passive:!0,capture:!1};n[p](r.start,e.onTouchStart,t),n[p](r.move,e.onTouchMove,d.passiveListener?{passive:!1,capture:c}:c),n[p](r.end,e.onTouchEnd,t),r.cancel&&n[p](r.cancel,e.onTouchEnd,t)}else n[p](r.start,e.onTouchStart,!1),s[p](r.move,e.onTouchMove,c),s[p](r.end,e.onTouchEnd,!1);(i.preventClicks||i.preventClicksPropagation)&&n[p]("click",e.onClick,!0),i.cssMode&&l[p]("scroll",e.onScroll),i.updateOnWindowResize?e[u](o.ios||o.android?"resize orientationchange observerUpdate":"resize observerUpdate",k,!0):e[u]("observerUpdate",k,!0)};const D=(e,t)=>e.grid&&t.grid&&t.grid.rows>1;var G={init:!0,direction:"horizontal",touchEventsTarget:"wrapper",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!0,nested:!1,createElements:!1,enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerGroup:1,slidesPerGroupSkip:0,slidesPerGroupAuto:!1,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:0,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopFillGroupWithBlank:!1,loopPreventsSlide:!0,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,containerModifierClass:"swiper-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-invisible-blank",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",runCallbacksOnInit:!0,_emitClasses:!1};function N(e,t){return function(s={}){const a=Object.keys(s)[0],i=s[a];"object"==typeof i&&null!==i?(["navigation","pagination","scrollbar"].indexOf(a)>=0&&!0===e[a]&&(e[a]={auto:!0}),a in e&&"enabled"in i?(!0===e[a]&&(e[a]={enabled:!0}),"object"!=typeof e[a]||"enabled"in e[a]||(e[a].enabled=!0),e[a]||(e[a]={enabled:!1}),f(t,s)):f(t,s)):f(t,s)}}const B={eventsEmitter:C,update:{updateSize:function(){const e=this;let t,s;const a=e.$el;t=void 0!==e.params.width&&null!==e.params.width?e.params.width:a[0].clientWidth,s=void 0!==e.params.height&&null!==e.params.height?e.params.height:a[0].clientHeight,0===t&&e.isHorizontal()||0===s&&e.isVertical()||(t=t-parseInt(a.css("padding-left")||0,10)-parseInt(a.css("padding-right")||0,10),s=s-parseInt(a.css("padding-top")||0,10)-parseInt(a.css("padding-bottom")||0,10),Number.isNaN(t)&&(t=0),Number.isNaN(s)&&(s=0),Object.assign(e,{width:t,height:s,size:e.isHorizontal()?t:s}))},updateSlides:function(){const e=this;function t(t){return e.isHorizontal()?t:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[t]}function s(e,s){return parseFloat(e.getPropertyValue(t(s))||0)}const a=e.params,{$wrapperEl:i,size:r,rtlTranslate:n,wrongRTL:l}=e,o=e.virtual&&a.virtual.enabled,d=o?e.virtual.slides.length:e.slides.length,c=i.children(`.${e.params.slideClass}`),p=o?e.virtual.slides.length:c.length;let u=[];const h=[],m=[];let f=a.slidesOffsetBefore;"function"==typeof f&&(f=a.slidesOffsetBefore.call(e));let v=a.slidesOffsetAfter;"function"==typeof v&&(v=a.slidesOffsetAfter.call(e));const w=e.snapGrid.length,b=e.slidesGrid.length;let x=a.spaceBetween,y=-f,E=0,T=0;if(void 0===r)return;"string"==typeof x&&x.indexOf("%")>=0&&(x=parseFloat(x.replace("%",""))/100*r),e.virtualSize=-x,n?c.css({marginLeft:"",marginBottom:"",marginTop:""}):c.css({marginRight:"",marginBottom:"",marginTop:""}),a.centeredSlides&&a.cssMode&&(g(e.wrapperEl,"--swiper-centered-offset-before",""),g(e.wrapperEl,"--swiper-centered-offset-after",""));const C=a.grid&&a.grid.rows>1&&e.grid;let $;C&&e.grid.initSlides(p);const S="auto"===a.slidesPerView&&a.breakpoints&&Object.keys(a.breakpoints).filter((e=>void 0!==a.breakpoints[e].slidesPerView)).length>0;for(let i=0;i1&&u.push(e.virtualSize-r)}if(0===u.length&&(u=[0]),0!==a.spaceBetween){const s=e.isHorizontal()&&n?"marginLeft":t("marginRight");c.filter(((e,t)=>!a.cssMode||t!==c.length-1)).css({[s]:`${x}px`})}if(a.centeredSlides&&a.centeredSlidesBounds){let e=0;m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween;const t=e-r;u=u.map((e=>e<0?-f:e>t?t+v:e))}if(a.centerInsufficientSlides){let e=0;if(m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween,e{u[s]=e-t})),h.forEach(((e,s)=>{h[s]=e+t}))}}if(Object.assign(e,{slides:c,snapGrid:u,slidesGrid:h,slidesSizesGrid:m}),a.centeredSlides&&a.cssMode&&!a.centeredSlidesBounds){g(e.wrapperEl,"--swiper-centered-offset-before",-u[0]+"px"),g(e.wrapperEl,"--swiper-centered-offset-after",e.size/2-m[m.length-1]/2+"px");const t=-e.snapGrid[0],s=-e.slidesGrid[0];e.snapGrid=e.snapGrid.map((e=>e+t)),e.slidesGrid=e.slidesGrid.map((e=>e+s))}p!==d&&e.emit("slidesLengthChange"),u.length!==w&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),h.length!==b&&e.emit("slidesGridLengthChange"),a.watchSlidesProgress&&e.updateSlidesOffset()},updateAutoHeight:function(e){const t=this,s=[],a=t.virtual&&t.params.virtual.enabled;let i,r=0;"number"==typeof e?t.setTransition(e):!0===e&&t.setTransition(t.params.speed);const n=e=>a?t.slides.filter((t=>parseInt(t.getAttribute("data-swiper-slide-index"),10)===e))[0]:t.slides.eq(e)[0];if("auto"!==t.params.slidesPerView&&t.params.slidesPerView>1)if(t.params.centeredSlides)t.visibleSlides.each((e=>{s.push(e)}));else for(i=0;it.slides.length&&!a)break;s.push(n(e))}else s.push(n(t.activeIndex));for(i=0;ir?e:r}r&&t.$wrapperEl.css("height",`${r}px`)},updateSlidesOffset:function(){const e=this,t=e.slides;for(let s=0;s=0&&p1&&u<=t.size||p<=0&&u>=t.size)&&(t.visibleSlides.push(l),t.visibleSlidesIndexes.push(e),a.eq(e).addClass(s.slideVisibleClass)),l.progress=i?-d:d,l.originalProgress=i?-c:c}t.visibleSlides=d(t.visibleSlides)},updateProgress:function(e){const t=this;if(void 0===e){const s=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*s||0}const s=t.params,a=t.maxTranslate()-t.minTranslate();let{progress:i,isBeginning:r,isEnd:n}=t;const l=r,o=n;0===a?(i=0,r=!0,n=!0):(i=(e-t.minTranslate())/a,r=i<=0,n=i>=1),Object.assign(t,{progress:i,isBeginning:r,isEnd:n}),(s.watchSlidesProgress||s.centeredSlides&&s.autoHeight)&&t.updateSlidesProgress(e),r&&!l&&t.emit("reachBeginning toEdge"),n&&!o&&t.emit("reachEnd toEdge"),(l&&!r||o&&!n)&&t.emit("fromEdge"),t.emit("progress",i)},updateSlidesClasses:function(){const e=this,{slides:t,params:s,$wrapperEl:a,activeIndex:i,realIndex:r}=e,n=e.virtual&&s.virtual.enabled;let l;t.removeClass(`${s.slideActiveClass} ${s.slideNextClass} ${s.slidePrevClass} ${s.slideDuplicateActiveClass} ${s.slideDuplicateNextClass} ${s.slideDuplicatePrevClass}`),l=n?e.$wrapperEl.find(`.${s.slideClass}[data-swiper-slide-index="${i}"]`):t.eq(i),l.addClass(s.slideActiveClass),s.loop&&(l.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass));let o=l.nextAll(`.${s.slideClass}`).eq(0).addClass(s.slideNextClass);s.loop&&0===o.length&&(o=t.eq(0),o.addClass(s.slideNextClass));let d=l.prevAll(`.${s.slideClass}`).eq(0).addClass(s.slidePrevClass);s.loop&&0===d.length&&(d=t.eq(-1),d.addClass(s.slidePrevClass)),s.loop&&(o.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass),d.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass)),e.emitSlidesClasses()},updateActiveIndex:function(e){const t=this,s=t.rtlTranslate?t.translate:-t.translate,{slidesGrid:a,snapGrid:i,params:r,activeIndex:n,realIndex:l,snapIndex:o}=t;let d,c=e;if(void 0===c){for(let e=0;e=a[e]&&s=a[e]&&s=a[e]&&(c=e);r.normalizeSlideIndex&&(c<0||void 0===c)&&(c=0)}if(i.indexOf(s)>=0)d=i.indexOf(s);else{const e=Math.min(r.slidesPerGroupSkip,c);d=e+Math.floor((c-e)/r.slidesPerGroup)}if(d>=i.length&&(d=i.length-1),c===n)return void(d!==o&&(t.snapIndex=d,t.emit("snapIndexChange")));const p=parseInt(t.slides.eq(c).attr("data-swiper-slide-index")||c,10);Object.assign(t,{snapIndex:d,realIndex:p,previousIndex:n,activeIndex:c}),t.emit("activeIndexChange"),t.emit("snapIndexChange"),l!==p&&t.emit("realIndexChange"),(t.initialized||t.params.runCallbacksOnInit)&&t.emit("slideChange")},updateClickedSlide:function(e){const t=this,s=t.params,a=d(e.target).closest(`.${s.slideClass}`)[0];let i,r=!1;if(a)for(let e=0;eo?o:a&&e=o.length&&(g=o.length-1),(p||l.initialSlide||0)===(c||0)&&s&&r.emit("beforeSlideChangeStart");const w=-o[g];if(r.updateProgress(w),l.normalizeSlideIndex)for(let e=0;e=s&&t=s&&t=s&&(n=e)}if(r.initialized&&n!==p){if(!r.allowSlideNext&&wr.translate&&w>r.maxTranslate()&&(p||0)!==n)return!1}let b;if(b=n>p?"next":n{r.wrapperEl.style.scrollSnapType="",r._swiperImmediateVirtual=!1}))}else{if(!r.support.smoothScroll)return v({swiper:r,targetPosition:s,side:e?"left":"top"}),!0;h.scrollTo({[e?"left":"top"]:s,behavior:"smooth"})}return!0}return 0===t?(r.setTransition(0),r.setTranslate(w),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,b),r.transitionEnd(s,b)):(r.setTransition(t),r.setTranslate(w),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,b),r.animating||(r.animating=!0,r.onSlideToWrapperTransitionEnd||(r.onSlideToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.$wrapperEl[0].removeEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].removeEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd),r.onSlideToWrapperTransitionEnd=null,delete r.onSlideToWrapperTransitionEnd,r.transitionEnd(s,b))}),r.$wrapperEl[0].addEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].addEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd))),!0},slideToLoop:function(e=0,t=this.params.speed,s=!0,a){const i=this;let r=e;return i.params.loop&&(r+=i.loopedSlides),i.slideTo(r,t,s,a)},slideNext:function(e=this.params.speed,t=!0,s){const a=this,{animating:i,enabled:r,params:n}=a;if(!r)return a;let l=n.slidesPerGroup;"auto"===n.slidesPerView&&1===n.slidesPerGroup&&n.slidesPerGroupAuto&&(l=Math.max(a.slidesPerViewDynamic("current",!0),1));const o=a.activeIndexc(e)));let h=n[u.indexOf(p)-1];if(void 0===h&&i.cssMode){let e;n.forEach(((t,s)=>{p>=t&&(e=s)})),void 0!==e&&(h=n[e>0?e-1:e])}let m=0;return void 0!==h&&(m=l.indexOf(h),m<0&&(m=a.activeIndex-1),"auto"===i.slidesPerView&&1===i.slidesPerGroup&&i.slidesPerGroupAuto&&(m=m-a.slidesPerViewDynamic("previous",!0)+1,m=Math.max(m,0))),a.slideTo(m,e,t,s)},slideReset:function(e=this.params.speed,t=!0,s){return this.slideTo(this.activeIndex,e,t,s)},slideToClosest:function(e=this.params.speed,t=!0,s,a=.5){const i=this;let r=i.activeIndex;const n=Math.min(i.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/i.params.slidesPerGroup),o=i.rtlTranslate?i.translate:-i.translate;if(o>=i.snapGrid[l]){const e=i.snapGrid[l];o-e>(i.snapGrid[l+1]-e)*a&&(r+=i.params.slidesPerGroup)}else{const e=i.snapGrid[l-1];o-e<=(i.snapGrid[l]-e)*a&&(r-=i.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,i.slidesGrid.length-1),i.slideTo(r,e,t,s)},slideToClickedSlide:function(){const e=this,{params:t,$wrapperEl:s}=e,a="auto"===t.slidesPerView?e.slidesPerViewDynamic():t.slidesPerView;let i,r=e.clickedIndex;if(t.loop){if(e.animating)return;i=parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"),10),t.centeredSlides?re.slides.length-e.loopedSlides+a/2?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),p((()=>{e.slideTo(r)}))):e.slideTo(r):r>e.slides.length-a?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),p((()=>{e.slideTo(r)}))):e.slideTo(r)}else e.slideTo(r)}},loop:{loopCreate:function(){const e=this,t=a(),{params:s,$wrapperEl:i}=e,r=d(i.children()[0].parentNode);r.children(`.${s.slideClass}.${s.slideDuplicateClass}`).remove();let n=r.children(`.${s.slideClass}`);if(s.loopFillGroupWithBlank){const e=s.slidesPerGroup-n.length%s.slidesPerGroup;if(e!==s.slidesPerGroup){for(let a=0;an.length&&(e.loopedSlides=n.length);const l=[],o=[];n.each(((t,s)=>{const a=d(t);s=n.length-e.loopedSlides&&l.push(t),a.attr("data-swiper-slide-index",s)}));for(let e=0;e=0;e-=1)r.prepend(d(l[e].cloneNode(!0)).addClass(s.slideDuplicateClass))},loopFix:function(){const e=this;e.emit("beforeLoopFix");const{activeIndex:t,slides:s,loopedSlides:a,allowSlidePrev:i,allowSlideNext:r,snapGrid:n,rtlTranslate:l}=e;let o;e.allowSlidePrev=!0,e.allowSlideNext=!0;const d=-n[t]-e.getTranslate();if(t=s.length-a){o=-s.length+t+a,o+=a;e.slideTo(o,0,!1,!0)&&0!==d&&e.setTranslate((l?-e.translate:e.translate)-d)}e.allowSlidePrev=i,e.allowSlideNext=r,e.emit("loopFix")},loopDestroy:function(){const{$wrapperEl:e,params:t,slides:s}=this;e.children(`.${t.slideClass}.${t.slideDuplicateClass},.${t.slideClass}.${t.slideBlankClass}`).remove(),s.removeAttr("data-swiper-slide-index")}},grabCursor:{setGrabCursor:function(e){const t=this;if(t.support.touch||!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)return;const s="container"===t.params.touchEventsTarget?t.el:t.wrapperEl;s.style.cursor="move",s.style.cursor=e?"-webkit-grabbing":"-webkit-grab",s.style.cursor=e?"-moz-grabbin":"-moz-grab",s.style.cursor=e?"grabbing":"grab"},unsetGrabCursor:function(){const e=this;e.support.touch||e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e["container"===e.params.touchEventsTarget?"el":"wrapperEl"].style.cursor="")}},events:{attachEvents:function(){const e=this,t=a(),{params:s,support:i}=e;e.onTouchStart=S.bind(e),e.onTouchMove=M.bind(e),e.onTouchEnd=P.bind(e),s.cssMode&&(e.onScroll=O.bind(e)),e.onClick=z.bind(e),i.touch&&!I&&(t.addEventListener("touchstart",L),I=!0),A(e,"on")},detachEvents:function(){A(this,"off")}},breakpoints:{setBreakpoint:function(){const e=this,{activeIndex:t,initialized:s,loopedSlides:a=0,params:i,$el:r}=e,n=i.breakpoints;if(!n||n&&0===Object.keys(n).length)return;const l=e.getBreakpoint(n,e.params.breakpointsBase,e.el);if(!l||e.currentBreakpoint===l)return;const o=(l in n?n[l]:void 0)||e.originalParams,d=D(e,i),c=D(e,o),p=i.enabled;d&&!c?(r.removeClass(`${i.containerModifierClass}grid ${i.containerModifierClass}grid-column`),e.emitContainerClasses()):!d&&c&&(r.addClass(`${i.containerModifierClass}grid`),(o.grid.fill&&"column"===o.grid.fill||!o.grid.fill&&"column"===i.grid.fill)&&r.addClass(`${i.containerModifierClass}grid-column`),e.emitContainerClasses());const u=o.direction&&o.direction!==i.direction,h=i.loop&&(o.slidesPerView!==i.slidesPerView||u);u&&s&&e.changeDirection(),f(e.params,o);const m=e.params.enabled;Object.assign(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),p&&!m?e.disable():!p&&m&&e.enable(),e.currentBreakpoint=l,e.emit("_beforeBreakpoint",o),h&&s&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-a+e.loopedSlides,0,!1)),e.emit("breakpoint",o)},getBreakpoint:function(e,t="window",s){if(!e||"container"===t&&!s)return;let a=!1;const i=r(),n="window"===t?i.innerHeight:s.clientHeight,l=Object.keys(e).map((e=>{if("string"==typeof e&&0===e.indexOf("@")){const t=parseFloat(e.substr(1));return{value:n*t,point:e}}return{value:e,point:e}}));l.sort(((e,t)=>parseInt(e.value,10)-parseInt(t.value,10)));for(let e=0;es}else e.isLocked=1===e.snapGrid.length;!0===s.allowSlideNext&&(e.allowSlideNext=!e.isLocked),!0===s.allowSlidePrev&&(e.allowSlidePrev=!e.isLocked),t&&t!==e.isLocked&&(e.isEnd=!1),t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock")}},classes:{addClasses:function(){const e=this,{classNames:t,params:s,rtl:a,$el:i,device:r,support:n}=e,l=function(e,t){const s=[];return e.forEach((e=>{"object"==typeof e?Object.keys(e).forEach((a=>{e[a]&&s.push(t+a)})):"string"==typeof e&&s.push(t+e)})),s}(["initialized",s.direction,{"pointer-events":!n.touch},{"free-mode":e.params.freeMode&&s.freeMode.enabled},{autoheight:s.autoHeight},{rtl:a},{grid:s.grid&&s.grid.rows>1},{"grid-column":s.grid&&s.grid.rows>1&&"column"===s.grid.fill},{android:r.android},{ios:r.ios},{"css-mode":s.cssMode},{centered:s.cssMode&&s.centeredSlides}],s.containerModifierClass);t.push(...l),i.addClass([...t].join(" ")),e.emitContainerClasses()},removeClasses:function(){const{$el:e,classNames:t}=this;e.removeClass(t.join(" ")),this.emitContainerClasses()}},images:{loadImage:function(e,t,s,a,i,n){const l=r();let o;function c(){n&&n()}d(e).parent("picture")[0]||e.complete&&i?c():t?(o=new l.Image,o.onload=c,o.onerror=c,a&&(o.sizes=a),s&&(o.srcset=s),t&&(o.src=t)):c()},preloadImages:function(){const e=this;function t(){null!=e&&e&&!e.destroyed&&(void 0!==e.imagesLoaded&&(e.imagesLoaded+=1),e.imagesLoaded===e.imagesToLoad.length&&(e.params.updateOnImagesReady&&e.update(),e.emit("imagesReady")))}e.imagesToLoad=e.$el.find("img");for(let s=0;s1){const e=[];return d(s.el).each((t=>{const a=f({},s,{el:t});e.push(new H(a))})),e}const a=this;a.__swiper__=!0,a.support=y(),a.device=E({userAgent:s.userAgent}),a.browser=T(),a.eventsListeners={},a.eventsAnyListeners=[],a.modules=[...a.__modules__],s.modules&&Array.isArray(s.modules)&&a.modules.push(...s.modules);const i={};a.modules.forEach((e=>{e({swiper:a,extendParams:N(s,i),on:a.on.bind(a),once:a.once.bind(a),off:a.off.bind(a),emit:a.emit.bind(a)})}));const r=f({},G,i);return a.params=f({},r,X,s),a.originalParams=f({},a.params),a.passedParams=f({},s),a.params&&a.params.on&&Object.keys(a.params.on).forEach((e=>{a.on(e,a.params.on[e])})),a.params&&a.params.onAny&&a.onAny(a.params.onAny),a.$=d,Object.assign(a,{enabled:a.params.enabled,el:t,classNames:[],slides:d(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:()=>"horizontal"===a.params.direction,isVertical:()=>"vertical"===a.params.direction,activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:a.params.allowSlideNext,allowSlidePrev:a.params.allowSlidePrev,touchEvents:function(){const e=["touchstart","touchmove","touchend","touchcancel"],t=["pointerdown","pointermove","pointerup"];return a.touchEventsTouch={start:e[0],move:e[1],end:e[2],cancel:e[3]},a.touchEventsDesktop={start:t[0],move:t[1],end:t[2]},a.support.touch||!a.params.simulateTouch?a.touchEventsTouch:a.touchEventsDesktop}(),touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:a.params.focusableElements,lastClickTime:u(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:a.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),a.emit("_swiper"),a.params.init&&a.init(),a}enable(){const e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))}disable(){const e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))}setProgress(e,t){const s=this;e=Math.min(Math.max(e,0),1);const a=s.minTranslate(),i=(s.maxTranslate()-a)*e+a;s.translateTo(i,void 0===t?0:t),s.updateActiveIndex(),s.updateSlidesClasses()}emitContainerClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=e.el.className.split(" ").filter((t=>0===t.indexOf("swiper")||0===t.indexOf(e.params.containerModifierClass)));e.emit("_containerClasses",t.join(" "))}getSlideClasses(e){const t=this;return e.className.split(" ").filter((e=>0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass))).join(" ")}emitSlidesClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=[];e.slides.each((s=>{const a=e.getSlideClasses(s);t.push({slideEl:s,classNames:a}),e.emit("_slideClass",s,a)})),e.emit("_slideClasses",t)}slidesPerViewDynamic(e="current",t=!1){const{params:s,slides:a,slidesGrid:i,slidesSizesGrid:r,size:n,activeIndex:l}=this;let o=1;if(s.centeredSlides){let e,t=a[l].swiperSlideSize;for(let s=l+1;sn&&(e=!0));for(let s=l-1;s>=0;s-=1)a[s]&&!e&&(t+=a[s].swiperSlideSize,o+=1,t>n&&(e=!0))}else if("current"===e)for(let e=l+1;e=0;e-=1){i[l]-i[e]1)&&e.isEnd&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),i||a()),s.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}changeDirection(e,t=!0){const s=this,a=s.params.direction;return e||(e="horizontal"===a?"vertical":"horizontal"),e===a||"horizontal"!==e&&"vertical"!==e||(s.$el.removeClass(`${s.params.containerModifierClass}${a}`).addClass(`${s.params.containerModifierClass}${e}`),s.emitContainerClasses(),s.params.direction=e,s.slides.each((t=>{"vertical"===e?t.style.width="":t.style.height=""})),s.emit("changeDirection"),t&&s.update()),s}mount(e){const t=this;if(t.mounted)return!0;const s=d(e||t.params.el);if(!(e=s[0]))return!1;e.swiper=t;const i=()=>`.${(t.params.wrapperClass||"").trim().split(" ").join(".")}`;let r=(()=>{if(e&&e.shadowRoot&&e.shadowRoot.querySelector){const t=d(e.shadowRoot.querySelector(i()));return t.children=e=>s.children(e),t}return s.children(i())})();if(0===r.length&&t.params.createElements){const e=a().createElement("div");r=d(e),e.className=t.params.wrapperClass,s.append(e),s.children(`.${t.params.slideClass}`).each((e=>{r.append(e)}))}return Object.assign(t,{$el:s,el:e,$wrapperEl:r,wrapperEl:r[0],mounted:!0,rtl:"rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction")),wrongRTL:"-webkit-box"===r.css("display")}),!0}init(e){const t=this;if(t.initialized)return t;return!1===t.mount(e)||(t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.params.loop&&t.loopCreate(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.preloadImages&&t.preloadImages(),t.params.loop?t.slideTo(t.params.initialSlide+t.loopedSlides,0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.attachEvents(),t.initialized=!0,t.emit("init"),t.emit("afterInit")),t}destroy(e=!0,t=!0){const s=this,{params:a,$el:i,$wrapperEl:r,slides:n}=s;return void 0===s.params||s.destroyed||(s.emit("beforeDestroy"),s.initialized=!1,s.detachEvents(),a.loop&&s.loopDestroy(),t&&(s.removeClasses(),i.removeAttr("style"),r.removeAttr("style"),n&&n.length&&n.removeClass([a.slideVisibleClass,a.slideActiveClass,a.slideNextClass,a.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")),s.emit("destroy"),Object.keys(s.eventsListeners).forEach((e=>{s.off(e)})),!1!==e&&(s.$el[0].swiper=null,function(e){const t=e;Object.keys(t).forEach((e=>{try{t[e]=null}catch(e){}try{delete t[e]}catch(e){}}))}(s)),s.destroyed=!0),null}static extendDefaults(e){f(X,e)}static get extendedDefaults(){return X}static get defaults(){return G}static installModule(e){H.prototype.__modules__||(H.prototype.__modules__=[]);const t=H.prototype.__modules__;"function"==typeof e&&t.indexOf(e)<0&&t.push(e)}static use(e){return Array.isArray(e)?(e.forEach((e=>H.installModule(e))),H):(H.installModule(e),H)}}function Y(e,t,s,i){const r=a();return e.params.createElements&&Object.keys(i).forEach((a=>{if(!s[a]&&!0===s.auto){let n=e.$el.children(`.${i[a]}`)[0];n||(n=r.createElement("div"),n.className=i[a],e.$el.append(n)),s[a]=n,t[a]=n}})),s}function W(e=""){return`.${e.trim().replace(/([\.:!\/])/g,"\\$1").replace(/ /g,".")}`}function R(e){const t=this,{$wrapperEl:s,params:a}=t;if(a.loop&&t.loopDestroy(),"object"==typeof e&&"length"in e)for(let t=0;t=l)return void s.appendSlide(t);let o=n>e?n+1:n;const d=[];for(let t=l-1;t>=e;t-=1){const e=s.slides.eq(t);e.remove(),d.unshift(e)}if("object"==typeof t&&"length"in t){for(let e=0;ee?n+t.length:n}else a.append(t);for(let e=0;e{if(s.params.effect!==t)return;s.classNames.push(`${s.params.containerModifierClass}${t}`),l&&l()&&s.classNames.push(`${s.params.containerModifierClass}3d`);const e=n?n():{};Object.assign(s.params,e),Object.assign(s.originalParams,e)})),a("setTranslate",(()=>{s.params.effect===t&&i()})),a("setTransition",((e,a)=>{s.params.effect===t&&r(a)}))}function U(e,t){return e.transformEl?t.find(e.transformEl).css({"backface-visibility":"hidden","-webkit-backface-visibility":"hidden"}):t}function K({swiper:e,duration:t,transformEl:s,allSlides:a}){const{slides:i,activeIndex:r,$wrapperEl:n}=e;if(e.params.virtualTranslate&&0!==t){let t,l=!1;t=a?s?i.find(s):i:s?i.eq(r).find(s):i.eq(r),t.transitionEnd((()=>{if(l)return;if(!e||e.destroyed)return;l=!0,e.animating=!1;const t=["webkitTransitionEnd","transitionend"];for(let e=0;e
`),i.append(r)),r}Object.keys(B).forEach((e=>{Object.keys(B[e]).forEach((t=>{H.prototype[t]=B[e][t]}))})),H.use([function({swiper:e,on:t,emit:s}){const a=r();let i=null;const n=()=>{e&&!e.destroyed&&e.initialized&&(s("beforeResize"),s("resize"))},l=()=>{e&&!e.destroyed&&e.initialized&&s("orientationchange")};t("init",(()=>{e.params.resizeObserver&&void 0!==a.ResizeObserver?e&&!e.destroyed&&e.initialized&&(i=new ResizeObserver((t=>{const{width:s,height:a}=e;let i=s,r=a;t.forEach((({contentBoxSize:t,contentRect:s,target:a})=>{a&&a!==e.el||(i=s?s.width:(t[0]||t).inlineSize,r=s?s.height:(t[0]||t).blockSize)})),i===s&&r===a||n()})),i.observe(e.el)):(a.addEventListener("resize",n),a.addEventListener("orientationchange",l))})),t("destroy",(()=>{i&&i.unobserve&&e.el&&(i.unobserve(e.el),i=null),a.removeEventListener("resize",n),a.removeEventListener("orientationchange",l)}))},function({swiper:e,extendParams:t,on:s,emit:a}){const i=[],n=r(),l=(e,t={})=>{const s=new(n.MutationObserver||n.WebkitMutationObserver)((e=>{if(1===e.length)return void a("observerUpdate",e[0]);const t=function(){a("observerUpdate",e[0])};n.requestAnimationFrame?n.requestAnimationFrame(t):n.setTimeout(t,0)}));s.observe(e,{attributes:void 0===t.attributes||t.attributes,childList:void 0===t.childList||t.childList,characterData:void 0===t.characterData||t.characterData}),i.push(s)};t({observer:!1,observeParents:!1,observeSlideChildren:!1}),s("init",(()=>{if(e.params.observer){if(e.params.observeParents){const t=e.$el.parents();for(let e=0;e{i.forEach((e=>{e.disconnect()})),i.splice(0,i.length)}))}]);const J=[function({swiper:e,extendParams:t,on:s}){let a;function i(t,s){const a=e.params.virtual;if(a.cache&&e.virtual.cache[s])return e.virtual.cache[s];const i=a.renderSlide?d(a.renderSlide.call(e,t,s)):d(`
${t}
`);return i.attr("data-swiper-slide-index")||i.attr("data-swiper-slide-index",s),a.cache&&(e.virtual.cache[s]=i),i}function r(t){const{slidesPerView:s,slidesPerGroup:a,centeredSlides:r}=e.params,{addSlidesBefore:n,addSlidesAfter:l}=e.params.virtual,{from:o,to:d,slides:c,slidesGrid:p,offset:u}=e.virtual;e.params.cssMode||e.updateActiveIndex();const h=e.activeIndex||0;let m,f,g;m=e.rtlTranslate?"right":e.isHorizontal()?"left":"top",r?(f=Math.floor(s/2)+a+l,g=Math.floor(s/2)+a+n):(f=s+(a-1)+l,g=a+n);const v=Math.max((h||0)-g,0),w=Math.min((h||0)+f,c.length-1),b=(e.slidesGrid[v]||0)-(e.slidesGrid[0]||0);function x(){e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),e.lazy&&e.params.lazy.enabled&&e.lazy.load()}if(Object.assign(e.virtual,{from:v,to:w,offset:b,slidesGrid:e.slidesGrid}),o===v&&d===w&&!t)return e.slidesGrid!==p&&b!==u&&e.slides.css(m,`${b}px`),void e.updateProgress();if(e.params.virtual.renderExternal)return e.params.virtual.renderExternal.call(e,{offset:b,from:v,to:w,slides:function(){const e=[];for(let t=v;t<=w;t+=1)e.push(c[t]);return e}()}),void(e.params.virtual.renderExternalUpdate&&x());const y=[],E=[];if(t)e.$wrapperEl.find(`.${e.params.slideClass}`).remove();else for(let t=o;t<=d;t+=1)(tw)&&e.$wrapperEl.find(`.${e.params.slideClass}[data-swiper-slide-index="${t}"]`).remove();for(let e=0;e=v&&e<=w&&(void 0===d||t?E.push(e):(e>d&&E.push(e),e{e.$wrapperEl.append(i(c[t],t))})),y.sort(((e,t)=>t-e)).forEach((t=>{e.$wrapperEl.prepend(i(c[t],t))})),e.$wrapperEl.children(".swiper-slide").css(m,`${b}px`),x()}t({virtual:{enabled:!1,slides:[],cache:!0,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}}),e.virtual={cache:{},from:void 0,to:void 0,slides:[],offset:0,slidesGrid:[]},s("beforeInit",(()=>{e.params.virtual.enabled&&(e.virtual.slides=e.params.virtual.slides,e.classNames.push(`${e.params.containerModifierClass}virtual`),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0,e.params.initialSlide||r())})),s("setTranslate",(()=>{e.params.virtual.enabled&&(e.params.cssMode&&!e._immediateVirtual?(clearTimeout(a),a=setTimeout((()=>{r()}),100)):r())})),s("init update resize",(()=>{e.params.virtual.enabled&&e.params.cssMode&&g(e.wrapperEl,"--swiper-virtual-size",`${e.virtualSize}px`)})),Object.assign(e.virtual,{appendSlide:function(t){if("object"==typeof t&&"length"in t)for(let s=0;s{const a=t[e],r=a.attr("data-swiper-slide-index");r&&a.attr("data-swiper-slide-index",parseInt(r,10)+i),s[parseInt(e,10)+i]=a})),e.virtual.cache=s}r(!0),e.slideTo(a,0)},removeSlide:function(t){if(null==t)return;let s=e.activeIndex;if(Array.isArray(t))for(let a=t.length-1;a>=0;a-=1)e.virtual.slides.splice(t[a],1),e.params.virtual.cache&&delete e.virtual.cache[t[a]],t[a]0&&0===e.$el.parents(`.${e.params.slideActiveClass}`).length)return;const a=e.$el,i=a[0].clientWidth,r=a[0].clientHeight,n=l.innerWidth,o=l.innerHeight,d=e.$el.offset();s&&(d.left-=e.$el[0].scrollLeft);const c=[[d.left,d.top],[d.left+i,d.top],[d.left,d.top+r],[d.left+i,d.top+r]];for(let e=0;e=0&&s[0]<=n&&s[1]>=0&&s[1]<=o){if(0===s[0]&&0===s[1])continue;t=!0}}if(!t)return}e.isHorizontal()?((d||c||p||u)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),((c||u)&&!s||(d||p)&&s)&&e.slideNext(),((d||p)&&!s||(c||u)&&s)&&e.slidePrev()):((d||c||h||m)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),(c||m)&&e.slideNext(),(d||h)&&e.slidePrev()),i("keyPress",r)}}function c(){e.keyboard.enabled||(d(n).on("keydown",o),e.keyboard.enabled=!0)}function p(){e.keyboard.enabled&&(d(n).off("keydown",o),e.keyboard.enabled=!1)}e.keyboard={enabled:!1},t({keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0}}),s("init",(()=>{e.params.keyboard.enabled&&c()})),s("destroy",(()=>{e.keyboard.enabled&&p()})),Object.assign(e.keyboard,{enable:c,disable:p})},function({swiper:e,extendParams:t,on:s,emit:a}){const i=r();let n;t({mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null}}),e.mousewheel={enabled:!1};let l,o=u();const c=[];function h(){e.enabled&&(e.mouseEntered=!0)}function m(){e.enabled&&(e.mouseEntered=!1)}function f(t){return!(e.params.mousewheel.thresholdDelta&&t.delta=6&&u()-o<60||(t.direction<0?e.isEnd&&!e.params.loop||e.animating||(e.slideNext(),a("scroll",t.raw)):e.isBeginning&&!e.params.loop||e.animating||(e.slidePrev(),a("scroll",t.raw)),o=(new i.Date).getTime(),!1)))}function g(t){let s=t,i=!0;if(!e.enabled)return;const r=e.params.mousewheel;e.params.cssMode&&s.preventDefault();let o=e.$el;if("container"!==e.params.mousewheel.eventsTarget&&(o=d(e.params.mousewheel.eventsTarget)),!e.mouseEntered&&!o[0].contains(s.target)&&!r.releaseOnEdges)return!0;s.originalEvent&&(s=s.originalEvent);let h=0;const m=e.rtlTranslate?-1:1,g=function(e){let t=0,s=0,a=0,i=0;return"detail"in e&&(s=e.detail),"wheelDelta"in e&&(s=-e.wheelDelta/120),"wheelDeltaY"in e&&(s=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=s,s=0),a=10*t,i=10*s,"deltaY"in e&&(i=e.deltaY),"deltaX"in e&&(a=e.deltaX),e.shiftKey&&!a&&(a=i,i=0),(a||i)&&e.deltaMode&&(1===e.deltaMode?(a*=40,i*=40):(a*=800,i*=800)),a&&!t&&(t=a<1?-1:1),i&&!s&&(s=i<1?-1:1),{spinX:t,spinY:s,pixelX:a,pixelY:i}}(s);if(r.forceToAxis)if(e.isHorizontal()){if(!(Math.abs(g.pixelX)>Math.abs(g.pixelY)))return!0;h=-g.pixelX*m}else{if(!(Math.abs(g.pixelY)>Math.abs(g.pixelX)))return!0;h=-g.pixelY}else h=Math.abs(g.pixelX)>Math.abs(g.pixelY)?-g.pixelX*m:-g.pixelY;if(0===h)return!0;r.invert&&(h=-h);let v=e.getTranslate()+h*r.sensitivity;if(v>=e.minTranslate()&&(v=e.minTranslate()),v<=e.maxTranslate()&&(v=e.maxTranslate()),i=!!e.params.loop||!(v===e.minTranslate()||v===e.maxTranslate()),i&&e.params.nested&&s.stopPropagation(),e.params.freeMode&&e.params.freeMode.enabled){const t={time:u(),delta:Math.abs(h),direction:Math.sign(h)},i=l&&t.time=e.minTranslate()&&(o=e.minTranslate()),o<=e.maxTranslate()&&(o=e.maxTranslate()),e.setTransition(0),e.setTranslate(o),e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses(),(!d&&e.isBeginning||!u&&e.isEnd)&&e.updateSlidesClasses(),e.params.freeMode.sticky){clearTimeout(n),n=void 0,c.length>=15&&c.shift();const s=c.length?c[c.length-1]:void 0,a=c[0];if(c.push(t),s&&(t.delta>s.delta||t.direction!==s.direction))c.splice(0);else if(c.length>=15&&t.time-a.time<500&&a.delta-t.delta>=1&&t.delta<=6){const s=h>0?.8:.2;l=t,c.splice(0),n=p((()=>{e.slideToClosest(e.params.speed,!0,void 0,s)}),0)}n||(n=p((()=>{l=t,c.splice(0),e.slideToClosest(e.params.speed,!0,void 0,.5)}),500))}if(i||a("scroll",s),e.params.autoplay&&e.params.autoplayDisableOnInteraction&&e.autoplay.stop(),o===e.minTranslate()||o===e.maxTranslate())return!0}}else{const s={time:u(),delta:Math.abs(h),direction:Math.sign(h),raw:t};c.length>=2&&c.shift();const a=c.length?c[c.length-1]:void 0;if(c.push(s),a?(s.direction!==a.direction||s.delta>a.delta||s.time>a.time+150)&&f(s):f(s),function(t){const s=e.params.mousewheel;if(t.direction<0){if(e.isEnd&&!e.params.loop&&s.releaseOnEdges)return!0}else if(e.isBeginning&&!e.params.loop&&s.releaseOnEdges)return!0;return!1}(s))return!0}return s.preventDefault?s.preventDefault():s.returnValue=!1,!1}function v(t){let s=e.$el;"container"!==e.params.mousewheel.eventsTarget&&(s=d(e.params.mousewheel.eventsTarget)),s[t]("mouseenter",h),s[t]("mouseleave",m),s[t]("wheel",g)}function w(){return e.params.cssMode?(e.wrapperEl.removeEventListener("wheel",g),!0):!e.mousewheel.enabled&&(v("on"),e.mousewheel.enabled=!0,!0)}function b(){return e.params.cssMode?(e.wrapperEl.addEventListener(event,g),!0):!!e.mousewheel.enabled&&(v("off"),e.mousewheel.enabled=!1,!0)}s("init",(()=>{!e.params.mousewheel.enabled&&e.params.cssMode&&b(),e.params.mousewheel.enabled&&w()})),s("destroy",(()=>{e.params.cssMode&&w(),e.mousewheel.enabled&&b()})),Object.assign(e.mousewheel,{enable:w,disable:b})},function({swiper:e,extendParams:t,on:s,emit:a}){function i(t){let s;return t&&(s=d(t),e.params.uniqueNavElements&&"string"==typeof t&&s.length>1&&1===e.$el.find(t).length&&(s=e.$el.find(t))),s}function r(t,s){const a=e.params.navigation;t&&t.length>0&&(t[s?"addClass":"removeClass"](a.disabledClass),t[0]&&"BUTTON"===t[0].tagName&&(t[0].disabled=s),e.params.watchOverflow&&e.enabled&&t[e.isLocked?"addClass":"removeClass"](a.lockClass))}function n(){if(e.params.loop)return;const{$nextEl:t,$prevEl:s}=e.navigation;r(s,e.isBeginning),r(t,e.isEnd)}function l(t){t.preventDefault(),e.isBeginning&&!e.params.loop||e.slidePrev()}function o(t){t.preventDefault(),e.isEnd&&!e.params.loop||e.slideNext()}function c(){const t=e.params.navigation;if(e.params.navigation=Y(e,e.originalParams.navigation,e.params.navigation,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),!t.nextEl&&!t.prevEl)return;const s=i(t.nextEl),a=i(t.prevEl);s&&s.length>0&&s.on("click",o),a&&a.length>0&&a.on("click",l),Object.assign(e.navigation,{$nextEl:s,nextEl:s&&s[0],$prevEl:a,prevEl:a&&a[0]}),e.enabled||(s&&s.addClass(t.lockClass),a&&a.addClass(t.lockClass))}function p(){const{$nextEl:t,$prevEl:s}=e.navigation;t&&t.length&&(t.off("click",o),t.removeClass(e.params.navigation.disabledClass)),s&&s.length&&(s.off("click",l),s.removeClass(e.params.navigation.disabledClass))}t({navigation:{nextEl:null,prevEl:null,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock"}}),e.navigation={nextEl:null,$nextEl:null,prevEl:null,$prevEl:null},s("init",(()=>{c(),n()})),s("toEdge fromEdge lock unlock",(()=>{n()})),s("destroy",(()=>{p()})),s("enable disable",(()=>{const{$nextEl:t,$prevEl:s}=e.navigation;t&&t[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass),s&&s[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass)})),s("click",((t,s)=>{const{$nextEl:i,$prevEl:r}=e.navigation,n=s.target;if(e.params.navigation.hideOnClick&&!d(n).is(r)&&!d(n).is(i)){if(e.pagination&&e.params.pagination&&e.params.pagination.clickable&&(e.pagination.el===n||e.pagination.el.contains(n)))return;let t;i?t=i.hasClass(e.params.navigation.hiddenClass):r&&(t=r.hasClass(e.params.navigation.hiddenClass)),a(!0===t?"navigationShow":"navigationHide"),i&&i.toggleClass(e.params.navigation.hiddenClass),r&&r.toggleClass(e.params.navigation.hiddenClass)}})),Object.assign(e.navigation,{update:n,init:c,destroy:p})},function({swiper:e,extendParams:t,on:s,emit:a}){const i="swiper-pagination";let r;t({pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:e=>e,formatFractionTotal:e=>e,bulletClass:`${i}-bullet`,bulletActiveClass:`${i}-bullet-active`,modifierClass:`${i}-`,currentClass:`${i}-current`,totalClass:`${i}-total`,hiddenClass:`${i}-hidden`,progressbarFillClass:`${i}-progressbar-fill`,progressbarOppositeClass:`${i}-progressbar-opposite`,clickableClass:`${i}-clickable`,lockClass:`${i}-lock`,horizontalClass:`${i}-horizontal`,verticalClass:`${i}-vertical`}}),e.pagination={el:null,$el:null,bullets:[]};let n=0;function l(){return!e.params.pagination.el||!e.pagination.el||!e.pagination.$el||0===e.pagination.$el.length}function o(t,s){const{bulletActiveClass:a}=e.params.pagination;t[s]().addClass(`${a}-${s}`)[s]().addClass(`${a}-${s}-${s}`)}function c(){const t=e.rtl,s=e.params.pagination;if(l())return;const i=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,c=e.pagination.$el;let p;const u=e.params.loop?Math.ceil((i-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;if(e.params.loop?(p=Math.ceil((e.activeIndex-e.loopedSlides)/e.params.slidesPerGroup),p>i-1-2*e.loopedSlides&&(p-=i-2*e.loopedSlides),p>u-1&&(p-=u),p<0&&"bullets"!==e.params.paginationType&&(p=u+p)):p=void 0!==e.snapIndex?e.snapIndex:e.activeIndex||0,"bullets"===s.type&&e.pagination.bullets&&e.pagination.bullets.length>0){const a=e.pagination.bullets;let i,l,u;if(s.dynamicBullets&&(r=a.eq(0)[e.isHorizontal()?"outerWidth":"outerHeight"](!0),c.css(e.isHorizontal()?"width":"height",r*(s.dynamicMainBullets+4)+"px"),s.dynamicMainBullets>1&&void 0!==e.previousIndex&&(n+=p-e.previousIndex,n>s.dynamicMainBullets-1?n=s.dynamicMainBullets-1:n<0&&(n=0)),i=p-n,l=i+(Math.min(a.length,s.dynamicMainBullets)-1),u=(l+i)/2),a.removeClass(["","-next","-next-next","-prev","-prev-prev","-main"].map((e=>`${s.bulletActiveClass}${e}`)).join(" ")),c.length>1)a.each((e=>{const t=d(e),a=t.index();a===p&&t.addClass(s.bulletActiveClass),s.dynamicBullets&&(a>=i&&a<=l&&t.addClass(`${s.bulletActiveClass}-main`),a===i&&o(t,"prev"),a===l&&o(t,"next"))}));else{const t=a.eq(p),r=t.index();if(t.addClass(s.bulletActiveClass),s.dynamicBullets){const t=a.eq(i),n=a.eq(l);for(let e=i;e<=l;e+=1)a.eq(e).addClass(`${s.bulletActiveClass}-main`);if(e.params.loop)if(r>=a.length-s.dynamicMainBullets){for(let e=s.dynamicMainBullets;e>=0;e-=1)a.eq(a.length-e).addClass(`${s.bulletActiveClass}-main`);a.eq(a.length-s.dynamicMainBullets-1).addClass(`${s.bulletActiveClass}-prev`)}else o(t,"prev"),o(n,"next");else o(t,"prev"),o(n,"next")}}if(s.dynamicBullets){const i=Math.min(a.length,s.dynamicMainBullets+4),n=(r*i-r)/2-u*r,l=t?"right":"left";a.css(e.isHorizontal()?l:"top",`${n}px`)}}if("fraction"===s.type&&(c.find(W(s.currentClass)).text(s.formatFractionCurrent(p+1)),c.find(W(s.totalClass)).text(s.formatFractionTotal(u))),"progressbar"===s.type){let t;t=s.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";const a=(p+1)/u;let i=1,r=1;"horizontal"===t?i=a:r=a,c.find(W(s.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${i}) scaleY(${r})`).transition(e.params.speed)}"custom"===s.type&&s.renderCustom?(c.html(s.renderCustom(e,p+1,u)),a("paginationRender",c[0])):a("paginationUpdate",c[0]),e.params.watchOverflow&&e.enabled&&c[e.isLocked?"addClass":"removeClass"](s.lockClass)}function p(){const t=e.params.pagination;if(l())return;const s=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,i=e.pagination.$el;let r="";if("bullets"===t.type){let a=e.params.loop?Math.ceil((s-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;e.params.freeMode&&e.params.freeMode.enabled&&!e.params.loop&&a>s&&(a=s);for(let s=0;s`;i.html(r),e.pagination.bullets=i.find(W(t.bulletClass))}"fraction"===t.type&&(r=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):` / `,i.html(r)),"progressbar"===t.type&&(r=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):``,i.html(r)),"custom"!==t.type&&a("paginationRender",e.pagination.$el[0])}function u(){e.params.pagination=Y(e,e.originalParams.pagination,e.params.pagination,{el:"swiper-pagination"});const t=e.params.pagination;if(!t.el)return;let s=d(t.el);0!==s.length&&(e.params.uniqueNavElements&&"string"==typeof t.el&&s.length>1&&(s=e.$el.find(t.el),s.length>1&&(s=s.filter((t=>d(t).parents(".swiper")[0]===e.el)))),"bullets"===t.type&&t.clickable&&s.addClass(t.clickableClass),s.addClass(t.modifierClass+t.type),s.addClass(t.modifierClass+e.params.direction),"bullets"===t.type&&t.dynamicBullets&&(s.addClass(`${t.modifierClass}${t.type}-dynamic`),n=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&s.addClass(t.progressbarOppositeClass),t.clickable&&s.on("click",W(t.bulletClass),(function(t){t.preventDefault();let s=d(this).index()*e.params.slidesPerGroup;e.params.loop&&(s+=e.loopedSlides),e.slideTo(s)})),Object.assign(e.pagination,{$el:s,el:s[0]}),e.enabled||s.addClass(t.lockClass))}function h(){const t=e.params.pagination;if(l())return;const s=e.pagination.$el;s.removeClass(t.hiddenClass),s.removeClass(t.modifierClass+t.type),s.removeClass(t.modifierClass+e.params.direction),e.pagination.bullets&&e.pagination.bullets.removeClass&&e.pagination.bullets.removeClass(t.bulletActiveClass),t.clickable&&s.off("click",W(t.bulletClass))}s("init",(()=>{u(),p(),c()})),s("activeIndexChange",(()=>{(e.params.loop||void 0===e.snapIndex)&&c()})),s("snapIndexChange",(()=>{e.params.loop||c()})),s("slidesLengthChange",(()=>{e.params.loop&&(p(),c())})),s("snapGridLengthChange",(()=>{e.params.loop||(p(),c())})),s("destroy",(()=>{h()})),s("enable disable",(()=>{const{$el:t}=e.pagination;t&&t[e.enabled?"removeClass":"addClass"](e.params.pagination.lockClass)})),s("lock unlock",(()=>{c()})),s("click",((t,s)=>{const i=s.target,{$el:r}=e.pagination;if(e.params.pagination.el&&e.params.pagination.hideOnClick&&r.length>0&&!d(i).hasClass(e.params.pagination.bulletClass)){if(e.navigation&&(e.navigation.nextEl&&i===e.navigation.nextEl||e.navigation.prevEl&&i===e.navigation.prevEl))return;const t=r.hasClass(e.params.pagination.hiddenClass);a(!0===t?"paginationShow":"paginationHide"),r.toggleClass(e.params.pagination.hiddenClass)}})),Object.assign(e.pagination,{render:p,update:c,init:u,destroy:h})},function({swiper:e,extendParams:t,on:s,emit:i}){const r=a();let n,l,o,c,u=!1,h=null,m=null;function f(){if(!e.params.scrollbar.el||!e.scrollbar.el)return;const{scrollbar:t,rtlTranslate:s,progress:a}=e,{$dragEl:i,$el:r}=t,n=e.params.scrollbar;let d=l,c=(o-l)*a;s?(c=-c,c>0?(d=l-c,c=0):-c+l>o&&(d=o+c)):c<0?(d=l+c,c=0):c+l>o&&(d=o-c),e.isHorizontal()?(i.transform(`translate3d(${c}px, 0, 0)`),i[0].style.width=`${d}px`):(i.transform(`translate3d(0px, ${c}px, 0)`),i[0].style.height=`${d}px`),n.hide&&(clearTimeout(h),r[0].style.opacity=1,h=setTimeout((()=>{r[0].style.opacity=0,r.transition(400)}),1e3))}function g(){if(!e.params.scrollbar.el||!e.scrollbar.el)return;const{scrollbar:t}=e,{$dragEl:s,$el:a}=t;s[0].style.width="",s[0].style.height="",o=e.isHorizontal()?a[0].offsetWidth:a[0].offsetHeight,c=e.size/(e.virtualSize+e.params.slidesOffsetBefore-(e.params.centeredSlides?e.snapGrid[0]:0)),l="auto"===e.params.scrollbar.dragSize?o*c:parseInt(e.params.scrollbar.dragSize,10),e.isHorizontal()?s[0].style.width=`${l}px`:s[0].style.height=`${l}px`,a[0].style.display=c>=1?"none":"",e.params.scrollbar.hide&&(a[0].style.opacity=0),e.params.watchOverflow&&e.enabled&&t.$el[e.isLocked?"addClass":"removeClass"](e.params.scrollbar.lockClass)}function v(t){return e.isHorizontal()?"touchstart"===t.type||"touchmove"===t.type?t.targetTouches[0].clientX:t.clientX:"touchstart"===t.type||"touchmove"===t.type?t.targetTouches[0].clientY:t.clientY}function w(t){const{scrollbar:s,rtlTranslate:a}=e,{$el:i}=s;let r;r=(v(t)-i.offset()[e.isHorizontal()?"left":"top"]-(null!==n?n:l/2))/(o-l),r=Math.max(Math.min(r,1),0),a&&(r=1-r);const d=e.minTranslate()+(e.maxTranslate()-e.minTranslate())*r;e.updateProgress(d),e.setTranslate(d),e.updateActiveIndex(),e.updateSlidesClasses()}function b(t){const s=e.params.scrollbar,{scrollbar:a,$wrapperEl:r}=e,{$el:l,$dragEl:o}=a;u=!0,n=t.target===o[0]||t.target===o?v(t)-t.target.getBoundingClientRect()[e.isHorizontal()?"left":"top"]:null,t.preventDefault(),t.stopPropagation(),r.transition(100),o.transition(100),w(t),clearTimeout(m),l.transition(0),s.hide&&l.css("opacity",1),e.params.cssMode&&e.$wrapperEl.css("scroll-snap-type","none"),i("scrollbarDragStart",t)}function x(t){const{scrollbar:s,$wrapperEl:a}=e,{$el:r,$dragEl:n}=s;u&&(t.preventDefault?t.preventDefault():t.returnValue=!1,w(t),a.transition(0),r.transition(0),n.transition(0),i("scrollbarDragMove",t))}function y(t){const s=e.params.scrollbar,{scrollbar:a,$wrapperEl:r}=e,{$el:n}=a;u&&(u=!1,e.params.cssMode&&(e.$wrapperEl.css("scroll-snap-type",""),r.transition("")),s.hide&&(clearTimeout(m),m=p((()=>{n.css("opacity",0),n.transition(400)}),1e3)),i("scrollbarDragEnd",t),s.snapOnRelease&&e.slideToClosest())}function E(t){const{scrollbar:s,touchEventsTouch:a,touchEventsDesktop:i,params:n,support:l}=e,o=s.$el[0],d=!(!l.passiveListener||!n.passiveListeners)&&{passive:!1,capture:!1},c=!(!l.passiveListener||!n.passiveListeners)&&{passive:!0,capture:!1};if(!o)return;const p="on"===t?"addEventListener":"removeEventListener";l.touch?(o[p](a.start,b,d),o[p](a.move,x,d),o[p](a.end,y,c)):(o[p](i.start,b,d),r[p](i.move,x,d),r[p](i.end,y,c))}function T(){const{scrollbar:t,$el:s}=e;e.params.scrollbar=Y(e,e.originalParams.scrollbar,e.params.scrollbar,{el:"swiper-scrollbar"});const a=e.params.scrollbar;if(!a.el)return;let i=d(a.el);e.params.uniqueNavElements&&"string"==typeof a.el&&i.length>1&&1===s.find(a.el).length&&(i=s.find(a.el));let r=i.find(`.${e.params.scrollbar.dragClass}`);0===r.length&&(r=d(`
`),i.append(r)),Object.assign(t,{$el:i,el:i[0],$dragEl:r,dragEl:r[0]}),a.draggable&&e.params.scrollbar.el&&E("on"),i&&i[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)}function C(){e.params.scrollbar.el&&E("off")}t({scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag"}}),e.scrollbar={el:null,dragEl:null,$el:null,$dragEl:null},s("init",(()=>{T(),g(),f()})),s("update resize observerUpdate lock unlock",(()=>{g()})),s("setTranslate",(()=>{f()})),s("setTransition",((t,s)=>{!function(t){e.params.scrollbar.el&&e.scrollbar.el&&e.scrollbar.$dragEl.transition(t)}(s)})),s("enable disable",(()=>{const{$el:t}=e.scrollbar;t&&t[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)})),s("destroy",(()=>{C()})),Object.assign(e.scrollbar,{updateSize:g,setTranslate:f,init:T,destroy:C})},function({swiper:e,extendParams:t,on:s}){t({parallax:{enabled:!1}});const a=(t,s)=>{const{rtl:a}=e,i=d(t),r=a?-1:1,n=i.attr("data-swiper-parallax")||"0";let l=i.attr("data-swiper-parallax-x"),o=i.attr("data-swiper-parallax-y");const c=i.attr("data-swiper-parallax-scale"),p=i.attr("data-swiper-parallax-opacity");if(l||o?(l=l||"0",o=o||"0"):e.isHorizontal()?(l=n,o="0"):(o=n,l="0"),l=l.indexOf("%")>=0?parseInt(l,10)*s*r+"%":l*s*r+"px",o=o.indexOf("%")>=0?parseInt(o,10)*s+"%":o*s+"px",null!=p){const e=p-(p-1)*(1-Math.abs(s));i[0].style.opacity=e}if(null==c)i.transform(`translate3d(${l}, ${o}, 0px)`);else{const e=c-(c-1)*(1-Math.abs(s));i.transform(`translate3d(${l}, ${o}, 0px) scale(${e})`)}},i=()=>{const{$el:t,slides:s,progress:i,snapGrid:r}=e;t.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{a(e,i)})),s.each(((t,s)=>{let n=t.progress;e.params.slidesPerGroup>1&&"auto"!==e.params.slidesPerView&&(n+=Math.ceil(s/2)-i*(r.length-1)),n=Math.min(Math.max(n,-1),1),d(t).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{a(e,n)}))}))};s("beforeInit",(()=>{e.params.parallax.enabled&&(e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)})),s("init",(()=>{e.params.parallax.enabled&&i()})),s("setTranslate",(()=>{e.params.parallax.enabled&&i()})),s("setTransition",((t,s)=>{e.params.parallax.enabled&&((t=e.params.speed)=>{const{$el:s}=e;s.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{const s=d(e);let a=parseInt(s.attr("data-swiper-parallax-duration"),10)||t;0===t&&(a=0),s.transition(a)}))})(s)}))},function({swiper:e,extendParams:t,on:s,emit:a}){const i=r();t({zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}}),e.zoom={enabled:!1};let n,l,o,c=1,p=!1;const u={$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},m={isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},f={x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0};let g=1;function v(e){if(e.targetTouches.length<2)return 1;const t=e.targetTouches[0].pageX,s=e.targetTouches[0].pageY,a=e.targetTouches[1].pageX,i=e.targetTouches[1].pageY;return Math.sqrt((a-t)**2+(i-s)**2)}function w(t){const s=e.support,a=e.params.zoom;if(l=!1,o=!1,!s.gestures){if("touchstart"!==t.type||"touchstart"===t.type&&t.targetTouches.length<2)return;l=!0,u.scaleStart=v(t)}u.$slideEl&&u.$slideEl.length||(u.$slideEl=d(t.target).closest(`.${e.params.slideClass}`),0===u.$slideEl.length&&(u.$slideEl=e.slides.eq(e.activeIndex)),u.$imageEl=u.$slideEl.find(`.${a.containerClass}`).eq(0).find("img, svg, canvas, picture, .swiper-zoom-target"),u.$imageWrapEl=u.$imageEl.parent(`.${a.containerClass}`),u.maxRatio=u.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,0!==u.$imageWrapEl.length)?(u.$imageEl&&u.$imageEl.transition(0),p=!0):u.$imageEl=void 0}function b(t){const s=e.support,a=e.params.zoom,i=e.zoom;if(!s.gestures){if("touchmove"!==t.type||"touchmove"===t.type&&t.targetTouches.length<2)return;o=!0,u.scaleMove=v(t)}u.$imageEl&&0!==u.$imageEl.length?(s.gestures?i.scale=t.scale*c:i.scale=u.scaleMove/u.scaleStart*c,i.scale>u.maxRatio&&(i.scale=u.maxRatio-1+(i.scale-u.maxRatio+1)**.5),i.scalem.touchesStart.x))return void(m.isTouched=!1);if(!e.isHorizontal()&&(Math.floor(m.minY)===Math.floor(m.startY)&&m.touchesCurrent.ym.touchesStart.y))return void(m.isTouched=!1)}t.cancelable&&t.preventDefault(),t.stopPropagation(),m.isMoved=!0,m.currentX=m.touchesCurrent.x-m.touchesStart.x+m.startX,m.currentY=m.touchesCurrent.y-m.touchesStart.y+m.startY,m.currentXm.maxX&&(m.currentX=m.maxX-1+(m.currentX-m.maxX+1)**.8),m.currentYm.maxY&&(m.currentY=m.maxY-1+(m.currentY-m.maxY+1)**.8),f.prevPositionX||(f.prevPositionX=m.touchesCurrent.x),f.prevPositionY||(f.prevPositionY=m.touchesCurrent.y),f.prevTime||(f.prevTime=Date.now()),f.x=(m.touchesCurrent.x-f.prevPositionX)/(Date.now()-f.prevTime)/2,f.y=(m.touchesCurrent.y-f.prevPositionY)/(Date.now()-f.prevTime)/2,Math.abs(m.touchesCurrent.x-f.prevPositionX)<2&&(f.x=0),Math.abs(m.touchesCurrent.y-f.prevPositionY)<2&&(f.y=0),f.prevPositionX=m.touchesCurrent.x,f.prevPositionY=m.touchesCurrent.y,f.prevTime=Date.now(),u.$imageWrapEl.transform(`translate3d(${m.currentX}px, ${m.currentY}px,0)`)}}function E(){const t=e.zoom;u.$slideEl&&e.previousIndex!==e.activeIndex&&(u.$imageEl&&u.$imageEl.transform("translate3d(0,0,0) scale(1)"),u.$imageWrapEl&&u.$imageWrapEl.transform("translate3d(0,0,0)"),t.scale=1,c=1,u.$slideEl=void 0,u.$imageEl=void 0,u.$imageWrapEl=void 0)}function T(t){const s=e.zoom,a=e.params.zoom;if(u.$slideEl||(t&&t.target&&(u.$slideEl=d(t.target).closest(`.${e.params.slideClass}`)),u.$slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?u.$slideEl=e.$wrapperEl.children(`.${e.params.slideActiveClass}`):u.$slideEl=e.slides.eq(e.activeIndex)),u.$imageEl=u.$slideEl.find(`.${a.containerClass}`).eq(0).find("img, svg, canvas, picture, .swiper-zoom-target"),u.$imageWrapEl=u.$imageEl.parent(`.${a.containerClass}`)),!u.$imageEl||0===u.$imageEl.length||!u.$imageWrapEl||0===u.$imageWrapEl.length)return;let r,n,l,o,p,h,f,g,v,w,b,x,y,E,T,C,$,S;e.params.cssMode&&(e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.touchAction="none"),u.$slideEl.addClass(`${a.zoomedSlideClass}`),void 0===m.touchesStart.x&&t?(r="touchend"===t.type?t.changedTouches[0].pageX:t.pageX,n="touchend"===t.type?t.changedTouches[0].pageY:t.pageY):(r=m.touchesStart.x,n=m.touchesStart.y),s.scale=u.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,c=u.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,t?($=u.$slideEl[0].offsetWidth,S=u.$slideEl[0].offsetHeight,l=u.$slideEl.offset().left+i.scrollX,o=u.$slideEl.offset().top+i.scrollY,p=l+$/2-r,h=o+S/2-n,v=u.$imageEl[0].offsetWidth,w=u.$imageEl[0].offsetHeight,b=v*s.scale,x=w*s.scale,y=Math.min($/2-b/2,0),E=Math.min(S/2-x/2,0),T=-y,C=-E,f=p*s.scale,g=h*s.scale,fT&&(f=T),gC&&(g=C)):(f=0,g=0),u.$imageWrapEl.transition(300).transform(`translate3d(${f}px, ${g}px,0)`),u.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${s.scale})`)}function C(){const t=e.zoom,s=e.params.zoom;u.$slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?u.$slideEl=e.$wrapperEl.children(`.${e.params.slideActiveClass}`):u.$slideEl=e.slides.eq(e.activeIndex),u.$imageEl=u.$slideEl.find(`.${s.containerClass}`).eq(0).find("img, svg, canvas, picture, .swiper-zoom-target"),u.$imageWrapEl=u.$imageEl.parent(`.${s.containerClass}`)),u.$imageEl&&0!==u.$imageEl.length&&u.$imageWrapEl&&0!==u.$imageWrapEl.length&&(e.params.cssMode&&(e.wrapperEl.style.overflow="",e.wrapperEl.style.touchAction=""),t.scale=1,c=1,u.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),u.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),u.$slideEl.removeClass(`${s.zoomedSlideClass}`),u.$slideEl=void 0)}function $(t){const s=e.zoom;s.scale&&1!==s.scale?C():T(t)}function S(){const t=e.support;return{passiveListener:!("touchstart"!==e.touchEvents.start||!t.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1},activeListenerWithCapture:!t.passiveListener||{passive:!1,capture:!0}}}function M(){return`.${e.params.slideClass}`}function P(t){const{passiveListener:s}=S(),a=M();e.$wrapperEl[t]("gesturestart",a,w,s),e.$wrapperEl[t]("gesturechange",a,b,s),e.$wrapperEl[t]("gestureend",a,x,s)}function k(){n||(n=!0,P("on"))}function z(){n&&(n=!1,P("off"))}function O(){const t=e.zoom;if(t.enabled)return;t.enabled=!0;const s=e.support,{passiveListener:a,activeListenerWithCapture:i}=S(),r=M();s.gestures?(e.$wrapperEl.on(e.touchEvents.start,k,a),e.$wrapperEl.on(e.touchEvents.end,z,a)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.on(e.touchEvents.start,r,w,a),e.$wrapperEl.on(e.touchEvents.move,r,b,i),e.$wrapperEl.on(e.touchEvents.end,r,x,a),e.touchEvents.cancel&&e.$wrapperEl.on(e.touchEvents.cancel,r,x,a)),e.$wrapperEl.on(e.touchEvents.move,`.${e.params.zoom.containerClass}`,y,i)}function I(){const t=e.zoom;if(!t.enabled)return;const s=e.support;t.enabled=!1;const{passiveListener:a,activeListenerWithCapture:i}=S(),r=M();s.gestures?(e.$wrapperEl.off(e.touchEvents.start,k,a),e.$wrapperEl.off(e.touchEvents.end,z,a)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.off(e.touchEvents.start,r,w,a),e.$wrapperEl.off(e.touchEvents.move,r,b,i),e.$wrapperEl.off(e.touchEvents.end,r,x,a),e.touchEvents.cancel&&e.$wrapperEl.off(e.touchEvents.cancel,r,x,a)),e.$wrapperEl.off(e.touchEvents.move,`.${e.params.zoom.containerClass}`,y,i)}Object.defineProperty(e.zoom,"scale",{get:()=>g,set(e){if(g!==e){const t=u.$imageEl?u.$imageEl[0]:void 0,s=u.$slideEl?u.$slideEl[0]:void 0;a("zoomChange",e,t,s)}g=e}}),s("init",(()=>{e.params.zoom.enabled&&O()})),s("destroy",(()=>{I()})),s("touchStart",((t,s)=>{e.zoom.enabled&&function(t){const s=e.device;u.$imageEl&&0!==u.$imageEl.length&&(m.isTouched||(s.android&&t.cancelable&&t.preventDefault(),m.isTouched=!0,m.touchesStart.x="touchstart"===t.type?t.targetTouches[0].pageX:t.pageX,m.touchesStart.y="touchstart"===t.type?t.targetTouches[0].pageY:t.pageY))}(s)})),s("touchEnd",((t,s)=>{e.zoom.enabled&&function(){const t=e.zoom;if(!u.$imageEl||0===u.$imageEl.length)return;if(!m.isTouched||!m.isMoved)return m.isTouched=!1,void(m.isMoved=!1);m.isTouched=!1,m.isMoved=!1;let s=300,a=300;const i=f.x*s,r=m.currentX+i,n=f.y*a,l=m.currentY+n;0!==f.x&&(s=Math.abs((r-m.currentX)/f.x)),0!==f.y&&(a=Math.abs((l-m.currentY)/f.y));const o=Math.max(s,a);m.currentX=r,m.currentY=l;const d=m.width*t.scale,c=m.height*t.scale;m.minX=Math.min(u.slideWidth/2-d/2,0),m.maxX=-m.minX,m.minY=Math.min(u.slideHeight/2-c/2,0),m.maxY=-m.minY,m.currentX=Math.max(Math.min(m.currentX,m.maxX),m.minX),m.currentY=Math.max(Math.min(m.currentY,m.maxY),m.minY),u.$imageWrapEl.transition(o).transform(`translate3d(${m.currentX}px, ${m.currentY}px,0)`)}()})),s("doubleTap",((t,s)=>{!e.animating&&e.params.zoom.enabled&&e.zoom.enabled&&e.params.zoom.toggle&&$(s)})),s("transitionEnd",(()=>{e.zoom.enabled&&e.params.zoom.enabled&&E()})),s("slideChange",(()=>{e.zoom.enabled&&e.params.zoom.enabled&&e.params.cssMode&&E()})),Object.assign(e.zoom,{enable:O,disable:I,in:T,out:C,toggle:$})},function({swiper:e,extendParams:t,on:s,emit:a}){t({lazy:{checkInView:!1,enabled:!1,loadPrevNext:!1,loadPrevNextAmount:1,loadOnTransitionStart:!1,scrollingElement:"",elementClass:"swiper-lazy",loadingClass:"swiper-lazy-loading",loadedClass:"swiper-lazy-loaded",preloaderClass:"swiper-lazy-preloader"}}),e.lazy={};let i=!1,n=!1;function l(t,s=!0){const i=e.params.lazy;if(void 0===t)return;if(0===e.slides.length)return;const r=e.virtual&&e.params.virtual.enabled?e.$wrapperEl.children(`.${e.params.slideClass}[data-swiper-slide-index="${t}"]`):e.slides.eq(t),n=r.find(`.${i.elementClass}:not(.${i.loadedClass}):not(.${i.loadingClass})`);!r.hasClass(i.elementClass)||r.hasClass(i.loadedClass)||r.hasClass(i.loadingClass)||n.push(r[0]),0!==n.length&&n.each((t=>{const n=d(t);n.addClass(i.loadingClass);const o=n.attr("data-background"),c=n.attr("data-src"),p=n.attr("data-srcset"),u=n.attr("data-sizes"),h=n.parent("picture");e.loadImage(n[0],c||o,p,u,!1,(()=>{if(null!=e&&e&&(!e||e.params)&&!e.destroyed){if(o?(n.css("background-image",`url("${o}")`),n.removeAttr("data-background")):(p&&(n.attr("srcset",p),n.removeAttr("data-srcset")),u&&(n.attr("sizes",u),n.removeAttr("data-sizes")),h.length&&h.children("source").each((e=>{const t=d(e);t.attr("data-srcset")&&(t.attr("srcset",t.attr("data-srcset")),t.removeAttr("data-srcset"))})),c&&(n.attr("src",c),n.removeAttr("data-src"))),n.addClass(i.loadedClass).removeClass(i.loadingClass),r.find(`.${i.preloaderClass}`).remove(),e.params.loop&&s){const t=r.attr("data-swiper-slide-index");if(r.hasClass(e.params.slideDuplicateClass)){l(e.$wrapperEl.children(`[data-swiper-slide-index="${t}"]:not(.${e.params.slideDuplicateClass})`).index(),!1)}else{l(e.$wrapperEl.children(`.${e.params.slideDuplicateClass}[data-swiper-slide-index="${t}"]`).index(),!1)}}a("lazyImageReady",r[0],n[0]),e.params.autoHeight&&e.updateAutoHeight()}})),a("lazyImageLoad",r[0],n[0])}))}function o(){const{$wrapperEl:t,params:s,slides:a,activeIndex:i}=e,r=e.virtual&&s.virtual.enabled,o=s.lazy;let c=s.slidesPerView;function p(e){if(r){if(t.children(`.${s.slideClass}[data-swiper-slide-index="${e}"]`).length)return!0}else if(a[e])return!0;return!1}function u(e){return r?d(e).attr("data-swiper-slide-index"):d(e).index()}if("auto"===c&&(c=0),n||(n=!0),e.params.watchSlidesProgress)t.children(`.${s.slideVisibleClass}`).each((e=>{l(r?d(e).attr("data-swiper-slide-index"):d(e).index())}));else if(c>1)for(let e=i;e1||o.loadPrevNextAmount&&o.loadPrevNextAmount>1){const e=o.loadPrevNextAmount,t=c,s=Math.min(i+t+Math.max(e,t),a.length),r=Math.max(i-Math.max(t,e),0);for(let e=i+c;e0&&l(u(e));const a=t.children(`.${s.slidePrevClass}`);a.length>0&&l(u(a))}}function c(){const t=r();if(!e||e.destroyed)return;const s=e.params.lazy.scrollingElement?d(e.params.lazy.scrollingElement):d(t),a=s[0]===t,n=a?t.innerWidth:s[0].offsetWidth,l=a?t.innerHeight:s[0].offsetHeight,p=e.$el.offset(),{rtlTranslate:u}=e;let h=!1;u&&(p.left-=e.$el[0].scrollLeft);const m=[[p.left,p.top],[p.left+e.width,p.top],[p.left,p.top+e.height],[p.left+e.width,p.top+e.height]];for(let e=0;e=0&&t[0]<=n&&t[1]>=0&&t[1]<=l){if(0===t[0]&&0===t[1])continue;h=!0}}const f=!("touchstart"!==e.touchEvents.start||!e.support.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1};h?(o(),s.off("scroll",c,f)):i||(i=!0,s.on("scroll",c,f))}s("beforeInit",(()=>{e.params.lazy.enabled&&e.params.preloadImages&&(e.params.preloadImages=!1)})),s("init",(()=>{e.params.lazy.enabled&&(e.params.lazy.checkInView?c():o())})),s("scroll",(()=>{e.params.freeMode&&e.params.freeMode.enabled&&!e.params.freeMode.sticky&&o()})),s("scrollbarDragMove resize _freeModeNoMomentumRelease",(()=>{e.params.lazy.enabled&&(e.params.lazy.checkInView?c():o())})),s("transitionStart",(()=>{e.params.lazy.enabled&&(e.params.lazy.loadOnTransitionStart||!e.params.lazy.loadOnTransitionStart&&!n)&&(e.params.lazy.checkInView?c():o())})),s("transitionEnd",(()=>{e.params.lazy.enabled&&!e.params.lazy.loadOnTransitionStart&&(e.params.lazy.checkInView?c():o())})),s("slideChange",(()=>{const{lazy:t,cssMode:s,watchSlidesProgress:a,touchReleaseOnEdges:i,resistanceRatio:r}=e.params;t.enabled&&(s||a&&(i||0===r))&&o()})),Object.assign(e.lazy,{load:o,loadInSlide:l})},function({swiper:e,extendParams:t,on:s}){function a(e,t){const s=function(){let e,t,s;return(a,i)=>{for(t=-1,e=a.length;e-t>1;)s=e+t>>1,a[s]<=i?t=s:e=s;return e}}();let a,i;return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(i=s(this.x,e),a=i-1,(e-this.x[a])*(this.y[i]-this.y[a])/(this.x[i]-this.x[a])+this.y[a]):0},this}function i(){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)}t({controller:{control:void 0,inverse:!1,by:"slide"}}),e.controller={control:void 0},s("beforeInit",(()=>{e.controller.control=e.params.controller.control})),s("update",(()=>{i()})),s("resize",(()=>{i()})),s("observerUpdate",(()=>{i()})),s("setTranslate",((t,s,a)=>{e.controller.control&&e.controller.setTranslate(s,a)})),s("setTransition",((t,s,a)=>{e.controller.control&&e.controller.setTransition(s,a)})),Object.assign(e.controller,{setTranslate:function(t,s){const i=e.controller.control;let r,n;const l=e.constructor;function o(t){const s=e.rtlTranslate?-e.translate:e.translate;"slide"===e.params.controller.by&&(!function(t){e.controller.spline||(e.controller.spline=e.params.loop?new a(e.slidesGrid,t.slidesGrid):new a(e.snapGrid,t.snapGrid))}(t),n=-e.controller.spline.interpolate(-s)),n&&"container"!==e.params.controller.by||(r=(t.maxTranslate()-t.minTranslate())/(e.maxTranslate()-e.minTranslate()),n=(s-e.minTranslate())*r+t.minTranslate()),e.params.controller.inverse&&(n=t.maxTranslate()-n),t.updateProgress(n),t.setTranslate(n,e),t.updateActiveIndex(),t.updateSlidesClasses()}if(Array.isArray(i))for(let e=0;e{s.updateAutoHeight()})),s.$wrapperEl.transitionEnd((()=>{i&&(s.params.loop&&"slide"===e.params.controller.by&&s.loopFix(),s.transitionEnd())})))}if(Array.isArray(i))for(r=0;r0&&(e.isBeginning?(p(s),n(s)):(u(s),r(s))),t&&t.length>0&&(e.isEnd?(p(t),n(t)):(u(t),r(t)))}function f(){return e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length}const g=(e,t,s)=>{r(e),"BUTTON"!==e[0].tagName&&(l(e,"button"),e.on("keydown",h)),c(e,s),function(e,t){e.attr("aria-controls",t)}(e,t)};function v(){const t=e.params.a11y;e.$el.append(a);const s=e.$el;t.containerRoleDescriptionMessage&&o(s,t.containerRoleDescriptionMessage),t.containerMessage&&c(s,t.containerMessage);const i=e.$wrapperEl,r=i.attr("id")||`swiper-wrapper-${function(e=16){return"x".repeat(e).replace(/x/g,(()=>Math.round(16*Math.random()).toString(16)))}(16)}`,n=e.params.autoplay&&e.params.autoplay.enabled?"off":"polite";var p;p=r,i.attr("id",p),function(e,t){e.attr("aria-live",t)}(i,n),t.itemRoleDescriptionMessage&&o(d(e.slides),t.itemRoleDescriptionMessage),l(d(e.slides),t.slideRole);const u=e.params.loop?e.slides.filter((t=>!t.classList.contains(e.params.slideDuplicateClass))).length:e.slides.length;let m,v;e.slides.each(((s,a)=>{const i=d(s),r=e.params.loop?parseInt(i.attr("data-swiper-slide-index"),10):a;c(i,t.slideLabelMessage.replace(/\{\{index\}\}/,r+1).replace(/\{\{slidesLength\}\}/,u))})),e.navigation&&e.navigation.$nextEl&&(m=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(v=e.navigation.$prevEl),m&&m.length&&g(m,r,t.nextSlideMessage),v&&v.length&&g(v,r,t.prevSlideMessage),f()&&e.pagination.$el.on("keydown",W(e.params.pagination.bulletClass),h)}s("beforeInit",(()=>{a=d(``)})),s("afterInit",(()=>{e.params.a11y.enabled&&(v(),m())})),s("toEdge",(()=>{e.params.a11y.enabled&&m()})),s("fromEdge",(()=>{e.params.a11y.enabled&&m()})),s("paginationUpdate",(()=>{e.params.a11y.enabled&&function(){const t=e.params.a11y;f()&&e.pagination.bullets.each((s=>{const a=d(s);r(a),e.params.pagination.renderBullet||(l(a,"button"),c(a,t.paginationBulletMessage.replace(/\{\{index\}\}/,a.index()+1)))}))}()})),s("destroy",(()=>{e.params.a11y.enabled&&function(){let t,s;a&&a.length>0&&a.remove(),e.navigation&&e.navigation.$nextEl&&(t=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(s=e.navigation.$prevEl),t&&t.off("keydown",h),s&&s.off("keydown",h),f()&&e.pagination.$el.off("keydown",W(e.params.pagination.bulletClass),h)}()}))},function({swiper:e,extendParams:t,on:s}){t({history:{enabled:!1,root:"",replaceState:!1,key:"slides"}});let a=!1,i={};const n=e=>e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,""),l=e=>{const t=r();let s;s=e?new URL(e):t.location;const a=s.pathname.slice(1).split("/").filter((e=>""!==e)),i=a.length;return{key:a[i-2],value:a[i-1]}},o=(t,s)=>{const i=r();if(!a||!e.params.history.enabled)return;let l;l=e.params.url?new URL(e.params.url):i.location;const o=e.slides.eq(s);let d=n(o.attr("data-history"));if(e.params.history.root.length>0){let s=e.params.history.root;"/"===s[s.length-1]&&(s=s.slice(0,s.length-1)),d=`${s}/${t}/${d}`}else l.pathname.includes(t)||(d=`${t}/${d}`);const c=i.history.state;c&&c.value===d||(e.params.history.replaceState?i.history.replaceState({value:d},null,d):i.history.pushState({value:d},null,d))},d=(t,s,a)=>{if(s)for(let i=0,r=e.slides.length;i{i=l(e.params.url),d(e.params.speed,e.paths.value,!1)};s("init",(()=>{e.params.history.enabled&&(()=>{const t=r();if(e.params.history){if(!t.history||!t.history.pushState)return e.params.history.enabled=!1,void(e.params.hashNavigation.enabled=!0);a=!0,i=l(e.params.url),(i.key||i.value)&&(d(0,i.value,e.params.runCallbacksOnInit),e.params.history.replaceState||t.addEventListener("popstate",c))}})()})),s("destroy",(()=>{e.params.history.enabled&&(()=>{const t=r();e.params.history.replaceState||t.removeEventListener("popstate",c)})()})),s("transitionEnd _freeModeNoMomentumRelease",(()=>{a&&o(e.params.history.key,e.activeIndex)})),s("slideChange",(()=>{a&&e.params.cssMode&&o(e.params.history.key,e.activeIndex)}))},function({swiper:e,extendParams:t,emit:s,on:i}){let n=!1;const l=a(),o=r();t({hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}});const c=()=>{s("hashChange");const t=l.location.hash.replace("#","");if(t!==e.slides.eq(e.activeIndex).attr("data-hash")){const s=e.$wrapperEl.children(`.${e.params.slideClass}[data-hash="${t}"]`).index();if(void 0===s)return;e.slideTo(s)}},p=()=>{if(n&&e.params.hashNavigation.enabled)if(e.params.hashNavigation.replaceState&&o.history&&o.history.replaceState)o.history.replaceState(null,null,`#${e.slides.eq(e.activeIndex).attr("data-hash")}`||""),s("hashSet");else{const t=e.slides.eq(e.activeIndex),a=t.attr("data-hash")||t.attr("data-history");l.location.hash=a||"",s("hashSet")}};i("init",(()=>{e.params.hashNavigation.enabled&&(()=>{if(!e.params.hashNavigation.enabled||e.params.history&&e.params.history.enabled)return;n=!0;const t=l.location.hash.replace("#","");if(t){const s=0;for(let a=0,i=e.slides.length;a{e.params.hashNavigation.enabled&&e.params.hashNavigation.watchState&&d(o).off("hashchange",c)})),i("transitionEnd _freeModeNoMomentumRelease",(()=>{n&&p()})),i("slideChange",(()=>{n&&e.params.cssMode&&p()}))},function({swiper:e,extendParams:t,on:s,emit:i}){let r;function n(){const t=e.slides.eq(e.activeIndex);let s=e.params.autoplay.delay;t.attr("data-swiper-autoplay")&&(s=t.attr("data-swiper-autoplay")||e.params.autoplay.delay),clearTimeout(r),r=p((()=>{let t;e.params.autoplay.reverseDirection?e.params.loop?(e.loopFix(),t=e.slidePrev(e.params.speed,!0,!0),i("autoplay")):e.isBeginning?e.params.autoplay.stopOnLastSlide?o():(t=e.slideTo(e.slides.length-1,e.params.speed,!0,!0),i("autoplay")):(t=e.slidePrev(e.params.speed,!0,!0),i("autoplay")):e.params.loop?(e.loopFix(),t=e.slideNext(e.params.speed,!0,!0),i("autoplay")):e.isEnd?e.params.autoplay.stopOnLastSlide?o():(t=e.slideTo(0,e.params.speed,!0,!0),i("autoplay")):(t=e.slideNext(e.params.speed,!0,!0),i("autoplay")),(e.params.cssMode&&e.autoplay.running||!1===t)&&n()}),s)}function l(){return void 0===r&&(!e.autoplay.running&&(e.autoplay.running=!0,i("autoplayStart"),n(),!0))}function o(){return!!e.autoplay.running&&(void 0!==r&&(r&&(clearTimeout(r),r=void 0),e.autoplay.running=!1,i("autoplayStop"),!0))}function d(t){e.autoplay.running&&(e.autoplay.paused||(r&&clearTimeout(r),e.autoplay.paused=!0,0!==t&&e.params.autoplay.waitForTransition?["transitionend","webkitTransitionEnd"].forEach((t=>{e.$wrapperEl[0].addEventListener(t,u)})):(e.autoplay.paused=!1,n())))}function c(){const t=a();"hidden"===t.visibilityState&&e.autoplay.running&&d(),"visible"===t.visibilityState&&e.autoplay.paused&&(n(),e.autoplay.paused=!1)}function u(t){e&&!e.destroyed&&e.$wrapperEl&&t.target===e.$wrapperEl[0]&&(["transitionend","webkitTransitionEnd"].forEach((t=>{e.$wrapperEl[0].removeEventListener(t,u)})),e.autoplay.paused=!1,e.autoplay.running?n():o())}function h(){e.params.autoplay.disableOnInteraction?o():d(),["transitionend","webkitTransitionEnd"].forEach((t=>{e.$wrapperEl[0].removeEventListener(t,u)}))}function m(){e.params.autoplay.disableOnInteraction||(e.autoplay.paused=!1,n())}e.autoplay={running:!1,paused:!1},t({autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}}),s("init",(()=>{if(e.params.autoplay.enabled){l();a().addEventListener("visibilitychange",c),e.params.autoplay.pauseOnMouseEnter&&(e.$el.on("mouseenter",h),e.$el.on("mouseleave",m))}})),s("beforeTransitionStart",((t,s,a)=>{e.autoplay.running&&(a||!e.params.autoplay.disableOnInteraction?e.autoplay.pause(s):o())})),s("sliderFirstMove",(()=>{e.autoplay.running&&(e.params.autoplay.disableOnInteraction?o():d())})),s("touchEnd",(()=>{e.params.cssMode&&e.autoplay.paused&&!e.params.autoplay.disableOnInteraction&&n()})),s("destroy",(()=>{e.$el.off("mouseenter",h),e.$el.off("mouseleave",m),e.autoplay.running&&o();a().removeEventListener("visibilitychange",c)})),Object.assign(e.autoplay,{pause:d,run:n,start:l,stop:o})},function({swiper:e,extendParams:t,on:s}){t({thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-thumbs"}});let a=!1,i=!1;function r(){const t=e.thumbs.swiper;if(!t)return;const s=t.clickedIndex,a=t.clickedSlide;if(a&&d(a).hasClass(e.params.thumbs.slideThumbActiveClass))return;if(null==s)return;let i;if(i=t.params.loop?parseInt(d(t.clickedSlide).attr("data-swiper-slide-index"),10):s,e.params.loop){let t=e.activeIndex;e.slides.eq(t).hasClass(e.params.slideDuplicateClass)&&(e.loopFix(),e._clientLeft=e.$wrapperEl[0].clientLeft,t=e.activeIndex);const s=e.slides.eq(t).prevAll(`[data-swiper-slide-index="${i}"]`).eq(0).index(),a=e.slides.eq(t).nextAll(`[data-swiper-slide-index="${i}"]`).eq(0).index();i=void 0===s?a:void 0===a?s:a-t1?a:o:a-oe.previousIndex?"next":"prev"}else n=e.realIndex,l=n>e.previousIndex?"next":"prev";r&&(n+="next"===l?i:-1*i),s.visibleSlidesIndexes&&s.visibleSlidesIndexes.indexOf(n)<0&&(s.params.centeredSlides?n=n>o?n-Math.floor(a/2)+1:n+Math.floor(a/2)-1:n>o&&s.params.slidesPerGroup,s.slideTo(n,t?0:void 0))}let n=1;const l=e.params.thumbs.slideThumbActiveClass;if(e.params.slidesPerView>1&&!e.params.centeredSlides&&(n=e.params.slidesPerView),e.params.thumbs.multipleActiveThumbs||(n=1),n=Math.floor(n),s.slides.removeClass(l),s.params.loop||s.params.virtual&&s.params.virtual.enabled)for(let t=0;t{const{thumbs:t}=e.params;t&&t.swiper&&(n(),l(!0))})),s("slideChange update resize observerUpdate",(()=>{e.thumbs.swiper&&l()})),s("setTransition",((t,s)=>{const a=e.thumbs.swiper;a&&a.setTransition(s)})),s("beforeDestroy",(()=>{const t=e.thumbs.swiper;t&&i&&t&&t.destroy()})),Object.assign(e.thumbs,{init:n,update:l})},function({swiper:e,extendParams:t,emit:s,once:a}){t({freeMode:{enabled:!1,momentum:!0,momentumRatio:1,momentumBounce:!0,momentumBounceRatio:1,momentumVelocityRatio:1,sticky:!1,minimumVelocity:.02}}),Object.assign(e,{freeMode:{onTouchMove:function(){const{touchEventsData:t,touches:s}=e;0===t.velocities.length&&t.velocities.push({position:s[e.isHorizontal()?"startX":"startY"],time:t.touchStartTime}),t.velocities.push({position:s[e.isHorizontal()?"currentX":"currentY"],time:u()})},onTouchEnd:function({currentPos:t}){const{params:i,$wrapperEl:r,rtlTranslate:n,snapGrid:l,touchEventsData:o}=e,d=u()-o.touchStartTime;if(t<-e.minTranslate())e.slideTo(e.activeIndex);else if(t>-e.maxTranslate())e.slides.length1){const t=o.velocities.pop(),s=o.velocities.pop(),a=t.position-s.position,r=t.time-s.time;e.velocity=a/r,e.velocity/=2,Math.abs(e.velocity)150||u()-t.time>300)&&(e.velocity=0)}else e.velocity=0;e.velocity*=i.freeMode.momentumVelocityRatio,o.velocities.length=0;let t=1e3*i.freeMode.momentumRatio;const d=e.velocity*t;let c=e.translate+d;n&&(c=-c);let p,h=!1;const m=20*Math.abs(e.velocity)*i.freeMode.momentumBounceRatio;let f;if(ce.minTranslate())i.freeMode.momentumBounce?(c-e.minTranslate()>m&&(c=e.minTranslate()+m),p=e.minTranslate(),h=!0,o.allowMomentumBounce=!0):c=e.minTranslate(),i.loop&&i.centeredSlides&&(f=!0);else if(i.freeMode.sticky){let t;for(let e=0;e-c){t=e;break}c=Math.abs(l[t]-c){e.loopFix()})),0!==e.velocity){if(t=n?Math.abs((-c-e.translate)/e.velocity):Math.abs((c-e.translate)/e.velocity),i.freeMode.sticky){const s=Math.abs((n?-c:c)-e.translate),a=e.slidesSizesGrid[e.activeIndex];t=s{e&&!e.destroyed&&o.allowMomentumBounce&&(s("momentumBounce"),e.setTransition(i.speed),setTimeout((()=>{e.setTranslate(p),r.transitionEnd((()=>{e&&!e.destroyed&&e.transitionEnd()}))}),0))}))):e.velocity?(s("_freeModeNoMomentumRelease"),e.updateProgress(c),e.setTransition(t),e.setTranslate(c),e.transitionStart(!0,e.swipeDirection),e.animating||(e.animating=!0,r.transitionEnd((()=>{e&&!e.destroyed&&e.transitionEnd()})))):e.updateProgress(c),e.updateActiveIndex(),e.updateSlidesClasses()}else{if(i.freeMode.sticky)return void e.slideToClosest();i.freeMode&&s("_freeModeNoMomentumRelease")}(!i.freeMode.momentum||d>=i.longSwipesMs)&&(e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses())}}}})},function({swiper:e,extendParams:t}){let s,a,i;t({grid:{rows:1,fill:"column"}}),e.grid={initSlides:t=>{const{slidesPerView:r}=e.params,{rows:n,fill:l}=e.params.grid;a=s/n,i=Math.floor(t/n),s=Math.floor(t/n)===t/n?t:Math.ceil(t/n)*n,"auto"!==r&&"row"===l&&(s=Math.max(s,r*n))},updateSlide:(t,r,n,l)=>{const{slidesPerGroup:o,spaceBetween:d}=e.params,{rows:c,fill:p}=e.params.grid;let u,h,m;if("row"===p&&o>1){const e=Math.floor(t/(o*c)),a=t-c*o*e,i=0===e?o:Math.min(Math.ceil((n-e*c*o)/c),o);m=Math.floor(a/i),h=a-m*i+e*o,u=h+m*s/c,r.css({"-webkit-order":u,order:u})}else"column"===p?(h=Math.floor(t/c),m=t-h*c,(h>i||h===i&&m===c-1)&&(m+=1,m>=c&&(m=0,h+=1))):(m=Math.floor(t/a),h=t-m*a);r.css(l("margin-top"),0!==m?d&&`${d}px`:"")},updateWrapperSize:(t,a,i)=>{const{spaceBetween:r,centeredSlides:n,roundLengths:l}=e.params,{rows:o}=e.params.grid;if(e.virtualSize=(t+r)*s,e.virtualSize=Math.ceil(e.virtualSize/o)-r,e.$wrapperEl.css({[i("width")]:`${e.virtualSize+r}px`}),n){a.splice(0,a.length);const t=[];for(let s=0;s{const{slides:t}=e,s=e.params.fadeEffect;for(let a=0;a{const{transformEl:s}=e.params.fadeEffect;(s?e.slides.find(s):e.slides).transition(t),K({swiper:e,duration:t,transformEl:s,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},function({swiper:e,extendParams:t,on:s}){t({cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}}),F({effect:"cube",swiper:e,on:s,setTranslate:()=>{const{$el:t,$wrapperEl:s,slides:a,width:i,height:r,rtlTranslate:n,size:l,browser:o}=e,c=e.params.cubeEffect,p=e.isHorizontal(),u=e.virtual&&e.params.virtual.enabled;let h,m=0;c.shadow&&(p?(h=s.find(".swiper-cube-shadow"),0===h.length&&(h=d('
'),s.append(h)),h.css({height:`${i}px`})):(h=t.find(".swiper-cube-shadow"),0===h.length&&(h=d('
'),t.append(h))));for(let e=0;e-1&&(m=90*s+90*o,n&&(m=90*-s-90*o)),t.transform(v),c.slideShadows){let e=p?t.find(".swiper-slide-shadow-left"):t.find(".swiper-slide-shadow-top"),s=p?t.find(".swiper-slide-shadow-right"):t.find(".swiper-slide-shadow-bottom");0===e.length&&(e=d(`
`),t.append(e)),0===s.length&&(s=d(`
`),t.append(s)),e.length&&(e[0].style.opacity=Math.max(-o,0)),s.length&&(s[0].style.opacity=Math.max(o,0))}}if(s.css({"-webkit-transform-origin":`50% 50% -${l/2}px`,"transform-origin":`50% 50% -${l/2}px`}),c.shadow)if(p)h.transform(`translate3d(0px, ${i/2+c.shadowOffset}px, ${-i/2}px) rotateX(90deg) rotateZ(0deg) scale(${c.shadowScale})`);else{const e=Math.abs(m)-90*Math.floor(Math.abs(m)/90),t=1.5-(Math.sin(2*e*Math.PI/360)/2+Math.cos(2*e*Math.PI/360)/2),s=c.shadowScale,a=c.shadowScale/t,i=c.shadowOffset;h.transform(`scale3d(${s}, 1, ${a}) translate3d(0px, ${r/2+i}px, ${-r/2/a}px) rotateX(-90deg)`)}const f=o.isSafari||o.isWebView?-l/2:0;s.transform(`translate3d(0px,0,${f}px) rotateX(${e.isHorizontal()?0:m}deg) rotateY(${e.isHorizontal()?-m:0}deg)`)},setTransition:t=>{const{$el:s,slides:a}=e;a.transition(t).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(t),e.params.cubeEffect.shadow&&!e.isHorizontal()&&s.find(".swiper-cube-shadow").transition(t)},perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0})})},function({swiper:e,extendParams:t,on:s}){t({flipEffect:{slideShadows:!0,limitRotation:!0,transformEl:null}}),F({effect:"flip",swiper:e,on:s,setTranslate:()=>{const{slides:t,rtlTranslate:s}=e,a=e.params.flipEffect;for(let i=0;i{const{transformEl:s}=e.params.flipEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(t),K({swiper:e,duration:t,transformEl:s})},perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},function({swiper:e,extendParams:t,on:s}){t({coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0,transformEl:null}}),F({effect:"coverflow",swiper:e,on:s,setTranslate:()=>{const{width:t,height:s,slides:a,slidesSizesGrid:i}=e,r=e.params.coverflowEffect,n=e.isHorizontal(),l=e.translate,o=n?t/2-l:s/2-l,d=n?r.rotate:-r.rotate,c=r.depth;for(let e=0,t=a.length;e0?l:0),s.length&&(s[0].style.opacity=-l>0?-l:0)}}},setTransition:t=>{const{transformEl:s}=e.params.coverflowEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(t)},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0})})},function({swiper:e,extendParams:t,on:s}){t({creativeEffect:{transformEl:null,limitProgress:1,shadowPerProgress:!1,progressMultiplier:1,perspective:!0,prev:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1},next:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1}}});const a=e=>"string"==typeof e?e:`${e}px`;F({effect:"creative",swiper:e,on:s,setTranslate:()=>{const{slides:t,$wrapperEl:s,slidesSizesGrid:i}=e,r=e.params.creativeEffect,{progressMultiplier:n}=r,l=e.params.centeredSlides;if(l){const t=i[0]/2-e.params.slidesOffsetBefore||0;s.transform(`translateX(calc(50% - ${t}px))`)}for(let s=0;s0&&(f=r.prev,m=!0),u.forEach(((e,t)=>{u[t]=`calc(${e}px + (${a(f.translate[t])} * ${Math.abs(d*n)}))`})),h.forEach(((e,t)=>{h[t]=f.rotate[t]*Math.abs(d*n)})),i[0].style.zIndex=-Math.abs(Math.round(o))+t.length;const g=u.join(", "),v=`rotateX(${h[0]}deg) rotateY(${h[1]}deg) rotateZ(${h[2]}deg)`,w=c<0?`scale(${1+(1-f.scale)*c*n})`:`scale(${1-(1-f.scale)*c*n})`,b=c<0?1+(1-f.opacity)*c*n:1-(1-f.opacity)*c*n,x=`translate3d(${g}) ${v} ${w}`;if(m&&f.shadow||!m){let e=i.children(".swiper-slide-shadow");if(0===e.length&&f.shadow&&(e=Z(r,i)),e.length){const t=r.shadowPerProgress?d*(1/r.limitProgress):d;e[0].style.opacity=Math.min(Math.max(Math.abs(t),0),1)}}const y=U(r,i);y.transform(x).css({opacity:b}),f.origin&&y.css("transform-origin",f.origin)}},setTransition:t=>{const{transformEl:s}=e.params.creativeEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow").transition(t),K({swiper:e,duration:t,transformEl:s,allSlides:!0})},perspective:()=>e.params.creativeEffect.perspective,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!e.params.cssMode})})},function({swiper:e,extendParams:t,on:s}){t({cardsEffect:{slideShadows:!0,transformEl:null}}),F({effect:"cards",swiper:e,on:s,setTranslate:()=>{const{slides:t,activeIndex:s}=e,a=e.params.cardsEffect,{startTranslate:i,isTouched:r}=e.touchEventsData,n=e.translate;for(let l=0;l0&&c<1&&(r||e.params.cssMode)&&n-1&&(r||e.params.cssMode)&&n>i;if(w||b){const e=(1-Math.abs((Math.abs(c)-.5)/.5))**.5;g+=-28*c*e,f+=-.5*e,v+=96*e,h=-25*e*Math.abs(c)+"%"}if(u=c<0?`calc(${u}px + (${v*Math.abs(c)}%))`:c>0?`calc(${u}px + (-${v*Math.abs(c)}%))`:`${u}px`,!e.isHorizontal()){const e=h;h=u,u=e}const x=`\n translate3d(${u}, ${h}, ${m}px)\n rotateZ(${g}deg)\n scale(${c<0?""+(1+(1-f)*c):""+(1-(1-f)*c)})\n `;if(a.slideShadows){let e=o.find(".swiper-slide-shadow");0===e.length&&(e=Z(a,o)),e.length&&(e[0].style.opacity=Math.min(Math.max((Math.abs(c)-.5)/.5,0),1))}o[0].style.zIndex=-Math.abs(Math.round(d))+t.length;U(a,o).transform(x)}},setTransition:t=>{const{transformEl:s}=e.params.cardsEffect;(s?e.slides.find(s):e.slides).transition(t).find(".swiper-slide-shadow").transition(t),K({swiper:e,duration:t,transformEl:s})},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!e.params.cssMode})})}];return H.use(J),H})); +//# sourceMappingURL=swiper-bundle.min.js.map \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper-bundle.min.js.map b/src/main/resources/static/assets/js/swiper/swiper-bundle.min.js.map new file mode 100644 index 0000000..1828e94 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../node_modules/ssr-window/ssr-window.esm.js","../node_modules/dom7/dom7.esm.js","../src/shared/dom.js","../src/shared/utils.js","../src/shared/get-support.js","../src/shared/get-device.js","../src/shared/get-browser.js","../src/core/events-emitter.js","../src/core/transition/transitionEmit.js","../src/core/events/onTouchStart.js","../src/core/events/onTouchMove.js","../src/core/events/onTouchEnd.js","../src/core/events/onResize.js","../src/core/events/onClick.js","../src/core/events/onScroll.js","../src/core/events/index.js","../src/core/breakpoints/setBreakpoint.js","../src/core/check-overflow/index.js","../src/core/defaults.js","../src/core/moduleExtendParams.js","../src/core/core.js","../src/core/update/index.js","../src/core/update/updateSize.js","../src/core/update/updateSlides.js","../src/core/update/updateAutoHeight.js","../src/core/update/updateSlidesOffset.js","../src/core/update/updateSlidesProgress.js","../src/core/update/updateProgress.js","../src/core/update/updateSlidesClasses.js","../src/core/update/updateActiveIndex.js","../src/core/update/updateClickedSlide.js","../src/core/translate/index.js","../src/core/translate/getTranslate.js","../src/core/translate/setTranslate.js","../src/core/translate/minTranslate.js","../src/core/translate/maxTranslate.js","../src/core/translate/translateTo.js","../src/core/transition/index.js","../src/core/transition/setTransition.js","../src/core/transition/transitionStart.js","../src/core/transition/transitionEnd.js","../src/core/slide/index.js","../src/core/slide/slideTo.js","../src/core/slide/slideToLoop.js","../src/core/slide/slideNext.js","../src/core/slide/slidePrev.js","../src/core/slide/slideReset.js","../src/core/slide/slideToClosest.js","../src/core/slide/slideToClickedSlide.js","../src/core/loop/index.js","../src/core/loop/loopCreate.js","../src/core/loop/loopFix.js","../src/core/loop/loopDestroy.js","../src/core/grab-cursor/index.js","../src/core/grab-cursor/setGrabCursor.js","../src/core/grab-cursor/unsetGrabCursor.js","../src/core/breakpoints/index.js","../src/core/breakpoints/getBreakpoint.js","../src/core/classes/index.js","../src/core/classes/addClasses.js","../src/core/classes/removeClasses.js","../src/core/images/index.js","../src/core/images/loadImage.js","../src/core/images/preloadImages.js","../src/shared/create-element-if-not-defined.js","../src/shared/classes-to-selector.js","../src/modules/manipulation/methods/appendSlide.js","../src/modules/manipulation/methods/prependSlide.js","../src/modules/manipulation/methods/addSlide.js","../src/modules/manipulation/methods/removeSlide.js","../src/modules/manipulation/methods/removeAllSlides.js","../src/shared/effect-init.js","../src/shared/effect-target.js","../src/shared/effect-virtual-transition-end.js","../src/shared/create-shadow.js","../src/core/modules/resize/resize.js","../src/core/modules/observer/observer.js","../src/swiper.js","../src/modules/virtual/virtual.js","../src/modules/keyboard/keyboard.js","../src/modules/mousewheel/mousewheel.js","../src/modules/navigation/navigation.js","../src/modules/pagination/pagination.js","../src/modules/scrollbar/scrollbar.js","../src/modules/parallax/parallax.js","../src/modules/zoom/zoom.js","../src/modules/lazy/lazy.js","../src/modules/controller/controller.js","../src/modules/a11y/a11y.js","../src/modules/history/history.js","../src/modules/hash-navigation/hash-navigation.js","../src/modules/autoplay/autoplay.js","../src/modules/thumbs/thumbs.js","../src/modules/free-mode/free-mode.js","../src/modules/grid/grid.js","../src/modules/manipulation/manipulation.js","../src/modules/effect-fade/effect-fade.js","../src/modules/effect-cube/effect-cube.js","../src/modules/effect-flip/effect-flip.js","../src/modules/effect-coverflow/effect-coverflow.js","../src/modules/effect-creative/effect-creative.js","../src/modules/effect-cards/effect-cards.js"],"names":["isObject","obj","constructor","Object","extend","target","src","keys","forEach","key","length","ssrDocument","body","addEventListener","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","createElement","children","childNodes","style","setAttribute","getElementsByTagName","createElementNS","importNode","location","hash","host","hostname","href","origin","pathname","protocol","search","getDocument","doc","document","ssrWindow","navigator","userAgent","history","replaceState","pushState","go","back","CustomEvent","this","getComputedStyle","getPropertyValue","Image","Date","screen","setTimeout","clearTimeout","matchMedia","requestAnimationFrame","callback","cancelAnimationFrame","id","getWindow","win","window","Dom7","Array","items","super","proto","__proto__","defineProperty","get","set","value","makeReactive","arrayFlat","arr","res","el","isArray","push","arrayFilter","prototype","filter","call","$","selector","context","html","trim","indexOf","toCreate","tempParent","innerHTML","i","a","qsa","nodeType","uniqueArray","arrayUnique","fn","Methods","addClass","classes","classNames","map","c","split","classList","add","removeClass","remove","hasClass","className","contains","toggleClass","toggle","attr","attrs","arguments","getAttribute","attrName","removeAttr","removeAttribute","transform","transition","duration","transitionDuration","on","args","eventType","targetSelector","listener","capture","handleLiveEvent","e","eventData","dom7EventData","unshift","is","apply","parents","k","handleEvent","undefined","events","j","event","dom7LiveListeners","proxyListener","dom7Listeners","off","handlers","handler","dom7proxy","splice","trigger","evt","detail","bubbles","cancelable","data","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","offsetWidth","parseFloat","outerHeight","offsetHeight","offset","box","getBoundingClientRect","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","top","left","css","props","prop","each","index","text","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","append","els","newChild","tempDiv","firstChild","appendChild","prepend","insertBefore","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parent","parentNode","closest","find","foundElements","found","removeChild","nextTick","delay","now","getTranslate","axis","matrix","curTransform","transformMatrix","curStyle","currentStyle","WebKitCSSMatrix","webkitTransform","replace","join","MozTransform","OTransform","MsTransform","msTransform","toString","m41","m42","o","slice","to","noExtend","nextSource","node","HTMLElement","keysArray","nextIndex","len","nextKey","desc","getOwnPropertyDescriptor","enumerable","__swiper__","setCSSProperty","varName","varValue","setProperty","animateCSSModeScroll","swiper","targetPosition","side","startPosition","translate","time","startTime","params","speed","wrapperEl","scrollSnapType","cssModeFrameID","dir","isOutOfBound","current","animate","getTime","progress","Math","max","min","easeProgress","cos","PI","currentPosition","scrollTo","overflow","support","deviceCached","browser","getSupport","smoothScroll","documentElement","touch","DocumentTouch","passiveListener","supportsPassive","opts","gestures","calcSupport","getDevice","overrides","platform","ua","device","ios","android","screenWidth","width","screenHeight","height","match","ipad","ipod","iphone","windows","macos","os","calcDevice","getBrowser","isSafari","toLowerCase","isWebView","test","calcBrowser","methodName","writable","eventsEmitter","priority","self","method","eventsListeners","once","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","eventHandler","emit","transitionEmit","runCallbacks","direction","step","activeIndex","previousIndex","onTouchStart","touchEventsData","touches","enabled","animating","preventInteractionOnTransition","cssMode","loop","loopFix","originalEvent","$targetEl","touchEventsTarget","isTouchEvent","type","which","button","isTouched","isMoved","noSwipingClass","shadowRoot","path","noSwipingSelector","isTargetShadow","noSwiping","base","__closestFrom","assignedSlot","getRootNode","closestElement","allowClick","swipeHandler","currentX","targetTouches","pageX","currentY","pageY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","innerWidth","preventDefault","assign","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","updateSize","swipeDirection","threshold","allowThresholdMove","focusableElements","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","isContentEditable","onTouchMove","rtlTranslate","rtl","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","isVertical","maxTranslate","minTranslate","diffX","diffY","sqrt","touchAngle","isHorizontal","atan2","abs","touchMoveStopPropagation","nested","stopPropagation","startTranslate","setTransition","$wrapperEl","allowMomentumBounce","grabCursor","allowSlideNext","allowSlidePrev","setGrabCursor","diff","touchRatio","currentTranslate","disableParentSwiper","resistanceRatio","resistance","followFinger","freeMode","watchSlidesProgress","updateActiveIndex","updateSlidesClasses","updateProgress","setTranslate","onTouchEnd","slidesGrid","touchEndTime","timeDiff","updateClickedSlide","lastClickTime","destroyed","currentPos","stopIndex","groupSize","slidesSizesGrid","slidesPerGroupSkip","slidesPerGroup","increment","ratio","longSwipesMs","longSwipes","slideTo","longSwipesRatio","shortSwipes","navigation","nextEl","prevEl","onResize","breakpoints","setBreakpoint","snapGrid","updateSlides","slidesPerView","isEnd","isBeginning","centeredSlides","slides","autoplay","running","paused","run","watchOverflow","checkOverflow","onClick","preventClicks","preventClicksPropagation","stopImmediatePropagation","onScroll","newProgress","previousTranslate","translatesDiff","dummyEventAttached","dummyEventListener","touchEvents","domMethod","swiperMethod","start","passiveListeners","passive","move","end","cancel","updateOnWindowResize","isGridEnabled","grid","rows","defaults","init","initialSlide","resizeObserver","createElements","url","autoHeight","setWrapperSize","virtualTranslate","effect","breakpointsBase","spaceBetween","slidesPerGroupAuto","centeredSlidesBounds","slidesOffsetBefore","slidesOffsetAfter","normalizeSlideIndex","centerInsufficientSlides","roundLengths","simulateTouch","uniqueNavElements","slideToClickedSlide","preloadImages","updateOnImagesReady","loopAdditionalSlides","loopedSlides","loopFillGroupWithBlank","loopPreventsSlide","containerModifierClass","slideClass","slideBlankClass","slideActiveClass","slideDuplicateActiveClass","slideVisibleClass","slideDuplicateClass","slideNextClass","slideDuplicateNextClass","slidePrevClass","slideDuplicatePrevClass","wrapperClass","runCallbacksOnInit","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","update","$el","clientWidth","clientHeight","parseInt","Number","isNaN","size","getDirectionLabel","property","marginRight","getDirectionPropertyValue","label","swiperSize","wrongRTL","isVirtual","virtual","previousSlidesLength","slidesLength","offsetBefore","offsetAfter","previousSnapGridLength","previousSlidesGridLength","slidePosition","prevSlideSize","virtualSize","marginLeft","marginBottom","marginTop","gridEnabled","slideSize","initSlides","shouldResetSlideSize","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","paddingLeft","paddingRight","boxSizing","floor","swiperSlideSize","updateWrapperSize","newSlidesGrid","slidesGridItem","_","slideIndex","allSlidesSize","slideSizeValue","maxSnap","snap","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","v","updateSlidesOffset","updateAutoHeight","activeSlides","newHeight","getSlideByIndex","visibleSlides","ceil","swiperSlideOffset","offsetLeft","offsetTop","updateSlidesProgress","offsetCenter","visibleSlidesIndexes","slideOffset","slideProgress","originalSlideProgress","slideBefore","slideAfter","originalProgress","multiplier","wasBeginning","wasEnd","realIndex","activeSlide","nextSlide","prevSlide","emitSlidesClasses","newActiveIndex","previousRealIndex","previousSnapIndex","skip","initialized","slideFound","clickedSlide","clickedIndex","byController","x","y","translateTo","translateBounds","internal","newTranslate","isH","behavior","onTranslateToWrapperTransitionEnd","transitionStart","initial","Error","indexAsNumber","isFinite","normalizedTranslate","normalizedGrid","normalizedGridNext","t","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","slideNext","perGroup","slidesPerViewDynamic","_clientLeft","slidePrev","normalize","val","normalizedSnapGrid","prevSnap","prevSnapIndex","prevIndex","slideReset","slideToClosest","currentSnap","slideToIndex","loopCreate","$selector","blankSlidesNum","blankNode","prependSlides","appendSlides","cloneNode","loopDestroy","moving","isLocked","cursor","unsetGrabCursor","attachEvents","bind","detachEvents","breakpoint","getBreakpoint","currentBreakpoint","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","emitContainerClasses","fill","directionChanged","needsReLoop","changeDirection","isEnabled","disable","enable","containerEl","currentHeight","innerHeight","points","point","minRatio","substr","sort","b","wasLocked","lastSlideIndex","lastSlideRightEdge","addClasses","suffixes","entries","prefix","resultClasses","item","prepareClasses","autoheight","centered","removeClasses","images","loadImage","imageEl","srcset","sizes","checkForComplete","image","onReady","complete","onload","onerror","imagesLoaded","imagesToLoad","currentSrc","extendedDefaults","Swiper","swipers","newParams","modules","__modules__","mod","extendParams","swiperParams","passedParams","eventName","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","setProgress","cls","getSlideClasses","slideEl","updates","view","exact","spv","breakLoop","translateValue","translated","newDirection","needUpdate","currentDirection","mount","mounted","getWrapperSelector","options","getWrapper","wrapper","destroy","deleteInstance","cleanStyles","object","deleteProps","extendDefaults","newDefaults","installModule","use","module","m","createElementIfNotDefined","checkProps","element","classesToSelector","appendSlide","observer","prependSlide","addSlide","activeIndexBuffer","baseLength","slidesBuffer","currentSlide","removeSlide","slidesIndexes","indexToRemove","removeAllSlides","effectInit","overwriteParams","perspective","overwriteParamsResult","_s","effectTarget","effectParams","$slideEl","transformEl","effectVirtualTransitionEnd","allSlides","$transitionEndTarget","eventTriggered","triggerEvents","createShadow","shadowClass","$shadowContainer","$shadowEl","prototypeGroup","protoMethod","resizeHandler","orientationChangeHandler","ResizeObserver","newWidth","contentBoxSize","contentRect","inlineSize","blockSize","observe","unobserve","observers","attach","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","attributes","childList","characterData","observeParents","observeSlideChildren","containerParents","disconnect","cssModeTimeout","renderSlide","cache","force","addSlidesBefore","addSlidesAfter","from","previousFrom","previousTo","previousSlidesGrid","previousOffset","offsetProp","slidesAfter","slidesBefore","onRendered","lazy","load","renderExternal","slidesToRender","renderExternalUpdate","prependIndexes","appendIndexes","numberOfNewSlides","newCache","cachedIndex","$cachedEl","cachedElIndex","handle","kc","keyCode","charCode","pageUpDown","keyboard","isPageUp","isPageDown","isArrowLeft","isArrowRight","isArrowUp","isArrowDown","shiftKey","altKey","ctrlKey","metaKey","onlyInViewport","inView","swiperWidth","swiperHeight","windowWidth","windowHeight","swiperOffset","swiperCoord","returnValue","timeout","mousewheel","releaseOnEdges","invert","forceToAxis","sensitivity","eventsTarget","thresholdDelta","thresholdTime","lastEventBeforeSnap","lastScrollTime","recentWheelEvents","handleMouseEnter","mouseEntered","handleMouseLeave","animateSlider","newEvent","delta","raw","rtlFactor","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","spinY","pixelX","pixelY","positions","sign","ignoreWheelEvents","position","sticky","shift","prevEvent","firstEvent","snapToThreshold","autoplayDisableOnInteraction","stop","releaseScroll","getEl","toggleEl","disabled","disabledClass","tagName","lockClass","$nextEl","$prevEl","onPrevClick","onNextClick","hideOnClick","hiddenClass","targetEl","pagination","clickable","isHidden","pfx","bulletSize","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","number","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","bullets","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","total","paginationType","firstIndex","lastIndex","midIndex","suffix","bullet","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","progressbarDirection","scale","scaleX","scaleY","render","paginationHTML","numberOfBullets","dragStartPos","dragSize","trackSize","divider","dragTimeout","scrollbar","$dragEl","newSize","newPos","hide","opacity","display","getPointerPosition","clientX","clientY","setDragPosition","positionRatio","onDragStart","onDragMove","onDragEnd","snapOnRelease","activeListener","eventMethod","$swiperEl","dragClass","dragEl","draggable","parallax","setTransform","p","currentOpacity","currentScale","_swiper","parallaxEl","$parallaxEl","parallaxDuration","zoom","maxRatio","containerClass","zoomedSlideClass","gesturesEnabled","fakeGestureTouched","fakeGestureMoved","isScaling","gesture","slideWidth","slideHeight","$imageEl","$imageWrapEl","minX","minY","maxX","maxY","touchesStart","touchesCurrent","prevPositionX","prevPositionY","prevTime","getDistanceBetweenTouches","x1","y1","x2","y2","onGestureStart","scaleStart","onGestureChange","scaleMove","onGestureEnd","scaledWidth","scaledHeight","onTransitionEnd","zoomIn","touchX","touchY","offsetX","offsetY","translateX","translateY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","touchAction","zoomOut","zoomToggle","getListeners","activeListenerWithCapture","getSlideSelector","toggleGestures","slideSelector","enableGestures","disableGestures","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","momentumDuration","in","out","checkInView","loadPrevNext","loadPrevNextAmount","loadOnTransitionStart","scrollingElement","elementClass","loadingClass","loadedClass","preloaderClass","scrollHandlerAttached","initialImageLoaded","loadInSlide","loadInDuplicate","$images","background","$pictureEl","sourceEl","$source","slideOriginalIndex","slideExist","amount","maxIndex","minIndex","checkInViewOnLoad","$scrollElement","isWindow","scrollElementWidth","scrollElementHeight","LinearSpline","binarySearch","guess","array","i1","i3","interpolate","removeSpline","controller","control","spline","inverse","by","_t","controlled","controlledTranslate","setControlledTranslate","getInterpolateFunction","setControlledTransition","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","liveRegion","notify","message","notification","makeElFocusable","makeElNotFocusable","addElRole","role","addElRoleDescription","description","addElLabel","disableEl","enableEl","onEnterOrSpaceKey","click","updateNavigation","hasPagination","initNavEl","wrapperId","controls","addElControls","$containerEl","repeat","round","random","getRandomNumber","live","addElLive","bulletEl","updatePagination","root","paths","slugify","getPathValues","urlOverride","URL","pathArray","part","setHistory","includes","currentState","state","scrollToSlide","setHistoryPopState","hashNavigation","watchState","onHashChange","newHash","setHash","$activeSlideEl","autoplayResult","reverseDirection","stopOnLastSlide","pause","waitForTransition","onVisibilityChange","visibilityState","onMouseEnter","disableOnInteraction","onMouseLeave","pauseOnMouseEnter","thumbs","multipleActiveThumbs","autoScrollOffset","slideThumbActiveClass","thumbsContainerClass","swiperCreated","onThumbClick","thumbsSwiper","currentIndex","thumbsParams","SwiperClass","thumbsSwiperParams","useOffset","newThumbsIndex","currentThumbsIndex","prevThumbsIndex","nextThumbsIndex","thumbsToActivate","thumbActiveClass","momentum","momentumRatio","momentumBounce","momentumBounceRatio","momentumVelocityRatio","minimumVelocity","lastMoveEvent","pop","velocityEvent","distance","momentumDistance","newPosition","afterBouncePosition","doBounce","bounceAmount","needsLoopFix","moveDistance","currentSlideSize","slidesNumberEvenToRows","slidesPerRow","numFullColumns","newSlideOrderIndex","column","row","groupIndex","slideIndexInGroup","columnsInGroup","order","fadeEffect","crossFade","tx","ty","slideOpacity","cubeEffect","slideShadows","shadow","shadowOffset","shadowScale","$cubeShadowEl","wrapperRotate","slideAngle","tz","shadowBefore","shadowAfter","shadowAngle","sin","scale1","scale2","zFactor","flipEffect","limitRotation","rotateY","rotateX","zIndex","coverflowEffect","rotate","stretch","depth","modifier","center","offsetMultiplier","translateZ","slideTransform","$shadowBeforeEl","$shadowAfterEl","creativeEffect","limitProgress","shadowPerProgress","progressMultiplier","getTranslateValue","isCenteredSlides","margin","r","custom","translateString","rotateString","scaleString","opacityString","shadowOpacity","cardsEffect","tX","tY","tZ","tXAdd","isSwipeToNext","isSwipeToPrev","subProgress","prevY"],"mappings":"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","file":"swiper-bundle.min.js","sourcesContent":["/**\n * SSR Window 4.0.1\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n return (obj !== null &&\n typeof obj === 'object' &&\n 'constructor' in obj &&\n obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n Object.keys(src).forEach((key) => {\n if (typeof target[key] === 'undefined')\n target[key] = src[key];\n else if (isObject(src[key]) &&\n isObject(target[key]) &&\n Object.keys(src[key]).length > 0) {\n extend(target[key], src[key]);\n }\n });\n}\n\nconst ssrDocument = {\n body: {},\n addEventListener() { },\n removeEventListener() { },\n activeElement: {\n blur() { },\n nodeName: '',\n },\n querySelector() {\n return null;\n },\n querySelectorAll() {\n return [];\n },\n getElementById() {\n return null;\n },\n createEvent() {\n return {\n initEvent() { },\n };\n },\n createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute() { },\n getElementsByTagName() {\n return [];\n },\n };\n },\n createElementNS() {\n return {};\n },\n importNode() {\n return null;\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n};\nfunction getDocument() {\n const doc = typeof document !== 'undefined' ? document : {};\n extend(doc, ssrDocument);\n return doc;\n}\n\nconst ssrWindow = {\n document: ssrDocument,\n navigator: {\n userAgent: '',\n },\n location: {\n hash: '',\n host: '',\n hostname: '',\n href: '',\n origin: '',\n pathname: '',\n protocol: '',\n search: '',\n },\n history: {\n replaceState() { },\n pushState() { },\n go() { },\n back() { },\n },\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener() { },\n removeEventListener() { },\n getComputedStyle() {\n return {\n getPropertyValue() {\n return '';\n },\n };\n },\n Image() { },\n Date() { },\n screen: {},\n setTimeout() { },\n clearTimeout() { },\n matchMedia() {\n return {};\n },\n requestAnimationFrame(callback) {\n if (typeof setTimeout === 'undefined') {\n callback();\n return null;\n }\n return setTimeout(callback, 0);\n },\n cancelAnimationFrame(id) {\n if (typeof setTimeout === 'undefined') {\n return;\n }\n clearTimeout(id);\n },\n};\nfunction getWindow() {\n const win = typeof window !== 'undefined' ? window : {};\n extend(win, ssrWindow);\n return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.1\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n const proto = obj.__proto__;\n Object.defineProperty(obj, '__proto__', {\n get() {\n return proto;\n },\n\n set(value) {\n proto.__proto__ = value;\n }\n\n });\n}\n\nclass Dom7 extends Array {\n constructor(items) {\n super(...(items || []));\n makeReactive(this);\n }\n\n}\n\nfunction arrayFlat(arr = []) {\n const res = [];\n arr.forEach(el => {\n if (Array.isArray(el)) {\n res.push(...arrayFlat(el));\n } else {\n res.push(el);\n }\n });\n return res;\n}\nfunction arrayFilter(arr, callback) {\n return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n const uniqueArray = [];\n\n for (let i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n }\n\n return uniqueArray;\n}\nfunction toCamelCase(string) {\n return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n if (typeof selector !== 'string') {\n return [selector];\n }\n\n const a = [];\n const res = context.querySelectorAll(selector);\n\n for (let i = 0; i < res.length; i += 1) {\n a.push(res[i]);\n }\n\n return a;\n}\n\nfunction $(selector, context) {\n const window = getWindow();\n const document = getDocument();\n let arr = [];\n\n if (!context && selector instanceof Dom7) {\n return selector;\n }\n\n if (!selector) {\n return new Dom7(arr);\n }\n\n if (typeof selector === 'string') {\n const html = selector.trim();\n\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n let toCreate = 'div';\n if (html.indexOf(' c.split(' ')));\n this.forEach(el => {\n el.classList.add(...classNames);\n });\n return this;\n}\n\nfunction removeClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n el.classList.remove(...classNames);\n });\n return this;\n}\n\nfunction toggleClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n this.forEach(el => {\n classNames.forEach(className => {\n el.classList.toggle(className);\n });\n });\n}\n\nfunction hasClass(...classes) {\n const classNames = arrayFlat(classes.map(c => c.split(' ')));\n return arrayFilter(this, el => {\n return classNames.filter(className => el.classList.contains(className)).length > 0;\n }).length > 0;\n}\n\nfunction attr(attrs, value) {\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) return this[0].getAttribute(attrs);\n return undefined;\n } // Set attrs\n\n\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n for (const attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n\n return this;\n}\n\nfunction removeAttr(attr) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n\n return this;\n}\n\nfunction prop(props, value) {\n if (arguments.length === 1 && typeof props === 'string') {\n // Get prop\n if (this[0]) return this[0][props];\n } else {\n // Set props\n for (let i = 0; i < this.length; i += 1) {\n if (arguments.length === 2) {\n // String\n this[i][props] = value;\n } else {\n // Object\n for (const propName in props) {\n this[i][propName] = props[propName];\n }\n }\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction data(key, value) {\n let el;\n\n if (typeof value === 'undefined') {\n el = this[0];\n if (!el) return undefined; // Get value\n\n if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n return el.dom7ElementDataStorage[key];\n }\n\n const dataKey = el.getAttribute(`data-${key}`);\n\n if (dataKey) {\n return dataKey;\n }\n\n return undefined;\n } // Set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n el.dom7ElementDataStorage[key] = value;\n }\n\n return this;\n}\n\nfunction removeData(key) {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n el.dom7ElementDataStorage[key] = null;\n delete el.dom7ElementDataStorage[key];\n }\n }\n}\n\nfunction dataset() {\n const el = this[0];\n if (!el) return undefined;\n const dataset = {}; // eslint-disable-line\n\n if (el.dataset) {\n for (const dataKey in el.dataset) {\n dataset[dataKey] = el.dataset[dataKey];\n }\n } else {\n for (let i = 0; i < el.attributes.length; i += 1) {\n const attr = el.attributes[i];\n\n if (attr.name.indexOf('data-') >= 0) {\n dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n }\n }\n }\n\n for (const key in dataset) {\n if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n }\n\n return dataset;\n}\n\nfunction val(value) {\n if (typeof value === 'undefined') {\n // get value\n const el = this[0];\n if (!el) return undefined;\n\n if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n const values = [];\n\n for (let i = 0; i < el.selectedOptions.length; i += 1) {\n values.push(el.selectedOptions[i].value);\n }\n\n return values;\n }\n\n return el.value;\n } // set value\n\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n for (let j = 0; j < el.options.length; j += 1) {\n el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n }\n } else {\n el.value = value;\n }\n }\n\n return this;\n}\n\nfunction value(value) {\n return this.val(value);\n}\n\nfunction transform(transform) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transform = transform;\n }\n\n return this;\n}\n\nfunction transition(duration) {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n }\n\n return this;\n}\n\nfunction on(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n\n function handleLiveEvent(e) {\n const target = e.target;\n if (!target) return;\n const eventData = e.target.dom7EventData || [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n const parents = $(target).parents(); // eslint-disable-line\n\n for (let k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n }\n }\n }\n\n function handleEvent(e) {\n const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n\n listener.apply(this, eventData);\n }\n\n const events = eventType.split(' ');\n let j;\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7Listeners) el.dom7Listeners = {};\n if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n el.dom7Listeners[event].push({\n listener,\n proxyListener: handleEvent\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n const event = events[j];\n if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n el.dom7LiveListeners[event].push({\n listener,\n proxyListener: handleLiveEvent\n });\n el.addEventListener(event, handleLiveEvent, capture);\n }\n }\n }\n\n return this;\n}\n\nfunction off(...args) {\n let [eventType, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventType, listener, capture] = args;\n targetSelector = undefined;\n }\n\n if (!capture) capture = false;\n const events = eventType.split(' ');\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n let handlers;\n\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n\n if (handlers && handlers.length) {\n for (let k = handlers.length - 1; k >= 0; k -= 1) {\n const handler = handlers[k];\n\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n\n return this;\n}\n\nfunction once(...args) {\n const dom = this;\n let [eventName, targetSelector, listener, capture] = args;\n\n if (typeof args[1] === 'function') {\n [eventName, listener, capture] = args;\n targetSelector = undefined;\n }\n\n function onceHandler(...eventArgs) {\n listener.apply(this, eventArgs);\n dom.off(eventName, targetSelector, onceHandler, capture);\n\n if (onceHandler.dom7proxy) {\n delete onceHandler.dom7proxy;\n }\n }\n\n onceHandler.dom7proxy = listener;\n return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n const window = getWindow();\n const events = args[0].split(' ');\n const eventData = args[1];\n\n for (let i = 0; i < events.length; i += 1) {\n const event = events[i];\n\n for (let j = 0; j < this.length; j += 1) {\n const el = this[j];\n\n if (window.CustomEvent) {\n const evt = new window.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true\n });\n el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n }\n\n return this;\n}\n\nfunction transitionEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('transitionend', fireCallBack);\n }\n\n if (callback) {\n dom.on('transitionend', fireCallBack);\n }\n\n return this;\n}\n\nfunction animationEnd(callback) {\n const dom = this;\n\n function fireCallBack(e) {\n if (e.target !== this) return;\n callback.call(this, e);\n dom.off('animationend', fireCallBack);\n }\n\n if (callback) {\n dom.on('animationend', fireCallBack);\n }\n\n return this;\n}\n\nfunction width() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerWidth;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('width'));\n }\n\n return null;\n}\n\nfunction outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n }\n\n return this[0].offsetWidth;\n }\n\n return null;\n}\n\nfunction height() {\n const window = getWindow();\n\n if (this[0] === window) {\n return window.innerHeight;\n }\n\n if (this.length > 0) {\n return parseFloat(this.css('height'));\n }\n\n return null;\n}\n\nfunction outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n const styles = this.styles();\n return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n }\n\n return this[0].offsetHeight;\n }\n\n return null;\n}\n\nfunction offset() {\n if (this.length > 0) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n const box = el.getBoundingClientRect();\n const body = document.body;\n const clientTop = el.clientTop || body.clientTop || 0;\n const clientLeft = el.clientLeft || body.clientLeft || 0;\n const scrollTop = el === window ? window.scrollY : el.scrollTop;\n const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n return {\n top: box.top + scrollTop - clientTop,\n left: box.left + scrollLeft - clientLeft\n };\n }\n\n return null;\n}\n\nfunction hide() {\n for (let i = 0; i < this.length; i += 1) {\n this[i].style.display = 'none';\n }\n\n return this;\n}\n\nfunction show() {\n const window = getWindow();\n\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.style.display === 'none') {\n el.style.display = '';\n }\n\n if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n // Still not visible\n el.style.display = 'block';\n }\n }\n\n return this;\n}\n\nfunction styles() {\n const window = getWindow();\n if (this[0]) return window.getComputedStyle(this[0], null);\n return {};\n}\n\nfunction css(props, value) {\n const window = getWindow();\n let i;\n\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n // .css('width')\n if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n } else {\n // .css({ width: '100px' })\n for (i = 0; i < this.length; i += 1) {\n for (const prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n\n return this;\n }\n }\n\n if (arguments.length === 2 && typeof props === 'string') {\n // .css('width', '100px')\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n\n return this;\n }\n\n return this;\n}\n\nfunction each(callback) {\n if (!callback) return this;\n this.forEach((el, index) => {\n callback.apply(el, [el, index]);\n });\n return this;\n}\n\nfunction filter(callback) {\n const result = arrayFilter(this, callback);\n return $(result);\n}\n\nfunction html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n\n return this;\n}\n\nfunction text(text) {\n if (typeof text === 'undefined') {\n return this[0] ? this[0].textContent.trim() : null;\n }\n\n for (let i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n\n return this;\n}\n\nfunction is(selector) {\n const window = getWindow();\n const document = getDocument();\n const el = this[0];\n let compareWith;\n let i;\n if (!el || typeof selector === 'undefined') return false;\n\n if (typeof selector === 'string') {\n if (el.matches) return el.matches(selector);\n if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n compareWith = $(selector);\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n if (selector === document) {\n return el === document;\n }\n\n if (selector === window) {\n return el === window;\n }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) return true;\n }\n\n return false;\n }\n\n return false;\n}\n\nfunction index() {\n let child = this[0];\n let i;\n\n if (child) {\n i = 0; // eslint-disable-next-line\n\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) i += 1;\n }\n\n return i;\n }\n\n return undefined;\n}\n\nfunction eq(index) {\n if (typeof index === 'undefined') return this;\n const length = this.length;\n\n if (index > length - 1) {\n return $([]);\n }\n\n if (index < 0) {\n const returnIndex = length + index;\n if (returnIndex < 0) return $([]);\n return $([this[returnIndex]]);\n }\n\n return $([this[index]]);\n}\n\nfunction append(...els) {\n let newChild;\n const document = getDocument();\n\n for (let k = 0; k < els.length; k += 1) {\n newChild = els[k];\n\n for (let i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (let j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n}\n\nfunction appendTo(parent) {\n $(parent).append(this);\n return this;\n}\n\nfunction prepend(newChild) {\n const document = getDocument();\n let i;\n let j;\n\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = newChild;\n\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n\n return this;\n}\n\nfunction prependTo(parent) {\n $(parent).prepend(this);\n return this;\n}\n\nfunction insertBefore(selector) {\n const before = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (before.length === 1) {\n before[0].parentNode.insertBefore(this[i], before[0]);\n } else if (before.length > 1) {\n for (let j = 0; j < before.length; j += 1) {\n before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n }\n }\n }\n}\n\nfunction insertAfter(selector) {\n const after = $(selector);\n\n for (let i = 0; i < this.length; i += 1) {\n if (after.length === 1) {\n after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n } else if (after.length > 1) {\n for (let j = 0; j < after.length; j += 1) {\n after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n }\n }\n }\n}\n\nfunction next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n return $([this[0].nextElementSibling]);\n }\n\n return $([]);\n }\n\n if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction nextAll(selector) {\n const nextEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.nextElementSibling) {\n const next = el.nextElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(next).is(selector)) nextEls.push(next);\n } else nextEls.push(next);\n\n el = next;\n }\n\n return $(nextEls);\n}\n\nfunction prev(selector) {\n if (this.length > 0) {\n const el = this[0];\n\n if (selector) {\n if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n return $([el.previousElementSibling]);\n }\n\n return $([]);\n }\n\n if (el.previousElementSibling) return $([el.previousElementSibling]);\n return $([]);\n }\n\n return $([]);\n}\n\nfunction prevAll(selector) {\n const prevEls = [];\n let el = this[0];\n if (!el) return $([]);\n\n while (el.previousElementSibling) {\n const prev = el.previousElementSibling; // eslint-disable-line\n\n if (selector) {\n if ($(prev).is(selector)) prevEls.push(prev);\n } else prevEls.push(prev);\n\n el = prev;\n }\n\n return $(prevEls);\n}\n\nfunction siblings(selector) {\n return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n\n return $(parents);\n}\n\nfunction parents(selector) {\n const parents = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n let parent = this[i].parentNode; // eslint-disable-line\n\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) parents.push(parent);\n } else {\n parents.push(parent);\n }\n\n parent = parent.parentNode;\n }\n }\n\n return $(parents);\n}\n\nfunction closest(selector) {\n let closest = this; // eslint-disable-line\n\n if (typeof selector === 'undefined') {\n return $([]);\n }\n\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n\n return closest;\n}\n\nfunction find(selector) {\n const foundElements = [];\n\n for (let i = 0; i < this.length; i += 1) {\n const found = this[i].querySelectorAll(selector);\n\n for (let j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n\n return $(foundElements);\n}\n\nfunction children(selector) {\n const children = []; // eslint-disable-line\n\n for (let i = 0; i < this.length; i += 1) {\n const childNodes = this[i].children;\n\n for (let j = 0; j < childNodes.length; j += 1) {\n if (!selector || $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n\n return $(children);\n}\n\nfunction remove() {\n for (let i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n }\n\n return this;\n}\n\nfunction detach() {\n return this.remove();\n}\n\nfunction add(...els) {\n const dom = this;\n let i;\n let j;\n\n for (i = 0; i < els.length; i += 1) {\n const toAdd = $(els[i]);\n\n for (j = 0; j < toAdd.length; j += 1) {\n dom.push(toAdd[j]);\n }\n }\n\n return dom;\n}\n\nfunction empty() {\n for (let i = 0; i < this.length; i += 1) {\n const el = this[i];\n\n if (el.nodeType === 1) {\n for (let j = 0; j < el.childNodes.length; j += 1) {\n if (el.childNodes[j].parentNode) {\n el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n }\n }\n\n el.textContent = '';\n }\n }\n\n return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n const window = getWindow();\n let [left, top, duration, easing, callback] = args;\n\n if (args.length === 4 && typeof easing === 'function') {\n callback = easing;\n [left, top, duration, callback, easing] = args;\n }\n\n if (typeof easing === 'undefined') easing = 'swing';\n return this.each(function animate() {\n const el = this;\n let currentTop;\n let currentLeft;\n let maxTop;\n let maxLeft;\n let newTop;\n let newLeft;\n let scrollTop; // eslint-disable-line\n\n let scrollLeft; // eslint-disable-line\n\n let animateTop = top > 0 || top === 0;\n let animateLeft = left > 0 || left === 0;\n\n if (typeof easing === 'undefined') {\n easing = 'swing';\n }\n\n if (animateTop) {\n currentTop = el.scrollTop;\n\n if (!duration) {\n el.scrollTop = top;\n }\n }\n\n if (animateLeft) {\n currentLeft = el.scrollLeft;\n\n if (!duration) {\n el.scrollLeft = left;\n }\n }\n\n if (!duration) return;\n\n if (animateTop) {\n maxTop = el.scrollHeight - el.offsetHeight;\n newTop = Math.max(Math.min(top, maxTop), 0);\n }\n\n if (animateLeft) {\n maxLeft = el.scrollWidth - el.offsetWidth;\n newLeft = Math.max(Math.min(left, maxLeft), 0);\n }\n\n let startTime = null;\n if (animateTop && newTop === currentTop) animateTop = false;\n if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n function render(time = new Date().getTime()) {\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n let done;\n if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n el.scrollTop = newTop;\n done = true;\n }\n\n if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n el.scrollLeft = newLeft;\n done = true;\n }\n\n if (done) {\n if (callback) callback();\n return;\n }\n\n if (animateTop) el.scrollTop = scrollTop;\n if (animateLeft) el.scrollLeft = scrollLeft;\n window.requestAnimationFrame(render);\n }\n\n window.requestAnimationFrame(render);\n });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n let [top, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [top, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof top === 'undefined') {\n if (dom.length > 0) return dom[0].scrollTop;\n return null;\n }\n\n return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n let [left, duration, easing, callback] = args;\n\n if (args.length === 3 && typeof easing === 'function') {\n [left, duration, callback, easing] = args;\n }\n\n const dom = this;\n\n if (typeof left === 'undefined') {\n if (dom.length > 0) return dom[0].scrollLeft;\n return null;\n }\n\n return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n const window = getWindow();\n const els = this;\n const a = {\n props: Object.assign({}, initialProps),\n params: Object.assign({\n duration: 300,\n easing: 'swing' // or 'linear'\n\n /* Callbacks\n begin(elements)\n complete(elements)\n progress(elements, complete, remaining, start, tweenValue)\n */\n\n }, initialParams),\n elements: els,\n animating: false,\n que: [],\n\n easingProgress(easing, progress) {\n if (easing === 'swing') {\n return 0.5 - Math.cos(progress * Math.PI) / 2;\n }\n\n if (typeof easing === 'function') {\n return easing(progress);\n }\n\n return progress;\n },\n\n stop() {\n if (a.frameId) {\n window.cancelAnimationFrame(a.frameId);\n }\n\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n a.que = [];\n },\n\n done(complete) {\n a.animating = false;\n a.elements.each(el => {\n const element = el;\n delete element.dom7AnimateInstance;\n });\n if (complete) complete(els);\n\n if (a.que.length > 0) {\n const que = a.que.shift();\n a.animate(que[0], que[1]);\n }\n },\n\n animate(props, params) {\n if (a.animating) {\n a.que.push([props, params]);\n return a;\n }\n\n const elements = []; // Define & Cache Initials & Units\n\n a.elements.each((el, index) => {\n let initialFullValue;\n let initialValue;\n let unit;\n let finalValue;\n let finalFullValue;\n if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n elements[index] = {\n container: el\n };\n Object.keys(props).forEach(prop => {\n initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n initialValue = parseFloat(initialFullValue);\n unit = initialFullValue.replace(initialValue, '');\n finalValue = parseFloat(props[prop]);\n finalFullValue = props[prop] + unit;\n elements[index][prop] = {\n initialFullValue,\n initialValue,\n unit,\n finalValue,\n finalFullValue,\n currentValue: initialValue\n };\n });\n });\n let startTime = null;\n let time;\n let elementsDone = 0;\n let propsDone = 0;\n let done;\n let began = false;\n a.animating = true;\n\n function render() {\n time = new Date().getTime();\n let progress;\n let easeProgress; // let el;\n\n if (!began) {\n began = true;\n if (params.begin) params.begin(els);\n }\n\n if (startTime === null) {\n startTime = time;\n }\n\n if (params.progress) {\n // eslint-disable-next-line\n params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n }\n\n elements.forEach(element => {\n const el = element;\n if (done || el.done) return;\n Object.keys(props).forEach(prop => {\n if (done || el.done) return;\n progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n easeProgress = a.easingProgress(params.easing, progress);\n const {\n initialValue,\n finalValue,\n unit\n } = el[prop];\n el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n const currentValue = el[prop].currentValue;\n\n if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n el.container.style[prop] = finalValue + unit;\n propsDone += 1;\n\n if (propsDone === Object.keys(props).length) {\n el.done = true;\n elementsDone += 1;\n }\n\n if (elementsDone === elements.length) {\n done = true;\n }\n }\n\n if (done) {\n a.done(params.complete);\n return;\n }\n\n el.container.style[prop] = currentValue + unit;\n });\n });\n if (done) return; // Then call\n\n a.frameId = window.requestAnimationFrame(render);\n }\n\n a.frameId = window.requestAnimationFrame(render);\n return a;\n }\n\n };\n\n if (a.elements.length === 0) {\n return els;\n }\n\n let animateInstance;\n\n for (let i = 0; i < a.elements.length; i += 1) {\n if (a.elements[i].dom7AnimateInstance) {\n animateInstance = a.elements[i].dom7AnimateInstance;\n } else a.elements[i].dom7AnimateInstance = a;\n }\n\n if (!animateInstance) {\n animateInstance = a;\n }\n\n if (initialProps === 'stop') {\n animateInstance.stop();\n } else {\n animateInstance.animate(a.props, a.params);\n }\n\n return els;\n}\n\nfunction stop() {\n const els = this;\n\n for (let i = 0; i < els.length; i += 1) {\n if (els[i].dom7AnimateInstance) {\n els[i].dom7AnimateInstance.stop();\n }\n }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n function eventHandler(...args) {\n if (typeof args[0] === 'undefined') {\n for (let i = 0; i < this.length; i += 1) {\n if (noTrigger.indexOf(name) < 0) {\n if (name in this[i]) this[i][name]();else {\n $(this[i]).trigger(name);\n }\n }\n }\n\n return this;\n }\n\n return this.on(name, ...args);\n }\n\n return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import {\n $,\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n} from 'dom7';\n\nconst Methods = {\n addClass,\n removeClass,\n hasClass,\n toggleClass,\n attr,\n removeAttr,\n transform,\n transition,\n on,\n off,\n trigger,\n transitionEnd,\n outerWidth,\n outerHeight,\n styles,\n offset,\n css,\n each,\n html,\n text,\n is,\n index,\n eq,\n append,\n prepend,\n next,\n nextAll,\n prev,\n prevAll,\n parent,\n parents,\n closest,\n find,\n children,\n filter,\n remove,\n};\n\nObject.keys(Methods).forEach((methodName) => {\n Object.defineProperty($.fn, methodName, { value: Methods[methodName], writable: true });\n});\n\nexport default $;\n","import { getWindow } from 'ssr-window';\n\nfunction deleteProps(obj) {\n const object = obj;\n Object.keys(object).forEach((key) => {\n try {\n object[key] = null;\n } catch (e) {\n // no getter for object\n }\n try {\n delete object[key];\n } catch (e) {\n // something got wrong\n }\n });\n}\nfunction nextTick(callback, delay = 0) {\n return setTimeout(callback, delay);\n}\nfunction now() {\n return Date.now();\n}\nfunction getComputedStyle(el) {\n const window = getWindow();\n let style;\n if (window.getComputedStyle) {\n style = window.getComputedStyle(el, null);\n }\n if (!style && el.currentStyle) {\n style = el.currentStyle;\n }\n if (!style) {\n style = el.style;\n }\n\n return style;\n}\nfunction getTranslate(el, axis = 'x') {\n const window = getWindow();\n let matrix;\n let curTransform;\n let transformMatrix;\n\n const curStyle = getComputedStyle(el, null);\n\n if (window.WebKitCSSMatrix) {\n curTransform = curStyle.transform || curStyle.webkitTransform;\n if (curTransform.split(',').length > 6) {\n curTransform = curTransform\n .split(', ')\n .map((a) => a.replace(',', '.'))\n .join(', ');\n }\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n } else {\n transformMatrix =\n curStyle.MozTransform ||\n curStyle.OTransform ||\n curStyle.MsTransform ||\n curStyle.msTransform ||\n curStyle.transform ||\n curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n\n if (axis === 'x') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[4]);\n }\n if (axis === 'y') {\n // Latest Chrome and webkits Fix\n if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n // Crazy IE10 Matrix\n else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n // Normal Browsers\n else curTransform = parseFloat(matrix[5]);\n }\n return curTransform || 0;\n}\nfunction isObject(o) {\n return (\n typeof o === 'object' &&\n o !== null &&\n o.constructor &&\n Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n );\n}\nfunction isNode(node) {\n // eslint-disable-next-line\n if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n return node instanceof HTMLElement;\n }\n return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend(...args) {\n const to = Object(args[0]);\n const noExtend = ['__proto__', 'constructor', 'prototype'];\n for (let i = 1; i < args.length; i += 1) {\n const nextSource = args[i];\n if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0);\n for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n const nextKey = keysArray[nextIndex];\n const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n if (nextSource[nextKey].__swiper__) {\n to[nextKey] = nextSource[nextKey];\n } else {\n extend(to[nextKey], nextSource[nextKey]);\n }\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({ swiper, targetPosition, side }) {\n const window = getWindow();\n const startPosition = -swiper.translate;\n let startTime = null;\n let time;\n const duration = swiper.params.speed;\n\n swiper.wrapperEl.style.scrollSnapType = 'none';\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n\n const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n const isOutOfBound = (current, target) => {\n return (dir === 'next' && current >= target) || (dir === 'prev' && current <= target);\n };\n\n const animate = () => {\n time = new Date().getTime();\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n if (isOutOfBound(currentPosition, targetPosition)) {\n currentPosition = targetPosition;\n }\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n if (isOutOfBound(currentPosition, targetPosition)) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.scrollSnapType = '';\n setTimeout(() => {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.scrollTo({\n [side]: currentPosition,\n });\n });\n window.cancelAnimationFrame(swiper.cssModeFrameID);\n return;\n }\n swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n };\n animate();\n}\n\nexport {\n animateCSSModeScroll,\n deleteProps,\n nextTick,\n now,\n getTranslate,\n isObject,\n extend,\n getComputedStyle,\n setCSSProperty,\n};\n","import { getWindow, getDocument } from 'ssr-window';\n\nlet support;\n\nfunction calcSupport() {\n const window = getWindow();\n const document = getDocument();\n\n return {\n smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n\n touch: !!(\n 'ontouchstart' in window ||\n (window.DocumentTouch && document instanceof window.DocumentTouch)\n ),\n\n passiveListener: (function checkPassiveListener() {\n let supportsPassive = false;\n try {\n const opts = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line\n get() {\n supportsPassive = true;\n },\n });\n window.addEventListener('testPassiveListener', null, opts);\n } catch (e) {\n // No support\n }\n return supportsPassive;\n })(),\n\n gestures: (function checkGestures() {\n return 'ongesturestart' in window;\n })(),\n };\n}\n\nfunction getSupport() {\n if (!support) {\n support = calcSupport();\n }\n return support;\n}\n\nexport { getSupport };\n","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\n\nlet deviceCached;\n\nfunction calcDevice({ userAgent } = {}) {\n const support = getSupport();\n const window = getWindow();\n const platform = window.navigator.platform;\n const ua = userAgent || window.navigator.userAgent;\n\n const device = {\n ios: false,\n android: false,\n };\n\n const screenWidth = window.screen.width;\n const screenHeight = window.screen.height;\n\n const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n const windows = platform === 'Win32';\n let macos = platform === 'MacIntel';\n\n // iPadOs 13 fix\n const iPadScreens = [\n '1024x1366',\n '1366x1024',\n '834x1194',\n '1194x834',\n '834x1112',\n '1112x834',\n '768x1024',\n '1024x768',\n '820x1180',\n '1180x820',\n '810x1080',\n '1080x810',\n ];\n if (\n !ipad &&\n macos &&\n support.touch &&\n iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0\n ) {\n ipad = ua.match(/(Version)\\/([\\d.]+)/);\n if (!ipad) ipad = [0, 1, '13_0_0'];\n macos = false;\n }\n\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.android = true;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n\n // Export object\n return device;\n}\n\nfunction getDevice(overrides = {}) {\n if (!deviceCached) {\n deviceCached = calcDevice(overrides);\n }\n return deviceCached;\n}\n\nexport { getDevice };\n","import { getWindow } from 'ssr-window';\n\nlet browser;\n\nfunction calcBrowser() {\n const window = getWindow();\n function isSafari() {\n const ua = window.navigator.userAgent.toLowerCase();\n return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n }\n return {\n isSafari: isSafari(),\n isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent),\n };\n}\n\nfunction getBrowser() {\n if (!browser) {\n browser = calcBrowser();\n }\n return browser;\n}\n\nexport { getBrowser };\n","/* eslint-disable no-underscore-dangle */\n\nexport default {\n on(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n events.split(' ').forEach((event) => {\n if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n self.eventsListeners[event][method](handler);\n });\n return self;\n },\n\n once(events, handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n function onceHandler(...args) {\n self.off(events, onceHandler);\n if (onceHandler.__emitterProxy) {\n delete onceHandler.__emitterProxy;\n }\n handler.apply(self, args);\n }\n onceHandler.__emitterProxy = handler;\n return self.on(events, onceHandler, priority);\n },\n\n onAny(handler, priority) {\n const self = this;\n if (typeof handler !== 'function') return self;\n const method = priority ? 'unshift' : 'push';\n if (self.eventsAnyListeners.indexOf(handler) < 0) {\n self.eventsAnyListeners[method](handler);\n }\n return self;\n },\n\n offAny(handler) {\n const self = this;\n if (!self.eventsAnyListeners) return self;\n const index = self.eventsAnyListeners.indexOf(handler);\n if (index >= 0) {\n self.eventsAnyListeners.splice(index, 1);\n }\n return self;\n },\n\n off(events, handler) {\n const self = this;\n if (!self.eventsListeners) return self;\n events.split(' ').forEach((event) => {\n if (typeof handler === 'undefined') {\n self.eventsListeners[event] = [];\n } else if (self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler, index) => {\n if (\n eventHandler === handler ||\n (eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler)\n ) {\n self.eventsListeners[event].splice(index, 1);\n }\n });\n }\n });\n return self;\n },\n\n emit(...args) {\n const self = this;\n if (!self.eventsListeners) return self;\n let events;\n let data;\n let context;\n if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n events = args[0];\n data = args.slice(1, args.length);\n context = self;\n } else {\n events = args[0].events;\n data = args[0].data;\n context = args[0].context || self;\n }\n data.unshift(context);\n const eventsArray = Array.isArray(events) ? events : events.split(' ');\n\n eventsArray.forEach((event) => {\n if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n self.eventsAnyListeners.forEach((eventHandler) => {\n eventHandler.apply(context, [event, ...data]);\n });\n }\n if (self.eventsListeners && self.eventsListeners[event]) {\n self.eventsListeners[event].forEach((eventHandler) => {\n eventHandler.apply(context, data);\n });\n }\n });\n return self;\n },\n};\n","export default function transitionEmit({ swiper, runCallbacks, direction, step }) {\n const { activeIndex, previousIndex } = swiper;\n let dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) dir = 'next';\n else if (activeIndex < previousIndex) dir = 'prev';\n else dir = 'reset';\n }\n\n swiper.emit(`transition${step}`);\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit(`slideResetTransition${step}`);\n return;\n }\n swiper.emit(`slideChangeTransition${step}`);\n if (dir === 'next') {\n swiper.emit(`slideNextTransition${step}`);\n } else {\n swiper.emit(`slidePrevTransition${step}`);\n }\n }\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base = this) {\n function __closestFrom(el) {\n if (!el || el === getDocument() || el === getWindow()) return null;\n if (el.assignedSlot) el = el.assignedSlot;\n const found = el.closest(selector);\n return found || __closestFrom(el.getRootNode().host);\n }\n return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n const swiper = this;\n const document = getDocument();\n const window = getWindow();\n\n const data = swiper.touchEventsData;\n const { params, touches, enabled } = swiper;\n if (!enabled) return;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return;\n }\n if (!swiper.animating && params.cssMode && params.loop) {\n swiper.loopFix();\n }\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n let $targetEl = $(e.target);\n\n if (params.touchEventsTarget === 'wrapper') {\n if (!$targetEl.closest(swiper.wrapperEl).length) return;\n }\n data.isTouchEvent = e.type === 'touchstart';\n if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n if (data.isTouched && data.isMoved) return;\n\n // change target el for shadow root component\n const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n $targetEl = $(event.path[0]);\n }\n\n const noSwipingSelector = params.noSwipingSelector\n ? params.noSwipingSelector\n : `.${params.noSwipingClass}`;\n const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n // use closestElement for shadow root element to get the actual closest for nested shadow root element\n if (\n params.noSwiping &&\n (isTargetShadow\n ? closestElement(noSwipingSelector, e.target)\n : $targetEl.closest(noSwipingSelector)[0])\n ) {\n swiper.allowClick = true;\n return;\n }\n\n if (params.swipeHandler) {\n if (!$targetEl.closest(params.swipeHandler)[0]) return;\n }\n\n touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n const startX = touches.currentX;\n const startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n if (\n edgeSwipeDetection &&\n (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)\n ) {\n if (edgeSwipeDetection === 'prevent') {\n event.preventDefault();\n } else {\n return;\n }\n }\n\n Object.assign(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined,\n });\n\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) data.allowThresholdMove = false;\n if (e.type !== 'touchstart') {\n let preventDefault = true;\n if ($targetEl.is(data.focusableElements)) preventDefault = false;\n if (\n document.activeElement &&\n $(document.activeElement).is(data.focusableElements) &&\n document.activeElement !== $targetEl[0]\n ) {\n document.activeElement.blur();\n }\n\n const shouldPreventDefault =\n preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n if (\n (params.touchStartForcePreventDefault || shouldPreventDefault) &&\n !$targetEl[0].isContentEditable\n ) {\n e.preventDefault();\n }\n }\n swiper.emit('touchStart', e);\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\n\nexport default function onTouchMove(event) {\n const document = getDocument();\n const swiper = this;\n const data = swiper.touchEventsData;\n const { params, touches, rtlTranslate: rtl, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (!data.isTouched) {\n if (data.startMoving && data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n return;\n }\n if (data.isTouchEvent && e.type !== 'touchmove') return;\n const targetTouch =\n e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n // isMoved = true;\n swiper.allowClick = false;\n if (data.isTouched) {\n Object.assign(touches, {\n startX: pageX,\n startY: pageY,\n currentX: pageX,\n currentY: pageY,\n });\n data.touchStartTime = now();\n }\n return;\n }\n if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (\n (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) ||\n (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n ) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (\n (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) ||\n (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n ) {\n return;\n }\n }\n if (data.isTouchEvent && document.activeElement) {\n if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) return;\n\n touches.currentX = pageX;\n touches.currentY = pageY;\n\n const diffX = touches.currentX - touches.startX;\n const diffY = touches.currentY - touches.startY;\n if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold)\n return;\n\n if (typeof data.isScrolling === 'undefined') {\n let touchAngle;\n if (\n (swiper.isHorizontal() && touches.currentY === touches.startY) ||\n (swiper.isVertical() && touches.currentX === touches.startX)\n ) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if (diffX * diffX + diffY * diffY >= 25) {\n touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n data.isScrolling = swiper.isHorizontal()\n ? touchAngle > params.touchAngle\n : 90 - touchAngle > params.touchAngle;\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof data.startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (data.isScrolling) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n if (!params.cssMode && e.cancelable) {\n e.preventDefault();\n }\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n\n if (!data.isMoved) {\n if (params.loop && !params.cssMode) {\n swiper.loopFix();\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n\n let diff = swiper.isHorizontal() ? diffX : diffY;\n touches.diff = diff;\n\n diff *= params.touchRatio;\n if (rtl) diff = -diff;\n\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n data.currentTranslate = diff + data.startTranslate;\n\n let disableParentSwiper = true;\n let resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.minTranslate() -\n 1 +\n (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance)\n data.currentTranslate =\n swiper.maxTranslate() +\n 1 -\n (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n }\n\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n swiper.swipeDirection === 'next' &&\n data.currentTranslate < data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (\n !swiper.allowSlidePrev &&\n swiper.swipeDirection === 'prev' &&\n data.currentTranslate > data.startTranslate\n ) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n data.currentTranslate = data.startTranslate;\n }\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal()\n ? touches.currentX - touches.startX\n : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n\n if (!params.followFinger || params.cssMode) return;\n\n // Update active index in free mode\n if (\n (params.freeMode && params.freeMode.enabled && swiper.freeMode) ||\n params.watchSlidesProgress\n ) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n swiper.freeMode.onTouchMove();\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n}\n","import { now, nextTick } from '../../shared/utils.js';\n\nexport default function onTouchEnd(event) {\n const swiper = this;\n const data = swiper.touchEventsData;\n\n const { params, touches, rtlTranslate: rtl, slidesGrid, enabled } = swiper;\n if (!enabled) return;\n let e = event;\n if (e.originalEvent) e = e.originalEvent;\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) {\n if (data.isMoved && params.grabCursor) {\n swiper.setGrabCursor(false);\n }\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n // Return Grab Cursor\n if (\n params.grabCursor &&\n data.isMoved &&\n data.isTouched &&\n (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)\n ) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n swiper.updateClickedSlide(e);\n swiper.emit('tap click', e);\n if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n swiper.emit('doubleTap doubleClick', e);\n }\n }\n\n data.lastClickTime = now();\n nextTick(() => {\n if (!swiper.destroyed) swiper.allowClick = true;\n });\n\n if (\n !data.isTouched ||\n !data.isMoved ||\n !swiper.swipeDirection ||\n touches.diff === 0 ||\n data.currentTranslate === data.startTranslate\n ) {\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n\n let currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n\n if (params.cssMode) {\n return;\n }\n\n if (swiper.params.freeMode && params.freeMode.enabled) {\n swiper.freeMode.onTouchEnd({ currentPos });\n return;\n }\n\n // Find current slide\n let stopIndex = 0;\n let groupSize = swiper.slidesSizesGrid[0];\n for (\n let i = 0;\n i < slidesGrid.length;\n i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup\n ) {\n const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n if (typeof slidesGrid[i + increment] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n stopIndex = i;\n groupSize = slidesGrid[i + increment] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n\n // Find current slide size\n const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);\n else swiper.slideTo(stopIndex);\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n const isNavButtonTarget =\n swiper.navigation &&\n (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n if (!isNavButtonTarget) {\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(stopIndex + increment);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(stopIndex);\n }\n } else if (e.target === swiper.navigation.nextEl) {\n swiper.slideTo(stopIndex + increment);\n } else {\n swiper.slideTo(stopIndex);\n }\n }\n}\n","export default function onResize() {\n const swiper = this;\n\n const { params, el } = swiper;\n\n if (el && el.offsetWidth === 0) return;\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n const { allowSlideNext, allowSlidePrev, snapGrid } = swiper;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n\n swiper.updateSize();\n swiper.updateSlides();\n\n swiper.updateSlidesClasses();\n if (\n (params.slidesPerView === 'auto' || params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.isBeginning &&\n !swiper.params.centeredSlides\n ) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n\n if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n swiper.autoplay.run();\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n}\n","export default function onClick(e) {\n const swiper = this;\n if (!swiper.enabled) return;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) e.preventDefault();\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n}\n","export default function onScroll() {\n const swiper = this;\n const { wrapperEl, rtlTranslate, enabled } = swiper;\n if (!enabled) return;\n swiper.previousTranslate = swiper.translate;\n if (swiper.isHorizontal()) {\n swiper.translate = -wrapperEl.scrollLeft;\n } else {\n swiper.translate = -wrapperEl.scrollTop;\n }\n // eslint-disable-next-line\n if (swiper.translate === -0) swiper.translate = 0;\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== swiper.progress) {\n swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, false);\n}\n","import { getDocument } from 'ssr-window';\n\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\n\nlet dummyEventAttached = false;\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n const document = getDocument();\n const { params, touchEvents, el, wrapperEl, device, support } = swiper;\n const capture = !!params.nested;\n const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n const swiperMethod = method;\n\n // Touch Events\n if (!support.touch) {\n el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n } else {\n const passiveListener =\n touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n el[domMethod](\n touchEvents.move,\n swiper.onTouchMove,\n support.passiveListener ? { passive: false, capture } : capture,\n );\n el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n if (touchEvents.cancel) {\n el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n el[domMethod]('click', swiper.onClick, true);\n }\n if (params.cssMode) {\n wrapperEl[domMethod]('scroll', swiper.onScroll);\n }\n\n // Resize handler\n if (params.updateOnWindowResize) {\n swiper[swiperMethod](\n device.ios || device.android\n ? 'resize orientationchange observerUpdate'\n : 'resize observerUpdate',\n onResize,\n true,\n );\n } else {\n swiper[swiperMethod]('observerUpdate', onResize, true);\n }\n};\n\nfunction attachEvents() {\n const swiper = this;\n const document = getDocument();\n const { params, support } = swiper;\n\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n if (params.cssMode) {\n swiper.onScroll = onScroll.bind(swiper);\n }\n\n swiper.onClick = onClick.bind(swiper);\n\n if (support.touch && !dummyEventAttached) {\n document.addEventListener('touchstart', dummyEventListener);\n dummyEventAttached = true;\n }\n\n events(swiper, 'on');\n}\n\nfunction detachEvents() {\n const swiper = this;\n events(swiper, 'off');\n}\n\nexport default {\n attachEvents,\n detachEvents,\n};\n","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n const swiper = this;\n const { activeIndex, initialized, loopedSlides = 0, params, $el } = swiper;\n const breakpoints = params.breakpoints;\n if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) return;\n\n // Get breakpoint for window width and update parameters\n const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n\n if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n\n const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n const wasMultiRow = isGridEnabled(swiper, params);\n const isMultiRow = isGridEnabled(swiper, breakpointParams);\n\n const wasEnabled = params.enabled;\n\n if (wasMultiRow && !isMultiRow) {\n $el.removeClass(\n `${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`,\n );\n swiper.emitContainerClasses();\n } else if (!wasMultiRow && isMultiRow) {\n $el.addClass(`${params.containerModifierClass}grid`);\n if (\n (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column') ||\n (!breakpointParams.grid.fill && params.grid.fill === 'column')\n ) {\n $el.addClass(`${params.containerModifierClass}grid-column`);\n }\n swiper.emitContainerClasses();\n }\n\n const directionChanged =\n breakpointParams.direction && breakpointParams.direction !== params.direction;\n const needsReLoop =\n params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n if (directionChanged && initialized) {\n swiper.changeDirection();\n }\n extend(swiper.params, breakpointParams);\n\n const isEnabled = swiper.params.enabled;\n\n Object.assign(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n });\n\n if (wasEnabled && !isEnabled) {\n swiper.disable();\n } else if (!wasEnabled && isEnabled) {\n swiper.enable();\n }\n\n swiper.currentBreakpoint = breakpoint;\n\n swiper.emit('_beforeBreakpoint', breakpointParams);\n\n if (needsReLoop && initialized) {\n swiper.loopDestroy();\n swiper.loopCreate();\n swiper.updateSlides();\n swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n }\n\n swiper.emit('breakpoint', breakpointParams);\n}\n","function checkOverflow() {\n const swiper = this;\n const { isLocked: wasLocked, params } = swiper;\n const { slidesOffsetBefore } = params;\n\n if (slidesOffsetBefore) {\n const lastSlideIndex = swiper.slides.length - 1;\n const lastSlideRightEdge =\n swiper.slidesGrid[lastSlideIndex] +\n swiper.slidesSizesGrid[lastSlideIndex] +\n slidesOffsetBefore * 2;\n swiper.isLocked = swiper.size > lastSlideRightEdge;\n } else {\n swiper.isLocked = swiper.snapGrid.length === 1;\n }\n if (params.allowSlideNext === true) {\n swiper.allowSlideNext = !swiper.isLocked;\n }\n if (params.allowSlidePrev === true) {\n swiper.allowSlidePrev = !swiper.isLocked;\n }\n\n if (wasLocked && wasLocked !== swiper.isLocked) {\n swiper.isEnd = false;\n }\n if (wasLocked !== swiper.isLocked) {\n swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n }\n}\n\nexport default { checkOverflow };\n","export default {\n init: true,\n direction: 'horizontal',\n touchEventsTarget: 'wrapper',\n initialSlide: 0,\n speed: 300,\n cssMode: false,\n updateOnWindowResize: true,\n resizeObserver: true,\n nested: false,\n createElements: false,\n enabled: true,\n focusableElements: 'input, select, option, textarea, button, video, label',\n\n // Overrides\n width: null,\n height: null,\n\n //\n preventInteractionOnTransition: false,\n\n // ssr\n userAgent: null,\n url: null,\n\n // To support iOS's swipe-to-go-back gesture (when being used in-app).\n edgeSwipeDetection: false,\n edgeSwipeThreshold: 20,\n\n // Autoheight\n autoHeight: false,\n\n // Set wrapper width\n setWrapperSize: false,\n\n // Virtual Translate\n virtualTranslate: false,\n\n // Effects\n effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n breakpointsBase: 'window',\n\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerGroup: 1,\n slidesPerGroupSkip: 0,\n slidesPerGroupAuto: false,\n centeredSlides: false,\n centeredSlidesBounds: false,\n slidesOffsetBefore: 0, // in px\n slidesOffsetAfter: 0, // in px\n normalizeSlideIndex: true,\n centerInsufficientSlides: false,\n\n // Disable swiper and hide navigation when container not overflow\n watchOverflow: true,\n\n // Round length\n roundLengths: false,\n\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 0,\n touchMoveStopPropagation: false,\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchReleaseOnEdges: false,\n\n // Unique Navigation Elements\n uniqueNavElements: true,\n\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n\n // Progress\n watchSlidesProgress: false,\n\n // Cursor\n grabCursor: false,\n\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n\n // Images\n preloadImages: true,\n updateOnImagesReady: true,\n\n // loop\n loop: false,\n loopAdditionalSlides: 0,\n loopedSlides: null,\n loopFillGroupWithBlank: false,\n loopPreventsSlide: true,\n\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null, // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n noSwipingSelector: null,\n\n // Passive Listeners\n passiveListeners: true,\n\n // NS\n containerModifierClass: 'swiper-', // NEW\n slideClass: 'swiper-slide',\n slideBlankClass: 'swiper-slide-invisible-blank',\n slideActiveClass: 'swiper-slide-active',\n slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideDuplicateClass: 'swiper-slide-duplicate',\n slideNextClass: 'swiper-slide-next',\n slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n slidePrevClass: 'swiper-slide-prev',\n slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n wrapperClass: 'swiper-wrapper',\n\n // Callbacks\n runCallbacksOnInit: true,\n\n // Internals\n _emitClasses: false,\n};\n","import { extend } from '../shared/utils.js';\n\nexport default function moduleExtendParams(params, allModulesParams) {\n return function extendParams(obj = {}) {\n const moduleParamName = Object.keys(obj)[0];\n const moduleParams = obj[moduleParamName];\n if (typeof moduleParams !== 'object' || moduleParams === null) {\n extend(allModulesParams, obj);\n return;\n }\n if (\n ['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 &&\n params[moduleParamName] === true\n ) {\n params[moduleParamName] = { auto: true };\n }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n extend(allModulesParams, obj);\n return;\n }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = { enabled: true };\n }\n if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) params[moduleParamName] = { enabled: false };\n extend(allModulesParams, obj);\n };\n}\n","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\n\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\n\nimport eventsEmitter from './events-emitter.js';\n\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\n\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\n\nconst prototypes = {\n eventsEmitter,\n update,\n translate,\n transition,\n slide,\n loop,\n grabCursor,\n events,\n breakpoints,\n checkOverflow,\n classes,\n images,\n};\n\nconst extendedDefaults = {};\n\nclass Swiper {\n constructor(...args) {\n let el;\n let params;\n if (\n args.length === 1 &&\n args[0].constructor &&\n Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object'\n ) {\n params = args[0];\n } else {\n [el, params] = args;\n }\n if (!params) params = {};\n\n params = extend({}, params);\n if (el && !params.el) params.el = el;\n\n if (params.el && $(params.el).length > 1) {\n const swipers = [];\n $(params.el).each((containerEl) => {\n const newParams = extend({}, params, { el: containerEl });\n swipers.push(new Swiper(newParams));\n });\n return swipers;\n }\n\n // Swiper Instance\n const swiper = this;\n swiper.__swiper__ = true;\n swiper.support = getSupport();\n swiper.device = getDevice({ userAgent: params.userAgent });\n swiper.browser = getBrowser();\n\n swiper.eventsListeners = {};\n swiper.eventsAnyListeners = [];\n swiper.modules = [...swiper.__modules__];\n if (params.modules && Array.isArray(params.modules)) {\n swiper.modules.push(...params.modules);\n }\n\n const allModulesParams = {};\n\n swiper.modules.forEach((mod) => {\n mod({\n swiper,\n extendParams: moduleExtendParams(params, allModulesParams),\n on: swiper.on.bind(swiper),\n once: swiper.once.bind(swiper),\n off: swiper.off.bind(swiper),\n emit: swiper.emit.bind(swiper),\n });\n });\n\n // Extend defaults with modules params\n const swiperParams = extend({}, defaults, allModulesParams);\n\n // Extend defaults with passed params\n swiper.params = extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = extend({}, swiper.params);\n swiper.passedParams = extend({}, params);\n\n // add event listeners\n if (swiper.params && swiper.params.on) {\n Object.keys(swiper.params.on).forEach((eventName) => {\n swiper.on(eventName, swiper.params.on[eventName]);\n });\n }\n if (swiper.params && swiper.params.onAny) {\n swiper.onAny(swiper.params.onAny);\n }\n\n // Save Dom lib\n swiper.$ = $;\n\n // Extend Swiper\n Object.assign(swiper, {\n enabled: swiper.params.enabled,\n el,\n\n // Classes\n classNames: [],\n\n // Slides\n slides: $(),\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n\n // isDirection\n isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical() {\n return swiper.params.direction === 'vertical';\n },\n\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n\n //\n isBeginning: true,\n isEnd: false,\n\n // Props\n translate: 0,\n previousTranslate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n\n // Touch Events\n touchEvents: (function touchEvents() {\n const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n\n swiper.touchEventsTouch = {\n start: touch[0],\n move: touch[1],\n end: touch[2],\n cancel: touch[3],\n };\n swiper.touchEventsDesktop = {\n start: desktop[0],\n move: desktop[1],\n end: desktop[2],\n };\n return swiper.support.touch || !swiper.params.simulateTouch\n ? swiper.touchEventsTouch\n : swiper.touchEventsDesktop;\n })(),\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n focusableElements: swiper.params.focusableElements,\n // Last click time\n lastClickTime: now(),\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n isTouchEvent: undefined,\n startMoving: undefined,\n },\n\n // Clicks\n allowClick: true,\n\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0,\n },\n\n // Images\n imagesToLoad: [],\n imagesLoaded: 0,\n });\n\n swiper.emit('_swiper');\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n return swiper;\n }\n\n enable() {\n const swiper = this;\n if (swiper.enabled) return;\n swiper.enabled = true;\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n swiper.emit('enable');\n }\n\n disable() {\n const swiper = this;\n if (!swiper.enabled) return;\n swiper.enabled = false;\n if (swiper.params.grabCursor) {\n swiper.unsetGrabCursor();\n }\n swiper.emit('disable');\n }\n\n setProgress(progress, speed) {\n const swiper = this;\n progress = Math.min(Math.max(progress, 0), 1);\n const min = swiper.minTranslate();\n const max = swiper.maxTranslate();\n const current = (max - min) * progress + min;\n swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n\n emitContainerClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const cls = swiper.el.className.split(' ').filter((className) => {\n return (\n className.indexOf('swiper') === 0 ||\n className.indexOf(swiper.params.containerModifierClass) === 0\n );\n });\n swiper.emit('_containerClasses', cls.join(' '));\n }\n\n getSlideClasses(slideEl) {\n const swiper = this;\n\n return slideEl.className\n .split(' ')\n .filter((className) => {\n return (\n className.indexOf('swiper-slide') === 0 ||\n className.indexOf(swiper.params.slideClass) === 0\n );\n })\n .join(' ');\n }\n\n emitSlidesClasses() {\n const swiper = this;\n if (!swiper.params._emitClasses || !swiper.el) return;\n const updates = [];\n swiper.slides.each((slideEl) => {\n const classNames = swiper.getSlideClasses(slideEl);\n updates.push({ slideEl, classNames });\n swiper.emit('_slideClass', slideEl, classNames);\n });\n swiper.emit('_slideClasses', updates);\n }\n\n slidesPerViewDynamic(view = 'current', exact = false) {\n const swiper = this;\n const { params, slides, slidesGrid, slidesSizesGrid, size: swiperSize, activeIndex } = swiper;\n let spv = 1;\n if (params.centeredSlides) {\n let slideSize = slides[activeIndex].swiperSlideSize;\n let breakLoop;\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) breakLoop = true;\n }\n }\n } else {\n // eslint-disable-next-line\n if (view === 'current') {\n for (let i = activeIndex + 1; i < slides.length; i += 1) {\n const slideInView = exact\n ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize\n : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n } else {\n // previous\n for (let i = activeIndex - 1; i >= 0; i -= 1) {\n const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n if (slideInView) {\n spv += 1;\n }\n }\n }\n }\n return spv;\n }\n\n update() {\n const swiper = this;\n if (!swiper || swiper.destroyed) return;\n const { snapGrid, params } = swiper;\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n\n function setTranslate() {\n const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n const newTranslate = Math.min(\n Math.max(translateValue, swiper.maxTranslate()),\n swiper.minTranslate(),\n );\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n let translated;\n if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n setTranslate();\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if (\n (swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) &&\n swiper.isEnd &&\n !swiper.params.centeredSlides\n ) {\n translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n swiper.emit('update');\n }\n\n changeDirection(newDirection, needUpdate = true) {\n const swiper = this;\n const currentDirection = swiper.params.direction;\n if (!newDirection) {\n // eslint-disable-next-line\n newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n }\n if (\n newDirection === currentDirection ||\n (newDirection !== 'horizontal' && newDirection !== 'vertical')\n ) {\n return swiper;\n }\n\n swiper.$el\n .removeClass(`${swiper.params.containerModifierClass}${currentDirection}`)\n .addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n swiper.emitContainerClasses();\n\n swiper.params.direction = newDirection;\n\n swiper.slides.each((slideEl) => {\n if (newDirection === 'vertical') {\n slideEl.style.width = '';\n } else {\n slideEl.style.height = '';\n }\n });\n\n swiper.emit('changeDirection');\n if (needUpdate) swiper.update();\n\n return swiper;\n }\n\n mount(el) {\n const swiper = this;\n if (swiper.mounted) return true;\n\n // Find el\n const $el = $(el || swiper.params.el);\n el = $el[0];\n\n if (!el) {\n return false;\n }\n\n el.swiper = swiper;\n\n const getWrapperSelector = () => {\n return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n };\n\n const getWrapper = () => {\n if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n const res = $(el.shadowRoot.querySelector(getWrapperSelector()));\n // Children needs to return slot items\n res.children = (options) => $el.children(options);\n return res;\n }\n return $el.children(getWrapperSelector());\n };\n // Find Wrapper\n let $wrapperEl = getWrapper();\n if ($wrapperEl.length === 0 && swiper.params.createElements) {\n const document = getDocument();\n const wrapper = document.createElement('div');\n $wrapperEl = $(wrapper);\n wrapper.className = swiper.params.wrapperClass;\n $el.append(wrapper);\n $el.children(`.${swiper.params.slideClass}`).each((slideEl) => {\n $wrapperEl.append(slideEl);\n });\n }\n\n Object.assign(swiper, {\n $el,\n el,\n $wrapperEl,\n wrapperEl: $wrapperEl[0],\n mounted: true,\n\n // RTL\n rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n rtlTranslate:\n swiper.params.direction === 'horizontal' &&\n (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n });\n\n return true;\n }\n\n init(el) {\n const swiper = this;\n if (swiper.initialized) return swiper;\n\n const mounted = swiper.mount(el);\n if (mounted === false) return swiper;\n\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n\n if (swiper.params.watchOverflow) {\n swiper.checkOverflow();\n }\n\n // Set Grab Cursor\n if (swiper.params.grabCursor && swiper.enabled) {\n swiper.setGrabCursor();\n }\n\n if (swiper.params.preloadImages) {\n swiper.preloadImages();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop) {\n swiper.slideTo(\n swiper.params.initialSlide + swiper.loopedSlides,\n 0,\n swiper.params.runCallbacksOnInit,\n false,\n true,\n );\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n }\n\n // Attach events\n swiper.attachEvents();\n\n // Init Flag\n swiper.initialized = true;\n\n // Emit\n swiper.emit('init');\n swiper.emit('afterInit');\n\n return swiper;\n }\n\n destroy(deleteInstance = true, cleanStyles = true) {\n const swiper = this;\n const { params, $el, $wrapperEl, slides } = swiper;\n\n if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n return null;\n }\n\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n $el.removeAttr('style');\n $wrapperEl.removeAttr('style');\n if (slides && slides.length) {\n slides\n .removeClass(\n [\n params.slideVisibleClass,\n params.slideActiveClass,\n params.slideNextClass,\n params.slidePrevClass,\n ].join(' '),\n )\n .removeAttr('style')\n .removeAttr('data-swiper-slide-index');\n }\n }\n\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach((eventName) => {\n swiper.off(eventName);\n });\n\n if (deleteInstance !== false) {\n swiper.$el[0].swiper = null;\n deleteProps(swiper);\n }\n swiper.destroyed = true;\n\n return null;\n }\n\n static extendDefaults(newDefaults) {\n extend(extendedDefaults, newDefaults);\n }\n\n static get extendedDefaults() {\n return extendedDefaults;\n }\n\n static get defaults() {\n return defaults;\n }\n\n static installModule(mod) {\n if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n const modules = Swiper.prototype.__modules__;\n\n if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n modules.push(mod);\n }\n }\n\n static use(module) {\n if (Array.isArray(module)) {\n module.forEach((m) => Swiper.installModule(m));\n return Swiper;\n }\n Swiper.installModule(module);\n return Swiper;\n }\n}\n\nObject.keys(prototypes).forEach((prototypeGroup) => {\n Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n });\n});\n\nSwiper.use([Resize, Observer]);\n\nexport default Swiper;\n","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\n\nexport default {\n updateSize,\n updateSlides,\n updateAutoHeight,\n updateSlidesOffset,\n updateSlidesProgress,\n updateProgress,\n updateSlidesClasses,\n updateActiveIndex,\n updateClickedSlide,\n};\n","export default function updateSize() {\n const swiper = this;\n let width;\n let height;\n const $el = swiper.$el;\n if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n width = swiper.params.width;\n } else {\n width = $el[0].clientWidth;\n }\n if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n height = swiper.params.height;\n } else {\n height = $el[0].clientHeight;\n }\n if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n return;\n }\n\n // Subtract paddings\n width =\n width -\n parseInt($el.css('padding-left') || 0, 10) -\n parseInt($el.css('padding-right') || 0, 10);\n height =\n height -\n parseInt($el.css('padding-top') || 0, 10) -\n parseInt($el.css('padding-bottom') || 0, 10);\n\n if (Number.isNaN(width)) width = 0;\n if (Number.isNaN(height)) height = 0;\n\n Object.assign(swiper, {\n width,\n height,\n size: swiper.isHorizontal() ? width : height,\n });\n}\n","import { setCSSProperty } from '../../shared/utils.js';\n\nexport default function updateSlides() {\n const swiper = this;\n function getDirectionLabel(property) {\n if (swiper.isHorizontal()) {\n return property;\n }\n // prettier-ignore\n return {\n 'width': 'height',\n 'margin-top': 'margin-left',\n 'margin-bottom ': 'margin-right',\n 'margin-left': 'margin-top',\n 'margin-right': 'margin-bottom',\n 'padding-left': 'padding-top',\n 'padding-right': 'padding-bottom',\n 'marginRight': 'marginBottom',\n }[property];\n }\n function getDirectionPropertyValue(node, label) {\n return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n }\n\n const params = swiper.params;\n\n const { $wrapperEl, size: swiperSize, rtlTranslate: rtl, wrongRTL } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n let snapGrid = [];\n const slidesGrid = [];\n const slidesSizesGrid = [];\n\n let offsetBefore = params.slidesOffsetBefore;\n if (typeof offsetBefore === 'function') {\n offsetBefore = params.slidesOffsetBefore.call(swiper);\n }\n\n let offsetAfter = params.slidesOffsetAfter;\n if (typeof offsetAfter === 'function') {\n offsetAfter = params.slidesOffsetAfter.call(swiper);\n }\n\n const previousSnapGridLength = swiper.snapGrid.length;\n const previousSlidesGridLength = swiper.slidesGrid.length;\n\n let spaceBetween = params.spaceBetween;\n let slidePosition = -offsetBefore;\n let prevSlideSize = 0;\n let index = 0;\n if (typeof swiperSize === 'undefined') {\n return;\n }\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n }\n\n swiper.virtualSize = -spaceBetween;\n\n // reset margins\n if (rtl) slides.css({ marginLeft: '', marginBottom: '', marginTop: '' });\n else slides.css({ marginRight: '', marginBottom: '', marginTop: '' });\n\n // reset cssMode offsets\n if (params.centeredSlides && params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n }\n\n const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n if (gridEnabled) {\n swiper.grid.initSlides(slidesLength);\n }\n\n // Calc slides\n let slideSize;\n\n const shouldResetSlideSize =\n params.slidesPerView === 'auto' &&\n params.breakpoints &&\n Object.keys(params.breakpoints).filter((key) => {\n return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n }).length > 0;\n\n for (let i = 0; i < slidesLength; i += 1) {\n slideSize = 0;\n const slide = slides.eq(i);\n if (gridEnabled) {\n swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n }\n if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n if (params.slidesPerView === 'auto') {\n if (shouldResetSlideSize) {\n slides[i].style[getDirectionLabel('width')] = ``;\n }\n const slideStyles = getComputedStyle(slide[0]);\n const currentTransform = slide[0].style.transform;\n const currentWebKitTransform = slide[0].style.webkitTransform;\n if (currentTransform) {\n slide[0].style.transform = 'none';\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = 'none';\n }\n if (params.roundLengths) {\n slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n } else {\n // eslint-disable-next-line\n const width = getDirectionPropertyValue(slideStyles, 'width');\n const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n const boxSizing = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing && boxSizing === 'border-box') {\n slideSize = width + marginLeft + marginRight;\n } else {\n const { clientWidth, offsetWidth } = slide[0];\n slideSize =\n width +\n paddingLeft +\n paddingRight +\n marginLeft +\n marginRight +\n (offsetWidth - clientWidth);\n }\n }\n if (currentTransform) {\n slide[0].style.transform = currentTransform;\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = currentWebKitTransform;\n }\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n } else {\n slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n if (slides[i]) {\n slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n }\n }\n if (slides[i]) {\n slides[i].swiperSlideSize = slideSize;\n }\n slidesSizesGrid.push(slideSize);\n\n if (params.centeredSlides) {\n slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n if (prevSlideSize === 0 && i !== 0)\n slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n } else {\n if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n if (\n (index - Math.min(swiper.params.slidesPerGroupSkip, index)) %\n swiper.params.slidesPerGroup ===\n 0\n )\n snapGrid.push(slidePosition);\n slidesGrid.push(slidePosition);\n slidePosition = slidePosition + slideSize + spaceBetween;\n }\n\n swiper.virtualSize += slideSize + spaceBetween;\n\n prevSlideSize = slideSize;\n\n index += 1;\n }\n swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` });\n }\n if (params.setWrapperSize) {\n $wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`,\n });\n }\n\n if (gridEnabled) {\n swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n }\n\n // Remove last grid elements depending on width\n if (!params.centeredSlides) {\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n newSlidesGrid.push(slidesGridItem);\n }\n }\n snapGrid = newSlidesGrid;\n\n if (\n Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) >\n 1\n ) {\n snapGrid.push(swiper.virtualSize - swiperSize);\n }\n }\n if (snapGrid.length === 0) snapGrid = [0];\n\n if (params.spaceBetween !== 0) {\n const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n slides\n .filter((_, slideIndex) => {\n if (!params.cssMode) return true;\n if (slideIndex === slides.length - 1) {\n return false;\n }\n return true;\n })\n .css({ [key]: `${spaceBetween}px` });\n }\n\n if (params.centeredSlides && params.centeredSlidesBounds) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n const maxSnap = allSlidesSize - swiperSize;\n snapGrid = snapGrid.map((snap) => {\n if (snap < 0) return -offsetBefore;\n if (snap > maxSnap) return maxSnap + offsetAfter;\n return snap;\n });\n }\n\n if (params.centerInsufficientSlides) {\n let allSlidesSize = 0;\n slidesSizesGrid.forEach((slideSizeValue) => {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n if (allSlidesSize < swiperSize) {\n const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n snapGrid.forEach((snap, snapIndex) => {\n snapGrid[snapIndex] = snap - allSlidesOffset;\n });\n slidesGrid.forEach((snap, snapIndex) => {\n slidesGrid[snapIndex] = snap + allSlidesOffset;\n });\n }\n }\n\n Object.assign(swiper, {\n slides,\n snapGrid,\n slidesGrid,\n slidesSizesGrid,\n });\n\n if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n setCSSProperty(\n swiper.wrapperEl,\n '--swiper-centered-offset-after',\n `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`,\n );\n const addToSnapGrid = -swiper.snapGrid[0];\n const addToSlidesGrid = -swiper.slidesGrid[0];\n swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid);\n swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid);\n }\n\n if (slidesLength !== previousSlidesLength) {\n swiper.emit('slidesLengthChange');\n }\n if (snapGrid.length !== previousSnapGridLength) {\n if (swiper.params.watchOverflow) swiper.checkOverflow();\n swiper.emit('snapGridLengthChange');\n }\n if (slidesGrid.length !== previousSlidesGridLength) {\n swiper.emit('slidesGridLengthChange');\n }\n\n if (params.watchSlidesProgress) {\n swiper.updateSlidesOffset();\n }\n}\n","export default function updateAutoHeight(speed) {\n const swiper = this;\n const activeSlides = [];\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let newHeight = 0;\n let i;\n if (typeof speed === 'number') {\n swiper.setTransition(speed);\n } else if (speed === true) {\n swiper.setTransition(swiper.params.speed);\n }\n\n const getSlideByIndex = (index) => {\n if (isVirtual) {\n return swiper.slides.filter(\n (el) => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index,\n )[0];\n }\n return swiper.slides.eq(index)[0];\n };\n // Find slides currently in view\n if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n if (swiper.params.centeredSlides) {\n swiper.visibleSlides.each((slide) => {\n activeSlides.push(slide);\n });\n } else {\n for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n const index = swiper.activeIndex + i;\n if (index > swiper.slides.length && !isVirtual) break;\n activeSlides.push(getSlideByIndex(index));\n }\n }\n } else {\n activeSlides.push(getSlideByIndex(swiper.activeIndex));\n }\n\n // Find new height from highest slide in view\n for (i = 0; i < activeSlides.length; i += 1) {\n if (typeof activeSlides[i] !== 'undefined') {\n const height = activeSlides[i].offsetHeight;\n newHeight = height > newHeight ? height : newHeight;\n }\n }\n\n // Update Height\n if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}\n","export default function updateSlidesOffset() {\n const swiper = this;\n const slides = swiper.slides;\n for (let i = 0; i < slides.length; i += 1) {\n slides[i].swiperSlideOffset = swiper.isHorizontal()\n ? slides[i].offsetLeft\n : slides[i].offsetTop;\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateSlidesProgress(translate = (this && this.translate) || 0) {\n const swiper = this;\n const params = swiper.params;\n\n const { slides, rtlTranslate: rtl, snapGrid } = swiper;\n\n if (slides.length === 0) return;\n if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n\n let offsetCenter = -translate;\n if (rtl) offsetCenter = translate;\n\n // Visible Slides\n slides.removeClass(params.slideVisibleClass);\n\n swiper.visibleSlidesIndexes = [];\n swiper.visibleSlides = [];\n\n for (let i = 0; i < slides.length; i += 1) {\n const slide = slides[i];\n let slideOffset = slide.swiperSlideOffset;\n if (params.cssMode && params.centeredSlides) {\n slideOffset -= slides[0].swiperSlideOffset;\n }\n\n const slideProgress =\n (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const originalSlideProgress =\n (offsetCenter -\n snapGrid[0] +\n (params.centeredSlides ? swiper.minTranslate() : 0) -\n slideOffset) /\n (slide.swiperSlideSize + params.spaceBetween);\n const slideBefore = -(offsetCenter - slideOffset);\n const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n const isVisible =\n (slideBefore >= 0 && slideBefore < swiper.size - 1) ||\n (slideAfter > 1 && slideAfter <= swiper.size) ||\n (slideBefore <= 0 && slideAfter >= swiper.size);\n if (isVisible) {\n swiper.visibleSlides.push(slide);\n swiper.visibleSlidesIndexes.push(i);\n slides.eq(i).addClass(params.slideVisibleClass);\n }\n slide.progress = rtl ? -slideProgress : slideProgress;\n slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n }\n swiper.visibleSlides = $(swiper.visibleSlides);\n}\n","export default function updateProgress(translate) {\n const swiper = this;\n if (typeof translate === 'undefined') {\n const multiplier = swiper.rtlTranslate ? -1 : 1;\n // eslint-disable-next-line\n translate = (swiper && swiper.translate && swiper.translate * multiplier) || 0;\n }\n const params = swiper.params;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n let { progress, isBeginning, isEnd } = swiper;\n const wasBeginning = isBeginning;\n const wasEnd = isEnd;\n if (translatesDiff === 0) {\n progress = 0;\n isBeginning = true;\n isEnd = true;\n } else {\n progress = (translate - swiper.minTranslate()) / translatesDiff;\n isBeginning = progress <= 0;\n isEnd = progress >= 1;\n }\n Object.assign(swiper, {\n progress,\n isBeginning,\n isEnd,\n });\n\n if (params.watchSlidesProgress || (params.centeredSlides && params.autoHeight))\n swiper.updateSlidesProgress(translate);\n\n if (isBeginning && !wasBeginning) {\n swiper.emit('reachBeginning toEdge');\n }\n if (isEnd && !wasEnd) {\n swiper.emit('reachEnd toEdge');\n }\n if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n swiper.emit('fromEdge');\n }\n\n swiper.emit('progress', progress);\n}\n","export default function updateSlidesClasses() {\n const swiper = this;\n\n const { slides, params, $wrapperEl, activeIndex, realIndex } = swiper;\n const isVirtual = swiper.virtual && params.virtual.enabled;\n\n slides.removeClass(\n `${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`,\n );\n\n let activeSlide;\n if (isVirtual) {\n activeSlide = swiper.$wrapperEl.find(\n `.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`,\n );\n } else {\n activeSlide = slides.eq(activeIndex);\n }\n\n // Active classes\n activeSlide.addClass(params.slideActiveClass);\n\n if (params.loop) {\n // Duplicate to all looped slides\n if (activeSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`,\n )\n .addClass(params.slideDuplicateActiveClass);\n }\n }\n // Next Slide\n let nextSlide = activeSlide\n .nextAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slideNextClass);\n if (params.loop && nextSlide.length === 0) {\n nextSlide = slides.eq(0);\n nextSlide.addClass(params.slideNextClass);\n }\n // Prev Slide\n let prevSlide = activeSlide\n .prevAll(`.${params.slideClass}`)\n .eq(0)\n .addClass(params.slidePrevClass);\n if (params.loop && prevSlide.length === 0) {\n prevSlide = slides.eq(-1);\n prevSlide.addClass(params.slidePrevClass);\n }\n if (params.loop) {\n // Duplicate to all looped slides\n if (nextSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicateNextClass);\n }\n if (prevSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children(\n `.${params.slideClass}:not(.${\n params.slideDuplicateClass\n })[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n } else {\n $wrapperEl\n .children(\n `.${params.slideClass}.${\n params.slideDuplicateClass\n }[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`,\n )\n .addClass(params.slideDuplicatePrevClass);\n }\n }\n swiper.emitSlidesClasses();\n}\n","export default function updateActiveIndex(newActiveIndex) {\n const swiper = this;\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n const {\n slidesGrid,\n snapGrid,\n params,\n activeIndex: previousIndex,\n realIndex: previousRealIndex,\n snapIndex: previousSnapIndex,\n } = swiper;\n let activeIndex = newActiveIndex;\n let snapIndex;\n if (typeof activeIndex === 'undefined') {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n translate >= slidesGrid[i] &&\n translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2\n ) {\n activeIndex = i;\n } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n activeIndex = i + 1;\n }\n } else if (translate >= slidesGrid[i]) {\n activeIndex = i;\n }\n }\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n }\n }\n if (snapGrid.indexOf(translate) >= 0) {\n snapIndex = snapGrid.indexOf(translate);\n } else {\n const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n }\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n if (activeIndex === previousIndex) {\n if (snapIndex !== previousSnapIndex) {\n swiper.snapIndex = snapIndex;\n swiper.emit('snapIndexChange');\n }\n return;\n }\n\n // Get real index\n const realIndex = parseInt(\n swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex,\n 10,\n );\n\n Object.assign(swiper, {\n snapIndex,\n realIndex,\n previousIndex,\n activeIndex,\n });\n swiper.emit('activeIndexChange');\n swiper.emit('snapIndexChange');\n if (previousRealIndex !== realIndex) {\n swiper.emit('realIndexChange');\n }\n if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n swiper.emit('slideChange');\n }\n}\n","import $ from '../../shared/dom.js';\n\nexport default function updateClickedSlide(e) {\n const swiper = this;\n const params = swiper.params;\n const slide = $(e.target).closest(`.${params.slideClass}`)[0];\n let slideFound = false;\n let slideIndex;\n\n if (slide) {\n for (let i = 0; i < swiper.slides.length; i += 1) {\n if (swiper.slides[i] === slide) {\n slideFound = true;\n slideIndex = i;\n break;\n }\n }\n }\n\n if (slide && slideFound) {\n swiper.clickedSlide = slide;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n } else {\n swiper.clickedIndex = slideIndex;\n }\n } else {\n swiper.clickedSlide = undefined;\n swiper.clickedIndex = undefined;\n return;\n }\n if (\n params.slideToClickedSlide &&\n swiper.clickedIndex !== undefined &&\n swiper.clickedIndex !== swiper.activeIndex\n ) {\n swiper.slideToClickedSlide();\n }\n}\n","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\n\nexport default {\n getTranslate,\n setTranslate,\n minTranslate,\n maxTranslate,\n translateTo,\n};\n","import { getTranslate } from '../../shared/utils.js';\n\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n const swiper = this;\n\n const { params, rtlTranslate: rtl, translate, $wrapperEl } = swiper;\n\n if (params.virtualTranslate) {\n return rtl ? -translate : translate;\n }\n if (params.cssMode) {\n return translate;\n }\n\n let currentTranslate = getTranslate($wrapperEl[0], axis);\n if (rtl) currentTranslate = -currentTranslate;\n\n return currentTranslate || 0;\n}\n","export default function setTranslate(translate, byController) {\n const swiper = this;\n const { rtlTranslate: rtl, params, $wrapperEl, wrapperEl, progress } = swiper;\n let x = 0;\n let y = 0;\n const z = 0;\n\n if (swiper.isHorizontal()) {\n x = rtl ? -translate : translate;\n } else {\n y = translate;\n }\n\n if (params.roundLengths) {\n x = Math.floor(x);\n y = Math.floor(y);\n }\n\n if (params.cssMode) {\n wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n } else if (!params.virtualTranslate) {\n $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n }\n swiper.previousTranslate = swiper.translate;\n swiper.translate = swiper.isHorizontal() ? x : y;\n\n // Check if we need to update progress\n let newProgress;\n const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n }\n if (newProgress !== progress) {\n swiper.updateProgress(translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, byController);\n}\n","export default function minTranslate() {\n return -this.snapGrid[0];\n}\n","export default function maxTranslate() {\n return -this.snapGrid[this.snapGrid.length - 1];\n}\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function translateTo(\n translate = 0,\n speed = this.params.speed,\n runCallbacks = true,\n translateBounds = true,\n internal,\n) {\n const swiper = this;\n\n const { params, wrapperEl } = swiper;\n\n if (swiper.animating && params.preventInteractionOnTransition) {\n return false;\n }\n\n const minTranslate = swiper.minTranslate();\n const maxTranslate = swiper.maxTranslate();\n let newTranslate;\n if (translateBounds && translate > minTranslate) newTranslate = minTranslate;\n else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;\n else newTranslate = translate;\n\n // Update progress\n swiper.updateProgress(newTranslate);\n\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n if (speed === 0) {\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: -newTranslate, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: -newTranslate,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionEnd');\n }\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(newTranslate);\n if (runCallbacks) {\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.emit('transitionStart');\n }\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onTranslateToWrapperTransitionEnd) {\n swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.onTranslateToWrapperTransitionEnd = null;\n delete swiper.onTranslateToWrapperTransitionEnd;\n if (runCallbacks) {\n swiper.emit('transitionEnd');\n }\n };\n }\n swiper.$wrapperEl[0].addEventListener(\n 'transitionend',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onTranslateToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\n\nexport default {\n setTransition,\n transitionStart,\n transitionEnd,\n};\n","export default function setTransition(duration, byController) {\n const swiper = this;\n\n if (!swiper.params.cssMode) {\n swiper.$wrapperEl.transition(duration);\n }\n\n swiper.emit('setTransition', duration, byController);\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionStart(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n if (params.cssMode) return;\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'Start' });\n}\n","import transitionEmit from './transitionEmit.js';\n\nexport default function transitionEnd(runCallbacks = true, direction) {\n const swiper = this;\n const { params } = swiper;\n swiper.animating = false;\n if (params.cssMode) return;\n swiper.setTransition(0);\n\n transitionEmit({ swiper, runCallbacks, direction, step: 'End' });\n}\n","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\n\nexport default {\n slideTo,\n slideToLoop,\n slideNext,\n slidePrev,\n slideReset,\n slideToClosest,\n slideToClickedSlide,\n};\n","import { animateCSSModeScroll } from '../../shared/utils.js';\n\nexport default function slideTo(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n initial,\n) {\n if (typeof index !== 'number' && typeof index !== 'string') {\n throw new Error(\n `The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`,\n );\n }\n\n if (typeof index === 'string') {\n /**\n * The `index` argument converted from `string` to `number`.\n * @type {number}\n */\n const indexAsNumber = parseInt(index, 10);\n\n /**\n * Determines whether the `index` argument is a valid `number`\n * after being converted from the `string` type.\n * @type {boolean}\n */\n const isValidNumber = isFinite(indexAsNumber);\n\n if (!isValidNumber) {\n throw new Error(\n `The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`,\n );\n }\n\n // Knowing that the converted `index` is a valid number,\n // we can update the original argument's value.\n index = indexAsNumber;\n }\n\n const swiper = this;\n let slideIndex = index;\n if (slideIndex < 0) slideIndex = 0;\n\n const {\n params,\n snapGrid,\n slidesGrid,\n previousIndex,\n activeIndex,\n rtlTranslate: rtl,\n wrapperEl,\n enabled,\n } = swiper;\n\n if (\n (swiper.animating && params.preventInteractionOnTransition) ||\n (!enabled && !internal && !initial)\n ) {\n return false;\n }\n\n const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n const translate = -snapGrid[snapIndex];\n\n // Update progress\n swiper.updateProgress(translate);\n\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (let i = 0; i < slidesGrid.length; i += 1) {\n const normalizedTranslate = -Math.floor(translate * 100);\n const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2\n ) {\n slideIndex = i;\n } else if (\n normalizedTranslate >= normalizedGrid &&\n normalizedTranslate < normalizedGridNext\n ) {\n slideIndex = i + 1;\n }\n } else if (normalizedTranslate >= normalizedGrid) {\n slideIndex = i;\n }\n }\n }\n // Directions locks\n if (swiper.initialized && slideIndex !== activeIndex) {\n if (\n !swiper.allowSlideNext &&\n translate < swiper.translate &&\n translate < swiper.minTranslate()\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n translate > swiper.translate &&\n translate > swiper.maxTranslate()\n ) {\n if ((activeIndex || 0) !== slideIndex) return false;\n }\n }\n\n let direction;\n if (slideIndex > activeIndex) direction = 'next';\n else if (slideIndex < activeIndex) direction = 'prev';\n else direction = 'reset';\n\n // Update Index\n if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n if (direction !== 'reset') {\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n }\n return false;\n }\n if (params.cssMode) {\n const isH = swiper.isHorizontal();\n const t = rtl ? translate : -translate;\n if (speed === 0) {\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n if (isVirtual) {\n swiper.wrapperEl.style.scrollSnapType = 'none';\n swiper._immediateVirtual = true;\n }\n wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n if (isVirtual) {\n requestAnimationFrame(() => {\n swiper.wrapperEl.style.scrollSnapType = '';\n swiper._swiperImmediateVirtual = false;\n });\n }\n } else {\n if (!swiper.support.smoothScroll) {\n animateCSSModeScroll({ swiper, targetPosition: t, side: isH ? 'left' : 'top' });\n return true;\n }\n wrapperEl.scrollTo({\n [isH ? 'left' : 'top']: t,\n behavior: 'smooth',\n });\n }\n return true;\n }\n\n if (speed === 0) {\n swiper.setTransition(0);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onSlideToWrapperTransitionEnd) {\n swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) return;\n if (e.target !== this) return;\n swiper.$wrapperEl[0].removeEventListener(\n 'transitionend',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.$wrapperEl[0].removeEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n swiper.onSlideToWrapperTransitionEnd = null;\n delete swiper.onSlideToWrapperTransitionEnd;\n swiper.transitionEnd(runCallbacks, direction);\n };\n }\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].addEventListener(\n 'webkitTransitionEnd',\n swiper.onSlideToWrapperTransitionEnd,\n );\n }\n }\n\n return true;\n}\n","export default function slideToLoop(\n index = 0,\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n) {\n const swiper = this;\n let newIndex = index;\n if (swiper.params.loop) {\n newIndex += swiper.loopedSlides;\n }\n\n return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { animating, enabled, params } = swiper;\n if (!enabled) return swiper;\n let perGroup = params.slidesPerGroup;\n if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n }\n const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n const { params, animating, snapGrid, slidesGrid, rtlTranslate, enabled } = swiper;\n if (!enabled) return swiper;\n\n if (params.loop) {\n if (animating && params.loopPreventsSlide) return false;\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n function normalize(val) {\n if (val < 0) return -Math.floor(Math.abs(val));\n return Math.floor(val);\n }\n const normalizedTranslate = normalize(translate);\n const normalizedSnapGrid = snapGrid.map((val) => normalize(val));\n\n let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n if (typeof prevSnap === 'undefined' && params.cssMode) {\n let prevSnapIndex;\n snapGrid.forEach((snap, snapIndex) => {\n if (normalizedTranslate >= snap) {\n // prevSnap = snap;\n prevSnapIndex = snapIndex;\n }\n });\n if (typeof prevSnapIndex !== 'undefined') {\n prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n }\n }\n let prevIndex = 0;\n if (typeof prevSnap !== 'undefined') {\n prevIndex = slidesGrid.indexOf(prevSnap);\n if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n if (\n params.slidesPerView === 'auto' &&\n params.slidesPerGroup === 1 &&\n params.slidesPerGroupAuto\n ) {\n prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n prevIndex = Math.max(prevIndex, 0);\n }\n }\n return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n const swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(\n speed = this.params.speed,\n runCallbacks = true,\n internal,\n threshold = 0.5,\n) {\n const swiper = this;\n let index = swiper.activeIndex;\n const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n\n const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n if (translate >= swiper.snapGrid[snapIndex]) {\n // The current translate is on or after the current snap index, so the choice\n // is between the current index and the one after it.\n const currentSnap = swiper.snapGrid[snapIndex];\n const nextSnap = swiper.snapGrid[snapIndex + 1];\n if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n index += swiper.params.slidesPerGroup;\n }\n } else {\n // The current translate is before the current snap index, so the choice\n // is between the current index and the one before it.\n const prevSnap = swiper.snapGrid[snapIndex - 1];\n const currentSnap = swiper.snapGrid[snapIndex];\n if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n index -= swiper.params.slidesPerGroup;\n }\n }\n index = Math.max(index, 0);\n index = Math.min(index, swiper.slidesGrid.length - 1);\n\n return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function slideToClickedSlide() {\n const swiper = this;\n const { params, $wrapperEl } = swiper;\n\n const slidesPerView =\n params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n let slideToIndex = swiper.clickedIndex;\n let realIndex;\n if (params.loop) {\n if (swiper.animating) return;\n realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (\n slideToIndex < swiper.loopedSlides - slidesPerView / 2 ||\n slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2\n ) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children(\n `.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`,\n )\n .eq(0)\n .index();\n\n nextTick(() => {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n}\n","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\n\nexport default {\n loopCreate,\n loopFix,\n loopDestroy,\n};\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loopCreate() {\n const swiper = this;\n const document = getDocument();\n const { params, $wrapperEl } = swiper;\n // Remove duplicated slides\n const $selector = $($wrapperEl.children()[0].parentNode);\n $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n\n let slides = $selector.children(`.${params.slideClass}`);\n\n if (params.loopFillGroupWithBlank) {\n const blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n if (blankSlidesNum !== params.slidesPerGroup) {\n for (let i = 0; i < blankSlidesNum; i += 1) {\n const blankNode = $(document.createElement('div')).addClass(\n `${params.slideClass} ${params.slideBlankClass}`,\n );\n $selector.append(blankNode);\n }\n slides = $selector.children(`.${params.slideClass}`);\n }\n }\n\n if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n\n swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n swiper.loopedSlides += params.loopAdditionalSlides;\n if (swiper.loopedSlides > slides.length) {\n swiper.loopedSlides = slides.length;\n }\n\n const prependSlides = [];\n const appendSlides = [];\n slides.each((el, index) => {\n const slide = $(el);\n if (index < swiper.loopedSlides) {\n appendSlides.push(el);\n }\n if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n prependSlides.push(el);\n }\n slide.attr('data-swiper-slide-index', index);\n });\n for (let i = 0; i < appendSlides.length; i += 1) {\n $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n}\n","export default function loopFix() {\n const swiper = this;\n\n swiper.emit('beforeLoopFix');\n\n const {\n activeIndex,\n slides,\n loopedSlides,\n allowSlidePrev,\n allowSlideNext,\n snapGrid,\n rtlTranslate: rtl,\n } = swiper;\n let newIndex;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n\n const snapTranslate = -snapGrid[activeIndex];\n const diff = snapTranslate - swiper.getTranslate();\n\n // Fix For Negative Oversliding\n if (activeIndex < loopedSlides) {\n newIndex = slides.length - loopedSlides * 3 + activeIndex;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n } else if (activeIndex >= slides.length - loopedSlides) {\n // Fix For Positive Oversliding\n newIndex = -slides.length + activeIndex + loopedSlides;\n newIndex += loopedSlides;\n const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n swiper.emit('loopFix');\n}\n","export default function loopDestroy() {\n const swiper = this;\n const { $wrapperEl, params, slides } = swiper;\n $wrapperEl\n .children(\n `.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`,\n )\n .remove();\n slides.removeAttr('data-swiper-slide-index');\n}\n","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\n\nexport default {\n setGrabCursor,\n unsetGrabCursor,\n};\n","export default function setGrabCursor(moving) {\n const swiper = this;\n if (\n swiper.support.touch ||\n !swiper.params.simulateTouch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n )\n return;\n const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n el.style.cursor = 'move';\n el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n}\n","export default function unsetGrabCursor() {\n const swiper = this;\n if (\n swiper.support.touch ||\n (swiper.params.watchOverflow && swiper.isLocked) ||\n swiper.params.cssMode\n ) {\n return;\n }\n swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}\n","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\n\nexport default { setBreakpoint, getBreakpoint };\n","import { getWindow } from 'ssr-window';\n\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n if (!breakpoints || (base === 'container' && !containerEl)) return undefined;\n let breakpoint = false;\n\n const window = getWindow();\n const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n\n const points = Object.keys(breakpoints).map((point) => {\n if (typeof point === 'string' && point.indexOf('@') === 0) {\n const minRatio = parseFloat(point.substr(1));\n const value = currentHeight * minRatio;\n return { value, point };\n }\n return { value: point, point };\n });\n\n points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n for (let i = 0; i < points.length; i += 1) {\n const { point, value } = points[i];\n if (base === 'window') {\n if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n breakpoint = point;\n }\n } else if (value <= containerEl.clientWidth) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n}\n","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\n\nexport default { addClasses, removeClasses };\n","function prepareClasses(entries, prefix) {\n const resultClasses = [];\n entries.forEach((item) => {\n if (typeof item === 'object') {\n Object.keys(item).forEach((classNames) => {\n if (item[classNames]) {\n resultClasses.push(prefix + classNames);\n }\n });\n } else if (typeof item === 'string') {\n resultClasses.push(prefix + item);\n }\n });\n return resultClasses;\n}\n\nexport default function addClasses() {\n const swiper = this;\n const { classNames, params, rtl, $el, device, support } = swiper;\n // prettier-ignore\n const suffixes = prepareClasses([\n 'initialized',\n params.direction,\n { 'pointer-events': !support.touch },\n { 'free-mode': swiper.params.freeMode && params.freeMode.enabled },\n { 'autoheight': params.autoHeight },\n { 'rtl': rtl },\n { 'grid': params.grid && params.grid.rows > 1 },\n { 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' },\n { 'android': device.android },\n { 'ios': device.ios },\n { 'css-mode': params.cssMode },\n { 'centered': params.cssMode && params.centeredSlides },\n ], params.containerModifierClass);\n classNames.push(...suffixes);\n $el.addClass([...classNames].join(' '));\n swiper.emitContainerClasses();\n}\n","export default function removeClasses() {\n const swiper = this;\n const { $el, classNames } = swiper;\n\n $el.removeClass(classNames.join(' '));\n swiper.emitContainerClasses();\n}\n","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\n\nexport default {\n loadImage,\n preloadImages,\n};\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n const window = getWindow();\n let image;\n function onReady() {\n if (callback) callback();\n }\n const isPicture = $(imageEl).parent('picture')[0];\n\n if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n if (src) {\n image = new window.Image();\n image.onload = onReady;\n image.onerror = onReady;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcset) {\n image.srcset = srcset;\n }\n if (src) {\n image.src = src;\n }\n } else {\n onReady();\n }\n } else {\n // image already loaded...\n onReady();\n }\n}\n","export default function preloadImages() {\n const swiper = this;\n swiper.imagesToLoad = swiper.$el.find('img');\n function onReady() {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n if (swiper.params.updateOnImagesReady) swiper.update();\n swiper.emit('imagesReady');\n }\n }\n for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n const imageEl = swiper.imagesToLoad[i];\n swiper.loadImage(\n imageEl,\n imageEl.currentSrc || imageEl.getAttribute('src'),\n imageEl.srcset || imageEl.getAttribute('srcset'),\n imageEl.sizes || imageEl.getAttribute('sizes'),\n true,\n onReady,\n );\n }\n}\n","import { getDocument } from 'ssr-window';\n\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n const document = getDocument();\n if (swiper.params.createElements) {\n Object.keys(checkProps).forEach((key) => {\n if (!params[key] && params.auto === true) {\n let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n if (!element) {\n element = document.createElement('div');\n element.className = checkProps[key];\n swiper.$el.append(element);\n }\n params[key] = element;\n originalParams[key] = element;\n }\n });\n }\n return params;\n}\n","export default function classesToSelector(classes = '') {\n return `.${classes\n .trim()\n .replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n .replace(/ /g, '.')}`;\n}\n","export default function appendSlide(slides) {\n const swiper = this;\n const { $wrapperEl, params } = swiper;\n if (params.loop) {\n swiper.loopDestroy();\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n } else {\n $wrapperEl.append(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n}\n","export default function prependSlide(slides) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n if (params.loop) {\n swiper.loopDestroy();\n }\n let newActiveIndex = activeIndex + 1;\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.prepend(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n $wrapperEl.prepend(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n}\n","export default function addSlide(index, slides) {\n const swiper = this;\n const { $wrapperEl, params, activeIndex } = swiper;\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n const baseLength = swiper.slides.length;\n if (index <= 0) {\n swiper.prependSlide(slides);\n return;\n }\n if (index >= baseLength) {\n swiper.appendSlide(slides);\n return;\n }\n let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n const slidesBuffer = [];\n for (let i = baseLength - 1; i >= index; i -= 1) {\n const currentSlide = swiper.slides.eq(i);\n currentSlide.remove();\n slidesBuffer.unshift(currentSlide);\n }\n\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) $wrapperEl.append(slides[i]);\n }\n newActiveIndex =\n activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n } else {\n $wrapperEl.append(slides);\n }\n\n for (let i = 0; i < slidesBuffer.length; i += 1) {\n $wrapperEl.append(slidesBuffer[i]);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeSlide(slidesIndexes) {\n const swiper = this;\n const { params, $wrapperEl, activeIndex } = swiper;\n\n let activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n }\n let newActiveIndex = activeIndexBuffer;\n let indexToRemove;\n\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (let i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n\n if (!params.observer) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n}\n","export default function removeAllSlides() {\n const swiper = this;\n\n const slidesIndexes = [];\n for (let i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n}\n","export default function effectInit(params) {\n const { effect, swiper, on, setTranslate, setTransition, overwriteParams, perspective } = params;\n\n on('beforeInit', () => {\n if (swiper.params.effect !== effect) return;\n swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n if (perspective && perspective()) {\n swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n }\n\n const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n\n Object.assign(swiper.params, overwriteParamsResult);\n Object.assign(swiper.originalParams, overwriteParamsResult);\n });\n on('setTranslate', () => {\n if (swiper.params.effect !== effect) return;\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n if (swiper.params.effect !== effect) return;\n setTransition(duration);\n });\n}\n","export default function effectTarget(effectParams, $slideEl) {\n if (effectParams.transformEl) {\n return $slideEl.find(effectParams.transformEl).css({\n 'backface-visibility': 'hidden',\n '-webkit-backface-visibility': 'hidden',\n });\n }\n return $slideEl;\n}\n","export default function effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides }) {\n const { slides, activeIndex, $wrapperEl } = swiper;\n if (swiper.params.virtualTranslate && duration !== 0) {\n let eventTriggered = false;\n let $transitionEndTarget;\n if (allSlides) {\n $transitionEndTarget = transformEl ? slides.find(transformEl) : slides;\n } else {\n $transitionEndTarget = transformEl\n ? slides.eq(activeIndex).find(transformEl)\n : slides.eq(activeIndex);\n }\n $transitionEndTarget.transitionEnd(() => {\n if (eventTriggered) return;\n if (!swiper || swiper.destroyed) return;\n eventTriggered = true;\n swiper.animating = false;\n const triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (let i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n}\n","import $ from './dom.js';\n\nexport default function createShadow(params, $slideEl, side) {\n const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`;\n const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl;\n let $shadowEl = $shadowContainer.children(`.${shadowClass}`);\n\n if (!$shadowEl.length) {\n $shadowEl = $(`
`);\n $shadowContainer.append($shadowEl);\n }\n return $shadowEl;\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Resize({ swiper, on, emit }) {\n const window = getWindow();\n let observer = null;\n\n const resizeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('beforeResize');\n emit('resize');\n };\n\n const createObserver = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n observer = new ResizeObserver((entries) => {\n const { width, height } = swiper;\n let newWidth = width;\n let newHeight = height;\n entries.forEach(({ contentBoxSize, contentRect, target }) => {\n if (target && target !== swiper.el) return;\n newWidth = contentRect\n ? contentRect.width\n : (contentBoxSize[0] || contentBoxSize).inlineSize;\n newHeight = contentRect\n ? contentRect.height\n : (contentBoxSize[0] || contentBoxSize).blockSize;\n });\n if (newWidth !== width || newHeight !== height) {\n resizeHandler();\n }\n });\n observer.observe(swiper.el);\n };\n\n const removeObserver = () => {\n if (observer && observer.unobserve && swiper.el) {\n observer.unobserve(swiper.el);\n observer = null;\n }\n };\n\n const orientationChangeHandler = () => {\n if (!swiper || swiper.destroyed || !swiper.initialized) return;\n emit('orientationchange');\n };\n\n on('init', () => {\n if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n createObserver();\n return;\n }\n window.addEventListener('resize', resizeHandler);\n window.addEventListener('orientationchange', orientationChangeHandler);\n });\n\n on('destroy', () => {\n removeObserver();\n window.removeEventListener('resize', resizeHandler);\n window.removeEventListener('orientationchange', orientationChangeHandler);\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function Observer({ swiper, extendParams, on, emit }) {\n const observers = [];\n const window = getWindow();\n const attach = (target, options = {}) => {\n const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n const observer = new ObserverFunc((mutations) => {\n // The observerUpdate event should only be triggered\n // once despite the number of mutations. Additional\n // triggers are redundant and are very costly\n if (mutations.length === 1) {\n emit('observerUpdate', mutations[0]);\n return;\n }\n const observerUpdate = function observerUpdate() {\n emit('observerUpdate', mutations[0]);\n };\n\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(observerUpdate);\n } else {\n window.setTimeout(observerUpdate, 0);\n }\n });\n\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n });\n\n observers.push(observer);\n };\n const init = () => {\n if (!swiper.params.observer) return;\n if (swiper.params.observeParents) {\n const containerParents = swiper.$el.parents();\n for (let i = 0; i < containerParents.length; i += 1) {\n attach(containerParents[i]);\n }\n }\n // Observe container\n attach(swiper.$el[0], {\n childList: swiper.params.observeSlideChildren,\n });\n\n // Observe wrapper\n attach(swiper.$wrapperEl[0], { attributes: false });\n };\n const destroy = () => {\n observers.forEach((observer) => {\n observer.disconnect();\n });\n observers.splice(0, observers.length);\n };\n\n extendParams({\n observer: false,\n observeParents: false,\n observeSlideChildren: false,\n });\n on('init', init);\n on('destroy', destroy);\n}\n","// Swiper Class\nimport Swiper from './core/core.js';\n\n//IMPORT_MODULES\n\nconst modules = [\n //INSTALL_MODULES\n];\n\nSwiper.use(modules);\n\n//EXPORT\n","import $ from '../../shared/dom.js';\nimport { setCSSProperty } from '../../shared/utils.js';\n\nexport default function Virtual({ swiper, extendParams, on }) {\n extendParams({\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n renderExternalUpdate: true,\n addSlidesBefore: 0,\n addSlidesAfter: 0,\n },\n });\n\n let cssModeTimeout;\n\n swiper.virtual = {\n cache: {},\n from: undefined,\n to: undefined,\n slides: [],\n offset: 0,\n slidesGrid: [],\n };\n\n function renderSlide(slide, index) {\n const params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n const $slideEl = params.renderSlide\n ? $(params.renderSlide.call(swiper, slide, index))\n : $(\n `
${slide}
`,\n );\n if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);\n if (params.cache) swiper.virtual.cache[index] = $slideEl;\n return $slideEl;\n }\n\n function update(force) {\n const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params;\n const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual;\n const {\n from: previousFrom,\n to: previousTo,\n slides,\n slidesGrid: previousSlidesGrid,\n offset: previousOffset,\n } = swiper.virtual;\n if (!swiper.params.cssMode) {\n swiper.updateActiveIndex();\n }\n\n const activeIndex = swiper.activeIndex || 0;\n\n let offsetProp;\n if (swiper.rtlTranslate) offsetProp = 'right';\n else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n\n let slidesAfter;\n let slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;\n slidesBefore = slidesPerGroup + addSlidesBefore;\n }\n const from = Math.max((activeIndex || 0) - slidesBefore, 0);\n const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n Object.assign(swiper.virtual, {\n from,\n to,\n offset,\n slidesGrid: swiper.slidesGrid,\n });\n\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.lazy && swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n }\n\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.css(offsetProp, `${offset}px`);\n }\n swiper.updateProgress();\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset,\n from,\n to,\n slides: (function getSlides() {\n const slidesToRender = [];\n for (let i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n })(),\n });\n if (swiper.params.virtual.renderExternalUpdate) {\n onRendered();\n }\n return;\n }\n const prependIndexes = [];\n const appendIndexes = [];\n if (force) {\n swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove();\n } else {\n for (let i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n swiper.$wrapperEl\n .find(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${i}\"]`)\n .remove();\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n if (i >= from && i <= to) {\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(i);\n } else {\n if (i > previousTo) appendIndexes.push(i);\n if (i < previousFrom) prependIndexes.push(i);\n }\n }\n }\n appendIndexes.forEach((index) => {\n swiper.$wrapperEl.append(renderSlide(slides[index], index));\n });\n prependIndexes\n .sort((a, b) => b - a)\n .forEach((index) => {\n swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n });\n swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`);\n onRendered();\n }\n\n function appendSlide(slides) {\n if (typeof slides === 'object' && 'length' in slides) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.push(slides[i]);\n }\n } else {\n swiper.virtual.slides.push(slides);\n }\n update(true);\n }\n function prependSlide(slides) {\n const activeIndex = swiper.activeIndex;\n let newActiveIndex = activeIndex + 1;\n let numberOfNewSlides = 1;\n\n if (Array.isArray(slides)) {\n for (let i = 0; i < slides.length; i += 1) {\n if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n }\n newActiveIndex = activeIndex + slides.length;\n numberOfNewSlides = slides.length;\n } else {\n swiper.virtual.slides.unshift(slides);\n }\n if (swiper.params.virtual.cache) {\n const cache = swiper.virtual.cache;\n const newCache = {};\n Object.keys(cache).forEach((cachedIndex) => {\n const $cachedEl = cache[cachedIndex];\n const cachedElIndex = $cachedEl.attr('data-swiper-slide-index');\n if (cachedElIndex) {\n $cachedEl.attr(\n 'data-swiper-slide-index',\n parseInt(cachedElIndex, 10) + numberOfNewSlides,\n );\n }\n newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;\n });\n swiper.virtual.cache = newCache;\n }\n update(true);\n swiper.slideTo(newActiveIndex, 0);\n }\n function removeSlide(slidesIndexes) {\n if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n let activeIndex = swiper.activeIndex;\n if (Array.isArray(slidesIndexes)) {\n for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n swiper.virtual.slides.splice(slidesIndexes[i], 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes[i]];\n }\n if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n } else {\n swiper.virtual.slides.splice(slidesIndexes, 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes];\n }\n if (slidesIndexes < activeIndex) activeIndex -= 1;\n activeIndex = Math.max(activeIndex, 0);\n }\n update(true);\n swiper.slideTo(activeIndex, 0);\n }\n function removeAllSlides() {\n swiper.virtual.slides = [];\n if (swiper.params.virtual.cache) {\n swiper.virtual.cache = {};\n }\n update(true);\n swiper.slideTo(0, 0);\n }\n\n on('beforeInit', () => {\n if (!swiper.params.virtual.enabled) return;\n swiper.virtual.slides = swiper.params.virtual.slides;\n swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n\n if (!swiper.params.initialSlide) {\n update();\n }\n });\n on('setTranslate', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode && !swiper._immediateVirtual) {\n clearTimeout(cssModeTimeout);\n cssModeTimeout = setTimeout(() => {\n update();\n }, 100);\n } else {\n update();\n }\n });\n on('init update resize', () => {\n if (!swiper.params.virtual.enabled) return;\n if (swiper.params.cssMode) {\n setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n }\n });\n\n Object.assign(swiper.virtual, {\n appendSlide,\n prependSlide,\n removeSlide,\n removeAllSlides,\n update,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Keyboard({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n const window = getWindow();\n swiper.keyboard = {\n enabled: false,\n };\n extendParams({\n keyboard: {\n enabled: false,\n onlyInViewport: true,\n pageUpDown: true,\n },\n });\n\n function handle(event) {\n if (!swiper.enabled) return;\n\n const { rtlTranslate: rtl } = swiper;\n let e = event;\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n const kc = e.keyCode || e.charCode;\n const pageUpDown = swiper.params.keyboard.pageUpDown;\n const isPageUp = pageUpDown && kc === 33;\n const isPageDown = pageUpDown && kc === 34;\n const isArrowLeft = kc === 37;\n const isArrowRight = kc === 39;\n const isArrowUp = kc === 38;\n const isArrowDown = kc === 40;\n // Directions locks\n if (\n !swiper.allowSlideNext &&\n ((swiper.isHorizontal() && isArrowRight) ||\n (swiper.isVertical() && isArrowDown) ||\n isPageDown)\n ) {\n return false;\n }\n if (\n !swiper.allowSlidePrev &&\n ((swiper.isHorizontal() && isArrowLeft) || (swiper.isVertical() && isArrowUp) || isPageUp)\n ) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (\n document.activeElement &&\n document.activeElement.nodeName &&\n (document.activeElement.nodeName.toLowerCase() === 'input' ||\n document.activeElement.nodeName.toLowerCase() === 'textarea')\n ) {\n return undefined;\n }\n if (\n swiper.params.keyboard.onlyInViewport &&\n (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)\n ) {\n let inView = false;\n // Check that swiper should be inside of visible area of window\n if (\n swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 &&\n swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0\n ) {\n return undefined;\n }\n\n const $el = swiper.$el;\n const swiperWidth = $el[0].clientWidth;\n const swiperHeight = $el[0].clientHeight;\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const swiperOffset = swiper.$el.offset();\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiperWidth, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiperHeight],\n [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n if (!inView) return undefined;\n }\n if (swiper.isHorizontal()) {\n if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (((isPageDown || isArrowRight) && !rtl) || ((isPageUp || isArrowLeft) && rtl))\n swiper.slideNext();\n if (((isPageUp || isArrowLeft) && !rtl) || ((isPageDown || isArrowRight) && rtl))\n swiper.slidePrev();\n } else {\n if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n }\n if (isPageDown || isArrowDown) swiper.slideNext();\n if (isPageUp || isArrowUp) swiper.slidePrev();\n }\n emit('keyPress', kc);\n return undefined;\n }\n function enable() {\n if (swiper.keyboard.enabled) return;\n $(document).on('keydown', handle);\n swiper.keyboard.enabled = true;\n }\n function disable() {\n if (!swiper.keyboard.enabled) return;\n $(document).off('keydown', handle);\n swiper.keyboard.enabled = false;\n }\n\n on('init', () => {\n if (swiper.params.keyboard.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n if (swiper.keyboard.enabled) {\n disable();\n }\n });\n\n Object.assign(swiper.keyboard, {\n enable,\n disable,\n });\n}\n","/* eslint-disable consistent-return */\nimport { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now, nextTick } from '../../shared/utils.js';\n\nexport default function Mousewheel({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n\n extendParams({\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarget: 'container',\n thresholdDelta: null,\n thresholdTime: null,\n },\n });\n\n swiper.mousewheel = {\n enabled: false,\n };\n\n let timeout;\n let lastScrollTime = now();\n let lastEventBeforeSnap;\n const recentWheelEvents = [];\n\n function normalize(e) {\n // Reasonable defaults\n const PIXEL_STEP = 10;\n const LINE_HEIGHT = 40;\n const PAGE_HEIGHT = 800;\n\n let sX = 0;\n let sY = 0; // spinX, spinY\n let pX = 0;\n let pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n\n if (e.shiftKey && !pX) {\n // if user scrolls with shift he wants horizontal scroll\n pX = pY;\n pY = 0;\n }\n\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) {\n // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else {\n // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = pX < 1 ? -1 : 1;\n }\n if (pY && !sY) {\n sY = pY < 1 ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY,\n };\n }\n function handleMouseEnter() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = true;\n }\n function handleMouseLeave() {\n if (!swiper.enabled) return;\n swiper.mouseEntered = false;\n }\n function animateSlider(newEvent) {\n if (\n swiper.params.mousewheel.thresholdDelta &&\n newEvent.delta < swiper.params.mousewheel.thresholdDelta\n ) {\n // Prevent if delta of wheel scroll delta is below configured threshold\n return false;\n }\n\n if (\n swiper.params.mousewheel.thresholdTime &&\n now() - lastScrollTime < swiper.params.mousewheel.thresholdTime\n ) {\n // Prevent if time between scrolls is below configured threshold\n return false;\n }\n\n // If the movement is NOT big enough and\n // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n // Don't go any further (avoid insignificant scroll movement).\n if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n // Return false as a default\n return true;\n }\n // If user is scrolling towards the end:\n // If the slider hasn't hit the latest slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to next slide and\n // emit a scroll event.\n // Else (the user is scrolling towards the beginning) and\n // if the slider hasn't hit the first slide or\n // if the slider is a loop and\n // if the slider isn't moving right now:\n // Go to prev slide and\n // emit a scroll event.\n if (newEvent.direction < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n emit('scroll', newEvent.raw);\n }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n emit('scroll', newEvent.raw);\n }\n // If you got here is because an animation has been triggered so store the current time\n lastScrollTime = new window.Date().getTime();\n // Return false as a default\n return false;\n }\n function releaseScroll(newEvent) {\n const params = swiper.params.mousewheel;\n if (newEvent.direction < 0) {\n if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n // Return true to animate scroll on edges\n return true;\n }\n return false;\n }\n function handle(event) {\n let e = event;\n let disableParentSwiper = true;\n if (!swiper.enabled) return;\n const params = swiper.params.mousewheel;\n\n if (swiper.params.cssMode) {\n e.preventDefault();\n }\n\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges)\n return true;\n\n if (e.originalEvent) e = e.originalEvent; // jquery fix\n let delta = 0;\n const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n const data = normalize(e);\n\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;\n else return true;\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;\n else return true;\n } else {\n delta =\n Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n\n if (delta === 0) return true;\n\n if (params.invert) delta = -delta;\n\n // Get the scroll positions\n let positions = swiper.getTranslate() + delta * params.sensitivity;\n\n if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n // When loop is true:\n // the disableParentSwiper will be true.\n // When loop is false:\n // if the scroll positions is not on edge,\n // then the disableParentSwiper will be true.\n // if the scroll on edge positions,\n // then the disableParentSwiper will be false.\n disableParentSwiper = swiper.params.loop\n ? true\n : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n\n if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n\n if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n // Register the new event in a variable which stores the relevant data\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n raw: event,\n };\n\n // Keep the most recent events\n if (recentWheelEvents.length >= 2) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n recentWheelEvents.push(newEvent);\n\n // If there is at least one previous recorded event:\n // If direction has changed or\n // if the scroll is quicker than the previous one:\n // Animate the slider.\n // Else (this is the first time the wheel is moved):\n // Animate the slider.\n if (prevEvent) {\n if (\n newEvent.direction !== prevEvent.direction ||\n newEvent.delta > prevEvent.delta ||\n newEvent.time > prevEvent.time + 150\n ) {\n animateSlider(newEvent);\n }\n } else {\n animateSlider(newEvent);\n }\n\n // If it's time to release the scroll:\n // Return now so you don't hit the preventDefault.\n if (releaseScroll(newEvent)) {\n return true;\n }\n } else {\n // Freemode or scrollContainer:\n\n // If we recently snapped after a momentum scroll, then ignore wheel events\n // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n // or if it's a new scroll (larger delta or inverse sign as last event before\n // an end-of-momentum snap).\n const newEvent = {\n time: now(),\n delta: Math.abs(delta),\n direction: Math.sign(delta),\n };\n const ignoreWheelEvents =\n lastEventBeforeSnap &&\n newEvent.time < lastEventBeforeSnap.time + 500 &&\n newEvent.delta <= lastEventBeforeSnap.delta &&\n newEvent.direction === lastEventBeforeSnap.direction;\n if (!ignoreWheelEvents) {\n lastEventBeforeSnap = undefined;\n\n if (swiper.params.loop) {\n swiper.loopFix();\n }\n let position = swiper.getTranslate() + delta * params.sensitivity;\n const wasBeginning = swiper.isBeginning;\n const wasEnd = swiper.isEnd;\n\n if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n swiper.updateSlidesClasses();\n }\n\n if (swiper.params.freeMode.sticky) {\n // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n // the end of a momentum scroll by storing recent (N=15?) wheel events.\n // 1. do all N events have decreasing or same (absolute value) delta?\n // 2. did all N events arrive in the last M (M=500?) msecs?\n // 3. does the earliest event have an (absolute value) delta that's\n // at least P (P=1?) larger than the most recent event's delta?\n // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n // Snap immediately and ignore remaining wheel events in this scroll.\n // See comment above for \"remaining wheel events in this scroll\" determination.\n // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n clearTimeout(timeout);\n timeout = undefined;\n if (recentWheelEvents.length >= 15) {\n recentWheelEvents.shift(); // only store the last N events\n }\n const prevEvent = recentWheelEvents.length\n ? recentWheelEvents[recentWheelEvents.length - 1]\n : undefined;\n const firstEvent = recentWheelEvents[0];\n recentWheelEvents.push(newEvent);\n if (\n prevEvent &&\n (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)\n ) {\n // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n recentWheelEvents.splice(0);\n } else if (\n recentWheelEvents.length >= 15 &&\n newEvent.time - firstEvent.time < 500 &&\n firstEvent.delta - newEvent.delta >= 1 &&\n newEvent.delta <= 6\n ) {\n // We're at the end of the deceleration of a momentum scroll, so there's no need\n // to wait for more events. Snap ASAP on the next tick.\n // Also, because there's some remaining momentum we'll bias the snap in the\n // direction of the ongoing scroll because it's better UX for the scroll to snap\n // in the same direction as the scroll instead of reversing to snap. Therefore,\n // if it's already scrolled more than 20% in the current direction, keep going.\n const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n timeout = nextTick(() => {\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 0); // no delay; move on next tick\n }\n if (!timeout) {\n // if we get here, then we haven't detected the end of a momentum scroll, so\n // we'll consider a scroll \"complete\" when there haven't been any wheel events\n // for 500ms.\n timeout = nextTick(() => {\n const snapToThreshold = 0.5;\n lastEventBeforeSnap = newEvent;\n recentWheelEvents.splice(0);\n swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n }, 500);\n }\n }\n\n // Emit event\n if (!ignoreWheelEvents) emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction)\n swiper.autoplay.stop();\n // Return page scroll on edge positions\n if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;\n }\n }\n\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n return false;\n }\n\n function events(method) {\n let target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarget !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarget);\n }\n target[method]('mouseenter', handleMouseEnter);\n target[method]('mouseleave', handleMouseLeave);\n target[method]('wheel', handle);\n }\n\n function enable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.removeEventListener('wheel', handle);\n return true;\n }\n if (swiper.mousewheel.enabled) return false;\n events('on');\n swiper.mousewheel.enabled = true;\n return true;\n }\n function disable() {\n if (swiper.params.cssMode) {\n swiper.wrapperEl.addEventListener(event, handle);\n return true;\n }\n if (!swiper.mousewheel.enabled) return false;\n events('off');\n swiper.mousewheel.enabled = false;\n return true;\n }\n\n on('init', () => {\n if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n disable();\n }\n if (swiper.params.mousewheel.enabled) enable();\n });\n on('destroy', () => {\n if (swiper.params.cssMode) {\n enable();\n }\n if (swiper.mousewheel.enabled) disable();\n });\n\n Object.assign(swiper.mousewheel, {\n enable,\n disable,\n });\n}\n","import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Navigation({ swiper, extendParams, on, emit }) {\n extendParams({\n navigation: {\n nextEl: null,\n prevEl: null,\n\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n lockClass: 'swiper-button-lock',\n },\n });\n\n swiper.navigation = {\n nextEl: null,\n $nextEl: null,\n prevEl: null,\n $prevEl: null,\n };\n\n function getEl(el) {\n let $el;\n if (el) {\n $el = $(el);\n if (\n swiper.params.uniqueNavElements &&\n typeof el === 'string' &&\n $el.length > 1 &&\n swiper.$el.find(el).length === 1\n ) {\n $el = swiper.$el.find(el);\n }\n }\n return $el;\n }\n\n function toggleEl($el, disabled) {\n const params = swiper.params.navigation;\n if ($el && $el.length > 0) {\n $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n }\n function update() {\n // Update Navigation Buttons\n if (swiper.params.loop) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n toggleEl($prevEl, swiper.isBeginning);\n toggleEl($nextEl, swiper.isEnd);\n }\n function onPrevClick(e) {\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop) return;\n swiper.slidePrev();\n }\n function onNextClick(e) {\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop) return;\n swiper.slideNext();\n }\n function init() {\n const params = swiper.params.navigation;\n\n swiper.params.navigation = createElementIfNotDefined(\n swiper,\n swiper.originalParams.navigation,\n swiper.params.navigation,\n {\n nextEl: 'swiper-button-next',\n prevEl: 'swiper-button-prev',\n },\n );\n if (!(params.nextEl || params.prevEl)) return;\n\n const $nextEl = getEl(params.nextEl);\n const $prevEl = getEl(params.prevEl);\n\n if ($nextEl && $nextEl.length > 0) {\n $nextEl.on('click', onNextClick);\n }\n if ($prevEl && $prevEl.length > 0) {\n $prevEl.on('click', onPrevClick);\n }\n\n Object.assign(swiper.navigation, {\n $nextEl,\n nextEl: $nextEl && $nextEl[0],\n $prevEl,\n prevEl: $prevEl && $prevEl[0],\n });\n\n if (!swiper.enabled) {\n if ($nextEl) $nextEl.addClass(params.lockClass);\n if ($prevEl) $prevEl.addClass(params.lockClass);\n }\n }\n function destroy() {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl && $nextEl.length) {\n $nextEl.off('click', onNextClick);\n $nextEl.removeClass(swiper.params.navigation.disabledClass);\n }\n if ($prevEl && $prevEl.length) {\n $prevEl.off('click', onPrevClick);\n $prevEl.removeClass(swiper.params.navigation.disabledClass);\n }\n }\n\n on('init', () => {\n init();\n update();\n });\n on('toEdge fromEdge lock unlock', () => {\n update();\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $nextEl, $prevEl } = swiper.navigation;\n if ($nextEl) {\n $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n if ($prevEl) {\n $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n }\n });\n on('click', (_s, e) => {\n const { $nextEl, $prevEl } = swiper.navigation;\n const targetEl = e.target;\n if (\n swiper.params.navigation.hideOnClick &&\n !$(targetEl).is($prevEl) &&\n !$(targetEl).is($nextEl)\n ) {\n if (\n swiper.pagination &&\n swiper.params.pagination &&\n swiper.params.pagination.clickable &&\n (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))\n )\n return;\n let isHidden;\n if ($nextEl) {\n isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n } else if ($prevEl) {\n isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n }\n if (isHidden === true) {\n emit('navigationShow');\n } else {\n emit('navigationHide');\n }\n if ($nextEl) {\n $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n if ($prevEl) {\n $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n }\n });\n\n Object.assign(swiper.navigation, {\n update,\n init,\n destroy,\n });\n}\n","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Pagination({ swiper, extendParams, on, emit }) {\n const pfx = 'swiper-pagination';\n extendParams({\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n progressbarOpposite: false,\n type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n dynamicMainBullets: 1,\n formatFractionCurrent: (number) => number,\n formatFractionTotal: (number) => number,\n bulletClass: `${pfx}-bullet`,\n bulletActiveClass: `${pfx}-bullet-active`,\n modifierClass: `${pfx}-`,\n currentClass: `${pfx}-current`,\n totalClass: `${pfx}-total`,\n hiddenClass: `${pfx}-hidden`,\n progressbarFillClass: `${pfx}-progressbar-fill`,\n progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n clickableClass: `${pfx}-clickable`,\n lockClass: `${pfx}-lock`,\n horizontalClass: `${pfx}-horizontal`,\n verticalClass: `${pfx}-vertical`,\n },\n });\n\n swiper.pagination = {\n el: null,\n $el: null,\n bullets: [],\n };\n\n let bulletSize;\n let dynamicBulletIndex = 0;\n\n function isPaginationDisabled() {\n return (\n !swiper.params.pagination.el ||\n !swiper.pagination.el ||\n !swiper.pagination.$el ||\n swiper.pagination.$el.length === 0\n );\n }\n\n function setSideBullets($bulletEl, position) {\n const { bulletActiveClass } = swiper.params.pagination;\n $bulletEl[position]()\n .addClass(`${bulletActiveClass}-${position}`)\n [position]()\n .addClass(`${bulletActiveClass}-${position}-${position}`);\n }\n\n function update() {\n // Render || Update Pagination bullets/items\n const rtl = swiper.rtl;\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n const $el = swiper.pagination.$el;\n // Current/Total\n let current;\n const total = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (swiper.params.loop) {\n current = Math.ceil(\n (swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup,\n );\n if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n current -= slidesLength - swiper.loopedSlides * 2;\n }\n if (current > total - 1) current -= total;\n if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n } else {\n current = swiper.activeIndex || 0;\n }\n // Types\n if (\n params.type === 'bullets' &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length > 0\n ) {\n const bullets = swiper.pagination.bullets;\n let firstIndex;\n let lastIndex;\n let midIndex;\n if (params.dynamicBullets) {\n bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n $el.css(\n swiper.isHorizontal() ? 'width' : 'height',\n `${bulletSize * (params.dynamicMainBullets + 4)}px`,\n );\n if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n dynamicBulletIndex += current - swiper.previousIndex;\n if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n dynamicBulletIndex = params.dynamicMainBullets - 1;\n } else if (dynamicBulletIndex < 0) {\n dynamicBulletIndex = 0;\n }\n }\n firstIndex = current - dynamicBulletIndex;\n lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n midIndex = (lastIndex + firstIndex) / 2;\n }\n bullets.removeClass(\n ['', '-next', '-next-next', '-prev', '-prev-prev', '-main']\n .map((suffix) => `${params.bulletActiveClass}${suffix}`)\n .join(' '),\n );\n if ($el.length > 1) {\n bullets.each((bullet) => {\n const $bullet = $(bullet);\n const bulletIndex = $bullet.index();\n if (bulletIndex === current) {\n $bullet.addClass(params.bulletActiveClass);\n }\n if (params.dynamicBullets) {\n if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n $bullet.addClass(`${params.bulletActiveClass}-main`);\n }\n if (bulletIndex === firstIndex) {\n setSideBullets($bullet, 'prev');\n }\n if (bulletIndex === lastIndex) {\n setSideBullets($bullet, 'next');\n }\n }\n });\n } else {\n const $bullet = bullets.eq(current);\n const bulletIndex = $bullet.index();\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n const $firstDisplayedBullet = bullets.eq(firstIndex);\n const $lastDisplayedBullet = bullets.eq(lastIndex);\n for (let i = firstIndex; i <= lastIndex; i += 1) {\n bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n }\n if (swiper.params.loop) {\n if (bulletIndex >= bullets.length - params.dynamicMainBullets) {\n for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n }\n bullets\n .eq(bullets.length - params.dynamicMainBullets - 1)\n .addClass(`${params.bulletActiveClass}-prev`);\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n } else {\n setSideBullets($firstDisplayedBullet, 'prev');\n setSideBullets($lastDisplayedBullet, 'next');\n }\n }\n }\n if (params.dynamicBullets) {\n const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n const bulletsOffset =\n (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n const offsetProp = rtl ? 'right' : 'left';\n bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n }\n }\n if (params.type === 'fraction') {\n $el\n .find(classesToSelector(params.currentClass))\n .text(params.formatFractionCurrent(current + 1));\n $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n }\n if (params.type === 'progressbar') {\n let progressbarDirection;\n if (params.progressbarOpposite) {\n progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n } else {\n progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n }\n const scale = (current + 1) / total;\n let scaleX = 1;\n let scaleY = 1;\n if (progressbarDirection === 'horizontal') {\n scaleX = scale;\n } else {\n scaleY = scale;\n }\n $el\n .find(classesToSelector(params.progressbarFillClass))\n .transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`)\n .transition(swiper.params.speed);\n }\n if (params.type === 'custom' && params.renderCustom) {\n $el.html(params.renderCustom(swiper, current + 1, total));\n emit('paginationRender', $el[0]);\n } else {\n emit('paginationUpdate', $el[0]);\n }\n if (swiper.params.watchOverflow && swiper.enabled) {\n $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n }\n function render() {\n // Render Container\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const slidesLength =\n swiper.virtual && swiper.params.virtual.enabled\n ? swiper.virtual.slides.length\n : swiper.slides.length;\n\n const $el = swiper.pagination.$el;\n let paginationHTML = '';\n if (params.type === 'bullets') {\n let numberOfBullets = swiper.params.loop\n ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup)\n : swiper.snapGrid.length;\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.loop &&\n numberOfBullets > slidesLength\n ) {\n numberOfBullets = slidesLength;\n }\n for (let i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\">`;\n }\n }\n $el.html(paginationHTML);\n\n swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML =\n `` +\n ' / ' +\n ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = ``;\n }\n $el.html(paginationHTML);\n }\n if (params.type !== 'custom') {\n emit('paginationRender', swiper.pagination.$el[0]);\n }\n }\n function init() {\n swiper.params.pagination = createElementIfNotDefined(\n swiper,\n swiper.originalParams.pagination,\n swiper.params.pagination,\n { el: 'swiper-pagination' },\n );\n const params = swiper.params.pagination;\n if (!params.el) return;\n\n let $el = $(params.el);\n if ($el.length === 0) return;\n\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n $el = swiper.$el.find(params.el);\n // check if it belongs to another nested Swiper\n if ($el.length > 1) {\n $el = $el.filter((el) => {\n if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n return true;\n });\n }\n }\n\n if (params.type === 'bullets' && params.clickable) {\n $el.addClass(params.clickableClass);\n }\n\n $el.addClass(params.modifierClass + params.type);\n $el.addClass(params.modifierClass + swiper.params.direction);\n\n if (params.type === 'bullets' && params.dynamicBullets) {\n $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n dynamicBulletIndex = 0;\n if (params.dynamicMainBullets < 1) {\n params.dynamicMainBullets = 1;\n }\n }\n if (params.type === 'progressbar' && params.progressbarOpposite) {\n $el.addClass(params.progressbarOppositeClass);\n }\n\n if (params.clickable) {\n $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n e.preventDefault();\n let index = $(this).index() * swiper.params.slidesPerGroup;\n if (swiper.params.loop) index += swiper.loopedSlides;\n swiper.slideTo(index);\n });\n }\n\n Object.assign(swiper.pagination, {\n $el,\n el: $el[0],\n });\n\n if (!swiper.enabled) {\n $el.addClass(params.lockClass);\n }\n }\n function destroy() {\n const params = swiper.params.pagination;\n if (isPaginationDisabled()) return;\n const $el = swiper.pagination.$el;\n\n $el.removeClass(params.hiddenClass);\n $el.removeClass(params.modifierClass + params.type);\n $el.removeClass(params.modifierClass + swiper.params.direction);\n if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass)\n swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n if (params.clickable) {\n $el.off('click', classesToSelector(params.bulletClass));\n }\n }\n\n on('init', () => {\n init();\n render();\n update();\n });\n on('activeIndexChange', () => {\n if (swiper.params.loop) {\n update();\n } else if (typeof swiper.snapIndex === 'undefined') {\n update();\n }\n });\n on('snapIndexChange', () => {\n if (!swiper.params.loop) {\n update();\n }\n });\n on('slidesLengthChange', () => {\n if (swiper.params.loop) {\n render();\n update();\n }\n });\n on('snapGridLengthChange', () => {\n if (!swiper.params.loop) {\n render();\n update();\n }\n });\n on('destroy', () => {\n destroy();\n });\n on('enable disable', () => {\n const { $el } = swiper.pagination;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n }\n });\n on('lock unlock', () => {\n update();\n });\n on('click', (_s, e) => {\n const targetEl = e.target;\n const { $el } = swiper.pagination;\n if (\n swiper.params.pagination.el &&\n swiper.params.pagination.hideOnClick &&\n $el.length > 0 &&\n !$(targetEl).hasClass(swiper.params.pagination.bulletClass)\n ) {\n if (\n swiper.navigation &&\n ((swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) ||\n (swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl))\n )\n return;\n const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n if (isHidden === true) {\n emit('paginationShow');\n } else {\n emit('paginationHide');\n }\n $el.toggleClass(swiper.params.pagination.hiddenClass);\n }\n });\n\n Object.assign(swiper.pagination, {\n render,\n update,\n init,\n destroy,\n });\n}\n","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\n\nexport default function Scrollbar({ swiper, extendParams, on, emit }) {\n const document = getDocument();\n\n let isTouched = false;\n let timeout = null;\n let dragTimeout = null;\n let dragStartPos;\n let dragSize;\n let trackSize;\n let divider;\n\n extendParams({\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n lockClass: 'swiper-scrollbar-lock',\n dragClass: 'swiper-scrollbar-drag',\n },\n });\n\n swiper.scrollbar = {\n el: null,\n dragEl: null,\n $el: null,\n $dragEl: null,\n };\n\n function setTranslate() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n const { scrollbar, rtlTranslate: rtl, progress } = swiper;\n const { $dragEl, $el } = scrollbar;\n const params = swiper.params.scrollbar;\n\n let newSize = dragSize;\n let newPos = (trackSize - dragSize) * progress;\n if (rtl) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n $dragEl.transform(`translate3d(${newPos}px, 0, 0)`);\n $dragEl[0].style.width = `${newSize}px`;\n } else {\n $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n $dragEl[0].style.height = `${newSize}px`;\n }\n if (params.hide) {\n clearTimeout(timeout);\n $el[0].style.opacity = 1;\n timeout = setTimeout(() => {\n $el[0].style.opacity = 0;\n $el.transition(400);\n }, 1000);\n }\n }\n function setTransition(duration) {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n swiper.scrollbar.$dragEl.transition(duration);\n }\n function updateSize() {\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n\n const { scrollbar } = swiper;\n const { $dragEl, $el } = scrollbar;\n\n $dragEl[0].style.width = '';\n $dragEl[0].style.height = '';\n trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n divider =\n swiper.size /\n (swiper.virtualSize +\n swiper.params.slidesOffsetBefore -\n (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n\n if (swiper.isHorizontal()) {\n $dragEl[0].style.width = `${dragSize}px`;\n } else {\n $dragEl[0].style.height = `${dragSize}px`;\n }\n\n if (divider >= 1) {\n $el[0].style.display = 'none';\n } else {\n $el[0].style.display = '';\n }\n if (swiper.params.scrollbar.hide) {\n $el[0].style.opacity = 0;\n }\n\n if (swiper.params.watchOverflow && swiper.enabled) {\n scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](\n swiper.params.scrollbar.lockClass,\n );\n }\n }\n function getPointerPosition(e) {\n if (swiper.isHorizontal()) {\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientX\n : e.clientX;\n }\n return e.type === 'touchstart' || e.type === 'touchmove'\n ? e.targetTouches[0].clientY\n : e.clientY;\n }\n function setDragPosition(e) {\n const { scrollbar, rtlTranslate: rtl } = swiper;\n const { $el } = scrollbar;\n\n let positionRatio;\n positionRatio =\n (getPointerPosition(e) -\n $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] -\n (dragStartPos !== null ? dragStartPos : dragSize / 2)) /\n (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (rtl) {\n positionRatio = 1 - positionRatio;\n }\n\n const position =\n swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n function onDragStart(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n isTouched = true;\n dragStartPos =\n e.target === $dragEl[0] || e.target === $dragEl\n ? getPointerPosition(e) -\n e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top']\n : null;\n e.preventDefault();\n e.stopPropagation();\n\n $wrapperEl.transition(100);\n $dragEl.transition(100);\n setDragPosition(e);\n\n clearTimeout(dragTimeout);\n\n $el.transition(0);\n if (params.hide) {\n $el.css('opacity', 1);\n }\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', 'none');\n }\n emit('scrollbarDragStart', e);\n }\n function onDragMove(e) {\n const { scrollbar, $wrapperEl } = swiper;\n const { $el, $dragEl } = scrollbar;\n\n if (!isTouched) return;\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n setDragPosition(e);\n $wrapperEl.transition(0);\n $el.transition(0);\n $dragEl.transition(0);\n emit('scrollbarDragMove', e);\n }\n function onDragEnd(e) {\n const params = swiper.params.scrollbar;\n const { scrollbar, $wrapperEl } = swiper;\n const { $el } = scrollbar;\n\n if (!isTouched) return;\n isTouched = false;\n if (swiper.params.cssMode) {\n swiper.$wrapperEl.css('scroll-snap-type', '');\n $wrapperEl.transition('');\n }\n if (params.hide) {\n clearTimeout(dragTimeout);\n dragTimeout = nextTick(() => {\n $el.css('opacity', 0);\n $el.transition(400);\n }, 1000);\n }\n emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideToClosest();\n }\n }\n\n function events(method) {\n const { scrollbar, touchEventsTouch, touchEventsDesktop, params, support } = swiper;\n const $el = scrollbar.$el;\n const target = $el[0];\n const activeListener =\n support.passiveListener && params.passiveListeners\n ? { passive: false, capture: false }\n : false;\n const passiveListener =\n support.passiveListener && params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n if (!target) return;\n const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n if (!support.touch) {\n target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n } else {\n target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n }\n }\n\n function enableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('on');\n }\n function disableDraggable() {\n if (!swiper.params.scrollbar.el) return;\n events('off');\n }\n function init() {\n const { scrollbar, $el: $swiperEl } = swiper;\n swiper.params.scrollbar = createElementIfNotDefined(\n swiper,\n swiper.originalParams.scrollbar,\n swiper.params.scrollbar,\n { el: 'swiper-scrollbar' },\n );\n const params = swiper.params.scrollbar;\n if (!params.el) return;\n\n let $el = $(params.el);\n if (\n swiper.params.uniqueNavElements &&\n typeof params.el === 'string' &&\n $el.length > 1 &&\n $swiperEl.find(params.el).length === 1\n ) {\n $el = $swiperEl.find(params.el);\n }\n\n let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n if ($dragEl.length === 0) {\n $dragEl = $(`
`);\n $el.append($dragEl);\n }\n\n Object.assign(scrollbar, {\n $el,\n el: $el[0],\n $dragEl,\n dragEl: $dragEl[0],\n });\n\n if (params.draggable) {\n enableDraggable();\n }\n\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n }\n function destroy() {\n disableDraggable();\n }\n\n on('init', () => {\n init();\n updateSize();\n setTranslate();\n });\n on('update resize observerUpdate lock unlock', () => {\n updateSize();\n });\n on('setTranslate', () => {\n setTranslate();\n });\n on('setTransition', (_s, duration) => {\n setTransition(duration);\n });\n on('enable disable', () => {\n const { $el } = swiper.scrollbar;\n if ($el) {\n $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n }\n });\n on('destroy', () => {\n destroy();\n });\n\n Object.assign(swiper.scrollbar, {\n updateSize,\n setTranslate,\n init,\n destroy,\n });\n}\n","import $ from '../../shared/dom.js';\n\nexport default function Parallax({ swiper, extendParams, on }) {\n extendParams({\n parallax: {\n enabled: false,\n },\n });\n\n const setTransform = (el, progress) => {\n const { rtl } = swiper;\n\n const $el = $(el);\n const rtlFactor = rtl ? -1 : 1;\n\n const p = $el.attr('data-swiper-parallax') || '0';\n let x = $el.attr('data-swiper-parallax-x');\n let y = $el.attr('data-swiper-parallax-y');\n const scale = $el.attr('data-swiper-parallax-scale');\n const opacity = $el.attr('data-swiper-parallax-opacity');\n\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n\n if (x.indexOf('%') >= 0) {\n x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n } else {\n x = `${x * progress * rtlFactor}px`;\n }\n if (y.indexOf('%') >= 0) {\n y = `${parseInt(y, 10) * progress}%`;\n } else {\n y = `${y * progress}px`;\n }\n\n if (typeof opacity !== 'undefined' && opacity !== null) {\n const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n $el[0].style.opacity = currentOpacity;\n }\n if (typeof scale === 'undefined' || scale === null) {\n $el.transform(`translate3d(${x}, ${y}, 0px)`);\n } else {\n const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`);\n }\n };\n\n const setTranslate = () => {\n const { $el, slides, progress, snapGrid } = swiper;\n $el\n .children(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, progress);\n });\n slides.each((slideEl, slideIndex) => {\n let slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n $(slideEl)\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((el) => {\n setTransform(el, slideProgress);\n });\n });\n };\n\n const setTransition = (duration = swiper.params.speed) => {\n const { $el } = swiper;\n $el\n .find(\n '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]',\n )\n .each((parallaxEl) => {\n const $parallaxEl = $(parallaxEl);\n let parallaxDuration =\n parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) parallaxDuration = 0;\n $parallaxEl.transition(parallaxDuration);\n });\n };\n\n on('beforeInit', () => {\n if (!swiper.params.parallax.enabled) return;\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n });\n on('init', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTranslate', () => {\n if (!swiper.params.parallax.enabled) return;\n setTranslate();\n });\n on('setTransition', (_swiper, duration) => {\n if (!swiper.params.parallax.enabled) return;\n setTransition(duration);\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { getTranslate } from '../../shared/utils.js';\n\nexport default function Zoom({ swiper, extendParams, on, emit }) {\n const window = getWindow();\n extendParams({\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed',\n },\n });\n\n swiper.zoom = {\n enabled: false,\n };\n\n let currentScale = 1;\n let isScaling = false;\n let gesturesEnabled;\n let fakeGestureTouched;\n let fakeGestureMoved;\n const gesture = {\n $slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n $imageEl: undefined,\n $imageWrapEl: undefined,\n maxRatio: 3,\n };\n const image = {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {},\n };\n const velocity = {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined,\n };\n\n let scale = 1;\n Object.defineProperty(swiper.zoom, 'scale', {\n get() {\n return scale;\n },\n set(value) {\n if (scale !== value) {\n const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined;\n const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined;\n emit('zoomChange', value, imageEl, slideEl);\n }\n scale = value;\n },\n });\n\n function getDistanceBetweenTouches(e) {\n if (e.targetTouches.length < 2) return 1;\n const x1 = e.targetTouches[0].pageX;\n const y1 = e.targetTouches[0].pageY;\n const x2 = e.targetTouches[1].pageX;\n const y2 = e.targetTouches[1].pageY;\n const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n return distance;\n }\n\n // Events\n function onGestureStart(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n if (!support.gestures) {\n if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureTouched = true;\n gesture.scaleStart = getDistanceBetweenTouches(e);\n }\n if (!gesture.$slideEl || !gesture.$slideEl.length) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (gesture.$imageWrapEl.length === 0) {\n gesture.$imageEl = undefined;\n return;\n }\n }\n if (gesture.$imageEl) {\n gesture.$imageEl.transition(0);\n }\n isScaling = true;\n }\n function onGestureChange(e) {\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n return;\n }\n fakeGestureMoved = true;\n gesture.scaleMove = getDistanceBetweenTouches(e);\n }\n\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) {\n if (e.type === 'gesturechange') onGestureStart(e);\n return;\n }\n if (support.gestures) {\n zoom.scale = e.scale * currentScale;\n } else {\n zoom.scale = (gesture.scaleMove / gesture.scaleStart) * currentScale;\n }\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n }\n gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function onGestureEnd(e) {\n const device = swiper.device;\n const support = swiper.support;\n const params = swiper.params.zoom;\n const zoom = swiper.zoom;\n if (!support.gestures) {\n if (!fakeGestureTouched || !fakeGestureMoved) {\n return;\n }\n if (\n e.type !== 'touchend' ||\n (e.type === 'touchend' && e.changedTouches.length < 2 && !device.android)\n ) {\n return;\n }\n fakeGestureTouched = false;\n fakeGestureMoved = false;\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.$imageEl\n .transition(swiper.params.speed)\n .transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n currentScale = zoom.scale;\n isScaling = false;\n if (zoom.scale === 1) gesture.$slideEl = undefined;\n }\n function onTouchStart(e) {\n const device = swiper.device;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (image.isTouched) return;\n if (device.android && e.cancelable) e.preventDefault();\n image.isTouched = true;\n image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n }\n function onTouchMove(e) {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n swiper.allowClick = false;\n if (!image.isTouched || !gesture.$slideEl) return;\n\n if (!image.isMoved) {\n image.width = gesture.$imageEl[0].offsetWidth;\n image.height = gesture.$imageEl[0].offsetHeight;\n image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n gesture.$imageWrapEl.transition(0);\n }\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;\n\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n\n image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n if (!image.isMoved && !isScaling) {\n if (\n swiper.isHorizontal() &&\n ((Math.floor(image.minX) === Math.floor(image.startX) &&\n image.touchesCurrent.x < image.touchesStart.x) ||\n (Math.floor(image.maxX) === Math.floor(image.startX) &&\n image.touchesCurrent.x > image.touchesStart.x))\n ) {\n image.isTouched = false;\n return;\n }\n if (\n !swiper.isHorizontal() &&\n ((Math.floor(image.minY) === Math.floor(image.startY) &&\n image.touchesCurrent.y < image.touchesStart.y) ||\n (Math.floor(image.maxY) === Math.floor(image.startY) &&\n image.touchesCurrent.y > image.touchesStart.y))\n ) {\n image.isTouched = false;\n return;\n }\n }\n if (e.cancelable) {\n e.preventDefault();\n }\n e.stopPropagation();\n\n image.isMoved = true;\n image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;\n image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;\n\n if (image.currentX < image.minX) {\n image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n }\n if (image.currentX > image.maxX) {\n image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n }\n\n if (image.currentY < image.minY) {\n image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n }\n if (image.currentY > image.maxY) {\n image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n }\n\n // Velocity\n if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n if (!velocity.prevTime) velocity.prevTime = Date.now();\n velocity.x =\n (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y =\n (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n\n gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTouchEnd() {\n const zoom = swiper.zoom;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n let momentumDurationX = 300;\n let momentumDurationY = 300;\n const momentumDistanceX = velocity.x * momentumDurationX;\n const newPositionX = image.currentX + momentumDistanceX;\n const momentumDistanceY = velocity.y * momentumDurationY;\n const newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0)\n momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n if (velocity.y !== 0)\n momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n\n // Define if we need image drag\n const scaledWidth = image.width * zoom.scale;\n const scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n image.maxX = -image.minX;\n image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n gesture.$imageWrapEl\n .transition(momentumDuration)\n .transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n }\n function onTransitionEnd() {\n const zoom = swiper.zoom;\n if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n if (gesture.$imageEl) {\n gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n }\n if (gesture.$imageWrapEl) {\n gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n }\n\n zoom.scale = 1;\n currentScale = 1;\n\n gesture.$slideEl = undefined;\n gesture.$imageEl = undefined;\n gesture.$imageWrapEl = undefined;\n }\n }\n\n function zoomIn(e) {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (e && e.target) {\n gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`);\n }\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n }\n\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = 'hidden';\n swiper.wrapperEl.style.touchAction = 'none';\n }\n\n gesture.$slideEl.addClass(`${params.zoomedSlideClass}`);\n\n let touchX;\n let touchY;\n let offsetX;\n let offsetY;\n let diffX;\n let diffY;\n let translateX;\n let translateY;\n let imageWidth;\n let imageHeight;\n let scaledWidth;\n let scaledHeight;\n let translateMinX;\n let translateMinY;\n let translateMaxX;\n let translateMaxY;\n let slideWidth;\n let slideHeight;\n\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n\n zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (e) {\n slideWidth = gesture.$slideEl[0].offsetWidth;\n slideHeight = gesture.$slideEl[0].offsetHeight;\n offsetX = gesture.$slideEl.offset().left + window.scrollX;\n offsetY = gesture.$slideEl.offset().top + window.scrollY;\n diffX = offsetX + slideWidth / 2 - touchX;\n diffY = offsetY + slideHeight / 2 - touchY;\n\n imageWidth = gesture.$imageEl[0].offsetWidth;\n imageHeight = gesture.$imageEl[0].offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n\n translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n gesture.$imageWrapEl\n .transition(300)\n .transform(`translate3d(${translateX}px, ${translateY}px,0)`);\n gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n }\n function zoomOut() {\n const zoom = swiper.zoom;\n const params = swiper.params.zoom;\n\n if (!gesture.$slideEl) {\n if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n } else {\n gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n }\n gesture.$imageEl = gesture.$slideEl\n .find(`.${params.containerClass}`)\n .eq(0)\n .find('img, svg, canvas, picture, .swiper-zoom-target');\n gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n }\n if (\n !gesture.$imageEl ||\n gesture.$imageEl.length === 0 ||\n !gesture.$imageWrapEl ||\n gesture.$imageWrapEl.length === 0\n )\n return;\n if (swiper.params.cssMode) {\n swiper.wrapperEl.style.overflow = '';\n swiper.wrapperEl.style.touchAction = '';\n }\n zoom.scale = 1;\n currentScale = 1;\n gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`);\n gesture.$slideEl = undefined;\n }\n\n // Toggle Zoom\n function zoomToggle(e) {\n const zoom = swiper.zoom;\n\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoomOut();\n } else {\n // Zoom In\n zoomIn(e);\n }\n }\n\n function getListeners() {\n const support = swiper.support;\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n const activeListenerWithCapture = support.passiveListener\n ? { passive: false, capture: true }\n : true;\n return { passiveListener, activeListenerWithCapture };\n }\n\n function getSlideSelector() {\n return `.${swiper.params.slideClass}`;\n }\n\n function toggleGestures(method) {\n const { passiveListener } = getListeners();\n const slideSelector = getSlideSelector();\n swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener);\n swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener);\n swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener);\n }\n function enableGestures() {\n if (gesturesEnabled) return;\n gesturesEnabled = true;\n toggleGestures('on');\n }\n function disableGestures() {\n if (!gesturesEnabled) return;\n gesturesEnabled = false;\n toggleGestures('off');\n }\n\n // Attach/Detach Events\n function enable() {\n const zoom = swiper.zoom;\n if (zoom.enabled) return;\n zoom.enabled = true;\n const support = swiper.support;\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.on(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.on(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.on(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n function disable() {\n const zoom = swiper.zoom;\n if (!zoom.enabled) return;\n const support = swiper.support;\n zoom.enabled = false;\n\n const { passiveListener, activeListenerWithCapture } = getListeners();\n const slideSelector = getSlideSelector();\n\n // Scale image\n if (support.gestures) {\n swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.off(\n swiper.touchEvents.start,\n slideSelector,\n onGestureStart,\n passiveListener,\n );\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n slideSelector,\n onGestureChange,\n activeListenerWithCapture,\n );\n swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n if (swiper.touchEvents.cancel) {\n swiper.$wrapperEl.off(\n swiper.touchEvents.cancel,\n slideSelector,\n onGestureEnd,\n passiveListener,\n );\n }\n }\n\n // Move image\n swiper.$wrapperEl.off(\n swiper.touchEvents.move,\n `.${swiper.params.zoom.containerClass}`,\n onTouchMove,\n activeListenerWithCapture,\n );\n }\n\n on('init', () => {\n if (swiper.params.zoom.enabled) {\n enable();\n }\n });\n on('destroy', () => {\n disable();\n });\n on('touchStart', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchStart(e);\n });\n on('touchEnd', (_s, e) => {\n if (!swiper.zoom.enabled) return;\n onTouchEnd(e);\n });\n on('doubleTap', (_s, e) => {\n if (\n !swiper.animating &&\n swiper.params.zoom.enabled &&\n swiper.zoom.enabled &&\n swiper.params.zoom.toggle\n ) {\n zoomToggle(e);\n }\n });\n on('transitionEnd', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n onTransitionEnd();\n }\n });\n on('slideChange', () => {\n if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n onTransitionEnd();\n }\n });\n\n Object.assign(swiper.zoom, {\n enable,\n disable,\n in: zoomIn,\n out: zoomOut,\n toggle: zoomToggle,\n });\n}\n","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function Lazy({ swiper, extendParams, on, emit }) {\n extendParams({\n lazy: {\n checkInView: false,\n enabled: false,\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n scrollingElement: '',\n\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n },\n });\n\n swiper.lazy = {};\n\n let scrollHandlerAttached = false;\n let initialImageLoaded = false;\n\n function loadInSlide(index, loadInDuplicate = true) {\n const params = swiper.params.lazy;\n if (typeof index === 'undefined') return;\n if (swiper.slides.length === 0) return;\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n const $slideEl = isVirtual\n ? swiper.$wrapperEl.children(\n `.${swiper.params.slideClass}[data-swiper-slide-index=\"${index}\"]`,\n )\n : swiper.slides.eq(index);\n\n const $images = $slideEl.find(\n `.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`,\n );\n if (\n $slideEl.hasClass(params.elementClass) &&\n !$slideEl.hasClass(params.loadedClass) &&\n !$slideEl.hasClass(params.loadingClass)\n ) {\n $images.push($slideEl[0]);\n }\n if ($images.length === 0) return;\n\n $images.each((imageEl) => {\n const $imageEl = $(imageEl);\n $imageEl.addClass(params.loadingClass);\n\n const background = $imageEl.attr('data-background');\n const src = $imageEl.attr('data-src');\n const srcset = $imageEl.attr('data-srcset');\n const sizes = $imageEl.attr('data-sizes');\n const $pictureEl = $imageEl.parent('picture');\n\n swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => {\n if (\n typeof swiper === 'undefined' ||\n swiper === null ||\n !swiper ||\n (swiper && !swiper.params) ||\n swiper.destroyed\n )\n return;\n if (background) {\n $imageEl.css('background-image', `url(\"${background}\")`);\n $imageEl.removeAttr('data-background');\n } else {\n if (srcset) {\n $imageEl.attr('srcset', srcset);\n $imageEl.removeAttr('data-srcset');\n }\n if (sizes) {\n $imageEl.attr('sizes', sizes);\n $imageEl.removeAttr('data-sizes');\n }\n if ($pictureEl.length) {\n $pictureEl.children('source').each((sourceEl) => {\n const $source = $(sourceEl);\n\n if ($source.attr('data-srcset')) {\n $source.attr('srcset', $source.attr('data-srcset'));\n $source.removeAttr('data-srcset');\n }\n });\n }\n if (src) {\n $imageEl.attr('src', src);\n $imageEl.removeAttr('data-src');\n }\n }\n\n $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n $slideEl.find(`.${params.preloaderClass}`).remove();\n if (swiper.params.loop && loadInDuplicate) {\n const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n const originalSlide = swiper.$wrapperEl.children(\n `[data-swiper-slide-index=\"${slideOriginalIndex}\"]:not(.${swiper.params.slideDuplicateClass})`,\n );\n loadInSlide(originalSlide.index(), false);\n } else {\n const duplicatedSlide = swiper.$wrapperEl.children(\n `.${swiper.params.slideDuplicateClass}[data-swiper-slide-index=\"${slideOriginalIndex}\"]`,\n );\n loadInSlide(duplicatedSlide.index(), false);\n }\n }\n emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n });\n\n emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n });\n }\n\n function load() {\n const { $wrapperEl, params: swiperParams, slides, activeIndex } = swiper;\n const isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n const params = swiperParams.lazy;\n\n let slidesPerView = swiperParams.slidesPerView;\n if (slidesPerView === 'auto') {\n slidesPerView = 0;\n }\n\n function slideExist(index) {\n if (isVirtual) {\n if (\n $wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index=\"${index}\"]`)\n .length\n ) {\n return true;\n }\n } else if (slides[index]) return true;\n return false;\n }\n\n function slideIndex(slideEl) {\n if (isVirtual) {\n return $(slideEl).attr('data-swiper-slide-index');\n }\n return $(slideEl).index();\n }\n\n if (!initialImageLoaded) initialImageLoaded = true;\n if (swiper.params.watchSlidesProgress) {\n $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each((slideEl) => {\n const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n loadInSlide(index);\n });\n } else if (slidesPerView > 1) {\n for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n loadInSlide(activeIndex);\n }\n if (params.loadPrevNext) {\n if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n const amount = params.loadPrevNextAmount;\n const spv = slidesPerView;\n const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n // Next Slides\n for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n // Prev Slides\n for (let i = minIndex; i < activeIndex; i += 1) {\n if (slideExist(i)) loadInSlide(i);\n }\n } else {\n const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`);\n if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide));\n\n const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`);\n if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide));\n }\n }\n }\n function checkInViewOnLoad() {\n const window = getWindow();\n if (!swiper || swiper.destroyed) return;\n const $scrollElement = swiper.params.lazy.scrollingElement\n ? $(swiper.params.lazy.scrollingElement)\n : $(window);\n const isWindow = $scrollElement[0] === window;\n const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;\n const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;\n const swiperOffset = swiper.$el.offset();\n const { rtlTranslate: rtl } = swiper;\n\n let inView = false;\n\n if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n const swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiper.width, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiper.height],\n [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height],\n ];\n for (let i = 0; i < swiperCoord.length; i += 1) {\n const point = swiperCoord[i];\n if (\n point[0] >= 0 &&\n point[0] <= scrollElementWidth &&\n point[1] >= 0 &&\n point[1] <= scrollElementHeight\n ) {\n if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n inView = true;\n }\n }\n\n const passiveListener =\n swiper.touchEvents.start === 'touchstart' &&\n swiper.support.passiveListener &&\n swiper.params.passiveListeners\n ? { passive: true, capture: false }\n : false;\n\n if (inView) {\n load();\n $scrollElement.off('scroll', checkInViewOnLoad, passiveListener);\n } else if (!scrollHandlerAttached) {\n scrollHandlerAttached = true;\n $scrollElement.on('scroll', checkInViewOnLoad, passiveListener);\n }\n }\n\n on('beforeInit', () => {\n if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n swiper.params.preloadImages = false;\n }\n });\n on('init', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('scroll', () => {\n if (\n swiper.params.freeMode &&\n swiper.params.freeMode.enabled &&\n !swiper.params.freeMode.sticky\n ) {\n load();\n }\n });\n on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => {\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('transitionStart', () => {\n if (swiper.params.lazy.enabled) {\n if (\n swiper.params.lazy.loadOnTransitionStart ||\n (!swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded)\n ) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n }\n });\n on('transitionEnd', () => {\n if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n if (swiper.params.lazy.checkInView) {\n checkInViewOnLoad();\n } else {\n load();\n }\n }\n });\n on('slideChange', () => {\n const { lazy, cssMode, watchSlidesProgress, touchReleaseOnEdges, resistanceRatio } =\n swiper.params;\n if (\n lazy.enabled &&\n (cssMode || (watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0)))\n ) {\n load();\n }\n });\n\n Object.assign(swiper.lazy, {\n load,\n loadInSlide,\n });\n}\n","/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Controller({ swiper, extendParams, on }) {\n extendParams({\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide', // or 'container'\n },\n });\n\n swiper.controller = {\n control: undefined,\n };\n\n function LinearSpline(x, y) {\n const binarySearch = (function search() {\n let maxIndex;\n let minIndex;\n let guess;\n return (array, val) => {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = (maxIndex + minIndex) >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n })();\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n let i1;\n let i3;\n\n this.interpolate = function interpolate(x2) {\n if (!x2) return 0;\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (\n ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]\n );\n };\n return this;\n }\n // xxx: for now i will just save one spline function to to\n function getInterpolateFunction(c) {\n if (!swiper.controller.spline) {\n swiper.controller.spline = swiper.params.loop\n ? new LinearSpline(swiper.slidesGrid, c.slidesGrid)\n : new LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n }\n function setTranslate(_t, byController) {\n const controlled = swiper.controller.control;\n let multiplier;\n let controlledTranslate;\n const Swiper = swiper.constructor;\n function setControlledTranslate(c) {\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier =\n (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n }\n\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (let i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n }\n function setTransition(duration, byController) {\n const Swiper = swiper.constructor;\n const controlled = swiper.controller.control;\n let i;\n function setControlledTransition(c) {\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n if (c.params.autoHeight) {\n nextTick(() => {\n c.updateAutoHeight();\n });\n }\n c.$wrapperEl.transitionEnd(() => {\n if (!controlled) return;\n if (c.params.loop && swiper.params.controller.by === 'slide') {\n c.loopFix();\n }\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTransition(controlled);\n }\n }\n\n function removeSpline() {\n if (!swiper.controller.control) return;\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n }\n on('beforeInit', () => {\n swiper.controller.control = swiper.params.controller.control;\n });\n on('update', () => {\n removeSpline();\n });\n on('resize', () => {\n removeSpline();\n });\n on('observerUpdate', () => {\n removeSpline();\n });\n on('setTranslate', (_s, translate, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTranslate(translate, byController);\n });\n on('setTransition', (_s, duration, byController) => {\n if (!swiper.controller.control) return;\n swiper.controller.setTransition(duration, byController);\n });\n\n Object.assign(swiper.controller, {\n setTranslate,\n setTransition,\n });\n}\n","import classesToSelector from '../../shared/classes-to-selector.js';\nimport $ from '../../shared/dom.js';\n\nexport default function A11y({ swiper, extendParams, on }) {\n extendParams({\n a11y: {\n enabled: true,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n slideLabelMessage: '{{index}} / {{slidesLength}}',\n containerMessage: null,\n containerRoleDescriptionMessage: null,\n itemRoleDescriptionMessage: null,\n slideRole: 'group',\n },\n });\n\n let liveRegion = null;\n\n function notify(message) {\n const notification = liveRegion;\n if (notification.length === 0) return;\n notification.html('');\n notification.html(message);\n }\n\n function getRandomNumber(size = 16) {\n const randomChar = () => Math.round(16 * Math.random()).toString(16);\n return 'x'.repeat(size).replace(/x/g, randomChar);\n }\n function makeElFocusable($el) {\n $el.attr('tabIndex', '0');\n }\n function makeElNotFocusable($el) {\n $el.attr('tabIndex', '-1');\n }\n function addElRole($el, role) {\n $el.attr('role', role);\n }\n function addElRoleDescription($el, description) {\n $el.attr('aria-roledescription', description);\n }\n function addElControls($el, controls) {\n $el.attr('aria-controls', controls);\n }\n function addElLabel($el, label) {\n $el.attr('aria-label', label);\n }\n function addElId($el, id) {\n $el.attr('id', id);\n }\n function addElLive($el, live) {\n $el.attr('aria-live', live);\n }\n function disableEl($el) {\n $el.attr('aria-disabled', true);\n }\n function enableEl($el) {\n $el.attr('aria-disabled', false);\n }\n\n function onEnterOrSpaceKey(e) {\n if (e.keyCode !== 13 && e.keyCode !== 32) return;\n const params = swiper.params.a11y;\n const $targetEl = $(e.target);\n if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n notify(params.lastSlideMessage);\n } else {\n notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n notify(params.firstSlideMessage);\n } else {\n notify(params.prevSlideMessage);\n }\n }\n\n if (\n swiper.pagination &&\n $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))\n ) {\n $targetEl[0].click();\n }\n }\n\n function updateNavigation() {\n if (swiper.params.loop || !swiper.navigation) return;\n const { $nextEl, $prevEl } = swiper.navigation;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n disableEl($prevEl);\n makeElNotFocusable($prevEl);\n } else {\n enableEl($prevEl);\n makeElFocusable($prevEl);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n disableEl($nextEl);\n makeElNotFocusable($nextEl);\n } else {\n enableEl($nextEl);\n makeElFocusable($nextEl);\n }\n }\n }\n\n function hasPagination() {\n return (\n swiper.pagination &&\n swiper.params.pagination.clickable &&\n swiper.pagination.bullets &&\n swiper.pagination.bullets.length\n );\n }\n\n function updatePagination() {\n const params = swiper.params.a11y;\n if (hasPagination()) {\n swiper.pagination.bullets.each((bulletEl) => {\n const $bulletEl = $(bulletEl);\n makeElFocusable($bulletEl);\n if (!swiper.params.pagination.renderBullet) {\n addElRole($bulletEl, 'button');\n addElLabel(\n $bulletEl,\n params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1),\n );\n }\n });\n }\n }\n\n const initNavEl = ($el, wrapperId, message) => {\n makeElFocusable($el);\n if ($el[0].tagName !== 'BUTTON') {\n addElRole($el, 'button');\n $el.on('keydown', onEnterOrSpaceKey);\n }\n addElLabel($el, message);\n addElControls($el, wrapperId);\n };\n\n function init() {\n const params = swiper.params.a11y;\n\n swiper.$el.append(liveRegion);\n\n // Container\n const $containerEl = swiper.$el;\n if (params.containerRoleDescriptionMessage) {\n addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n }\n if (params.containerMessage) {\n addElLabel($containerEl, params.containerMessage);\n }\n\n // Wrapper\n const $wrapperEl = swiper.$wrapperEl;\n const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n addElId($wrapperEl, wrapperId);\n addElLive($wrapperEl, live);\n\n // Slide\n if (params.itemRoleDescriptionMessage) {\n addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);\n }\n addElRole($(swiper.slides), params.slideRole);\n\n const slidesLength = swiper.params.loop\n ? swiper.slides.filter((el) => !el.classList.contains(swiper.params.slideDuplicateClass))\n .length\n : swiper.slides.length;\n swiper.slides.each((slideEl, index) => {\n const $slideEl = $(slideEl);\n const slideIndex = swiper.params.loop\n ? parseInt($slideEl.attr('data-swiper-slide-index'), 10)\n : index;\n const ariaLabelMessage = params.slideLabelMessage\n .replace(/\\{\\{index\\}\\}/, slideIndex + 1)\n .replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n addElLabel($slideEl, ariaLabelMessage);\n });\n\n // Navigation\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n\n if ($nextEl && $nextEl.length) {\n initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n }\n if ($prevEl && $prevEl.length) {\n initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.on(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n function destroy() {\n if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n\n let $nextEl;\n let $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n $nextEl.off('keydown', onEnterOrSpaceKey);\n }\n if ($prevEl) {\n $prevEl.off('keydown', onEnterOrSpaceKey);\n }\n\n // Pagination\n if (hasPagination()) {\n swiper.pagination.$el.off(\n 'keydown',\n classesToSelector(swiper.params.pagination.bulletClass),\n onEnterOrSpaceKey,\n );\n }\n }\n\n on('beforeInit', () => {\n liveRegion = $(\n ``,\n );\n });\n\n on('afterInit', () => {\n if (!swiper.params.a11y.enabled) return;\n init();\n updateNavigation();\n });\n on('toEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('fromEdge', () => {\n if (!swiper.params.a11y.enabled) return;\n updateNavigation();\n });\n on('paginationUpdate', () => {\n if (!swiper.params.a11y.enabled) return;\n updatePagination();\n });\n on('destroy', () => {\n if (!swiper.params.a11y.enabled) return;\n destroy();\n });\n}\n","import { getWindow } from 'ssr-window';\n\nexport default function History({ swiper, extendParams, on }) {\n extendParams({\n history: {\n enabled: false,\n root: '',\n replaceState: false,\n key: 'slides',\n },\n });\n\n let initialized = false;\n let paths = {};\n\n const slugify = (text) => {\n return text\n .toString()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n };\n\n const getPathValues = (urlOverride) => {\n const window = getWindow();\n let location;\n if (urlOverride) {\n location = new URL(urlOverride);\n } else {\n location = window.location;\n }\n const pathArray = location.pathname\n .slice(1)\n .split('/')\n .filter((part) => part !== '');\n const total = pathArray.length;\n const key = pathArray[total - 2];\n const value = pathArray[total - 1];\n return { key, value };\n };\n const setHistory = (key, index) => {\n const window = getWindow();\n if (!initialized || !swiper.params.history.enabled) return;\n let location;\n if (swiper.params.url) {\n location = new URL(swiper.params.url);\n } else {\n location = window.location;\n }\n const slide = swiper.slides.eq(index);\n let value = slugify(slide.attr('data-history'));\n if (swiper.params.history.root.length > 0) {\n let root = swiper.params.history.root;\n if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n value = `${root}/${key}/${value}`;\n } else if (!location.pathname.includes(key)) {\n value = `${key}/${value}`;\n }\n const currentState = window.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n window.history.replaceState({ value }, null, value);\n } else {\n window.history.pushState({ value }, null, value);\n }\n };\n\n const scrollToSlide = (speed, value, runCallbacks) => {\n if (value) {\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHistory = slugify(slide.attr('data-history'));\n if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n };\n\n const setHistoryPopState = () => {\n paths = getPathValues(swiper.params.url);\n scrollToSlide(swiper.params.speed, swiper.paths.value, false);\n };\n\n const init = () => {\n const window = getWindow();\n if (!swiper.params.history) return;\n if (!window.history || !window.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n initialized = true;\n paths = getPathValues(swiper.params.url);\n if (!paths.key && !paths.value) return;\n scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n window.addEventListener('popstate', setHistoryPopState);\n }\n };\n const destroy = () => {\n const window = getWindow();\n if (!swiper.params.history.replaceState) {\n window.removeEventListener('popstate', setHistoryPopState);\n }\n };\n\n on('init', () => {\n if (swiper.params.history.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.history.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n });\n}\n","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\n\nexport default function HashNavigation({ swiper, extendParams, emit, on }) {\n let initialized = false;\n const document = getDocument();\n const window = getWindow();\n extendParams({\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n },\n });\n const onHashChange = () => {\n emit('hashChange');\n const newHash = document.location.hash.replace('#', '');\n const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n if (newHash !== activeSlideHash) {\n const newIndex = swiper.$wrapperEl\n .children(`.${swiper.params.slideClass}[data-hash=\"${newHash}\"]`)\n .index();\n if (typeof newIndex === 'undefined') return;\n swiper.slideTo(newIndex);\n }\n };\n const setHash = () => {\n if (!initialized || !swiper.params.hashNavigation.enabled) return;\n if (\n swiper.params.hashNavigation.replaceState &&\n window.history &&\n window.history.replaceState\n ) {\n window.history.replaceState(\n null,\n null,\n `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '',\n );\n emit('hashSet');\n } else {\n const slide = swiper.slides.eq(swiper.activeIndex);\n const hash = slide.attr('data-hash') || slide.attr('data-history');\n document.location.hash = hash || '';\n emit('hashSet');\n }\n };\n const init = () => {\n if (\n !swiper.params.hashNavigation.enabled ||\n (swiper.params.history && swiper.params.history.enabled)\n )\n return;\n initialized = true;\n const hash = document.location.hash.replace('#', '');\n if (hash) {\n const speed = 0;\n for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n const slide = swiper.slides.eq(i);\n const slideHash = slide.attr('data-hash') || slide.attr('data-history');\n if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n const index = slide.index();\n swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n }\n }\n }\n if (swiper.params.hashNavigation.watchState) {\n $(window).on('hashchange', onHashChange);\n }\n };\n const destroy = () => {\n if (swiper.params.hashNavigation.watchState) {\n $(window).off('hashchange', onHashChange);\n }\n };\n\n on('init', () => {\n if (swiper.params.hashNavigation.enabled) {\n init();\n }\n });\n on('destroy', () => {\n if (swiper.params.hashNavigation.enabled) {\n destroy();\n }\n });\n on('transitionEnd _freeModeNoMomentumRelease', () => {\n if (initialized) {\n setHash();\n }\n });\n on('slideChange', () => {\n if (initialized && swiper.params.cssMode) {\n setHash();\n }\n });\n}\n","/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\n\nexport default function Autoplay({ swiper, extendParams, on, emit }) {\n let timeout;\n\n swiper.autoplay = {\n running: false,\n paused: false,\n };\n\n extendParams({\n autoplay: {\n enabled: false,\n delay: 3000,\n waitForTransition: true,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n reverseDirection: false,\n pauseOnMouseEnter: false,\n },\n });\n\n function run() {\n const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n let delay = swiper.params.autoplay.delay;\n if ($activeSlideEl.attr('data-swiper-autoplay')) {\n delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n }\n clearTimeout(timeout);\n timeout = nextTick(() => {\n let autoplayResult;\n if (swiper.params.autoplay.reverseDirection) {\n if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isBeginning) {\n autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(\n swiper.slides.length - 1,\n swiper.params.speed,\n true,\n true,\n );\n emit('autoplay');\n } else {\n stop();\n }\n } else if (swiper.params.loop) {\n swiper.loopFix();\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.isEnd) {\n autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n emit('autoplay');\n } else {\n stop();\n }\n if (swiper.params.cssMode && swiper.autoplay.running) run();\n else if (autoplayResult === false) {\n run();\n }\n }, delay);\n }\n function start() {\n if (typeof timeout !== 'undefined') return false;\n if (swiper.autoplay.running) return false;\n swiper.autoplay.running = true;\n emit('autoplayStart');\n run();\n return true;\n }\n function stop() {\n if (!swiper.autoplay.running) return false;\n if (typeof timeout === 'undefined') return false;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n swiper.autoplay.running = false;\n emit('autoplayStop');\n return true;\n }\n function pause(speed) {\n if (!swiper.autoplay.running) return;\n if (swiper.autoplay.paused) return;\n if (timeout) clearTimeout(timeout);\n swiper.autoplay.paused = true;\n if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n swiper.autoplay.paused = false;\n run();\n } else {\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n });\n }\n }\n function onVisibilityChange() {\n const document = getDocument();\n if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n pause();\n }\n if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n run();\n swiper.autoplay.paused = false;\n }\n }\n function onTransitionEnd(e) {\n if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n if (e.target !== swiper.$wrapperEl[0]) return;\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n swiper.autoplay.paused = false;\n if (!swiper.autoplay.running) {\n stop();\n } else {\n run();\n }\n }\n function onMouseEnter() {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n });\n }\n function onMouseLeave() {\n if (swiper.params.autoplay.disableOnInteraction) {\n return;\n }\n swiper.autoplay.paused = false;\n run();\n }\n function attachMouseEvents() {\n if (swiper.params.autoplay.pauseOnMouseEnter) {\n swiper.$el.on('mouseenter', onMouseEnter);\n swiper.$el.on('mouseleave', onMouseLeave);\n }\n }\n function detachMouseEvents() {\n swiper.$el.off('mouseenter', onMouseEnter);\n swiper.$el.off('mouseleave', onMouseLeave);\n }\n\n on('init', () => {\n if (swiper.params.autoplay.enabled) {\n start();\n const document = getDocument();\n document.addEventListener('visibilitychange', onVisibilityChange);\n attachMouseEvents();\n }\n });\n on('beforeTransitionStart', (_s, speed, internal) => {\n if (swiper.autoplay.running) {\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.pause(speed);\n } else {\n stop();\n }\n }\n });\n on('sliderFirstMove', () => {\n if (swiper.autoplay.running) {\n if (swiper.params.autoplay.disableOnInteraction) {\n stop();\n } else {\n pause();\n }\n }\n });\n on('touchEnd', () => {\n if (\n swiper.params.cssMode &&\n swiper.autoplay.paused &&\n !swiper.params.autoplay.disableOnInteraction\n ) {\n run();\n }\n });\n on('destroy', () => {\n detachMouseEvents();\n if (swiper.autoplay.running) {\n stop();\n }\n const document = getDocument();\n document.removeEventListener('visibilitychange', onVisibilityChange);\n });\n\n Object.assign(swiper.autoplay, {\n pause,\n run,\n start,\n stop,\n });\n}\n","import { isObject } from '../../shared/utils.js';\nimport $ from '../../shared/dom.js';\n\nexport default function Thumb({ swiper, extendParams, on }) {\n extendParams({\n thumbs: {\n swiper: null,\n multipleActiveThumbs: true,\n autoScrollOffset: 0,\n slideThumbActiveClass: 'swiper-slide-thumb-active',\n thumbsContainerClass: 'swiper-thumbs',\n },\n });\n\n let initialized = false;\n let swiperCreated = false;\n\n swiper.thumbs = {\n swiper: null,\n };\n\n function onThumbClick() {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n const clickedIndex = thumbsSwiper.clickedIndex;\n const clickedSlide = thumbsSwiper.clickedSlide;\n if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass))\n return;\n if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n let slideToIndex;\n if (thumbsSwiper.params.loop) {\n slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n } else {\n slideToIndex = clickedIndex;\n }\n if (swiper.params.loop) {\n let currentIndex = swiper.activeIndex;\n if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n currentIndex = swiper.activeIndex;\n }\n const prevIndex = swiper.slides\n .eq(currentIndex)\n .prevAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n const nextIndex = swiper.slides\n .eq(currentIndex)\n .nextAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;\n else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;\n else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;\n else slideToIndex = prevIndex;\n }\n swiper.slideTo(slideToIndex);\n }\n\n function init() {\n const { thumbs: thumbsParams } = swiper.params;\n if (initialized) return false;\n initialized = true;\n const SwiperClass = swiper.constructor;\n if (thumbsParams.swiper instanceof SwiperClass) {\n swiper.thumbs.swiper = thumbsParams.swiper;\n Object.assign(swiper.thumbs.swiper.originalParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n Object.assign(swiper.thumbs.swiper.params, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n } else if (isObject(thumbsParams.swiper)) {\n const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n Object.assign(thumbsSwiperParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n swiperCreated = true;\n }\n swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n swiper.thumbs.swiper.on('tap', onThumbClick);\n return true;\n }\n\n function update(initial) {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n\n const slidesPerView =\n thumbsSwiper.params.slidesPerView === 'auto'\n ? thumbsSwiper.slidesPerViewDynamic()\n : thumbsSwiper.params.slidesPerView;\n\n const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n let currentThumbsIndex = thumbsSwiper.activeIndex;\n let newThumbsIndex;\n let direction;\n if (thumbsSwiper.params.loop) {\n if (\n thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .hasClass(thumbsSwiper.params.slideDuplicateClass)\n ) {\n thumbsSwiper.loopFix();\n // eslint-disable-next-line\n thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n currentThumbsIndex = thumbsSwiper.activeIndex;\n }\n // Find actual thumbs index to slide to\n const prevThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .prevAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n const nextThumbsIndex = thumbsSwiper.slides\n .eq(currentThumbsIndex)\n .nextAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`)\n .eq(0)\n .index();\n if (typeof prevThumbsIndex === 'undefined') {\n newThumbsIndex = nextThumbsIndex;\n } else if (typeof nextThumbsIndex === 'undefined') {\n newThumbsIndex = prevThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex =\n thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;\n } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {\n newThumbsIndex = nextThumbsIndex;\n } else {\n newThumbsIndex = prevThumbsIndex;\n }\n direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n } else {\n newThumbsIndex = swiper.realIndex;\n direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n }\n if (useOffset) {\n newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n }\n\n if (\n thumbsSwiper.visibleSlidesIndexes &&\n thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0\n ) {\n if (thumbsSwiper.params.centeredSlides) {\n if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n } else {\n newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n }\n } else if (\n newThumbsIndex > currentThumbsIndex &&\n thumbsSwiper.params.slidesPerGroup === 1\n ) {\n // newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n }\n thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n }\n }\n\n // Activate thumbs\n let thumbsToActivate = 1;\n const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n thumbsToActivate = swiper.params.slidesPerView;\n }\n\n if (!swiper.params.thumbs.multipleActiveThumbs) {\n thumbsToActivate = 1;\n }\n\n thumbsToActivate = Math.floor(thumbsToActivate);\n\n thumbsSwiper.slides.removeClass(thumbActiveClass);\n if (\n thumbsSwiper.params.loop ||\n (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)\n ) {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.$wrapperEl\n .children(`[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`)\n .addClass(thumbActiveClass);\n }\n } else {\n for (let i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass);\n }\n }\n }\n\n on('beforeInit', () => {\n const { thumbs } = swiper.params;\n if (!thumbs || !thumbs.swiper) return;\n init();\n update(true);\n });\n on('slideChange update resize observerUpdate', () => {\n if (!swiper.thumbs.swiper) return;\n update();\n });\n on('setTransition', (_s, duration) => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n thumbsSwiper.setTransition(duration);\n });\n on('beforeDestroy', () => {\n const thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) return;\n if (swiperCreated && thumbsSwiper) {\n thumbsSwiper.destroy();\n }\n });\n\n Object.assign(swiper.thumbs, {\n init,\n update,\n });\n}\n","import { now } from '../../shared/utils.js';\n\nexport default function freeMode({ swiper, extendParams, emit, once }) {\n extendParams({\n freeMode: {\n enabled: false,\n momentum: true,\n momentumRatio: 1,\n momentumBounce: true,\n momentumBounceRatio: 1,\n momentumVelocityRatio: 1,\n sticky: false,\n minimumVelocity: 0.02,\n },\n });\n\n function onTouchMove() {\n const { touchEventsData: data, touches } = swiper;\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime,\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: now(),\n });\n }\n\n function onTouchEnd({ currentPos }) {\n const { params, $wrapperEl, rtlTranslate: rtl, snapGrid, touchEventsData: data } = swiper;\n // Time diff\n const touchEndTime = now();\n const timeDiff = touchEndTime - data.touchStartTime;\n\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n\n if (params.freeMode.momentum) {\n if (data.velocities.length > 1) {\n const lastMoveEvent = data.velocities.pop();\n const velocityEvent = data.velocities.pop();\n\n const distance = lastMoveEvent.position - velocityEvent.position;\n const time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || now() - lastMoveEvent.time > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeMode.momentumVelocityRatio;\n\n data.velocities.length = 0;\n let momentumDuration = 1000 * params.freeMode.momentumRatio;\n const momentumDistance = swiper.velocity * momentumDuration;\n\n let newPosition = swiper.translate + momentumDistance;\n if (rtl) newPosition = -newPosition;\n\n let doBounce = false;\n let afterBouncePosition;\n const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n let needsLoopFix;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeMode.momentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n if (params.loop && params.centeredSlides) needsLoopFix = true;\n } else if (params.freeMode.sticky) {\n let nextSlide;\n for (let j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n\n if (\n Math.abs(snapGrid[nextSlide] - newPosition) <\n Math.abs(snapGrid[nextSlide - 1] - newPosition) ||\n swiper.swipeDirection === 'next'\n ) {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n if (needsLoopFix) {\n once('transitionEnd', () => {\n swiper.loopFix();\n });\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n if (params.freeMode.sticky) {\n // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n // It's easy to see this when simulating touch with mouse events. To fix this,\n // limit single-slide swipes to the default slide duration. This also has the\n // nice side effect of matching slide speed if the user stopped moving before\n // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n // For faster swipes, also apply limits (albeit higher ones).\n const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n if (moveDistance < currentSlideSize) {\n momentumDuration = params.speed;\n } else if (moveDistance < 2 * currentSlideSize) {\n momentumDuration = params.speed * 1.5;\n } else {\n momentumDuration = params.speed * 2.5;\n }\n }\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (params.freeMode.momentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n emit('momentumBounce');\n swiper.setTransition(params.speed);\n setTimeout(() => {\n swiper.setTranslate(afterBouncePosition);\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }, 0);\n });\n } else if (swiper.velocity) {\n emit('_freeModeNoMomentumRelease');\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(() => {\n if (!swiper || swiper.destroyed) return;\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n } else if (params.freeMode.sticky) {\n swiper.slideToClosest();\n return;\n } else if (params.freeMode) {\n emit('_freeModeNoMomentumRelease');\n }\n\n if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n }\n\n Object.assign(swiper, {\n freeMode: {\n onTouchMove,\n onTouchEnd,\n },\n });\n}\n","export default function Grid({ swiper, extendParams }) {\n extendParams({\n grid: {\n rows: 1,\n fill: 'column',\n },\n });\n\n let slidesNumberEvenToRows;\n let slidesPerRow;\n let numFullColumns;\n\n const initSlides = (slidesLength) => {\n const { slidesPerView } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n slidesPerRow = slidesNumberEvenToRows / rows;\n numFullColumns = Math.floor(slidesLength / rows);\n if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n slidesNumberEvenToRows = slidesLength;\n } else {\n slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n }\n if (slidesPerView !== 'auto' && fill === 'row') {\n slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n }\n };\n\n const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {\n const { slidesPerGroup, spaceBetween } = swiper.params;\n const { rows, fill } = swiper.params.grid;\n // Set slides order\n let newSlideOrderIndex;\n let column;\n let row;\n if (fill === 'row' && slidesPerGroup > 1) {\n const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n const columnsInGroup =\n groupIndex === 0\n ? slidesPerGroup\n : Math.min(\n Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows),\n slidesPerGroup,\n );\n row = Math.floor(slideIndexInGroup / columnsInGroup);\n column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n\n newSlideOrderIndex = column + (row * slidesNumberEvenToRows) / rows;\n slide.css({\n '-webkit-order': newSlideOrderIndex,\n order: newSlideOrderIndex,\n });\n } else if (fill === 'column') {\n column = Math.floor(i / rows);\n row = i - column * rows;\n if (column > numFullColumns || (column === numFullColumns && row === rows - 1)) {\n row += 1;\n if (row >= rows) {\n row = 0;\n column += 1;\n }\n }\n } else {\n row = Math.floor(i / slidesPerRow);\n column = i - row * slidesPerRow;\n }\n slide.css(\n getDirectionLabel('margin-top'),\n row !== 0 ? spaceBetween && `${spaceBetween}px` : '',\n );\n };\n\n const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {\n const { spaceBetween, centeredSlides, roundLengths } = swiper.params;\n const { rows } = swiper.params.grid;\n swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n swiper.$wrapperEl.css({\n [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px`,\n });\n if (centeredSlides) {\n snapGrid.splice(0, snapGrid.length);\n const newSlidesGrid = [];\n for (let i = 0; i < snapGrid.length; i += 1) {\n let slidesGridItem = snapGrid[i];\n if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n }\n snapGrid.push(...newSlidesGrid);\n }\n };\n\n swiper.grid = {\n initSlides,\n updateSlide,\n updateWrapperSize,\n };\n}\n","import appendSlide from './methods/appendSlide.js';\nimport prependSlide from './methods/prependSlide.js';\nimport addSlide from './methods/addSlide.js';\nimport removeSlide from './methods/removeSlide.js';\nimport removeAllSlides from './methods/removeAllSlides.js';\n\nexport default function Manipulation({ swiper }) {\n Object.assign(swiper, {\n appendSlide: appendSlide.bind(swiper),\n prependSlide: prependSlide.bind(swiper),\n addSlide: addSlide.bind(swiper),\n removeSlide: removeSlide.bind(swiper),\n removeAllSlides: removeAllSlides.bind(swiper),\n });\n}\n","import effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFade({ swiper, extendParams, on }) {\n extendParams({\n fadeEffect: {\n crossFade: false,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides } = swiper;\n const params = swiper.params.fadeEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = swiper.slides.eq(i);\n const offset = $slideEl[0].swiperSlideOffset;\n let tx = -offset;\n if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n const slideOpacity = swiper.params.fadeEffect.crossFade\n ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl\n .css({\n opacity: slideOpacity,\n })\n .transform(`translate3d(${tx}px, ${ty}px, 0px)`);\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.fadeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'fade',\n swiper,\n on,\n setTranslate,\n setTransition,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import $ from '../../shared/dom.js';\nimport effectInit from '../../shared/effect-init.js';\n\nexport default function EffectCube({ swiper, extendParams, on }) {\n extendParams({\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n });\n\n const setTranslate = () => {\n const {\n $el,\n $wrapperEl,\n slides,\n width: swiperWidth,\n height: swiperHeight,\n rtlTranslate: rtl,\n size: swiperSize,\n browser,\n } = swiper;\n const params = swiper.params.cubeEffect;\n const isHorizontal = swiper.isHorizontal();\n const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n let wrapperRotate = 0;\n let $cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
');\n $wrapperEl.append($cubeShadowEl);\n }\n $cubeShadowEl.css({ height: `${swiperWidth}px` });\n } else {\n $cubeShadowEl = $el.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
');\n $el.append($cubeShadowEl);\n }\n }\n }\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n }\n let slideAngle = slideIndex * 90;\n let round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n const progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n let tx = 0;\n let ty = 0;\n let tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + round * 4 * swiperSize;\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = 3 * swiperSize + swiperSize * 4 * round;\n }\n if (rtl) {\n tx = -tx;\n }\n\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n\n const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${\n isHorizontal ? slideAngle : 0\n }deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n if (progress <= 1 && progress > -1) {\n wrapperRotate = slideIndex * 90 + progress * 90;\n if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n }\n $slideEl.transform(transform);\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $(\n `
`,\n );\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $(\n `
`,\n );\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n }\n $wrapperEl.css({\n '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`,\n 'transform-origin': `50% 50% -${swiperSize / 2}px`,\n });\n\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl.transform(\n `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${\n -swiperWidth / 2\n }px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`,\n );\n } else {\n const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n const multiplier =\n 1.5 -\n (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2 +\n Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2);\n const scale1 = params.shadowScale;\n const scale2 = params.shadowScale / multiplier;\n const offset = params.shadowOffset;\n $cubeShadowEl.transform(\n `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${\n -swiperHeight / 2 / scale2\n }px) rotateX(-90deg)`,\n );\n }\n }\n const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;\n $wrapperEl.transform(\n `translate3d(0px,0,${zFactor}px) rotateX(${\n swiper.isHorizontal() ? 0 : wrapperRotate\n }deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`,\n );\n };\n const setTransition = (duration) => {\n const { $el, slides } = swiper;\n slides\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n $el.find('.swiper-cube-shadow').transition(duration);\n }\n };\n\n effectInit({\n effect: 'cube',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectFlip({ swiper, extendParams, on }) {\n extendParams({\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, rtlTranslate: rtl } = swiper;\n const params = swiper.params.flipEffect;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n let progress = $slideEl[0].progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n }\n const offset = $slideEl[0].swiperSlideOffset;\n const rotate = -180 * progress;\n let rotateY = rotate;\n let rotateX = 0;\n let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (rtl) {\n rotateY = -rotateY;\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n if (params.slideShadows) {\n // Set shadows\n let shadowBefore = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let shadowAfter = swiper.isHorizontal()\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top');\n }\n if (shadowAfter.length === 0) {\n shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n }\n if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n }\n const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.flipEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'flip',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n slidesPerView: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\n\nexport default function EffectCoverflow({ swiper, extendParams, on }) {\n extendParams({\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n scale: 1,\n modifier: 1,\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { width: swiperWidth, height: swiperHeight, slides, slidesSizesGrid } = swiper;\n const params = swiper.params.coverflowEffect;\n const isHorizontal = swiper.isHorizontal();\n const transform = swiper.translate;\n const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n const rotate = isHorizontal ? params.rotate : -params.rotate;\n const translate = params.depth;\n // Each slide offset from center\n for (let i = 0, length = slides.length; i < length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideSize = slidesSizesGrid[i];\n const slideOffset = $slideEl[0].swiperSlideOffset;\n const offsetMultiplier =\n ((center - slideOffset - slideSize / 2) / slideSize) * params.modifier;\n\n let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n let translateZ = -translate * Math.abs(offsetMultiplier);\n\n let stretch = params.stretch;\n // Allow percentage to make a relative stretch for responsive sliders\n if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n stretch = (parseFloat(params.stretch) / 100) * slideSize;\n }\n let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n\n let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) translateX = 0;\n if (Math.abs(translateY) < 0.001) translateY = 0;\n if (Math.abs(translateZ) < 0.001) translateZ = 0;\n if (Math.abs(rotateY) < 0.001) rotateY = 0;\n if (Math.abs(rotateX) < 0.001) rotateX = 0;\n if (Math.abs(scale) < 0.001) scale = 0;\n\n const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(slideTransform);\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowBeforeEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-left')\n : $slideEl.find('.swiper-slide-shadow-top');\n let $shadowAfterEl = isHorizontal\n ? $slideEl.find('.swiper-slide-shadow-right')\n : $slideEl.find('.swiper-slide-shadow-bottom');\n if ($shadowBeforeEl.length === 0) {\n $shadowBeforeEl = createShadow(params, $slideEl, isHorizontal ? 'left' : 'top');\n }\n if ($shadowAfterEl.length === 0) {\n $shadowAfterEl = createShadow(params, $slideEl, isHorizontal ? 'right' : 'bottom');\n }\n if ($shadowBeforeEl.length)\n $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n if ($shadowAfterEl.length)\n $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n }\n }\n };\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.coverflowEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements\n .transition(duration)\n .find(\n '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n )\n .transition(duration);\n };\n\n effectInit({\n effect: 'coverflow',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCreative({ swiper, extendParams, on }) {\n extendParams({\n creativeEffect: {\n transformEl: null,\n limitProgress: 1,\n shadowPerProgress: false,\n progressMultiplier: 1,\n perspective: true,\n prev: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n next: {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n opacity: 1,\n scale: 1,\n },\n },\n });\n\n const getTranslateValue = (value) => {\n if (typeof value === 'string') return value;\n return `${value}px`;\n };\n\n const setTranslate = () => {\n const { slides, $wrapperEl, slidesSizesGrid } = swiper;\n const params = swiper.params.creativeEffect;\n const { progressMultiplier: multiplier } = params;\n\n const isCenteredSlides = swiper.params.centeredSlides;\n\n if (isCenteredSlides) {\n const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;\n $wrapperEl.transform(`translateX(calc(50% - ${margin}px))`);\n }\n\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(\n Math.max($slideEl[0].progress, -params.limitProgress),\n params.limitProgress,\n );\n let originalProgress = progress;\n\n if (!isCenteredSlides) {\n originalProgress = Math.min(\n Math.max($slideEl[0].originalProgress, -params.limitProgress),\n params.limitProgress,\n );\n }\n\n const offset = $slideEl[0].swiperSlideOffset;\n const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n const r = [0, 0, 0];\n let custom = false;\n if (!swiper.isHorizontal()) {\n t[1] = t[0];\n t[0] = 0;\n }\n let data = {\n translate: [0, 0, 0],\n rotate: [0, 0, 0],\n scale: 1,\n opacity: 1,\n };\n if (progress < 0) {\n data = params.next;\n custom = true;\n } else if (progress > 0) {\n data = params.prev;\n custom = true;\n }\n // set translate\n t.forEach((value, index) => {\n t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(\n progress * multiplier,\n )}))`;\n });\n // set rotates\n r.forEach((value, index) => {\n r[index] = data.rotate[index] * Math.abs(progress * multiplier);\n });\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n\n const translateString = t.join(', ');\n const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;\n const scaleString =\n originalProgress < 0\n ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})`\n : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;\n const opacityString =\n originalProgress < 0\n ? 1 + (1 - data.opacity) * originalProgress * multiplier\n : 1 - (1 - data.opacity) * originalProgress * multiplier;\n const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n // Set shadows\n if ((custom && data.shadow) || !custom) {\n let $shadowEl = $slideEl.children('.swiper-slide-shadow');\n if ($shadowEl.length === 0 && data.shadow) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length) {\n const shadowOpacity = params.shadowPerProgress\n ? progress * (1 / params.limitProgress)\n : progress;\n $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n }\n }\n\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform).css({ opacity: opacityString });\n if (data.origin) {\n $targetEl.css('transform-origin', data.origin);\n }\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.creativeEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl, allSlides: true });\n };\n\n effectInit({\n effect: 'creative',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => swiper.params.creativeEffect.perspective,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n","import createShadow from '../../shared/create-shadow.js';\nimport effectInit from '../../shared/effect-init.js';\nimport effectTarget from '../../shared/effect-target.js';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';\n\nexport default function EffectCards({ swiper, extendParams, on }) {\n extendParams({\n cardsEffect: {\n slideShadows: true,\n transformEl: null,\n },\n });\n\n const setTranslate = () => {\n const { slides, activeIndex } = swiper;\n const params = swiper.params.cardsEffect;\n const { startTranslate, isTouched } = swiper.touchEventsData;\n const currentTranslate = swiper.translate;\n for (let i = 0; i < slides.length; i += 1) {\n const $slideEl = slides.eq(i);\n const slideProgress = $slideEl[0].progress;\n const progress = Math.min(Math.max(slideProgress, -4), 4);\n let offset = $slideEl[0].swiperSlideOffset;\n if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`);\n }\n if (swiper.params.centeredSlides && swiper.params.cssMode) {\n offset -= slides[0].swiperSlideOffset;\n }\n let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n let tY = 0;\n const tZ = -100 * Math.abs(progress);\n let scale = 1;\n let rotate = -2 * progress;\n\n let tXAdd = 8 - Math.abs(progress) * 0.75;\n\n const isSwipeToNext =\n (i === activeIndex || i === activeIndex - 1) &&\n progress > 0 &&\n progress < 1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate < startTranslate;\n const isSwipeToPrev =\n (i === activeIndex || i === activeIndex + 1) &&\n progress < 0 &&\n progress > -1 &&\n (isTouched || swiper.params.cssMode) &&\n currentTranslate > startTranslate;\n if (isSwipeToNext || isSwipeToPrev) {\n const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n rotate += -28 * progress * subProgress;\n scale += -0.5 * subProgress;\n tXAdd += 96 * subProgress;\n tY = `${-25 * subProgress * Math.abs(progress)}%`;\n }\n\n if (progress < 0) {\n // next\n tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`;\n } else if (progress > 0) {\n // prev\n tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`;\n } else {\n tX = `${tX}px`;\n }\n if (!swiper.isHorizontal()) {\n const prevY = tY;\n tY = tX;\n tX = prevY;\n }\n\n const scaleString =\n progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n const transform = `\n translate3d(${tX}, ${tY}, ${tZ}px)\n rotateZ(${rotate}deg)\n scale(${scaleString})\n `;\n\n if (params.slideShadows) {\n // Set shadows\n let $shadowEl = $slideEl.find('.swiper-slide-shadow');\n if ($shadowEl.length === 0) {\n $shadowEl = createShadow(params, $slideEl);\n }\n if ($shadowEl.length)\n $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n const $targetEl = effectTarget(params, $slideEl);\n $targetEl.transform(transform);\n }\n };\n\n const setTransition = (duration) => {\n const { transformEl } = swiper.params.cardsEffect;\n const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n\n effectVirtualTransitionEnd({ swiper, duration, transformEl });\n };\n\n effectInit({\n effect: 'cards',\n swiper,\n on,\n setTranslate,\n setTransition,\n perspective: () => true,\n overwriteParams: () => ({\n watchSlidesProgress: true,\n virtualTranslate: !swiper.params.cssMode,\n }),\n });\n}\n"]} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper-vars.less b/src/main/resources/static/assets/js/swiper/swiper-vars.less new file mode 100644 index 0000000..a068f6d --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-vars.less @@ -0,0 +1 @@ +@themeColor: #007aff; diff --git a/src/main/resources/static/assets/js/swiper/swiper-vars.scss b/src/main/resources/static/assets/js/swiper/swiper-vars.scss new file mode 100644 index 0000000..819dec4 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper-vars.scss @@ -0,0 +1 @@ +$themeColor: #007aff !default; diff --git a/src/main/resources/static/assets/js/swiper/swiper.d.ts b/src/main/resources/static/assets/js/swiper/swiper.d.ts new file mode 100644 index 0000000..1dd69a5 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper.d.ts @@ -0,0 +1,58 @@ +import Swiper from './types/swiper-class'; +import { SwiperOptions } from './types/swiper-options'; +import { SwiperModule } from './types/shared'; + +declare const A11y: SwiperModule; +declare const Autoplay: SwiperModule; +declare const Controller: SwiperModule; +declare const EffectCoverflow: SwiperModule; +declare const EffectCube: SwiperModule; +declare const EffectFade: SwiperModule; +declare const EffectFlip: SwiperModule; +declare const EffectCreative: SwiperModule; +declare const EffectCards: SwiperModule; +declare const HashNavigation: SwiperModule; +declare const History: SwiperModule; +declare const Keyboard: SwiperModule; +declare const Lazy: SwiperModule; +declare const Mousewheel: SwiperModule; +declare const Navigation: SwiperModule; +declare const Pagination: SwiperModule; +declare const Parallax: SwiperModule; +declare const Scrollbar: SwiperModule; +declare const Thumbs: SwiperModule; +declare const Virtual: SwiperModule; +declare const Zoom: SwiperModule; +declare const FreeMode: SwiperModule; +declare const Grid: SwiperModule; +declare const Manipulation: SwiperModule; + +export default Swiper; +export { + Swiper, + SwiperOptions, + A11y, + Autoplay, + Controller, + EffectCoverflow, + EffectCube, + EffectFade, + EffectFlip, + EffectCreative, + EffectCards, + HashNavigation, + History, + Keyboard, + Lazy, + Mousewheel, + Navigation, + Pagination, + Parallax, + Scrollbar, + Thumbs, + Virtual, + Zoom, + FreeMode, + Grid, + Manipulation, +}; diff --git a/src/main/resources/static/assets/js/swiper/swiper.esm.js b/src/main/resources/static/assets/js/swiper/swiper.esm.js new file mode 100644 index 0000000..6386d66 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper.esm.js @@ -0,0 +1,37 @@ +/** + * Swiper 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +export { default as Swiper, default } from './core/core.js'; +export { default as Virtual } from './modules/virtual/virtual.js'; +export { default as Keyboard } from './modules/keyboard/keyboard.js'; +export { default as Mousewheel } from './modules/mousewheel/mousewheel.js'; +export { default as Navigation } from './modules/navigation/navigation.js'; +export { default as Pagination } from './modules/pagination/pagination.js'; +export { default as Scrollbar } from './modules/scrollbar/scrollbar.js'; +export { default as Parallax } from './modules/parallax/parallax.js'; +export { default as Zoom } from './modules/zoom/zoom.js'; +export { default as Lazy } from './modules/lazy/lazy.js'; +export { default as Controller } from './modules/controller/controller.js'; +export { default as A11y } from './modules/a11y/a11y.js'; +export { default as History } from './modules/history/history.js'; +export { default as HashNavigation } from './modules/hash-navigation/hash-navigation.js'; +export { default as Autoplay } from './modules/autoplay/autoplay.js'; +export { default as Thumbs } from './modules/thumbs/thumbs.js'; +export { default as FreeMode } from './modules/free-mode/free-mode.js'; +export { default as Grid } from './modules/grid/grid.js'; +export { default as Manipulation } from './modules/manipulation/manipulation.js'; +export { default as EffectFade } from './modules/effect-fade/effect-fade.js'; +export { default as EffectCube } from './modules/effect-cube/effect-cube.js'; +export { default as EffectFlip } from './modules/effect-flip/effect-flip.js'; +export { default as EffectCoverflow } from './modules/effect-coverflow/effect-coverflow.js'; +export { default as EffectCreative } from './modules/effect-creative/effect-creative.js'; +export { default as EffectCards } from './modules/effect-cards/effect-cards.js'; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper.less b/src/main/resources/static/assets/js/swiper/swiper.less new file mode 100644 index 0000000..356f93c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper.less @@ -0,0 +1,169 @@ +@themeColor: #007aff; + +@font-face { + font-family: 'swiper-icons'; + src: url('data:application/font-woff;charset=utf-8;base64, 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'); + font-weight: 400; + font-style: normal; +} + +:root { + --swiper-theme-color: @themeColor; +} +.swiper { + margin-left: auto; + margin-right: auto; + position: relative; + overflow: hidden; + list-style: none; + padding: 0; + /* Fix of Webkit flickering */ + z-index: 1; +} +.swiper-vertical > .swiper-wrapper { + flex-direction: column; +} +.swiper-wrapper { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: flex; + transition-property: transform; + box-sizing: content-box; +} +.swiper-android .swiper-slide, +.swiper-wrapper { + transform: translate3d(0px, 0, 0); +} + +.swiper-pointer-events { + touch-action: pan-y; + &.swiper-vertical { + touch-action: pan-x; + } +} +.swiper-slide { + flex-shrink: 0; + width: 100%; + height: 100%; + position: relative; + transition-property: transform; +} +.swiper-slide-invisible-blank { + visibility: hidden; +} +/* Auto Height */ +.swiper-autoheight, +.swiper-autoheight .swiper-slide { + height: auto; +} +.swiper-autoheight .swiper-wrapper { + align-items: flex-start; + transition-property: transform, height; +} + +/* 3D Effects */ +.swiper-3d { + &, + &.swiper-css-mode .swiper-wrapper { + perspective: 1200px; + } + .swiper-wrapper, + .swiper-slide, + .swiper-slide-shadow, + .swiper-slide-shadow-left, + .swiper-slide-shadow-right, + .swiper-slide-shadow-top, + .swiper-slide-shadow-bottom, + .swiper-cube-shadow { + transform-style: preserve-3d; + } + .swiper-slide-shadow, + .swiper-slide-shadow-left, + .swiper-slide-shadow-right, + .swiper-slide-shadow-top, + .swiper-slide-shadow-bottom { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10; + } + .swiper-slide-shadow { + background: rgba(0, 0, 0, 0.15); + } + .swiper-slide-shadow-left { + background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + } + .swiper-slide-shadow-right { + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + } + .swiper-slide-shadow-top { + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + } + .swiper-slide-shadow-bottom { + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + } +} + +/* CSS Mode */ +.swiper-css-mode { + > .swiper-wrapper { + overflow: auto; + scrollbar-width: none; /* For Firefox */ + -ms-overflow-style: none; /* For Internet Explorer and Edge */ + &::-webkit-scrollbar { + display: none; + } + } + > .swiper-wrapper > .swiper-slide { + scroll-snap-align: start start; + } +} +.swiper-horizontal.swiper-css-mode { + > .swiper-wrapper { + scroll-snap-type: x mandatory; + } +} +.swiper-vertical.swiper-css-mode { + > .swiper-wrapper { + scroll-snap-type: y mandatory; + } +} +.swiper-centered { + > .swiper-wrapper::before { + content: ''; + flex-shrink: 0; + order: 9999; + } + &.swiper-horizontal { + > .swiper-wrapper > .swiper-slide:first-child { + margin-inline-start: var(--swiper-centered-offset-before); + } + > .swiper-wrapper::before { + height: 100%; + min-height: 1px; + width: var(--swiper-centered-offset-after); + } + } + &.swiper-vertical { + > .swiper-wrapper > .swiper-slide:first-child { + margin-block-start: var(--swiper-centered-offset-before); + } + > .swiper-wrapper::before { + width: 100%; + min-width: 1px; + height: var(--swiper-centered-offset-after); + } + } + + > .swiper-wrapper > .swiper-slide { + scroll-snap-align: center center; + } +} + + + diff --git a/src/main/resources/static/assets/js/swiper/swiper.min.css b/src/main/resources/static/assets/js/swiper/swiper.min.css new file mode 100644 index 0000000..d9e9e5a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper.min.css @@ -0,0 +1,13 @@ +/** + * Swiper 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +@font-face{font-family:swiper-icons;src:url('data:application/font-woff;charset=utf-8;base64, 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');font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff}.swiper{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;box-sizing:content-box}.swiper-android .swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-pointer-events{touch-action:pan-y}.swiper-pointer-events.swiper-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-3d,.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide,.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top,.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-3d .swiper-slide-shadow{background:rgba(0,0,0,.15)}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-horizontal.swiper-css-mode>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-vertical.swiper-css-mode>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-centered>.swiper-wrapper::before{content:'';flex-shrink:0;order:9999}.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-centered.swiper-horizontal>.swiper-wrapper::before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-centered.swiper-vertical>.swiper-wrapper::before{width:100%;min-width:1px;height:var(--swiper-centered-offset-after)}.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center} \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/swiper.scss b/src/main/resources/static/assets/js/swiper/swiper.scss new file mode 100644 index 0000000..f3d800a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/swiper.scss @@ -0,0 +1,170 @@ +@import 'swiper-vars.scss'; + +@font-face { + font-family: 'swiper-icons'; + src: url('data:application/font-woff;charset=utf-8;base64, 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') + format('woff'); + font-weight: 400; + font-style: normal; +} + +:root { + --swiper-theme-color: #{$themeColor}; +} +.swiper { + margin-left: auto; + margin-right: auto; + position: relative; + overflow: hidden; + list-style: none; + padding: 0; + /* Fix of Webkit flickering */ + z-index: 1; +} +.swiper-vertical > .swiper-wrapper { + flex-direction: column; +} +.swiper-wrapper { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: flex; + transition-property: transform; + box-sizing: content-box; +} +.swiper-android .swiper-slide, +.swiper-wrapper { + transform: translate3d(0px, 0, 0); +} +.swiper-pointer-events { + touch-action: pan-y; + &.swiper-vertical { + touch-action: pan-x; + } +} +.swiper-slide { + flex-shrink: 0; + width: 100%; + height: 100%; + position: relative; + transition-property: transform; +} +.swiper-slide-invisible-blank { + visibility: hidden; +} +/* Auto Height */ +.swiper-autoheight { + &, + .swiper-slide { + height: auto; + } + + .swiper-wrapper { + align-items: flex-start; + transition-property: transform, height; + } +} + +/* 3D Effects */ +.swiper-3d { + &, + &.swiper-css-mode .swiper-wrapper { + perspective: 1200px; + } + .swiper-wrapper, + .swiper-slide, + .swiper-slide-shadow, + .swiper-slide-shadow-left, + .swiper-slide-shadow-right, + .swiper-slide-shadow-top, + .swiper-slide-shadow-bottom, + .swiper-cube-shadow { + transform-style: preserve-3d; + } + .swiper-slide-shadow, + .swiper-slide-shadow-left, + .swiper-slide-shadow-right, + .swiper-slide-shadow-top, + .swiper-slide-shadow-bottom { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10; + } + .swiper-slide-shadow { + background: rgba(0, 0, 0, 0.15); + } + .swiper-slide-shadow-left { + background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + } + .swiper-slide-shadow-right { + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + } + .swiper-slide-shadow-top { + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + } + .swiper-slide-shadow-bottom { + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + } +} + +/* CSS Mode */ +.swiper-css-mode { + > .swiper-wrapper { + overflow: auto; + scrollbar-width: none; /* For Firefox */ + -ms-overflow-style: none; /* For Internet Explorer and Edge */ + &::-webkit-scrollbar { + display: none; + } + } + > .swiper-wrapper > .swiper-slide { + scroll-snap-align: start start; + } +} +.swiper-horizontal.swiper-css-mode { + > .swiper-wrapper { + scroll-snap-type: x mandatory; + } +} +.swiper-vertical.swiper-css-mode { + > .swiper-wrapper { + scroll-snap-type: y mandatory; + } +} +.swiper-centered { + > .swiper-wrapper::before { + content: ''; + flex-shrink: 0; + order: 9999; + } + &.swiper-horizontal { + > .swiper-wrapper > .swiper-slide:first-child { + margin-inline-start: var(--swiper-centered-offset-before); + } + > .swiper-wrapper::before { + height: 100%; + width: var(--swiper-centered-offset-after); + } + } + &.swiper-vertical { + > .swiper-wrapper > .swiper-slide:first-child { + margin-block-start: var(--swiper-centered-offset-before); + } + > .swiper-wrapper::before { + width: 100%; + height: var(--swiper-centered-offset-after); + } + } + + > .swiper-wrapper > .swiper-slide { + scroll-snap-align: center center; + } +} + + + diff --git a/src/main/resources/static/assets/js/swiper/types/index.d.ts b/src/main/resources/static/assets/js/swiper/types/index.d.ts new file mode 100644 index 0000000..ee0ced8 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/index.d.ts @@ -0,0 +1,5 @@ +export * from './shared'; +export { default as Swiper } from './swiper-class'; +export * from './swiper-events'; +export * from './swiper-options'; +export * from './modules/public-api'; diff --git a/src/main/resources/static/assets/js/swiper/types/modules/a11y.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/a11y.d.ts new file mode 100644 index 0000000..ef0cc24 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/a11y.d.ts @@ -0,0 +1,89 @@ +export interface A11yMethods {} + +export interface A11yEvents {} + +export interface A11yOptions { + /** + * Enables A11y + * + * @default true + */ + enabled?: boolean; + + /** + * Message for screen readers for previous button + * + * @default 'Previous slide' + */ + prevSlideMessage?: string; + + /** + * Message for screen readers for next button + * + * @default 'Next slide' + */ + nextSlideMessage?: string; + + /** + * Message for screen readers for previous button when swiper is on first slide + * + * @default 'This is the first slide' + */ + firstSlideMessage?: string; + + /** + * Message for screen readers for next button when swiper is on last slide + * + * @default 'This is the last slide' + */ + lastSlideMessage?: string; + + /** + * Message for screen readers for single pagination bullet + * + * @default 'Go to slide {{index}}' + */ + paginationBulletMessage?: string; + + /** + * CSS class name of A11y notification + * + * @default 'swiper-notification' + */ + notificationClass?: string; + + /** + * Message for screen readers for outer swiper container + * + * @default null + */ + containerMessage?: string | null; + + /** + * Message for screen readers describing the role of outer swiper container + * + * @default null + */ + containerRoleDescriptionMessage?: string | null; + + /** + * Message for screen readers describing the role of slide element + * + * @default null + */ + itemRoleDescriptionMessage?: string | null; + + /** + * Message for screen readers describing the label of slide element + * + * @default '{{index}} / {{slidesLength}}' + */ + slideLabelMessage?: string; + + /** + * Value of swiper slide `role` attribute + * + * @default 'group' + */ + slideRole?: string; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/autoplay.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/autoplay.d.ts new file mode 100644 index 0000000..eba380f --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/autoplay.d.ts @@ -0,0 +1,101 @@ +import Swiper from '../swiper-class'; + +export interface AutoplayMethods { + /** + * Whether autoplay enabled and running + */ + running: boolean; + + /** + * Start autoplay + */ + start(): boolean; + + /** + * Stop autoplay + */ + stop(): boolean; +} + +export interface AutoplayEvents { + /** + * Event will be fired in when autoplay started + */ + autoplayStart: (swiper: Swiper) => void; + /** + * Event will be fired when autoplay stopped + */ + autoplayStop: (swiper: Swiper) => void; + /** + * Event will be fired when slide changed with autoplay + */ + autoplay: (swiper: Swiper) => void; +} + +/** + * Object with autoplay parameters or boolean `true` to enable with default settings. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * autoplay: { + * delay: 5000, + * }, + * }); + * ``` + */ +export interface AutoplayOptions { + /** + * Delay between transitions (in ms). If this parameter is not specified, auto play will be disabled + * + * If you need to specify different delay for specific slides you can do it by using + * `data-swiper-autoplay` (in ms) attribute on slide. + * + * @example + * ```html + * + *
+ * ``` + * + * @default 3000 + */ + delay?: number; + + /** + * Enable this parameter and autoplay will be stopped when it reaches last slide (has no effect in loop mode) + * + * @default false + */ + stopOnLastSlide?: boolean; + + /** + * Set to `false` and autoplay will not be disabled after user interactions (swipes), + * it will be restarted every time after interaction + * + * @default true + */ + disableOnInteraction?: boolean; + + /** + * Enables autoplay in reverse direction + * + * @default false + */ + reverseDirection?: boolean; + + /** + * When enabled autoplay will wait for wrapper transition to continue. + * Can be disabled in case of using Virtual Translate when your + * slider may not have transition + * + * @default true + */ + waitForTransition?: boolean; + + /** + * When enabled autoplay will be paused on mouse enter over Swiper container. If `disableOnInteraction` is also enabled, it will stop autoplay instead of pause + * + * @default false + */ + pauseOnMouseEnter?: boolean; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/controller.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/controller.d.ts new file mode 100644 index 0000000..74b99c8 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/controller.d.ts @@ -0,0 +1,35 @@ +import Swiper from '../swiper-class'; + +export interface ControllerMethods { + /** + * Pass here another Swiper instance or array with Swiper instances that should be controlled + * by this Swiper + */ + control?: Swiper | Swiper[]; +} + +export interface ControllerEvents {} + +export interface ControllerOptions { + /** + * Pass here another Swiper instance or array with Swiper instances that should be controlled + * by this Swiper + */ + control?: Swiper | Swiper[]; + + /** + * Set to `true` and controlling will be in inverse direction + * + * @default false + */ + inverse?: boolean; + + /** + * Defines a way how to control another slider: slide by slide + * (with respect to other slider's grid) or depending on all slides/container + * (depending on total slider percentage). + * + * @default 'slide' + */ + by?: 'slide' | 'container'; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/effect-cards.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/effect-cards.d.ts new file mode 100644 index 0000000..9630ae0 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/effect-cards.d.ts @@ -0,0 +1,20 @@ +import { CSSSelector } from '../shared'; + +export interface CardsEffectMethods {} + +export interface CardsEffectEvents {} + +export interface CardsEffectOptions { + /** + * Enables slides shadows + * + * @default true + */ + slideShadows?: boolean; + /** + * CSS selector of the element inside of the slide to transform instead of the slide itself. Useful to use with cssMode + * + * @default null + */ + transformEl?: CSSSelector; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/effect-coverflow.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/effect-coverflow.d.ts new file mode 100644 index 0000000..e95dde7 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/effect-coverflow.d.ts @@ -0,0 +1,50 @@ +import { CSSSelector } from '../shared'; + +export interface CoverflowEffectMethods {} + +export interface CoverflowEffectEvents {} + +export interface CoverflowEffectOptions { + /** + * Enables slides shadows + * + * @default true + */ + slideShadows?: boolean; + /** + * Slide rotate in degrees + * + * @default 50 + */ + rotate?: number; + /** + * Stretch space between slides (in px) + * + * @default 0 + */ + stretch?: number; + /** + * Depth offset in px (slides translate in Z axis) + * + * @default 100 + */ + depth?: number; + /** + * Slide scale effect + * + * @default 1 + */ + scale?: number; + /** + * Effect multiplier + * + * @default 1 + */ + modifier?: number; + /** + * CSS selector of the element inside of the slide to transform instead of the slide itself. Useful to use with cssMode + * + * @default null + */ + transformEl?: CSSSelector; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/effect-creative.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/effect-creative.d.ts new file mode 100644 index 0000000..ac34c9f --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/effect-creative.d.ts @@ -0,0 +1,93 @@ +import { CSSSelector } from '../shared'; + +interface CreativeEffectTransform { + translate?: (string | number)[]; + rotate?: number[]; + opacity?: number; + scale?: number; + shadow?: boolean; + origin?: string; +} + +export interface CreativeEffectMethods {} + +export interface CreativeEffectEvents {} + +export interface CreativeEffectOptions { + /** + * Previous slide transformations. Accepts object of the following type: + * + * @example + * ```js + * { + * // Array with translate X, Y and Z values + * translate: (string | number)[]; + * // Array with rotate X, Y and Z values (in deg) + * rotate?: number[]; + * // Slide opacity + * opacity?: number; + * // Slide scale + * scale?: number; + * // Enables slide shadow + * shadow?: boolean; + * // Transform origin, e.g. `left bottom` + * origin?: string; + * } + * ``` + * + */ + prev?: CreativeEffectTransform; + /** + * Next slide transformations. + * + * @example + * ```js + * { + * // Array with translate X, Y and Z values + * translate: (string | number)[]; + * // Array with rotate X, Y and Z values (in deg) + * rotate?: number[]; + * // Slide opacity + * opacity?: number; + * // Slide scale + * scale?: number; + * // Enables slide shadow + * shadow?: boolean; + * // Transform origin, e.g. `left bottom` + * origin?: string; + * } + * ``` + * + */ + next?: CreativeEffectTransform; + /** + * CSS selector of the element inside of the slide to transform instead of the slide itself. Useful to use with cssMode + * + * @default null + */ + transformEl?: CSSSelector; + /** + * Limit progress/offset to amount of side slides. If `1`, then slides all slides after prev/next will have same state. If `2`, then all slides after 2nd before/after active will have same state, etc. + * + * @default 1 + */ + limitProgress?: number; + /** + * Splits shadow "opacity" per slide based on `limitProgress` (only if transformation shadows enabled). E.g. setting `limitProgress: 2` and enabling `shadowPerProgress`, will set shadow opacity to `0.5` and `1` on two slides next to active. With this parameter disabled, all slides beside active will have shadow with `1` opacity + * + * @default false + */ + shadowPerProgress?: boolean; + /** + * Allows to multiply slides transformations and opacity. + * + * @default 1 + */ + progressMultipler?: number; + /** + * Enable this parameter if your custom transforms require 3D transformations (`translateZ`, `rotateX`, `rotateY` ) + * + * @default true + */ + perspective?: boolean; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/effect-cube.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/effect-cube.d.ts new file mode 100644 index 0000000..c59535c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/effect-cube.d.ts @@ -0,0 +1,30 @@ +export interface CubeEffectMethods {} + +export interface CubeEffectEvents {} + +export interface CubeEffectOptions { + /** + * Enables slides shadows + * + * @default true + */ + slideShadows?: boolean; + /** + * Enables main slider shadow + * + * @default true + */ + shadow?: boolean; + /** + * Main shadow offset in px + * + * @default 20 + */ + shadowOffset?: number; + /** + * Main shadow scale ratio + * + * @default 0.94 + */ + shadowScale?: number; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/effect-fade.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/effect-fade.d.ts new file mode 100644 index 0000000..8478d4b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/effect-fade.d.ts @@ -0,0 +1,20 @@ +import { CSSSelector } from '../shared'; + +export interface FadeEffectMethods {} + +export interface FadeEffectEvents {} + +export interface FadeEffectOptions { + /** + * Enables slides cross fade + * + * @default false + */ + crossFade?: boolean; + /** + * CSS selector of the element inside of the slide to transform instead of the slide itself. Useful to use with cssMode + * + * @default null + */ + transformEl?: CSSSelector; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/effect-flip.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/effect-flip.d.ts new file mode 100644 index 0000000..f3de1e6 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/effect-flip.d.ts @@ -0,0 +1,26 @@ +import { CSSSelector } from '../shared'; + +export interface FlipEffectMethods {} + +export interface FlipEffectEvents {} + +export interface FlipEffectOptions { + /** + * Enables slides shadows + * + * @default true + */ + slideShadows?: boolean; + /** + * Limit edge slides rotation + * + * @default true + */ + limitRotation?: boolean; + /** + * CSS selector of the element inside of the slide to transform instead of the slide itself. Useful to use with cssMode + * + * @default null + */ + transformEl?: CSSSelector; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/free-mode.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/free-mode.d.ts new file mode 100644 index 0000000..e82a57c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/free-mode.d.ts @@ -0,0 +1,59 @@ +export interface FreeModeMethods { + onTouchMove(): void; + onTouchEnd(): void; +} + +export interface FreeModeEvents {} + +export interface FreeModeOptions { + enabled?: boolean; + + /** + * If enabled, then slide will keep moving for a while after you release it + * + * @default true + */ + momentum?: boolean; + + /** + * Higher value produces larger momentum distance after you release slider + * + * @default 1 + */ + momentumRatio?: number; + + /** + * Higher value produces larger momentum velocity after you release slider + * + * @default 1 + */ + momentumVelocityRatio?: number; + + /** + * Set to `false` if you want to disable momentum bounce in free mode + * + * @default true + */ + momentumBounce?: boolean; + + /** + * Higher value produces larger momentum bounce effect + * + * @default 1 + */ + momentumBounceRatio?: number; + + /** + * Minimum touchmove-velocity required to trigger free mode momentum + * + * @default 0.02 + */ + minimumVelocity?: number; + + /** + * Set to enabled to enable snap to slides positions in free mode + * + * @default false + */ + sticky?: boolean; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/grid.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/grid.d.ts new file mode 100644 index 0000000..a7626c8 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/grid.d.ts @@ -0,0 +1,21 @@ +export interface GridMethods {} + +export interface GridEvents {} + +export interface GridOptions { + /** + * Number of slides rows, for multirow layout + * + * @note `rows` > 1 is currently not compatible with loop mode (`loop: true`) + * + * @default 1 + */ + rows?: number; + + /** + * Can be `'column'` or `'row'`. Defines how slides should fill rows, by column or by row + * + * @default 'column' + */ + fill?: 'row' | 'column'; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/hash-navigation.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/hash-navigation.d.ts new file mode 100644 index 0000000..ac490cf --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/hash-navigation.d.ts @@ -0,0 +1,32 @@ +import Swiper from '../swiper-class'; + +export interface HashNavigationMethods {} + +export interface HashNavigationEvents { + /** + * Event will be fired on window hash change + */ + hashChange: (swiper: Swiper) => void; + /** + * Event will be fired when swiper updates the hash + */ + hashSet: (swiper: Swiper) => void; +} + +export interface HashNavigationOptions { + /** + * Set to `true` to enable also navigation through slides (when hashnav + * is enabled) by browser history or by setting directly hash on document location + * + * @default false + */ + watchState?: boolean; + + /** + * Works in addition to hashnav to replace current url state with the + * new one instead of adding it to history + * + * @default false + */ + replaceState?: boolean; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/history.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/history.d.ts new file mode 100644 index 0000000..0003b08 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/history.d.ts @@ -0,0 +1,29 @@ +export interface HistoryMethods {} + +export interface HistoryEvents {} + +export interface HistoryOptions { + /** + * Swiper page root, useful to specify when you use Swiper history mode not on root website page. + * For example can be `https://my-website.com/` or `https://my-website.com/subpage/` or `/subpage/` + * + * + * @default '' + */ + root?: string; + + /** + * Works in addition to hashnav or history to replace current url state with the + * new one instead of adding it to history + * + * @default false + */ + replaceState?: boolean; + + /** + * Url key for slides + * + * @default 'slides' + */ + key?: string; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/keyboard.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/keyboard.d.ts new file mode 100644 index 0000000..1e9a312 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/keyboard.d.ts @@ -0,0 +1,46 @@ +import Swiper from '../swiper-class'; + +export interface KeyboardMethods { + /** + * Whether the keyboard control is enabled + */ + enabled: boolean; + + /** + * Enable keyboard control + */ + enable(): void; + + /** + * Disable keyboard control + */ + disable(): void; +} + +export interface KeyboardEvents { + /** + * Event will be fired on key press + */ + keyPress: (swiper: Swiper, keyCode: string) => void; +} + +export interface KeyboardOptions { + /** + * Set to `true` to enable keyboard control + * + * @default false + */ + enabled?: boolean; + /** + * When enabled it will control sliders that are currently in viewport + * + * @default true + */ + onlyInViewport?: boolean; + /** + * When enabled it will enable keyboard navigation by Page Up and Page Down keys + * + * @default true + */ + pageUpDown?: boolean; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/lazy.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/lazy.d.ts new file mode 100644 index 0000000..815c861 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/lazy.d.ts @@ -0,0 +1,82 @@ +import { Dom7Array } from 'dom7'; +import { CSSSelector } from '../shared'; +import Swiper from '../swiper-class'; + +export interface LazyMethods { + /** + * Load/update lazy images based on current slider state (position) + */ + load(): void; + + /** + * Force to load lazy images in slide by specified index + * @param number index number of slide to load lazy images in + */ + loadInSlide(index: number): void; +} + +export interface LazyEvents { + /** + * Event will be fired in the beginning of lazy loading of image + */ + lazyImageLoad: (swiper: Swiper, slideEl: HTMLElement, imageEl: HTMLElement) => void; + /** + * Event will be fired when lazy loading image will be loaded + */ + lazyImageReady: (swiper: Swiper, slideEl: HTMLElement, imageEl: HTMLElement) => void; +} + +export interface LazyOptions { + /** + * Enables to check is the Swiper in view before lazy loading images on initial slides + * + * @default false + */ + checkInView?: boolean; + /** + * Element to check scrolling on for `checkInView`. Defaults to `window` + * */ + scrollingElement?: CSSSelector | null | Dom7Array | HTMLElement; + /** + * Set to `true` to enable lazy loading for the closest slides images (for previous and next slide images) + * + * @default false + * */ + loadPrevNext?: boolean; + /** + * Amount of next/prev slides to preload lazy images in. Can't be less than `slidesPerView` + * + * @default 1 + * */ + loadPrevNextAmount?: number; + /** + * By default, Swiper will load lazy images after transition to this slide, so you may enable this parameter if you need it to start loading of new image in the beginning of transition + * + * @default false + * */ + loadOnTransitionStart?: boolean; + /** + * CSS class name of lazy element + * + * @default 'swiper-lazy' + * */ + elementClass?: string; + /** + * CSS class name of lazy loading element + * + * @default 'swiper-lazy-loading' + * */ + loadingClass?: string; + /** + * CSS class name of lazy loaded element + * + * @default 'swiper-lazy-loaded' + * */ + loadedClass?: string; + /** + * CSS class name of lazy preloader + * + * @default 'swiper-lazy-preloader' + * */ + preloaderClass?: string; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/manipulation.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/manipulation.d.ts new file mode 100644 index 0000000..3366eaf --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/manipulation.d.ts @@ -0,0 +1,70 @@ +export interface ManipulationMethods { + /** + * Add new slides to the end. slides could be + * HTMLElement or HTML string with new slide or + * array with such slides, for example: + * + * @example + * ```js + * appendSlide('
Slide 10"
') + * + * appendSlide([ + * '
Slide 10"
', + * '
Slide 11"
' + * ]); + * ``` + */ + appendSlide(slides: HTMLElement | string | string[] | HTMLElement[]): void; + + /** + * Add new slides to the beginning. slides could be + * HTMLElement or HTML string with new slide or array with such slides, for example: + * + * @example + * ```js + * prependSlide('
Slide 0"
') + * + * prependSlide([ + * '
Slide 1"
', + * '
Slide 2"
' + * ]); + * ``` + */ + prependSlide(slides: HTMLElement | string | string[] | HTMLElement[]): void; + + /** + * Add new slides to the required index. slides could be HTMLElement or HTML string with new slide or array with such slides, for example: + * + * @example + * ```js + * addSlide(1, '
Slide 10"
') + * + * addSlide(1, [ + * '
Slide 10"
', + * '
Slide 11"
' + * ]); + * ``` + */ + addSlide(index: number, slides: HTMLElement | string | string[] | HTMLElement[]): void; + + /** + * Remove selected slides. slideIndex could be a number with slide index to remove or array with indexes. + * + * @example + * ```js + * removeSlide(0); // remove first slide + * removeSlide([0, 1]); // remove first and second slides + * removeAllSlides(); // Remove all slides + * ``` + */ + removeSlide(slideIndex: number | number[]): void; + + /** + * Remove all slides + */ + removeAllSlides(): void; +} + +export interface ManipulationEvents {} + +export interface ManipulationOptions {} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/mousewheel.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/mousewheel.d.ts new file mode 100644 index 0000000..43c9809 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/mousewheel.d.ts @@ -0,0 +1,75 @@ +import Swiper from '../swiper-class'; +import { CSSSelector } from '../shared'; + +export interface MousewheelMethods { + /** + * Whether the mousewheel control is enabled + */ + enabled: boolean; + + /** + * Enable mousewheel control + */ + enable(): void; + + /** + * Disable mousewheel control + */ + disable(): void; +} + +export interface MousewheelEvents { + /** + * Event will be fired on mousewheel scroll + */ + scroll: (swiper: Swiper, event: WheelEvent) => void; +} + +export interface MousewheelOptions { + /** + * Set to `true` to force mousewheel swipes to axis. So in horizontal mode mousewheel will work only with horizontal mousewheel scrolling, and only with vertical scrolling in vertical mode. + + * + * @default false + */ + forceToAxis?: boolean; + /** + * Set to `true` and swiper will release mousewheel event and allow page scrolling when swiper is on edge positions (in the beginning or in the end) + + * + * @default false + */ + releaseOnEdges?: boolean; + /** + * Set to `true` to invert sliding direction + * + * @default false + */ + invert?: boolean; + /** + * Multiplier of mousewheel data, allows to tweak mouse wheel sensitivity + * + * @default 1 + */ + sensitivity?: number; + /** + * String with CSS selector or HTML element of the container accepting mousewheel events. By default it is swiper + * + * @default 'container' + */ + eventsTarget?: 'container' | 'wrapper' | CSSSelector | HTMLElement; + + /** + * Minimum mousewheel scroll delta to trigger swiper slide change + * + * @default null + */ + thresholdDelta?: number | null; + + /** + * Minimum mousewheel scroll time delta (in ms) to trigger swiper slide change + * + * @default null + */ + thresholdTime?: number | null; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/navigation.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/navigation.d.ts new file mode 100644 index 0000000..89a5cfb --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/navigation.d.ts @@ -0,0 +1,86 @@ +import { CSSSelector } from '../shared'; +import Swiper from '../swiper-class'; + +export interface NavigationMethods { + /** + * HTMLElement of "next" navigation button + */ + nextEl: HTMLElement; + + /** + * HTMLElement of "previous" navigation button + */ + prevEl: HTMLElement; + + /** + * Update navigation buttons state (enabled/disabled) + */ + update(): void; + + /** + * Initialize navigation + */ + init(): void; + + /** + * Destroy navigation + */ + destroy(): void; +} + +export interface NavigationEvents { + /** + * Event will be fired on navigation hide + */ + navigationHide: (swiper: Swiper) => void; + /** + * Event will be fired on navigation show + */ + navigationShow: (swiper: Swiper) => void; +} + +export interface NavigationOptions { + /** + * String with CSS selector or HTML element of the element that will work + * like "next" button after click on it + * + * @default null + */ + nextEl?: CSSSelector | HTMLElement | null; + + /** + * String with CSS selector or HTML element of the element that will work + * like "prev" button after click on it + * + * @default null + */ + prevEl?: CSSSelector | HTMLElement | null; + + /** + * Toggle navigation buttons visibility after click on Slider's container + * + * @default false + */ + hideOnClick?: boolean; + + /** + * CSS class name added to navigation button when it becomes disabled + * + * @default 'swiper-button-disabled' + */ + disabledClass?: string; + + /** + * CSS class name added to navigation button when it becomes hidden + * + * @default 'swiper-button-hidden' + */ + hiddenClass?: string; + + /** + * CSS class name added to navigation button when it is disabled + * + * @default 'swiper-button-lock' + */ + lockClass?: string; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/pagination.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/pagination.d.ts new file mode 100644 index 0000000..7e444a0 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/pagination.d.ts @@ -0,0 +1,285 @@ +import { Dom7Array } from 'dom7'; +import { CSSSelector } from '../shared'; +import Swiper from '../swiper-class'; + +export interface PaginationMethods { + /** + * HTMLElement of pagination container element + */ + el: HTMLElement; + + /** + * Dom7 array-like collection of pagination bullets + * HTML elements. To get specific slide HTMLElement + * use `swiper.pagination.bullets[1]`. + */ + bullets: Dom7Array[]; + + /** + * Render pagination layout + */ + render(): void; + + /** + * Update pagination state (enabled/disabled/active) + */ + update(): void; + + /** + * Initialize pagination + */ + init(): void; + + /** + * Destroy pagination + */ + destroy(): void; +} + +export interface PaginationEvents { + /** + * Event will be fired after pagination rendered + */ + paginationRender: (swiper: Swiper, paginationEl: HTMLElement) => void; + + /** + * Event will be fired when pagination updated + */ + paginationUpdate: (swiper: Swiper, paginationEl: HTMLElement) => void; + + /** + * Event will be fired on pagination hide + */ + paginationHide: (swiper: Swiper) => void; + + /** + * Event will be fired on pagination show + */ + paginationShow: (swiper: Swiper) => void; +} + +export interface PaginationOptions { + /** + * String with CSS selector or HTML element of the container with pagination + * + * @default null + */ + el?: CSSSelector | HTMLElement | null; + + /** + * String with type of pagination. Can be `'bullets'`, `'fraction'`, `'progressbar'` or `'custom'` + * + * @default 'bullets' + */ + type?: 'bullets' | 'fraction' | 'progressbar' | 'custom'; + + /** + * Defines which HTML tag will be used to represent single pagination bullet. Only for `'bullets'` pagination type. + * + * @default 'span' + */ + bulletElement?: string; + + /** + * Good to enable if you use bullets pagination with a lot of slides. So it will keep only few bullets visible at the same time. + * + * @default false + */ + dynamicBullets?: boolean; + + /** + * The number of main bullets visible when `dynamicBullets` enabled. + * + * @default 1 + */ + dynamicMainBullets?: number; + + /** + * Toggle (hide/show) pagination container visibility after click on Slider's container + * + * @default true + */ + hideOnClick?: boolean; + + /** + * If `true` then clicking on pagination button will cause transition to appropriate slide. Only for bullets pagination type + * + * @default false + */ + clickable?: boolean; + + /** + * Makes pagination progressbar opposite to Swiper's `direction` parameter, means vertical progressbar for horizontal swiper + * direction and horizontal progressbar for vertical swiper direction + * + * @default false + */ + progressbarOpposite?: boolean; + + /** + * format fraction pagination current number. Function receives current number, + * and you need to return formatted value + */ + formatFractionCurrent?: (number: number) => number; + + /** + * format fraction pagination total number. Function receives total number, and you + * need to return formatted value + */ + formatFractionTotal?: (number: number) => number; + + /** + * This parameter allows totally customize pagination bullets, you need to pass here a function that accepts `index` number of + * pagination bullet and required element class name (`className`). Only for `'bullets'` pagination type + * + * @default null + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * //... + * renderBullet: function (index, className) { + * return '' + (index + 1) + ''; + * } + * }); + * ``` + */ + renderBullet?: (index: number, className: string) => void; + + /** + * This parameter allows to customize "fraction" pagination html. Only for `'fraction'` pagination type + * + * @default null + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * //... + * renderFraction: function (currentClass, totalClass) { + * return '' + + * ' of ' + + * ''; + * } + * }); + * ``` + */ + renderFraction?: (currentClass: string, totalClass: string) => void; + + /** + * This parameter allows to customize "progress" pagination. Only for `'progress'` pagination type + * + * @default null + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * //... + * renderProgressbar: function (progressbarFillClass) { + * return ''; + * } + * }); + * ``` + */ + renderProgressbar?: (progressbarFillClass: string) => void; + + /** + * This parameter is required for `'custom'` pagination type where you have to specify + * how it should be rendered. + * + * @default null + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * //... + * renderCustom: function (swiper, current, total) { + * return current + ' of ' + total; + * } + * }); + * ``` + */ + renderCustom?: (swiper: Swiper, current: number, total: number) => void; + + /** + * CSS class name of single pagination bullet + * + * @default 'swiper-pagination-bullet' + */ + bulletClass?: string; + + /** + * CSS class name of currently active pagination bullet + * + * @default 'swiper-pagination-bullet-active' + */ + bulletActiveClass?: string; + + /** + * The beginning of the modifier CSS class name that will be added to pagination depending on parameters + * + * @default 'swiper-pagination-' + */ + modifierClass?: string; + + /** + * CSS class name of the element with currently active index in "fraction" pagination + * + * @default 'swiper-pagination-current' + */ + currentClass?: string; + + /** + * CSS class name of the element with total number of "snaps" in "fraction" pagination + * + * @default 'swiper-pagination-total' + */ + totalClass?: string; + + /** + * CSS class name of pagination when it becomes inactive + * + * @default 'swiper-pagination-hidden' + */ + hiddenClass?: string; + + /** + * CSS class name of pagination progressbar fill element + * + * @default 'swiper-pagination-progressbar-fill' + */ + progressbarFillClass?: string; + + /** + * CSS class name of pagination progressbar opposite + * + * @default 'swiper-pagination-progressbar-opposite' + */ + progressbarOppositeClass?: string; + /** + * CSS class name set to pagination when it is clickable + * + * @default 'swiper-pagination-clickable' + */ + clickableClass?: string; + + /** + * CSS class name set to pagination when it is disabled + * + * @default 'swiper-pagination-lock' + */ + lockClass?: string; + + /** + * CSS class name set to pagination in horizontal Swiper + * + * @default 'swiper-pagination-horizontal' + */ + horizontalClass?: string; + + /** + * CSS class name set to pagination in vertical Swiper + * + * @default 'swiper-pagination-vertical' + */ + verticalClass?: string; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/parallax.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/parallax.d.ts new file mode 100644 index 0000000..27e8e6f --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/parallax.d.ts @@ -0,0 +1,12 @@ +export interface ParallaxMethods {} + +export interface ParallaxEvents {} + +export interface ParallaxOptions { + /** + * Enable, if you want to use "parallaxed" elements inside of slider + * + * @default false + */ + enabled?: boolean; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/public-api.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/public-api.d.ts new file mode 100644 index 0000000..316772c --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/public-api.d.ts @@ -0,0 +1,24 @@ +export * from './a11y'; +export * from './autoplay'; +export * from './controller'; +export * from './effect-coverflow'; +export * from './effect-cube'; +export * from './effect-fade'; +export * from './effect-flip'; +export * from './effect-creative'; +export * from './effect-cards'; +export * from './hash-navigation'; +export * from './history'; +export * from './keyboard'; +export * from './lazy'; +export * from './mousewheel'; +export * from './navigation'; +export * from './pagination'; +export * from './parallax'; +export * from './scrollbar'; +export * from './thumbs'; +export * from './virtual'; +export * from './zoom'; +export * from './free-mode'; +export * from './grid'; +export * from './manipulation'; diff --git a/src/main/resources/static/assets/js/swiper/types/modules/scrollbar.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/scrollbar.d.ts new file mode 100644 index 0000000..9577568 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/scrollbar.d.ts @@ -0,0 +1,115 @@ +import { CSSSelector } from '../shared'; +import Swiper from '../swiper-class'; + +export interface ScrollbarMethods { + /** + * HTMLElement of Scrollbar container element + */ + el: HTMLElement; + + /** + * HTMLElement of Scrollbar draggable handler element + */ + dragEl: HTMLElement; + + /** + * Updates scrollbar track and handler sizes + */ + updateSize(): void; + + /** + * Updates scrollbar translate + */ + setTranslate(): void; + + /** + * Initialize scrollbar + */ + init(): void; + + /** + * Destroy scrollbar + */ + destroy(): void; +} + +export interface ScrollbarEvents { + /** + * Event will be fired on draggable scrollbar drag start + */ + scrollbarDragStart: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired on draggable scrollbar drag move + */ + scrollbarDragMove: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired on draggable scrollbar drag end + */ + scrollbarDragEnd: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; +} + +/** + * Object with scrollbar parameters. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * scrollbar: { + * el: '.swiper-scrollbar', + * draggable: true, + * }, + * }); + * ``` + */ +export interface ScrollbarOptions { + /** + * String with CSS selector or HTML element of the container with scrollbar. + * + * @default null + */ + el?: CSSSelector | HTMLElement | null; + + /** + * Hide scrollbar automatically after user interaction + * + * @default true + */ + hide?: boolean; + + /** + * Set to `true` to enable make scrollbar draggable that allows you to control slider position + * + * @default false + */ + draggable?: boolean; + + /** + * Set to `true` to snap slider position to slides when you release scrollbar + * + * @default false + */ + snapOnRelease?: boolean; + + /** + * Size of scrollbar draggable element in px + * + * @default 'auto' + */ + dragSize?: 'auto' | number; + + /** + * Scrollbar element additional CSS class when it is disabled + * + * @default 'swiper-scrollbar-lock' + */ + lockClass?: string; + + /** + * Scrollbar draggable element CSS class + * + * @default 'swiper-scrollbar-drag' + */ + dragClass?: string; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/thumbs.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/thumbs.d.ts new file mode 100644 index 0000000..98fa98b --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/thumbs.d.ts @@ -0,0 +1,54 @@ +import Swiper from '../swiper-class'; + +export interface ThumbsMethods { + /** + * Swiper instance of thumbs swiper + */ + swiper: Swiper; + + /** + * Update thumbs + */ + update(initial: boolean): void; + + /** + * Initialize thumbs + */ + init(): boolean; +} + +export interface ThumbsEvents {} + +export interface ThumbsOptions { + /** + * Swiper instance of swiper used as thumbs or object with Swiper parameters to initialize thumbs swiper + * + * @default null + */ + swiper?: Swiper | null; + /** + * Additional class that will be added to activated thumbs swiper slide + * + * @default 'swiper-slide-thumb-active' + */ + slideThumbActiveClass?: string; + /** + * Additional class that will be added to thumbs swiper + * + * @default 'swiper-thumbs' + */ + thumbsContainerClass?: string; + /** + * When enabled multiple thumbnail slides may get activated + * + * @default true + */ + multipleActiveThumbs?: boolean; + /** + * Allows to set on which thumbs active slide from edge it should automatically move scroll thumbs. For example, if set to 1 and last visible thumb will be activated (1 from edge) it will auto scroll thumbs + + * + * @default 0 + */ + autoScrollOffset?: number; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/virtual.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/virtual.d.ts new file mode 100644 index 0000000..48b2708 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/virtual.d.ts @@ -0,0 +1,122 @@ +export interface VirtualMethods { + /** + * Object with cached slides HTML elements + */ + cache: object; + + /** + * Index of first rendered slide + */ + from: number; + + /** + * Index of last rendered slide + */ + to: number; + + /** + * Array with slide items passed by `virtual.slides` parameter + */ + slides: any[]; + + /* + * Methods + */ + + /** + * Append slide. `slides` can be a single slide item or array with such slides. + */ + appendSlide(slide: HTMLElement | string | HTMLElement[] | string[]): void; + + /** + * Prepend slide. `slides` can be a single slide item or array with such slides. + */ + prependSlide(slide: HTMLElement | string | HTMLElement[] | string[]): void; + + /** + * Remove specific slide or slides. `slideIndexes` can be a number with slide index to remove or array with indexes. + */ + removeSlide(slideIndexes: number[]): void; + + /** + * Remove all slides + */ + removeAllSlides(): void; + + /** + * Update virtual slides state + */ + update(force: boolean): void; +} + +export interface VirtualEvents {} + +export interface VirtualData { + /** + * slides left/top offset in px + */ + offset: number; + /** + * index of first slide required to be rendered + */ + from: number; + /** + * index of last slide required to be rendered + */ + to: number; + /** + * array with slide items to be rendered + */ + slides: any[]; +} + +export interface VirtualOptions { + enabled?: boolean; + /** + * Array with slides + * + * @default [] + */ + slides?: any[]; + /** + * Enables DOM cache of rendering slides html elements. Once they are rendered they will be saved to cache and reused from it. + * + * @default true + */ + cache?: boolean; + /** + * Increases amount of pre-rendered slides before active slide + * + * @default 0 + */ + addSlidesBefore?: number; + /** + * Increases amount of pre-rendered slides after active slide + * + * @default 0 + */ + addSlidesAfter?: number; + /** + * Function to render slide. As an argument it accepts current slide item for `slides` array and index number of the current slide. Function must return an outter HTML of the swiper slide. + * + * @default null + */ + renderSlide?: (slide: any, index: any) => any | null; + /** + * Function for external rendering (e.g. using some other library to handle DOM manipulations and state like React.js or Vue.js). As an argument it accepts `data` object with the following properties: + * + * - `offset` - slides left/top offset in px + * - `from` - index of first slide required to be rendered + * - `to` - index of last slide required to be rendered + * - `slides` - array with slide items to be rendered + * + * @default null + */ + renderExternal?: (data: VirtualData) => any | null; + /** + * When enabled (by default) it will update Swiper layout right after renderExternal called. Useful to disable and update swiper manually when used with render libraries that renders asynchronously + * + * @default true + */ + renderExternalUpdate?: boolean; +} diff --git a/src/main/resources/static/assets/js/swiper/types/modules/zoom.d.ts b/src/main/resources/static/assets/js/swiper/types/modules/zoom.d.ts new file mode 100644 index 0000000..40ebfaa --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/modules/zoom.d.ts @@ -0,0 +1,79 @@ +import Swiper from '../swiper-class'; + +export interface ZoomMethods { + /** + * Whether the zoom module is enabled + */ + enabled: boolean; + + /** + * Current image scale ratio + */ + scale: number; + + /** + * Enable zoom module + */ + enable(): void; + + /** + * Disable zoom module + */ + disable(): void; + + /** + * Zoom in image of the currently active slide + */ + in(): void; + + /** + * Zoom out image of the currently active slide + */ + out(): void; + + /** + * Toggle image zoom of the currently active slide + */ + toggle(): void; +} + +export interface ZoomEvents { + /** + * Event will be fired on zoom change + */ + zoomChange: (swiper: Swiper, scale: number, imageEl: HTMLElement, slideEl: HTMLElement) => void; +} + +export interface ZoomOptions { + /** + * Maximum image zoom multiplier + * + * @default 3 + */ + maxRatio?: number; + /** + * Minimal image zoom multiplier + * + * @default 1 + */ + minRatio?: number; + /** + * Enable/disable zoom-in by slide's double tap + * + * @default true + */ + toggle?: boolean; + /** + * CSS class name of zoom container + * + * @default 'swiper-zoom-container' + */ + containerClass?: string; + /** + * CSS class name of zoomed in container + * + * @default 'swiper-slide-zoomed' + + */ + zoomedSlideClass?: string; +} diff --git a/src/main/resources/static/assets/js/swiper/types/shared.d.ts b/src/main/resources/static/assets/js/swiper/types/shared.d.ts new file mode 100644 index 0000000..1e174ff --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/shared.d.ts @@ -0,0 +1,3 @@ +export interface CSSSelector extends String {} + +export interface SwiperModule {} diff --git a/src/main/resources/static/assets/js/swiper/types/swiper-class.d.ts b/src/main/resources/static/assets/js/swiper/types/swiper-class.d.ts new file mode 100644 index 0000000..387990a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/swiper-class.d.ts @@ -0,0 +1,472 @@ +import { Dom7Array } from 'dom7'; +import { SwiperOptions } from './swiper-options'; +import { CSSSelector, SwiperModule } from './shared'; +import { SwiperEvents } from './swiper-events'; + +import { A11yMethods } from './modules/a11y'; +import { AutoplayMethods } from './modules/autoplay'; +import { ControllerMethods } from './modules/controller'; +import { CoverflowEffectMethods } from './modules/effect-coverflow'; +import { CubeEffectMethods } from './modules/effect-cube'; +import { FadeEffectMethods } from './modules/effect-fade'; +import { FlipEffectMethods } from './modules/effect-flip'; +import { CreativeEffectMethods } from './modules/effect-creative'; +import { CardsEffectMethods } from './modules/effect-cards'; +import { HashNavigationMethods } from './modules/hash-navigation'; +import { HistoryMethods } from './modules/history'; +import { KeyboardMethods } from './modules/keyboard'; +import { LazyMethods } from './modules/lazy'; +import { MousewheelMethods } from './modules/mousewheel'; +import { NavigationMethods } from './modules/navigation'; +import { PaginationMethods } from './modules/pagination'; +import { ParallaxMethods } from './modules/parallax'; +import { ScrollbarMethods } from './modules/scrollbar'; +import { ThumbsMethods } from './modules/thumbs'; +import { VirtualMethods } from './modules/virtual'; +import { ZoomMethods } from './modules/zoom'; +import { FreeModeMethods } from './modules/free-mode'; +import { ManipulationMethods } from './modules/manipulation'; + +interface SwiperClass { + /** Add event handler */ + on(event: E, handler: Events[E]): void; + /** Add event handler that will be removed after it was fired */ + once(event: E, handler: Events[E]): void; + /** Remove event handler */ + off(event: E, handler: Events[E]): void; + /** Remove all handlers for specified event */ + off(event: E): void; + /** Fire event on instance */ + emit(event: E, ...args: any[]): void; +} + +interface Swiper extends SwiperClass { + /** + * Object with passed initialization parameters + */ + params: SwiperOptions; + + /** + * Object with original initialization parameters + */ + originalParams: SwiperOptions; + + /** + * Dom7 element with slider container HTML element. To get vanilla HTMLElement use `swiper.el` + */ + $el: Dom7Array; + + /** + * Slider container HTML element + */ + el: HTMLElement; + + /** + * Dom7 element with slider wrapper HTML element. To get vanilla HTMLElement use `swiper.wrapperEl` + */ + $wrapperEl: Dom7Array; + + /** + * Wrapper HTML element + */ + wrapperEl: HTMLElement; + + /** + * Dom7 array-like collection of slides HTML elements. To get specific slide HTMLElement use `swiper.slides[1]` + */ + slides: Dom7Array; + + /** + * !INTERNAL + */ + loopedSlides: number | null; + + /** + * Width of container + */ + width: number; + + /** + * Height of container + */ + height: number; + + /** + * Current value of wrapper translate + */ + translate: number; + + /** + * Current progress of wrapper translate (from 0 to 1) + */ + progress: number; + + /** + * Index number of currently active slide + * + * @note Note, that in loop mode active index value will be always shifted on a number of looped/duplicated slides + */ + activeIndex: number; + + /** + * Index number of currently active slide considering duplicated slides in loop mode + */ + realIndex: number; + + /** + * Index number of previously active slide + */ + previousIndex: number; + + /** + * `true` if slider on most "left"/"top" position + */ + isBeginning: boolean; + + /** + * `true` if slider on most "right"/"bottom" position + */ + isEnd: boolean; + + /** + * `true` if swiper is in transition + */ + animating: boolean; + + /** + * Object with the following touch event properties: + * + * - `swiper.touches.startX` + * - `swiper.touches.startY` + * - `swiper.touches.currentX` + * - `swiper.touches.currentY` + * - `swiper.touches.diff` + */ + touches: { + startX: number; + startY: number; + currentX: number; + currentY: number; + diff: number; + }; + + /** + * Index number of last clicked slide + */ + clickedIndex: number; + + /** + * Link to last clicked slide (HTMLElement) + */ + clickedSlide: HTMLElement; + + /** + * Disable / enable ability to slide to the next slides by assigning `false` / `true` to this property + */ + allowSlideNext: boolean; + + /** + * Disable / enable ability to slide to the previous slides by assigning `false` / `true` to this property + */ + allowSlidePrev: boolean; + + /** + * Disable / enable ability move slider by grabbing it with mouse or by touching it with finger (on touch screens) by assigning `false` / `true` to this property + */ + allowTouchMove: boolean; + + /** + * !INTERNAL + */ + rtlTranslate: boolean; + + /** + * Disable Swiper (if it was enabled). When Swiper is disabled, it will hide all navigation elements and won't respond to any events and interactions + * + */ + disable(): void; + + /** + * Enable Swiper (if it was disabled) + * + */ + enable(): void; + + /** + * Set Swiper translate progress (from 0 to 1). Where 0 - its initial position (offset) on first slide, and 1 - its maximum position (offset) on last slide + * + * @param progress Swiper translate progress (from 0 to 1). + * @param speed Transition duration (in ms). + */ + setProgress(progress: number, speed?: number): void; + + /** + * Run transition to next slide. + * + * @param speed Transition duration (in ms). + * @param runCallbacks Set it to false (by default it is true) and transition will + * not produce transition events. + */ + slideNext(speed?: number, runCallbacks?: boolean): void; + + /** + * Run transition to previous slide. + * + * @param speed Transition duration (in ms). + * @param runCallbacks Set it to false (by default it is true) and transition will + * not produce transition events. + */ + slidePrev(speed?: number, runCallbacks?: boolean): void; + + /** + * Run transition to the slide with index number equal to 'index' parameter for the + * duration equal to 'speed' parameter. + * + * @param index Index number of slide. + * @param speed Transition duration (in ms). + * @param runCallbacks Set it to false (by default it is true) and transition will + * not produce transition events. + */ + slideTo(index: number, speed?: number, runCallbacks?: boolean): void; + + /** + * Does the same as .slideTo but for the case when used with enabled loop. So this + * method will slide to slides with realIndex matching to passed index + * + * @param index Index number of slide. + * @param speed Transition duration (in ms). + * @param runCallbacks Set it to false (by default it is true) and transition will + * not produce transition events. + */ + slideToLoop(index: number, speed?: number, runCallbacks?: boolean): void; + + /** + * Reset swiper position to currently active slide for the duration equal to 'speed' + * parameter. + * + * @param speed Transition duration (in ms). + * @param runCallbacks Set it to false (by default it is true) and transition will + * not produce transition events. + */ + slideReset(speed?: number, runCallbacks?: boolean): void; + + /** + * Reset swiper position to closest slide/snap point for the duration equal to 'speed' parameter. + * + * @param speed Transition duration (in ms). + * @param runCallbacks Set it to false (by default it is true) and transition will + * not produce transition events. + */ + slideToClosest(speed?: number, runCallbacks?: boolean): void; + + /** + * Force swiper to update its height (when autoHeight enabled) for the duration equal to + * 'speed' parameter + * + * @param speed Transition duration (in ms). + */ + updateAutoHeight(speed?: number): void; + + /** + * You should call it after you add/remove slides + * manually, or after you hide/show it, or do any + * custom DOM modifications with Swiper + * This method also includes subcall of the following + * methods which you can use separately: + */ + update(): void; + + /** + * recalculate size of swiper container + */ + updateSize(): void; + + /** + * recalculate number of slides and their offsets. Useful after you add/remove slides with JavaScript + */ + updateSlides(): void; + + /** + * recalculate swiper progress + */ + updateProgress(): void; + + /** + * update active/prev/next classes on slides and bullets + */ + updateSlidesClasses(): void; + + /** + * Changes slider direction from horizontal to vertical and back. + * + * @param direction New direction. If not specified, then will automatically changed to opposite direction + * @param needUpdate Will call swiper.update(). Default true + */ + changeDirection(direction?: 'horizontal' | 'vertical', needUpdate?: boolean): void; + + /** + * Detach all events listeners + */ + detachEvents(): void; + + /** + * Attach all events listeners again + */ + attachEvents(): void; + + /** + * !INTERNAL + */ + loopCreate(): void; + + /** + * !INTERNAL + */ + loopDestroy(): void; + + /** + * Initialize slider + */ + init(el?: HTMLElement): Swiper; + + /** + * Destroy slider instance and detach all events listeners + * + * @param deleteInstance Set it to false (by default it is true) to not to delete Swiper instance + * @param cleanStyles Set it to true (by default it is true) and all custom styles will be removed from slides, wrapper and container. + * Useful if you need to destroy Swiper and to init again with new options or in different direction + */ + destroy(deleteInstance?: boolean, cleanStyles?: boolean): void; + + /** + * Set custom css3 transform's translate value for swiper wrapper + */ + setTranslate(translate: any): void; + + /** + * Get current value of swiper wrapper css3 transform translate + */ + getTranslate(): any; + + /** + * Animate custom css3 transform's translate value for swiper wrapper + * + * @param translate Translate value (in px) + * @param speed Transition duration (in ms) + * @param runCallbacks Set it to false (by default it is true) and transition will not produce transition events + * @param translateBounds Set it to false (by default it is true) and transition value can extend beyond min and max translate + * + */ + translateTo( + translate: number, + speed: number, + runCallbacks?: boolean, + translateBounds?: boolean, + ): any; + + /** + * Unset grab cursor + */ + unsetGrabCursor(): void; + + /** + * Set grab cursor + */ + setGrabCursor(): void; + + /** + * Add event listener that will be fired on all events + */ + onAny(handler: (eventName: string, ...args: any[]) => void): void; + + /** + * Remove event listener that will be fired on all events + */ + offAny(handler: (eventName: string, ...args: any[]) => void): void; + + /** + * !INTERNAL + */ + isHorizontal(): boolean; + + /** + * !INTERNAL + */ + getBreakpoint(breakpoints: SwiperOptions['breakpoints']): string; + + /** + * !INTERNAL + */ + setBreakpoint(): void; + + /** + * !INTERNAL + */ + currentBreakpoint: any; + + /** + * !INTERNAL + */ + destroyed: boolean; + + /** + * !INTERNAL + */ + modules: Array; + + a11y: A11yMethods; + autoplay: AutoplayMethods; + controller: ControllerMethods; + coverflowEffect: CoverflowEffectMethods; + cubeEffect: CubeEffectMethods; + fadeEffect: FadeEffectMethods; + flipEffect: FlipEffectMethods; + creativeEffect: CreativeEffectMethods; + cardsEffect: CardsEffectMethods; + hashNavigation: HashNavigationMethods; + history: HistoryMethods; + keyboard: KeyboardMethods; + lazy: LazyMethods; + mousewheel: MousewheelMethods; + navigation: NavigationMethods; + pagination: PaginationMethods; + parallax: ParallaxMethods; + scrollbar: ScrollbarMethods; + thumbs: ThumbsMethods; + virtual: VirtualMethods; + zoom: ZoomMethods; + freeMode: FreeModeMethods; +} + +interface Swiper extends ManipulationMethods {} + +declare class Swiper implements Swiper { + /** + * Constructs a new Swiper instance. + * + * @param container Where Swiper applies to. + * @param options Instance options. + */ + constructor(container: CSSSelector | HTMLElement, options?: SwiperOptions); + /** + * Installs modules on Swiper in runtime. + */ + static use(modules: SwiperModule[]): void; + + /** + * Swiper default options + */ + static defaults: SwiperOptions; + + /** + * Extend global Swiper defaults + */ + static extendDefaults(options: SwiperOptions): void; + + /** + * Object with global Swiper extended options + */ + static extendedDefaults: SwiperOptions; +} + +export default Swiper; diff --git a/src/main/resources/static/assets/js/swiper/types/swiper-events.d.ts b/src/main/resources/static/assets/js/swiper/types/swiper-events.d.ts new file mode 100644 index 0000000..54bba29 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/swiper-events.d.ts @@ -0,0 +1,362 @@ +import { SwiperOptions } from './swiper-options'; +import Swiper from './swiper-class'; + +import { A11yEvents } from './modules/a11y'; +import { AutoplayEvents } from './modules/autoplay'; +import { ControllerEvents } from './modules/controller'; +import { CoverflowEffectEvents } from './modules/effect-coverflow'; +import { CubeEffectEvents } from './modules/effect-cube'; +import { FadeEffectEvents } from './modules/effect-fade'; +import { FlipEffectEvents } from './modules/effect-flip'; +import { CreativeEffectEvents } from './modules/effect-creative'; +import { CardsEffectEvents } from './modules/effect-cards'; +import { HashNavigationEvents } from './modules/hash-navigation'; +import { HistoryEvents } from './modules/history'; +import { KeyboardEvents } from './modules/keyboard'; +import { LazyEvents } from './modules/lazy'; +import { MousewheelEvents } from './modules/mousewheel'; +import { NavigationEvents } from './modules/navigation'; +import { PaginationEvents } from './modules/pagination'; +import { ParallaxEvents } from './modules/parallax'; +import { ScrollbarEvents } from './modules/scrollbar'; +import { ThumbsEvents } from './modules/thumbs'; +import { VirtualEvents } from './modules/virtual'; +import { ZoomEvents } from './modules/zoom'; +import { FreeModeEvents } from './modules/free-mode'; + +export interface SwiperEvents { + // CORE_EVENTS_START + /** + * Fired right after Swiper initialization. + * @note Note that with `swiper.on('init')` syntax it will + * work only in case you set `init: false` parameter. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * init: false, + * // other parameters + * }); + * swiper.on('init', function() { + * // do something + * }); + * // init Swiper + * swiper.init(); + * ``` + * + * @example + * ```js + * // Otherwise use it as the parameter: + * const swiper = new Swiper('.swiper', { + * // other parameters + * on: { + * init: function () { + * // do something + * }, + * } + * }); + * ``` + */ + init: (swiper: Swiper) => any; + + /** + * Event will be fired right before Swiper destroyed + */ + beforeDestroy: (swiper: Swiper) => void; + + /** + * Event will be fired when currently active slide is changed + */ + slideChange: (swiper: Swiper) => void; + + /** + * Event will be fired in the beginning of animation to other slide (next or previous). + */ + slideChangeTransitionStart: (swiper: Swiper) => void; + + /** + * Event will be fired after animation to other slide (next or previous). + */ + slideChangeTransitionEnd: (swiper: Swiper) => void; + + /** + * Same as "slideChangeTransitionStart" but for "forward" direction only + */ + slideNextTransitionStart: (swiper: Swiper) => void; + + /** + * Same as "slideChangeTransitionEnd" but for "forward" direction only + */ + slideNextTransitionEnd: (swiper: Swiper) => void; + + /** + * Same as "slideChangeTransitionStart" but for "backward" direction only + */ + slidePrevTransitionStart: (swiper: Swiper) => void; + + /** + * Same as "slideChangeTransitionEnd" but for "backward" direction only + */ + slidePrevTransitionEnd: (swiper: Swiper) => void; + + /** + * Event will be fired in the beginning of transition. + */ + transitionStart: (swiper: Swiper) => void; + + /** + * Event will be fired after transition. + */ + transitionEnd: (swiper: Swiper) => void; + + /** + * Event will be fired when user touch Swiper. Receives `touchstart` event as an arguments. + */ + touchStart: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user touch and move finger over Swiper. Receives `touchmove` event as an arguments. + */ + touchMove: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user touch and move finger over Swiper in direction opposite to direction parameter. Receives `touchmove` event as an arguments. + */ + touchMoveOpposite: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user touch and move finger over Swiper and move it. Receives `touchmove` event as an arguments. + */ + sliderMove: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user release Swiper. Receives `touchend` event as an arguments. + */ + touchEnd: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user click/tap on Swiper. Receives `touchend` event as an arguments. + */ + click: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user click/tap on Swiper. Receives `touchend` event as an arguments. + */ + tap: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user double tap on Swiper's container. Receives `touchend` event as an arguments + */ + doubleTap: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired right after all inner images are loaded. updateOnImagesReady should be also enabled + */ + imagesReady: (swiper: Swiper) => void; + + /** + * Event will be fired when Swiper progress is changed, as an arguments it receives progress that is always from 0 to 1 + */ + progress: (swiper: Swiper, progress: number) => void; + + /** + * Event will be fired when Swiper reach its beginning (initial position) + */ + reachBeginning: (swiper: Swiper) => void; + + /** + * Event will be fired when Swiper reach last slide + */ + reachEnd: (swiper: Swiper) => void; + + /** + * Event will be fired when Swiper goes to beginning or end position + */ + toEdge: (swiper: Swiper) => void; + + /** + * Event will be fired when Swiper goes from beginning or end position + */ + fromEdge: (swiper: Swiper) => void; + + /** + * Event will be fired when swiper's wrapper change its position. Receives current translate value as an arguments + */ + setTranslate: (swiper: Swiper, translate: number) => void; + + /** + * Event will be fired everytime when swiper starts animation. Receives current transition duration (in ms) as an arguments + */ + setTransition: (swiper: Swiper, transition: number) => void; + + /** + * Event will be fired on window resize right before swiper's onresize manipulation + */ + resize: (swiper: Swiper) => void; + + /** + * Event will be fired if observer is enabled and it detects DOM mutations + */ + observerUpdate: (swiper: Swiper) => void; + + /** + * Event will be fired right before "loop fix" + */ + beforeLoopFix: (swiper: Swiper) => void; + + /** + * Event will be fired after "loop fix" + */ + loopFix: (swiper: Swiper) => void; + + /** + * Event will be fired on breakpoint change + */ + breakpoint: (swiper: Swiper, breakpointParams: SwiperOptions) => void; + + /** + * !INTERNAL: Event will fired right before breakpoint change + */ + _beforeBreakpoint?: (swiper: Swiper, breakpointParams: SwiperOptions) => void; + + /** + * !INTERNAL: Event will fired after setting CSS classes on swiper container element + */ + _containerClasses?: (swiper: Swiper, classNames: string) => void; + + /** + * !INTERNAL: Event will fired after setting CSS classes on swiper slide element + */ + _slideClass?: (swiper: Swiper, slideEl: HTMLElement, classNames: string) => void; + + /** + * !INTERNAL: Event will fired after setting CSS classes on all swiper slides + */ + _slideClasses?: ( + swiper: Swiper, + slides: { slideEl: HTMLElement; classNames: string; index: number }[], + ) => void; + + /** + * !INTERNAL: Event will fired as soon as swiper instance available (before init) + */ + _swiper?: (swiper: Swiper) => void; + + /** + * !INTERNAL: Event will be fired on free mode touch end (release) and there will no be momentum + */ + _freeModeNoMomentumRelease?: (swiper: Swiper) => void; + + /** + * Event will fired on active index change + */ + activeIndexChange: (swiper: Swiper) => void; + /** + * Event will fired on snap index change + */ + snapIndexChange: (swiper: Swiper) => void; + /** + * Event will fired on real index change + */ + realIndexChange: (swiper: Swiper) => void; + /** + * Event will fired right after initialization + */ + afterInit: (swiper: Swiper) => void; + /** + * Event will fired right before initialization + */ + beforeInit: (swiper: Swiper) => void; + /** + * Event will fired before resize handler + */ + beforeResize: (swiper: Swiper) => void; + /** + * Event will fired before slide change transition start + */ + beforeSlideChangeStart: (swiper: Swiper) => void; + /** + * Event will fired before transition start + */ + beforeTransitionStart: (swiper: Swiper, speed: number, internal: any) => void; // what is internal? + /** + * Event will fired on direction change + */ + changeDirection: (swiper: Swiper) => void; + /** + * Event will be fired when user double click/tap on Swiper + */ + doubleClick: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void; + /** + * Event will be fired on swiper destroy + */ + destroy: (swiper: Swiper) => void; + /** + * Event will be fired on momentum bounce + */ + momentumBounce: (swiper: Swiper) => void; + /** + * Event will be fired on orientation change (e.g. landscape -> portrait) + */ + orientationchange: (swiper: Swiper) => void; + /** + * Event will be fired in the beginning of animation of resetting slide to current one + */ + slideResetTransitionStart: (swiper: Swiper) => void; + /** + * Event will be fired in the end of animation of resetting slide to current one + */ + slideResetTransitionEnd: (swiper: Swiper) => void; + /** + * Event will be fired with first touch/drag move + */ + sliderFirstMove: (swiper: Swiper, event: TouchEvent) => void; + /** + * Event will be fired when number of slides has changed + */ + slidesLengthChange: (swiper: Swiper) => void; + /** + * Event will be fired when slides grid has changed + */ + slidesGridLengthChange: (swiper: Swiper) => void; + /** + * Event will be fired when snap grid has changed + */ + snapGridLengthChange: (swiper: Swiper) => void; + /** + * Event will be fired after swiper.update() call + */ + update: (swiper: Swiper) => void; + /** + * Event will be fired when swiper is locked (when `watchOverflow` enabled) + */ + lock: (swiper: Swiper) => void; + /** + * Event will be fired when swiper is unlocked (when `watchOverflow` enabled) + */ + unlock: (swiper: Swiper) => void; + // CORE_EVENTS_END +} + +interface SwiperEvents extends A11yEvents {} +interface SwiperEvents extends AutoplayEvents {} +interface SwiperEvents extends ControllerEvents {} +interface SwiperEvents extends CoverflowEffectEvents {} +interface SwiperEvents extends CubeEffectEvents {} +interface SwiperEvents extends FadeEffectEvents {} +interface SwiperEvents extends FlipEffectEvents {} +interface SwiperEvents extends CreativeEffectEvents {} +interface SwiperEvents extends CardsEffectEvents {} +interface SwiperEvents extends HashNavigationEvents {} +interface SwiperEvents extends HistoryEvents {} +interface SwiperEvents extends KeyboardEvents {} +interface SwiperEvents extends LazyEvents {} +interface SwiperEvents extends MousewheelEvents {} +interface SwiperEvents extends NavigationEvents {} +interface SwiperEvents extends PaginationEvents {} +interface SwiperEvents extends ParallaxEvents {} +interface SwiperEvents extends ScrollbarEvents {} +interface SwiperEvents extends ThumbsEvents {} +interface SwiperEvents extends VirtualEvents {} +interface SwiperEvents extends ZoomEvents {} +interface SwiperEvents extends FreeModeEvents {} diff --git a/src/main/resources/static/assets/js/swiper/types/swiper-options.d.ts b/src/main/resources/static/assets/js/swiper/types/swiper-options.d.ts new file mode 100644 index 0000000..b8b4902 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/types/swiper-options.d.ts @@ -0,0 +1,1205 @@ +import { A11yOptions } from './modules/a11y'; +import { AutoplayOptions } from './modules/autoplay'; +import { ControllerOptions } from './modules/controller'; +import { CoverflowEffectOptions } from './modules/effect-coverflow'; +import { CubeEffectOptions } from './modules/effect-cube'; +import { FadeEffectOptions } from './modules/effect-fade'; +import { FlipEffectOptions } from './modules/effect-flip'; +import { CreativeEffectOptions } from './modules/effect-creative'; +import { CardsEffectOptions } from './modules/effect-cards'; +import { HashNavigationOptions } from './modules/hash-navigation'; +import { HistoryOptions } from './modules/history'; +import { KeyboardOptions } from './modules/keyboard'; +import { LazyOptions } from './modules/lazy'; +import { MousewheelOptions } from './modules/mousewheel'; +import { NavigationOptions } from './modules/navigation'; +import { PaginationOptions } from './modules/pagination'; +import { ParallaxOptions } from './modules/parallax'; +import { ScrollbarOptions } from './modules/scrollbar'; +import { ThumbsOptions } from './modules/thumbs'; +import { VirtualOptions } from './modules/virtual'; +import { ZoomOptions } from './modules/zoom'; +import { FreeModeOptions } from './modules/free-mode'; +import { GridOptions } from './modules/grid'; + +import { CSSSelector, SwiperModule } from './shared'; +import { SwiperEvents } from './swiper-events'; + +export interface SwiperOptions { + /** + * Array with Swiper modules + * + * @example + * ```js + * import Swiper, { Navigation, Pagination } from 'swiper'; + * + * const swiper = new Swiper('.swiper', { + * modules: [ Navigation, Pagination ], + * }); + * ``` + */ + modules?: SwiperModule[]; + /** + * Whether Swiper should be initialised automatically when you create an instance. + * If disabled, then you need to init it manually by calling `swiper.init()` + * + * @default true + */ + init?: boolean; + + /** + * Whether Swiper initially enabled. When Swiper is disabled, it will hide all navigation elements and won't respond to any events and interactions + * + * @default true + */ + enabled?: boolean; + + /** + * Swiper will recalculate slides position on window resize (orientationchange) + * + * @default true + */ + updateOnWindowResize?: boolean; + + /** + * When enabled it will use ResizeObserver (if supported by browser) on swiper container to detect container resize (instead of watching for window resize) + * + * @default true + */ + resizeObserver?: boolean; + + /** + * Index number of initial slide. + * + * @default 0 + */ + initialSlide?: number; + + /** + * Can be `'horizontal'` or `'vertical'` (for vertical slider). + * + * @default 'horizontal' + */ + direction?: 'horizontal' | 'vertical'; + + /** + * Duration of transition between slides (in ms) + * + * @default 300 + */ + speed?: number; + + /** + * Enabled this option and plugin will set width/height on swiper wrapper equal to total size of all slides. + * Mostly should be used as compatibility fallback option for browser that don't support flexbox layout well + * + * @default false + */ + setWrapperSize?: boolean; + + /** + * Enabled this option and swiper will be operated as usual except it will not move, real translate values on wrapper will not be set. + * Useful when you may need to create custom slide transition + * + * @default false + */ + virtualTranslate?: boolean; + + /** + * Swiper width (in px). Parameter allows to force Swiper width. + * Useful only if you initialize Swiper when it is hidden and in SSR and Test environments for correct Swiper initialization + * + * @default null + * + * @note Setting this parameter will make Swiper not responsive + */ + width?: number | null; + + /** + * Swiper height (in px). Parameter allows to force Swiper height. + * Useful only if you initialize Swiper when it is hidden and in SSR and Test environments for correct Swiper initialization + * + * @default null + * + * @note Setting this parameter will make Swiper not responsive + */ + height?: number | null; + + /** + * Set to `true` and slider wrapper will adapt its height to the height of the currently active slide + * + * @default false + */ + autoHeight?: boolean; + + /** + * Set to `true` to round values of slides width and height to prevent blurry texts on usual + * resolution screens (if you have such) + * + * @default false + */ + roundLengths?: boolean; + + /** + * Set to `true` on Swiper for correct touch events interception. Use only on + * swipers that use same direction as the parent one + * + * @default false + */ + nested?: boolean; + + /** + * When enabled Swiper will automatically wrap slides with swiper-wrapper element, + * and will create required elements for navigation, pagination and scrollbar + * they are enabled (with their respective params object or with boolean `true`)) + * + * @default false + */ + createElements?: boolean; + + /** + * CSS selector for focusable elements. Swiping will be disabled on such elements if they are "focused" + * + * @default 'input, select, option, textarea, button, video, label' + */ + focusableElements?: string; + + /** + * If enabled (by default) and navigation elements' parameters passed as a string (like `".pagination"`) + * then Swiper will look for such elements through child elements first. + * Applies for pagination, prev/next buttons and scrollbar elements + * + * @default true + */ + uniqueNavElements?: boolean; + + /** + * Transition effect. Can be `'slide'`, `'fade'`, `'cube'`, `'coverflow'`, `'flip'` or `'creative'` + * + * @default 'slide' + */ + effect?: 'slide' | 'fade' | 'cube' | 'coverflow' | 'flip' | 'creative' | 'cards'; + + /** + * Fire Transition/SlideChange/Start/End events on swiper initialization. + * Such events will be fired on initialization in case of your initialSlide is not 0, or you use loop mode + * + * @default true + */ + runCallbacksOnInit?: boolean; + + /** + * When enabled Swiper will be disabled and hide navigation buttons on + * case there are not enough slides for sliding. + * + * @default true + */ + watchOverflow?: boolean; + + /** + * userAgent string. Required for browser/device detection when rendered on server-side + * + * @default null + */ + userAgent?: string | null; + + /** + * Required for active slide detection when rendered on server-side and enabled history + * + * @default null + */ + url?: string | null; + + /** + * Register event handlers + */ + on?: { + [event in keyof SwiperEvents]?: SwiperEvents[event]; + }; + + /** + * Add event listener that will be fired on all events + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * onAny(eventName, ...args) { + * console.log('Event: ', eventName); + * console.log('Event data: ', args); + * } + * }); + * ``` + */ + onAny?(handler: (eventName: string, ...args: any[]) => void): void; + + /** + * When enabled it will use modern CSS Scroll Snap API. + * It doesn't support all of Swiper's features, but potentially should bring a much better performance in simple configurations. + * + * This is what is not supported when it is enabled: + * + * - Cube and Cards effects + * - `speed` parameter may not have no effect + * - All transition start/end related events (use `slideChange` instead) + * - `slidesPerGroup` has limited support + * - `simulateTouch` doesn't have effect and "dragging" with mouse doesn't work + * - `resistance` doesn't have any effect + * - `allowSlidePrev/Next` + * - `swipeHandler` + * - `freeMode` and all relevant features + * + * @default false + */ + cssMode?: boolean; + + // Slides grid + + /** + * Distance between slides in px. + * + * @default 0 + * + * @note If you use "margin" css property to the elements which go into Swiper in which you pass "spaceBetween" into, navigation might not work property. + */ + spaceBetween?: number; + + /** + * Number of slides per view (slides visible at the same time on slider's container). + * @note If you use it with "auto" value and along with `loop: true` then you need to specify `loopedSlides` parameter with amount of slides to loop (duplicate) + * @note `slidesPerView: 'auto'` is currently not compatible with multirow mode, when `grid.rows` > 1 + * + * @default 1 + */ + slidesPerView?: number | 'auto'; + + /** + * Set numbers of slides to define and enable group sliding. Useful to use with slidesPerView > 1 + * + * @default 1 + */ + slidesPerGroup?: number; + + /** + * The parameter works in the following way: If `slidesPerGroupSkip` equals `0` (default), no slides are excluded from grouping, and the resulting behaviour is the same as without this change. + * + * If `slidesPerGroupSkip` is equal or greater than `1` the first X slides are treated as single groups, whereas all following slides are grouped by the `slidesPerGroup` value. + * + * @default 0 + */ + slidesPerGroupSkip?: number; + + /** + * This param intended to be used only with `slidesPerView: 'auto'` and `slidesPerGroup: 1`. When enabled, it will skip all slides in view on `.slideNext()` & `.slidePrev()` methods calls, on Navigation "buttons" clicks and in autoplay. + * + * @default false + */ + slidesPerGroupAuto?: boolean; + + /** + * If `true`, then active slide will be centered, not always on the left side. + * + * @default false + */ + centeredSlides?: boolean; + + /** + * If `true`, then active slide will be centered without adding gaps at the beginning and end of slider. + * Required `centeredSlides: true`. Not intended to be used with `loop` or `pagination` + * + * @default false + */ + centeredSlidesBounds?: boolean; + + /** + * Add (in px) additional slide offset in the beginning of the container (before all slides) + * + * @default 0 + */ + slidesOffsetBefore?: number; + + /** + * Add (in px) additional slide offset in the end of the container (after all slides) + * + * @default 0 + */ + slidesOffsetAfter?: number; + + /** + * Normalize slide index. + * + * @default true + */ + normalizeSlideIndex?: boolean; + + /** + * When enabled it center slides if the amount of slides less than `slidesPerView`. Not intended to be used `loop` mode and `grid.rows` + * + * @default false + */ + centerInsufficientSlides?: boolean; + + /** + * This option may a little improve desktop usability. If `true`, user will see the "grab" cursor when hover on Swiper + * + * @default false + */ + grabCursor?: boolean; + + /** + * Target element to listen touch events on. Can be `'container'` (to listen for touch events on swiper) or `'wrapper'` + * (to listen for touch events on swiper-wrapper) + * + * @default 'wrapper' + */ + touchEventsTarget?: 'container' | 'wrapper'; + + /** + * Touch ratio + * + * @default 1 + */ + touchRatio?: number; + + /** + * Allowable angle (in degrees) to trigger touch move + * + * @default 45 + */ + touchAngle?: number; + + /** + * If `true`, Swiper will accept mouse events like touch events (click and drag to change slides) + * + * @default true + */ + simulateTouch?: boolean; + + /** + * Set to `false` if you want to disable short swipes + * + * @default true + */ + shortSwipes?: boolean; + + /** + * Set to `false` if you want to disable long swipes + * + * @default true + */ + longSwipes?: boolean; + + /** + * Ratio to trigger swipe to next/previous slide during long swipes + * + * @default 0.5 + */ + longSwipesRatio?: number; + + /** + * Minimal duration (in ms) to trigger swipe to next/previous slide during long swipes + * + * @default 300 + */ + longSwipesMs?: number; + + /** + * If disabled, then slider will be animated only when you release it, it will not move while you hold your finger on it + * + * @default true + */ + followFinger?: boolean; + + /** + * If `false`, then the only way to switch the slide is use of external API functions like slidePrev or slideNext + * + * @default true + */ + allowTouchMove?: boolean; + + /** + * Threshold value in px. If "touch distance" will be lower than this value then swiper will not move + * + * @default 0 + */ + threshold?: number; + + /** + * If disabled, `touchstart` (`pointerdown`) event won't be prevented + * + * @default true + */ + touchStartPreventDefault?: boolean; + + /** + * Force to always prevent default for `touchstart` (`pointerdown`) event + * + * @default false + */ + touchStartForcePreventDefault?: boolean; + + /** + * If enabled, then propagation of "touchmove" will be stopped + * + * @default false + */ + touchMoveStopPropagation?: boolean; + + /** + * Enable to release Swiper events for swipe-back work in app. If set to `'prevent'` then it will prevent system swipe-back navigation instead + * + * @default false + */ + edgeSwipeDetection?: boolean | string; + + /** + * Area (in px) from left edge of the screen to release touch events for swipe-back in app + * + * @default 20 + */ + edgeSwipeThreshold?: number; + + /** + * Enable to release touch events on slider edge position (beginning, end) to allow for further page scrolling + * + * @default false + */ + touchReleaseOnEdges?: boolean; + + /** + * Passive event listeners will be used by default where possible to improve scrolling performance on mobile devices. + * But if you need to use `e.preventDefault` and you have conflict with it, then you should disable this parameter + * + * @default true + */ + passiveListeners?: boolean; + + // Touch Resistance + + /** + * Set to `false` if you want to disable resistant bounds + * + * @default true + */ + resistance?: boolean; + + /** + * This option allows you to control resistance ratio + * + * @default 0.85 + */ + resistanceRatio?: number; + + // Swiping / No swiping + /** + * When enabled it won't allow to change slides by swiping or navigation/pagination buttons during transition + * + * @default false + */ + preventInteractionOnTransition?: boolean; + + /** + * Set to `false` to disable swiping to previous slide direction (to left or top) + * + * @default true + */ + allowSlidePrev?: boolean; + + /** + * Set to `false` to disable swiping to next slide direction (to right or bottom) + * + * @default true + */ + allowSlideNext?: boolean; + + /** + * Enable/disable swiping on elements matched to class specified in `noSwipingClass` + * + * @default true + */ + noSwiping?: boolean; + + /** + * Specify `noSwiping`'s element css class + * + * @default 'swiper-no-swiping' + */ + noSwipingClass?: string; + + /** + * Can be used instead of `noSwipingClass` to specify elements to disable swiping on. + * For example `'input'` will disable swiping on all inputs + * + * @default + */ + noSwipingSelector?: string; + + /** + * String with CSS selector or HTML element of the container with pagination that will work as only available handler for swiping + * + * @default null + */ + swipeHandler?: CSSSelector | HTMLElement | null; + + // Clicks + /** + * Set to `true` to prevent accidental unwanted clicks on links during swiping + * + * @default true + */ + preventClicks?: boolean; + + /** + * Set to `true` to stop clicks event propagation on links during swiping + * + * @default true + */ + preventClicksPropagation?: boolean; + + /** + * Set to `true` and click on any slide will produce transition to this slide + * + * @default false + */ + slideToClickedSlide?: boolean; + + // Progress + /** + * Enable this feature to calculate each slides progress and visibility (slides in viewport will have additional visible class) + * + * @default false + */ + watchSlidesProgress?: boolean; + + // Images + /** + * When enabled Swiper will force to load all images + * + * @default true + */ + preloadImages?: boolean; + + /** + * When enabled Swiper will be reinitialized after all inner images ( tags) are loaded. Required `preloadImages: true` + * + * @default true + */ + updateOnImagesReady?: boolean; + + /** + * Set to `true` to enable continuous loop mode + * + * Because of nature of how the loop mode works, it will add duplicated slides. Such duplicated slides will have additional classes: + * - `swiper-slide-duplicate` - represents duplicated slide + * - `swiper-slide-duplicate-active` - represents slide duplicated to the currently active slide + * - `swiper-slide-duplicate-next` - represents slide duplicated to the slide next to active + * - `swiper-slide-duplicate-prev` - represents slide duplicated to the slide previous to active + * + * @default false + * + * @note If you use it along with `slidesPerView: 'auto'` then you need to specify `loopedSlides` parameter with amount of slides to loop (duplicate) + */ + loop?: boolean; + + /** + * Addition number of slides that will be cloned after creating of loop + * + * @default 0 + */ + loopAdditionalSlides?: number; + + /** + * If you use `slidesPerView:'auto'` with loop mode you should tell to Swiper how many slides it should loop (duplicate) using this parameter + * + * @default null + */ + loopedSlides?: number | null; + + /** + * Enable and loop mode will fill groups with insufficient number of slides with blank slides. Good to be used with `slidesPerGroup` parameter + * + * @default false + */ + loopFillGroupWithBlank?: boolean; + /** + * When enabled it prevents Swiper slide prev/next transitions when transitions is already in progress (has effect when `loop` enabled) + * + * @default true + */ + loopPreventsSlide?: boolean; + + /** + * Allows to set different parameter for different responsive breakpoints (screen sizes). Not all parameters can be changed in breakpoints, only those which are not required different layout and logic, like `slidesPerView`, `slidesPerGroup`, `spaceBetween`, `grid.rows`. Such parameters like `loop` and `effect` won't work + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * // Default parameters + * slidesPerView: 1, + * spaceBetween: 10, + * // Responsive breakpoints + * breakpoints: { + * // when window width is >= 320px + * 320: { + * slidesPerView: 2, + * spaceBetween: 20 + * }, + * // when window width is >= 480px + * 480: { + * slidesPerView: 3, + * spaceBetween: 30 + * }, + * // when window width is >= 640px + * 640: { + * slidesPerView: 4, + * spaceBetween: 40 + * } + * } + * }) + * ``` + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * slidesPerView: 1, + * spaceBetween: 10, + * // using "ratio" endpoints + * breakpoints: { + * '@0.75': { + * slidesPerView: 2, + * spaceBetween: 20, + * }, + * '@1.00': { + * slidesPerView: 3, + * spaceBetween: 40, + * }, + * '@1.50': { + * slidesPerView: 4, + * spaceBetween: 50, + * }, + * } + * }); + * ``` + */ + breakpoints?: { + [width: number]: SwiperOptions; + [ratio: string]: SwiperOptions; + }; + + /** + * Base for breakpoints (beta). Can be `window` or `container`. If set to `window` (by default) then breakpoint keys mean window width. If set to `container` then breakpoint keys treated as swiper container width + * + * @default 'window' + * + * @note Currently in beta and not supported by Swiper Angular, React, Svelte and Vue components + */ + breakpointsBase?: string; + + // Observer + /** + * Set to `true` to enable Mutation Observer on Swiper and its elements. In this case Swiper will be updated (reinitialized) each time if you change its style (like hide/show) or modify its child elements (like adding/removing slides) + * + * @default false + */ + observer?: boolean; + /** + * Set to `true` if you also need to watch Mutations for Swiper slide children elements + * + * @default false + */ + observeSlideChildren?: boolean; + /** + * Set to `true` if you also need to watch Mutations for Swiper parent elements + * + * @default false + */ + observeParents?: boolean; + + // Namespace + /** + * The beginning of the modifier CSS class that can be added to swiper container depending on different parameters + * + * @default 'swiper-' + */ + containerModifierClass?: string; + + /** + * CSS class name of slide + * + * @default 'swiper-slide' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue components + */ + slideClass?: string; + + /** + * CSS class name of currently active slide + * + * @default 'swiper-slide-active' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue components + */ + slideActiveClass?: string; + + /** + * CSS class name of duplicated slide which represents the currently active slide + * + * @default 'swiper-slide-duplicate-active' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue components + */ + slideDuplicateActiveClass?: string; + + /** + * CSS class name of currently visible slide + * + * @default 'swiper-slide-visible' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue + */ + slideVisibleClass?: string; + + /** + * CSS class name of slide duplicated by loop mode + * + * @default 'swiper-slide-duplicate' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue + */ + slideDuplicateClass?: string; + + /** + * CSS class name of slide which is right after currently active slide + * + * @default 'swiper-slide-next' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue + */ + slideNextClass?: string; + + /** + * CSS class name of duplicated slide which represents the slide next to active slide + * + * @default 'swiper-slide-duplicate-next' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue + */ + slideDuplicateNextClass?: string; + + /** + * CSS class name of slide which is right before currently active slide + * + * @default 'swiper-slide-prev' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue + */ + slidePrevClass?: string; + + /** + * CSS class name of duplicated slide which represents the slide previous to active slide + * + * @default 'swiper-slide-duplicate-prev' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue + */ + slideDuplicatePrevClass?: string; + + /** + * CSS class name of blank slide append to fill groups in loop mode when `loopFillGroupWithBlank` is also enabled + * + * @default 'swiper-slide-invisible-blank' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue + */ + slideBlankClass?: string; + + /** + * CSS class name of slides' wrapper + * + * @default 'swiper-wrapper' + * + * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes + * + * @note Not supported in Swiper Angular/React/Svelte/Vue + * + */ + wrapperClass?: string; + + /** + * Object with a11y parameters or boolean `true` to enable with default settings. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * a11y: { + * prevSlideMessage: 'Previous slide', + * nextSlideMessage: 'Next slide', + * }, + * }); + * ``` + */ + a11y?: A11yOptions; + + /** + * Object with autoplay parameters or boolean `true` to enable with default settings + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * autoplay: { + * delay: 5000, + * }, + *}); + * ``` + */ + autoplay?: AutoplayOptions | boolean; + + /** + * Object with controller parameters or boolean `true` to enable with default settings + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * controller: { + * inverse: true, + * }, + * }); + * ``` + */ + controller?: ControllerOptions; + + /** + * Object with Coverflow-effect parameters. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * effect: 'coverflow', + * coverflowEffect: { + * rotate: 30, + * slideShadows: false, + * }, + * }); + * ``` + */ + coverflowEffect?: CoverflowEffectOptions; + + /** + * Object with Cube-effect parameters + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * effect: 'cube', + * cubeEffect: { + * slideShadows: false, + * }, + * }); + * ``` + */ + cubeEffect?: CubeEffectOptions; + + /** + * Object with Fade-effect parameters + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * effect: 'fade', + * fadeEffect: { + * crossFade: true + * }, + * }); + * ``` + */ + fadeEffect?: FadeEffectOptions; + + /** + * Object with Flip-effect parameters + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * effect: 'flip', + * flipEffect: { + * slideShadows: false, + * }, + * }); + * ``` + */ + flipEffect?: FlipEffectOptions; + + /** + * Object with Creative-effect parameters + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * effect: 'creative', + * creativeEffect: { + * prev: { + * // will set `translateZ(-400px)` on previous slides + * translate: [0, 0, -400], + * }, + * next: { + * // will set `translateX(100%)` on next slides + * translate: ['100%', 0, 0], + * }, + * }, + * }); + * ``` + */ + creativeEffect?: CreativeEffectOptions; + + /** + * Object with Cards-effect parameters + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * effect: 'cards', + * cardsEffect: { + * // ... + * }, + * }); + * ``` + */ + cardsEffect?: CardsEffectOptions; + + /** + * Enables hash url navigation to for slides. + * Object with hash navigation parameters or boolean `true` to enable with default settings + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * hashNavigation: { + * replaceState: true, + * }, + * }); + * ``` + */ + hashNavigation?: HashNavigationOptions | boolean; + + /** + * Enables history push state where every slide will have its own url. In this parameter you have to specify main slides url like `"slides"` and specify every slide url using `data-history` attribute. + * + * Object with history navigation parameters or boolean `true` to enable with default settings + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * history: { + * replaceState: true, + * }, + * }); + * ``` + * + * @example + * ```html + * + *
+ * ``` + */ + history?: HistoryOptions | boolean; + + /** + * Enables navigation through slides using keyboard. Object with keyboard parameters or boolean `true` to enable with default settings + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * keyboard: { + * enabled: true, + * onlyInViewport: false, + * }, + * }); + * ``` + */ + keyboard?: KeyboardOptions | boolean; + + /** + * Enables images lazy loading. Object with lazy loading parameters or boolean `true` to enable with default settings + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * lazy: { + * loadPrevNext: true, + * }, + * }); + * ``` + */ + lazy?: LazyOptions | boolean; + + /** + * Enables navigation through slides using mouse wheel. Object with mousewheel parameters or boolean `true` to enable with default settings + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * mousewheel: { + * invert: true, + * }, + * }); + * ``` + */ + mousewheel?: MousewheelOptions | boolean; + + /** + * Object with navigation parameters or boolean `true` to enable with default settings. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * navigation: { + * nextEl: '.swiper-button-next', + * prevEl: '.swiper-button-prev', + * }, + * }); + * ``` + */ + navigation?: NavigationOptions | boolean; + + /** + * Object with pagination parameters or boolean `true` to enable with default settings. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * pagination: { + * el: '.swiper-pagination', + * type: 'bullets', + * }, + * }); + * ``` + */ + pagination?: PaginationOptions | boolean; + + /** + * Object with parallax parameters or boolean `true` to enable with default settings. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * parallax: true, + * }); + * ``` + */ + parallax?: ParallaxOptions | boolean; + + /** + * Object with scrollbar parameters or boolean `true` to enable with default settings. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * scrollbar: { + * el: '.swiper-scrollbar', + * draggable: true, + * }, + * }); + * ``` + */ + scrollbar?: ScrollbarOptions | boolean; + + /** + * Object with thumbs component parameters + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * ... + * thumbs: { + * swiper: thumbsSwiper + * } + * }); + * ``` + */ + thumbs?: ThumbsOptions; + + /** + * Enables virtual slides functionality. Object with virtual slides parameters or boolean `true` to enable with default settings. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * virtual: { + * slides: ['Slide 1', 'Slide 2', 'Slide 3', 'Slide 4', 'Slide 5'], + * }, + * }); + * ``` + */ + virtual?: VirtualOptions | boolean; + + /** + * Enables zooming functionality. Object with zoom parameters or boolean `true` to enable with default settings + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * zoom: { + * maxRatio: 5, + * }, + * }); + * ``` + */ + zoom?: ZoomOptions | boolean; + + /** + * Enables free mode functionality. Object with free mode parameters or boolean `true` to enable with default settings. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * freeMode: true, + * }); + * + * const swiper = new Swiper('.swiper', { + * freeMode: { + * enabled: true, + * sticky: true, + * }, + * }); + * ``` + */ + freeMode?: FreeModeOptions | boolean; + + /** + * Object with grid parameters to enable "multirow" slider. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * grid: { + * rows: 2, + * }, + * }); + * ``` + */ + grid?: GridOptions; + + /** + * !INTERNAL When enabled will emit "_containerClasses" and "_slideClass" events + */ + _emitClasses?: boolean; +} diff --git a/src/main/resources/static/assets/js/swiper/vue/get-changed-params.js b/src/main/resources/static/assets/js/swiper/vue/get-changed-params.js new file mode 100644 index 0000000..22dacd3 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/get-changed-params.js @@ -0,0 +1,43 @@ +import { paramsList } from './params-list.js'; +import { isObject } from './utils.js'; + +function getChangedParams(swiperParams, oldParams, children, oldChildren) { + const keys = []; + if (!oldParams) return keys; + + const addKey = key => { + if (keys.indexOf(key) < 0) keys.push(key); + }; + + const oldChildrenKeys = oldChildren.map(child => child.props && child.props.key); + const childrenKeys = children.map(child => child.props && child.props.key); + if (oldChildrenKeys.join('') !== childrenKeys.join('')) keys.push('children'); + if (oldChildren.length !== children.length) keys.push('children'); + const watchParams = paramsList.filter(key => key[0] === '_').map(key => key.replace(/_/, '')); + watchParams.forEach(key => { + if (key in swiperParams && key in oldParams) { + if (isObject(swiperParams[key]) && isObject(oldParams[key])) { + const newKeys = Object.keys(swiperParams[key]); + const oldKeys = Object.keys(oldParams[key]); + + if (newKeys.length !== oldKeys.length) { + addKey(key); + } else { + newKeys.forEach(newKey => { + if (swiperParams[key][newKey] !== oldParams[key][newKey]) { + addKey(key); + } + }); + oldKeys.forEach(oldKey => { + if (swiperParams[key][oldKey] !== oldParams[key][oldKey]) addKey(key); + }); + } + } else if (swiperParams[key] !== oldParams[key]) { + addKey(key); + } + } + }); + return keys; +} + +export { getChangedParams }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/get-children.js b/src/main/resources/static/assets/js/swiper/vue/get-children.js new file mode 100644 index 0000000..f09d387 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/get-children.js @@ -0,0 +1,41 @@ +function getChildren(originalSlots = {}, slidesRef, oldSlidesRef) { + const slides = []; + const slots = { + 'container-start': [], + 'container-end': [], + 'wrapper-start': [], + 'wrapper-end': [] + }; + + const getSlidesFromElements = (els, slotName) => { + if (!Array.isArray(els)) { + return; + } + + els.forEach(vnode => { + const isFragment = typeof vnode.type === 'symbol'; + if (slotName === 'default') slotName = 'container-end'; + + if (isFragment && vnode.children) { + getSlidesFromElements(vnode.children, 'default'); + } else if (vnode.type && (vnode.type.name === 'SwiperSlide' || vnode.type.name === 'AsyncComponentWrapper')) { + slides.push(vnode); + } else if (slots[slotName]) { + slots[slotName].push(vnode); + } + }); + }; + + Object.keys(originalSlots).forEach(slotName => { + const els = originalSlots[slotName](); + getSlidesFromElements(els, slotName); + }); + oldSlidesRef.value = slidesRef.value; + slidesRef.value = slides; + return { + slides, + slots + }; +} + +export { getChildren }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/get-params.js b/src/main/resources/static/assets/js/swiper/vue/get-params.js new file mode 100644 index 0000000..118f72f --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/get-params.js @@ -0,0 +1,48 @@ +import Swiper from 'swiper'; +import { isObject, extend } from './utils.js'; +import { paramsList } from './params-list.js'; + +function getParams(obj = {}) { + const params = { + on: {} + }; + const passedParams = {}; + extend(params, Swiper.defaults); + extend(params, Swiper.extendedDefaults); + params._emitClasses = true; + params.init = false; + const rest = {}; + const allowedParams = paramsList.map(key => key.replace(/_/, '')); // Prevent empty Object.keys(obj) array on ios. + + const plainObj = Object.assign({}, obj); + Object.keys(plainObj).forEach(key => { + if (typeof obj[key] === 'undefined') return; + + if (allowedParams.indexOf(key) >= 0) { + if (isObject(obj[key])) { + params[key] = {}; + passedParams[key] = {}; + extend(params[key], obj[key]); + extend(passedParams[key], obj[key]); + } else { + params[key] = obj[key]; + passedParams[key] = obj[key]; + } + } else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === 'function') { + params.on[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key]; + } else { + rest[key] = obj[key]; + } + }); + ['navigation', 'pagination', 'scrollbar'].forEach(key => { + if (params[key] === true) params[key] = {}; + if (params[key] === false) delete params[key]; + }); + return { + params, + passedParams, + rest + }; +} + +export { getParams }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/init-swiper.js b/src/main/resources/static/assets/js/swiper/vue/init-swiper.js new file mode 100644 index 0000000..aaf5568 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/init-swiper.js @@ -0,0 +1,36 @@ +import Swiper from 'swiper'; +import { needsNavigation, needsPagination, needsScrollbar } from './utils.js'; + +function initSwiper(swiperParams) { + return new Swiper(swiperParams); +} + +function mountSwiper({ + el, + nextEl, + prevEl, + paginationEl, + scrollbarEl, + swiper +}, swiperParams) { + if (needsNavigation(swiperParams) && nextEl && prevEl) { + swiper.params.navigation.nextEl = nextEl; + swiper.originalParams.navigation.nextEl = nextEl; + swiper.params.navigation.prevEl = prevEl; + swiper.originalParams.navigation.prevEl = prevEl; + } + + if (needsPagination(swiperParams) && paginationEl) { + swiper.params.pagination.el = paginationEl; + swiper.originalParams.pagination.el = paginationEl; + } + + if (needsScrollbar(swiperParams) && scrollbarEl) { + swiper.params.scrollbar.el = scrollbarEl; + swiper.originalParams.scrollbar.el = scrollbarEl; + } + + swiper.init(el); +} + +export { initSwiper, mountSwiper }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/loop.js b/src/main/resources/static/assets/js/swiper/vue/loop.js new file mode 100644 index 0000000..591a07a --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/loop.js @@ -0,0 +1,79 @@ +import { h } from 'vue'; +import Swiper from 'swiper'; + +function calcLoopedSlides(slides, swiperParams) { + let slidesPerViewParams = swiperParams.slidesPerView; + + if (swiperParams.breakpoints) { + const breakpoint = Swiper.prototype.getBreakpoint(swiperParams.breakpoints); + const breakpointOnlyParams = breakpoint in swiperParams.breakpoints ? swiperParams.breakpoints[breakpoint] : undefined; + + if (breakpointOnlyParams && breakpointOnlyParams.slidesPerView) { + slidesPerViewParams = breakpointOnlyParams.slidesPerView; + } + } + + let loopedSlides = Math.ceil(parseFloat(swiperParams.loopedSlides || slidesPerViewParams, 10)); + loopedSlides += swiperParams.loopAdditionalSlides; + + if (loopedSlides > slides.length) { + loopedSlides = slides.length; + } + + return loopedSlides; +} + +function renderLoop(swiperRef, slides, swiperParams) { + const modifiedSlides = slides.map((child, index) => { + if (!child.props) child.props = {}; + child.props.swiperRef = swiperRef; + child.props['data-swiper-slide-index'] = index; + return child; + }); + + function duplicateSlide(child, index, position) { + if (!child.props) child.props = {}; + return h(child.type, { ...child.props, + key: `${child.key}-duplicate-${index}-${position}`, + class: `${child.props.className || ''} ${swiperParams.slideDuplicateClass} ${child.props.class || ''}` + }, child.children); + } + + if (swiperParams.loopFillGroupWithBlank) { + const blankSlidesNum = swiperParams.slidesPerGroup - modifiedSlides.length % swiperParams.slidesPerGroup; + + if (blankSlidesNum !== swiperParams.slidesPerGroup) { + for (let i = 0; i < blankSlidesNum; i += 1) { + const blankSlide = h('div', { + class: `${swiperParams.slideClass} ${swiperParams.slideBlankClass}` + }); + modifiedSlides.push(blankSlide); + } + } + } + + if (swiperParams.slidesPerView === 'auto' && !swiperParams.loopedSlides) { + swiperParams.loopedSlides = modifiedSlides.length; + } + + const loopedSlides = calcLoopedSlides(modifiedSlides, swiperParams); + const prependSlides = []; + const appendSlides = []; + modifiedSlides.forEach((child, index) => { + if (index < loopedSlides) { + appendSlides.push(duplicateSlide(child, index, 'prepend')); + } + + if (index < modifiedSlides.length && index >= modifiedSlides.length - loopedSlides) { + prependSlides.push(duplicateSlide(child, index, 'append')); + } + }); + + if (swiperRef.value) { + swiperRef.value.loopedSlides = loopedSlides; + } + + return [...prependSlides, ...modifiedSlides, ...appendSlides]; +} + +export { calcLoopedSlides, renderLoop }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/params-list.js b/src/main/resources/static/assets/js/swiper/vue/params-list.js new file mode 100644 index 0000000..2d25f8f --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/params-list.js @@ -0,0 +1,4 @@ +/* underscore in name -> watch for changes */ +const paramsList = ['modules', 'init', '_direction', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', '_spaceBetween', '_slidesPerView', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_preloadImages', 'updateOnImagesReady', '_loop', '_loopAdditionalSlides', '_loopedSlides', '_loopFillGroupWithBlank', 'loopPreventsSlide', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideBlankClass', 'slideActiveClass', 'slideDuplicateActiveClass', 'slideVisibleClass', 'slideDuplicateClass', 'slideNextClass', 'slideDuplicateNextClass', 'slidePrevClass', 'slideDuplicatePrevClass', 'wrapperClass', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren', // modules +'a11y', 'autoplay', '_controller', 'coverflowEffect', 'cubeEffect', 'fadeEffect', 'flipEffect', 'creativeEffect', 'cardsEffect', 'hashNavigation', 'history', 'keyboard', 'lazy', 'mousewheel', '_navigation', '_pagination', 'parallax', '_scrollbar', '_thumbs', 'virtual', 'zoom']; +export { paramsList }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/swiper-slide.js b/src/main/resources/static/assets/js/swiper/vue/swiper-slide.js new file mode 100644 index 0000000..a9e9e95 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/swiper-slide.js @@ -0,0 +1,83 @@ +import { h, ref, onMounted, onUpdated, onBeforeUpdate, computed, onBeforeUnmount } from 'vue'; +import { uniqueClasses } from './utils.js'; +const SwiperSlide = { + name: 'SwiperSlide', + props: { + tag: { + type: String, + default: 'div' + }, + swiperRef: { + type: Object, + required: false + }, + zoom: { + type: Boolean, + default: undefined + }, + virtualIndex: { + type: [String, Number], + default: undefined + } + }, + + setup(props, { + slots + }) { + let eventAttached = false; + const { + swiperRef + } = props; + const slideElRef = ref(null); + const slideClasses = ref('swiper-slide'); + + function updateClasses(swiper, el, classNames) { + if (el === slideElRef.value) { + slideClasses.value = classNames; + } + } + + onMounted(() => { + if (!swiperRef.value) return; + swiperRef.value.on('_slideClass', updateClasses); + eventAttached = true; + }); + onBeforeUpdate(() => { + if (eventAttached || !swiperRef || !swiperRef.value) return; + swiperRef.value.on('_slideClass', updateClasses); + eventAttached = true; + }); + onUpdated(() => { + if (!slideElRef.value || !swiperRef || !swiperRef.value) return; + + if (swiperRef.value.destroyed) { + if (slideClasses.value !== 'swiper-slide') { + slideClasses.value = 'swiper-slide'; + } + } + }); + onBeforeUnmount(() => { + if (!swiperRef || !swiperRef.value) return; + swiperRef.value.off('_slideClass', updateClasses); + }); + const slideData = computed(() => ({ + isActive: slideClasses.value.indexOf('swiper-slide-active') >= 0 || slideClasses.value.indexOf('swiper-slide-duplicate-active') >= 0, + isVisible: slideClasses.value.indexOf('swiper-slide-visible') >= 0, + isDuplicate: slideClasses.value.indexOf('swiper-slide-duplicate') >= 0, + isPrev: slideClasses.value.indexOf('swiper-slide-prev') >= 0 || slideClasses.value.indexOf('swiper-slide-duplicate-prev') >= 0, + isNext: slideClasses.value.indexOf('swiper-slide-next') >= 0 || slideClasses.value.indexOf('swiper-slide-duplicate-next') >= 0 + })); + return () => { + return h(props.tag, { + class: uniqueClasses(`${slideClasses.value}`), + ref: slideElRef, + 'data-swiper-slide-index': props.virtualIndex + }, props.zoom ? h('div', { + class: 'swiper-zoom-container', + 'data-swiper-zoom': typeof props.zoom === 'number' ? props.zoom : undefined + }, slots.default && slots.default(slideData.value)) : slots.default && slots.default(slideData.value)); + }; + } + +}; +export { SwiperSlide }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/swiper-vue.d.ts b/src/main/resources/static/assets/js/swiper/vue/swiper-vue.d.ts new file mode 100644 index 0000000..9cb4891 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/swiper-vue.d.ts @@ -0,0 +1,859 @@ +import { + A11yOptions, + AutoplayOptions, + ControllerOptions, + CoverflowEffectOptions, + CubeEffectOptions, + FadeEffectOptions, + FlipEffectOptions, + CreativeEffectOptions, + CardsEffectOptions, + HashNavigationOptions, + HistoryOptions, + KeyboardOptions, + LazyOptions, + MousewheelOptions, + NavigationOptions, + PaginationOptions, + ParallaxOptions, + ScrollbarOptions, + ThumbsOptions, + VirtualOptions, + ZoomOptions, + FreeModeOptions, + GridOptions, +} from '../types'; +import { ComponentOptionsMixin, DefineComponent, PropType } from 'vue'; +import { SwiperOptions, Swiper as SwiperClass } from '../types'; + +declare const Swiper: DefineComponent< + { + tag: { + type: StringConstructor; + default: string; + }; + wrapperTag: { + type: StringConstructor; + default: string; + }; + modules: { + type: ArrayConstructor; + default: undefined; + }; + init: { + type: BooleanConstructor; + default: undefined; + }; + direction: { + type: PropType; + default: SwiperOptions['direction']; + }; + touchEventsTarget: { + type: PropType; + default: undefined; + }; + initialSlide: { + type: NumberConstructor; + default: undefined; + }; + speed: { type: NumberConstructor; default: undefined }; + cssMode: { type: BooleanConstructor; default: undefined }; + updateOnWindowResize: { + type: BooleanConstructor; + default: undefined; + }; + resizeObserver: { + type: BooleanConstructor; + default: undefined; + }; + nested: { type: BooleanConstructor; default: undefined }; + focusableElements: { + type: StringConstructor; + default: undefined; + }; + width: { type: NumberConstructor; default: undefined }; + height: { type: NumberConstructor; default: undefined }; + preventInteractionOnTransition: { + type: BooleanConstructor; + default: undefined; + }; + userAgent: { type: StringConstructor; default: undefined }; + url: { type: StringConstructor; default: undefined }; + edgeSwipeDetection: { + type: BooleanConstructor | StringConstructor; + default: undefined; + }; + edgeSwipeThreshold: { + type: NumberConstructor; + default: undefined; + }; + autoHeight: { + type: BooleanConstructor; + default: undefined; + }; + setWrapperSize: { + type: BooleanConstructor; + default: undefined; + }; + virtualTranslate: { + type: BooleanConstructor; + default: undefined; + }; + effect: { + type: PropType; + default: undefined; + }; + breakpoints: { + type: PropType; + default: undefined; + }; + spaceBetween: { + type: NumberConstructor; + default: undefined; + }; + slidesPerView: { + type: PropType; + default: undefined; + }; + slidesPerGroup: { + type: NumberConstructor; + default: undefined; + }; + slidesPerGroupSkip: { + type: NumberConstructor; + default: undefined; + }; + slidesPerGroupAuto: { + type: BooleanConstructor; + default: undefined; + }; + centeredSlides: { + type: BooleanConstructor; + default: undefined; + }; + centeredSlidesBounds: { + type: BooleanConstructor; + default: undefined; + }; + slidesOffsetBefore: { + type: NumberConstructor; + default: undefined; + }; + slidesOffsetAfter: { + type: NumberConstructor; + default: undefined; + }; + normalizeSlideIndex: { + type: BooleanConstructor; + default: undefined; + }; + centerInsufficientSlides: { + type: BooleanConstructor; + default: undefined; + }; + watchOverflow: { + type: BooleanConstructor; + default: undefined; + }; + roundLengths: { + type: BooleanConstructor; + default: undefined; + }; + touchRatio: { + type: NumberConstructor; + default: undefined; + }; + touchAngle: { + type: NumberConstructor; + default: undefined; + }; + simulateTouch: { + type: BooleanConstructor; + default: undefined; + }; + shortSwipes: { + type: BooleanConstructor; + default: undefined; + }; + longSwipes: { + type: BooleanConstructor; + default: undefined; + }; + longSwipesRatio: { + type: NumberConstructor; + default: undefined; + }; + longSwipesMs: { + type: NumberConstructor; + default: undefined; + }; + followFinger: { + type: BooleanConstructor; + default: undefined; + }; + allowTouchMove: { + type: BooleanConstructor; + default: undefined; + }; + threshold: { type: NumberConstructor; default: undefined }; + touchMoveStopPropagation: { + type: BooleanConstructor; + default: undefined; + }; + touchStartPreventDefault: { + type: BooleanConstructor; + default: undefined; + }; + touchStartForcePreventDefault: { + type: BooleanConstructor; + default: undefined; + }; + touchReleaseOnEdges: { + type: BooleanConstructor; + default: undefined; + }; + uniqueNavElements: { + type: BooleanConstructor; + default: undefined; + }; + resistance: { + type: BooleanConstructor; + default: undefined; + }; + resistanceRatio: { + type: NumberConstructor; + default: undefined; + }; + watchSlidesProgress: { + type: BooleanConstructor; + default: undefined; + }; + grabCursor: { + type: BooleanConstructor; + default: undefined; + }; + preventClicks: { + type: BooleanConstructor; + default: undefined; + }; + preventClicksPropagation: { + type: BooleanConstructor; + default: undefined; + }; + slideToClickedSlide: { + type: BooleanConstructor; + default: undefined; + }; + preloadImages: { + type: BooleanConstructor; + default: undefined; + }; + updateOnImagesReady: { + type: BooleanConstructor; + default: undefined; + }; + loop: { type: BooleanConstructor; default: undefined }; + loopAdditionalSlides: { + type: NumberConstructor; + default: undefined; + }; + loopedSlides: { + type: NumberConstructor; + default: undefined; + }; + loopFillGroupWithBlank: { + type: BooleanConstructor; + default: undefined; + }; + loopPreventsSlide: { + type: BooleanConstructor; + default: undefined; + }; + allowSlidePrev: { + type: BooleanConstructor; + default: undefined; + }; + allowSlideNext: { + type: BooleanConstructor; + default: undefined; + }; + swipeHandler: { + type: BooleanConstructor; + default: undefined; + }; + noSwiping: { + type: BooleanConstructor; + default: undefined; + }; + noSwipingClass: { + type: StringConstructor; + default: undefined; + }; + noSwipingSelector: { + type: StringConstructor; + default: undefined; + }; + passiveListeners: { + type: BooleanConstructor; + default: undefined; + }; + containerModifierClass: { + type: StringConstructor; + default: undefined; + }; + slideClass: { + type: StringConstructor; + default: undefined; + }; + slideBlankClass: { + type: StringConstructor; + default: undefined; + }; + slideActiveClass: { + type: StringConstructor; + default: undefined; + }; + slideDuplicateActiveClass: { + type: StringConstructor; + default: undefined; + }; + slideVisibleClass: { + type: StringConstructor; + default: undefined; + }; + slideDuplicateClass: { + type: StringConstructor; + default: undefined; + }; + slideNextClass: { + type: StringConstructor; + default: undefined; + }; + slideDuplicateNextClass: { + type: StringConstructor; + default: undefined; + }; + slidePrevClass: { + type: StringConstructor; + default: undefined; + }; + slideDuplicatePrevClass: { + type: StringConstructor; + default: undefined; + }; + wrapperClass: { + type: StringConstructor; + default: undefined; + }; + runCallbacksOnInit: { + type: BooleanConstructor; + default: undefined; + }; + observer: { type: BooleanConstructor; default: undefined }; + observeParents: { + type: BooleanConstructor; + default: undefined; + }; + observeSlideChildren: { + type: BooleanConstructor; + default: undefined; + }; + a11y: { + type: PropType; + default: undefined; + }; + autoplay: { + type: PropType; + default: undefined; + }; + controller: { + type: PropType; + default: undefined; + }; + coverflowEffect: { + type: PropType; + default: undefined; + }; + cubeEffect: { + type: PropType; + default: undefined; + }; + fadeEffect: { + type: PropType; + default: undefined; + }; + flipEffect: { + type: PropType; + default: undefined; + }; + creativeEffect: { + type: PropType; + default: undefined; + }; + cardsEffect: { + type: PropType; + default: undefined; + }; + hashNavigation: { + type: PropType; + default: undefined; + }; + history: { + type: PropType; + default: undefined; + }; + keyboard: { + type: PropType; + default: undefined; + }; + lazy: { + type: PropType; + default: undefined; + }; + mousewheel: { + type: PropType; + default: undefined; + }; + navigation: { + type: PropType; + default: undefined; + }; + pagination: { + type: PropType; + default: undefined; + }; + parallax: { + type: PropType; + default: undefined; + }; + scrollbar: { + type: PropType; + default: undefined; + }; + thumbs: { type: PropType; default: undefined }; + virtual: { + type: PropType; + default: undefined; + }; + zoom: { + type: PropType; + default: undefined; + }; + freeMode: { + type: PropType; + default: undefined; + }; + grid: { + type: PropType; + default: undefined; + }; + }, + () => JSX.Element, + unknown, + {}, + {}, + ComponentOptionsMixin, + ComponentOptionsMixin, + { + swiper: (swiper: SwiperClass) => void; + /** + * Event will be fired in when autoplay started + */ + autoplayStart: (swiper: SwiperClass) => void; + /** + * Event will be fired when autoplay stopped + */ + autoplayStop: (swiper: SwiperClass) => void; + /** + * Event will be fired when slide changed with autoplay + */ + autoplay: (swiper: SwiperClass) => void;/** + * Event will be fired on window hash change + */ + hashChange: (swiper: SwiperClass) => void; + /** + * Event will be fired when swiper updates the hash + */ + hashSet: (swiper: SwiperClass) => void;/** + * Event will be fired on mousewheel scroll + */ + scroll: (swiper: SwiperClass, event: WheelEvent) => void;/** + * Event will be fired in the beginning of lazy loading of image + */ + lazyImageLoad: (swiper: SwiperClass, slideEl: HTMLElement, imageEl: HTMLElement) => void; + /** + * Event will be fired when lazy loading image will be loaded + */ + lazyImageReady: (swiper: SwiperClass, slideEl: HTMLElement, imageEl: HTMLElement) => void;/** + * Event will be fired on key press + */ + keyPress: (swiper: SwiperClass, keyCode: string) => void;/** + * Event will be fired on navigation hide + */ + navigationHide: (swiper: SwiperClass) => void; + /** + * Event will be fired on navigation show + */ + navigationShow: (swiper: SwiperClass) => void;/** + * Event will be fired on draggable scrollbar drag start + */ + scrollbarDragStart: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired on draggable scrollbar drag move + */ + scrollbarDragMove: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired on draggable scrollbar drag end + */ + scrollbarDragEnd: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void;/** + * Event will be fired after pagination rendered + */ + paginationRender: (swiper: SwiperClass, paginationEl: HTMLElement) => void; + + /** + * Event will be fired when pagination updated + */ + paginationUpdate: (swiper: SwiperClass, paginationEl: HTMLElement) => void; + + /** + * Event will be fired on pagination hide + */ + paginationHide: (swiper: SwiperClass) => void; + + /** + * Event will be fired on pagination show + */ + paginationShow: (swiper: SwiperClass) => void;/** + * Event will be fired on zoom change + */ + zoomChange: (swiper: SwiperClass, scale: number, imageEl: HTMLElement, slideEl: HTMLElement) => void; + + /** + * Fired right after Swiper initialization. + * @note Note that with `swiper.on('init')` syntax it will + * work only in case you set `init: false` parameter. + * + * @example + * ```js + * const swiper = new Swiper('.swiper', { + * init: false, + * // other parameters + * }); + * swiper.on('init', function() { + * // do something + * }); + * // init Swiper + * swiper.init(); + * ``` + * + * @example + * ```js + * // Otherwise use it as the parameter: + * const swiper = new Swiper('.swiper', { + * // other parameters + * on: { + * init: function () { + * // do something + * }, + * } + * }); + * ``` + */ + init: (swiper: SwiperClass) => any; + + /** + * Event will be fired right before Swiper destroyed + */ + beforeDestroy: (swiper: SwiperClass) => void; + + /** + * Event will be fired when currently active slide is changed + */ + slideChange: (swiper: SwiperClass) => void; + + /** + * Event will be fired in the beginning of animation to other slide (next or previous). + */ + slideChangeTransitionStart: (swiper: SwiperClass) => void; + + /** + * Event will be fired after animation to other slide (next or previous). + */ + slideChangeTransitionEnd: (swiper: SwiperClass) => void; + + /** + * Same as "slideChangeTransitionStart" but for "forward" direction only + */ + slideNextTransitionStart: (swiper: SwiperClass) => void; + + /** + * Same as "slideChangeTransitionEnd" but for "forward" direction only + */ + slideNextTransitionEnd: (swiper: SwiperClass) => void; + + /** + * Same as "slideChangeTransitionStart" but for "backward" direction only + */ + slidePrevTransitionStart: (swiper: SwiperClass) => void; + + /** + * Same as "slideChangeTransitionEnd" but for "backward" direction only + */ + slidePrevTransitionEnd: (swiper: SwiperClass) => void; + + /** + * Event will be fired in the beginning of transition. + */ + transitionStart: (swiper: SwiperClass) => void; + + /** + * Event will be fired after transition. + */ + transitionEnd: (swiper: SwiperClass) => void; + + /** + * Event will be fired when user touch Swiper. Receives `touchstart` event as an arguments. + */ + touchStart: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user touch and move finger over Swiper. Receives `touchmove` event as an arguments. + */ + touchMove: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user touch and move finger over Swiper in direction opposite to direction parameter. Receives `touchmove` event as an arguments. + */ + touchMoveOpposite: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user touch and move finger over Swiper and move it. Receives `touchmove` event as an arguments. + */ + sliderMove: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user release Swiper. Receives `touchend` event as an arguments. + */ + touchEnd: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user click/tap on Swiper. Receives `touchend` event as an arguments. + */ + click: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user click/tap on Swiper. Receives `touchend` event as an arguments. + */ + tap: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired when user double tap on Swiper's container. Receives `touchend` event as an arguments + */ + doubleTap: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + + /** + * Event will be fired right after all inner images are loaded. updateOnImagesReady should be also enabled + */ + imagesReady: (swiper: SwiperClass) => void; + + /** + * Event will be fired when Swiper progress is changed, as an arguments it receives progress that is always from 0 to 1 + */ + progress: (swiper: SwiperClass, progress: number) => void; + + /** + * Event will be fired when Swiper reach its beginning (initial position) + */ + reachBeginning: (swiper: SwiperClass) => void; + + /** + * Event will be fired when Swiper reach last slide + */ + reachEnd: (swiper: SwiperClass) => void; + + /** + * Event will be fired when Swiper goes to beginning or end position + */ + toEdge: (swiper: SwiperClass) => void; + + /** + * Event will be fired when Swiper goes from beginning or end position + */ + fromEdge: (swiper: SwiperClass) => void; + + /** + * Event will be fired when swiper's wrapper change its position. Receives current translate value as an arguments + */ + setTranslate: (swiper: SwiperClass, translate: number) => void; + + /** + * Event will be fired everytime when swiper starts animation. Receives current transition duration (in ms) as an arguments + */ + setTransition: (swiper: SwiperClass, transition: number) => void; + + /** + * Event will be fired on window resize right before swiper's onresize manipulation + */ + resize: (swiper: SwiperClass) => void; + + /** + * Event will be fired if observer is enabled and it detects DOM mutations + */ + observerUpdate: (swiper: SwiperClass) => void; + + /** + * Event will be fired right before "loop fix" + */ + beforeLoopFix: (swiper: SwiperClass) => void; + + /** + * Event will be fired after "loop fix" + */ + loopFix: (swiper: SwiperClass) => void; + + /** + * Event will be fired on breakpoint change + */ + breakpoint: (swiper: SwiperClass, breakpointParams: SwiperOptions) => void; + + /** + * !INTERNAL: Event will fired right before breakpoint change + */ + _beforeBreakpoint: (swiper: SwiperClass, breakpointParams: SwiperOptions) => void; + + /** + * !INTERNAL: Event will fired after setting CSS classes on swiper container element + */ + _containerClasses: (swiper: SwiperClass, classNames: string) => void; + + /** + * !INTERNAL: Event will fired after setting CSS classes on swiper slide element + */ + _slideClass: (swiper: SwiperClass, slideEl: HTMLElement, classNames: string) => void; + + /** + * !INTERNAL: Event will fired after setting CSS classes on all swiper slides + */ + _slideClasses: ( + swiper: SwiperClass, + slides: { slideEl: HTMLElement; classNames: string; index: number }[], + ) => void; + + /** + * !INTERNAL: Event will fired as soon as swiper instance available (before init) + */ + _swiper: (swiper: SwiperClass) => void; + + /** + * !INTERNAL: Event will be fired on free mode touch end (release) and there will no be momentum + */ + _freeModeNoMomentumRelease: (swiper: SwiperClass) => void; + + /** + * Event will fired on active index change + */ + activeIndexChange: (swiper: SwiperClass) => void; + /** + * Event will fired on snap index change + */ + snapIndexChange: (swiper: SwiperClass) => void; + /** + * Event will fired on real index change + */ + realIndexChange: (swiper: SwiperClass) => void; + /** + * Event will fired right after initialization + */ + afterInit: (swiper: SwiperClass) => void; + /** + * Event will fired right before initialization + */ + beforeInit: (swiper: SwiperClass) => void; + /** + * Event will fired before resize handler + */ + beforeResize: (swiper: SwiperClass) => void; + /** + * Event will fired before slide change transition start + */ + beforeSlideChangeStart: (swiper: SwiperClass) => void; + /** + * Event will fired before transition start + */ + beforeTransitionStart: (swiper: SwiperClass, speed: number, internal: any) => void; // what is internal? + /** + * Event will fired on direction change + */ + changeDirection: (swiper: SwiperClass) => void; + /** + * Event will be fired when user double click/tap on Swiper + */ + doubleClick: (swiper: SwiperClass, event: MouseEvent | TouchEvent | PointerEvent) => void; + /** + * Event will be fired on swiper destroy + */ + destroy: (swiper: SwiperClass) => void; + /** + * Event will be fired on momentum bounce + */ + momentumBounce: (swiper: SwiperClass) => void; + /** + * Event will be fired on orientation change (e.g. landscape -> portrait) + */ + orientationchange: (swiper: SwiperClass) => void; + /** + * Event will be fired in the beginning of animation of resetting slide to current one + */ + slideResetTransitionStart: (swiper: SwiperClass) => void; + /** + * Event will be fired in the end of animation of resetting slide to current one + */ + slideResetTransitionEnd: (swiper: SwiperClass) => void; + /** + * Event will be fired with first touch/drag move + */ + sliderFirstMove: (swiper: SwiperClass, event: TouchEvent) => void; + /** + * Event will be fired when number of slides has changed + */ + slidesLengthChange: (swiper: SwiperClass) => void; + /** + * Event will be fired when slides grid has changed + */ + slidesGridLengthChange: (swiper: SwiperClass) => void; + /** + * Event will be fired when snap grid has changed + */ + snapGridLengthChange: (swiper: SwiperClass) => void; + /** + * Event will be fired after swiper.update() call + */ + update: (swiper: SwiperClass) => void; + /** + * Event will be fired when swiper is locked (when `watchOverflow` enabled) + */ + lock: (swiper: SwiperClass) => void; + /** + * Event will be fired when swiper is unlocked (when `watchOverflow` enabled) + */ + unlock: (swiper: SwiperClass) => void; + + } +>; + +declare const SwiperSlide: DefineComponent<{ + tag: { + type: StringConstructor; + default: string; + }; + swiperRef: { type: PropType; required: false }; + zoom: { type: BooleanConstructor; default: undefined }; + virtualIndex: { + type: StringConstructor | NumberConstructor; + default: undefined; + }; +}>; + +export { Swiper, SwiperSlide }; diff --git a/src/main/resources/static/assets/js/swiper/vue/swiper-vue.js b/src/main/resources/static/assets/js/swiper/vue/swiper-vue.js new file mode 100644 index 0000000..621d246 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/swiper-vue.js @@ -0,0 +1,15 @@ +/** + * Swiper Vue 7.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: October 27, 2021 + */ + +import { Swiper } from './swiper.js'; +import { SwiperSlide } from './swiper-slide.js'; +export { Swiper, SwiperSlide }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/swiper.js b/src/main/resources/static/assets/js/swiper/vue/swiper.js new file mode 100644 index 0000000..5753250 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/swiper.js @@ -0,0 +1,640 @@ +import { h, ref, onMounted, onUpdated, onBeforeUnmount, watch, nextTick } from 'vue'; +import { getParams } from './get-params.js'; +import { initSwiper, mountSwiper } from './init-swiper.js'; +import { needsScrollbar, needsNavigation, needsPagination, uniqueClasses, extend } from './utils.js'; +import { renderLoop, calcLoopedSlides } from './loop.js'; +import { getChangedParams } from './get-changed-params.js'; +import { getChildren } from './get-children.js'; +import { updateSwiper } from './update-swiper.js'; +import { renderVirtual, updateOnVirtualData } from './virtual.js'; +const Swiper = { + name: 'Swiper', + props: { + tag: { + type: String, + default: 'div' + }, + wrapperTag: { + type: String, + default: 'div' + }, + modules: { + type: Array, + default: undefined + }, + init: { + type: Boolean, + default: undefined + }, + direction: { + type: String, + default: undefined + }, + touchEventsTarget: { + type: String, + default: undefined + }, + initialSlide: { + type: Number, + default: undefined + }, + speed: { + type: Number, + default: undefined + }, + cssMode: { + type: Boolean, + default: undefined + }, + updateOnWindowResize: { + type: Boolean, + default: undefined + }, + resizeObserver: { + type: Boolean, + default: undefined + }, + nested: { + type: Boolean, + default: undefined + }, + focusableElements: { + type: String, + default: undefined + }, + width: { + type: Number, + default: undefined + }, + height: { + type: Number, + default: undefined + }, + preventInteractionOnTransition: { + type: Boolean, + default: undefined + }, + userAgent: { + type: String, + default: undefined + }, + url: { + type: String, + default: undefined + }, + edgeSwipeDetection: { + type: [Boolean, String], + default: undefined + }, + edgeSwipeThreshold: { + type: Number, + default: undefined + }, + autoHeight: { + type: Boolean, + default: undefined + }, + setWrapperSize: { + type: Boolean, + default: undefined + }, + virtualTranslate: { + type: Boolean, + default: undefined + }, + effect: { + type: String, + default: undefined + }, + breakpoints: { + type: Object, + default: undefined + }, + spaceBetween: { + type: Number, + default: undefined + }, + slidesPerView: { + type: [Number, String], + default: undefined + }, + slidesPerGroup: { + type: Number, + default: undefined + }, + slidesPerGroupSkip: { + type: Number, + default: undefined + }, + slidesPerGroupAuto: { + type: Boolean, + default: undefined + }, + centeredSlides: { + type: Boolean, + default: undefined + }, + centeredSlidesBounds: { + type: Boolean, + default: undefined + }, + slidesOffsetBefore: { + type: Number, + default: undefined + }, + slidesOffsetAfter: { + type: Number, + default: undefined + }, + normalizeSlideIndex: { + type: Boolean, + default: undefined + }, + centerInsufficientSlides: { + type: Boolean, + default: undefined + }, + watchOverflow: { + type: Boolean, + default: undefined + }, + roundLengths: { + type: Boolean, + default: undefined + }, + touchRatio: { + type: Number, + default: undefined + }, + touchAngle: { + type: Number, + default: undefined + }, + simulateTouch: { + type: Boolean, + default: undefined + }, + shortSwipes: { + type: Boolean, + default: undefined + }, + longSwipes: { + type: Boolean, + default: undefined + }, + longSwipesRatio: { + type: Number, + default: undefined + }, + longSwipesMs: { + type: Number, + default: undefined + }, + followFinger: { + type: Boolean, + default: undefined + }, + allowTouchMove: { + type: Boolean, + default: undefined + }, + threshold: { + type: Number, + default: undefined + }, + touchMoveStopPropagation: { + type: Boolean, + default: undefined + }, + touchStartPreventDefault: { + type: Boolean, + default: undefined + }, + touchStartForcePreventDefault: { + type: Boolean, + default: undefined + }, + touchReleaseOnEdges: { + type: Boolean, + default: undefined + }, + uniqueNavElements: { + type: Boolean, + default: undefined + }, + resistance: { + type: Boolean, + default: undefined + }, + resistanceRatio: { + type: Number, + default: undefined + }, + watchSlidesProgress: { + type: Boolean, + default: undefined + }, + grabCursor: { + type: Boolean, + default: undefined + }, + preventClicks: { + type: Boolean, + default: undefined + }, + preventClicksPropagation: { + type: Boolean, + default: undefined + }, + slideToClickedSlide: { + type: Boolean, + default: undefined + }, + preloadImages: { + type: Boolean, + default: undefined + }, + updateOnImagesReady: { + type: Boolean, + default: undefined + }, + loop: { + type: Boolean, + default: undefined + }, + loopAdditionalSlides: { + type: Number, + default: undefined + }, + loopedSlides: { + type: Number, + default: undefined + }, + loopFillGroupWithBlank: { + type: Boolean, + default: undefined + }, + loopPreventsSlide: { + type: Boolean, + default: undefined + }, + allowSlidePrev: { + type: Boolean, + default: undefined + }, + allowSlideNext: { + type: Boolean, + default: undefined + }, + swipeHandler: { + type: Boolean, + default: undefined + }, + noSwiping: { + type: Boolean, + default: undefined + }, + noSwipingClass: { + type: String, + default: undefined + }, + noSwipingSelector: { + type: String, + default: undefined + }, + passiveListeners: { + type: Boolean, + default: undefined + }, + containerModifierClass: { + type: String, + default: undefined + }, + slideClass: { + type: String, + default: undefined + }, + slideBlankClass: { + type: String, + default: undefined + }, + slideActiveClass: { + type: String, + default: undefined + }, + slideDuplicateActiveClass: { + type: String, + default: undefined + }, + slideVisibleClass: { + type: String, + default: undefined + }, + slideDuplicateClass: { + type: String, + default: undefined + }, + slideNextClass: { + type: String, + default: undefined + }, + slideDuplicateNextClass: { + type: String, + default: undefined + }, + slidePrevClass: { + type: String, + default: undefined + }, + slideDuplicatePrevClass: { + type: String, + default: undefined + }, + wrapperClass: { + type: String, + default: undefined + }, + runCallbacksOnInit: { + type: Boolean, + default: undefined + }, + observer: { + type: Boolean, + default: undefined + }, + observeParents: { + type: Boolean, + default: undefined + }, + observeSlideChildren: { + type: Boolean, + default: undefined + }, + a11y: { + type: [Boolean, Object], + default: undefined + }, + autoplay: { + type: [Boolean, Object], + default: undefined + }, + controller: { + type: Object, + default: undefined + }, + coverflowEffect: { + type: Object, + default: undefined + }, + cubeEffect: { + type: Object, + default: undefined + }, + fadeEffect: { + type: Object, + default: undefined + }, + flipEffect: { + type: Object, + default: undefined + }, + creativeEffect: { + type: Object, + default: undefined + }, + cardsEffect: { + type: Object, + default: undefined + }, + hashNavigation: { + type: [Boolean, Object], + default: undefined + }, + history: { + type: [Boolean, Object], + default: undefined + }, + keyboard: { + type: [Boolean, Object], + default: undefined + }, + lazy: { + type: [Boolean, Object], + default: undefined + }, + mousewheel: { + type: [Boolean, Object], + default: undefined + }, + navigation: { + type: [Boolean, Object], + default: undefined + }, + pagination: { + type: [Boolean, Object], + default: undefined + }, + parallax: { + type: [Boolean, Object], + default: undefined + }, + scrollbar: { + type: [Boolean, Object], + default: undefined + }, + thumbs: { + type: Object, + default: undefined + }, + virtual: { + type: [Boolean, Object], + default: undefined + }, + zoom: { + type: [Boolean, Object], + default: undefined + }, + grid: { + type: [Object], + default: undefined + }, + freeMode: { + type: [Boolean, Object], + default: undefined + } + }, + emits: ['_beforeBreakpoint', '_containerClasses', '_slideClass', '_slideClasses', '_swiper', 'activeIndexChange', 'afterInit', 'autoplay', 'autoplayStart', 'autoplayStop', 'beforeDestroy', 'beforeInit', 'beforeLoopFix', 'beforeResize', 'beforeSlideChangeStart', 'beforeTransitionStart', 'breakpoint', 'changeDirection', 'click', 'disable', 'doubleTap', 'doubleClick', 'destroy', 'enable', 'fromEdge', 'hashChange', 'hashSet', 'imagesReady', 'init', 'keyPress', 'lazyImageLoad', 'lazyImageReady', 'lock', 'loopFix', 'momentumBounce', 'navigationHide', 'navigationShow', 'observerUpdate', 'orientationchange', 'paginationHide', 'paginationRender', 'paginationShow', 'paginationUpdate', 'progress', 'reachBeginning', 'reachEnd', 'realIndexChange', 'resize', 'scroll', 'scrollbarDragEnd', 'scrollbarDragMove', 'scrollbarDragStart', 'setTransition', 'setTranslate', 'slideChange', 'slideChangeTransitionEnd', 'slideChangeTransitionStart', 'slideNextTransitionEnd', 'slideNextTransitionStart', 'slidePrevTransitionEnd', 'slidePrevTransitionStart', 'slideResetTransitionStart', 'slideResetTransitionEnd', 'sliderMove', 'sliderFirstMove', 'slidesLengthChange', 'slidesGridLengthChange', 'snapGridLengthChange', 'snapIndexChange', 'swiper', 'tap', 'toEdge', 'touchEnd', 'touchMove', 'touchMoveOpposite', 'touchStart', 'transitionEnd', 'transitionStart', 'unlock', 'update', 'zoomChange'], + + setup(props, { + slots: originalSlots, + emit + }) { + const { + tag: Tag, + wrapperTag: WrapperTag + } = props; + const containerClasses = ref('swiper'); + const virtualData = ref(null); + const breakpointChanged = ref(false); + const initializedRef = ref(false); + const swiperElRef = ref(null); + const swiperRef = ref(null); + const oldPassedParamsRef = ref(null); + const slidesRef = { + value: [] + }; + const oldSlidesRef = { + value: [] + }; + const nextElRef = ref(null); + const prevElRef = ref(null); + const paginationElRef = ref(null); + const scrollbarElRef = ref(null); + const { + params: swiperParams, + passedParams + } = getParams(props); + getChildren(originalSlots, slidesRef, oldSlidesRef); + oldPassedParamsRef.value = passedParams; + oldSlidesRef.value = slidesRef.value; + + const onBeforeBreakpoint = () => { + getChildren(originalSlots, slidesRef, oldSlidesRef); + breakpointChanged.value = true; + }; + + swiperParams.onAny = (event, ...args) => { + emit(event, ...args); + }; + + Object.assign(swiperParams.on, { + _beforeBreakpoint: onBeforeBreakpoint, + + _containerClasses(swiper, classes) { + containerClasses.value = classes; + } + + }); // init Swiper + + swiperRef.value = initSwiper(swiperParams); + + swiperRef.value.loopCreate = () => {}; + + swiperRef.value.loopDestroy = () => {}; + + if (swiperParams.loop) { + swiperRef.value.loopedSlides = calcLoopedSlides(slidesRef.value, swiperParams); + } + + if (swiperRef.value.virtual && swiperRef.value.params.virtual.enabled) { + swiperRef.value.virtual.slides = slidesRef.value; + const extendWith = { + cache: false, + slides: slidesRef.value, + renderExternal: data => { + virtualData.value = data; + }, + renderExternalUpdate: false + }; + extend(swiperRef.value.params.virtual, extendWith); + extend(swiperRef.value.originalParams.virtual, extendWith); + } + + onUpdated(() => { + // set initialized flag + if (!initializedRef.value && swiperRef.value) { + swiperRef.value.emitSlidesClasses(); + initializedRef.value = true; + } // watch for params change + + + const { + passedParams: newPassedParams + } = getParams(props); + const changedParams = getChangedParams(newPassedParams, oldPassedParamsRef.value, slidesRef.value, oldSlidesRef.value); + oldPassedParamsRef.value = newPassedParams; + + if ((changedParams.length || breakpointChanged.value) && swiperRef.value && !swiperRef.value.destroyed) { + updateSwiper({ + swiper: swiperRef.value, + slides: slidesRef.value, + passedParams: newPassedParams, + changedParams, + nextEl: nextElRef.value, + prevEl: prevElRef.value, + scrollbarEl: scrollbarElRef.value, + paginationEl: paginationElRef.value + }); + } + + breakpointChanged.value = false; + }); // update on virtual update + + watch(virtualData, () => { + nextTick(() => { + updateOnVirtualData(swiperRef.value); + }); + }); // mount swiper + + onMounted(() => { + if (!swiperElRef.value) return; + mountSwiper({ + el: swiperElRef.value, + nextEl: nextElRef.value, + prevEl: prevElRef.value, + paginationEl: paginationElRef.value, + scrollbarEl: scrollbarElRef.value, + swiper: swiperRef.value + }, swiperParams); + emit('swiper', swiperRef.value); + }); + onBeforeUnmount(() => { + if (swiperRef.value && !swiperRef.value.destroyed) { + swiperRef.value.destroy(true, false); + } + }); // bypass swiper instance to slides + + function renderSlides(slides) { + if (swiperParams.virtual) { + return renderVirtual(swiperRef, slides, virtualData.value); + } + + if (!swiperParams.loop || swiperRef.value && swiperRef.value.destroyed) { + slides.forEach(slide => { + if (!slide.props) slide.props = {}; + slide.props.swiperRef = swiperRef; + }); + return slides; + } + + return renderLoop(swiperRef, slides, swiperParams); + } + + return () => { + const { + slides, + slots + } = getChildren(originalSlots, slidesRef, oldSlidesRef); + return h(Tag, { + ref: swiperElRef, + class: uniqueClasses(containerClasses.value) + }, [slots['container-start'], needsNavigation(props) && [h('div', { + ref: prevElRef, + class: 'swiper-button-prev' + }), h('div', { + ref: nextElRef, + class: 'swiper-button-next' + })], needsScrollbar(props) && h('div', { + ref: scrollbarElRef, + class: 'swiper-scrollbar' + }), needsPagination(props) && h('div', { + ref: paginationElRef, + class: 'swiper-pagination' + }), h(WrapperTag, { + class: 'swiper-wrapper' + }, [slots['wrapper-start'], renderSlides(slides), slots['wrapper-end']]), slots['container-end']]); + }; + } + +}; +export { Swiper }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/update-swiper.js b/src/main/resources/static/assets/js/swiper/vue/update-swiper.js new file mode 100644 index 0000000..4824d48 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/update-swiper.js @@ -0,0 +1,131 @@ +import { isObject, extend } from './utils.js'; + +function updateSwiper({ + swiper, + slides, + passedParams, + changedParams, + nextEl, + prevEl, + paginationEl, + scrollbarEl +}) { + const updateParams = changedParams.filter(key => key !== 'children' && key !== 'direction'); + const { + params: currentParams, + pagination, + navigation, + scrollbar, + virtual, + thumbs + } = swiper; + let needThumbsInit; + let needControllerInit; + let needPaginationInit; + let needScrollbarInit; + let needNavigationInit; + + if (changedParams.includes('thumbs') && passedParams.thumbs && passedParams.thumbs.swiper && currentParams.thumbs && !currentParams.thumbs.swiper) { + needThumbsInit = true; + } + + if (changedParams.includes('controller') && passedParams.controller && passedParams.controller.control && currentParams.controller && !currentParams.controller.control) { + needControllerInit = true; + } + + if (changedParams.includes('pagination') && passedParams.pagination && (passedParams.pagination.el || paginationEl) && (currentParams.pagination || currentParams.pagination === false) && pagination && !pagination.el) { + needPaginationInit = true; + } + + if (changedParams.includes('scrollbar') && passedParams.scrollbar && (passedParams.scrollbar.el || scrollbarEl) && (currentParams.scrollbar || currentParams.scrollbar === false) && scrollbar && !scrollbar.el) { + needScrollbarInit = true; + } + + if (changedParams.includes('navigation') && passedParams.navigation && (passedParams.navigation.prevEl || prevEl) && (passedParams.navigation.nextEl || nextEl) && (currentParams.navigation || currentParams.navigation === false) && navigation && !navigation.prevEl && !navigation.nextEl) { + needNavigationInit = true; + } + + const destroyModule = mod => { + if (!swiper[mod]) return; + swiper[mod].destroy(); + + if (mod === 'navigation') { + currentParams[mod].prevEl = undefined; + currentParams[mod].nextEl = undefined; + swiper[mod].prevEl = undefined; + swiper[mod].nextEl = undefined; + } else { + currentParams[mod].el = undefined; + swiper[mod].el = undefined; + } + }; + + updateParams.forEach(key => { + if (isObject(currentParams[key]) && isObject(passedParams[key])) { + extend(currentParams[key], passedParams[key]); + } else { + const newValue = passedParams[key]; + + if ((newValue === true || newValue === false) && (key === 'navigation' || key === 'pagination' || key === 'scrollbar')) { + if (newValue === false) { + destroyModule(key); + } + } else { + currentParams[key] = passedParams[key]; + } + } + }); + + if (changedParams.includes('children') && virtual && currentParams.virtual.enabled) { + virtual.slides = slides; + virtual.update(true); + } else if (changedParams.includes('children') && swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + + if (needThumbsInit) { + const initialized = thumbs.init(); + if (initialized) thumbs.update(true); + } + + if (needControllerInit) { + swiper.controller.control = currentParams.controller.control; + } + + if (needPaginationInit) { + if (paginationEl) currentParams.pagination.el = paginationEl; + pagination.init(); + pagination.render(); + pagination.update(); + } + + if (needScrollbarInit) { + if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl; + scrollbar.init(); + scrollbar.updateSize(); + scrollbar.setTranslate(); + } + + if (needNavigationInit) { + if (nextEl) currentParams.navigation.nextEl = nextEl; + if (prevEl) currentParams.navigation.prevEl = prevEl; + navigation.init(); + navigation.update(); + } + + if (changedParams.includes('allowSlideNext')) { + swiper.allowSlideNext = passedParams.allowSlideNext; + } + + if (changedParams.includes('allowSlidePrev')) { + swiper.allowSlidePrev = passedParams.allowSlidePrev; + } + + if (changedParams.includes('direction')) { + swiper.changeDirection(passedParams.direction, false); + } + + swiper.update(); +} + +export { updateSwiper }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/utils.js b/src/main/resources/static/assets/js/swiper/vue/utils.js new file mode 100644 index 0000000..6c38df5 --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/utils.js @@ -0,0 +1,37 @@ +function isObject(o) { + return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object'; +} + +function extend(target, src) { + const noExtend = ['__proto__', 'constructor', 'prototype']; + Object.keys(src).filter(key => noExtend.indexOf(key) < 0).forEach(key => { + if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) { + if (src[key].__swiper__) target[key] = src[key];else extend(target[key], src[key]); + } else { + target[key] = src[key]; + } + }); +} + +function needsNavigation(props = {}) { + return props.navigation && typeof props.navigation.nextEl === 'undefined' && typeof props.navigation.prevEl === 'undefined'; +} + +function needsPagination(props = {}) { + return props.pagination && typeof props.pagination.el === 'undefined'; +} + +function needsScrollbar(props = {}) { + return props.scrollbar && typeof props.scrollbar.el === 'undefined'; +} + +function uniqueClasses(classNames = '') { + const classes = classNames.split(' ').map(c => c.trim()).filter(c => !!c); + const unique = []; + classes.forEach(c => { + if (unique.indexOf(c) < 0) unique.push(c); + }); + return unique.join(' '); +} + +export { isObject, extend, needsNavigation, needsPagination, needsScrollbar, uniqueClasses }; \ No newline at end of file diff --git a/src/main/resources/static/assets/js/swiper/vue/virtual.js b/src/main/resources/static/assets/js/swiper/vue/virtual.js new file mode 100644 index 0000000..bd3b35d --- /dev/null +++ b/src/main/resources/static/assets/js/swiper/vue/virtual.js @@ -0,0 +1,35 @@ +import { h } from 'vue'; + +function updateOnVirtualData(swiper) { + if (!swiper || swiper.destroyed || !swiper.params.virtual || swiper.params.virtual && !swiper.params.virtual.enabled) return; + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + if (swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + + if (swiper.parallax && swiper.params.parallax && swiper.params.parallax.enabled) { + swiper.parallax.setTranslate(); + } +} + +function renderVirtual(swiperRef, slides, virtualData) { + if (!virtualData) return null; + const style = swiperRef.value.isHorizontal() ? { + [swiperRef.value.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px` + } : { + top: `${virtualData.offset}px` + }; + return slides.filter((slide, index) => index >= virtualData.from && index <= virtualData.to).map(slide => { + if (!slide.props) slide.props = {}; + if (!slide.props.style) slide.props.style = {}; + slide.props.swiperRef = swiperRef; + slide.props.style = style; + return h(slide.type, { ...slide.props + }, slide.children); + }); +} + +export { renderVirtual, updateOnVirtualData }; \ No newline at end of file diff --git a/src/main/resources/static/assets/libs/echarts/china.js b/src/main/resources/static/assets/libs/echarts/china.js new file mode 100644 index 0000000..7fc1bad --- /dev/null +++ b/src/main/resources/static/assets/libs/echarts/china.js @@ -0,0 +1 @@ +(function(root,factory){if(typeof define==='function'&&define.amd){define(['exports','echarts'],factory);}else if(typeof exports === 'object' && typeof exports.nodeName !== 'string') {factory(exports, require('echarts'));} else {factory({}, root.echarts);}}(this, function (exports, echarts) {var log = function (msg) {if (typeof console !== 'undefined') {console && console.error && console.error(msg);}};if (!echarts) {log('ECharts is not Loaded');return;}if (!echarts.registerMap) {log('ECharts Map is not loaded');return;}echarts.registerMap('china', {"type":"FeatureCollection","features":[{"type":"Feature","id":"710000","properties":{"id":"710000","cp":[121.509062,24.044332],"name":"台湾","childNum":6},"geometry":{"type":"MultiPolygon","coordinates":[["@@°Ü¯Û"],["@@ƛĴÕƊÉɼģºðʀ\\ƎsÆNŌÔĚäœnÜƤɊĂǀĆĴžĤNJŨxĚĮǂƺòƌ‚–âÔ®ĮXŦţƸZûЋƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ™¿@ăƑŽ¥ĘWǬÏĶŁâ"],["@@\\p|WoYG¿¥I†j@¢"],["@@…¡‰@ˆV^RqˆBbAŒnTXeRz¤Lž«³I"],["@@ÆEE—„kWqë @œ"],["@@fced"],["@@„¯ɜÄèaì¯ØǓIġĽ"],["@@çûĖ롖hòř "]],"encodeOffsets":[[[122886,24033]],[[123335,22980]],[[122375,24193]],[[122518,24117]],[[124427,22618]],[[124862,26043]],[[126259,26318]],[[127671,26683]]]}},{"type":"Feature","id":"130000","properties":{"id":"130000","cp":[114.502461,38.045474],"name":"河北","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@o~†Z]‚ªr‰ºc_ħ²G¼s`jΟnüsœłNX_“M`ǽÓnUK…Ĝēs¤­©yrý§uģŒc†JŠ›e"],["@@U`Ts¿m‚"],["@@oºƋÄd–eVŽDJj£€J|Ådz•Ft~žKŨ¸IÆv|”‡¢r}膎onb˜}`RÎÄn°ÒdÞ²„^®’lnÐèĄlðӜ×]ªÆ}LiĂ±Ö`^°Ç¶p®đDcœŋ`–ZÔ’¶êqvFƚ†N®ĆTH®¦O’¾ŠIbÐã´BĐɢŴÆíȦp–ĐÞXR€·nndOž¤’OÀĈƒ­Qg˜µFo|gȒęSWb©osx|hYh•gŃfmÖĩnº€T̒Sp›¢dYĤ¶UĈjl’ǐpäìë|³kÛfw²Xjz~ÂqbTŠÑ„ěŨ@|oM‡’zv¢ZrÃVw¬ŧˏfŒ°ÐT€ªqŽs{Sž¯r æÝlNd®²Ğ džiGʂJ™¼lr}~K¨ŸƐÌWö€™ÆŠzRš¤lêmĞL΄’@¡|q]SvK€ÑcwpÏρ†ĿćènĪWlĄkT}ˆJ”¤~ƒÈT„d„™pddʾĬŠ”ŽBVt„EÀ¢ôPĎƗè@~‚k–ü\\rÊĔÖæW_§¼F˜†´©òDòj’ˆYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkv‚GpuARhÞÆǶgƊTǼƹS£¨¡ù³ŘÍ]¿Ây™ôEP xX¶¹܇O¡“gÚ¡IwÃ鑦ÅB‡Ï|ǰ…N«úmH¯‹âŸDùŽyŜžŲIÄuШDž•¸dɂ‡‚FŸƒ•›Oh‡đ©OŸ›iÃ`ww^ƒÌkŸ‘ÑH«ƇǤŗĺtFu…{Z}Ö@U‡´…ʚLg®¯Oı°ÃwŸ ^˜—€VbÉs‡ˆmA…ê]]w„§›RRl£‡ȭµu¯b{ÍDěïÿȧŽuT£ġƒěŗƃĝ“Q¨fV†Ƌ•ƅn­a@‘³@šď„yýIĹÊKšŭfċŰóŒxV@tˆƯŒJ”]eƒR¾fe|rHA˜|h~Ėƍl§ÏŠlTíb ØoˆÅbbx³^zÃ͚¶Sj®A”yÂhðk`š«P€”ˈµEF†Û¬Y¨Ļrõqi¼‰Wi°§’б´°^[ˆÀ|ĠO@ÆxO\\tŽa\\tĕtû{ġŒȧXýĪÓjùÎRb›š^ΛfK[ݏděYfíÙTyŽuUSyŌŏů@Oi½’éŅ­aVcř§ax¹XŻác‡žWU£ôãºQ¨÷Ñws¥qEH‰Ù|‰›šYQoŕÇyáĂ£MðoťÊ‰P¡mšWO¡€v†{ôvîēÜISpÌhp¨ ‘j†deŔQÖj˜X³à™Ĉ[n`Yp@Už–cM`’RKhŒEbœ”pŞlNut®Etq‚nsÁŠgA‹iú‹oH‡qCX‡”hfgu“~ϋWP½¢G^}¯ÅīGCŸÑ^ãziMáļMTÃƘrMc|O_ž¯Ŏ´|‡morDkO\\mĆJfl@c̬¢aĦtRıҙ¾ùƀ^juųœK­ƒUFy™—Ɲ…›īÛ÷ąV×qƥV¿aȉd³B›qPBm›aËđŻģm“Å®Vйd^K‡KoŸnYg“¯Xhqa”Ldu¥•ÍpDž¡KąÅƒkĝęěhq‡}HyÓ]¹ǧ£…Í÷¿qáµ§š™g‘¤o^á¾ZE‡¤i`ij{n•ƒOl»ŸWÝĔįhg›F[¿¡—ßkOüš_‰€ū‹i„DZàUtėGylƒ}ŒÓM}€jpEC~¡FtoQi‘šHkk{Ãmï‚"]],"encodeOffsets":[[[119712,40641]],[[121616,39981]],[[116462,37237]]]}},{"type":"Feature","id":"140000","properties":{"id":"140000","cp":[111.849248,36.857014],"name":"山西","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@Þĩ҃S‰ra}Á€yWix±Üe´lè“ßÓǏok‘ćiµVZģ¡coœ‘TS˹ĪmnÕńe–hZg{gtwªpXaĚThȑp{¶Eh—®RćƑP¿£‘Pmc¸mQÝW•ďȥoÅîɡųAďä³aωJ‘½¥PG­ąSM­™…EÅruµé€‘Yӎ•Ō_d›ĒCo­Èµ]¯_²ÕjāŽK~©ÅØ^ԛkïçămϑk]­±ƒcݯÑÃmQÍ~_a—pm…~ç¡q“ˆu{JÅŧ·Ls}–EyÁÆcI{¤IiCfUc•ƌÃp§]웫vD@¡SÀ‘µM‚ÅwuŽYY‡¡DbÑc¡hƒ×]nkoQdaMç~eD•ÛtT‰©±@¥ù@É¡‰ZcW|WqOJmĩl«ħşvOÓ«IqăV—¥ŸD[mI~Ó¢cehiÍ]Ɠ~ĥqXŠ·eƷœn±“}v•[ěďŽŕ]_‘œ•`‰¹ƒ§ÕōI™o©b­s^}Ét±ū«³p£ÿ·Wµ|¡¥ăFÏs׌¥ŅxŸÊdÒ{ºvĴÎêÌɊ²¶€ü¨|ÞƸµȲ‘LLúÉƎ¤ϊęĔV`„_bª‹S^|ŸdŠzY|dz¥p†ZbÆ£¶ÒK}tĦÔņƠ‚PYzn€ÍvX¶Ěn ĠÔ„zý¦ª˜÷žÑĸَUȌ¸‚dòÜJð´’ìúNM¬ŒXZ´‘¤ŊǸ_tldIš{¦ƀðĠȤ¥NehXnYG‚‡R° ƬDj¬¸|CĞ„Kq‚ºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBŒÊ”TœŸ˜ʂōĖ’šĴŞ–ȀœÆÿȄlŤĒö„t”νî¼ĨXhŒ‘˜|ªM¤Ðz"],"encodeOffsets":[[116874,41716]]}},{"type":"Feature","id":"150000","properties":{"id":"150000","cp":[111.670801,41.818311],"name":"内蒙古","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@¯PqƒFB…‰|S•³C|kñ•H‹d‘iÄ¥sˆʼnő…PóÑÑE^‘ÅPpy_YtS™hQ·aHwsOnʼnÚs©iqj›‰€USiº]ïWš‰«gW¡A–Rë¥_ŽsgÁnUI«m‰…„‹]j‡vV¼euhwqA„aW˜ƒ_µj…»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáG“›OUۗOB±•XŸkŇ¹£k|e]ol™ŸkVͼÕqtaÏõjgÁ£§U^Œ”RLˆËnX°Ç’Bz†^~wfvˆypV ¯„ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyx‹þp]Évïè‘vƀnÂĴÖ@‚‰†V~Ĉv¦wĖt—ējyÄDXÄxGQuv_›i¦aBçw‘˛wD™©{ŸtāmQ€{EJ§KPśƘƿ¥@‰sCT•É}ɃwˆƇy±ŸgÑ“}T[÷kÐ禫…SÒ¥¸ëBX½‰HáŵÀğtSÝÂa[ƣ°¯¦P]£ġ“–“Òk®G²„èQ°óMq}EŠóƐÇ\\ƒ‡@áügQ͋u¥Fƒ“T՛¿Jû‡]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHNJ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶—ˆ¿A•†‹[¡Œ{d×uQAƒ›M•xV‹vMOmăl«ct[wº_šÇʊŽŸjb£ĦS_é“QZ“_lwgOiýe`YYLq§IÁˆdz£ÙË[ÕªuƏ³ÍT—s·bÁĽäė[›b[ˆŗfãcn¥îC¿÷µ[ŏÀQ­ōšĉm¿Á^£mJVm‡—L[{Ï_£›F¥Ö{ŹA}…×Wu©ÅaųijƳhB{·TQqÙIķˑZđ©Yc|M¡…L•eVUóK_QWk’_ĥ‘¿ãZ•»X\\ĴuUƒè‡lG®ěłTĠğDєOrÍd‚ÆÍz]‹±…ŭ©ŸÅ’]ŒÅÐ}UË¥©Tċ™ïxgckfWgi\\ÏĒ¥HkµE˜ë{»ÏetcG±ahUiñiWsɁˆ·c–C‚Õk]wȑ|ća}w…VaĚá žŒG°ùnM¬¯†{ÈˆÐÆA’¥ÄêJxÙ¢”hP¢Ûˆº€µwWOŸóFŽšÁz^ÀŗÎú´§¢T¤ǻƺSė‰ǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇq‡Z‘ñiñC³ª—…»E`¨åXēÕqÉû[l•}ç@čƘóO¿¡ƒFUsA‰“ʽīccšocƒ‚ƒÇS}„“£‡IS~ălkĩXçmĈ…ŀЂoÐdxÒuL^T{r@¢‘žÍƒĝKén£kQ™‰yšÅõËXŷƏL§~}kqš»IHėDžjĝŸ»ÑÞoŸå°qTt|r©ÏS‹¯·eŨĕx«È[eMˆ¿yuˆ‘pN~¹ÏyN£{©’—g‹ħWí»Í¾s“əšDž_ÃĀɗ±ą™ijĉʍŌŷ—S›É“A‹±åǥɋ@럣R©ąP©}ĹªƏj¹erƒLDĝ·{i«ƫC£µsKCš…GS|úþX”gp›{ÁX¿Ÿć{ƱȏñZáĔyoÁhA™}ŅĆfdʼn„_¹„Y°ėǩÑ¡H¯¶oMQqð¡Ë™|‘Ñ`ƭŁX½·óۓxğįÅcQ‡ˆ“ƒs«tȋDžF“Ÿù^i‘t«Č¯[›hAi©á¥ÇĚ×l|¹y¯YȵƓ‹ñǙµï‚ċ™Ļ|Dœ™üȭ¶¡˜›oŽäÕG\\ďT¿Òõr¯œŸLguÏYęRƩšɷŌO\\İТæ^Ŋ IJȶȆbÜGŽĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľƒ]ėl¥Ë‡ĭûÁ„ƒėéV©±ćn©­ȇžÍq¯½•YÃÔʼn“ÉNѝÅÝy¹NqáʅDǡËñ­ƁYÅy̱os§ȋµʽǘǏƬɱà‘ưN¢ƔÊuľýľώȪƺɂļžxœZĈ}ÌʼnŪ˜ĺœŽĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ǎ›¼ȳÐUf†dIxÿ\\G ˆzâɏÙOº·pqy£†@ŒŠqþ@Ǟ˽IBäƣzsÂZ†ÁàĻdñ°ŕzéØűzșCìDȐĴĺf®ŽÀľưø@ɜÖÞKĊŇƄ§‚͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘNJ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФԂ¤ƌžĞ̪Qʤ´¼mȠJˀŸƲÀɠmǐnǔĎȆÞǠN~€ʢĜ‚¶ƌĆĘźʆȬ˪ĚǏĞGȖƴƀj`ĢçĶāàŃºē̃ĖćšYŒÀŎüôQÐÂŎŞdžŞêƖš˜oˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^žªƂ`ªt¾äƚêĦĀ¼Ð€Ĕǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDĝŒ|ø˂˜ƮÐ¬ɚwɲFjĔ²Äw°dždÀɞ_ĸdîàŎjʜêTĞªŌ‡ŜWÈ|tqĢUB~´°ÎFC•ŽU¼pĀēƄN¦¾O¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Ší¨ÅDK°ßtŇĔKš¨ǵÂcḷ̌ĚǣȄĽF‡lġUĵœŇ‹ȣFʉɁƒMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFŽxúQ„Er´W„rh¤Ɛ \\talĈDJ˜Ü|[Pll̚¸ƎGú´Pž¬W¦†^¦–H]prR“n|or¾wLVnÇIujkmon£cX^Bh`¥V”„¦U¤¸}€xRj–[^xN[~ªŠxQ„‚[`ªHÆÂExx^wšN¶Ê˜|¨ì†˜€MrœdYp‚oRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚r¤–`[|òDŞĔöxElÖdH„ÀI`„Ď\\Àì~ƎR¼tf•¦^¢ķ¶e”ÐÚMŒptgj–„ɡČÅyġLû™ŇV®ŠÄÈƀ†Ď°P|ªVV†ªj–¬ĚÒêp¬–E|ŬÂc|ÀtƐK fˆ{ĘFǜƌXƲąo½Ę‘\\¥–o}›Ûu£ç­kX‘{uĩ«āíÓUŅßŢq€Ť¥lyň[€oi{¦‹L‡ń‡ðFȪȖ”ĒL„¿Ì‹ˆfŒ£K£ʺ™oqNŸƒwğc`ue—tOj×°KJ±qƒÆġm‰Ěŗos¬…qehqsuœƒH{¸kH¡Š…ÊRǪÇƌbȆ¢´ä܍¢NìÉʖ¦â©Ġu¦öČ^â£Ăh–šĖMÈÄw‚\\fŦ°W ¢¾luŸD„wŠ\\̀ʉÌÛM…Ā[bӞEn}¶Vc…ê“sƒ"]],"encodeOffsets":[[[129102,52189]]]}},{"type":"Feature","id":"210000","properties":{"id":"210000","cp":[123.429096,41.796767],"name":"辽宁","childNum":16},"geometry":{"type":"MultiPolygon","coordinates":[["@@L–Ž@@s™a"],["@@MnNm"],["@@d‚c"],["@@eÀ‚C@b‚“‰"],["@@f‡…Xwkbr–Ä`qg"],["@@^jtW‘Q"],["@@~ Y]c"],["@@G`ĔN^_¿Z‚ÃM"],["@@iX¶B‹Y"],["@@„YƒZ"],["@@L_{Epf"],["@@^WqCT\\"],["@@\\[“‹§t|”¤_"],["@@m`n_"],["@@Ïxnj{q_×^Giip"],["@@@œé^B†‡ntˆaÊU—˜Ÿ]x ¯ÄPIJ­°h€ʙK³†VˆÕ@Y~†|EvĹsDŽ¦­L^p²ŸÒG ’Ël]„xxÄ_˜fT¤Ď¤cŽœP„–C¨¸TVjbgH²sdÎdHt`Bˆ—²¬GJję¶[ÐhjeXdlwhšðSȦªVÊπ‹Æ‘Z˜ÆŶ®²†^ŒÎyÅÎcPqń“ĚDMħĜŁH­ˆk„çvV[ij¼W–‚YÀäĦ’‘`XlžR`žôLUVžfK–¢†{NZdĒª’YĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~†źBŽ|¦ÕœEž¤Ð`\\|Kˆ˜UnnI]¤ÀÂĊnŎ™R®Ő¿¶\\ÀøíDm¦ÎbŨab‰œaĘ\\ľã‚¸a˜tÎSƐ´©v\\ÖÚÌǴ¤Â‡¨JKr€Z_Z€fjþhPkx€`Y”’RIŒjJcVf~sCN¤ ˆE‚œhæm‰–sHy¨SðÑÌ\\\\ŸĐRZk°IS§fqŒßýáЍÙÉÖ[^¯ǤŲ„ê´\\¦¬ĆPM¯£Ÿˆ»uïpùzEx€žanµyoluqe¦W^£ÊL}ñrkqWňûP™‰UP¡ôJŠoo·ŒU}£Œ„[·¨@XŒĸŸ“‹‹DXm­Ûݏº‡›GU‹CÁª½{íĂ^cj‡k“¶Ã[q¤“LÉö³cux«zZfƒ²BWÇ®Yß½ve±ÃC•ý£W{Ú^’q^sÑ·¨‹ÍOt“¹·C¥‡GD›rí@wÕKţ݋˜Ÿ«V·i}xËÍ÷‘i©ĝ‡ɝǡ]ƒˆ{c™±OW‹³Ya±Ÿ‰_穂Hžĕoƫ€Ňqƒr³‰Lys[„ñ³¯OS–ďOMisZ†±ÅFC¥Pq{‚Ã[Pg}\\—¿ghćO…•k^ģÁFıĉĥM­oEqqZûěʼn³F‘¦oĵ—hŸÕP{¯~TÍlª‰N‰ßY“Ð{Ps{ÃVU™™eĎwk±ʼnVÓ½ŽJãÇÇ»Jm°dhcÀff‘dF~ˆ€ĀeĖ€d`sx² šƒ®EżĀdQ‹Âd^~ăÔHˆ¦\\›LKpĄVez¤NP ǹӗR™ÆąJSh­a[¦´Âghwm€BÐ¨źhI|žVVŽ—Ž|p] ¼èNä¶ÜBÖ¼“L`‚¼bØæŒKV”ŸpoœúNZÞÒKxpw|ÊEMnzEQšŽIZ”ŽZ‡NBˆčÚFÜçmĩ‚WĪñt‘ÞĵÇñZ«uD‚±|Əlij¥ãn·±PmÍa‰–da‡ CL‡Ǒkùó¡³Ï«QaċϑOÃ¥ÕđQȥċƭy‹³ÃA"]],"encodeOffsets":[[[123686,41445]],[[126019,40435]],[[124393,40128]],[[126117,39963]],[[125322,40140]],[[126686,40700]],[[126041,40374]],[[125584,40168]],[[125453,40165]],[[125362,40214]],[[125280,40291]],[[125774,39997]],[[125976,40496]],[[125822,39993]],[[125509,40217]],[[122731,40949]]]}},{"type":"Feature","id":"220000","properties":{"id":"220000","cp":[125.3245,43.886841],"name":"吉林","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@‘p䔳PClƒFbbÍzš€wBG’ĭ€Z„Åi“»ƒlY­ċ²SgŽkÇ£—^S‰“qd¯•‹R…©éŽ£¯S†\\cZ¹iűƏCuƍÓX‡oR}“M^o•£…R}oªU­F…uuXHlEŕ‡€Ï©¤ÛmTŽþ¤D–²ÄufàÀ­XXȱAe„yYw¬dvõ´KÊ£”\\rµÄl”iˆdā]|DÂVŒœH¹ˆÞ®ÜWnŒC”Œķ W‹§@\\¸‹ƒ~¤‹Vp¸‰póIO¢ŠVOšŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúvð‡¼¤ N°ąO¥«³[ƒéǡű_°Õ\\ÚÊĝŽþâőàerR¨­JYlďQ[ ÏYëЧTGz•tnŠß¡gFkMŸāGÁ¤ia ɉ™È¹`\\xs€¬dĆkNnuNUŠ–užP@‚vRY¾•–\\¢…ŒGªóĄ~RãÖÎĢù‚đŴÕhQŽxtcæëSɽʼníëlj£ƍG£nj°KƘµDsØÑpyƸ®¿bXp‚]vbÍZuĂ{nˆ^IüœÀSք”¦EŒvRÎûh@℈[‚Əȉô~FNr¯ôçR±ƒ­HÑl•’Ģ–^¤¢‚OðŸŒævxsŒ]ÞÁTĠs¶¿âƊGW¾ìA¦·TѬ†è¥€ÏÐJ¨¼ÒÖ¼ƒƦɄxÊ~S–tD@ŠĂ¼Ŵ¡jlºWžvЉˆzƦZЎ²CH— „Axiukd‹ŒGgetqmcžÛ£Ozy¥cE}|…¾cZ…k‚‰¿uŐã[oxGikfeäT@…šSUwpiÚFM©’£è^ڟ‚`@v¶eň†f h˜eP¶žt“äOlÔUgƒÞzŸU`lœ}ÔÆUvØ_Ō¬Öi^ĉi§²ÃŠB~¡Ĉ™ÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYx‘ƘDVÇĺĿg¿cwÅ\\¹˜¥Yĭlœ¤žOv†šLjM_a W`zļMž·\\swqÝSA‡š—q‰Śij¯Š‘°kŠRē°wx^Đkǂғ„œž“œŽ„‹\\]˜nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°“G³¼XÀ““™¤¹i´o¤ŃšŸÈ`̃DzÄUĞd\\i֚ŒˆmÈBĤÜɲDEh LG¾ƀľ{WaŒYÍȏĢĘÔRîĐj‹}Ǟ“ccj‡oUb½š{“h§Ǿ{K‹ƖµÎ÷žGĀÖŠåưÎs­l›•yiē«‹`姝H¥Ae^§„GK}iã\\c]v©ģZ“mÃ|“[M}ģTɟĵ‘Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜYünĎųVY^’˜ydõkÅZW„«WUa~U·Sb•wGçǑ‚“iW^q‹F‚“›uNĝ—·Ew„‹UtW·Ýďæ©PuqEzwAV•—XR‰ãQ`­©GŒM‡ehc›c”ďϝd‡©ÑW_ϗYƅŒ»…é\\ƒɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_ý‘L¡‘ýŸqT^rme™\\Pp•ZZbƒyŸ’uybQ—efµ]UhĿDCmûvašÙNSkCwn‰cćfv~…Y‹„ÇG"],"encodeOffsets":[[130196,42528]]}},{"type":"Feature","id":"230000","properties":{"id":"230000","cp":[128.642464,46.756967],"name":"黑龙江","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@UƒµNÿ¥īè灋•HÍøƕ¶LŒǽ|g¨|”™Ža¾pViˆdd”~ÈiŒíďÓQġėǐZ΋ŽXb½|ſÃH½ŸKFgɱCģÛÇA‡n™‹jÕc[VĝDZÃ˄Ç_™ £ń³pŽj£º”š¿”»WH´¯”U¸đĢmžtĜyzzNN|g¸÷äűѱĉā~mq^—Œ[ƒ”››”ƒǁÑďlw]¯xQĔ‰¯l‰’€°řĴrŠ™˜BˆÞTxr[tޏĻN_yŸX`biN™Ku…P›£k‚ZĮ—¦[ºxÆÀdhŽĹŀUÈƗCw’áZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFćš}¢‰A±Äj¨]ĊÕjŋ«×`VuÓś~_kŷVÝyh„“VkÄãPs”Oµ—fŸge‚Ň…µf@u_Ù ÙcŸªNªÙEojVx™T@†ãSefjlwH\\pŏäÀvŠŽlY†½d{†F~¦dyz¤PÜndsrhf‹HcŒvlwjFœ£G˜±DύƥY‡yϊu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|Cš˜zxAè¥bœfudTrFWÁ¹Am|˜ĔĕsķÆF‡´Nš‰}ć…UŠÕ@Áijſmužç’uð^ÊýowŒFzØÎĕNőžǏȎôªÌŒDŽàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°ƒUŸzou‡xe]}Ž…AyȑW¯ÌmK‡“Q]‹Īºif¸ÄX|sZt|½ÚUÎ lkš^p{f¤lˆºlÆW –€A²˜PVܜPH”Êâ]ÎĈÌÜk´\\@qàsĔÄQºpRij¼èi†`¶—„bXƒrBgxfv»ŽuUiˆŒ^v~”J¬mVp´£Œ´VWrnP½ì¢BX‚¬h™ŠðX¹^TjVœŠriªj™tŊÄm€tPGx¸bgRšŽsT`ZozÆO]’ÒFô҆Oƒ‡ŊŒvŞ”p’cGŒêŠsx´DR–Œ{A†„EOr°Œ•žx|íœbˆ³Wm~DVjºéNN†Ëܲɶ­GƒxŷCStŸ}]ûō•SmtuÇÃĕN•™āg»šíT«u}ç½BĵÞʣ¥ëÊ¡Mێ³ãȅ¡ƋaǩÈÉQ‰†G¢·lG|›„tvgrrf«†ptęŘnŠÅĢr„I²¯LiØsPf˜_vĠd„xM prʹšL¤‹¤‡eˌƒÀđK“žïÙVY§]I‡óáĥ]ķ†Kˆ¥Œj|pŇ\\kzţ¦šnņäÔVĂîά|vW’®l¤èØr‚˜•xm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄ–Ą»ƢjȦOǺ¨ìSŖÆƬy”Qœv`–cwƒZSÌ®ü±DŽ]ŀç¬B¬©ńzƺŷɄeeOĨS’Œfm Ċ‚ƀP̎ēz©Ċ‚ÄÕÊmgŸÇsJ¥ƔˆŊśæ’΁Ñqv¿íUOµª‰ÂnĦÁ_½ä@ê텣P}Ġ[@gġ}g“ɊדûÏWXá¢užƻÌsNͽƎÁ§č՛AēeL³àydl›¦ĘVçŁpśdžĽĺſʃQíÜçÛġԏsĕ¬—Ǹ¯YßċġHµ ¡eå`ļƒrĉŘóƢFì“ĎWøxÊk†”ƈdƬv|–I|·©NqńRŀƒ¤é”eŊœŀ›ˆàŀU²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^Xm‡—HĊĕË«W·ċëx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ħ…ŨK~”ȰCĐ´Ƕ£’fNÎèâw¢XnŮeÂÆĶŽ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®‚ØCÔ ŬGƠ”ƦYĜ‡ĘÜƬDJ—g_ͥœ@čŅĻA“¶¯@wÎqC½Ĉ»NŸăëK™ďÍQ“Ùƫ[«Ãí•gßÔÇOÝáW‘ñuZ“¯ĥ€Ÿŕā¡ÑķJu¤E Ÿå¯°WKɱ_d_}}vyŸõu¬ï¹ÓU±½@gÏ¿rýD‰†g…Cd‰µ—°MFYxw¿CG£‹Rƛ½Õ{]L§{qqąš¿BÇƻğëšܭNJË|c²}Fµ}›ÙRsÓpg±ŠQNqǫŋRwŕnéÑÉKŸ†«SeYR…ŋ‹@{¤SJ}šD Ûǖ֍Ÿ]gr¡µŷjqWÛham³~S«“„›Þ]"]],"encodeOffsets":[[[134456,44547]]]}},{"type":"Feature","id":"320000","properties":{"id":"320000","cp":[119.767413,33.041544],"name":"江苏","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@cþÅPiŠ`ZŸRu¥É\\]~°ŽY`µ†Óƒ^phÁbnÀşúŽòa–ĬºTÖŒb‚˜e¦¦€{¸ZâćNpŒ©žHr|^ˆmjhŠSEb\\afv`sz^lkŽlj‹Ätg‹¤D˜­¾Xš¿À’|ДiZ„ȀåB·î}GL¢õcßjaŸyBFµÏC^ĭ•cÙt¿sğH]j{s©HM¢ƒQnDÀ©DaÜތ·jgàiDbPufjDk`dPOîƒhw¡ĥ‡¥šG˜ŸP²ĐobºrY†„î¶aHŢ´ ]´‚rılw³r_{£DB_Ûdåuk|ˆŨ¯F Cºyr{XFy™e³Þċ‡¿Â™kĭB¿„MvÛpm`rÚã”@ƹhågËÖƿxnlč¶Åì½Ot¾dJlŠVJʜǀœŞqvnOŠ^ŸJ”Z‘ż·Q}ê͎ÅmµÒ]Žƍ¦Dq}¬R^èĂ´ŀĻĊIԒtžIJyQŐĠMNtœR®òLh‰›Ěs©»œ}OӌGZz¶A\\jĨFˆäOĤ˜HYš†JvÞHNiÜaϚɖnFQlšNM¤ˆB´ĄNöɂtp–Ŭdf先‹qm¿QûŠùއÚb¤uŃJŴu»¹Ą•lȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Y™xci‡tğ®jű¢KOķ•Coy`å®VTa­_Ā]ŐÝɞï²ʯÊ^]afYǸÃĆēĪȣJđ͍ôƋĝÄ͎ī‰çÛɈǥ£­ÛmY`ó£Z«§°Ó³QafusNıDž_k}¢m[ÝóDµ—¡RLčiXy‡ÅNïă¡¸iĔϑNÌŕoēdōîåŤûHcs}~Ûwbù¹£¦ÓCt‹OPrƒE^ÒoŠg™ĉIµžÛÅʹK…¤½phMŠü`o怆ŀ"],"encodeOffsets":[[121740,32276]]}},{"type":"Feature","id":"330000","properties":{"id":"330000","cp":[120.153576,29.287459],"name":"浙江","childNum":45},"geometry":{"type":"MultiPolygon","coordinates":[["@@E^dQ]K"],["@@jX^j‡"],["@@sfŠbU‡"],["@@qP\\xz[ck"],["@@‘Rƒ¢‚FX}°[s_"],["@@Cbœ\\—}"],["@@e|v\\la{u"],["@@v~u}"],["@@QxÂF¯}"],["@@¹nŒvÞs¯o"],["@@rSkUEj"],["@@bi­ZŒP"],["@@p[}INf"],["@@À¿€"],["@@¹dnbŒ…"],["@@rSŸBnR"],["@@g~h}"],["@@FlEk"],["@@OdPc"],["@@v[u\\"],["@@FjâL~wyoo~›sµL–\\"],["@@¬e¹aNˆ"],["@@\\nÔ¡q]L³ë\\ÿ®ŒQ֎"],["@@ÊA­©[¬"],["@@KxŒv­"],["@@@hlIk]"],["@@pW{o||j"],["@@Md|_mC"],["@@¢…X£ÏylD¼XˆtH"],["@@hlÜ[LykAvyfw^Ež›¤"],["@@fp¤Mus“R"],["@@®_ma~•LÁ¬šZ"],["@@iM„xZ"],["@@ZcYd"],["@@Z~dOSo|A¿qZv"],["@@@`”EN¡v"],["@@|–TY{"],["@@@n@m"],["@@XWkCT\\"],["@@ºwšZRkĕWO¢"],["@@™X®±Grƪ\\ÔáXq{‹"],["@@ůTG°ĄLHm°UC‹"],["@@¤Ž€aÜx~}dtüGæţŎíĔcŖpMËВj碷ðĄÆMzˆjWKĎ¢Q¶˜À_꒔_Bı€i«pZ€gf€¤Nrq]§ĂN®«H±‡yƳí¾×ŸīàLłčŴǝĂíÀBŖÕªˆŠÁŖHŗʼnåqûõi¨hÜ·ƒñt»¹ýv_[«¸m‰YL¯‰Qª…mĉÅdMˆ•gÇjcº«•ęœ¬­K­´ƒB«Âącoċ\\xKd¡gěŧ«®á’[~ıxu·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZB{ŠaM‘µ‰fzʼnfåÂŧįƋǝÊĕġć£g³ne­ą»@­¦S®‚\\ßðCšh™iqªĭiAu‡A­µ”_W¥ƣO\\lċĢttC¨£t`ˆ™PZäuXßBs‡Ļyek€OđġĵHuXBšµ]׌‡­­\\›°®¬F¢¾pµ¼kŘó¬Wät’¸|@ž•L¨¸µr“ºù³Ù~§WI‹ŸZWŽ®’±Ð¨ÒÉx€`‰²pĜ•rOògtÁZ}þÙ]„’¡ŒŸFK‚wsPlU[}¦Rvn`hq¬\\”nQ´ĘRWb”‚_ rtČFI֊kŠŠĦPJ¶ÖÀÖJĈĄTĚòžC ²@Pú…Øzœ©PœCÈÚœĒ±„hŖ‡l¬â~nm¨f©–iļ«m‡nt–u†ÖZÜÄj“ŠLŽ®E̜Fª²iÊxبžIÈhhst"],["@@o\\V’zRZ}y"],["@@†@°¡mۛGĕ¨§Ianá[ýƤjfæ‡ØL–•äGr™"]],"encodeOffsets":[[[125592,31553]],[[125785,31436]],[[125729,31431]],[[125513,31380]],[[125223,30438]],[[125115,30114]],[[124815,29155]],[[124419,28746]],[[124095,28635]],[[124005,28609]],[[125000,30713]],[[125111,30698]],[[125078,30682]],[[125150,30684]],[[124014,28103]],[[125008,31331]],[[125411,31468]],[[125329,31479]],[[125626,30916]],[[125417,30956]],[[125254,30976]],[[125199,30997]],[[125095,31058]],[[125083,30915]],[[124885,31015]],[[125218,30798]],[[124867,30838]],[[124755,30788]],[[124802,30809]],[[125267,30657]],[[125218,30578]],[[125200,30562]],[[124968,30474]],[[125167,30396]],[[124955,29879]],[[124714,29781]],[[124762,29462]],[[124325,28754]],[[123990,28459]],[[125366,31477]],[[125115,30363]],[[125369,31139]],[[122495,31878]],[[125329,30690]],[[125192,30787]]]}},{"type":"Feature","id":"340000","properties":{"id":"340000","cp":[117.283042,31.26119],"name":"安徽","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@^iuLX^"],["@@‚e©Ehl"],["@@°ZÆëϵmkǀwÌÕæhºgBĝâqÙĊz›ÖgņtÀÁÊÆá’hEz|WzqD¹€Ÿ°E‡ŧl{ævÜcA`¤C`|´qžxIJkq^³³ŸGšµbƒíZ…¹qpa±ď OH—¦™Ħˆx¢„gPícOl_iCveaOjCh߸i݋bÛªCC¿€m„RV§¢A|t^iĠGÀtÚs–d]ĮÐDE¶zAb àiödK¡~H¸íæAžǿYƒ“j{ď¿‘™À½W—®£ChŒÃsiŒkkly]_teu[bFa‰Tig‡n{]Gqªo‹ĈMYá|·¥f¥—őaSÕė™NµñĞ«ImŒ_m¿Âa]uĜp …Z_§{Cƒäg¤°r[_Yj‰ÆOdý“[ŽI[á·¥“Q_n‡ùgL¾mv™ˊBÜÆ¶ĊJhšp“c¹˜O]iŠ]œ¥ jtsggJǧw×jÉ©±›EFˍ­‰Ki”ÛÃÕYv…s•ˆm¬njĻª•§emná}k«ŕˆƒgđ²Ù›DǤ›í¡ªOy›†×Où±@DŸñSęćăÕIÕ¿IµĥO‰‰jNÕËT¡¿tNæŇàåyķrĕq§ÄĩsWÆßŽF¶žX®¿‰mŒ™w…RIޓfßoG‘³¾©uyH‘į{Ɓħ¯AFnuP…ÍÔzšŒV—dàôº^Ðæd´€‡oG¤{S‰¬ćxã}›ŧ×Kǥĩ«žÕOEзÖdÖsƘѨ[’Û^Xr¢¼˜§xvěƵ`K”§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔē…ßúLÃϖ_ÈÏ|]ÂÏFl”g`bšežž€n¾¢pU‚h~ƴ˶_‚r sĄ~cž”ƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³…]’u}›f…ïQl{skl“oNdŸjŸäËzDvčoQŠďHI¦rb“tHĔ~BmlRš—V_„ħTLnñH±’DžœL‘¼L˜ªl§Ťa¸ŒĚlK²€\\RòvDcÎJbt[¤€D@®hh~kt°ǾzÖ@¾ªdb„YhüóZ ň¶vHrľ\\ʗJuxAT|dmÀO„‹[ÃԋG·ĚąĐlŪÚpSJ¨ĸˆLvÞcPæķŨŽ®mАˆálŸwKhïgA¢ųƩޖ¤OȜm’°ŒK´"]],"encodeOffsets":[[[121722,32278]],[[119475,30423]],[[119168,35472]]]}},{"type":"Feature","id":"350000","properties":{"id":"350000","cp":[118.306239,26.075302],"name":"福建","childNum":18},"geometry":{"type":"MultiPolygon","coordinates":[["@@“zht´‡]"],["@@aj^~ĆG—©O"],["@@ed¨„C}}i"],["@@@vˆPGsQ"],["@@‰sBz‚ddW]Q"],["@@SލQ“{"],["@@NŽVucW"],["@@qptBAq"],["@@‰’¸[mu"],["@@Q\\pD]_"],["@@jSwUadpF"],["@@eXª~ƒ•"],["@@AjvFso"],["@@fT–›_Çí\\Ÿ™—v|ba¦jZÆy€°"],["@@IjJi"],["@@wJI€ˆxš«¼AoNe{M­"],["@@K‰±¡Óˆ”ČäeZ"],["@@k¡¹Eh~c®wBk‹UplÀ¡I•~Māe£bN¨gZý¡a±Öcp©PhžI”Ÿ¢Qq…ÇGj‹|¥U™ g[Ky¬ŏ–v@OpˆtÉEŸF„\\@ åA¬ˆV{Xģ‰ĐBy…cpě…¼³Ăp·¤ƒ¥o“hqqÚ¡ŅLsƒ^ᗞ§qlŸÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ß–ėu›ĕeûҍiÁŧSW¥˜QŠûŗ½ùěcݧSùĩąSWó«íęACµ›eR—åǃRCÒÇZÍ¢‹ź±^dlsŒtjD¸•‚ZpužÔâÒH¾oLUêÃÔjjēò´ĄW‚ƛ…^Ñ¥‹ĦŸ@Çò–ŠmŒƒOw¡õyJ†yD}¢ďÑÈġfŠZd–a©º²z£šN–ƒjD°Ötj¶¬ZSÎ~¾c°¶Ðm˜x‚O¸¢Pl´žSL|¥žA†ȪĖM’ņIJg®áIJČĒü` ŽQF‡¬h|ÓJ@zµ |ê³È ¸UÖŬŬÀEttĸr‚]€˜ðŽM¤ĶIJHtÏ A’†žĬkvsq‡^aÎbvŒd–™fÊòSD€´Z^’xPsÞrv‹ƞŀ˜jJd×ŘÉ ®A–ΦĤd€xĆqAŒ†ZR”ÀMźŒnĊ»ŒİÐZ— YX–æJŠyĊ²ˆ·¶q§·–K@·{s‘Xãô«lŗ¶»o½E¡­«¢±¨Yˆ®Ø‹¶^A™vWĶGĒĢžPlzfˆļŽtàAvWYãšO_‡¤sD§ssČġ[kƤPX¦Ž`¶“ž®ˆBBvĪjv©šjx[L¥àï[F…¼ÍË»ğV`«•Ip™}ccÅĥZE‹ãoP…´B@ŠD—¸m±“z«Ƴ—¿å³BRضˆœWlâþäą`“]Z£Tc— ĹGµ¶H™m@_©—kŒ‰¾xĨ‡ôȉðX«½đCIbćqK³Á‹Äš¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNxij¤D¢ŽîĎÎB§°_JœGsƒ¥E@…¤uć…P‘å†cuMuw¢BI¿‡]zG¹guĮck\\_"]],"encodeOffsets":[[[123250,27563]],[[122541,27268]],[[123020,27189]],[[122916,27125]],[[122887,26845]],[[122808,26762]],[[122568,25912]],[[122778,26197]],[[122515,26757]],[[122816,26587]],[[123388,27005]],[[122450,26243]],[[122578,25962]],[[121255,25103]],[[120987,24903]],[[122339,25802]],[[121042,25093]],[[122439,26024]]]}},{"type":"Feature","id":"360000","properties":{"id":"360000","cp":[115.592151,27.676493],"name":"江西","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@ĢĨƐgÂMD~ņªe^\\^§„ý©j׍cZ†Ø¨zdÒa¶ˆlҍJŒìõ`oz÷@¤u޸´†ôęöY¼‰HČƶajlÞƩ¥éZ[”|h}^U Œ ¥p„ĄžƦO lt¸Æ €Q\\€ŠaÆ|CnÂOjt­ĚĤd’ÈŒF`’¶„@Ðë” ¦ōҞ¨Sêv†HĢûXD®…QgėWiØPÞìºr¤dž€NĠ¢l–•ĄtZoœCƞÔºCxrpĠV®Ê{f_Y`_ƒeq’’®Aot`@o‚DXfkp¨|Šs¬\\D‘ÄSfè©Hn¬…^DhÆyøJh“ØxĢĀLʈ„ƠPżċĄwȠ̦G®ǒĤäTŠÆ~ĦwŠ«|TF¡Šn€c³Ïå¹]ĉđxe{ÎӐ†vOEm°BƂĨİ|G’vz½ª´€H’àp”eJ݆Qšxn‹ÀŠW­žEµàXÅĪt¨ÃĖrÄwÀFÎ|ňÓMå¼ibµ¯»åDT±m[“r«_gŽmQu~¥V\\OkxtL E¢‹ƒ‘Ú^~ýê‹Pó–qo슱_Êw§ÑªåƗ⼋mĉŹ‹¿NQ“…YB‹ąrwģcÍ¥B•Ÿ­ŗÊcØiI—žƝĿuŒqtāwO]‘³YCñTeɕš‹caub͈]trlu€ī…B‘ПGsĵıN£ï—^ķqss¿FūūV՟·´Ç{éĈý‰ÿ›OEˆR_ŸđûIċâJh­ŅıN‘ȩĕB…¦K{Tk³¡OP·wn—µÏd¯}½TÍ«YiµÕsC¯„iM•¤™­•¦¯P|ÿUHv“he¥oFTu‰õ\\ŽOSs‹MòđƇiaºćXŸĊĵà·çhƃ÷ǜ{‘ígu^›đg’m[×zkKN‘¶Õ»lčÓ{XSƉv©_ÈëJbVk„ĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B„±’ÌŒK˜y’áV‡¼Ã~­…`g›ŸsÙfI›Ƌlę¹e|–~udjˆuTlXµf`¿JdŠ[\\˜„L‚‘²"],"encodeOffsets":[[116689,26234]]}},{"type":"Feature","id":"370000","properties":{"id":"370000","cp":[118.000923,36.275807],"name":"山东","childNum":13},"geometry":{"type":"MultiPolygon","coordinates":[["@@Xjd]{K"],["@@itbFHy"],["@@HlGk"],["@@T‚ŒGŸy"],["@@K¬˜•‹U"],["@@WdXc"],["@@PtOs"],["@@•LnXhc"],["@@ppVƒu]Or"],["@@cdzAUa"],["@@udRhnCI‡"],["@@ˆoIƒpR„"],["@@Ľč{fzƤî’Kš–ÎMĮ]†—ZFˆ½Y]â£ph’™š¶¨râøÀ†ÎǨ¤^ºÄ”Gzˆ~grĚĜlĞÆ„LĆdž¢Îo¦–cv“Kb€gr°Wh”mZp ˆL]LºcU‰Æ­n”żĤÌǜbAnrOAœ´žȊcÀbƦUØrĆUÜøœĬƞ†š˜Ez„VL®öØBkŖÝĐ˹ŧ̄±ÀbÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿ¸‘lµ¾Z|†ZWyFYŸ¨Mf~C¿`€à_RÇzwƌfQnny´INoƬˆèôº|sT„JUš›‚L„îVj„ǎ¾Ē؍‚Dz²XPn±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«M`‡¶d¡ô‰Ö°šmȰBÔjjŒ´PM|”c^d¤u•ƒ¤Û´Œä«ƢfPk¶Môlˆ]Lb„}su^ke{lC‘…M•rDŠÇ­]NÑFsmoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ïW…uøCǷ돡ąuhÛ¡^Kx•C`C\\bÅxì²ĝÝ¿_N‰īCȽĿåB¥¢·IŖÕy\\‡¹kx‡Ã£Č×GDyÕ¤ÁçFQ¡„KtŵƋ]CgÏAùSed‡cÚź—ŠuYfƒyMmhUWpSyGwMPqŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕBmœ@Io‚g——Z¯u‹TMx}C‘‰VK‚ï{éƵP—™_K«™pÛÙqċtkkù]gŽ‹Tğwo•ɁsMõ³ă‡AN£™MRkmEʕč™ÛbMjÝGu…IZ™—GPģ‡ãħE[iµBEuŸDPԛ~ª¼ętŠœ]ŒûG§€¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~ݏY’I“] P‰umŝrƿ›‰›Iā‹[x‰edz‹L‘¯v¯s¬ÁY…~}…ťuٌg›ƋpÝĄ_ņī¶ÏSR´ÁP~ž¿Cyžċßdwk´Ss•X|t‰`Ä Èð€AªìÎT°¦Dd–€a^lĎDĶÚY°Ž`ĪŴǒˆ”àŠv\\ebŒZH„ŖR¬ŢƱùęO•ÑM­³FۃWp[ƒ"]],"encodeOffsets":[[[123806,39303]],[[123821,39266]],[[123742,39256]],[[123702,39203]],[[123649,39066]],[[123847,38933]],[[123580,38839]],[[123894,37288]],[[123043,36624]],[[123344,38676]],[[123522,38857]],[[123628,38858]],[[118260,36742]]]}},{"type":"Feature","id":"410000","properties":{"id":"410000","cp":[113.665412,33.757975],"name":"河南","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@•ýL™ùµP³swIÓxcŢĞð†´E®žÚPt†ĴXØx¶˜@«ŕŕQGƒ‹Yfa[şu“ßǩ™đš_X³ijÕčC]kbc•¥CS¯ëÍB©÷‹–³­Siˆ_}m˜YTtž³xlàcȂzÀD}ÂOQ³ÐTĨ¯†ƗòËŖ[hœł‹Ŧv~††}ÂZž«¤lPǕ£ªÝŴÅR§ØnhcŒtâk‡nύ­ľŹUÓÝdKuķ‡I§oTũÙďkęĆH¸ÓŒ\\ăŒ¿PcnS{wBIvɘĽ[GqµuŸŇôYgûƒZcaŽ©@½Õǽys¯}lgg@­C\\£as€IdÍuCQñ[L±ęk·‹ţb¨©kK—’»›KC²‘òGKmĨS`ƒ˜UQ™nk}AGē”sqaJ¥ĐGR‰ĎpCuÌy ã iMc”plk|tRk†ðœev~^‘´†¦ÜŽSí¿_iyjI|ȑ|¿_»d}qŸ^{“Ƈdă}Ÿtqµ`Ƴĕg}V¡om½fa™Ço³TTj¥„tĠ—Ry”K{ùÓjuµ{t}uËR‘iŸvGŠçJFjµŠÍyqΘàQÂFewixGw½Yŷpµú³XU›½ġy™łå‰kÚwZXˆ·l„¢Á¢K”zO„Λ΀jc¼htoDHr…|­J“½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQ…Ťƒ]MÛfaQpě±ǽ¾]u­Fu‹÷nƒ™čįADp}AjmcEǒaª³o³ÆÍSƇĈÙDIzˑ赟^ˆKLœ—i—Þñ€[œƒaA²zz‰Ì÷Dœ|[šíijgf‚ÕÞd®|`ƒĆ~„oĠƑô³Ŋ‘D×°¯CsŠøÀ«ì‰UMhTº¨¸ǡîS–Ô„DruÂÇZ•ÖEŽ’vPZ„žW”~؋ÐtĄE¢¦Ðy¸bŠô´oŬ¬Ž²Ês~€€]®tªašpŎJ¨Öº„_ŠŔ–`’Ŗ^Ѝ\\Ĝu–”~m²Ƹ›¸fW‰ĦrƔ}Î^gjdfÔ¡J}\\n C˜¦þWxªJRÔŠu¬ĨĨmF†dM{\\d\\ŠYÊ¢ú@@¦ª²SŠÜsC–}fNècbpRmlØ^g„d¢aÒ¢CZˆZxvÆ¶N¿’¢T@€uCœ¬^ĊðÄn|žlGl’™Rjsp¢ED}€Fio~ÔNŽ‹„~zkĘHVsDzßjƒŬŒŠŢ`Pûàl¢˜\\ÀœEhŽİgÞē X¼Pk–„|m"],"encodeOffsets":[[118256,37017]]}},{"type":"Feature","id":"420000","properties":{"id":"420000","cp":[113.298572,30.684355],"name":"湖北","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@AB‚"],["@@lskt"],["@@¾«}{ra®pîÃ\\™›{øCŠËyyB±„b\\›ò˜Ý˜jK›‡L ]ĎĽÌ’JyÚCƈćÎT´Å´pb©È‘dFin~BCo°BĎĚømvŒ®E^vǾ½Ĝ²Ro‚bÜeNŽ„^ĺ£R†¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I”¾®I†{GqpCgyl{‡£œÍƒÍyPL“¡ƒ¡¸kW‡xYlÙæŠšŁĢzœ¾žV´W¶ùŸo¾ZHxjwfx„GNÁ•³Xéæl¶‰EièIH‰ u’jÌQ~v|sv¶Ôi|ú¢Fh˜Qsğ¦ƒSiŠBg™ÐE^ÁÐ{–čnOÂȞUÎóĔ†ÊēIJ}Z³½Mŧïeyp·uk³DsѨŸL“¶_œÅuèw»—€¡WqÜ]\\‘Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟO‡ƒKÉġÿ×wg”÷IÅzCg†]m«ªGeçÃTC’«[‰t§{loWeC@ps_Bp‘­r‘„f_``Z|ei¡—oċMqow€¹DƝӛDYpûs•–‹Ykıǃ}s¥ç³[§ŸcYЧHK„«Qy‰]¢“wwö€¸ïx¼ņ¾Xv®ÇÀµRĠЋžHMž±cÏd„ƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\}pĭÉI±Ñy…¿³x¯N‰o‰|¹H™ÏÛm‹júË~Tš•u˜ęjCöAwě¬R’đl¯ Ñb­‰ŇT†Ŀ_[Œ‘IčĄʿnM¦ğ\\É[T·™k¹œ©oĕ@A¾w•ya¥Y\\¥Âaz¯ãÁ¡k¥ne£Ûw†E©Êō¶˓uoj_Uƒ¡cF¹­[Wv“P©w—huÕyBF“ƒ`R‹qJUw\\i¡{jŸŸEPïÿ½fć…QÑÀQ{ž‚°‡fLԁ~wXg—ītêݾ–ĺ‘Hdˆ³fJd]‹HJ²…E€ƒoU¥†HhwQsƐ»Xmg±çve›]Dm͂PˆoCc¾‹_h”–høYrŊU¶eD°Č_N~øĹĚ·`z’]Äþp¼…äÌQŒv\\rCŒé¾TnkžŐڀÜa‡“¼ÝƆ̶Ûo…d…ĔňТJq’Pb ¾|JŒ¾fXŠƐîĨ_Z¯À}úƲ‹N_ĒĊ^„‘ĈaŐyp»CÇĕKŠšñL³ŠġMŒ²wrIÒŭxjb[œžn«øœ˜—æˆàƒ ^²­h¯Ú€ŐªÞ¸€Y²ĒVø}Ā^İ™´‚LŠÚm„¥ÀJÞ{JVŒųÞŃx×sxxƈē ģMř–ÚðòIf–Ċ“Œ\\Ʈ±ŒdʧĘD†vČ_Àæ~DŒċ´A®µ†¨ØLV¦êHÒ¤"]],"encodeOffsets":[[[113712,34000]],[[115612,30507]],[[113649,34054]]]}},{"type":"Feature","id":"430000","properties":{"id":"430000","cp":[111.782279,28.09409],"name":"湖南","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@—n„FTs"],["@@ßÅÆá‰½ÔXr—†CO™“…ËR‘ïÿĩ­TooQyšÓ[‹ŅBE¬–ÎÓXa„į§Ã¸G °ITxp‰úxÚij¥Ïš–̾ŠedžÄ©ĸG…œàGh‚€M¤–Â_U}Ċ}¢pczfŠþg¤€”ÇòAV‘‹M"],["@@©K—ƒA·³CQ±Á«³BUŠƑ¹AŠtćOw™D]ŒJiØSm¯b£‘ylƒ›X…HËѱH•«–‘C^õľA–Å§¤É¥„ïyuǙuA¢^{ÌC´­¦ŷJ£^[†“ª¿‡ĕ~•Ƈ…•N… skóā‡¹¿€ï]ă~÷O§­@—Vm¡‹Qđ¦¢Ĥ{ºjԏŽŒª¥nf´•~ÕoŸž×Ûą‹MąıuZœmZcÒ IJβSÊDŽŶ¨ƚƒ’CÖŎªQؼrŭŽ­«}NÏürʬŒmjr€@ĘrTW ­SsdHzƓ^ÇÂyUi¯DÅYlŹu{hTœ}mĉ–¹¥ě‰Dÿë©ıÓ[Oº£ž“¥ót€ł¹MՄžƪƒ`Pš…Di–ÛUоÅ‌ìˆU’ñB“È£ýhe‰dy¡oċ€`pfmjP~‚kZa…ZsÐd°wj§ƒ@€Ĵ®w~^‚kÀÅKvNmX\\¨a“”сqvíó¿F„¤¡@ũÑVw}S@j}¾«pĂr–ªg àÀ²NJ¶¶Dô…K‚|^ª†Ž°LX¾ŴäPᜣEXd›”^¶›IJÞܓ~‘u¸ǔ˜Ž›MRhsR…e†`ÄofIÔ\\Ø i”ćymnú¨cj ¢»–GČìƊÿШXeĈ¾Oð Fi ¢|[jVxrIQŒ„_E”zAN¦zLU`œcªx”OTu RLÄ¢dV„i`p˔vŎµªÉžF~ƒØ€d¢ºgİàw¸Áb[¦Zb¦–z½xBĖ@ªpº›šlS¸Ö\\Ĕ[N¥ˀmĎă’J\\‹ŀ`€…ňSڊĖÁĐiO“Ĝ«BxDõĚiv—ž–S™Ì}iùŒžÜnšÐºGŠ{Šp°M´w†ÀÒzJ²ò¨ oTçüöoÛÿñŽőФ‚ùTz²CȆȸǎۃƑÐc°dPÎŸğ˶[Ƚu¯½WM¡­Éž“’B·rížnZŸÒ `‡¨GA¾\\pē˜XhÆRC­üWGġu…T靧Ŏѝ©ò³I±³}_‘‹EÃħg®ęisÁPDmÅ{‰b[Rşs·€kPŸŽƥƒóRo”O‹ŸVŸ~]{g\\“êYƪ¦kÝbiċƵŠGZ»Ěõ…ó·³vŝž£ø@pyö_‹ëŽIkѵ‡bcѧy…×dY؎ªiþž¨ƒ[]f]Ņ©C}ÁN‡»hĻħƏ’ĩ"]],"encodeOffsets":[[[115640,30489]],[[112543,27312]],[[116690,26230]]]}},{"type":"Feature","id":"440000","properties":{"id":"440000","cp":[113.280637,23.125178],"name":"广东","childNum":24},"geometry":{"type":"MultiPolygon","coordinates":[["@@QdˆAua"],["@@ƒlxDLo"],["@@sbhNLo"],["@@Ă āŸ"],["@@WltO[["],["@@Krœ]S"],["@@e„„I]y"],["@@I|„Mym"],["@@ƒÛ³LSŒž¼Y"],["@@nvºB–ëui©`¾"],["@@zdšÛ›Jw®"],["@@†°…¯"],["@@a yAª¸ËJIx،@€ĀHAmßV¡o•fu•o"],["@@šs‰ŗÃÔėAƁ›ZšÄ ~°ČP‚‹äh"],["@@‹¶Ý’Ì‚vmĞh­ı‡Q"],["@@HœŠdSjĒ¢D}war…“u«ZqadYM"],["@@elŒ\\LqqU"],["@@~rMo\\"],["@@f„^ƒC"],["@@øPªoj÷ÍÝħXČx”°Q¨ıXNv"],["@@gÇƳˆŽˆ”oˆŠˆ[~tly"],["@@E–ÆC¿‘"],["@@OŽP"],["@@w‹†đóg‰™ĝ—[³‹¡VÙæÅöM̳¹pÁaËýý©D©Ü“JŹƕģGą¤{Ùū…ǘO²«BƱéA—Ò‰ĥ‡¡«BhlmtÃPµyU¯uc“d·w_bŝcīímGOŽ|KP’ȏ‡ŹãŝIŕŭŕ@Óoo¿ē‹±ß}Ž…ŭ‚ŸIJWÈCőâUâǙI›ğʼn©I›ijEׅÁ”³Aó›wXJþ±ÌŒÜӔĨ£L]ĈÙƺZǾĆĖMĸĤfŒÎĵl•ŨnȈ‘ĐtF”Š–FĤ–‚êk¶œ^k°f¶gŠŽœ}®Fa˜f`vXŲxl˜„¦–ÔÁ²¬ÐŸ¦pqÊ̲ˆi€XŸØRDÎ}†Ä@ZĠ’s„x®AR~®ETtĄZ†–ƈfŠŠHâÒÐA†µ\\S¸„^wĖkRzŠalŽŜ|E¨ÈNĀňZTŒ’pBh£\\ŒĎƀuXĖtKL–¶G|Ž»ĺEļĞ~ÜĢÛĊrˆO˜Ùîvd]nˆ¬VœÊĜ°R֟pM††–‚ƂªFbwžEÀˆ˜©Œž\\…¤]ŸI®¥D³|ˎ]CöAŤ¦…æ’´¥¸Lv¼€•¢ĽBaô–F~—š®²GÌҐEY„„œzk¤’°ahlV՞I^‹šCxĈPŽsB‰ƒºV‰¸@¾ªR²ĨN]´_eavSi‡vc•}p}Đ¼ƌkJœÚe thœ†_¸ ºx±ò_xN›Ë‹²‘@ƒă¡ßH©Ùñ}wkNÕ¹ÇO½¿£ĕ]ly_WìIžÇª`ŠuTÅxYĒÖ¼k֞’µ‚MžjJÚwn\\h‘œĒv]îh|’È›Ƅøègž¸Ķß ĉĈWb¹ƀdéƌNTtP[ŠöSvrCZžžaGuœbo´ŖÒÇА~¡zCI…özx¢„Pn‹•‰Èñ @ŒĥÒ¦†]ƞŠV}³ăĔñiiÄÓVépKG½Ä‘ÓávYo–C·sit‹iaÀy„ŧΡÈYDÑům}‰ý|m[węõĉZÅxUO}÷N¹³ĉo_qtă“qwµŁYلǝŕ¹tïÛUïmRCº…ˆĭ|µ›ÕÊK™½R‘ē ó]‘–GªęAx–»HO£|ām‡¡diď×YïYWªʼnOeÚtĐ«zđ¹T…ā‡úE™á²\\‹ķÍ}jYàÙÆſ¿Çdğ·ùTßÇţʄ¡XgWÀLJğ·¿ÃˆOj YÇ÷Qě‹i"]],"encodeOffsets":[[[117381,22988]],[[116552,22934]],[[116790,22617]],[[116973,22545]],[[116444,22536]],[[116931,22515]],[[116496,22490]],[[116453,22449]],[[113301,21439]],[[118726,21604]],[[118709,21486]],[[113210,20816]],[[115482,22082]],[[113171,21585]],[[113199,21590]],[[115232,22102]],[[115739,22373]],[[115134,22184]],[[113056,21175]],[[119573,21271]],[[119957,24020]],[[115859,22356]],[[116561,22649]],[[116285,22746]]]}},{"type":"Feature","id":"450000","properties":{"id":"450000","cp":[108.320004,22.82402],"name":"广西","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@H– TQ§•A"],["@@ĨʪƒLƒƊDÎĹĐCǦė¸zÚGn£¾›rªŀÜt¬@֛ڈSx~øOŒ˜ŶÐÂæȠ\\„ÈÜObĖw^oބLf¬°bI lTØB̈F£Ć¹gñĤaY“t¿¤VSñœK¸¤nM†¼‚JE±„½¸šŠño‹ÜCƆæĪ^ŠĚQÖ¦^‡ˆˆf´Q†üÜʝz¯šlzUĺš@쇀p¶n]sxtx¶@„~ÒĂJb©gk‚{°‚~c°`ԙ¬rV\\“la¼¤ôá`¯¹LC†ÆbŒxEræO‚v[H­˜„[~|aB£ÖsºdAĐzNÂðsŽÞƔ…Ĥªbƒ–ab`ho¡³F«èVloޤ™ÔRzpp®SŽĪº¨ÖƒºN…ij„d`’a”¦¤F³ºDÎńĀìŠCžĜº¦Ċ•~nS›|gźvZkCÆj°zVÈÁƔ]LÊFZg…čP­kini«‹qǀcz͔Y®¬Ů»qR×ō©DՄ‘§ƙǃŵTÉĩ±ŸıdÑnYY›IJvNĆÌØÜ Öp–}e³¦m‹©iÓ|¹Ÿħņ›|ª¦QF¢Â¬ʖovg¿em‡^ucà÷gՎuŒíÙćĝ}FϼĹ{µHK•sLSđƃr‹č¤[Ag‘oS‹ŇYMÿ§Ç{Fśbky‰lQxĕƒ]T·¶[B…ÑÏGáşşƇe€…•ăYSs­FQ}­Bƒw‘tYğÃ@~…C̀Q ×W‡j˱rÉ¥oÏ ±«ÓÂ¥•ƒ€k—ŽwWűŒmcih³K›~‰µh¯e]lµ›él•E쉕E“ďs‡’mǖŧē`ãògK_ÛsUʝ“ćğ¶hŒöŒO¤Ǜn³Žc‘`¡y‹¦C‘ez€YŠwa™–‘[ďĵűMę§]X˜Î_‚훘Û]é’ÛUćİÕBƣ±…dƒy¹T^džûÅÑŦ·‡PĻþÙ`K€¦˜…¢ÍeœĥR¿Œ³£[~Œäu¼dl‰t‚†W¸oRM¢ď\\zœ}Æzdvň–{ÎXF¶°Â_„ÒÂÏL©Ö•TmuŸ¼ãl‰›īkiqéfA„·Êµ\\őDc¥ÝF“y›Ôć˜c€űH_hL܋êĺШc}rn`½„Ì@¸¶ªVLŒŠhŒ‹\\•Ţĺk~ŽĠið°|gŒtTĭĸ^x‘vK˜VGréAé‘bUu›MJ‰VÃO¡…qĂXËS‰ģãlýàŸ_ju‡YÛÒB†œG^˜é֊¶§ŽƒEG”ÅzěƒƯ¤Ek‡N[kdåucé¬dnYpAyČ{`]þ¯T’bÜÈk‚¡Ġ•vŒàh„ÂƄ¢Jî¶²"]],"encodeOffsets":[[[111707,21520]],[[107619,25527]]]}},{"type":"Feature","id":"460000","properties":{"id":"460000","cp":[109.83119,19.031971],"name":"海南","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@š¦Ŝil¢”XƦ‘ƞò–ïè§ŞCêɕrŧůÇąĻõ™·ĉ³œ̅kÇm@ċȧƒŧĥ‰Ľʉ­ƅſ“ȓÒ˦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀœÐ¾jNðĀÒRŒšZdž™zÐŘΰH¨Ƣb²_Ġ "],"encodeOffsets":[[112750,20508]]}},{"type":"Feature","id":"510000","properties":{"id":"510000","cp":[104.065735,30.659462],"name":"四川","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@LqKr"],["@@Š[ĻéV£ž_ţġñpG •réÏ·~ąSfy×͂·ºſƽiÍıƣıĻmHH}siaX@iǰÁÃ×t«ƒ­Tƒ¤J–JJŒyJ•ÈŠ`Ohߦ¡uËhIyCjmÿw…ZG……Ti‹SˆsO‰žB²ŸfNmsPaˆ{M{ŠõE‘^Hj}gYpaeuž¯‘oáwHjÁ½M¡pM“–uå‡mni{fk”\\oƒÎqCw†EZ¼K›ĝŠƒAy{m÷L‡wO×SimRI¯rK™õBS«sFe‡]fµ¢óY_ÆPRcue°Cbo׌bd£ŌIHgtrnyPt¦foaXďx›lBowz‹_{ÊéWiêE„GhܸºuFĈIxf®Ž•Y½ĀǙ]¤EyŸF²ċ’w¸¿@g¢§RGv»–áŸW`ÃĵJwi]t¥wO­½a[׈]`Ãi­üL€¦LabbTÀå’c}Íh™Æhˆ‹®BH€î|Ék­¤S†y£„ia©taį·Ɖ`ō¥Uh“O…ƒĝLk}©Fos‰´›Jm„µlŁu—…ø–nÑJWΪ–YÀïAetTžŅ‚ӍG™Ë«bo‰{ıwodƟ½ƒžOġܑµxàNÖ¾P²§HKv¾–]|•B‡ÆåoZ`¡Ø`ÀmºĠ~ÌЧnDž¿¤]wğ@sƒ‰rğu‰~‘Io”[é±¹ ¿žſđӉ@q‹gˆ¹zƱřaí°KtǤV»Ã[ĩǭƑ^ÇÓ@ỗs›Zϕ‹œÅĭ€Ƌ•ěpwDóÖሯneQˌq·•GCœýS]xŸ·ý‹q³•O՜Œ¶Qzßti{ř‰áÍÇWŝŭñzÇW‹pç¿JŒ™‚Xœĩè½cŒF–ÂLiVjx}\\N†ŇĖ¥Ge–“JA¼ÄHfÈu~¸Æ«dE³ÉMA|b˜Ò…˜ćhG¬CM‚õŠ„ƤąAvƒüV€éŀ‰_V̳ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»Ÿ“˜ÕZ³ġqDo‰y`L¬gdp°şŠp¦ėìÅĮZްIä”h‚‘ˆzŠĵœf²å ›ĚрKp‹IN|‹„Ñz]ń……·FU×é»R³™MƒÉ»GM«€ki€™ér™}Ã`¹ăÞmȝnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²Ġ…þTº·àUȞÏʦ¶†I’«dĽĢdĬ¿–»Ĕ׊h\\c¬†ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvw–ˆxBèĻĒ©Ĉ“tCĢɽŠȣ¦āæ·HĽî“ôNԓ~^¤Ɗœu„œ^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ‘®Z´ğ~Sn|ªWÚ©òzPOȸ‚bð¢|‹øĞŠŒœŒQìÛÐ@Ğ™ǎRS¤Á§d…i“´ezÝúØã]Hq„kIŸþËQǦÃsǤ[E¬ÉŪÍxXƒ·ÖƁİlƞ¹ª¹|XÊwn‘ÆƄmÀêErĒtD®ċæcQƒ”E®³^ĭ¥©l}äQto˜ŖÜqƎkµ–„ªÔĻĴ¡@Ċ°B²Èw^^RsºT£ڿœQP‘JvÄz„^Đ¹Æ¯fLà´GC²‘dt˜­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïžPȆ®âbMüÀXZ ¸£@Ś›»»QÉ­™]d“sÖ×_͖_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|Y‹Ô‚ZśÎs´xº±UŒ’ñˆt|O’ĩĠºNbgþŠJy^dÂY Į„]Řz¦gC‚³€R`Šz’¢AjŒ¸CL„¤RÆ»@­Ŏk\\Ç´£YW}z@Z}‰Ã¶“oû¶]´^N‡Ò}èN‚ª–P˜Íy¹`S°´†ATe€VamdUĐwʄvĮÕ\\ƒu‹Æŗ¨Yp¹àZÂm™Wh{á„}WØǍ•Éüw™ga§áCNęÎ[ĀÕĪgÖɪX˜øx¬½Ů¦¦[€—„NΆL€ÜUÖ´òrÙŠxR^–†J˜k„ijnDX{Uƒ~ET{ļº¦PZc”jF²Ė@Žp˜g€ˆ¨“B{ƒu¨ŦyhoÚD®¯¢˜ WòàFΤ¨GDäz¦kŮPœġq˚¥À]€Ÿ˜eŽâÚ´ªKxī„Pˆ—Ö|æ[xäJÞĥ‚s’NÖ½ž€I†¬nĨY´®Ð—ƐŠ€mD™ŝuäđđEb…e’e_™v¡}ìęNJē}q”É埁T¯µRs¡M@}ůa†a­¯wvƉåZwž\\Z{åû^›"]],"encodeOffsets":[[[108815,30935]],[[110617,31811]]]}},{"type":"Feature","id":"520000","properties":{"id":"520000","cp":[106.713478,26.578343],"name":"贵州","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@†G\\†lY£‘in"],["@@q‚|ˆ‚mc¯tχVSÎ"],["@@hÑ£Is‡NgßH†›HªķÃh_¹ƒ¡ĝħń¦uيùŽgS¯JHŸ|sÝÅtÁïyMDč»eÕtA¤{b\\}—ƒG®u\\åPFq‹wÅaD…žK°ºâ_£ùbµ”mÁ‹ÛœĹM[q|hlaªāI}тƒµ@swtwm^oµˆD鼊yV™ky°ÉžûÛR…³‚‡eˆ‡¥]RՋěħ[ƅåÛDpŒ”J„iV™™‰ÂF²I…»mN·£›LbÒYb—WsÀbŽ™pki™TZĄă¶HŒq`……ĥ_JŸ¯ae«ƒKpÝx]aĕÛPƒÇȟ[ÁåŵÏő—÷Pw}‡TœÙ@Õs«ĿÛq©½œm¤ÙH·yǥĘĉBµĨÕnđ]K„©„œá‹ŸG纍§Õßg‡ǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊžw¶øV¤w”²Ĉ]ʚKx|`ź¦ÂÈdr„cȁbe¸›`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pН`oÒh޶pa‚^ÓĔ}D»^Xyœ`d˜[Kv…JPhèhCrĂĚÂ^Êƌ wˆZL­Ġ£šÁbrzOIl’MM”ĪŐžËr×ÎeŦŽtw|Œ¢mKjSǘňĂStÎŦEtqFT†¾†E쬬ôxÌO¢Ÿ KгŀºäY†„”PVgŎ¦Ŋm޼VZwVlŒ„z¤…ž£Tl®ctĽÚó{G­A‡ŒÇgeš~Αd¿æaSba¥KKûj®_ć^\\ؾbP®¦x^sxjĶI_Ä X‚⼕Hu¨Qh¡À@Ëô}ޱžGNìĎlT¸ˆ…`V~R°tbÕĊ`¸úÛtπFDu€[ƒMfqGH·¥yA‰ztMFe|R‚_Gk†ChZeÚ°to˜v`x‹b„ŒDnÐ{E}šZ˜è€x—†NEފREn˜[Pv@{~rĆAB§‚EO¿|UZ~ì„Uf¨J²ĂÝÆ€‚sª–B`„s¶œfvö¦ŠÕ~dÔq¨¸º»uù[[§´sb¤¢zþFœ¢Æ…Àhˆ™ÂˆW\\ıŽËI݊o±ĭŠ£þˆÊs}¡R]ŒěƒD‚g´VG¢‚j±®è†ºÃmpU[Á›‘Œëº°r›ÜbNu¸}Žº¼‡`ni”ºÔXĄ¤¼Ôdaµ€Á_À…†ftQQgœR—‘·Ǔ’v”}Ýלĵ]µœ“Wc¤F²›OĩųãW½¯K‚©…]€{†LóµCIµ±Mß¿hŸ•©āq¬o‚½ž~@i~TUxŪÒ¢@ƒ£ÀEîôruń‚”“‚b[§nWuMÆLl¿]x}ij­€½"]],"encodeOffsets":[[[112158,27383]],[[112105,27474]],[[112095,27476]]]}},{"type":"Feature","id":"530000","properties":{"id":"530000","cp":[101.512251,24.740609],"name":"云南","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@[„ùx½}ÑRH‘YīĺûsÍn‘iEoã½Ya²ė{c¬ĝg•ĂsA•ØÅwď‚õzFjw}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónũuą¡Ã¢pÒŌ“Ø TF²‚xa²ËX€‚cʋlHîAßËŁkŻƑŷÉ©h™W­æßU‡“Ës¡¦}•teèÆ¶StǀÇ}Fd£j‹ĈZĆÆ‹¤T‚č\\Dƒ}O÷š£Uˆ§~ŃG™‚åŃDĝ¸œTsd¶¶Bªš¤u¢ŌĎo~t¾ÍŶÒtD¦Ú„iôö‰€z›ØX²ghįh½Û±¯€ÿm·zR¦Ɵ`ªŊÃh¢rOԍ´£Ym¼èêf¯ŪĽn„†cÚbŒw\\zlvWžªâˆ ¦g–mĿBş£¢ƹřbĥkǫßeeZkÙIKueT»sVesb‘aĕ ¶®dNœĄÄpªyސ¼—„³BE˜®l‡ŽGœŭCœǶwêżĔÂe„pÍÀQƞpC„–¼ŲÈ­AÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“Æ´sâDŽŲPnÊD^¯°’Upv†}®BP̪–jǬx–Söwlfòªv€qĸ|`H€­viļ€ndĜ­Ćhň•‚em·FyށqóžSᝑ³X_ĞçêtryvL¤§z„¦c¦¥jnŞk˜ˆlD¤øz½ĜàžĂŧMÅ|áƆàÊcðÂF܎‚áŢ¥\\\\º™İøÒÐJĴ‡„îD¦zK²ǏÎEh~’CD­hMn^ÌöÄ©ČZÀžaü„fɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~Äqššê€ljN¬¼H„ÊšNQ´ê¼VظE††^ŃÒyŒƒM{ŒJLoÒœęæŸe±Ķ›y‰’‡gã“¯JYÆĭĘëo¥Š‰o¯hcK«z_pŠrC´ĢÖY”—¼ v¸¢RŽÅW³Â§fǸYi³xR´ďUˊ`êĿU„û€uĆBƒƣö‰N€DH«Ĉg†——Ñ‚aB{ÊNF´¬c·Åv}eÇÃGB»”If•¦HňĕM…~[iwjUÁKE•Ž‹¾dĪçW›šI‹èÀŒoÈXòyŞŮÈXâÎŚŠj|àsRy‹µÖ›–Pr´þŒ ¸^wþTDŔ–Hr¸‹žRÌmf‡żÕâCôox–ĜƌÆĮŒ›Ð–œY˜tâŦÔ@]ÈǮƒ\\μģUsȯLbîƲŚºyh‡rŒŠ@ĒԝƀŸÀ²º\\êp“’JŠ}ĠvŠqt„Ġ@^xÀ£È†¨mËÏğ}n¹_¿¢×Y_æpˆÅ–A^{½•Lu¨GO±Õ½ßM¶w’ÁĢۂP‚›Ƣ¼pcIJxŠ|ap̬HšÐŒŊSfsðBZ¿©“XÏÒK•k†÷Eû¿‰S…rEFsÕūk”óVǥʼniTL‚¡n{‹uxţÏh™ôŝ¬ğōN“‘NJkyPaq™Âğ¤K®‡YŸxÉƋÁ]āęDqçgOg†ILu—\\_gz—]W¼ž~CÔē]bµogpў_oď`´³Țkl`IªºÎȄqÔþž»E³ĎSJ»œ_f·‚adÇqƒÇc¥Á_Źw{™L^ɱćx“U£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏɸ½řÍcÊG|µƕƣG˛÷Ÿk°_^ý|_zċBZocmø¯hhcæ\\lˆMFlư£Ĝ„ÆyH“„F¨‰µêÕ]—›HA…àӄ^it `þßäkŠĤÎT~Wlÿ¨„ÔPzUC–NVv [jâôDôď[}ž‰z¿–msSh‹¯{jïğl}šĹ[–őŒ‰gK‹©U·µË@¾ƒm_~q¡f¹…ÅË^»‘f³ø}Q•„¡Ö˳gͱ^ǁ…\\ëÃA_—¿bW›Ï[¶ƛ鏝£F{īZgm@|kHǭƁć¦UĔťƒ×ë}ǝƒeďºȡȘÏíBə£āĘPªij¶“ʼnÿ‡y©n‰ď£G¹¡I›Š±LÉĺÑdĉ܇W¥˜‰}g˜Á†{aqÃ¥aŠıęÏZ—ï`"],"encodeOffsets":[[104636,22969]]}},{"type":"Feature","id":"540000","properties":{"id":"540000","cp":[89.132212,30.860361],"name":"西藏","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@hžľxŽŖ‰xƒÒVކºÅâAĪÝȆµę¯Ňa±r_w~uSÕň‘qOj]ɄQ…£Z……UDûoY’»©M[‹L¼qãË{V͕çWViŽ]ë©Ä÷àyƛh›ÚU°ŒŒa”d„cQƒ~Mx¥™cc¡ÙaSyF—ցk­ŒuRýq¿Ôµ•QĽ³aG{¿FµëªéĜÿª@¬·–K‰·àariĕĀ«V»Ŷ™Ĵū˜gèLǴŇƶaf‹tŒèBŚ£^Šâ†ǐÝ®–šM¦ÁǞÿ¬LhŸŽJ¾óƾƺcxw‹f]Y…´ƒ¦|œQLn°aœdĊ…œ\\¨o’œǀÍŎœ´ĩĀd`tÊQŞŕ|‚¨C^©œĈ¦„¦ÎJĊ{ŽëĎjª²rЉšl`¼Ą[t|¦St辉PŒÜK¸€d˜Ƅı]s¤—î_v¹ÎVòŦj˜£Əsc—¬_Ğ´|٘¦Avަw`ăaÝaa­¢e¤ı²©ªSªšÈMĄwžÉØŔì@T‘¤—Ę™\\õª@”þo´­xA s”ÂtŎKzó´ÇĊµ¢rž^nĊ­Æ¬×üGž¢‚³ {âĊ]š™G‚~bÀgVjzlhǶf€žOšfdЉªB]pj„•TO–tĊ‚n¤}®¦ƒČ¥d¢¼»ddš”Y¼Žt—¢eȤJ¤}Ǿ¡°§¤AГlc@ĝ”sªćļđAç‡wx•UuzEÖġ~AN¹ÄÅȀݦ¿ģŁéì±H…ãd«g[؉¼ēÀ•cīľġ¬cJ‘µ…ÐʥVȝ¸ßS¹†ý±ğkƁ¼ą^ɛ¤Ûÿ‰b[}¬ōõÃ]ËNm®g@•Bg}ÍF±ǐyL¥íCˆƒIij€Ï÷њį[¹¦[⚍EÛïÁÉdƅß{âNÆāŨߝ¾ě÷yC£‡k­´ÓH@¹†TZ¥¢įƒ·ÌAЧ®—Zc…v½ŸZ­¹|ŕWZqgW“|ieZÅYVӁqdq•bc²R@†c‡¥Rã»Ge†ŸeƃīQ•}J[ғK…¬Ə|o’ėjġĠÑN¡ð¯EBčnwôɍėªƒ²•CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛ†ęgſ¶ҍć`ĘąŌJޚä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷‡f±iMݑ›‰@ĥ°G¬ÃM¥n£Øą‚ğ¯ß”§aëbéüÑOčœk£{\\‘eµª×M‘šÉfm«Ƒ{Å׃Gŏǩãy³©WÑăû‚··‘Q—òı}¯ã‰I•éÕÂZ¨īès¶ZÈsŽæĔTŘvŽgÌsN@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxq¹Zo‘b‹s[׌¯cĩv‡Œėŧ³BM|¹k‰ªħ—¥TzNYnݍßpęrñĠĉRS~½ŠěVVе‚õ‡«ŒM££µB•ĉ¥áºae~³AuĐh`Ü³ç@BۘïĿa©|z²Ý¼D”£à貋ŸƒIƒû›I ā€óK¥}rÝ_Á´éMaň¨€~ªSĈ½Ž½KÙóĿeƃÆBŽ·¬ën×W|Uº}LJrƳ˜lŒµ`bÔ`QˆˆÐÓ@s¬ñIŒÍ@ûws¡åQÑßÁ`ŋĴ{Ī“T•ÚÅTSij‚‹Yo|Ç[ǾµMW¢ĭiÕØ¿@˜šMh…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB™Š\\”qTGªÇĜçPoŠÿfñòą¦óQīÈáP•œābß{ƒZŗĸIæÅ„hnszÁCËìñšÏ·ąĚÝUm®ó­L·ăU›Èíoù´Êj°ŁŤ_uµ^‘°Œìǖ@tĶĒ¡Æ‡M³Ģ«˜İĨÅ®ğ†RŽāð“ggheÆ¢z‚Ê©Ô\\°ÝĎz~ź¤Pn–MĪÖB£Ÿk™n鄧żćŠ˜ĆK„ǰ¼L¶è‰âz¨u¦¥LDĘz¬ýÎmĘd¾ß”Fz“hg²™Fy¦ĝ¤ċņbΛ@y‚Ąæm°NĮZRÖíŽJ²öLĸÒ¨Y®ƌÐV‰à˜tt_ڀÂyĠzž]Ţh€zĎ{†ĢX”ˆc|šÐqŽšfO¢¤ög‚ÌHNŽ„PKŖœŽ˜Uú´xx[xˆvĐCûŠìÖT¬¸^}Ìsòd´_އKgžLĴ…ÀBon|H@–Êx˜—¦BpŰˆŌ¿fµƌA¾zLjRxжF”œkĄźRzŀˆ~¶[”´Hnª–VƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxdžB’šú^´W†£–d„kɾĬpœw‚˂ØɦļĬIŚœÊ•n›Ŕa¸™~J°î”lɌxĤÊÈðhÌ®‚g˜T´øŽàCˆŽÀ^ªerrƘdž¢İP|Ė ŸWœªĦ^¶´ÂL„aT±üWƜ˜ǀRšŶUńšĖ[QhlLüA†‹Ü\\†qR›Ą©"],"encodeOffsets":[[90849,37210]]}},{"type":"Feature","id":"610000","properties":{"id":"610000","cp":[108.948024,34.263161],"name":"陕西","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@˜p¢—ȮµšûG™Ħ}Ħšðǚ¶òƄ€jɂz°{ºØkÈęâ¦jª‚Bg‚\\œċ°s¬Ž’]jžú ‚E”Ȍdž¬s„t‡”RˆÆdĠݎwܔ¸ôW¾ƮłÒ_{’Ìšû¼„jº¹¢GǪÒ¯ĘƒZ`ºŊƒecņąš~BÂgzpâēòYǠȰÌTΨÂWœ|fcŸă§uF—Œ@NŸ¢XLƒŠRMº[ğȣſï|¥J™kc`sʼnǷ’Y¹‹W@µ÷K…ãï³ÛIcñ·VȋڍÒķø©—þ¥ƒy‚ÓŸğęmWµÎumZyOŅƟĥÓ~sÑL¤µaŅY¦ocyZ{‰y c]{ŒTa©ƒ`U_Ěē£ωÊƍKù’K¶ȱÝƷ§{û»ÅÁȹÍéuij|¹cÑd‘ŠìUYƒŽO‘uF–ÕÈYvÁCqӃT•Ǣí§·S¹NgŠV¬ë÷Át‡°Dد’C´ʼnƒópģ}„ċcE˅FŸŸéGU¥×K…§­¶³B‹Č}C¿åċ`wġB·¤őcƭ²ő[Å^axwQO…ÿEËߌ•ĤNĔŸwƇˆÄŠńwĪ­Šo[„_KÓª³“ÙnK‰Çƒěœÿ]ď€ă_d©·©Ýŏ°Ù®g]±„Ÿ‡ß˜å›—¬÷m\\›iaǑkěX{¢|ZKlçhLt€Ňîŵ€œè[€É@ƉĄEœ‡tƇÏ˜³­ħZ«mJ…›×¾‘MtÝĦ£IwÄå\\Õ{‡˜ƒOwĬ©LÙ³ÙgBƕŀr̛ĢŭO¥lãyC§HÍ£ßEñŸX¡—­°ÙCgpťz‘ˆb`wI„vA|§”‡—hoĕ@E±“iYd¥OϹS|}F@¾oAO²{tfžÜ—¢Fǂ҈W²°BĤh^Wx{@„¬‚­F¸¡„ķn£P|ŸªĴ@^ĠĈæb–Ôc¶l˜Yi…–^Mi˜cϰÂ[ä€vï¶gv@À“Ĭ·lJ¸sn|¼u~a]’ÆÈtŌºJp’ƒþ£KKf~ЦUbyäIšĺãn‡Ô¿^­žŵMT–hĠܤko¼Ŏìąǜh`[tŒRd²IJ_œXPrɲ‰l‘‚XžiL§àƒ–¹ŽH˜°Ȧqº®QC—bA†„ŌJ¸ĕÚ³ĺ§ `d¨YjžiZvRĺ±öVKkjGȊĐePОZmļKÀ€‚[ŠŽ`ösìh†ïÎoĬdtKÞ{¬èÒÒBŒÔpIJÇĬJŊ¦±J«ˆY§‹@·pH€µàåVKe›pW†ftsAÅqC·¬ko«pHÆuK@oŸHĆۄķhx“e‘n›S³àǍrqƶRbzy€¸ËАl›¼EºpĤ¼Œx¼½~Ğ’”à@†ÚüdK^ˆmÌSj"],"encodeOffsets":[[110234,38774]]}},{"type":"Feature","id":"620000","properties":{"id":"620000","cp":[103.823557,36.058039],"name":"甘肃","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@VuUv"],["@@ũ‹EĠtt~nkh`Q‰¦ÅÄÜdw˜Ab×ĠąJˆ¤DüègĺqBqœj°lI¡ĨÒ¤úSHbš‡ŠjΑBаaZˆ¢KJŽ’O[|A£žDx}Nì•HUnrk„ kp€¼Y kMJn[aG‚áÚÏ[½rc†}aQxOgsPMnUs‡nc‹Z…ž–sKúvA›t„Þġ’£®ĀYKdnFwš¢JE°”Latf`¼h¬we|€Æ‡šbj}GA€·~WŽ”—`†¢MC¤tL©IJ°qdf”O‚“bÞĬ¹ttu`^ZúE`Œ[@„Æsîz®¡’C„ƳƜG²“R‘¢R’m”fŽwĸg܃‚ą G@pzJM½mŠhVy¸uÈÔO±¨{LfæU¶ßGĂq\\ª¬‡²I‚¥IʼnÈīoı‹ÓÑAçÑ|«LÝcspīðÍg…të_õ‰\\ĉñLYnĝg’ŸRǡÁiHLlõUĹ²uQjYi§Z_c¨Ÿ´ĹĖÙ·ŋI…ƒaBD˜­R¹ȥr—¯G•ºß„K¨jWk’ɱŠOq›Wij\\a­‹Q\\sg_ĆǛōëp»£lğۀgS•ŶN®À]ˆÓäm™ĹãJaz¥V}‰Le¤L„ýo‘¹IsŋÅÇ^‘Žbz…³tmEÁ´aйcčecÇN•ĊãÁ\\蝗dNj•]j†—ZµkÓda•ćå]ğij@ ©O{¤ĸm¢ƒE·®ƒ«|@Xwg]A챝‡XǁÑdzªc›wQÚŝñsÕ³ÛV_ýƒ˜¥\\ů¥©¾÷w—Ž©WÕÊĩhÿÖÁRo¸V¬âDb¨šhûx–Ê×nj~Zâƒg|šXÁnßYoº§ZÅŘvŒ[„ĭÖʃuďxcVbnUSf…B¯³_Tzº—ΕO©çMÑ~Mˆ³]µ^püµ”ŠÄY~y@X~¤Z³€[Èōl@®Å¼£QKƒ·Di‹¡By‘ÿ‰Q_´D¥hŗyƒ^ŸĭÁZ]cIzý‰ah¹MĪğP‘s{ò‡‹‘²Vw¹t³Ŝˁ[ŽÑ}X\\gsFŸ£sPAgěp×ëfYHāďÖqēŭOÏë“dLü•\\iŒ”t^c®šRʺ¶—¢H°mˆ‘rYŸ£BŸ¹čIoľu¶uI]vģSQ{ƒUŻ”Å}QÂ|̋°ƅ¤ĩŪU ꡞÌZҞ\\v˜²PĔ»ƢNHƒĂyAmƂwVmž`”]ȏb•”H`‰Ì¢²ILvĜ—H®¤Dlt_„¢JJÄämèÔDëþgºƫ™”aʎÌrêYi~ ÎݤNpÀA¾Ĕ¼b…ð÷’Žˆ‡®‚”üs”zMzÖĖQdȨý†v§Tè|ªH’þa¸|šÐ ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\h¹¶v†·À|\\ƁĚN´Ĝ€çèÁz]ġ¤²¨QÒŨTIl‡ªťØ}¼˗ƦvÄùØE‹’«Fï˛Iq”ōŒTvāÜŏ‚íÛߜÛV—j³âwGăÂíNOŠˆŠPìyV³ʼnĖýZso§HіiYw[߆\\X¦¥c]ÔƩÜ·«j‡ÐqvÁ¦m^ċ±R™¦΋ƈťĚgÀ»IïĨʗƮްƝ˜ĻþÍAƉſ±tÍEÕÞāNU͗¡\\ſčåÒʻĘm ƭÌŹöʥ’ëQ¤µ­ÇcƕªoIýˆ‰Iɐ_mkl³ă‰Ɠ¦j—¡Yz•Ňi–}Msßõ–īʋ —}ƒÁVmŸ_[n}eı­Uĥ¼‘ª•I{ΧDӜƻėoj‘qYhĹT©oūĶ£]ďxĩ‹ǑMĝ‰q`B´ƃ˺Ч—ç~™²ņj@”¥@đ´ί}ĥtPńǾV¬ufӃÉC‹tÓ̻‰…¹£G³€]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼ‚ĤŊɲĖ­Kq´ï¦—ºĒDzņɾªǀÞĈĂD†½ĄĎÌŗĞrôñnŽœN¼â¾ʄľԆ|DŽŽ֦ज़ȗlj̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿Ľ­ĹeȏijëCȚDŲyê×Ŗyò¯ļcÂßY…tÁƤyAã˾J@ǝrý‹‰@¤…rz¸oP¹ɐÚyᐇHŸĀ[Jw…cVeȴϜ»ÈŽĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔ—ĹŊũ~ËUă{ŸĻƹɁύȩþĽvĽƓÉ@ē„ĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶Ž¨c~c¼īŒeXǚ‹\\đ¾JŽwÀďksãA‹fÕ¦L}wa‚o”Z’‹D½†Ml«]eÒÅaɲáo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LF‹LzĈ„ôe]gx}•|KK}xklL]c¦£fRtív¦†PĤoH{tK"]],"encodeOffsets":[[[108619,36299]],[[108589,36341]]]}},{"type":"Feature","id":"630000","properties":{"id":"630000","cp":[96.778916,35.623178],"name":"青海","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@InJm"],["@@CƒÆ½OŃĦsΰ~dz¦@@“Ņiš±è}ؘƄ˹A³r_ĞŠǒNΌĐw¤^ŬĵªpĺSZg’rpiƼĘԛ¨C|͖J’©Ħ»®VIJ~f\\m `Un„˜~ʌŸ•ĬàöNt•~ňjy–¢Zi˜Ɣ¥ĄŠk´nl`JʇŠJþ©pdƖ®È£¶ìRʦ‘źõƮËnŸʼėæÑƀĎ[‚˜¢VÎĂMÖÝÎF²sƊƀÎBļýƞ—¯ʘƭðħ¼Jh¿ŦęΌƇš¥²Q]Č¥nuÂÏriˆ¸¬ƪÛ^Ó¦d€¥[Wà…x\\ZŽjҕ¨GtpþYŊĕ´€zUO뇉P‰îMĄÁxH´á˜iÜUà›îÜՁĂÛSuŎ‹r“œJð̬EŒ‘FÁú×uÃÎkr“Ē{V}İ«O_ÌËĬ©ŽÓŧSRѱ§Ģ£^ÂyèçěM³Ƃę{[¸¿u…ºµ[gt£¸OƤĿéYŸõ·kŸq]juw¥Dĩƍ€õÇPéĽG‘ž©ã‡¤G…uȧþRcÕĕNy“yût“ˆ­‡ø‘†ï»a½ē¿BMoᣟÍj}éZËqbʍš“Ƭh¹ìÿÓAçãnIáI`ƒks£CG­ě˜Uy×Cy•…’Ÿ@¶ʡÊBnāzG„ơMē¼±O÷õJËĚăVŸĪũƆ£Œ¯{ËL½Ìzż“„VR|ĠTbuvJvµhĻĖH”Aëáa…­OÇðñęNw‡…œľ·L›mI±íĠĩPÉ×®ÿs—’cB³±JKßĊ«`…ađ»·QAmO’‘Vţéÿ¤¹SQt]]Çx€±¯A@ĉij¢Ó祖•ƒl¶ÅÛr—ŕspãRk~¦ª]Į­´“FR„åd­ČsCqđéFn¿Åƃm’Éx{W©ºƝºįkÕƂƑ¸wWūЩÈFž£\\tÈ¥ÄRÈýÌJ ƒlGr^×äùyÞ³fj”c†€¨£ÂZ|ǓMĝšÏ@ëÜőR‹›ĝ‰Œ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³’­ÞIňµç½©C¡į÷¯B»|St»›]vƒųƒs»”}MÓ ÿʪƟǭA¡fs˜»PY¼c¡»¦c„ċ­¥£~msĉP•–Siƒ^o©A‰Šec‚™PeǵŽkg‚yUi¿h}aH™šĉ^|ᴟ¡HØûÅ«ĉ®]m€¡qĉ¶³ÈyôōLÁst“BŸ®wn±ă¥HSò뚣˜S’ë@לÊăxÇN©™©T±ª£IJ¡fb®ÞbŽb_Ą¥xu¥B—ž{łĝ³«`d˜Ɛt—¤ťiñžÍUuºí`£˜^tƃIJc—·ÛLO‹½Šsç¥Ts{ă\\_»™kϊ±q©čiìĉ|ÍIƒ¥ć¥›€]ª§D{ŝŖÉR_sÿc³Īō›ƿΑ›§p›[ĉ†›c¯bKm›R¥{³„Z†e^ŽŒwx¹dƽŽôIg §Mĕ ƹĴ¿—ǣÜ̓]‹Ý–]snåA{‹eŒƭ`ǻŊĿ\\ijŬű”YÂÿ¬jĖqŽßbЏ•L«¸©@ěĀ©ê¶ìÀEH|´bRľž–Ó¶rÀQþ‹vl®Õ‚E˜TzÜdb ˜hw¤{LR„ƒd“c‹b¯‹ÙVgœ‚ƜßzÃô쮍^jUèXΖ|UäÌ»rKŽ\\ŒªN‘¼pZCü†VY††¤ɃRi^rPҒTÖ}|br°qňb̰ªiƶGQ¾²„x¦PœmlŜ‘[Ĥ¡ΞsĦŸÔÏâ\\ªÚŒU\\f…¢N²§x|¤§„xĔsZPòʛ²SÐqF`ª„VƒÞŜĶƨVZŒÌL`ˆ¢dŐIqr\\oäõ–F礻Ŷ×h¹]Clـ\\¦ďÌį¬řtTӺƙgQÇÓHţĒ”´ÃbEÄlbʔC”|CˆŮˆk„Ʈ[ʼ¬ňœ´KŮÈΰÌζƶlð”ļA†TUvdTŠG†º̼ŠÔ€ŒsÊDԄveOg"]],"encodeOffsets":[[[105308,37219]],[[95370,40081]]]}},{"type":"Feature","id":"640000","properties":{"id":"640000","cp":[106.278179,37.26637],"name":"宁夏","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@KëÀęĞ«OęȿȕŸı]ʼn¡åįÕÔ«Ǵõƪ™ĚQÐZhv K°›öqÀѐS[ÃÖHƖčË‡nL]ûc…Ùß@‚“ĝ‘¾}w»»‹oģF¹œ»kÌÏ·{zPƒ§B­¢íyÅt@ƒ@áš]Yv_ssģ¼i߁”ĻL¾ġsKD£¡N_…“˜X¸}B~Haiˆ™Åf{«x»ge_bs“KF¯¡Ix™mELcÿZ¤­Ģ‘ƒÝœsuBLù•t†ŒYdˆmVtNmtOPhRw~bd…¾qÐ\\âÙH\\bImlNZŸ»loƒŸqlVm–Gā§~QCw¤™{A\\‘PKŸNY‡¯bF‡kC¥’sk‹Šs_Ã\\ă«¢ħkJi¯r›rAhĹûç£CU‡ĕĊ_ԗBixÅُĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~–hw^‚ófćƒKyEŒ­K­zuÔ¡qQ¤xZÑ¢^ļöܾEpž±âbÊÑÆ^fk¬…NC¾‘Œ“YpxbK~¥Že֎ŒäBlt¿Đx½I[ĒǙŒWž‹f»Ĭ}d§dµùEuj¨‚IÆ¢¥dXªƅx¿]mtÏwßR͌X¢͎vÆzƂZò®ǢÌʆCrâºMÞzžÆMҔÊÓŊZľ–r°Î®Ȉmª²ĈUªĚøºˆĮ¦ÌĘk„^FłĬhĚiĀ˾iİbjÕ"],["@@mfwěwMrŢªv@G‰"]],"encodeOffsets":[[[109366,40242]],[[108600,36303]]]}},{"type":"Feature","id":"650000","properties":{"id":"650000","cp":[85.617733,40.792818],"name":"新疆","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@QØĔ²X¨”~ǘBºjʐߨvK”ƔX¨vĊOžÃƒ·¢i@~c—‡ĝe_«”Eš“}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuX…ê•Îf`œC‚¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥Oéȇ¿ÖğǤǷÂF҇zÉx[]­Ĥĝ‰œ¦EP}ûƥé¿İƷTėƫœŕƅ™ƱB»Đ±’ēO…¦E–•}‘`cȺrĦáŖuҞª«IJ‡πdƺÏØZƴwʄ¤ĖGЙǂZ̓èH¶}ÚZצʥĪï|ÇĦMŔ»İĝLj‹ì¥Βœba­¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»›òmqóŘĝč˾ăC…ćāƿÝɽ©DZŅ¹đ¥˜³ðLrÁ®ɱĕģʼnǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕŠUv£ƁQï“Ƶkŏ½ΉÃŭdzLқʻ«ƭ\\lƒ‡ŭD‡“{ʓDkaFÃÄa“³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍö•€ůʼnT¡c_‡ËKY‹ƧUśĵ„݃U_©rETÏʜ±OñtYw獃{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\‚ś’nkO›w¥±ƒT»ƷFɯàĩÞáB¹Æ…ÑUw„੍žĽw[“mG½Èå~‡Æ÷QyŠěCFmĭZī—ŵVÁ™ƿQƛ—ûXS²‰b½KϽĉS›©ŷXĕŸ{ŽĕK·¥Ɨcqq©f¿]‡ßDõU³h—­gËÇïģÉɋw“k¯í}I·šœbmœÉ–ř›īJɥĻˁ×xo›ɹī‡l•c…¤³Xù]‘™DžA¿w͉ì¥wÇN·ÂËnƾƍdǧđ®Ɲv•Um©³G\\“}µĿ‡QyŹl㓛µEw‰LJQ½yƋBe¶ŋÀů‡ož¥A—˜Éw@•{Gpm¿Aij†ŽKLhˆ³`ñcËtW‚±»ÕS‰ëüÿďD‡u\\wwwù³—V›LŕƒOMËGh£õP¡™er™Ïd{“‡ġWÁ…č|yšg^ğyÁzÙs`—s|ÉåªÇ}m¢Ń¨`x¥’ù^•}ƒÌ¥H«‰Yªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´AňĀ҄¶ûEYospõD[{ù°]u›Jq•U•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGÉbřaDü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKwbm‡ÄNô‡ŠfœƫVÉvi†dz—H‘‹QµâFšù­Âœ³¦{YGžƒd¢ĚÜO „€{Ö¦ÞÍÀPŒ^b–ƾŠlŽ[„vt×ĈÍE˨¡Đ~´î¸ùÎh€uè`¸ŸHÕŔVºwĠââWò‡@{œÙNÝ´ə²ȕn{¿¥{l—÷eé^e’ďˆXj©î\\ªÑò˜Üìc\\üqˆÕ[Č¡xoÂċªbØ­Œø|€¶ȴZdÆÂšońéŒGš\\”¼C°ÌƁn´nxšÊOĨ’ہƴĸ¢¸òTxÊǪMīИÖŲÃɎOvˆʦƢ~FއRěò—¿ġ~åŊœú‰Nšžš¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾œĄYÒ©ÊfºmԈĘcDoĬMŬ’˜S¤„s²‚”ʘچžȂVŦ –ŽèW°ªB|IJXŔþÈJĦÆæFĚêŠYĂªĂ]øªŖNÞüA€’fɨJ€˜¯ÎrDDšĤ€`€mz\\„§~D¬{vJÂ˜«lµĂb–¤p€ŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMT”‡òP˜÷fØĶK¢ȝ˔Sô¹òEð­”`Ɩ½ǒÂň×äı–§ĤƝ§C~¡‚hlå‚ǺŦŞkâ’~}ŽFøàIJaĞ‚fƠ¥Ž„Ŕdž˜®U¸ˆźXœv¢aƆúŪtŠųƠjd•ƺŠƺÅìnrh\\ĺ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹œ\\ĜÑŚŸ¶ZƄ³àjĨoâŠȴLʉȮŒĐ­ĚăŽÀêZǚŐ¤qȂ\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTŠiƢ¾ªì°`öøu®Ê¾ãØ"],"encodeOffsets":[[88824,50096]]}},{"type":"Feature","id":"110000","properties":{"id":"110000","cp":[116.405285,39.904989],"name":"北京","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@ĽOÁ›ûtŷmiÍt_H»Ĩ±d`й­{bw…Yr“³S]§§o¹€qGtm_Sŧ€“oa›‹FLg‘QN_•dV€@Zom_ć\\ߚc±x¯oœRcfe…£’o§ËgToÛJíĔóu…|wP¤™XnO¢ÉˆŦ¯rNÄā¤zâŖÈRpŢZŠœÚ{GŠrFt¦Òx§ø¹RóäV¤XdˆżâºWbwڍUd®bêņ¾‘jnŎGŃŶŠnzÚSeîĜZczî¾i]͜™QaúÍÔiþĩȨWĢ‹ü|Ėu[qb[swP@ÅğP¿{\\‡¥A¨Ï‘Ѩj¯ŠX\\¯œMK‘pA³[H…īu}}"],"encodeOffsets":[[120023,41045]]}},{"type":"Feature","id":"120000","properties":{"id":"120000","cp":[117.190182,39.125596],"name":"天津","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@ŬgX§Ü«E…¶Ḟ“¬O_™ïlÁg“z±AXe™µÄĵ{¶]gitgšIj·›¥îakS€‰¨ÐƎk}ĕ{gB—qGf{¿a†U^fI“ư‹³õ{YƒıëNĿžk©ïËZŏ‘R§òoY×Ógc…ĥs¡bġ«@dekąI[nlPqCnp{ˆō³°`{PNdƗqSÄĻNNâyj]äžÒD ĬH°Æ]~¡HO¾ŒX}ÐxŒgp“gWˆrDGˆŒpù‚Š^L‚ˆrzWxˆZ^¨´T\\|~@I‰zƒ–bĤ‹œjeĊªz£®Ĕvě€L†mV¾Ô_ȔNW~zbĬvG†²ZmDM~”~"],"encodeOffsets":[[120237,41215]]}},{"type":"Feature","id":"310000","properties":{"id":"310000","cp":[121.472644,31.231706],"name":"上海","childNum":6},"geometry":{"type":"MultiPolygon","coordinates":[["@@ɧư¬EpƸÁxc‡"],["@@©„ªƒ"],["@@”MA‹‘š"],["@@Qp݁E§ÉC¾"],["@@bŝՕÕEȣÚƥêImɇǦèÜĠŒÚžÃƌÃ͎ó"],["@@ǜûȬɋŠŭ™×^‰sYŒɍDŋ‘ŽąñCG²«ªč@h–_p¯A{‡oloY€¬j@IJ`•gQڛhr|ǀ^MIJvtbe´R¯Ô¬¨YŽô¤r]ì†Ƭį"]],"encodeOffsets":[[[124702,32062]],[[124547,32200]],[[124808,31991]],[[124726,32110]],[[124903,32376]],[[124438,32149]]]}},{"type":"Feature","id":"500000","properties":{"id":"500000","cp":[107.304962,29.533155],"name":"重庆","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@vjG~nGŘŬĶȂƀƾ¹¸ØÎezĆT¸}êЖqHŸðqĖ䒊¥^CƒIj–²p…\\_ æüY|[YxƊæuž°xb®…Űb@~¢NQt°¶‚Sæ “Ê~rljĔëĚ¢~šuf`‘‚†fa‚ĔJåĊ„nÖ]„jƎćÊ@Š£¾a®£Ű{ŶĕF‹ègLk{Y|¡ĜWƔtƬJÑxq‹±ĢN´‰òK‰™–LÈüD|s`ŋ’ć]ƒÃ‰`đŒMûƱ½~Y°ħ`ƏíW‰½eI‹½{aŸ‘OIrÏ¡ĕŇa†p†µÜƅġ‘œ^ÖÛbÙŽŏml½S‹êqDu[R‹ãË»†ÿw`»y‘¸_ĺę}÷`M¯ċfCVµqʼn÷Z•gg“Œ`d½pDO‡ÎCnœ^uf²ènh¼WtƏxRGg¦…pV„†FI±ŽG^ŒIc´ec‡’G•ĹÞ½sëĬ„h˜xW‚}Kӈe­Xsbk”F¦›L‘ØgTkïƵNï¶}Gy“w\\oñ¡nmĈzjŸ•@™Óc£»Wă¹Ój“_m»ˆ¹·~MvÛaqœ»­‰êœ’\\ÂoVnŽÓØÍ™²«‹bq¿efE „€‹Ĝ^Qž~ Évý‡ş¤²Į‰pEİ}zcĺƒL‹½‡š¿gņ›¡ýE¡ya£³t\\¨\\vú»¼§·Ñr_oÒý¥u‚•_n»_ƒ•At©Þűā§IVeëƒY}{VPÀFA¨ąB}q@|Ou—\\Fm‰QF݅Mw˜å}]•€|FmϋCaƒwŒu_p—¯sfÙgY…DHl`{QEfNysBЦzG¸rHe‚„N\\CvEsÐùÜ_·ÖĉsaQ¯€}_U‡†xÃđŠq›NH¬•Äd^ÝŰR¬ã°wećJEž·vÝ·Hgƒ‚éFXjÉê`|yŒpxkAwœWĐpb¥eOsmzwqChóUQl¥F^laf‹anòsr›EvfQdÁUVf—ÎvÜ^efˆtET¬ôA\\œ¢sJŽnQTjP؈xøK|nBz‰„œĞ»LY‚…FDxӄvr“[ehľš•vN”¢o¾NiÂxGp⬐z›bfZo~hGi’]öF|‰|Nb‡tOMn eA±ŠtPT‡LjpYQ|†SH††YĀxinzDJ€Ìg¢và¥Pg‰_–ÇzII‹€II•„£®S¬„Øs쐣ŒN"],["@@ifjN@s"]],"encodeOffsets":[[[109628,30765]],[[111725,31320]]]}},{"type":"Feature","id":"810000","properties":{"id":"810000","cp":[114.173355,22.320048],"name":"香港","childNum":5},"geometry":{"type":"MultiPolygon","coordinates":[["@@AlBk"],["@@mŽn"],["@@EpFo"],["@@ea¢pl¸Eõ¹‡hj[ƒ]ÔCΖ@lj˜¡uBXŸ…•´‹AI¹…[‹yDUˆ]W`çwZkmc–…M›žp€Åv›}I‹oJlcaƒfёKްä¬XJmÐ đhI®æÔtSHn€Eˆ„ÒrÈc"],["@@rMUw‡AS®€e"]],"encodeOffsets":[[[117111,23002]],[[117072,22876]],[[117045,22887]],[[116975,23082]],[[116882,22747]]]}},{"type":"Feature","id":"820000","properties":{"id":"820000","cp":[113.54909,22.198951],"name":"澳门","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@kÊd°å§s"],"encodeOffsets":[[116279,22639]]}}],"UTF8Encoding":true});})); \ No newline at end of file diff --git a/src/main/resources/static/assets/libs/echarts/echarts-wordcloud.min.js b/src/main/resources/static/assets/libs/echarts/echarts-wordcloud.min.js new file mode 100644 index 0000000..f66e691 --- /dev/null +++ b/src/main/resources/static/assets/libs/echarts/echarts-wordcloud.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("echarts")):"function"==typeof define&&define.amd?define(["echarts"],e):"object"==typeof exports?exports["echarts-wordcloud"]=e(require("echarts")):t["echarts-wordcloud"]=e(t.echarts)}(this,function(t){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var r={};return e.m=t,e.c=r,e.d=function(t,r,n){e.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=25)}([function(t,e){function r(t,e){G[t]=e}function n(t){if(null==t||"object"!=typeof t)return t;var e=t,r=W.call(t);if("[object Array]"===r){e=[];for(var i=0,a=t.length;i1e-10&&(i.width+=a/s,i.height+=a/s,i.x-=a/s/2,i.y-=a/s/2)}return i}return t},contain:function(t,e){var r=this.transformCoordToLocal(t,e),n=this.getBoundingRect(),i=this.style;if(t=r[0],e=r[1],n.contain(t,e)){var a=this.path.data;if(i.hasStroke()){var o=i.lineWidth,l=i.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(i.hasFill()||(o=Math.max(o,this.strokeContainThreshold)),s.containStroke(a,o/l,t,e)))return!0}if(i.hasFill())return s.contain(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):i.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var r=this.shape;if(r){if(a.isObject(t))for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);else r[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&u(t[0]-1)>1e-10&&u(t[3]-1)>1e-10?Math.sqrt(u(t[0]*t[3]-t[2]*t[1])):1}},n.extend=function(t){var e=function(e){n.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var r=t.shape;if(r){this.shape=this.shape||{};var i=this.shape;for(var a in r)!i.hasOwnProperty(a)&&r.hasOwnProperty(a)&&(i[a]=r[a])}t.init&&t.init.call(this,e)};a.inherits(e,n);for(var r in t)"style"!==r&&"shape"!==r&&(e.prototype[r]=t[r]);return e},a.inherits(n,i);var f=n;t.exports=f},function(t,e){function r(t,e){var r=new S(2);return null==t&&(t=0),null==e&&(e=0),r[0]=t,r[1]=e,r}function n(t,e){return t[0]=e[0],t[1]=e[1],t}function i(t){var e=new S(2);return e[0]=t[0],e[1]=t[1],e}function a(t,e,r){return t[0]=e,t[1]=r,t}function o(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t}function s(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t}function l(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t}function h(t){return Math.sqrt(u(t))}function u(t){return t[0]*t[0]+t[1]*t[1]}function c(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t}function f(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t}function d(t,e){return t[0]*e[0]+t[1]*e[1]}function v(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t}function g(t,e){var r=h(e);return 0===r?(t[0]=0,t[1]=0):(t[0]=e[0]/r,t[1]=e[1]/r),t}function p(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}function m(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])}function x(t,e){return t[0]=-e[0],t[1]=-e[1],t}function y(t,e,r,n){return t[0]=e[0]+n*(r[0]-e[0]),t[1]=e[1]+n*(r[1]-e[1]),t}function w(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[2]*i+r[4],t[1]=r[1]*n+r[3]*i+r[5],t}function _(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t}function b(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t}var S="undefined"==typeof Float32Array?Array:Float32Array,M=h,T=u,k=p,C=m;e.create=r,e.copy=n,e.clone=i,e.set=a,e.add=o,e.scaleAndAdd=s,e.sub=l,e.len=h,e.length=M,e.lenSquare=u,e.lengthSquare=T,e.mul=c,e.div=f,e.dot=d,e.scale=v,e.normalize=g,e.distance=p,e.dist=k,e.distanceSquare=m,e.distSquare=C,e.negate=x,e.lerp=y,e.applyTransform=w,e.min=_,e.max=b},function(t,e,r){function n(t,e,r,n){r<0&&(t+=r,r=-r),n<0&&(e+=n,n=-n),this.x=t,this.y=e,this.width=r,this.height=n}var i=r(2),a=r(8),o=i.applyTransform,s=Math.min,l=Math.max;n.prototype={constructor:n,union:function(t){var e=s(t.x,this.x),r=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-r,this.x=e,this.y=r},applyTransform:function(){var t=[],e=[],r=[],n=[];return function(i){if(i){t[0]=r[0]=this.x,t[1]=n[1]=this.y,e[0]=n[0]=this.x+this.width,e[1]=r[1]=this.y+this.height,o(t,t,i),o(e,e,i),o(r,r,i),o(n,n,i),this.x=s(t[0],e[0],r[0],n[0]),this.y=s(t[1],e[1],r[1],n[1]);var a=l(t[0],e[0],r[0],n[0]),h=l(t[1],e[1],r[1],n[1]);this.width=a-this.x,this.height=h-this.y}}}(),calculateTransform:function(t){var e=this,r=t.width/e.width,n=t.height/e.height,i=a.create();return a.translate(i,i,[-e.x,-e.y]),a.scale(i,i,[r,n]),a.translate(i,i,[t.x,t.y]),i},intersect:function(t){if(!t)return!1;t instanceof n||(t=n.create(t));var e=this,r=e.x,i=e.x+e.width,a=e.y,o=e.y+e.height,s=t.x,l=t.x+t.width,h=t.y,u=t.y+t.height;return!(i=r.x&&t<=r.x+r.width&&e>=r.y&&e<=r.y+r.height},clone:function(){return new n(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},n.create=function(t){return new n(t.x,t.y,t.width,t.height)};var h=n;t.exports=h},function(t,e,r){function n(t){return t>-b&&tb||t<-b}function a(t,e,r,n,i){var a=1-i;return a*a*(a*t+3*i*e)+i*i*(i*n+3*a*r)}function o(t,e,r,n,i){var a=1-i;return 3*(((e-t)*a+2*(r-e)*i)*a+(n-r)*i*i)}function s(t,e,r,i,a,o){var s=i+3*(e-r)-t,l=3*(r-2*e+t),h=3*(e-t),u=t-a,c=l*l-3*s*h,f=l*h-9*s*u,d=h*h-3*l*u,v=0;if(n(c)&&n(f))if(n(l))o[0]=0;else{var g=-h/l;g>=0&&g<=1&&(o[v++]=g)}else{var p=f*f-4*c*d;if(n(p)){var m=f/c,g=-l/s+m,x=-m/2;g>=0&&g<=1&&(o[v++]=g),x>=0&&x<=1&&(o[v++]=x)}else if(p>0){var y=_(p),b=c*l+1.5*s*(-f+y),S=c*l+1.5*s*(-f-y);b=b<0?-w(-b,T):w(b,T),S=S<0?-w(-S,T):w(S,T);var g=(-l-(b+S))/(3*s);g>=0&&g<=1&&(o[v++]=g)}else{var k=(2*c*l-3*s*f)/(2*_(c*c*c)),C=Math.acos(k)/3,P=_(c),I=Math.cos(C),g=(-l-2*P*I)/(3*s),x=(-l+P*(I+M*Math.sin(C)))/(3*s),A=(-l+P*(I-M*Math.sin(C)))/(3*s);g>=0&&g<=1&&(o[v++]=g),x>=0&&x<=1&&(o[v++]=x),A>=0&&A<=1&&(o[v++]=A)}}return v}function l(t,e,r,a,o){var s=6*r-12*e+6*t,l=9*e+3*a-3*t-9*r,h=3*e-3*t,u=0;if(n(l)){if(i(s)){var c=-h/s;c>=0&&c<=1&&(o[u++]=c)}}else{var f=s*s-4*l*h;if(n(f))o[0]=-s/(2*l);else if(f>0){var d=_(f),c=(-s+d)/(2*l),v=(-s-d)/(2*l);c>=0&&c<=1&&(o[u++]=c),v>=0&&v<=1&&(o[u++]=v)}}return u}function h(t,e,r,n,i,a){var o=(e-t)*i+t,s=(r-e)*i+e,l=(n-r)*i+r,h=(s-o)*i+o,u=(l-s)*i+s,c=(u-h)*i+h;a[0]=t,a[1]=o,a[2]=h,a[3]=c,a[4]=c,a[5]=u,a[6]=l,a[7]=n}function u(t,e,r,n,i,o,s,l,h,u,c){var f,d,v,g,p,m=.005,x=1/0;k[0]=h,k[1]=u;for(var w=0;w<1;w+=.05)C[0]=a(t,r,i,s,w),C[1]=a(e,n,o,l,w),(g=y(k,C))=0&&g=0&&c<=1&&(o[u++]=c)}}else{var f=l*l-4*s*h;if(n(f)){var c=-l/(2*s);c>=0&&c<=1&&(o[u++]=c)}else if(f>0){var d=_(f),c=(-l+d)/(2*s),v=(-l-d)/(2*s);c>=0&&c<=1&&(o[u++]=c),v>=0&&v<=1&&(o[u++]=v)}}return u}function v(t,e,r){var n=t+r-2*e;return 0===n?.5:(t-e)/n}function g(t,e,r,n,i){var a=(e-t)*n+t,o=(r-e)*n+e,s=(o-a)*n+a;i[0]=t,i[1]=a,i[2]=s,i[3]=s,i[4]=o,i[5]=r}function p(t,e,r,n,i,a,o,s,l){var h,u=.005,f=1/0;k[0]=o,k[1]=s;for(var d=0;d<1;d+=.05){C[0]=c(t,r,i,d),C[1]=c(e,n,a,d);var v=y(k,C);v=0&&vA&&(I=0,P={}),I++,P[r]=i,i}function a(t,e,r,n,i,a,l){return a?s(t,e,r,n,i,a,l):o(t,e,r,n,i,l)}function o(t,e,r,n,a,o){var s=m(t,e,a,o),u=i(t,e);a&&(u+=a[1]+a[3]);var c=s.outerHeight,f=l(0,u,r),d=h(0,c,n),v=new _(f,d,u,c);return v.lineHeight=s.lineHeight,v}function s(t,e,r,n,i,a,o){var s=x(t,{rich:a,truncate:o,font:e,textAlign:r,textPadding:i}),u=s.outerWidth,c=s.outerHeight,f=l(0,u,r),d=h(0,c,n);return new _(f,d,u,c)}function l(t,e,r){return"right"===r?t-=e:"center"===r&&(t-=e/2),t}function h(t,e,r){return"middle"===r?t-=e/2:"bottom"===r&&(t-=e),t}function u(t,e,r){var n=e.x,i=e.y,a=e.height,o=e.width,s=a/2,l="left",h="top";switch(t){case"left":n-=r,i+=s,l="right",h="middle";break;case"right":n+=r+o,i+=s,h="middle";break;case"top":n+=o/2,i-=r,l="center",h="bottom";break;case"bottom":n+=o/2,i+=a+r,l="center";break;case"inside":n+=o/2,i+=s,l="center",h="middle";break;case"insideLeft":n+=r,i+=s,h="middle";break;case"insideRight":n+=o-r,i+=s,l="right",h="middle";break;case"insideTop":n+=o/2,i+=r,l="center";break;case"insideBottom":n+=o/2,i+=a-r,l="center",h="bottom";break;case"insideTopLeft":n+=r,i+=r;break;case"insideTopRight":n+=o-r,i+=r,l="right";break;case"insideBottomLeft":n+=r,i+=a-r,h="bottom";break;case"insideBottomRight":n+=o-r,i+=a-r,l="right",h="bottom"}return{x:n,y:i,textAlign:l,textVerticalAlign:h}}function c(t,e,r,n,i){if(!e)return"";var a=(t+"").split("\n");i=f(e,r,n,i);for(var o=0,s=a.length;o=o;l++)s-=o;var h=i(r);return h>s&&(r="",h=0),s=t-h,n.ellipsis=r,n.ellipsisWidth=h,n.contentWidth=s,n.containerWidth=t,n}function d(t,e){var r=e.containerWidth,n=e.font,a=e.contentWidth;if(!r)return"";var o=i(t,n);if(o<=r)return t;for(var s=0;;s++){if(o<=a||s>=e.maxIterations){t+=e.ellipsis;break}var l=0===s?v(t,a,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*a/o):0;t=t.substr(0,l),o=i(t,n)}return""===t&&(t=e.placeholder),t}function v(t,e,r,n){for(var i=0,a=0,o=t.length;al)t="",a=[];else if(null!=h)for(var u=f(h-(r?r[1]+r[3]:0),e,n.ellipsis,{minChar:n.minChar,placeholder:n.placeholder}),c=0,v=a.length;ca&&y(r,t.substring(a,o)),y(r,n[2],n[1]),a=O.lastIndex}ap)return{lines:[],width:0,height:0};M.textWidth=i(M.text,I);var D=T.textWidth,L=null==D||"auto"===D;if("string"==typeof D&&"%"===D.charAt(D.length-1))M.percentWidth=D,u.push(M),D=0;else{if(L){D=M.textWidth;var F=T.textBackgroundColor,R=F&&F.image;R&&(R=b.findExistImage(R),b.isImageReady(R)&&(D=Math.max(D,R.width*A/R.height)))}var B=P?P[1]+P[3]:0;D+=B;var z=null!=v?v-_:null;null!=z&&zthis._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(h.L,t,e),this._ctx&&r&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),r&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,r,n,i,a){return this.addData(h.C,t,e,r,n,i,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,r,n,i,a):this._ctx.bezierCurveTo(t,e,r,n,i,a)),this._xi=i,this._yi=a,this},quadraticCurveTo:function(t,e,r,n){return this.addData(h.Q,t,e,r,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,r,n):this._ctx.quadraticCurveTo(t,e,r,n)),this._xi=r,this._yi=n,this},arc:function(t,e,r,n,i,a){return this.addData(h.A,t,e,r,r,n,i-n,0,a?0:1),this._ctx&&this._ctx.arc(t,e,r,n,i,a),this._xi=p(i)*r+t,this._yi=m(i)*r+t,this},arcTo:function(t,e,r,n,i){return this._ctx&&this._ctx.arcTo(t,e,r,n,i),this},rect:function(t,e,r,n){return this._ctx&&this._ctx.rect(t,e,r,n),this.addData(h.R,t,e,r,n),this},closePath:function(){this.addData(h.Z);var t=this._ctx,e=this._x0,r=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,r),t.closePath()),this._xi=e,this._yi=r,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,r=0;re.length&&(this._expandData(),e=this.data);for(var r=0;r0&&d<=t||u<0&&d>=t||0==u&&(c>0&&p<=e||c<0&&p>=e);)n=this._dashIdx,r=o[n],d+=u*r,p+=c*r,this._dashIdx=(n+1)%m,u>0&&dl||c>0&&ph||s[n%2?"moveTo":"lineTo"](u>=0?v(d,t):g(d,t),c>=0?v(p,e):g(p,e));u=d-t,c=p-e,this._dashOffset=-x(u*u+c*c)},_dashedBezierTo:function(t,e,r,i,a,o){var s,l,h,u,c,f=this._dashSum,d=this._dashOffset,v=this._lineDash,g=this._ctx,p=this._xi,m=this._yi,y=n.cubicAt,w=0,_=this._dashIdx,b=v.length,S=0;for(d<0&&(d=f+d),d%=f,s=0;s<1;s+=.1)l=y(p,t,r,a,s+.1)-y(p,t,r,a,s),h=y(m,e,i,o,s+.1)-y(m,e,i,o,s),w+=x(l*l+h*h);for(;_d);_++);for(s=(S-d)/w;s<=1;)u=y(p,t,r,a,s),c=y(m,e,i,o,s),_%2?g.moveTo(u,c):g.lineTo(u,c),s+=v[_]/w,_=(_+1)%b;_%2!=0&&g.lineTo(a,o),l=a-u,h=o-c,this._dashOffset=-x(l*l+h*h)},_dashedQuadraticTo:function(t,e,r,n){var i=r,a=n;r=(r+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,r,n,i,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,w&&(this.data=new Float32Array(t)))},getBoundingRect:function(){u[0]=u[1]=f[0]=f[1]=Number.MAX_VALUE,c[0]=c[1]=d[0]=d[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,r=0,n=0,s=0,l=0;ll||y(o-i)>u||f===c-1)&&(t.lineTo(a,o),n=a,i=o);break;case h.C:t.bezierCurveTo(s[f++],s[f++],s[f++],s[f++],s[f++],s[f++]),n=s[f-2],i=s[f-1];break;case h.Q:t.quadraticCurveTo(s[f++],s[f++],s[f++],s[f++]),n=s[f-2],i=s[f-1];break;case h.A:var v=s[f++],g=s[f++],x=s[f++],w=s[f++],_=s[f++],b=s[f++],S=s[f++],M=s[f++],T=x>w?x:w,k=x>w?1:x/w,C=x>w?w/x:1,P=Math.abs(x-w)>.001,I=_+b;P?(t.translate(v,g),t.rotate(S),t.scale(k,C),t.arc(0,0,T,_,I,1-M),t.scale(1/k,1/C),t.rotate(-S),t.translate(-v,-g)):t.arc(v,g,T,_,I,1-M),1==f&&(e=p(_)*x+v,r=m(_)*w+g),n=p(I)*x+v,i=m(I)*w+g;break;case h.R:e=n=s[f],r=i=s[f+1],t.rect(s[f++],s[f++],s[f++],s[f++]);break;case h.Z:t.closePath(),n=e,i=r}}}},_.CMD=h;var b=_;t.exports=b},function(e,r){e.exports=t},function(t,e){function r(){var t=new u(6);return n(t),t}function n(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function i(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function a(t,e,r){var n=e[0]*r[0]+e[2]*r[1],i=e[1]*r[0]+e[3]*r[1],a=e[0]*r[2]+e[2]*r[3],o=e[1]*r[2]+e[3]*r[3],s=e[0]*r[4]+e[2]*r[5]+e[4],l=e[1]*r[4]+e[3]*r[5]+e[5];return t[0]=n,t[1]=i,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t}function o(t,e,r){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+r[0],t[5]=e[5]+r[1],t}function s(t,e,r){var n=e[0],i=e[2],a=e[4],o=e[1],s=e[3],l=e[5],h=Math.sin(r),u=Math.cos(r);return t[0]=n*u+o*h,t[1]=-n*h+o*u,t[2]=i*u+s*h,t[3]=-i*h+u*s,t[4]=u*a+h*l,t[5]=u*l-h*a,t}function l(t,e,r){var n=r[0],i=r[1];return t[0]=e[0]*n,t[1]=e[1]*i,t[2]=e[2]*n,t[3]=e[3]*i,t[4]=e[4]*n,t[5]=e[5]*i,t}function h(t,e){var r=e[0],n=e[2],i=e[4],a=e[1],o=e[3],s=e[5],l=r*o-a*n;return l?(l=1/l,t[0]=o*l,t[1]=-a*l,t[2]=-n*l,t[3]=r*l,t[4]=(n*s-o*i)*l,t[5]=(a*i-r*s)*l,t):null}var u="undefined"==typeof Float32Array?Array:Float32Array;e.create=r,e.identity=n,e.copy=i,e.mul=a,e.translate=o,e.rotate=s,e.scale=l,e.invert=h},function(t,e,r){function n(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function i(t,e,r,n){var i=e[1]-e[0],a=r[1]-r[0];if(0===i)return 0===a?r[0]:(r[0]+r[1])/2;if(n)if(i>0){if(t<=e[0])return r[0];if(t>=e[1])return r[1]}else{if(t>=e[0])return r[0];if(t<=e[1])return r[1]}else{if(t===e[0])return r[0];if(t===e[1])return r[1]}return(t-e[0])/i*a+r[0]}function a(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?n(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function o(t,e,r){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),r?t:+t}function s(t){return t.sort(function(t,e){return t-e}),t}function l(t){if(t=+t,isNaN(t))return 0;for(var e=1,r=0;Math.round(t*e)/e!==t;)e*=10,r++;return r}function h(t){var e=t.toString(),r=e.indexOf("e");if(r>0){var n=+e.slice(r+1);return n<0?-n:0}var i=e.indexOf(".");return i<0?0:e.length-1-i}function u(t,e){var r=Math.log,n=Math.LN10,i=Math.floor(r(t[1]-t[0])/n),a=Math.round(r(Math.abs(e[1]-e[0]))/n),o=Math.min(Math.max(-i+a,0),20);return isFinite(o)?o:20}function c(t,e,r){if(!t[e])return 0;var n=w.reduce(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===n)return 0;for(var i=Math.pow(10,r),a=w.map(t,function(t){return(isNaN(t)?0:t)/n*i*100}),o=100*i,s=w.map(a,function(t){return Math.floor(t)}),l=w.reduce(s,function(t,e){return t+e},0),h=w.map(a,function(t,e){return t-s[e]});lu&&(u=h[f],c=f);++s[c],h[c]=0,++l}return s[e]/i}function f(t){var e=2*Math.PI;return(t%e+e)%e}function d(t){return t>-_&&t<_}function v(t){if(t instanceof Date)return t;if("string"==typeof t){var e=b.exec(t);if(!e)return new Date(NaN);if(e[8]){var r=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(r-=e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,r,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))}function g(t){return Math.pow(10,p(t))}function p(t){return Math.floor(Math.log(t)/Math.LN10)}function m(t,e){var r,n=p(t),i=Math.pow(10,n),a=t/i;return r=e?a<1.5?1:a<2.5?2:a<4?3:a<7?5:10:a<1?1:a<2?2:a<3?3:a<5?5:10,t=r*i,n>=-20?+t.toFixed(n<0?-n:0):t}function x(t){function e(t,r,n){return t.interval[n]=0}var w=r(0),_=1e-4,b=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;e.linearMap=i,e.parsePercent=a,e.round=o,e.asc=s,e.getPrecision=l,e.getPrecisionSafe=h,e.getPixelPrecision=u,e.getPercentWithPrecision=c,e.MAX_SAFE_INTEGER=9007199254740991,e.remRadian=f,e.isRadianAroundZero=d,e.parseDate=v,e.quantity=g,e.nice=m,e.reformIntervals=x,e.isNumeric=y},function(t,e,r){function n(t){if("string"==typeof t){var e=l.get(t);return e&&e.image}return t}function i(t,e,r,n,i){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!r)return e;var s=l.get(t),h={hostEl:r,cb:n,cbPayload:i};return s?(e=s.image,!o(e)&&s.pending.push(h)):(!e&&(e=new Image),e.onload=a,l.put(t,e.__cachedImgObj={image:e,pending:[h]}),e.src=e.__zrImageSrc=t),e}return t}return e}function a(){var t=this.__cachedImgObj;this.onload=this.__cachedImgObj=null;for(var e=0;e=0||n&&i.indexOf(n,s)<0)){var l=e.getShallow(s);null!=l&&(a[t[o][0]]=l)}}return a}}var i=r(0);t.exports=n},function(t,e,r){function n(t){t=t||{},o.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new a(t.style,this),this._rect=null,this.__clipPaths=[]}var i=r(0),a=r(40),o=r(16),s=r(48);n.prototype={constructor:n,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var r=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(r[0],r[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?o.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new a(t,this),this.dirty(!1),this}},i.inherits(n,o),i.mixin(n,s);var l=n;t.exports=l},function(t,e,r){function n(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))}function i(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}function a(t){return String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function o(t,e,r){c.isArray(e)||(e=[e]);var n=e.length;if(!n)return"";for(var i=e[0].$vars||[],o=0;o':""}function h(t,e,r){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var n=d.parseDate(e),i=r?"UTC":"",a=n["get"+i+"FullYear"](),o=n["get"+i+"Month"]()+1,s=n["get"+i+"Date"](),l=n["get"+i+"Hours"](),h=n["get"+i+"Minutes"](),u=n["get"+i+"Seconds"]();return t=t.replace("MM",m(o)).replace("M",o).replace("yyyy",a).replace("yy",a%100).replace("dd",m(s)).replace("d",s).replace("hh",m(l)).replace("h",l).replace("mm",m(h)).replace("m",h).replace("ss",m(u)).replace("s",u)}function u(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t}var c=r(0),f=r(5),d=r(9),v=c.normalizeCssArray,g=["a","b","c","d","e","f","g"],p=function(t,e){return"{"+t+(null==e?"":e)+"}"},m=function(t){return t<10?"0"+t:t},x=f.truncateText,y=f.getBoundingRect;e.addCommas=n,e.toCamelCase=i,e.normalizeCssArray=v,e.encodeHTML=a,e.formatTpl=o,e.formatTplSimple=s,e.getTooltipMarker=l,e.formatTime=h,e.capitalFirst=u,e.truncateText=x,e.getTextRect=y},function(t,e){var r=function(){this.head=null,this.tail=null,this._len=0},n=r.prototype;n.insert=function(t){var e=new i(t);return this.insertEntry(e),e},n.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},n.remove=function(t){var e=t.prev,r=t.next;e?e.next=r:this.head=r,r?r.prev=e:this.tail=e,t.next=t.prev=null,this._len--},n.len=function(){return this._len},n.clear=function(){this.head=this.tail=null,this._len=0};var i=function(t){this.value=t,this.next,this.prev},a=function(t){this._list=new r,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},o=a.prototype;o.put=function(t,e){var r=this._list,n=this._map,a=null;if(null==n[t]){var o=r.len(),s=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var l=r.head;r.remove(l),delete n[l.key],a=l.value,this._lastRemovedEntry=l}s?s.value=e:s=new i(e),s.key=t,r.insertEntry(s),n[t]=s}return a},o.get=function(t){var e=this._map[t],r=this._list;if(null!=e)return e!==r.tail&&(r.remove(e),r.insertEntry(e)),e.value},o.clear=function(){this._list.clear(),this._map={}};var s=a;t.exports=s},function(t,e){var r={};r="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0,svgSupported:!0}:function(t){var e={},r={},n=t.match(/Firefox\/([\d.]+)/),i=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),a=t.match(/Edge\/([\d.]+)/),o=/micromessenger/i.test(t);return n&&(r.firefox=!0,r.version=n[1]),i&&(r.ie=!0,r.version=i[1]),a&&(r.edge=!0,r.version=a[1]),o&&(r.weChat=!0),{browser:r,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!r.ie&&!r.edge,pointerEventsSupported:"onpointerdown"in window&&(r.edge||r.ie&&r.version>=11)}}(navigator.userAgent);var n=r;t.exports=n},function(t,e,r){var n=r(41),i=r(42),a=r(17),o=r(43),s=r(0),l=function(t){a.call(this,t),i.call(this,t),o.call(this,t),this.id=t.id||n()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var r=this.transform;r||(r=this.transform=[1,0,0,1,0,0]),r[4]+=t,r[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var r=this[t];r||(r=this[t]=[]),r[0]=e[0],r[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var r in t)t.hasOwnProperty(r)&&this.attrKV(r,t[r]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var r=0;rs||t<-s}var i=r(8),a=r(2),o=i.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},h=l.prototype;h.transform=null,h.needLocalTransform=function(){return n(this.rotation)||n(this.position[0])||n(this.position[1])||n(this.scale[0]-1)||n(this.scale[1]-1)},h.updateTransform=function(){var t=this.parent,e=t&&t.transform,r=this.needLocalTransform(),n=this.transform;if(!r&&!e)return void(n&&o(n));n=n||i.create(),r?this.getLocalTransform(n):o(n),e&&(r?i.mul(n,t.transform,n):i.copy(n,t.transform)),this.transform=n,this.invTransform=this.invTransform||i.create(),i.invert(this.invTransform,n)},h.getLocalTransform=function(t){return l.getLocalTransform(this,t)},h.setTransform=function(t){var e=this.transform,r=t.dpr||1;e?t.setTransform(r*e[0],r*e[1],r*e[2],r*e[3],r*e[4],r*e[5]):t.setTransform(r,0,0,r,0,0)},h.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var u=[];h.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(i.mul(u,t.invTransform,e),e=u);var r=e[0]*e[0]+e[1]*e[1],a=e[2]*e[2]+e[3]*e[3],o=this.position,s=this.scale;n(r-1)&&(r=Math.sqrt(r)),n(a-1)&&(a=Math.sqrt(a)),e[0]<0&&(r=-r),e[3]<0&&(a=-a),o[0]=e[4],o[1]=e[5],s[0]=r,s[1]=a,this.rotation=Math.atan2(-e[1]/a,e[0]/r)}},h.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),r=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(r=-r),[e,r]},h.transformCoordToLocal=function(t,e){var r=[t,e],n=this.invTransform;return n&&a.applyTransform(r,r,n),r},h.transformCoordToGlobal=function(t,e){var r=[t,e],n=this.transform;return n&&a.applyTransform(r,r,n),r},l.getLocalTransform=function(t,e){e=e||[],o(e);var r=t.origin,n=t.scale||[1,1],a=t.rotation||0,s=t.position||[0,0];return r&&(e[4]-=r[0],e[5]-=r[1]),i.scale(e,e,n),a&&i.rotate(e,e,a),r&&(e[4]+=r[0],e[5]+=r[1]),e[4]+=s[0],e[5]+=s[1],e};var c=l;t.exports=c},function(t,e,r){function n(t){return t=Math.round(t),t<0?0:t>255?255:t}function i(t){return t=Math.round(t),t<0?0:t>360?360:t}function a(t){return t<0?0:t>1?1:t}function o(t){return n(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function s(t){return a(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function l(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}function h(t,e,r){return t+(e-t)*r}function u(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t}function c(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function f(t,e){k&&c(k,e),k=T.put(t,k||e.slice())}function d(t,e){if(t){e=e||[];var r=T.get(t);if(r)return c(e,r);t+="";var n=t.replace(/ /g,"").toLowerCase();if(n in M)return c(e,M[n]),f(t,e),e;if("#"!==n.charAt(0)){var i=n.indexOf("("),a=n.indexOf(")");if(-1!==i&&a+1===n.length){var l=n.substr(0,i),h=n.substr(i+1,a-(i+1)).split(","),d=1;switch(l){case"rgba":if(4!==h.length)return void u(e,0,0,0,1);d=s(h.pop());case"rgb":return 3!==h.length?void u(e,0,0,0,1):(u(e,o(h[0]),o(h[1]),o(h[2]),d),f(t,e),e);case"hsla":return 4!==h.length?void u(e,0,0,0,1):(h[3]=s(h[3]),v(h,e),f(t,e),e);case"hsl":return 3!==h.length?void u(e,0,0,0,1):(v(h,e),f(t,e),e);default:return}}u(e,0,0,0,1)}else{if(4===n.length){var g=parseInt(n.substr(1),16);return g>=0&&g<=4095?(u(e,(3840&g)>>4|(3840&g)>>8,240&g|(240&g)>>4,15&g|(15&g)<<4,1),f(t,e),e):void u(e,0,0,0,1)}if(7===n.length){var g=parseInt(n.substr(1),16);return g>=0&&g<=16777215?(u(e,(16711680&g)>>16,(65280&g)>>8,255&g,1),f(t,e),e):void u(e,0,0,0,1)}}}}function v(t,e){var r=(parseFloat(t[0])%360+360)%360/360,i=s(t[1]),a=s(t[2]),o=a<=.5?a*(i+1):a+i-a*i,h=2*a-o;return e=e||[],u(e,n(255*l(h,o,r+1/3)),n(255*l(h,o,r)),n(255*l(h,o,r-1/3)),1),4===t.length&&(e[3]=t[3]),e}function g(t){if(t){var e,r,n=t[0]/255,i=t[1]/255,a=t[2]/255,o=Math.min(n,i,a),s=Math.max(n,i,a),l=s-o,h=(s+o)/2;if(0===l)e=0,r=0;else{r=h<.5?l/(s+o):l/(2-s-o);var u=((s-n)/6+l/2)/l,c=((s-i)/6+l/2)/l,f=((s-a)/6+l/2)/l;n===s?e=f-c:i===s?e=1/3+u-f:a===s&&(e=2/3+c-u),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,r,h];return null!=t[3]&&d.push(t[3]),d}}function p(t,e){var r=d(t);if(r){for(var n=0;n<3;n++)r[n]=e<0?r[n]*(1-e)|0:(255-r[n])*e+r[n]|0;return b(r,4===r.length?"rgba":"rgb")}}function m(t){var e=d(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)}function x(t,e,r){if(e&&e.length&&t>=0&&t<=1){r=r||[];var i=t*(e.length-1),o=Math.floor(i),s=Math.ceil(i),l=e[o],u=e[s],c=i-o;return r[0]=n(h(l[0],u[0],c)),r[1]=n(h(l[1],u[1],c)),r[2]=n(h(l[2],u[2],c)),r[3]=a(h(l[3],u[3],c)),r}}function y(t,e,r){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),o=Math.floor(i),s=Math.ceil(i),l=d(e[o]),u=d(e[s]),c=i-o,f=b([n(h(l[0],u[0],c)),n(h(l[1],u[1],c)),n(h(l[2],u[2],c)),a(h(l[3],u[3],c))],"rgba");return r?{color:f,leftIndex:o,rightIndex:s,value:i}:f}}function w(t,e,r,n){if(t=d(t))return t=g(t),null!=e&&(t[0]=i(e)),null!=r&&(t[1]=s(r)),null!=n&&(t[2]=s(n)),b(v(t),"rgba")}function _(t,e){if((t=d(t))&&null!=e)return t[3]=a(e),b(t,"rgba")}function b(t,e){if(t&&t.length){var r=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(r+=","+t[3]),e+"("+r+")"}}var S=r(14),M={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},T=new S(20),k=null,C=x,P=y;e.parse=d,e.lift=p,e.toHex=m,e.fastLerp=x,e.fastMapToColor=C,e.lerp=y,e.mapToColor=P,e.modifyHSL=w,e.modifyAlpha=_,e.stringify=b},function(t,e){var r=1;"undefined"!=typeof window&&(r=Math.max(window.devicePixelRatio||1,1));var n=r;e.debugMode=0,e.devicePixelRatio=n},function(t,e,r){function n(t){return i(t),M(t.rich,i),t}function i(t){if(t){t.font=P.makeFont(t);var e=t.textAlign;"middle"===e&&(e="center"),t.textAlign=null==e||O[e]?e:"left";var r=t.textVerticalAlign||t.textBaseline;"center"===r&&(r="middle"),t.textVerticalAlign=null==r||D[r]?r:"top";t.textPadding&&(t.textPadding=T(t.textPadding))}}function a(t,e,r,n,i){n.rich?s(t,e,r,n,i):o(t,e,r,n,i)}function o(t,e,r,n,i){var a=g(e,"font",n.font||P.DEFAULT_FONT),o=n.textPadding,s=t.__textCotentBlock;s&&!t.__dirty||(s=t.__textCotentBlock=P.parsePlainText(r,a,o,n.truncate));var l=s.outerHeight,u=s.lines,d=s.lineHeight,x=v(l,n,i),w=x.baseX,_=x.baseY,b=x.textAlign,S=x.textVerticalAlign;h(e,n,i,w,_);var M=P.adjustTextY(_,l,S),T=w,k=M,C=c(n);if(C||o){var I=P.getWidth(r,a),A=I;o&&(A+=o[1]+o[3]);var O=P.adjustTextX(w,A,b);C&&f(t,e,n,O,M,A,l),o&&(T=y(w,b,o),k+=o[0])}g(e,"textAlign",b||"left"),g(e,"textBaseline","middle"),g(e,"shadowBlur",n.textShadowBlur||0),g(e,"shadowColor",n.textShadowColor||"transparent"),g(e,"shadowOffsetX",n.textShadowOffsetX||0),g(e,"shadowOffsetY",n.textShadowOffsetY||0),k+=d/2;var D=n.textStrokeWidth,L=p(n.textStroke,D),F=m(n.textFill);L&&(g(e,"lineWidth",D),g(e,"strokeStyle",L)),F&&g(e,"fillStyle",F);for(var R=0;R=0&&(T=C[R],"right"===T.textAlign);)u(t,e,T,n,A,b,F,"right"),O-=T.width,F-=T.width,R--;for(L+=(a-(L-_)-(S-F)-O)/2;D<=R;)T=C[D],u(t,e,T,n,A,b,L+T.width/2,"center"),L+=T.width,D++;b+=A}}function h(t,e,r,n,i){if(r&&e.textRotation){var a=e.textOrigin;"center"===a?(n=r.width/2+r.x,i=r.height/2+r.y):a&&(n=a[0]+r.x,i=a[1]+r.y),t.translate(n,i),t.rotate(-e.textRotation),t.translate(-n,-i)}}function u(t,e,r,n,i,a,o,s){var l=n.rich[r.styleName]||{},h=r.textVerticalAlign,u=a+i/2;"top"===h?u=a+r.height/2:"bottom"===h&&(u=a+i-r.height/2),!r.isLineHolder&&c(l)&&f(t,e,l,"right"===s?o-r.width:"center"===s?o-r.width/2:o,u-r.height/2,r.width,r.height);var d=r.textPadding;d&&(o=y(o,s,d),u-=r.height/2-d[2]-r.textHeight/2),g(e,"shadowBlur",S(l.textShadowBlur,n.textShadowBlur,0)),g(e,"shadowColor",l.textShadowColor||n.textShadowColor||"transparent"),g(e,"shadowOffsetX",S(l.textShadowOffsetX,n.textShadowOffsetX,0)),g(e,"shadowOffsetY",S(l.textShadowOffsetY,n.textShadowOffsetY,0)),g(e,"textAlign",s),g(e,"textBaseline","middle"),g(e,"font",r.font||P.DEFAULT_FONT);var v=p(l.textStroke||n.textStroke,w),x=m(l.textFill||n.textFill),w=b(l.textStrokeWidth,n.textStrokeWidth);v&&(g(e,"lineWidth",w),g(e,"strokeStyle",v),e.strokeText(r.text,o,u)),x&&(g(e,"fillStyle",x),e.fillText(r.text,o,u))}function c(t){return t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor}function f(t,e,r,n,i,a,o){var s=r.textBackgroundColor,l=r.textBorderWidth,h=r.textBorderColor,u=k(s);if(g(e,"shadowBlur",r.textBoxShadowBlur||0),g(e,"shadowColor",r.textBoxShadowColor||"transparent"),g(e,"shadowOffsetX",r.textBoxShadowOffsetX||0),g(e,"shadowOffsetY",r.textBoxShadowOffsetY||0),u||l&&h){e.beginPath();var c=r.textBorderRadius;c?I.buildPath(e,{x:n,y:i,width:a,height:o,r:c}):e.rect(n,i,a,o),e.closePath()}if(u)g(e,"fillStyle",s),e.fill();else if(C(s)){var f=s.image;f=A.createOrUpdateImage(f,null,t,d,s),f&&A.isImageReady(f)&&e.drawImage(f,n,i,a,o)}l&&h&&(g(e,"lineWidth",l),g(e,"strokeStyle",h),e.stroke())}function d(t,e){e.image=t}function v(t,e,r){var n=e.x||0,i=e.y||0,a=e.textAlign,o=e.textVerticalAlign;if(r){var s=e.textPosition;if(s instanceof Array)n=r.x+x(s[0],r.width),i=r.y+x(s[1],r.height);else{var l=P.adjustTextPositionOnRect(s,r,e.textDistance);n=l.x,i=l.y,a=a||l.textAlign,o=o||l.textVerticalAlign}var h=e.textOffset;h&&(n+=h[0],i+=h[1])}return{baseX:n,baseY:i,textAlign:a,textVerticalAlign:o}}function g(t,e,r){return t[e]=r,t[e]}function p(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function m(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function x(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function y(t,e,r){return"right"===e?t-r[1]:"center"===e?t+r[3]/2-r[1]/2:t+r[3]}function w(t,e){return null!=t&&(t||e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor||e.textPadding)}var _=r(0),b=_.retrieve2,S=_.retrieve3,M=_.each,T=_.normalizeCssArray,k=_.isString,C=_.isObject,P=r(5),I=r(21),A=r(10),O={left:1,right:1,center:1},D={top:1,bottom:1,middle:1};e.normalizeTextStyle=n,e.renderText=a,e.getStroke=p,e.getFill=m,e.needDrawText=w},function(t,e){function r(t,e){var r,n,i,a,o=e.x,s=e.y,l=e.width,h=e.height,u=e.r;l<0&&(o+=l,l=-l),h<0&&(s+=h,h=-h),"number"==typeof u?r=n=i=a=u:u instanceof Array?1===u.length?r=n=i=a=u[0]:2===u.length?(r=i=u[0],n=a=u[1]):3===u.length?(r=u[0],n=a=u[1],i=u[2]):(r=u[0],n=u[1],i=u[2],a=u[3]):r=n=i=a=0;var c;r+n>l&&(c=r+n,r*=l/c,n*=l/c),i+a>l&&(c=i+a,i*=l/c,a*=l/c),n+i>h&&(c=n+i,n*=h/c,i*=h/c),r+a>h&&(c=r+a,r*=h/c,a*=h/c),t.moveTo(o+r,s),t.lineTo(o+l-n,s),0!==n&&t.quadraticCurveTo(o+l,s,o+l,s+n),t.lineTo(o+l,s+h-i),0!==i&&t.quadraticCurveTo(o+l,s+h,o+l-i,s+h),t.lineTo(o+a,s+h),0!==a&&t.quadraticCurveTo(o,s+h,o,s+h-a),t.lineTo(o,s+r),0!==r&&t.quadraticCurveTo(o,s,o+r,s)}e.buildPath=r},function(t,e){function r(t){return t%=n,t<0&&(t+=n),t}var n=2*Math.PI;e.normalizeRadian=r},function(t,e,r){function n(t,e,r){var n=e.points,o=e.smooth;if(n&&n.length>=2){if(o&&"spline"!==o){var s=a(n,o,r,e.smoothConstraint);t.moveTo(n[0][0],n[0][1]);for(var l=n.length,h=0;h<(r?l:l-1);h++){var u=s[2*h],c=s[2*h+1],f=n[(h+1)%l];t.bezierCurveTo(u[0],u[1],c[0],c[1],f[0],f[1])}}else{"spline"===o&&(n=i(n,r)),t.moveTo(n[0][0],n[0][1]);for(var h=1,d=n.length;h128){var l=r.data[o]+r.data[o+1]+r.data[o+2];i+=l,++a}}for(var h=i/a,o=0;oh?(n.data[o]=0,n.data[o+1]=0,n.data[o+2]=0,n.data[o+3]=0):(n.data[o]=255,n.data[o+1]=255,n.data[o+2]=255,n.data[o+3]=255)}e.putImageData(n,0,0)}var i=r(7),a=r(27);r(28),r(77);var o=r(78);if(!o.isSupported)throw new Error("Sorry your browser not support wordCloud");i.registerLayout(function(t,e){t.eachSeriesByType("wordCloud",function(r){function s(t){var e=t.detail.item;t.detail.drawn&&r.layoutInstance.ondraw&&(t.detail.drawn.gx+=l.x/m,t.detail.drawn.gy+=l.y/m,r.layoutInstance.ondraw(e[0],e[1],e[2],t.detail.drawn))}var l=a.getLayoutRect(r.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),h=r.getData(),u=document.createElement("canvas");u.width=l.width,u.height=l.height;var c=u.getContext("2d"),f=r.get("maskImage");if(f)try{c.drawImage(f,0,0,u.width,u.height),n(u)}catch(t){console.error("Invalid mask image"),console.error(t.toString())}var d=r.get("sizeRange"),v=r.get("rotationRange"),g=h.getDataExtent("value"),p=Math.PI/180,m=r.get("gridSize");o(u,{list:h.mapArray("value",function(t,e){var r=h.getItemModel(e);return[h.getName(e),r.get("textStyle.normal.textSize",!0)||i.number.linearMap(t,g,d),e]}).sort(function(t,e){return e[1]-t[1]}),fontFamily:r.get("textStyle.normal.fontFamily")||r.get("textStyle.emphasis.fontFamily")||t.get("textStyle.fontFamily"),fontWeight:r.get("textStyle.normal.fontWeight")||r.get("textStyle.emphasis.fontWeight")||t.get("textStyle.fontWeight"),gridSize:m,ellipticity:l.height/l.width,minRotation:v[0]*p,maxRotation:v[1]*p,clearCanvas:!f,rotateRatio:1,rotationStep:r.get("rotationStep")*p,drawOutOfBound:r.get("drawOutOfBound"),shuffle:!1,shape:r.get("shape")}),u.addEventListener("wordclouddrawn",s),r.layoutInstance&&r.layoutInstance.dispose(),r.layoutInstance={ondraw:null,dispose:function(){u.removeEventListener("wordclouddrawn",s),u.addEventListener("wordclouddrawn",function(t){t.preventDefault()})}}})}),i.registerPreprocessor(function(t){function e(t){t&&i.util.each(n,function(e){t.hasOwnProperty(e)&&(t["text"+i.format.capitalFirst(e)]=t[e])})}var r=(t||{}).series;!i.util.isArray(r)&&(r=r?[r]:[]);var n=["shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];i.util.each(r,function(t){if(t&&"wordCloud"===t.type){var r=t.textStyle||{};e(r.normal),e(r.emphasis)}})})},function(t,e,r){function n(t,e,r,n,i){var a=0,o=0;null==n&&(n=1/0),null==i&&(i=1/0);var s=0;e.eachChild(function(l,h){var u,c,f=l.position,d=l.getBoundingRect(),v=e.childAt(h+1),g=v&&v.getBoundingRect();if("horizontal"===t){var p=d.width+(g?-g.x+d.x:0);u=a+p,u>n||l.newline?(a=0,u=p,o+=s+r,s=d.height):s=Math.max(s,d.height)}else{var m=d.height+(g?-g.y+d.y:0);c=o+m,c>i||l.newline?(a+=s+r,o=0,c=m,s=d.width):s=Math.max(s,d.width)}l.newline||(f[0]=a,f[1]=o,"horizontal"===t?a=u+r:o=c+r)})}function i(t,e,r){var n=e.width,i=e.height,a=v(t.x,n),o=v(t.y,i),s=v(t.x2,n),l=v(t.y2,i);return(isNaN(a)||isNaN(parseFloat(t.x)))&&(a=0),(isNaN(s)||isNaN(parseFloat(t.x2)))&&(s=n),(isNaN(o)||isNaN(parseFloat(t.y)))&&(o=0),(isNaN(l)||isNaN(parseFloat(t.y2)))&&(l=i),r=g.normalizeCssArray(r||0),{width:Math.max(s-a-r[1]-r[3],0),height:Math.max(l-o-r[0]-r[2],0)}}function a(t,e,r){r=g.normalizeCssArray(r||0);var n=e.width,i=e.height,a=v(t.left,n),o=v(t.top,i),s=v(t.right,n),l=v(t.bottom,i),h=v(t.width,n),u=v(t.height,i),c=r[2]+r[0],d=r[1]+r[3],p=t.aspect;switch(isNaN(h)&&(h=n-s-d-a),isNaN(u)&&(u=i-l-c-o),null!=p&&(isNaN(h)&&isNaN(u)&&(p>n/i?h=.8*n:u=.8*i),isNaN(h)&&(h=p*u),isNaN(u)&&(u=h/p)),isNaN(a)&&(a=n-s-h-d),isNaN(o)&&(o=i-l-u-c),t.left||t.right){case"center":a=n/2-h/2-r[3];break;case"right":a=n-h-d}switch(t.top||t.bottom){case"middle":case"center":o=i/2-u/2-r[0];break;case"bottom":o=i-u-c}a=a||0,o=o||0,isNaN(h)&&(h=n-d-a-(s||0)),isNaN(u)&&(u=i-c-o-(l||0));var m=new f(a+r[3],o+r[0],h,u);return m.margin=r,m}function o(t,e,r,n,i){var o=!i||!i.hv||i.hv[0],s=!i||!i.hv||i.hv[1],l=i&&i.boundingMode||"all";if(o||s){var h;if("raw"===l)h="group"===t.type?new f(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(h=t.getBoundingRect(),t.needLocalTransform()){var u=t.getLocalTransform();h=h.clone(),h.applyTransform(u)}e=a(c.defaults({width:h.width,height:h.height},e),r,n);var d=t.position,v=o?e.x-h.x:0,g=s?e.y-h.y:0;t.attr("position","raw"===l?[v,g]:[d[0]+v,d[1]+g])}}function s(t,e){return null!=t[x[e][0]]||null!=t[x[e][1]]&&null!=t[x[e][2]]}function l(t,e,r){function n(r,n){var o={},l=0,h={},u=0;if(p(r,function(e){h[e]=t[e]}),p(r,function(t){i(e,t)&&(o[t]=h[t]=e[t]),a(o,t)&&l++,a(h,t)&&u++}),s[n])return a(e,r[1])?h[r[2]]=null:a(e,r[2])&&(h[r[1]]=null),h;if(2!==u&&l){if(l>=2)return o;for(var c=0;c=r.length&&r.push({option:t})}}),r}function u(t){var e=y.createHashMap();S(t,function(t,r){var n=t.exist;n&&e.set(n.id,t)}),S(t,function(t,r){var n=t.option;y.assert(!n||null==n.id||!e.get(n.id)||e.get(n.id)===t,"id duplicates: "+(n&&n.id)),n&&null!=n.id&&e.set(n.id,t),!t.keyInfo&&(t.keyInfo={})}),S(t,function(t,r){var n=t.exist,i=t.option,a=t.keyInfo;if(M(i)){if(a.name=null!=i.name?i.name+"":n?n.name:"\0-",n)a.id=n.id;else if(null!=i.id)a.id=i.id+"";else{var o=0;do{a.id="\0"+a.name+"\0"+o++}while(e.get(a.id))}e.set(a.id,t)}})}function c(t){return M(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function f(t,e){function r(t,e,r){for(var i=0,a=t.length;i=0)&&(n={textFill:null,textStroke:t.textStroke,textStrokeWidth:t.textStrokeWidth},t.textFill="#fff",null==t.textStroke&&(t.textStroke=r.autoColor,null==t.textStrokeWidth&&(t.textStrokeWidth=2))),n}function L(t){var e=t.insideRollback;e&&(t.textFill=e.textFill,t.textStroke=e.textStroke,t.textStrokeWidth=e.textStrokeWidth)}function F(t,e){var r=e||e.getModel("textStyle");return[t.fontStyle||r&&r.getShallow("fontStyle")||"",t.fontWeight||r&&r.getShallow("fontWeight")||"",(t.fontSize||r&&r.getShallow("fontSize")||12)+"px",t.fontFamily||r&&r.getShallow("fontFamily")||"sans-serif"].join(" ")}function R(t,e,r,n,i,a){if("function"==typeof i&&(a=i,i=null),n&&n.isAnimationEnabled()){var o=t?"Update":"",s=n.getShallow("animationDuration"+o),l=n.getShallow("animationEasing"+o),h=n.getShallow("animationDelay"+o);"function"==typeof h&&(h=h(i,n.getAnimationDelayParams?n.getAnimationDelayParams(e,i):null)),"function"==typeof s&&(s=s(i)),s>0?e.animateTo(r,s,h||0,l,a,!!a):(e.stopAnimation(),e.attr(r),a&&a())}else e.stopAnimation(),e.attr(r),a&&a()}function B(t,e,r,n,i){R(!0,t,e,r,n,i)}function z(t,e,r,n,i){R(!1,t,e,r,n,i)}function N(t,e){for(var r=U.identity([]);t&&t!==e;)U.mul(r,t.getLocalTransform(),r),t=t.parent;return r}function E(t,e,r){return e&&!Y.isArrayLike(e)&&(e=Q.getLocalTransform(e)),r&&(e=U.invert([],e)),$.applyTransform([],t,e)}function W(t,e,r){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),i=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-n:"right"===t?n:0,"top"===t?-i:"bottom"===t?i:0];return a=E(a,e,r),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?"bottom":"top"}function q(t,e,r,n){function i(t){var e={position:$.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=Y.extend({},t.shape)),e}if(t&&e){var a=function(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var n=i(t);t.attr(i(e)),B(t,n,r,t.dataIndex)}}})}}function H(t,e){return Y.map(t,function(t){var r=t[0];r=gt(r,e.x),r=pt(r,e.x+e.width);var n=t[1];return n=gt(n,e.y),n=pt(n,e.y+e.height),[r,n]})}function j(t,e){var r=gt(t.x,e.x),n=pt(t.x+t.width,e.x+e.width),i=gt(t.y,e.y),a=pt(t.y+t.height,e.y+e.height);if(n>=r&&a>=i)return{x:r,y:i,width:n-r,height:a-i}}function X(t,e,r){e=Y.extend({rectHover:!0},e);var n=e.style={strokeNoScale:!0};if(r=r||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(n.image=t.slice(8),Y.defaults(n,r),new K(e)):a(t.replace("path://",""),e,r,"center")}var Y=r(0),V=r(39),G=r(18),U=r(8),$=r(2),Z=r(1),Q=r(17),K=r(58);e.Image=K;var J=r(59);e.Group=J;var tt=r(60);e.Text=tt;var et=r(61);e.Circle=et;var rt=r(62);e.Sector=rt;var nt=r(64);e.Ring=nt;var it=r(65);e.Polygon=it;var at=r(68);e.Polyline=at;var ot=r(69);e.Rect=ot;var st=r(70);e.Line=st;var lt=r(71);e.BezierCurve=lt;var ht=r(72);e.Arc=ht;var ut=r(73);e.CompoundPath=ut;var ct=r(74);e.LinearGradient=ct;var ft=r(75);e.RadialGradient=ft;var dt=r(3);e.BoundingRect=dt;var vt=Math.round,gt=Math.max,pt=Math.min,mt={},xt=V.mergePath;e.extendShape=n,e.extendPath=i,e.makePath=a,e.makeImage=o,e.mergePath=xt,e.resizePath=l,e.subPixelOptimizeLine=h,e.subPixelOptimizeRect=u,e.subPixelOptimize=c,e.setHoverStyle=M,e.setLabelStyle=T,e.setTextStyle=k,e.setText=C,e.getFont=F,e.updateProps=B,e.initProps=z,e.getTransform=N,e.applyTransform=E,e.transformDirection=W,e.groupTransition=q,e.clipPointsByRect=H,e.clipRectByRect=j,e.createIcon=X},function(t,e,r){function n(t,e,r,n,i,a,o,s,l,h,u){var c=l*(p/180),f=g(c)*(t-r)/2+v(c)*(e-n)/2,m=-1*v(c)*(t-r)/2+g(c)*(e-n)/2,w=f*f/(o*o)+m*m/(s*s);w>1&&(o*=d(w),s*=d(w));var _=(i===a?-1:1)*d((o*o*(s*s)-o*o*(m*m)-s*s*(f*f))/(o*o*(m*m)+s*s*(f*f)))||0,b=_*o*m/s,S=_*-s*f/o,M=(t+r)/2+g(c)*b-v(c)*S,T=(e+n)/2+v(c)*b+g(c)*S,k=y([1,0],[(f-b)/o,(m-S)/s]),C=[(f-b)/o,(m-S)/s],P=[(-1*f-b)/o,(-1*m-S)/s],I=y(C,P);x(C,P)<=-1&&(I=p),x(C,P)>=1&&(I=0),0===a&&I>0&&(I-=2*p),1===a&&I<0&&(I+=2*p),u.addData(h,M,T,o,s,k,I,c,a)}function i(t){if(!t)return[];var e,r=t.replace(/-/g," -").replace(/ /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e0&&""===p[0]&&p.shift();for(var m=0;m0},extendFrom:function(t,e){if(t)for(var r in t)!t.hasOwnProperty(r)||!0!==e&&(!1===e?this.hasOwnProperty(r):null==t[r])||(this[r]=t[r])},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,i){for(var a="radial"===e.type?n:r,o=a(t,e,i),s=e.colorStops,l=0;l3&&(e=r.call(e,1));for(var i=this._$handlers[t],a=i.length,o=0;o4&&(e=r.call(e,1,e.length-1));for(var i=e[e.length-1],a=this._$handlers[t],o=a.length,s=0;s0&&this.animate(t,!1).when(null==n?500:n,a).delay(i||0),this}};var f=c;t.exports=f},function(t,e,r){function n(t,e){return t[e]}function i(t,e,r){t[e]=r}function a(t,e,r){return(e-t)*r+t}function o(t,e,r){return r>.5?e:t}function s(t,e,r,n,i){var o=t.length;if(1==i)for(var s=0;si)t.length=i;else for(var a=n;a=0&&!(P[r]<=e);r--);r=Math.min(r,_-2)}else{for(r=H;r<_&&!(P[r]>e);r++);r=Math.min(r-1,_-2)}H=r,j=e;var n=P[r+1]-P[r];if(0!==n)if(z=(e-P[r])/n,w)if(E=I[r],N=I[0===r?r:r-1],W=I[r>_-2?_-1:r+1],q=I[r>_-3?_-1:r+2],M)u(N,E,W,q,z,z*z,z*z*z,g(t,i),C);else{var l;if(T)l=u(N,E,W,q,z,z*z,z*z*z,X,1),l=d(X);else{if(k)return o(E,W,z);l=c(N,E,W,q,z,z*z,z*z*z)}x(t,i,l)}else if(M)s(I[r],I[r+1],z,g(t,i),C);else{var l;if(T)s(I[r],I[r+1],z,X,1),l=d(X);else{if(k)return o(I[r],I[r+1],z);l=a(I[r],I[r+1],z)}x(t,i,l)}},V=new p({target:t._target,life:b,loop:t._loop,delay:t._delay,onframe:Y,ondestroy:r});return e&&"spline"!==e&&(V.easing=e),V}}}var p=r(45),m=r(18),x=r(0),y=x.isArrayLike,w=Array.prototype.slice,_=function(t,e,r,a){this._tracks={},this._target=t,this._loop=e||!1,this._getter=r||n,this._setter=a||i,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var r=this._tracks;for(var n in e)if(e.hasOwnProperty(n)){if(!r[n]){r[n]=[];var i=this._getter(this._target,n);if(null==i)continue;0!==t&&r[n].push({time:0,value:f(i)})}r[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t1&&(a=function(){for(var t in arguments)console.log(arguments[t])});var o=a;t.exports=o},function(t,e,r){var n=r(20),i=r(3),a=new i,o=function(){};o.prototype={constructor:o,drawRectText:function(t,e){var r=this.style;e=r.textRect||e,this.__dirty&&n.normalizeTextStyle(r,!0);var i=r.text;if(null!=i&&(i+=""),n.needDrawText(i,r)){t.save();var o=this.transform;r.transformText?this.setTransform(t):o&&(a.copy(e),a.applyTransform(o),e=a),n.renderText(this,t,i,r,e),t.restore()}}};var s=o;t.exports=s},function(t,e,r){function n(t,e,r){if(0!==t.length){var n,i=t[0],a=i[0],o=i[0],s=i[1],l=i[1];for(n=1;n1e-4)return s[0]=t-r,s[1]=e-n,h[0]=t+r,void(h[1]=e+n);if(g[0]=d(i)*r+t,g[1]=f(i)*n+e,p[0]=d(a)*r+t,p[1]=f(a)*n+e,u(s,g,p),c(h,g,p),i%=v,i<0&&(i+=v),a%=v,a<0&&(a+=v),i>a&&!o?a+=v:ii&&(m[0]=d(w)*r+t,m[1]=f(w)*n+e,u(s,m,s),c(h,m,h))}var l=r(2),h=r(4),u=Math.min,c=Math.max,f=Math.sin,d=Math.cos,v=2*Math.PI,g=l.create(),p=l.create(),m=l.create(),x=[],y=[];e.fromPoints=n,e.fromLine=i,e.fromCubic=a,e.fromQuadratic=o,e.fromArc=s},function(t,e,r){function n(t,e){return Math.abs(t-e)e&&u>n&&u>o&&u>l||u1&&i(),f=x.cubicAt(e,n,o,l,M[0]),g>1&&(d=x.cubicAt(e,n,o,l,M[1]))),2==g?me&&s>n&&s>a||s=0&&h<=1){for(var u=0,c=x.quadraticAt(e,n,a,h),f=0;fr||s<-r)return 0;var l=Math.sqrt(r*r-s*s);S[0]=-l,S[1]=l;var h=Math.abs(n-i);if(h<1e-4)return 0;if(h%_<1e-4){n=0,i=_;var u=a?1:-1;return o>=S[0]+t&&o<=S[1]+t?u:0}if(a){var l=n;n=m(i),i=m(l)}else n=m(n),i=m(i);n>i&&(i+=_);for(var c=0,f=0;f<2;f++){var d=S[f];if(d+t>o){var v=Math.atan2(s,d),u=a?1:-1;v<0&&(v=_+v),(v>=n&&v<=i||v+_>=n&&v+_<=i)&&(v>Math.PI/2&&v<1.5*Math.PI&&(u=-u),c+=u)}}return c}function l(t,e,r,i,l){for(var h=0,u=0,c=0,p=0,m=0,x=0;x1&&(r||(h+=y(u,c,p,m,i,l))),1==x&&(u=t[x],c=t[x+1],p=u,m=c),_){case w.M:p=t[x++],m=t[x++],u=p,c=m;break;case w.L:if(r){if(f.containStroke(u,c,t[x],t[x+1],e,i,l))return!0}else h+=y(u,c,t[x],t[x+1],i,l)||0;u=t[x++],c=t[x++];break;case w.C:if(r){if(d.containStroke(u,c,t[x++],t[x++],t[x++],t[x++],t[x],t[x+1],e,i,l))return!0}else h+=a(u,c,t[x++],t[x++],t[x++],t[x++],t[x],t[x+1],i,l)||0;u=t[x++],c=t[x++];break;case w.Q:if(r){if(v.containStroke(u,c,t[x++],t[x++],t[x],t[x+1],e,i,l))return!0}else h+=o(u,c,t[x++],t[x++],t[x],t[x+1],i,l)||0;u=t[x++],c=t[x++];break;case w.A:var b=t[x++],S=t[x++],M=t[x++],T=t[x++],k=t[x++],C=t[x++],P=(t[x++],1-t[x++]),I=Math.cos(k)*M+b,A=Math.sin(k)*T+S;x>1?h+=y(u,c,I,A,i,l):(p=I,m=A);var O=(i-b)*T/M+b;if(r){if(g.containStroke(b,S,T,k,k+C,P,e,O,l))return!0}else h+=s(b,S,T,k,k+C,P,O,l);u=Math.cos(k+C)*M+b,c=Math.sin(k+C)*T+S;break;case w.R:p=u=t[x++],m=c=t[x++];var D=t[x++],L=t[x++],I=p+D,A=m+L;if(r){if(f.containStroke(p,m,I,m,e,i,l)||f.containStroke(I,m,I,A,e,i,l)||f.containStroke(I,A,p,A,e,i,l)||f.containStroke(p,A,p,m,e,i,l))return!0}else h+=y(I,m,I,A,i,l),h+=y(p,A,p,m,i,l);break;case w.Z:if(r){if(f.containStroke(u,c,p,m,e,i,l))return!0}else h+=y(u,c,p,m,i,l);u=p,c=m}}return r||n(c,m)||(h+=y(u,c,p,m,i,l)||0),0!==h}function h(t,e,r){return l(t,0,!1,e,r)}function u(t,e,r,n){return l(t,e,!0,r,n)}var c=r(6),f=r(51),d=r(52),v=r(53),g=r(54),p=r(22),m=p.normalizeRadian,x=r(4),y=r(55),w=c.CMD,_=2*Math.PI,b=1e-4,S=[-1,-1,-1],M=[-1,-1];e.contain=h,e.containStroke=u},function(t,e){function r(t,e,r,n,i,a,o){if(0===i)return!1;var s=i,l=0,h=t;if(o>e+s&&o>n+s||ot+s&&a>r+s||ae+f&&c>n+f&&c>o+f&&c>l+f||ct+f&&u>r+f&&u>a+f&&u>s+f||ue+u&&h>n+u&&h>o+u||ht+u&&l>r+u&&l>i+u||lr||f+ci&&(i+=o);var v=Math.atan2(u,h);return v<0&&(v+=o),v>=n&&v<=i||v+o>=n&&v+o<=i}var i=r(22),a=i.normalizeRadian,o=2*Math.PI;e.containStroke=n},function(t,e){function r(t,e,r,n,i,a){if(a>e&&a>n||ai?o:0}t.exports=r},function(t,e){var r=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};r.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")};var n=r;t.exports=n},function(t,e,r){function n(t,e){var r,n,i,a,c,f,d=t.data,v=s.M,g=s.C,p=s.L,m=s.R,x=s.A,y=s.Q;for(i=0,a=0;i=0&&(r.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,r=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof o&&t.addChildrenToStorage(e)),r&&r.refresh()},remove:function(t){var e=this.__zr,r=this.__storage,i=this._children,a=n.indexOf(i,t);return a<0?this:(i.splice(a,1),t.parent=null,r&&(r.delFromStorage(t),t instanceof o&&t.delChildrenFromStorage(r)),e&&e.refresh(),this)},removeAll:function(){var t,e,r=this._children,n=this.__storage;for(e=0;e=11?function(){var e,r=this.__clipPaths,n=this.style;if(r)for(var i=0;ir-2?r-1:d+1],c=t[d>r-3?r-1:d+2]);var p=v*v,m=v*p;i.push([n(h[0],g[0],u[0],c[0],v,p,m),n(h[1],g[1],u[1],c[1],v,p,m)])}return i}var a=r(2),o=a.distance;t.exports=i},function(t,e,r){function n(t,e,r,n){var i,f,d,v,g=[],p=[],m=[],x=[];if(n){d=[1/0,1/0],v=[-1/0,-1/0];for(var y=0,w=t.length;y=0?1/(Math.cos(2*Math.PI/10-e)+3.07768*Math.sin(2*Math.PI/10-e)):1/(Math.cos(e)+3.07768*Math.sin(e))}}n.gridSize=Math.max(Math.floor(n.gridSize),4);var h,u,c,f,d,v,g,p=n.gridSize,m=p-n.maskGapWidth,x=Math.abs(n.maxRotation-n.minRotation),y=Math.min(n.maxRotation,n.minRotation),w=n.rotationStep;switch(n.color){case"random-dark":g=function(){return r(10,50)};break;case"random-light":g=function(){return r(50,90)};break;default:"function"==typeof n.color&&(g=n.color)}var _=null;"function"==typeof n.classes&&(_=n.classes);var b,S=!1,M=[],T=function(t){var e,r,n=t.currentTarget,i=n.getBoundingClientRect();t.touches?(e=t.touches[0].clientX,r=t.touches[0].clientY):(e=t.clientX,r=t.clientY);var a=e-i.left,o=r-i.top,s=Math.floor(a*(n.width/i.width||1)/p),l=Math.floor(o*(n.height/i.height||1)/p);return M[s][l]},k=function(t){var e=T(t);if(b!==e){if(b=e,!e)return void n.hover(void 0,void 0,t);n.hover(e.item,e.dimension,t)}},C=function(t){var e=T(t);e&&(n.click(e.item,e.dimension,t),t.preventDefault())},P=[],I=function(t){if(P[t])return P[t];var e=8*t,r=e,i=[];for(0===t&&i.push([f[0],f[1],0]);r--;){var a=1;"circle"!==n.shape&&(a=n.shape(r/e*2*Math.PI)),i.push([f[0]+t*a*Math.cos(-r/e*2*Math.PI),f[1]+t*a*Math.sin(-r/e*2*Math.PI)*n.ellipticity,r/e*2*Math.PI])}return P[t]=i,i},A=function(){return n.abortThreshold>0&&(new Date).getTime()-v>n.abortThreshold},O=function(){return 0===n.rotateRatio?0:Math.random()>n.rotateRatio?0:0===x?y:y+Math.round(Math.random()*x/w)*w},D=function(t,e,r){var i=n.weightFactor(e);if(i<=n.minSize)return!1;var a=1;iP[1]&&(P[1]=C),SP[2]&&(P[2]=S);break t}}return{mu:a,occupied:k,bounds:P,gw:y,gh:x,fillTextOffsetX:g,fillTextOffsetY:m,fillTextWidth:h,fillTextHeight:u,fontSize:i}},L=function(t,e,r,i,a){for(var o=a.length;o--;){var s=t+a[o][0],l=e+a[o][1];if(s>=u||l>=c||s<0||l<0){if(!n.drawOutOfBound)return!1}else if(!h[s][l])return!1}return!0},F=function(e,r,i,a,o,s,l,h,u){var c,f=i.fontSize;c=g?g(a,o,f,s,l):n.color;var d;d=_?_(a,o,f,s,l):n.classes;var v=i.bounds;v[3],v[0],v[1],v[3],v[2],v[0],t.forEach(function(t){if(t.getContext){var o=t.getContext("2d"),s=i.mu;o.save(),o.scale(1/s,1/s),o.font=n.fontWeight+" "+(f*s).toString(10)+"px "+n.fontFamily,o.fillStyle=c,o.translate((e+i.gw/2)*p*s,(r+i.gh/2)*p*s),0!==h&&o.rotate(-h),o.textBaseline="middle",o.fillText(a,i.fillTextOffsetX*s,(i.fillTextOffsetY+.5*f)*s),o.restore()}else{var l=document.createElement("span"),v="";v="rotate("+-h/Math.PI*180+"deg) ",1!==i.mu&&(v+="translateX(-"+i.fillTextWidth/4+"px) scale("+1/i.mu+")");var g={position:"absolute",display:"block",font:n.fontWeight+" "+f*i.mu+"px "+n.fontFamily,left:(e+i.gw/2)*p+i.fillTextOffsetX+"px",top:(r+i.gh/2)*p+i.fillTextOffsetY+"px",width:i.fillTextWidth+"px",height:i.fillTextHeight+"px",lineHeight:f+"px",whiteSpace:"nowrap",transform:v,webkitTransform:v,msTransform:v,transformOrigin:"50% 40%",webkitTransformOrigin:"50% 40%",msTransformOrigin:"50% 40%"};c&&(g.color=c),l.textContent=a;for(var m in g)l.style[m]=g[m];if(u)for(var x in u)l.setAttribute(x,u[x]);d&&(l.className+=d),t.appendChild(l)}})},R=function(e,r,n,i,a){if(!(e>=u||r>=c||e<0||r<0)){if(h[e][r]=!1,n){t[0].getContext("2d").fillRect(e*p,r*p,m,m)}S&&(M[e][r]={item:a,dimension:i})}},B=function(e,r,i,a,o,s){var l,h=o.occupied,f=n.drawMask;f&&(l=t[0].getContext("2d"),l.save(),l.fillStyle=n.maskColor);var d;if(S){var v=o.bounds;d={x:(e+v[3])*p,y:(r+v[0])*p,w:(v[1]-v[3]+1)*p,h:(v[2]-v[0]+1)*p}}for(var g=h.length;g--;){var m=e+h[g][0],x=r+h[g][1];m>=u||x>=c||m<0||x<0||R(m,x,f,d,s)}f&&l.restore()},z=function(t){var e,r,i;Array.isArray(t)?(e=t[0],r=t[1]):(e=t.word,r=t.weight,i=t.attributes);var a=O(),o=D(e,r,a);if(!o)return!1;if(A())return!1;if(!n.drawOutOfBound){var l=o.bounds;if(l[1]-l[3]+1>u||l[2]-l[0]+1>c)return!1}for(var h=d+1;h--;){var f=I(d-h);n.shuffle&&(f=[].concat(f),s(f));for(var v=0;v=n.list.length)return w(P),N("wordcloudstop",!1),void _("wordcloudstart",T);v=(new Date).getTime();var e=z(n.list[o]),r=!N("wordclouddrawn",!0,{item:n.list[o],drawn:e});if(A()||r)return w(P),n.abort(),N("wordcloudabort",!1),N("wordcloudstop",!1),void _("wordcloudstart",T);o++,P=y(t,n.wait)},n.wait)}}()}};l.isSupported=a,l.minFontSize=o,n=[],void 0!==(i=function(){return l}.apply(e,n))&&(t.exports=i)}()}])}); \ No newline at end of file diff --git a/src/main/resources/static/assets/libs/echarts/echarts.min.js b/src/main/resources/static/assets/libs/echarts/echarts.min.js new file mode 100644 index 0000000..58e3398 --- /dev/null +++ b/src/main/resources/static/assets/libs/echarts/echarts.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";var e=2311,n=function(){return e++},v="object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?{browser:{},os:{},node:!1,wxa:!0,canvasSupported:!0,svgSupported:!1,touchEventsSupported:!0,domSupported:!1}:"undefined"==typeof document&&"undefined"!=typeof self?{browser:{},os:{},node:!1,worker:!0,canvasSupported:!0,domSupported:!1}:"undefined"==typeof navigator?{browser:{},os:{},node:!0,worker:!1,canvasSupported:!0,svgSupported:!0,domSupported:!1}:function(t){var e={},i=t.match(/Firefox\/([\d.]+)/),n=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge\/([\d.]+)/),a=/micromessenger/i.test(t);i&&(e.firefox=!0,e.version=i[1]);n&&(e.ie=!0,e.version=n[1]);o&&(e.edge=!0,e.version=o[1]);a&&(e.weChat=!0);return{browser:e,os:{},node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!e.ie&&!e.edge,pointerEventsSupported:"onpointerdown"in window&&(e.edge||e.ie&&11<=e.version),domSupported:"undefined"!=typeof document}}(navigator.userAgent);var s={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},l={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},u=Object.prototype.toString,i=Array.prototype,r=i.forEach,h=i.filter,o=i.slice,c=i.map,d=i.reduce,a={};function f(t,e){"createCanvas"===t&&(y=null),a[t]=e}function L(t){if(null==t||"object"!=typeof t)return t;var e=t,i=u.call(t);if("[object Array]"===i){if(!$(t)){e=[];for(var n=0,o=t.length;n>1)%2;s.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",n[l]+":0",o[u]+":0",n[1-l]+":auto",o[1-u]+":auto",""].join("!important;"),t.appendChild(r),i.push(r)}return i}(e,a),a,o);if(r)return r(t,i,n),!0}return!1}function zt(t){return"CANVAS"===t.nodeName.toUpperCase()}var Bt="undefined"!=typeof window&&!!window.addEventListener,Vt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Gt=[];function Ft(t,e,i,n){return i=i||{},n||!v.canvasSupported?Wt(t,e,i):v.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(i.zrX=e.layerX,i.zrY=e.layerY):null!=e.offsetX?(i.zrX=e.offsetX,i.zrY=e.offsetY):Wt(t,e,i),i}function Wt(t,e,i){if(v.domSupported&&t.getBoundingClientRect){var n=e.clientX,o=e.clientY;if(zt(t)){var a=t.getBoundingClientRect();return i.zrX=n-a.left,void(i.zrY=o-a.top)}if(Rt(Gt,t,n,o))return i.zrX=Gt[0],void(i.zrY=Gt[1])}i.zrX=i.zrY=0}function Ht(t){return t||window.event}function Zt(t,e,i){if(null!=(e=Ht(e)).zrX)return e;var n=e.type;if(n&&0<=n.indexOf("touch")){var o="touchend"!==n?e.targetTouches[0]:e.changedTouches[0];o&&Ft(t,o,e,i)}else Ft(t,e,e,i),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var a=e.button;return null==e.which&&void 0!==a&&Vt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function Ut(t,e,i,n){Bt?t.addEventListener(e,i,n):t.attachEvent("on"+e,i)}var Xt=Bt?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};function Yt(t){return 2===t.which||3===t.which}function jt(){this._track=[]}function qt(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}jt.prototype={constructor:jt,recognize:function(t,e,i){return this._doTrack(t,e,i),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,i){var n=t.touches;if(n){for(var o={points:[],touches:[],target:e,event:t},a=0,r=n.length;an.getWidth()||i<0||i>n.getHeight()}te.prototype={constructor:te,setHandlerProxy:function(e){this.proxy&&this.proxy.dispose(),e&&(E(ee,function(t){e.on&&e.on(t,this[t],this)},this),e.handler=this),this.proxy=e},mousemove:function(t){var e=t.zrX,i=t.zrY,n=ne(this,e,i),o=this._hovered,a=o.target;a&&!a.__zr&&(a=(o=this.findHover(o.x,o.y)).target);var r=this._hovered=n?{x:e,y:i}:this.findHover(e,i),s=r.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),a&&s!==a&&this.dispatchToElement(o,"mouseout",t),this.dispatchToElement(r,"mousemove",t),s&&s!==a&&this.dispatchToElement(r,"mouseover",t)},mouseout:function(t){var e=t.zrEventControl,i=t.zrIsToLocalDOM;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&(i||this.trigger("globalout",{type:"globalout",event:t}))},resize:function(t){this._hovered={}},dispatch:function(t,e){var i=this[t];i&&i.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,i){var n=(t=t||{}).target;if(!n||!n.silent){for(var o="on"+e,a=function(t,e,i){return{type:t,event:i,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:i.zrX,offsetY:i.zrY,gestureEvent:i.gestureEvent,pinchX:i.pinchX,pinchY:i.pinchY,pinchScale:i.pinchScale,wheelDelta:i.zrDelta,zrByTouch:i.zrByTouch,which:i.which,stop:Jt}}(e,t,i);n&&(n[o]&&(a.cancelBubble=n[o].call(n,a)),n.trigger(e,a),n=n.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[o]&&t[o].call(t,a),t.trigger&&t.trigger(e,a)}))}},findHover:function(t,e,i){for(var n=this.storage.getDisplayList(),o={x:t,y:e},a=n.length-1;0<=a;a--){var r;if(n[a]!==i&&!n[a].ignore&&(r=ie(n[a],t,e))&&(o.topTarget||(o.topTarget=n[a]),r!==$t)){o.target=n[a];break}}return o},processGesture:function(t,e){this._gestureMgr||(this._gestureMgr=new jt);var i=this._gestureMgr;"start"===e&&i.clear();var n=i.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&i.clear(),n){var o=n.type;t.gestureEvent=o,this.dispatchToElement({target:n.target},o,n.event)}}},E(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(r){te.prototype[r]=function(t){var e,i,n=t.zrX,o=t.zrY,a=ne(this,n,o);if("mouseup"===r&&a||(i=(e=this.findHover(n,o)).target),"mousedown"===r)this._downEl=i,this._downPoint=[t.zrX,t.zrY],this._upEl=i;else if("mouseup"===r)this._upEl=i;else if("click"===r){if(this._downEl!==this._upEl||!this._downPoint||4=this._maxSize&&0>4|(3840&n)>>8,240&n|(240&n)>>4,15&n|(15&n)<<4,1),Ge(t,e),e):void Re(e,0,0,0,1):7===o.length?0<=(n=parseInt(o.substr(1),16))&&n<=16777215?(Re(e,(16711680&n)>>16,(65280&n)>>8,255&n,1),Ge(t,e),e):void Re(e,0,0,0,1):void 0;var a=o.indexOf("("),r=o.indexOf(")");if(-1!==a&&r+1===o.length){var s=o.substr(0,a),l=o.substr(a+1,r-(a+1)).split(","),u=1;switch(s){case"rgba":if(4!==l.length)return void Re(e,0,0,0,1);u=Ne(l.pop());case"rgb":return 3!==l.length?void Re(e,0,0,0,1):(Re(e,Pe(l[0]),Pe(l[1]),Pe(l[2]),u),Ge(t,e),e);case"hsla":return 4!==l.length?void Re(e,0,0,0,1):(l[3]=Ne(l[3]),We(l,e),Ge(t,e),e);case"hsl":return 3!==l.length?void Re(e,0,0,0,1):(We(l,e),Ge(t,e),e);default:return}}Re(e,0,0,0,1)}}function We(t,e){var i=(parseFloat(t[0])%360+360)%360/360,n=Ne(t[1]),o=Ne(t[2]),a=o<=.5?o*(n+1):o+n-o*n,r=2*o-a;return Re(e=e||[],Le(255*Oe(r,a,i+1/3)),Le(255*Oe(r,a,i)),Le(255*Oe(r,a,i-1/3)),1),4===t.length&&(e[3]=t[3]),e}function He(t,e){var i=Fe(t);if(i){for(var n=0;n<3;n++)i[n]=e<0?i[n]*(1-e)|0:(255-i[n])*e+i[n]|0,255e);i++);i=Math.min(i-1,u-2)}C=e;var n=g[(D=i)+1]-g[i];if(0!=n)if(S=(e-g[i])/n,l)if(I=m[i],M=m[0===i?i:i-1],T=m[u-2=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new Di(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},Di.create=function(t){return new Di(t.x,t.y,t.width,t.height)};var Ci=function(t){for(var e in t=t||{},_i.call(this,t),t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};Ci.prototype={constructor:Ci,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,i=0;i>>1])<0?l=a:s=1+a;var u=n-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;0>>1);0>>1);a(t,e[i+h])<0?l=h:r=h+1}return l}function Ri(p,g){var r,s,m=ki,l=0,v=[];function e(t){var e=r[t],i=s[t],n=r[t+1],o=s[t+1];s[t]=i+o,t===l-3&&(r[t+1]=r[t+2],s[t+1]=s[t+2]),l--;var a=Ei(p[n],p,e,i,0,g);e+=a,0!==(i-=a)&&0!==(o=Oi(p[e+i-1],p,n,o,o-1,g))&&(i<=o?function(t,e,i,n){var o=0;for(o=0;os[t+1])break;e(t)}},this.forceMergeRuns=function(){for(;1>=1;return t+e}(o);do{if((a=Pi(t,i,n,e))=e.maxIterations){t+=e.ellipsis;break}var s=0===r?bn(t,o,e.ascCharWidth,e.cnCharWidth):0f)return{lines:[],width:0,height:0};C.textWidth=pn(C.text,w);var S=x.textWidth,M=null==S||"auto"===S;if("string"==typeof S&&"%"===S.charAt(S.length-1))C.percentWidth=S,u.push(C),S=0;else{if(M){S=C.textWidth;var I=x.textBackgroundColor,T=I&&I.image;T&&sn(T=on(T))&&(S=Math.max(S,T.width*b/T.height))}var A=_?_[1]+_[3]:0;S+=A;var D=null!=d?d-v:null;null!=D&&Dn[0]){for(r=0;rt);r++);a=i[n[r]]}if(n.splice(r+1,0,t),!(i[t]=e).virtual)if(a){var l=a.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)}else vi("Layer of zlevel "+t+" is not valid")},eachLayer:function(t,e){var i,n,o=this._zlevelList;for(n=0;n=a.length&&a.push({option:t})}}),a}function Zo(t){var r=Q();Eo(t,function(t,e){var i=t.exist;i&&r.set(i.id,t)}),Eo(t,function(t,e){var i=t.option;Y(!i||null==i.id||!r.get(i.id)||r.get(i.id)===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&r.set(i.id,t),t.keyInfo||(t.keyInfo={})}),Eo(t,function(t,e){var i=t.exist,n=t.option,o=t.keyInfo;if(Ro(n)){if(o.name=null!=n.name?n.name+"":i?i.name:Bo+e,i)o.id=i.id;else if(null!=n.id)o.id=n.id+"";else for(var a=0;o.id="\0"+o.name+"\0"+a++,r.get(o.id););r.set(o.id,t)}})}function Uo(t){var e=t.name;return!(!e||!e.indexOf(Bo))}function Xo(t){return Ro(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function Yo(e,t){return null!=t.dataIndexInside?t.dataIndexInside:null!=t.dataIndex?O(t.dataIndex)?N(t.dataIndex,function(t){return e.indexOfRawIndex(t)}):e.indexOfRawIndex(t.dataIndex):null!=t.name?O(t.name)?N(t.name,function(t){return e.indexOfName(t)}):e.indexOfName(t.name):void 0}function jo(){var e="__\0ec_inner_"+qo+++"_"+Math.random().toFixed(5);return function(t){return t[e]||(t[e]={})}}var qo=0;function Ko(s,l,u){if(R(l)){var t={};t[l+"Index"]=0,l=t}var e=u&&u.defaultMainType;!e||$o(l,e+"Index")||$o(l,e+"Id")||$o(l,e+"Name")||(l[e+"Index"]=0);var h={};return Eo(l,function(t,e){t=l[e];if("dataIndex"!==e&&"dataIndexInside"!==e){var i=e.match(/^(\w+)(Index|Id|Name)$/)||[],n=i[1],o=(i[2]||"").toLowerCase();if(!(!n||!o||null==t||"index"===o&&"none"===t||u&&u.includeMainTypes&&_(u.includeMainTypes,n)<0)){var a={mainType:n};"index"===o&&"all"===t||(a[o]=t);var r=s.queryComponents(a);h[n+"Models"]=r,h[n+"Model"]=r[0]}}else h[e]=t}),h}function $o(t,e){return t&&t.hasOwnProperty(e)}function Jo(t,e,i){t.setAttribute?t.setAttribute(e,i):t[e]=i}function Qo(t){return"auto"===t?v.domSupported?"html":"richText":t||"html"}function ta(t,i){var n=Q(),o=[];return E(t,function(t){var e=i(t);(n.get(e)||(o.push(e),n.set(e,[]))).push(t)}),{keys:o,buckets:n}}var ea=".",ia="___EC__COMPONENT__CONTAINER___";function na(t){var e={main:"",sub:""};return t&&(t=t.split(ea),e.main=t[0]||"",e.sub=t[1]||""),e}function oa(t){(t.$constructor=t).extend=function(t){function e(){t.$constructor?t.$constructor.apply(this,arguments):i.apply(this,arguments)}var i=this;return k(e.prototype,t),e.extend=this.extend,e.superCall=sa,e.superApply=la,w(e,this),e.superClass=i,e}}var aa=0;function ra(t){var e=["__\0is_clz",aa++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function sa(t,e){var i=U(arguments,2);return this.superClass.prototype[e].apply(t,i)}function la(t,e,i){return this.superClass.prototype[e].apply(t,i)}function ua(i,t){t=t||{};var o={};if(i.registerClass=function(t,e){if(e)if(function(t){Y(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}(e),(e=na(e)).sub){if(e.sub!==ia){(function(t){var e=o[t.main];e&&e[ia]||((e=o[t.main]={})[ia]=!0);return e})(e)[e.sub]=t}}else o[e.main]=t;return t},i.getClass=function(t,e,i){var n=o[t];if(n&&n[ia]&&(n=e?n[e]:null),i&&!n)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return n},i.getClassesByMainType=function(t){t=na(t);var i=[],e=o[t.main];return e&&e[ia]?E(e,function(t,e){e!==ia&&i.push(t)}):i.push(e),i},i.hasClass=function(t){return t=na(t),!!o[t.main]},i.getAllClassMainTypes=function(){var i=[];return E(o,function(t,e){i.push(e)}),i},i.hasSubTypes=function(t){t=na(t);var e=o[t.main];return e&&e[ia]},i.parseClassType=na,t.registerWhenExtend){var n=i.extend;n&&(i.extend=function(t){var e=n.call(this,t);return i.registerClass(e,t.type)})}return i}function ha(s){for(var t=0;tthis._ux||or(e-this._yi)>this._uy||this._len<5;return this.addData(ja.L,t,e),this._ctx&&i&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),i&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,i,n,o,a){return this.addData(ja.C,t,e,i,n,o,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,i,n,o,a):this._ctx.bezierCurveTo(t,e,i,n,o,a)),this._xi=o,this._yi=a,this},quadraticCurveTo:function(t,e,i,n){return this.addData(ja.Q,t,e,i,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,i,n):this._ctx.quadraticCurveTo(t,e,i,n)),this._xi=i,this._yi=n,this},arc:function(t,e,i,n,o,a){return this.addData(ja.A,t,e,i,i,n,o-n,0,a?0:1),this._ctx&&this._ctx.arc(t,e,i,n,o,a),this._xi=er(o)*i+t,this._yi=ir(o)*i+e,this},arcTo:function(t,e,i,n,o){return this._ctx&&this._ctx.arcTo(t,e,i,n,o),this},rect:function(t,e,i,n){return this._ctx&&this._ctx.rect(t,e,i,n),this.addData(ja.R,t,e,i,n),this},closePath:function(){this.addData(ja.Z);var t=this._ctx,e=this._x0,i=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,i),t.closePath()),this._xi=e,this._yi=i,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t;for(var e=this._dashIdx=0,i=0;ie.length&&(this._expandData(),e=this.data);for(var i=0;il||or(r-o)>u||c===h-1)&&(t.lineTo(a,r),n=a,o=r);break;case ja.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),n=s[c-2],o=s[c-1];break;case ja.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),n=s[c-2],o=s[c-1];break;case ja.A:var f=s[c++],p=s[c++],g=s[c++],m=s[c++],v=s[c++],y=s[c++],x=s[c++],_=s[c++],w=m=yr[n=0]+t&&r<=yr[1]+t?h:0}if(a){l=n;n=cr(o),o=cr(l)}else n=cr(n),o=cr(o);oMath.PI/2&&p<1.5*Math.PI&&(h=-h),c+=h)}}return c}function Sr(t,e,i,n,o){for(var a=0,r=0,s=0,l=0,u=0,h=0;hMath.abs(a[1])?0=e[1])return i[1]}else{if(t>=e[0])return i[0];if(t<=e[1])return i[1]}else{if(t===e[0])return i[0];if(t===e[1])return i[1]}return(t-e[0])/o*a+i[0]}function Rl(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?function(t){return t.replace(/^\s+|\s+$/g,"")}(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function zl(t,e,i){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),i?t:+t}function Bl(t){return t.sort(function(t,e){return t-e}),t}function Vl(t){if(t=+t,isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}function Gl(t){var e=t.toString(),i=e.indexOf("e");if(0h&&(h=u[d],c=d);++s[c],u[c]=0,++l}return s[e]/o}var Hl=9007199254740991;function Zl(t){var e=2*Math.PI;return(t%e+e)%e}function Ul(t){return-Ol"'])/g,ou={"&":"&","<":"<",">":">",'"':""","'":"'"};function au(t){return null==t?"":(t+"").replace(nu,function(t,e){return ou[e]})}function ru(t,e){return"{"+t+(null==e?"":e)+"}"}var su=["a","b","c","d","e","f","g"];function lu(t,e,i){O(e)||(e=[e]);var n=e.length;if(!n)return"";for(var o=e[0].$vars||[],a=0;a':'':{renderMode:o,content:"{marker"+a+"|} ",style:{color:i}}:""}function cu(t,e){return"0000".substr(0,e-(t+="").length)+t}function du(t,e,i){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var n=Yl(e),o=i?"UTC":"",a=n["get"+o+"FullYear"](),r=n["get"+o+"Month"]()+1,s=n["get"+o+"Date"](),l=n["get"+o+"Hours"](),u=n["get"+o+"Minutes"](),h=n["get"+o+"Seconds"](),c=n["get"+o+"Milliseconds"]();return t=t.replace("MM",cu(r,2)).replace("M",r).replace("yyyy",a).replace("yy",a%100).replace("dd",cu(s,2)).replace("d",s).replace("hh",cu(l,2)).replace("h",l).replace("mm",cu(u,2)).replace("m",u).replace("ss",cu(h,2)).replace("s",h).replace("SSS",cu(c,3))}function fu(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t}var pu=xn;var gu=(Object.freeze||Object)({addCommas:tu,toCamelCase:eu,normalizeCssArray:iu,encodeHTML:au,formatTpl:lu,formatTplSimple:uu,getTooltipMarker:hu,formatTime:du,capitalFirst:fu,truncateText:pu,getTextBoundingRect:function(t){return gn(t.text,t.font,t.textAlign,t.textVerticalAlign,t.textPadding,t.textLineHeight,t.rich,t.truncate)},getTextRect:function(t,e,i,n,o,a,r,s){return gn(t,e,i,n,o,s,a,r)}}),mu=E,vu=["left","right","top","bottom","width","height"],yu=[["width","left","right"],["height","top","bottom"]];function xu(h,c,d,f,p){var g=0,m=0;null==f&&(f=1/0),null==p&&(p=1/0);var v=0;c.eachChild(function(t,e){var i,n,o=t.position,a=t.getBoundingRect(),r=c.childAt(e+1),s=r&&r.getBoundingRect();if("horizontal"===h){var l=a.width+(s?-s.x+a.x:0);v=f<(i=g+l)||t.newline?(g=0,i=l,m+=v+d,a.height):Math.max(v,a.height)}else{var u=a.height+(s?-s.y+a.y:0);v=p<(n=m+u)||t.newline?(g+=v+d,m=0,n=u,a.width):Math.max(v,a.width)}t.newline||(o[0]=g,o[1]=m,"horizontal"===h?g=i+d:m=n+d)})}var _u=xu;T(xu,"vertical"),T(xu,"horizontal");function wu(t,e,i){i=iu(i||0);var n=e.width,o=e.height,a=Rl(t.left,n),r=Rl(t.top,o),s=Rl(t.right,n),l=Rl(t.bottom,o),u=Rl(t.width,n),h=Rl(t.height,o),c=i[2]+i[0],d=i[1]+i[3],f=t.aspect;switch(isNaN(u)&&(u=n-s-d-a),isNaN(h)&&(h=o-l-c-r),null!=f&&(isNaN(u)&&isNaN(h)&&(n/oe)return t[n];return t[i-1]}(s,i):r;if((l=l||r)&&l.length){var u=l[o];return t&&(a[t]=u),n.colorIdx=(o+1)%l.length,u}}},Ru="original",zu="arrayRows",Bu="objectRows",Vu="keyedColumns",Gu="unknown",Fu="typedArray",Wu="column",Hu="row";function Zu(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===Vu?{}:[]),this.sourceFormat=t.sourceFormat||Gu,this.seriesLayoutBy=t.seriesLayoutBy||Wu,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&Q(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}Zu.seriesDataToSource=function(t){return new Zu({data:t,sourceFormat:V(t)?Fu:Ru,fromDataset:!1})},ra(Zu);var Uu={Must:1,Might:2,Not:3},Xu=jo();function Yu(t){var e=t.option,i=e.data,n=V(i)?Fu:Ru,o=!1,a=e.seriesLayoutBy,r=e.sourceHeader,s=e.dimensions,l=Ju(t);if(l){var u=l.option;i=u.source,n=Xu(l).sourceFormat,o=!0,a=a||u.seriesLayoutBy,null==r&&(r=u.sourceHeader),s=s||u.dimensions}var h=function(t,e,i,n,o){if(!t)return{dimensionsDefine:ju(o)};var a,r;if(e===zu)"auto"===n||null==n?qu(function(t){null!=t&&"-"!==t&&(R(t)?null==r&&(r=1):r=0)},i,t,10):r=n?1:0,o||1!==r||(o=[],qu(function(t,e){o[e]=null!=t?t:""},i,t)),a=o?o.length:i===Hu?t.length:t[0]?t[0].length:null;else if(e===Bu)o=o||function(t){var e,i=0;for(;i":"\n",f="richText"===c,p={},g=0;function i(t){return{renderMode:c,content:au(tu(t)),style:p}}var m=this.getData(),a=m.mapDimension("defaultedTooltip",!0),n=a.length,r=this.getRawValue(o),s=O(r),v=m.getItemVisual(o,"color");z(v)&&v.colorStops&&(v=(v.colorStops[0]||{}).color),v=v||"transparent";var l=(1":"",n=i+u.join(i||", ");return{renderMode:c,content:n,style:p}}(r):i(n?Wh(m,o,a[0]):s?r[0]:r)).content,u=d.seriesIndex+"at"+g,y=hu({color:v,type:"item",renderMode:c,markerId:u});p[u]=v,++g;var x=m.getName(o),_=this.name;Uo(this)||(_=""),_=_?au(_)+(h?": ":e):"";var w="string"==typeof y?y:y.content;return{html:h?w+_+l:_+w+(x?au(x)+": "+l:l),markers:p}},isAnimationEnabled:function(){if(v.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,i){var n=this.ecModel,o=Eu.getColorFromPalette.call(this,t,e,i);return o=o||n.getColorFromPalette(t,e,i)},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});function sc(t){var e=t.name;Uo(t)||(t.name=function(t){var i=t.getRawData(),e=i.mapDimension("seriesName",!0),n=[];return E(e,function(t){var e=i.getDimensionInfo(t);e.displayName&&n.push(e.displayName)}),n.join(" ")}(t)||e)}function lc(t){return t.model.getRawData().count()}function uc(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),hc}function hc(t,e){t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function cc(e,i){E(e.CHANGABLE_METHODS,function(t){e.wrapMethod(t,T(dc,i))})}function dc(t){var e=fc(t);e&&e.setOutputEnd(this.count())}function fc(t){var e=(t.ecModel||{}).scheduler,i=e&&e.getPipeline(t.uid);if(i){var n=i.currentTask;if(n){var o=n.agentStubMap;o&&(n=o.get(t.uid))}return n}}b(rc,Uh),b(rc,Eu);var pc=function(){this.group=new Ci,this.uid=Nl("viewComponent")};pc.prototype={constructor:pc,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){},filterForExposedEvent:null};var gc=pc.prototype;gc.updateView=gc.updateLayout=gc.updateVisual=function(t,e,i,n){},oa(pc),ua(pc,{registerWhenExtend:!0});function mc(){var s=jo();return function(t){var e=s(t),i=t.pipelineContext,n=e.large,o=e.progressiveRender,a=e.large=i&&i.large,r=e.progressiveRender=i&&i.progressiveRender;return!!(n^a||o^r)&&"reset"}}var vc=jo(),yc=mc();function xc(){this.group=new Ci,this.uid=Nl("viewChart"),this.renderTask=Xh({plan:Sc,reset:Mc}),this.renderTask.context={view:this}}var _c=xc.prototype={type:"chart",init:function(t,e){},render:function(t,e,i,n){},highlight:function(t,e,i,n){bc(t.getData(),n,"emphasis")},downplay:function(t,e,i,n){bc(t.getData(),n,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null,filterForExposedEvent:null};function wc(t,e,i){if(t&&(t.trigger(e,i),t.isGroup&&!Qs(t)))for(var n=0,o=t.childCount();nc?i+=p(g("data.partialData"),{displayCnt:c}):i+=g("data.allData");for(var r=[],s=0;si.blockIndex?i.step:null,a=n&&n.modDataCount;return{step:o,modBy:null!=a?Math.ceil(a/o):null,modDataCount:a}}},zc.getPipeline=function(t){return this._pipelineMap.get(t)},zc.updateStreamModes=function(t,e){var i=this._pipelineMap.get(t.uid),n=t.getData().count(),o=i.progressiveEnabled&&e.incrementalPrepareRender&&n>=i.threshold,a=t.get("large")&&n>=t.get("largeThreshold"),r="mod"===t.get("progressiveChunkMode")?n:null;t.pipelineContext=i.context={progressiveRender:o,modDataCount:r,large:a}},zc.restorePipelines=function(t){var n=this,o=n._pipelineMap=Q();t.eachSeries(function(t){var e=t.getProgressive(),i=t.uid;o.set(i,{id:i,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:e&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(e||700),count:0}),qc(n,t,t.dataTask)})},zc.prepareStageTasks=function(){var i=this._stageTaskMap,n=this.ecInstance.getModel(),o=this.api;E(this._allHandlers,function(t){var e=i.get(t.uid)||i.set(t.uid,[]);t.reset&&function(n,o,t,a,r){var s=t.seriesTaskMap||(t.seriesTaskMap=Q()),e=o.seriesType,i=o.getTargetSeries;o.createOnAllSeries?a.eachRawSeries(l):e?a.eachRawSeriesByType(e,l):i&&i(a,r).each(l);function l(t){var e=t.uid,i=s.get(e)||s.set(e,Xh({plan:Zc,reset:Uc,count:jc}));i.context={model:t,ecModel:a,api:r,useClearVisual:o.isVisual&&!o.isLayout,plan:o.plan,reset:o.reset,scheduler:n},qc(n,t,i)}var u=n._pipelineMap;s.each(function(t,e){u.get(e)||(t.dispose(),s.removeKey(e))})}(this,t,e,n,o),t.overallReset&&function(n,t,e,i,o){var a=e.overallTask=e.overallTask||Xh({reset:Gc});a.context={ecModel:i,api:o,overallReset:t.overallReset,scheduler:n};var r=a.agentStubMap=a.agentStubMap||Q(),s=t.seriesType,l=t.getTargetSeries,u=!0,h=t.modifyOutputEnd;s?i.eachRawSeriesByType(s,c):l?l(i,o).each(c):(u=!1,E(i.getSeries(),c));function c(t){var e=t.uid,i=r.get(e);i||(i=r.set(e,Xh({reset:Fc,onDirty:Hc})),a.dirty()),i.context={model:t,overallProgress:u,modifyOutputEnd:h},i.agent=a,i.__block=u,qc(n,t,i)}var d=n._pipelineMap;r.each(function(t,e){d.get(e)||(t.dispose(),a.dirty(),r.removeKey(e))})}(this,t,e,n,o)},this)},zc.prepareView=function(t,e,i,n){var o=t.renderTask,a=o.context;a.model=e,a.ecModel=i,a.api=n,o.__block=!t.incrementalPrepareRender,qc(this,e,o)},zc.performDataProcessorTasks=function(t,e){Bc(this,this._dataProcessorHandlers,t,e,{block:!0})},zc.performVisualTasks=function(t,e,i){Bc(this,this._visualHandlers,t,e,i)},zc.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},zc.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var Vc=zc.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)};function Gc(t){t.overallReset(t.ecModel,t.api,t.payload)}function Fc(t,e){return t.overallProgress&&Wc}function Wc(){this.agent.dirty(),this.getDownstream().dirty()}function Hc(){this.agent&&this.agent.dirty()}function Zc(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function Uc(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=Vo(t.reset(t.model,t.ecModel,t.api,t.payload));return 1t.get("hoverLayerThreshold")&&!v.node&&t.eachSeries(function(t){if(!t.preventUsingHoverLayer){var e=i._chartsMap[t.__viewId];e.__alive&&e.group.traverse(function(t){t.useHoverLayer=!0})}})}(n,t),Oc(n._zr.dom,t)}function qd(e,i){Id(of,function(t){t(e,i)})}Rd.resize=function(t){if(!this._disposed){this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var i=e.resetOption("media"),n=t&&t.silent;this[Ld]=!0,i&&Vd(this),Bd.update.call(this),this[Ld]=!1,Hd.call(this,n),Zd.call(this,n)}}},Rd.showLoading=function(t,e){if(!this._disposed&&(Ad(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),sf[t])){var i=sf[t](this._api,e),n=this._zr;this._loadingFX=i,n.add(i)}},Rd.hideLoading=function(){this._disposed||(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},Rd.makeActionFromEvent=function(t){var e=k({},t);return e.type=tf[t.type],e},Rd.dispatchAction=function(t,e){this._disposed||(Ad(e)||(e={silent:!!e}),Qd[t.type]&&this._model&&(this[Ld]?this._pendingActions.push(t):(Wd.call(this,t,e.silent),e.flush?this._zr.flush(!0):!1!==e.flush&&v.browser.weChat&&this._throttledZrFlush(),Hd.call(this,e.silent),Zd.call(this,e.silent))))},Rd.appendData=function(t){if(!this._disposed){var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0}},Rd.on=Nd("on",!1),Rd.off=Nd("off",!1),Rd.one=Nd("one",!1);var Kd=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];function $d(t,e){var i=t.get("z"),n=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=n&&(t.zlevel=n))})}function Jd(){this.eventInfo}Rd._initEvents=function(){Id(Kd,function(u){function t(t){var e,i=this.getModel(),n=t.target;if("globalout"===u)e={};else if(n&&null!=n.dataIndex){var o=n.dataModel||i.getSeriesByIndex(n.seriesIndex);e=o&&o.getDataParams(n.dataIndex,n.dataType,n)||{}}else n&&n.eventData&&(e=k({},n.eventData));if(e){var a=e.componentType,r=e.componentIndex;"markLine"!==a&&"markPoint"!==a&&"markArea"!==a||(a="series",r=e.seriesIndex);var s=a&&null!=r&&i.getComponent(a,r),l=s&&this["series"===s.mainType?"_chartsMap":"_componentsMap"][s.__viewId];e.event=t,e.type=u,this._ecEventProcessor.eventInfo={targetEl:n,packedEvent:e,model:s,view:l},this.trigger(u,e)}}t.zrEventfulCallAtLast=!0,this._zr.on(u,t,this)},this),Id(tf,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},Rd.isDisposed=function(){return this._disposed},Rd.clear=function(){this._disposed||this.setOption({series:[]},!0)},Rd.dispose=function(){if(!this._disposed){this._disposed=!0,Jo(this.getDom(),df,"");var e=this._api,i=this._model;Id(this._componentsViews,function(t){t.dispose(i,e)}),Id(this._chartsViews,function(t){t.dispose(i,e)}),this._zr.dispose(),delete lf[this.id]}},b(Ed,Ct),Jd.prototype={constructor:Jd,normalizeQuery:function(t){var s={},l={},u={};if(R(t)){var e=Dd(t);s.mainType=e.main||null,s.subType=e.sub||null}else{var h=["Index","Name","Id"],c={name:1,dataIndex:1,dataType:1};E(t,function(t,e){for(var i=!1,n=0;nx[1]&&(x[1]=y)}e&&(this._nameList[d]=e[f])}this._rawCount=this._count=l,this._extent={},qf(this)},Yf._initDataFromProvider=function(t,e){if(!(e<=t)){for(var i,n=this._chunkSize,o=this._rawData,a=this._storage,r=this.dimensions,s=r.length,l=this._dimensionInfos,u=this._nameList,h=this._idList,c=this._rawExtent,d=this._nameRepeatCount={},f=this._chunkCount,p=0;pM[1]&&(M[1]=S)}if(!o.pure){var I=u[v];if(m&&null==I)if(null!=m.name)u[v]=I=m.name;else if(null!=i){var T=r[i],A=a[T][y];if(A){I=A[x];var D=l[T].ordinalMeta;D&&D.categories.length&&(I=D.categories[I])}}var C=null==m?null:m.id;null==C&&null!=I&&(d[I]=d[I]||0,0=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,i=e[t];if(null!=i&&it))return a;o=a-1}}return-1},Yf.indicesOfNearest=function(t,e,i){var n=[];if(!this._storage[t])return n;null==i&&(i=1/0);for(var o=1/0,a=-1,r=0,s=0,l=this.count();st[I][1])&&(M=!1)}M&&(a[r++]=this.getRawIndex(m))}return rw[1]&&(w[1]=_)}}}return o},Yf.downSample=function(t,e,i,n){for(var o=ep(this,[t]),a=o._storage,r=[],s=Math.floor(1/e),l=a[t],u=this.count(),h=this._chunkSize,c=o._rawExtent[t],d=new(Wf(this))(u),f=0,p=0;pc[1]&&(c[1]=x),d[f++]=_}return o._count=f,o._indices=d,o.getRawIndex=Jf,o},Yf.getItemModel=function(t){var e=this.hostModel;return new Cl(this.getRawDataItem(t),e,e&&e.ecModel)},Yf.diff=function(e){var i=this;return new Lf(e?e.getIndices():[],this.getIndices(),function(t){return Qf(e,t)},function(t){return Qf(i,t)})},Yf.getVisual=function(t){var e=this._visual;return e&&e[t]},Yf.setVisual=function(t,e){if(Rf(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},Yf.setLayout=function(t,e){if(Rf(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},Yf.getLayout=function(t){return this._layout[t]},Yf.getItemLayout=function(t){return this._itemLayouts[t]},Yf.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?k(this._itemLayouts[t]||{},e):e},Yf.clearItemLayouts=function(){this._itemLayouts.length=0},Yf.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],o=n&&n[e];return null!=o||i?o:this.getVisual(e)},Yf.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{},o=this.hasItemVisual;if(this._itemVisuals[t]=n,Rf(e))for(var a in e)e.hasOwnProperty(a)&&(n[a]=e[a],o[a]=!0);else n[e]=i,o[e]=!0},Yf.clearAllVisual=function(){this._visual={},this._itemVisuals=[],this.hasItemVisual={}};function op(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType}function ap(t,e,i){Zu.isInstance(e)||(e=Zu.seriesDataToSource(e)),i=i||{},t=(t||[]).slice();for(var n=(i.dimsDef||[]).slice(),o=Q(),a=Q(),l=[],r=function(t,e,i,n){var o=Math.max(t.dimensionsDetectCount||1,e.length,i.length,n||0);return E(e,function(t){var e=t.dimsDef;e&&(o=Math.max(o,e.length))}),o}(e,t,n,i.dimCount),s=0;s=e[0]&&t<=e[1]},gp.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},gp.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},gp.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1])},gp.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},gp.prototype.getExtent=function(){return this._extent.slice()},gp.prototype.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},gp.prototype.isBlank=function(){return this._isBlank},gp.prototype.setBlank=function(t){this._isBlank=t},gp.prototype.getLabel=null,oa(gp),ua(gp,{registerWhenExtend:!0}),mp.createByAxisModel=function(t){var e=t.option,i=e.data,n=i&&N(i,xp);return new mp({categories:n,needCollect:!n,deduplication:!1!==e.dedplication})};var vp=mp.prototype;function yp(t){return t._map||(t._map=Q(t.categories))}function xp(t){return z(t)&&null!=t.value?t.value:t+""}vp.getOrdinal=function(t){return yp(this).get(t)},vp.parseAndCollect=function(t){var e,i=this._needCollect;if("string"!=typeof t&&!i)return t;if(i&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var n=yp(this);return null==(e=n.get(t))&&(i?(e=this.categories.length,this.categories[e]=t,n.set(t,e)):e=NaN),e};var _p=gp.prototype,wp=gp.extend({type:"ordinal",init:function(t,e){t&&!O(t)||(t=new mp({categories:t})),this._ordinalMeta=t,this._extent=e||[0,t.categories.length-1]},parse:function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},contain:function(t){return t=this.parse(t),_p.contain.call(this,t)&&null!=this._ordinalMeta.categories[t]},normalize:function(t){return _p.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(_p.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){if(!this.isBlank())return this._ordinalMeta.categories[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},getOrdinalMeta:function(){return this._ordinalMeta},niceTicks:et,niceExtent:et});wp.create=function(){return new wp};var bp=zl;function Sp(t){return Gl(t)+2}function Mp(t,e,i){t[e]=Math.max(Math.min(t[e],i[1]),i[0])}function Ip(t,e){isFinite(t[0])||(t[0]=e[0]),isFinite(t[1])||(t[1]=e[1]),Mp(t,0,e),Mp(t,1,e),t[0]>t[1]&&(t[0]=t[1])}var Tp=zl,Ap=gp.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),Ap.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=Sp(t)},getTicks:function(t){var e=this._interval,i=this._extent,n=this._niceExtent,o=this._intervalPrecision,a=[];if(!e)return a;i[0]s&&(t?a.push(Tp(s+e,o)):a.push(i[1])),a},getMinorTicks:function(t){for(var e=this.getTicks(!0),i=[],n=this.getExtent(),o=1;on[0]&&h>>1;t[o][1]>1^-(1&s),l=l>>1^-(1&l),o=s+=o,a=l+=a,n.push([s/i,l/i])}return n}Tg.prototype={constructor:Tg,properties:null,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,i=[e,e],n=[-e,-e],o=[],a=[],r=this.geometries,s=0;ss[1];d(e[0].coord,s[0])&&(n?e[0].coord=s[0]:e.shift());n&&d(s[0],e[0].coord)&&e.unshift({coord:s[0]});d(s[1],a.coord)&&(n?a.coord=s[1]:e.pop());n&&d(a.coord,s[1])&&e.push({coord:s[1]});function d(t,e){return t=zl(t),e=zl(e),c?en[0]&&(n[0]=a[0]),a[1]>n[1]&&(n[1]=a[1])}return{min:e?i:n,max:e?n:i}}var ym=Ar.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},brush:Xr(Ar.prototype.brush),buildPath:function(t,e){var i=e.points,n=0,o=i.length,a=vm(i,e.smoothConstraint);if(e.connectNulls){for(;0n)return!1;return!0}(a,e))){var r=e.mapDimension(a.dim),s={};return E(a.getViewLabels(),function(t){s[t.tickValue]=1}),function(t){return!s.hasOwnProperty(e.get(r,t))}}}}function Am(t,e,i){if("cartesian2d"!==t.type)return wm(t,e,i);var n=t.getBaseAxis().isHorizontal(),o=_m(t,e,i);if(!i.get("clip",!0)){var a=o.shape,r=Math.max(a.width,a.height);n?(a.y-=r,a.height+=2*r):(a.x-=r,a.width+=2*r)}return o}xc.extend({type:"line",init:function(){var t=new Ci,e=new em;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var n=t.coordinateSystem,o=this.group,a=t.getData(),r=t.getModel("lineStyle"),s=t.getModel("areaStyle"),l=a.mapArray(a.getItemLayout),u="polar"===n.type,h=this._coordSys,c=this._symbolDraw,d=this._polyline,f=this._polygon,p=this._lineGroup,g=t.get("animation"),m=!s.isEmpty(),v=s.get("origin"),y=function(t,e,i){if(!i.valueDim)return[];for(var n=[],o=0,a=e.count();oh[c-1].coord&&(h.reverse(),d.reverse());var f=h[0].coord-10,p=h[c-1].coord+10,g=p-f;if(g<.001)return"transparent";E(h,function(t){t.offset=(t.coord-f)/g}),h.push({offset:c?h[c-1].offset:.5,color:d[1]||"transparent"}),h.unshift({offset:c?h[0].offset:.5,color:d[0]||"transparent"});var m=new gs(0,0,0,0,h,!0);return m[n]=f,m[n+"2"]=p,m}}}(a,n)||a.getVisual("color");d.useStyle(D(r.getLineStyle(),{fill:"none",stroke:M,lineJoin:"bevel"}));var I=t.get("smooth");if(I=Mm(t.get("smooth")),d.setShape({smooth:I,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),f){var T=a.getCalculationInfo("stackedOnSeries"),A=0;f.useStyle(D(s.getAreaStyle(),{fill:M,opacity:.7,lineJoin:"bevel"})),T&&(A=Mm(T.get("smooth"))),f.setShape({smooth:I,stackedOnSmooth:A,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=a,this._coordSys=n,this._stackedOnPoints=y,this._points=l,this._step=S,this._valueOrigin=v},dispose:function(){},highlight:function(t,e,i,n){var o=t.getData(),a=Yo(o,n);if(!(a instanceof Array)&&null!=a&&0<=a){var r=o.getItemGraphicEl(a);if(!r){var s=o.getItemLayout(a);if(!s)return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(s[0],s[1]))return;(r=new Ug(o,a)).position=s,r.setZ(t.get("zlevel"),t.get("z")),r.ignore=isNaN(s[0])||isNaN(s[1]),r.__temp=!0,o.setItemGraphicEl(a,r),r.stopSymbolAnimation(!0),this.group.add(r)}r.highlight()}else xc.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var o=t.getData(),a=Yo(o,n);if(null!=a&&0<=a){var r=o.getItemGraphicEl(a);r&&(r.__temp?(o.setItemGraphicEl(a,null),this.group.remove(r)):r.downplay())}else xc.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new ym({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new xm({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i},_updateAnimation:function(t,e,i,n,o,a){var r=this._polyline,s=this._polygon,l=t.hostModel,u=function(t,e,i,n,o,a,r,s){for(var l=function(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+",idx:t})}).update(function(t,e){i.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){i.push({cmd:"-",idx:t})}).execute(),i}(t,e),u=[],h=[],c=[],d=[],f=[],p=[],g=[],m=rm(o,e,r),v=rm(a,t,s),y=0;ye&&(e=t[i]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,i=0;ie[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},w(Em,Vg);var Rm={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},zm={};zm.categoryAxis=m({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},Rm),zm.valueAxis=m({boundaryGap:[0,0],splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#eee",width:1}}},Rm),zm.timeAxis=D({scale:!0,min:"dataMin",max:"dataMax"},zm.valueAxis),zm.logAxis=D({scale:!0,logBase:10},zm.valueAxis);function Bm(a,t,r,e){E(Vm,function(o){t.extend({type:a+"Axis."+o,mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,n=i?Mu(t):{};m(t,e.getTheme().get(o+"Axis")),m(t,this.getDefaultOption()),t.type=r(a,t),i&&Su(t,n,i)},optionUpdated:function(){"category"===this.option.type&&(this.__ordinalMeta=mp.createByAxisModel(this))},getCategories:function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:p([{},zm[o+"Axis"],e],!0)})}),Lu.registerSubTypeDefaulter(a+"Axis",T(r,a))}var Vm=["value","category","time","log"],Gm=Lu.extend({type:"cartesian2dAxis",axis:null,init:function(){Gm.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){Gm.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){Gm.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});function Fm(t,e){return e.type||(e.data?"category":"value")}m(Gm.prototype,cg);var Wm={offset:0};function Hm(t,e){return t.getCoordSysModel()===e}function Zm(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this.model=t}Bm("x",Gm,Fm,Wm),Bm("y",Gm,Fm,Wm),Lu.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});var Um=Zm.prototype;function Xm(t,e,i,n){i.getAxesOnZeroOf=function(){return o?[o]:[]};var o,a=t[e],r=i.model,s=r.get("axisLine.onZero"),l=r.get("axisLine.onZeroAxisIndex");if(s){if(null!=l)Ym(a[l])&&(o=a[l]);else for(var u in a)if(a.hasOwnProperty(u)&&Ym(a[u])&&!n[h(a[u])]){o=a[u];break}o&&(n[h(o)]=!0)}function h(t){return t.dim+"_"+t.index}}function Ym(t){return t&&"category"!==t.type&&"time"!==t.type&&function(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(0u[1]?-1:1,c=["start"===a?u[0]-h*l:"end"===a?u[1]+h*l:(u[0]+u[1])/2,av(a)?t.labelOffset+r*l:0],d=e.get("nameRotate");null!=d&&(d=d*Jm/180),av(a)?n=ev(t.rotation,null!=d?d:t.rotation,r):(n=function(t,e,i,n){var o,a,r=Zl(i-t.rotation),s=n[0]>n[1],l="start"===e&&!s||"start"!==e&&s;o=Ul(r-Jm/2)?(a=l?"bottom":"top","center"):Ul(r-1.5*Jm)?(a=l?"top":"bottom","center"):(a="middle",r<1.5*Jm&&Jm/2l[1]&&l.reverse(),(null==r||r>l[1])&&(r=l[1]),r=i.r0}}});var ey=Math.PI/180;function iy(o,t,e,i,n,a,r,s,l,u){function h(t,e,i){for(var n=t;nl+r);n++)if(o[n].y+=i,to[n].y+o[n].height)return void c(n,i/2);c(e-1,i/2)}function c(t,e){for(var i=t;0<=i&&!(o[i].y-eo[i-1].y+o[i-1].height));i--);}function d(t,e,i,n,o,a){for(var r=e?Number.MAX_VALUE:0,s=0,l=t.length;s=e?v.push(o[y]):m.push(o[y]);d(m,!1,t,e,i,n),d(v,!0,t,e,i,n)}function ny(t){return"center"===t.position}function oy(L,k,P,t,N,e){var O,E,R=L.getData(),z=[],B=!1,V=(L.get("minShowLabelAngle")||0)*ey;R.each(function(t){var e=R.getItemLayout(t),i=R.getItemModel(t),n=i.getModel("label"),o=n.get("position")||i.get("emphasis.label.position"),a=n.get("distanceToLabelLine"),r=n.get("alignTo"),s=Rl(n.get("margin"),P),l=n.get("bleedMargin"),u=n.getFont(),h=i.getModel("labelLine"),c=h.get("length");c=Rl(c,P);var d=h.get("length2");if(d=Rl(d,P),!(e.anglei[0]&&isFinite(h)&&isFinite(i[0]););else{var l=o.getTicks().length-1;c"+N(t,function(t,e){var i=o.get(o.mapDimension(t.dim),n);return au(t.name+" : "+i)}).join("
")},getTooltipPosition:function(t){if(null!=t)for(var e=this.getData(),i=this.coordinateSystem,n=e.getValues(N(i.dimensions,function(t){return e.mapDimension(t)}),t,!0),o=0,a=n.length;o"+au(n+" : "+i)},getTooltipPosition:function(t){if(null!=t){var e=this.getData().getName(t),i=this.coordinateSystem,n=i.getRegion(e);return n&&i.dataToPoint(n.center)}},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},defaultOption:{zlevel:0,z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:.75,showLegendSymbol:!0,dataRangeHoverLink:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}}}}),Xv);var Oy="\0_ec_interaction_mutex";function Ey(t,e){return!!Ry(t)[e]}function Ry(t){return t[Oy]||(t[Oy]={})}function zy(i){this.pointerChecker,this._zr=i,this._opt={};var t=A,n=t(By,this),o=t(Vy,this),a=t(Gy,this),r=t(Fy,this),s=t(Wy,this);Ct.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(t,e){this.disable(),this._opt=D(L(e)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),null==t&&(t=!0),!0!==t&&"move"!==t&&"pan"!==t||(i.on("mousedown",n),i.on("mousemove",o),i.on("mouseup",a)),!0!==t&&"scale"!==t&&"zoom"!==t||(i.on("mousewheel",r),i.on("pinch",s))},this.disable=function(){i.off("mousedown",n),i.off("mousemove",o),i.off("mouseup",a),i.off("mousewheel",r),i.off("pinch",s)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function By(t){if(!(Yt(t)||t.target&&t.target.draggable)){var e=t.offsetX,i=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,i)&&(this._x=e,this._y=i,this._dragging=!0)}}function Vy(t){if(this._dragging&&Uy("moveOnMouseMove",t,this._opt)&&"pinch"!==t.gestureEvent&&!Ey(this._zr,"globalPan")){var e=t.offsetX,i=t.offsetY,n=this._x,o=this._y,a=e-n,r=i-o;this._x=e,this._y=i,this._opt.preventDefaultMouseMove&&Xt(t.event),Zy(this,"pan","moveOnMouseMove",t,{dx:a,dy:r,oldX:n,oldY:o,newX:e,newY:i})}}function Gy(t){Yt(t)||(this._dragging=!1)}function Fy(t){var e=Uy("zoomOnMouseWheel",t,this._opt),i=Uy("moveOnMouseWheel",t,this._opt),n=t.wheelDelta,o=Math.abs(n),a=t.offsetX,r=t.offsetY;if(0!==n&&(e||i)){if(e){var s=3e&&(e=n.height)}this.height=e+1},getNodeById:function(t){if(this.getId()===t)return this;for(var e=0,i=this.children,n=i.length;ea&&(a=t.depth)});var r=t.expandAndCollapse&&0<=t.initialTreeDepth?t.initialTreeDepth:a;return o.root.eachNode("preorder",function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=r}),o.data},getOrient:function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},formatTooltip:function(t){for(var e=this.getData().tree,i=e.root.children[0],n=e.getNodeByDataIndex(t),o=n.getValue(),a=n.name;n&&n!==i;)a=n.parentNode.name+"."+a,n=n.parentNode;return au(a+(isNaN(o)||null==o?"":" : "+o))},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderColor:"#c23531",borderWidth:1.5},label:{show:!0,color:"#555"},leaves:{label:{show:!0}},animationEasing:"linear",animationDuration:700,animationDurationUpdate:1e3}});var Ex=Cs({shape:{parentPoint:[],childPoints:[],orient:"",forkPosition:""},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.childPoints,n=i.length,o=e.parentPoint,a=i[0],r=i[n-1];if(1===n)return t.moveTo(o[0],o[1]),void t.lineTo(a[0],a[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=Rl(e.forkPosition,1),c=[];c[l]=o[l],c[u]=o[u]+(r[u]-o[u])*h,t.moveTo(o[0],o[1]),t.lineTo(c[0],c[1]),t.moveTo(a[0],a[1]),c[l]=a[l],t.lineTo(c[0],c[1]),c[l]=r[l],t.lineTo(c[0],c[1]),t.lineTo(r[0],r[1]);for(var d=1;dx.x)||(m-=Math.PI);var b=v?"left":"right",S=a.labelModel.get("rotate"),M=S*(Math.PI/180);g.setStyle({textPosition:a.labelModel.get("position")||b,textRotation:null==S?-m:M,textOrigin:"center",verticalAlign:"middle"})}!function(t,e,i,n,o,a,r,s,l){var u=l.edgeShape,h=n.__edge;if("curve"===u)e.parentNode&&e.parentNode!==i&&cl(h=h||(n.__edge=new ds({shape:Gx(l,o,o),style:D({opacity:0,strokeNoScale:!0},l.lineStyle)})),{shape:Gx(l,a,r),style:{opacity:1}},t);else if("polyline"===u&&"orthogonal"===l.layout&&e!==i&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var c=e.children,d=[],f=0;fh.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)});var d=u===h?1:r(u,h)/2,f=d-u.getLayout().x,p=0,g=0,m=0,v=0;if("radial"===n)p=o/(h.getLayout().x+d+f),g=a/(c.depth-1||1),Fx(l,function(t){m=(t.getLayout().x+f)*p,v=(t.depth-1)*g;var e=Lx(m,v);t.setLayout({x:e.x,y:e.y,rawX:m,rawY:v},!0)});else{var y=t.getOrient();"RL"===y||"LR"===y?(g=a/(h.getLayout().x+d+f),p=o/(c.depth-1||1),Fx(l,function(t){v=(t.getLayout().x+f)*g,m="LR"===y?(t.depth-1)*p:o-(t.depth-1)*p,t.setLayout({x:m,y:v},!0)})):"TB"!==y&&"BT"!==y||(p=o/(h.getLayout().x+d+f),g=a/(c.depth-1||1),Fx(l,function(t){m=(t.getLayout().x+f)*p,v="TB"===y?(t.depth-1)*g:a-(t.depth-1)*g,t.setLayout({x:m,y:v},!0)}))}}}(t,e)})}),rc.extend({type:"series.treemap",layoutMode:"box",dependencies:["grid","polar"],preventUsingHoverLayer:!0,_viewRoot:null,defaultOption:{progressive:0,left:"center",top:"middle",right:null,bottom:null,width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",borderColor:"rgba(255,255,255,0.7)",borderWidth:1,shadowColor:"rgba(150,150,150,1)",shadowBlur:3,shadowOffsetX:0,shadowOffsetY:0,textStyle:{color:"#fff"}},emphasis:{textStyle:{}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",ellipsis:!0},upperLabel:{show:!1,position:[0,"50%"],height:20,color:"#fff",ellipsis:!0,verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],color:"#fff",ellipsis:!0,verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},getInitialData:function(t,e){var i={name:t.name,children:t.data};!function i(t){var n=0;E(t.children,function(t){i(t);var e=t.value;O(e)&&(e=e[0]),n+=e});var e=t.value;O(e)&&(e=e[0]);null!=e&&!isNaN(e)||(e=n);e<0&&(e=0);O(t.value)?t.value[0]=e:t.value=e}(i);var n=t.levels||[];n=t.levels=function(t,e){var n,i=e.get("color");if(!i)return;if(E(t=t||[],function(t){var e=new Cl(t),i=e.get("color");(e.get("itemStyle.color")||i&&"none"!==i)&&(n=!0)}),!n){(t[0]||(t[0]={})).color=i.slice()}return t}(n,e);var o={};return o.levels=n,Ix.createTree(i,this,o).data},optionUpdated:function(){this.resetViewRoot()},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=O(i)?tu(i[0]):tu(i);return au(e.getName(t)+": "+n)},getDataParams:function(t){var e=rc.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(t);return e.treePathInfo=Ux(i,this),e},setLayoutInfo:function(t){this.layoutInfo=this.layoutInfo||{},k(this.layoutInfo,t)},mapIdToIndex:function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=Q(),this._idIndexMapCount=0);var i=e.get(t);return null==i&&e.set(t,i=this._idIndexMapCount++),i},getViewRoot:function(){return this._viewRoot},resetViewRoot:function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)}});var Xx=5;function Yx(t){this.group=new Ci,t.add(this.group)}function jx(t,e,i,n,o,a){var r=[[o?t:t-Xx,e],[t+i,e],[t+i,e+n],[o?t:t-Xx,e+n]];return a||r.splice(2,0,[t+i+Xx,e+n/2]),o||r.push([t,e+n/2]),r}Yx.prototype={constructor:Yx,render:function(t,e,i,n){var o=t.getModel("breadcrumb"),a=this.group;if(a.removeAll(),o.get("show")&&i){var r=o.getModel("itemStyle"),s=r.getModel("textStyle"),l={pos:{left:o.get("left"),right:o.get("right"),top:o.get("top"),bottom:o.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:o.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(i,l,s),this._renderContent(t,l,r,s,n),bu(a,l.pos,l.box)}},_prepare:function(t,e,i){for(var n=t;n;n=n.parentNode){var o=n.getModel().get("name"),a=i.getTextRect(o),r=Math.max(a.width+16,e.emptyItemWidth);e.totalWidth+=r+8,e.renderList.push({node:n,text:o,width:r})}},_renderContent:function(t,e,i,n,o){for(var a,r,s=0,l=e.emptyItemWidth,u=t.get("breadcrumb.height"),h=function(t,e,i){var n=e.width,o=e.height,a=Rl(t.x,n),r=Rl(t.y,o),s=Rl(t.x2,n),l=Rl(t.y2,o);return(isNaN(a)||isNaN(parseFloat(t.x)))&&(a=0),(isNaN(s)||isNaN(parseFloat(t.x2)))&&(s=n),(isNaN(r)||isNaN(parseFloat(t.y)))&&(r=0),(isNaN(l)||isNaN(parseFloat(t.y2)))&&(l=o),i=iu(i||0),{width:Math.max(s-a-i[1]-i[3],0),height:Math.max(l-r-i[0]-i[2],0)}}(e.pos,e.box),c=e.totalWidth,d=e.renderList,f=d.length-1;0<=f;f--){var p=d[f],g=p.node,m=p.width,v=p.text;c>h.width&&(c-=m-l,m=l,v=null);var y=new Qr({shape:{points:jx(s,0,m,u,f===d.length-1,0===f)},style:D(i.getItemStyle(),{lineJoin:"bevel",text:v,textFill:n.getTextColor(),textFont:n.getFont()}),z:10,onclick:T(o,g)});this.group.add(y),a=t,r=g,y.eventData={componentType:"series",componentSubType:"treemap",componentIndex:a.componentIndex,seriesIndex:a.componentIndex,seriesName:a.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:r&&r.dataIndex,name:r&&r.name},treePathInfo:r&&Ux(r,a)},s+=m+8}},remove:function(){this.group.removeAll()}};function qx(t){var e=a_(t);return e.stroke=e.fill=e.lineWidth=null,e}var Kx=A,$x=Ci,Jx=rs,Qx=E,t_=["label"],e_=["emphasis","label"],i_=["upperLabel"],n_=["emphasis","upperLabel"],o_=10,a_=ha([["fill","color"],["stroke","strokeColor"],["lineWidth","strokeWidth"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);function r_(c,r,s,l,u,e,d,t,i,n){if(d){var f=d.getLayout(),o=c.getData();if(o.setItemGraphicEl(d.dataIndex,null),f&&f.isInView){var h=f.width,p=f.height,g=f.borderWidth,m=f.invisible,v=d.getRawIndex(),y=t&&t.getRawIndex(),a=d.viewChildren,x=f.upperHeight,_=a&&a.length,w=d.getModel("itemStyle"),b=d.getModel("emphasis.itemStyle"),S=C("nodeGroup",$x);if(S){if(i.add(S),S.attr("position",[f.x||0,f.y||0]),S.__tmNodeWidth=h,S.__tmNodeHeight=p,f.isAboveViewRoot)return S;var M=d.getModel(),I=C("background",Jx,n,1);if(I&&function(t,e,i){if(e.dataIndex=d.dataIndex,e.seriesIndex=c.seriesIndex,e.setShape({x:0,y:0,width:h,height:p}),m)A(e);else{e.invisible=!1;var n=d.getVisual("borderColor",!0),o=b.get("borderColor"),a=qx(w);a.fill=n;var r=a_(b);if(r.fill=o,i){var s=h-2*g;D(a,r,n,s,x,{x:g,y:0,width:s,height:x})}else a.text=r.text=null;e.setStyle(a),Us(e,r)}t.add(e)}(S,I,_&&f.upperHeight),_)Qs(S)&&Js(S,!1),I&&(Js(I,!0),o.setItemGraphicEl(d.dataIndex,I));else{var T=C("content",Jx,n,2);T&&function(t,e){e.dataIndex=d.dataIndex,e.seriesIndex=c.seriesIndex;var i=Math.max(h-2*g,0),n=Math.max(p-2*g,0);if(e.culling=!0,e.setShape({x:g,y:g,width:i,height:n}),m)A(e);else{e.invisible=!1;var o=d.getVisual("color",!0),a=qx(w);a.fill=o;var r=a_(b);D(a,r,o,i,n),e.setStyle(a),Us(e,r)}t.add(e)}(S,T),I&&Qs(I)&&Js(I,!1),Js(S,!0),o.setItemGraphicEl(d.dataIndex,S)}return S}}}function A(t){t.invisible||e.push(t)}function D(t,e,i,n,o,a){var r=W(c.getFormattedLabel(d.dataIndex,"normal",null,null,a?"upperLabel":"label"),M.get("name"));if(!a&&f.isLeafRoot){var s=c.get("drillDownIcon",!0);r=s?s+" "+r:r}var l=M.getModel(a?i_:t_),u=M.getModel(a?n_:e_),h=l.getShallow("show");el(t,e,l,u,{defaultText:h?r:null,autoColor:i,isRectText:!0}),a&&(t.textRect=L(a)),t.truncate=h&&l.get("ellipsis")?{outerWidth:n,outerHeight:o,minChar:2}:null}function C(t,e,i,n){var o=null!=y&&s[t][y],a=u[t];return o?(s[t][y]=null,function(t,e,i){(t[v]={}).old="nodeGroup"===i?e.position.slice():k({},e.shape)}(a,o,t)):m||((o=new e({z:function(t,e){var i=t*o_+e;return(i-1)/i}(i,n)})).__tmDepth=i,function(t,e,i){var n=t[v]={},o=d.parentNode;if(o&&(!l||"drillDown"===l.direction)){var a=0,r=0,s=u.background[o.getRawIndex()];!l&&s&&s.old&&(a=s.old.width,r=s.old.height),n.old="nodeGroup"===i?[0,r]:{x:a,y:r,width:0,height:0}}n.fadein="nodeGroup"!==i}(a,0,o.__tmStorageName=t)),r[t][v]=o}}Df({type:"treemap",init:function(t,e){this._containerGroup,this._storage={nodeGroup:[],background:[],content:[]},this._oldTree,this._breadcrumb,this._controller,this._state="ready"},render:function(t,e,i,n){if(!(_(e.findComponents({mainType:"series",subType:"treemap",query:n}),t)<0)){this.seriesModel=t,this.api=i,this.ecModel=e;var o=Wx(n,["treemapZoomToNode","treemapRootToNode"],t),a=n&&n.type,r=t.layoutInfo,s=!this._oldTree,l=this._storage,u="treemapRootToNode"===a&&o&&l?{rootNodeGroup:l.nodeGroup[o.node.getRawIndex()],direction:n.direction}:null,h=this._giveContainerGroup(r),c=this._doRender(h,t,u);s||a&&"treemapZoomToNode"!==a&&"treemapRootToNode"!==a?c.renderFinally():this._doAnimation(h,c,t,u),this._resetController(i),this._renderBreadcrumb(t,i,o)}},_giveContainerGroup:function(t){var e=this._containerGroup;return e||(e=this._containerGroup=new $x,this._initEvents(e),this.group.add(e)),e.attr("position",[t.x,t.y]),e},_doRender:function(t,e,i){var n=e.getData().tree,o=this._oldTree,a={nodeGroup:[],background:[],content:[]},r={nodeGroup:[],background:[],content:[]},s=this._storage,l=[],c=T(r_,e,r,s,i,a,l);!function a(r,s,l,u,h){u?Qx(s=r,function(t,e){t.isRemoved()||i(e,e)}):new Lf(s,r,t,t).add(i).update(i).remove(T(i,null)).execute();function t(t){return t.getId()}function i(t,e){var i=null!=t?r[t]:null,n=null!=e?s[e]:null,o=c(i,n,l,h);o&&a(i&&i.viewChildren||[],n&&n.viewChildren||[],o,u,h+1)}}(n.root?[n.root]:[],o&&o.root?[o.root]:[],t,n===o||!o,0);var u,h,d=(h={nodeGroup:[],background:[],content:[]},(u=s)&&Qx(u,function(t,e){var i=h[e];Qx(t,function(t){t&&(i.push(t),t.__tmWillDelete=1)})}),h);return this._oldTree=n,this._storage=r,{lastsForAnimation:a,willDeleteEls:d,renderFinally:function(){Qx(d,function(t){Qx(t,function(t){t.parent&&t.parent.remove(t)})}),Qx(l,function(t){t.invisible=!0,t.dirty()})}}},_doAnimation:function(t,a,e,s){if(e.get("animation")){var l=e.get("animationDurationUpdate"),u=e.get("animationEasing"),h=function(){var a,r=[],s={};return{add:function(t,e,i,n,o){return R(n)&&(o=n,n=0),!s[t.id]&&(s[t.id]=1,r.push({el:t,target:e,time:i,delay:n,easing:o}),!0)},done:function(t){return a=t,this},start:function(){for(var t=r.length,e=0,i=r.length;e=r.length||t===r[t.depth]){var i=O_(l,c,t,e,y,s);n(t,i,o,a,r,s)}})}else p=L_(c),t.setVisual("color",p)}(a,{},N(o.levelModels,function(t){return t?t.get(A_):null}),r,t.getViewRoot().getAncestors(),t)}};function C_(i,n,o,a){var r=k({},n);return E(["color","colorAlpha","colorSaturation"],function(t){var e=i.get(t,!0);null==e&&o&&(e=o[t]),null==e&&(e=n[t]),null==e&&(e=a.get(t)),null!=e&&(r[t]=e)}),r}function L_(t){var e=k_(t,"color");if(e){var i=k_(t,"colorAlpha"),n=k_(t,"colorSaturation");return n&&(e=qe(e,null,null,n)),i&&(e=Ke(e,i)),e}}function k_(t,e){var i=t[e];if(null!=i&&"none"!==i)return i}function P_(t,e,i,n,o,a){if(a&&a.length){var r=N_(e,"color")||null!=o.color&&"none"!==o.color&&(N_(e,"colorAlpha")||N_(e,"colorSaturation"));if(r){var s=e.get("visualMin"),l=e.get("visualMax"),u=i.dataExtent.slice();null!=s&&su[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:r.name,dataExtent:u,visual:r.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var d=new f_(c);return d.__drColorMappingBy=h,d}}}function N_(t,e){var i=t.get(e);return T_(i)&&i.length?{name:e,range:i}:null}function O_(t,e,i,n,o,a){var r=k({},e);if(o){var s=o.type,l="color"===s&&o.__drColorMappingBy,u="index"===l?n:"id"===l?a.mapIdToIndex(i.getId()):i.getValue(t.get("visualDimension"));r[s]=o.mapValueToVisual(u)}return r}var E_=Math.max,R_=Math.min,z_=W,B_=E,V_=["itemStyle","borderWidth"],G_=["itemStyle","gapWidth"],F_=["upperLabel","show"],W_=["upperLabel","height"],H_={seriesType:"treemap",reset:function(t,e,i,n){var o=i.getWidth(),a=i.getHeight(),r=t.option,s=wu(t.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()}),l=r.size||[],u=Rl(z_(s.width,l[0]),o),h=Rl(z_(s.height,l[1]),a),c=n&&n.type,d=Wx(n,["treemapZoomToNode","treemapRootToNode"],t),f="treemapRender"===c||"treemapMove"===c?n.rootRect:null,p=t.getViewRoot(),g=Hx(p);if("treemapMove"!==c){var m="treemapZoomToNode"===c?function(t,e,i,n,o){var a,r=(e||{}).node,s=[n,o];if(!r||r===i)return s;var l=n*o,u=l*t.option.zoomToNodeRatio;for(;a=r.parentNode;){for(var h=0,c=a.children,d=0,f=c.length;ds[1]&&(s[1]=e)})}else s=[NaN,NaN];return{sum:n,dataExtent:s}}(e,r,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,i,n,o){if(!n)return i;for(var a=t.get("visibleMin"),r=o.length,s=r,l=r-1;0<=l;l--){var u=o["asc"===n?r-l-1:l].getValue();u/i*ei[l[r]])&&(h=i[l[r]]);for(var c=0,d=t.length;c "+d)),u++)}var f,p=i.get("coordinateSystem");if("cartesian2d"===p||"polar"===p)f=pp(t,i);else{var g=sh.get(p),m=g&&"view"!==g.type&&g.dimensions||[];_(m,"value")<0&&m.concat(["value"]);var v=sp(t,{coordDimensions:m});(f=new Xf(v,i)).initData(t)}var y=new Xf(["value"],i);return y.initData(l,s),o&&o(f,y),mx({mainData:f,struct:a,structAttr:"graph",datas:{node:f,edge:y},datasAttr:{node:"data",edge:"edgeData"}}),a.update(),a}var ew=Af({type:"series.graph",init:function(t){ew.superApply(this,"init",arguments);var e=this;function i(){return e._categoriesData}this.legendVisualProvider=new Yv(i,i),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeOption:function(t){ew.superApply(this,"mergeOption",arguments),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeDefaultAndTheme:function(t){ew.superApply(this,"mergeDefaultAndTheme",arguments),Go(t,["edgeLabel"],["show"])},getInitialData:function(t,s){var e=t.edges||t.links||[],i=t.data||t.nodes||[],l=this;if(i&&e)return tw(i,e,this,!0,function(t,e){t.wrapMethod("getItemModel",function(t){var e=l._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t});var i=l.getModel("edgeLabel"),n=new Cl({label:i.option},i.parentModel,s),o=l.getModel("emphasis.edgeLabel"),a=new Cl({emphasis:{label:o.option}},o.parentModel,s);function r(t){return(t=this.parsePath(t))&&"label"===t[0]?n:t&&"emphasis"===t[0]&&"label"===t[1]?a:this.parentModel}e.wrapMethod("getItemModel",function(t){return t.customizeGetParent(r),t})}).data},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},getCategoriesData:function(){return this._categoriesData},formatTooltip:function(t,e,i){if("edge"!==i)return ew.superApply(this,"formatTooltip",arguments);var n=this.getData(),o=this.getDataParams(t,i),a=n.graph.getEdgeByIndex(t),r=n.getName(a.node1.dataIndex),s=n.getName(a.node2.dataIndex),l=[];return null!=r&&l.push(r),null!=s&&l.push(s),l=au(l.join(" > ")),o.value&&(l+=" : "+au(o.value)),l},_updateCategoriesData:function(){var t=N(this.option.categories||[],function(t){return null!=t.value?t:k({value:0},t)}),e=new Xf(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray(function(t){return e.getItemModel(t,!0)})},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},isAnimationEnabled:function(){return ew.superCall(this,"isAnimationEnabled")&&!("force"===this.get("layout")&&this.get("force.layoutAnimation"))},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",legendHoverLink:!0,hoverAnimation:!0,layout:null,focusNodeAdjacency:!1,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,curveness:0,opacity:.5},emphasis:{label:{show:!0}}}}),iw=ls.prototype,nw=ds.prototype;function ow(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var aw=Cs({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){this[ow(e)?"_buildPathLine":"_buildPathCurve"](t,e)},_buildPathLine:iw.buildPath,_buildPathCurve:nw.buildPath,pointAt:function(t){return this[ow(this.shape)?"_pointAtLine":"_pointAtCurve"](t)},_pointAtLine:iw.pointAt,_pointAtCurve:nw.pointAt,tangentAt:function(t){var e=this.shape,i=ow(e)?[e.x2-e.x1,e.y2-e.y1]:this._tangentAtCurve(t);return mt(i,i)},_tangentAtCurve:nw.tangentAt}),rw=["fromSymbol","toSymbol"];function sw(t){return"_"+t+"Type"}function lw(t,e,i){var n=e.getItemVisual(i,"color"),o=e.getItemVisual(i,t),a=e.getItemVisual(i,t+"Size");if(o&&"none"!==o){O(a)||(a=[a,a]);var r=_g(o,-a[0]/2,-a[1]/2,a[0],a[1],n);return r.name=t,r}}function uw(t,e){t.x1=e[0][0],t.y1=e[0][1],t.x2=e[1][0],t.y2=e[1][1],t.percent=1;var i=e[2];i?(t.cpx1=i[0],t.cpy1=i[1]):(t.cpx1=NaN,t.cpy1=NaN)}function hw(t,e,i){Ci.call(this),this._createLine(t,e,i)}var cw=hw.prototype;function dw(t){this._ctor=t||hw,this.group=new Ci}cw.beforeUpdate=function(){var t=this.childOfName("fromSymbol"),e=this.childOfName("toSymbol"),i=this.childOfName("label");if(t||e||!i.ignore){for(var n=1,o=this.parent;o;)o.scale&&(n/=o.scale[0]),o=o.parent;var a=this.childOfName("line");if(this.__dirty||a.__dirty){var r=a.shape.percent,s=a.pointAt(0),l=a.pointAt(r),u=ht([],l,s);if(mt(u,u),t){t.attr("position",s);var h=a.tangentAt(0);t.attr("rotation",Math.PI/2-Math.atan2(h[1],h[0])),t.attr("scale",[n*r,n*r])}if(e){e.attr("position",l);h=a.tangentAt(1);e.attr("rotation",-Math.PI/2-Math.atan2(h[1],h[0])),e.attr("scale",[n*r,n*r])}if(!i.ignore){var c,d,f,p;i.attr("position",l);var g=i.__labelDistance,m=g[0]*n,v=g[1]*n,y=r/2,x=[(h=a.tangentAt(y))[1],-h[0]],_=a.pointAt(y);0=t&&(0===e?0:n[e-1][0])a&&(e[1-n]=e[n]+c.sign*a),e}function $w(t,e){var i=t[e]-t[1-e];return{span:Math.abs(i),sign:0o*(1-h[0])?(l="jump",r=s-o*(1-h[2])):0<=(r=s-o*h[1])&&(r=s-o*(1-h[1]))<=0&&(r=0),(r*=e.axisExpandWidth/u)?Kw(r,n,a,"all"):l="none";else{o=n[1]-n[0];(n=[eb(0,a[1]*s/o-o/2)])[1]=tb(a[1],n[0]+o),n[0]=n[1]-o}return{axisExpandWindow:n,behavior:l}}},sh.register("parallel",{create:function(n,o){var a=[];return n.eachComponent("parallel",function(t,e){var i=new rb(t,n,o);i.name="parallel_"+e,i.resize(t,o),(t.coordinateSystem=i).model=t,a.push(i)}),n.eachSeries(function(t){if("parallel"===t.get("coordinateSystem")){var e=n.queryComponents({mainType:"parallel",index:t.get("parallelIndex"),id:t.get("parallelId")})[0];t.coordinateSystem=e.coordinateSystem}}),a}});var lb=Lu.extend({type:"baseParallelAxis",axis:null,activeIntervals:[],getAreaSelectStyle:function(){return ha([["fill","color"],["lineWidth","borderWidth"],["stroke","borderColor"],["width","width"],["opacity","opacity"]])(this.getModel("areaSelectStyle"))},setActiveIntervals:function(t){var e=this.activeIntervals=L(t);if(e)for(var i=e.length-1;0<=i;i--)Bl(e[i])},getActiveState:function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(t))return"inactive";if(1===e.length){var i=e[0];if(i[0]<=t&&t<=i[1])return"active"}else for(var n=0,o=e.length;nn.getWidth()||i<0||i>n.getHeight()}(t,e)){var n=t._zr,o=t._covers,a=Lb(t,e,i);if(!t._dragging)for(var r=0;rf&&(f=m.depth),g.setLayout({depth:v?m.depth:c},!0),"vertical"===a?g.setLayout({dy:i},!0):g.setLayout({dx:i},!0);for(var y=0;y "))},preventIncremental:function(){return!!this.get("effect.show")},getProgressive:function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},getProgressiveThreshold:function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},defaultOption:{coordinateSystem:"geo",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}}});function uM(t,e,i){Ci.call(this),this.add(this.createLine(t,e,i)),this._updateEffectSymbol(t,e)}var hM=uM.prototype;function cM(t,e,i){Ci.call(this),this._createPolyline(t,e,i)}hM.createLine=function(t,e,i){return new hw(t,e,i)},hM._updateEffectSymbol=function(t,e){var i=t.getItemModel(e).getModel("effect"),n=i.get("symbolSize"),o=i.get("symbol");O(n)||(n=[n,n]);var a=i.get("color")||t.getItemVisual(e,"color"),r=this.childAt(1);this._symbolType!==o&&(this.remove(r),(r=_g(o,-.5,-.5,1,1,a)).z2=100,r.culling=!0,this.add(r)),r&&(r.setStyle("shadowColor",a),r.setStyle(i.getItemStyle(["color"])),r.attr("scale",n),r.setColor(a),r.attr("scale",n),this._symbolType=o,this._symbolScale=n,this._updateEffectAnimation(t,i,e))},hM._updateEffectAnimation=function(e,t,i){var n=this.childAt(1);if(n){var o=this,a=e.getItemLayout(i),r=1e3*t.get("period"),s=t.get("loop"),l=t.get("constantSpeed"),u=W(t.get("delay"),function(t){return t/e.count()*r/3}),h="function"==typeof u;if(n.ignore=!0,this.updateAnimationPoints(n,a),0e);r++);r=Math.min(r-1,o-2)}wt(t.position,i[r],i[r+1],(e-n[r])/(n[r+1]-n[r]));var s=i[r+1][0]-i[r][0],l=i[r+1][1]-i[r][1];t.rotation=-Math.atan2(l,s)-Math.PI/2,this._lastFrame=r,this._lastFramePercent=e,t.ignore=!1}},w(fM,uM);var gM=Cs({shape:{polyline:!1,curveness:0,segs:[]},buildPath:function(t,e){var i=e.segs,n=e.curveness;if(e.polyline)for(var o=0;o=e[0]&&t<=e[1]}}(y,e.option.range):function(e,n,o){var i=e[1]-e[0],a=(n=N(n,function(t){return{interval:[(t.interval[0]-e[0])/i,(t.interval[1]-e[0])/i]}})).length,r=0;return function(t){for(var e=r;e=e.y&&t[1]<=e.y+e.height:i.contain(i.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},pointToData:function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},dataToPoint:function(t){var e=this.getAxis(),i=this.getRect(),n=[],o="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),n[o]=e.toGlobalCoord(e.dataToCoord(+t)),n[1-o]=0==o?i.y+i.height/2:i.x+i.width/2,n}}).dimensions});var jM=["axisLine","axisTickLabel","axisName"],qM=["splitArea","splitLine"],KM=pv.extend({type:"singleAxis",axisPointerClass:"SingleAxisPointer",render:function(e,t,i,n){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Ci;var r=YM(e),s=new $m(e,r);E(jM,s.add,s),o.add(this._axisGroup),o.add(s.getGroup()),E(qM,function(t){e.get(t+".show")&&this["_"+t](e)},this),ml(a,this._axisGroup,e),KM.superCall(this,"render",e,t,i,n)},remove:function(){_v(this)},_splitLine:function(t){var e=t.axis;if(!e.scale.isBlank()){var i=t.getModel("splitLine"),n=i.getModel("lineStyle"),o=n.get("width"),a=n.get("color");a=a instanceof Array?a:[a];for(var r=t.coordinateSystem.getRect(),s=e.isHorizontal(),l=[],u=0,h=e.getTicksCoords({tickModel:i}),c=[],d=[],f=0;fr)return!0;if(a){var s=cv(t).seriesDataCount,l=n.getExtent();return Math.abs(l[0]-l[1])/s>r}return!1},makeElOption:function(t,e,i,n,o){},createPointerEl:function(t,e,i,n){var o=e.pointer;if(o){var a=pI(t).pointerEl=new bl[o.type](gI(e.pointer));t.add(a)}},createLabelEl:function(t,e,i,n){if(e.label){var o=pI(t).labelEl=new rs(gI(e.label));t.add(o),xI(o,n)}},updatePointerEl:function(t,e,i){var n=pI(t).pointerEl;n&&e.pointer&&(n.setStyle(e.pointer.style),i(n,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,i,n){var o=pI(t).labelEl;o&&(o.setStyle(e.label.style),i(o,{shape:e.label.shape,position:e.label.position}),xI(o,n))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e,i=this._axisPointerModel,n=this._api.getZr(),o=this._handle,a=i.getModel("handle"),r=i.get("status");if(!a.get("show")||!r||"hide"===r)return o&&n.remove(o),void(this._handle=null);this._handle||(e=!0,o=this._handle=yl(a.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){Xt(t.event)},onmousedown:mI(this._onHandleDragMove,this,0,0),drift:mI(this._onHandleDragMove,this),ondragend:mI(this._onHandleDragEnd,this)}),n.add(o)),wI(o,i,!1);o.setStyle(a.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=a.get("size");O(s)||(s=[s,s]),o.attr("scale",[s[0]/2,s[1]/2]),Lc(this,"_doDispatchAxisPointer",a.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},_moveHandleToValue:function(t,e){yI(this._axisPointerModel,!e&&this._moveAnimation,this._handle,_I(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var i=this._handle;if(i){this._dragging=!0;var n=this.updateHandleTransform(_I(i),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=n,i.stopAnimation(),i.attr(_I(n)),pI(i).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},_onHandleDragEnd:function(t){if(this._dragging=!1,this._handle){var e=this._axisPointerModel.get("value");this._moveHandleToValue(e),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),i=this._group,n=this._handle;e&&i&&(this._lastGraphicKey=null,i&&e.remove(i),n&&e.remove(n),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,i){return{x:t[i=i||0],y:t[1-i],width:e[i],height:e[1-i]}}}).constructor=vI);var LI=vI.extend({makeElOption:function(t,e,i,n,o){var a=i.axis,r=a.grid,s=n.get("type"),l=kI(r,a).getOtherAxis(a).getGlobalExtent(),u=a.toGlobalCoord(a.dataToCoord(e,!0));if(s&&"none"!==s){var h=bI(n),c=PI[s](a,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}TI(e,t,yv(r.model,i),i,n,o)},getHandleTransform:function(t,e,i){var n=yv(e.axis.grid.model,e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:II(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,n){var o=i.axis,a=o.grid,r=o.getGlobalExtent(!0),s=kI(a,o).getOtherAxis(o).getGlobalExtent(),l="x"===o.dim?0:1,u=t.position;u[l]+=e[l],u[l]=Math.min(r[1],u[l]),u[l]=Math.max(r[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];return{position:u,rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}}});function kI(t,e){var i={};return i[e.dim+"AxisIndex"]=e.index,t.getCartesian(i)}var PI={line:function(t,e,i){return{type:"Line",subPixelOptimize:!0,shape:AI([e,i[0]],[e,i[1]],NI(t))}},shadow:function(t,e,i){var n=Math.max(1,t.getBandWidth()),o=i[1]-i[0];return{type:"Rect",shape:DI([e-n/2,i[0]],[n,o],NI(t))}}};function NI(t){return"x"===t.dim?0:1}pv.registerAxisPointerClass("CartesianAxisPointer",LI),vf(function(t){if(t){t.axisPointer&&0!==t.axisPointer.length||(t.axisPointer={});var e=t.axisPointer.link;e&&!O(e)&&(t.axisPointer.link=[e])}}),yf(Cd.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=uv(t,e)}),xf({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,i){var n=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||A(i.dispatchAction,i),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){rI(r)&&(r=JM({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=rI(r),u=o.axesInfo,h=s.axesInfo,c="leave"===n||rI(r),d={},f={},p={list:[],map:{}},g={showPointer:tI(nI,f),showTooltip:tI(oI,p)};QM(s.coordSysMap,function(t,e){var a=l||t.containPoint(r);QM(s.coordSysAxesInfo[e],function(t,e){var i=t.axis,n=function(t,e){for(var i=0;i<(t||[]).length;i++){var n=t[i];if(e.axis.dim===n.axisDim&&e.axis.model.componentIndex===n.axisIndex)return n}}(u,t);if(!c&&a&&(!u||n)){var o=n&&n.value;null!=o||l||(o=i.pointToData(r)),null!=o&&iI(t,o,g,!1,d)}})});var m={};return QM(h,function(o,t){var a=o.linkGroup;a&&!f[t]&&QM(a.axesInfo,function(t,e){var i=f[e];if(t!==o&&i){var n=i.value;a.mapper&&(n=o.axis.scale.parse(a.mapper(n,aI(t),aI(o)))),m[o.key]=n}})}),QM(m,function(t,e){iI(h[e],t,g,!0,d)}),function(o,t,e){var a=e.axesInfo=[];QM(t,function(t,e){var i=t.axisPointerModel.option,n=o[e];n?(t.useHandle||(i.status="show"),i.value=n.value,i.seriesDataIndices=(n.payloadBatch||[]).slice()):t.useHandle||(i.status="hide"),"show"===i.status&&a.push({axisDim:t.axis.dim,axisIndex:t.axis.model.componentIndex,value:i.value})})}(f,h,d),function(t,e,i,n){if(rI(e)||!t.list.length)return n({type:"hideTip"});var o=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};n({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:i.tooltipOption,position:i.position,dataIndexInside:o.dataIndexInside,dataIndex:o.dataIndex,seriesIndex:o.seriesIndex,dataByCoordSys:t.list})}(p,r,t,a),function(t,e,i){var n=i.getZr(),o="axisPointerLastHighlights",a=eI(n)[o]||{},r=eI(n)[o]={};QM(t,function(t,e){var i=t.axisPointerModel.option;"show"===i.status&&QM(i.seriesDataIndices,function(t){var e=t.seriesIndex+" | "+t.dataIndex;r[e]=t})});var s=[],l=[];E(a,function(t,e){r[e]||l.push(t)}),E(r,function(t,e){a[e]||s.push(t)}),l.length&&i.dispatchAction({type:"downplay",escapeConnect:!0,batch:l}),s.length&&i.dispatchAction({type:"highlight",escapeConnect:!0,batch:s})}(h,0,i),d}});var OI=["x","y"],EI=["width","height"],RI=vI.extend({makeElOption:function(t,e,i,n,o){var a=i.axis,r=a.coordinateSystem,s=VI(r,1-BI(a)),l=r.dataToPoint(e)[0],u=n.get("type");if(u&&"none"!==u){var h=bI(n),c=zI[u](a,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}TI(e,t,YM(i),i,n,o)},getHandleTransform:function(t,e,i){var n=YM(e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:II(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,n){var o=i.axis,a=o.coordinateSystem,r=BI(o),s=VI(a,r),l=t.position;l[r]+=e[r],l[r]=Math.min(s[1],l[r]),l[r]=Math.max(s[0],l[r]);var u=VI(a,1-r),h=(u[1]+u[0])/2,c=[h,h];return c[r]=l[r],{position:l,rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}}}),zI={line:function(t,e,i){return{type:"Line",subPixelOptimize:!0,shape:AI([e,i[0]],[e,i[1]],BI(t))}},shadow:function(t,e,i){var n=t.getBandWidth(),o=i[1]-i[0];return{type:"Rect",shape:DI([e-n/2,i[0]],[n,o],BI(t))}}};function BI(t){return t.isHorizontal()?0:1}function VI(t,e){var i=t.getRect();return[i[OI[e]],i[OI[e]]+i[EI[e]]]}pv.registerAxisPointerClass("SingleAxisPointer",RI),Tf({type:"single"});var GI=rc.extend({type:"series.themeRiver",dependencies:["singleAxis"],nameMap:null,init:function(t){GI.superApply(this,"init",arguments),this.legendVisualProvider=new Yv(A(this.getData,this),A(this.getRawData,this))},fixData:function(t){var e=t.length,i=ta(t,function(t){return t[2]}),n=[];i.buckets.each(function(t,e){n.push({name:e,dataList:t})});for(var o=n.length,a=-1,r=-1,s=0;sMath.PI/2?"right":"left"):y&&"center"!==y?"left"===y?(d=l.r0+v,f>Math.PI/2&&(y="right")):"right"===y&&(d=l.r-v,f>Math.PI/2&&(y="left")):(d=(l.r+l.r0)/2,y="center"),c.attr("style",{text:s,textAlign:y,textVerticalAlign:S("verticalAlign")||"middle",opacity:S("opacity")});var x=d*p+l.cx,_=d*g+l.cy;c.attr("position",[x,_]);var w=S("rotate"),b=0;function S(t){var e=a.get(t);return null==e?o.get(t):e}"radial"===w?(b=-f)<-Math.PI/2&&(b+=Math.PI):"tangential"===w?(b=Math.PI/2-f)>Math.PI/2?b-=Math.PI:b<-Math.PI/2&&(b+=Math.PI):"number"==typeof w&&(b=w*Math.PI/180),c.attr("rotation",b)},jI._initEvents=function(t,e,i,n){t.off("mouseover").off("mouseout").off("emphasis").off("normal");function o(){r.onEmphasis(n)}function a(){r.onNormal()}var r=this;i.isAnimationEnabled()&&t.on("mouseover",o).on("mouseout",a).on("emphasis",o).on("normal",a).on("downplay",function(){r.onDownplay()}).on("highlight",function(){r.onHighlight()})},w(YI,Ci);xc.extend({type:"sunburst",init:function(){},render:function(o,a,t,e){var n=this;this.seriesModel=o,this.api=t,this.ecModel=a;var r=o.getData(),s=r.tree.root,i=o.getViewRoot(),l=this.group,u=o.get("renderLabelForZeroData"),h=[];i.eachNode(function(t){h.push(t)});var c=this._oldChildren||[];if(function(i,n){if(0===i.length&&0===n.length)return;function t(t){return t.getId()}function e(t,e){!function(t,e){u||!t||t.getValue()||(t=null);if(t!==s&&e!==s)if(e&&e.piece)t?(e.piece.updateData(!1,t,"normal",o,a),r.setItemGraphicEl(t.dataIndex,e.piece)):function(t){if(!t)return;t.piece&&(l.remove(t.piece),t.piece=null)}(e);else if(t){var i=new YI(t,o,a);l.add(i),r.setItemGraphicEl(t.dataIndex,i)}}(null==t?null:i[t],null==e?null:n[e])}new Lf(n,i,t,t).add(e).update(e).remove(T(e,null)).execute()}(h,c),function(t,e){if(0=i.r0}}});var qI="sunburstRootToNode";xf({type:qI,update:"updateView"},function(o,t){t.eachComponent({mainType:"series",subType:"sunburst",query:o},function(t,e){var i=Wx(o,[qI],t);if(i){var n=t.getViewRoot();n&&(o.direction=Zx(n,i.node)?"rollUp":"drillDown"),t.resetViewRoot(i.node)}})});var KI="sunburstHighlight";xf({type:KI,update:"updateView"},function(n,t){t.eachComponent({mainType:"series",subType:"sunburst",query:n},function(t,e){var i=Wx(n,[KI],t);i&&(n.highlight=i.node)})});xf({type:"sunburstUnhighlight",update:"updateView"},function(i,t){t.eachComponent({mainType:"series",subType:"sunburst",query:i},function(t,e){i.unhighlight=!0})});var $I=Math.PI/180;function JI(t,e){if("function"==typeof e)return t.sort(e);var n="asc"===e;return t.sort(function(t,e){var i=(t.getValue()-e.getValue())*(n?1:-1);return 0==i?(t.dataIndex-e.dataIndex)*(n?-1:1):i})}function QI(a,r){return r=r||[0,0],N(["x","y"],function(t,e){var i=this.getAxis(t),n=r[e],o=a[e]/2;return"category"===i.type?i.getBandWidth():Math.abs(i.dataToCoord(n-o)-i.dataToCoord(n+o))},this)}bf(T(ty,"sunburst")),wf(T(function(t,e,C,i){e.eachSeriesByType(t,function(t){var e=t.get("center"),i=t.get("radius");O(i)||(i=[0,i]),O(e)||(e=[e,e]);var n=C.getWidth(),o=C.getHeight(),h=Math.min(n,o),c=Rl(e[0],n),d=Rl(e[1],o),f=Rl(i[0],h/2),a=Rl(i[1],h/2),r=-t.get("startAngle")*$I,p=t.get("minAngle")*$I,g=t.getData().tree.root,s=t.getViewRoot(),m=s.depth,l=t.get("sort");null!=l&&!function e(t,i){var n=t.children||[];t.children=JI(n,i);n.length&&E(t.children,function(t){e(t,i)})}(s,l);var u=0;E(s.children,function(t){isNaN(t.getValue())||u++});var v=s.getValue(),y=Math.PI/(v||u)*2,x=0t[1]&&t.reverse(),{coordSys:{type:"polar",cx:o.cx,cy:o.cy,r:t[1],r0:t[0]},api:{coord:A(function(t){var e=a.dataToRadius(t[0]),i=r.dataToAngle(t[1]),n=o.coordToPoint([e,i]);return n.push(e,i*Math.PI/180),n}),size:A(iT,o)}}},calendar:function(i){var t=i.getRect(),e=i.getRangeInfo();return{coordSys:{type:"calendar",x:t.x,y:t.y,width:t.width,height:t.height,cellWidth:i.getCellWidth(),cellHeight:i.getCellHeight(),rangeInfo:{start:e.start,end:e.end,weeks:e.weeks,dayCount:e.allDay}},api:{coord:function(t,e){return i.dataToPoint(t,e)}}}}};function hT(t,e,i,n,o){null==i[t]||o||(e[t]=i[t],i[t]=n[t])}function cT(a,r,e,t){var i=a.get("renderItem"),n=a.coordinateSystem,o={};n&&(o=n.prepareCustoms?n.prepareCustoms():uT[n.type](n));var s,l,u,h,c,d=D({getWidth:t.getWidth,getHeight:t.getHeight,getZr:t.getZr,getDevicePixelRatio:t.getDevicePixelRatio,value:function(t,e){return null==e&&(e=s),r.get(r.getDimension(t||0),e)},style:function(t,e){null==e&&(e=s),g(e);var i=l.getModel(oT).getItemStyle();null!=c&&(i.fill=c);var n=r.getItemVisual(e,"opacity");null!=n&&(i.opacity=n);var o=t?mT(t,u):u;return nl(i,o,null,{autoColor:c,isRectText:!0}),i.text=o.getShallow("show")?H(a.getFormattedLabel(e,"normal"),Zg(r,e)):null,t&&vT(i,t),i},styleEmphasis:function(t,e){null==e&&(e=s),g(e);var i=l.getModel(aT).getItemStyle(),n=t?mT(t,h):h;return nl(i,n,null,{isRectText:!0},!0),i.text=n.getShallow("show")?Z(a.getFormattedLabel(e,"emphasis"),a.getFormattedLabel(e,"normal"),Zg(r,e)):null,t&&vT(i,t),i},visual:function(t,e){return null==e&&(e=s),r.getItemVisual(e,t)},barLayout:function(t){if(n.getBaseAxis){return function(t){var e=[],i=t.axis;if("category"===i.type){for(var n=i.getBandWidth(),o=0;oe[1]&&e.reverse();var i=t.getExtent(),n=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-i[0]*n,endAngle:-i[1]*n,clockwise:t.inverse,contain:function(t,e){var i=t-this.cx,n=e-this.cy,o=i*i+n*n,a=this.r,r=this.r0;return o<=a*a&&r*r<=o}}}};var AT=Lu.extend({type:"polarAxis",axis:null,getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"polar",index:this.option.polarIndex,id:this.option.polarId})[0]}});m(AT.prototype,cg);var DT={splitNumber:5};function CT(t,e){return e.type||(e.data?"category":"value")}function LT(t,e){var i=this,n=i.getAngleAxis(),o=i.getRadiusAxis();if(n.scale.setExtent(1/0,-1/0),o.scale.setExtent(1/0,-1/0),t.eachSeries(function(t){if(t.coordinateSystem===i){var e=t.getData();E(e.mapDimension("radius",!0),function(t){o.scale.unionExtentFromData(e,fp(e,t))}),E(e.mapDimension("angle",!0),function(t){n.scale.unionExtentFromData(e,fp(e,t))})}}),ag(n.scale,n.model),ag(o.scale,o.model),"category"===n.type&&!n.onBand){var a=n.getExtent(),r=360/n.scale.count();n.inverse?a[1]+=r:a[1]-=r,n.setExtent(a[0],a[1])}}function kT(t,e){if(t.type=e.get("type"),t.scale=rg(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),"angleAxis"===e.mainType){t.inverse^=e.get("clockwise");var i=e.get("startAngle");t.setExtent(i,i+(t.inverse?-360:360))}(e.axis=t).model=e}Bm("angle",AT,CT,{startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:!1}}),Bm("radius",AT,CT,DT),If({type:"polar",dependencies:["polarAxis","angleAxis"],coordinateSystem:null,findAxisModel:function(t){var e;return this.ecModel.eachComponent(t,function(t){t.getCoordSysModel()===this&&(e=t)},this),e},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"80%"}}),sh.register("polar",{dimensions:TT.prototype.dimensions,create:function(i,s){var l=[];return i.eachComponent("polar",function(t,e){var i=new TT(e);i.update=LT;var n=i.getRadiusAxis(),o=i.getAngleAxis(),a=t.findAxisModel("radiusAxis"),r=t.findAxisModel("angleAxis");kT(n,a),kT(o,r),function(t,e,i){var n=e.get("center"),o=i.getWidth(),a=i.getHeight();t.cx=Rl(n[0],o),t.cy=Rl(n[1],a);var r=t.getRadiusAxis(),s=Math.min(o,a)/2,l=e.get("radius");null==l?l=[0,"100%"]:O(l)||(l=[0,l]),l=[Rl(l[0],s),Rl(l[1],s)],r.inverse?r.setExtent(l[1],l[0]):r.setExtent(l[0],l[1])}(i,t,s),l.push(i),(t.coordinateSystem=i).model=t}),i.eachSeries(function(t){if("polar"===t.get("coordinateSystem")){var e=i.queryComponents({mainType:"polar",index:t.get("polarIndex"),id:t.get("polarId")})[0];t.coordinateSystem=e.coordinateSystem}}),l}});var PT=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function NT(t,e,i){e[1]>e[0]&&(e=e.slice().reverse());var n=t.coordToPoint([e[0],i]),o=t.coordToPoint([e[1],i]);return{x1:n[0],y1:n[1],x2:o[0],y2:o[1]}}function OT(t){return t.getRadiusAxis().inverse?0:1}function ET(t){var e=t[0],i=t[t.length-1];e&&i&&Math.abs(Math.abs(e.coord-i.coord)-360)<1e-4&&t.pop()}pv.extend({type:"angleAxis",axisPointerClass:"PolarAxisPointer",render:function(e,t){if(this.group.removeAll(),e.get("show")){var i=e.axis,n=i.polar,o=n.getRadiusAxis().getExtent(),a=i.getTicksCoords(),r=i.getMinorTicksCoords(),s=N(i.getViewLabels(),function(t){return(t=L(t)).coord=i.dataToCoord(t.tickValue),t});ET(s),ET(a),E(PT,function(t){!e.get(t+".show")||i.scale.isBlank()&&"axisLine"!==t||this["_"+t](e,n,a,r,o,s)},this)}},_axisLine:function(t,e,i,n,o){var a,r=t.getModel("axisLine.lineStyle"),s=OT(e),l=s?0:1;(a=0===o[l]?new Yr({shape:{cx:e.cx,cy:e.cy,r:o[s]},style:r.getLineStyle(),z2:1,silent:!0}):new Kr({shape:{cx:e.cx,cy:e.cy,r:o[s],r0:o[l]},style:r.getLineStyle(),z2:1,silent:!0})).style.fill=null,this.group.add(a)},_axisTick:function(t,e,i,n,o){var a=t.getModel("axisTick"),r=(a.get("inside")?-1:1)*a.get("length"),s=o[OT(e)],l=N(i,function(t){return new ls({shape:NT(e,[s,s+r],t.coord)})});this.group.add(Es(l,{style:D(a.getModel("lineStyle").getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")})}))},_minorTick:function(t,e,i,n,o){if(n.length){for(var a=t.getModel("axisTick"),r=t.getModel("minorTick"),s=(a.get("inside")?-1:1)*r.get("length"),l=o[OT(e)],u=[],h=0;hr?"left":"right",u=Math.abs(a[1]-s)/o<.3?"middle":a[1]>s?"top":"bottom";p&&p[n]&&p[n].textStyle&&(i=new Cl(p[n].textStyle,g,g.ecModel));var h=new Ur({silent:$m.isLabelSilent(c)});this.group.add(h),nl(h.style,i,{x:a[0],y:a[1],textFill:i.getTextColor()||c.get("axisLine.lineStyle.color"),text:t.formattedLabel,textAlign:l,textVerticalAlign:u}),v&&(h.eventData=$m.makeAxisEventDataBase(c),h.eventData.targetType="axisLabel",h.eventData.value=t.rawLabel)},this)},_splitLine:function(t,e,i,n,o){var a=t.getModel("splitLine").getModel("lineStyle"),r=a.get("color"),s=0;r=r instanceof Array?r:[r];for(var l=[],u=0;um?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,i,0,s,d))}});var VT={line:function(t,e,i,n,o){return"angle"===t.dim?{type:"Line",shape:AI(e.coordToPoint([n[0],i]),e.coordToPoint([n[1],i]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:i}}},shadow:function(t,e,i,n,o){var a=Math.max(1,t.getBandWidth()),r=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:CI(e.cx,e.cy,n[0],n[1],(-i-a/2)*r,(a/2-i)*r)}:{type:"Sector",shape:CI(e.cx,e.cy,i-a/2,i+a/2,0,2*Math.PI)}}};function GT(n,t){t.update="updateView",xf(t,function(t,e){var i={};return e.eachComponent({mainType:"geo",query:t},function(e){e[n](t.name),E(e.coordinateSystem.regions,function(t){i[t.name]=e.isSelected(t.name)||!1})}),{selected:i,name:t.name}})}pv.registerAxisPointerClass("PolarAxisPointer",BT),wf(T(function(t,e,i){var N={},O=function(t){var g={};E(t,function(t,e){var i=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),a=bT(n,o),r=o.getExtent(),s="category"===o.type?o.getBandWidth():Math.abs(r[1]-r[0])/i.count(),l=g[a]||{bandWidth:s,remainedWidth:s,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},u=l.stacks;g[a]=l;var h=wT(t);u[h]||l.autoWidthCount++,u[h]=u[h]||{width:0,maxWidth:0};var c=Rl(t.get("barWidth"),s),d=Rl(t.get("barMaxWidth"),s),f=t.get("barGap"),p=t.get("barCategoryGap");c&&!u[h].width&&(c=Math.min(l.remainedWidth,c),u[h].width=c,l.remainedWidth-=c),d&&(u[h].maxWidth=d),null!=f&&(l.gap=f),null!=p&&(l.categoryGap=p)});var d={};return E(g,function(t,i){d[i]={};var e=t.stacks,n=t.bandWidth,o=Rl(t.categoryGap,n),a=Rl(t.gap,1),r=t.remainedWidth,s=t.autoWidthCount,l=(r-o)/(s+(s-1)*a);l=Math.max(l,0),E(e,function(t,e){var i=t.maxWidth;i&&i=n.start.time&&i.timea.end.time&&t.reverse(),t},_getRangeInfo:function(t){var e;(t=[this.getDateInfo(t[0]),this.getDateInfo(t[1])])[0].time>t[1].time&&(e=!0,t.reverse());var i=Math.floor(t[1].time/864e5)-Math.floor(t[0].time/864e5)+1,n=new Date(t[0].time),o=n.getDate(),a=t[1].date.getDate();if(n.setDate(o+i-1),n.getDate()!==a)for(var r=0n.weeks||0===t&&en.lweek)return!1;var o=7*(t-1)-n.fweek+e,a=new Date(n.start.time);return a.setDate(n.start.d+o),this.getDateInfo(a)}},FT.dimensions=FT.prototype.dimensions,FT.getDimensionsInfo=FT.prototype.getDimensionsInfo,FT.create=function(i,n){var o=[];return i.eachComponent("calendar",function(t){var e=new FT(t,i,n);o.push(e),t.coordinateSystem=e}),i.eachSeries(function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=o[t.get("calendarIndex")||0])}),o},sh.register("calendar",FT);var HT=Lu.extend({type:"calendar",coordinateSystem:null,defaultOption:{zlevel:0,z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",nameMap:"en",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",nameMap:"en",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},init:function(t,e,i,n){var o=Mu(t);HT.superApply(this,"init",arguments),ZT(t,o)},mergeOption:function(t,e){HT.superApply(this,"mergeOption",arguments),ZT(this.option,t)}});function ZT(t,e){var i=t.cellSize;O(i)?1===i.length&&(i[1]=i[0]):i=t.cellSize=[i,i];var n=N([0,1],function(t){return function(t,e){return null!=t[yu[e][0]]||null!=t[yu[e][1]]&&null!=t[yu[e][2]]}(e,t)&&(i[t]="auto"),null!=i[t]&&"auto"!==i[t]});Su(t,e,{type:"box",ignoreSize:n})}var UT={EN:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],CN:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},XT={EN:["S","M","T","W","T","F","S"],CN:["日","一","二","三","四","五","六"]};Tf({type:"calendar",_tlpoints:null,_blpoints:null,_firstDayOfMonth:null,_firstDayPoints:null,render:function(t,e,i){var n=this.group;n.removeAll();var o=t.coordinateSystem,a=o.getRangeInfo(),r=o.getOrient();this._renderDayRect(t,a,n),this._renderLines(t,a,r,n),this._renderYearText(t,a,r,n),this._renderMonthText(t,r,n),this._renderWeekText(t,a,r,n)},_renderDayRect:function(t,e,i){for(var n=t.coordinateSystem,o=t.getModel("itemStyle").getItemStyle(),a=n.getCellWidth(),r=n.getCellHeight(),s=e.start.time;s<=e.end.time;s=n.getNextNDay(s,1).time){var l=n.dataToRect([s],!1).tl,u=new rs({shape:{x:l[0],y:l[1],width:a,height:r},cursor:"default",style:o});i.add(u)}},_renderLines:function(i,t,n,o){var a=this,r=i.coordinateSystem,s=i.getModel("splitLine.lineStyle").getLineStyle(),l=i.get("splitLine.show"),e=s.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=t.start,h=0;u.time<=t.end.time;h++){d(u.formatedDate),0===h&&(u=r.getDateInfo(t.start.y+"-"+t.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=r.getDateInfo(c)}function d(t){a._firstDayOfMonth.push(r.getDateInfo(t)),a._firstDayPoints.push(r.dataToRect([t],!1).tl);var e=a._getLinePointsOfOneWeek(i,t,n);a._tlpoints.push(e[0]),a._blpoints.push(e[e.length-1]),l&&a._drawSplitline(e,s,o)}d(r.getNextNDay(t.end.time,1).formatedDate),l&&this._drawSplitline(a._getEdgesPoints(a._tlpoints,e,n),s,o),l&&this._drawSplitline(a._getEdgesPoints(a._blpoints,e,n),s,o)},_getEdgesPoints:function(t,e,i){var n=[t[0].slice(),t[t.length-1].slice()],o="horizontal"===i?0:1;return n[0][o]=n[0][o]-e/2,n[1][o]=n[1][o]+e/2,n},_drawSplitline:function(t,e,i){var n=new ts({z2:20,shape:{points:t},style:e});i.add(n)},_getLinePointsOfOneWeek:function(t,e,i){var n=t.coordinateSystem;e=n.getDateInfo(e);for(var o=[],a=0;a<7;a++){var r=n.getNextNDay(e.time,a),s=n.dataToRect([r.time],!1);o[2*r.day]=s.tl,o[2*r.day+1]=s["horizontal"===i?"bl":"tr"]}return o},_formatterLabel:function(t,e){return"string"==typeof t&&t?uu(t,e):"function"==typeof t?t(e):e.nameMap},_yearTextPositionControl:function(t,e,i,n,o){e=e.slice();var a=["center","bottom"];"bottom"===n?(e[1]+=o,a=["center","top"]):"left"===n?e[0]-=o:"right"===n?(e[0]+=o,a=["center","top"]):e[1]-=o;var r=0;return"left"!==n&&"right"!==n||(r=Math.PI/2),{rotation:r,position:e,style:{textAlign:a[0],textVerticalAlign:a[1]}}},_renderYearText:function(t,e,i,n){var o=t.getModel("yearLabel");if(o.get("show")){var a=o.get("margin"),r=o.get("position");r=r||("horizontal"!==i?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===i?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},d=e.start.y;+e.end.y>+e.start.y&&(d=d+"-"+e.end.y);var f=o.get("formatter"),p={start:e.start.y,end:e.end.y,nameMap:d},g=this._formatterLabel(f,p),m=new Ur({z2:30});nl(m.style,o,{text:g}),m.attr(this._yearTextPositionControl(m,c[r],i,r,a)),n.add(m)}},_monthTextPositionControl:function(t,e,i,n,o){var a="left",r="top",s=t[0],l=t[1];return"horizontal"===i?(l+=o,e&&(a="center"),"start"===n&&(r="bottom")):(s+=o,e&&(r="middle"),"start"===n&&(a="right")),{x:s,y:l,textAlign:a,textVerticalAlign:r}},_renderMonthText:function(t,e,i){var n=t.getModel("monthLabel");if(n.get("show")){var o=n.get("nameMap"),a=n.get("margin"),r=n.get("position"),s=n.get("align"),l=[this._tlpoints,this._blpoints];R(o)&&(o=UT[o.toUpperCase()]||[]);var u="start"===r?0:1,h="horizontal"===e?0:1;a="start"===r?-a:a;for(var c="center"===s,d=0;dd.getHeight()&&(i.textPosition="top",a=!0);var r=a?-5-n.height:p+8;o+n.width/2>d.getWidth()?(i.textPosition=["100%",r],i.textAlign="right"):o-n.width/2<0&&(i.textPosition=[0,r],i.textAlign="left")}})}function t(t,e){var i,n=m[t],o=m[e],a=u[n],r=new Cl(a,h,h.ecModel);if(l&&null!=l.newTitle&&(a.title=l.newTitle),n&&!o){if(function(t){return 0===t.indexOf("my")}(n))i={model:r,onclick:r.option.onclick,featureName:n};else{var s=tA(n);if(!s)return;i=new s(r,c,d)}g[n]=i}else{if(!(i=g[o]))return;i.model=r,i.ecModel=c,i.api=d}n||!o?r.get("show")&&!i.unusable?(function(o,a,t){var r=o.getModel("iconStyle"),s=o.getModel("emphasis.iconStyle"),e=a.getIcons?a.getIcons():o.get("icon"),l=o.get("title")||{};if("string"==typeof e){var i=e,n=l;l={},(e={})[t]=i,l[t]=n}var u=o.iconPaths={};E(e,function(t,e){var i=yl(t,{},{x:-p/2,y:-p/2,width:p,height:p});i.setStyle(r.getItemStyle()),i.hoverStyle=s.getItemStyle(),i.setStyle({text:l[e],textAlign:s.get("textAlign"),textBorderRadius:s.get("textBorderRadius"),textPadding:s.get("textPadding"),textFill:null});var n=h.getModel("tooltip");n&&n.get("show")&&i.attr("tooltip",k({content:l[e],formatter:n.get("formatter",!0)||function(){return l[e]},formatterParams:{componentType:"toolbox",name:e,title:l[e],$vars:["name","title"]},position:n.get("position",!0)||"bottom"},n.option)),$s(i),h.get("showTitle")&&(i.__title=l[e],i.on("mouseover",function(){var t=s.getItemStyle(),e="vertical"===h.get("orient")?null==h.get("right")?"right":"left":null==h.get("bottom")?"bottom":"top";i.setStyle({textFill:s.get("textFill")||t.fill||t.stroke||"#000",textBackgroundColor:s.get("textBackgroundColor"),textPosition:s.get("textPosition")||e})}).on("mouseout",function(){i.setStyle({textFill:null,textBackgroundColor:null})})),i.trigger(o.get("iconStatus."+e)||"normal"),f.add(i),i.on("click",A(a.onclick,a,c,d,e)),u[e]=i})}(r,i,n),r.setIconStatus=function(t,e){var i=this.option,n=this.iconPaths;i.iconStatus=i.iconStatus||{},i.iconStatus[t]=e,n[t]&&n[t].trigger(e)},i.render&&i.render(r,c,d,l)):i.remove&&i.remove(c,d):i.dispose&&i.dispose(c,d)}},updateView:function(t,e,i,n){E(this._features,function(t){t.updateView&&t.updateView(t.model,e,i,n)})},remove:function(e,i){E(this._features,function(t){t.remove&&t.remove(e,i)}),this.group.removeAll()},dispose:function(e,i){E(this._features,function(t){t.dispose&&t.dispose(e,i)})}});var nA=Nc.toolbox.saveAsImage;function oA(t){this.model=t}oA.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:nA.title,type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:nA.lang.slice()},oA.prototype.unusable=!v.canvasSupported,oA.prototype.onclick=function(t,e){var i=this.model,n=i.get("name")||t.get("title.0.text")||"echarts",o=i.get("type",!0)||"png",a=e.getConnectedDataURL({type:o,backgroundColor:i.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:i.get("connectedBackgroundColor"),excludeComponents:i.get("excludeComponents"),pixelRatio:i.get("pixelRatio")});if("function"!=typeof MouseEvent||v.browser.ie||v.browser.edge)if(window.navigator.msSaveOrOpenBlob){for(var r=atob(a.split(",")[1]),s=r.length,l=new Uint8Array(s);s--;)l[s]=r.charCodeAt(s);var u=new Blob([l]);window.navigator.msSaveOrOpenBlob(u,n+"."+o)}else{var h=i.get("lang"),c='';window.open().document.write(c)}else{var d=document.createElement("a");d.download=n+"."+o,d.target="_blank",d.href=a;var f=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});d.dispatchEvent(f)}},QT("saveAsImage",oA);var aA=Nc.toolbox.magicType,rA="__ec_magicType_stack__";function sA(t){this.model=t}sA.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:L(aA.title),option:{},seriesIndex:{}};var lA=sA.prototype;lA.getIcons=function(){var t=this.model,e=t.get("icon"),i={};return E(t.get("type"),function(t){e[t]&&(i[t]=e[t])}),i};var uA={line:function(t,e,i,n){if("bar"===t)return m({id:e,type:"line",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.line")||{},!0)},bar:function(t,e,i,n){if("line"===t)return m({id:e,type:"bar",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.bar")||{},!0)},stack:function(t,e,i,n){var o=i.get("stack")===rA;if("line"===t||"bar"===t)return n.setIconStatus("stack",o?"normal":"emphasis"),m({id:e,stack:o?"":rA},n.get("option.stack")||{},!0)}},hA=[["line","bar"],["stack"]];lA.onclick=function(u,t,h){var c=this.model,e=c.get("seriesIndex."+h);if(uA[h]){var i,d={series:[]};if(E(hA,function(t){0<=_(t,h)&&E(t,function(t){c.setIconStatus(t,"normal")})}),c.setIconStatus(h,"emphasis"),u.eachComponent({mainType:"series",query:null==e?null:{seriesIndex:e}},function(t){var e=t.subType,i=t.id,n=uA[h](e,i,t,c);n&&(D(n,t.option),d.series.push(n));var o=t.coordinateSystem;if(o&&"cartesian2d"===o.type&&("line"===h||"bar"===h)){var a=o.getAxesByScale("ordinal")[0];if(a){var r=a.dim+"Axis",s=u.queryComponents({mainType:r,index:t.get(name+"Index"),id:t.get(name+"Id")})[0].componentIndex;d[r]=d[r]||[];for(var l=0;l<=s;l++)d[r][s]=d[r][s]||{};d[r][s].boundaryGap="bar"===h}}}),"stack"===h)i=d.series&&d.series[0]&&d.series[0].stack===rA?m({stack:aA.title.tiled},aA.title):L(aA.title);t.dispatchAction({type:"changeMagicType",currentType:h,newOption:d,newTitle:i})}},xf({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),QT("magicType",sA);var cA=Nc.toolbox.dataView,dA=new Array(60).join("-"),fA="\t";function pA(t){var e=function(t){var o={},a=[],r=[];return t.eachRawSeries(function(t){var e=t.coordinateSystem;if(!e||"cartesian2d"!==e.type&&"polar"!==e.type)a.push(t);else{var i=e.getBaseAxis();if("category"===i.type){var n=i.dim+"_"+i.index;o[n]||(o[n]={categoryAxis:i,valueAxis:e.getOtherAxis(i),series:[]},r.push({axisDim:i.dim,axisIndex:i.index})),o[n].series.push(t)}else a.push(t)}}),{seriesGroupByCategoryAxis:o,other:a,meta:r}}(t);return{value:M([function(t){var h=[];return E(t,function(t,e){var i=t.categoryAxis,n=t.valueAxis.dim,o=[" "].concat(N(t.series,function(t){return t.name})),a=[i.model.getCategories()];E(t.series,function(t){a.push(t.getRawData().mapArray(n,function(t){return t}))});for(var r=[o.join(fA)],s=0;st[1]&&t.reverse(),t}function AA(t,e){return Ko(t,e,{includeMainTypes:SA})}IA.setOutputRanges=function(t,e){this.matchOutputRanges(t,e,function(t,e,i){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var n=kA[t.brushType](0,i,e);t.__rangeOffset={offset:NA[t.brushType](n.values,t.range,[1,1]),xyMinMax:n.xyMinMax}}})},IA.matchOutputRanges=function(t,n,o){xA(t,function(i){var t=this.findTargetInfo(i,n);t&&!0!==t&&E(t.coordSyses,function(t){var e=kA[i.brushType](1,t,i.range);o(i,e.values,t,n)})},this)},IA.setInputRanges=function(t,o){xA(t,function(t){var e=this.findTargetInfo(t,o);if(t.range=t.range||[],e&&!0!==e){t.panelId=e.panelId;var i=kA[t.brushType](0,e.coordSys,t.coordRange),n=t.__rangeOffset;t.range=n?NA[t.brushType](i.values,n.offset,function(t,e){var i=EA(t),n=EA(e),o=[i[0]/n[0],i[1]/n[1]];return isNaN(o[0])&&(o[0]=1),isNaN(o[1])&&(o[1]=1),o}(i.xyMinMax,n.xyMinMax)):i.values}},this)},IA.makePanelOpts=function(i,n){return N(this._targetInfoList,function(t){var e=t.getPanelRect();return{panelId:t.panelId,defaultBrushType:n&&n(t),clipPath:Qb(e),isTargetByCursor:eS(e,i,t.coordSysModel),getLinearBrushOtherExtent:tS(e)}})},IA.controlSeries=function(t,e,i){var n=this.findTargetInfo(t,i);return!0===n||n&&0<=_A(n.coordSyses,e.coordinateSystem)},IA.findTargetInfo=function(t,e){for(var i=this._targetInfoList,n=AA(e,t),o=0;on[1]&&(n[1]=e[1])})}),n[1]c[1];if(r&&!s&&!l)return!0;r&&(n=!0),s&&(e=!0),l&&(i=!0)}return n&&e&&i}):YA(h,function(t){if("empty"===o)i.setData(u=u.map(t,function(t){return function(t){return t>=c[0]&&t<=c[1]}(t)?t:NaN}));else{var e={};e[t]=c,u.selectRange(e)}}),YA(h,function(t){u.setApproximateExtent(c,t)}))})}}};var KA=E,$A=ZA,JA=If({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null,minSpan:null,maxSpan:null,minValueSpan:null,maxValueSpan:null,rangeMode:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var n=QA(t);this.settledOption=n,this.mergeDefaultAndTheme(t,i),this.doInit(n)},mergeOption:function(t){var e=QA(t);m(this.option,t,!0),m(this.settledOption,e,!0),this.doInit(e)},doInit:function(t){var i=this.option;v.canvasSupported||(i.realtime=!1),this._setDefaultThrottle(t),tD(this,t);var n=this.settledOption;KA([["start","startValue"],["end","endValue"]],function(t,e){"value"===this._rangePropMode[e]&&(i[t[0]]=n[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var r=this._axisProxies;this.eachTargetAxis(function(t,e,i,n){var o=this.dependentModels[t.axis][e],a=o.__dzAxisProxy||(o.__dzAxisProxy=new XA(t.name,e,this,n));r[t.name+"_"+e]=a},this)},_resetTarget:function(){var i=this.option,t=this._judgeAutoMode();$A(function(t){var e=t.axisIndex;i[e]=Vo(i[e])},this),"axisIndex"===t?this._autoSetAxisIndex():"orient"===t&&this._autoSetOrient()},_judgeAutoMode:function(){var e=this.option,i=!1;$A(function(t){null!=e[t.axisIndex]&&(i=!0)},this);var t=e.orient;return null==t&&i?"orient":i?void 0:(null==t&&(e.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var a=!0,e=this.get("orient",!0),r=this.option,t=this.dependentModels;if(a){var i="vertical"===e?"y":"x";t[i+"Axis"].length?(r[i+"AxisIndex"]=[0],a=!1):KA(t.singleAxis,function(t){a&&t.get("orient",!0)===e&&(r.singleAxisIndex=[t.componentIndex],a=!1)})}a&&$A(function(t){if(a){var e=[],i=this.dependentModels[t.axis];if(i.length&&!e.length)for(var n=0,o=i.length;ne[0][1]&&(e[0][1]=a[0]),a[1]e[1][1]&&(e[1][1]=a[1])}return e&&FD(e)}};function FD(t){return new Di(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var WD=["#ddd"];If({type:"brush",dependencies:["geo","grid","xAxis","yAxis","parallel","series"],defaultOption:{toolbox:null,brushLink:null,seriesIndex:"all",geoIndex:null,xAxisIndex:null,yAxisIndex:null,brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(120,140,180,0.3)",borderColor:"rgba(120,140,180,0.8)"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},areas:[],brushType:null,brushOption:{},coordInfoList:[],optionUpdated:function(t,e){var i=this.option;e||DD(i,t,["inBrush","outOfBrush"]);var n=i.inBrush=i.inBrush||{};i.outOfBrush=i.outOfBrush||{color:WD},n.hasOwnProperty("liftZ")||(n.liftZ=5)},setAreas:function(t){t&&(this.areas=N(t,function(t){return HD(this.option,t)},this))},setBrushOption:function(t){this.brushOption=HD(this.option,t),this.brushType=this.brushOption.brushType}});function HD(t,e){return m({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new Cl(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}function ZD(t,e,i,n){n&&n.$from===t.id||this._brushController.setPanels(t.brushTargetManager.makePanelOpts(i)).enableBrush(t.brushOption).updateCovers(t.areas.slice())}Tf({type:"brush",init:function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new Sb(e.getZr())).on("brush",A(this._onBrush,this)).mount()},render:function(t){return this.model=t,ZD.apply(this,arguments)},updateTransform:function(t,e){return RD(e),ZD.apply(this,arguments)},updateView:ZD,dispose:function(){this._brushController.dispose()},_onBrush:function(t,e){var i=this.model.id;this.model.brushTargetManager.setOutputRanges(t,this.ecModel),e.isEnd&&!e.removeOnClick||this.api.dispatchAction({type:"brush",brushId:i,areas:L(t),$from:i}),e.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:i,areas:L(t),$from:i})}}),xf({type:"brush",event:"brush"},function(e,t){t.eachComponent({mainType:"brush",query:e},function(t){t.setAreas(e.areas)})}),xf({type:"brushSelect",event:"brushSelected",update:"none"},function(){}),xf({type:"brushEnd",event:"brushEnd",update:"none"},function(){});var UD=Nc.toolbox.brush;function XD(t,e,i){this.model=t,this.ecModel=e,this.api=i,this._brushType,this._brushMode}XD.defaultOption={show:!0,type:["rect","polygon","lineX","lineY","keep","clear"],icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:L(UD.title)};var YD=XD.prototype;YD.render=YD.updateView=function(e,t,i){var n,o,a;t.eachComponent({mainType:"brush"},function(t){n=t.brushType,o=t.brushOption.brushMode||"single",a|=t.areas.length}),this._brushType=n,this._brushMode=o,E(e.get("type",!0),function(t){e.setIconStatus(t,("keep"===t?"multiple"===o:"clear"===t?a:t===n)?"emphasis":"normal")})},YD.getIcons=function(){var t=this.model,e=t.get("icon",!0),i={};return E(t.get("type",!0),function(t){e[t]&&(i[t]=e[t])}),i},YD.onclick=function(t,e,i){var n=this._brushType,o=this._brushMode;"clear"===i?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===i?n:n!==i&&i,brushMode:"keep"===i?"multiple"===o?"single":"multiple":o}})},QT("brush",XD),vf(function(t,e){var i=t&&t.brush;if(O(i)||(i=i?[i]:[]),i.length){var n=[];E(i,function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(n=n.concat(e))});var o=t&&t.toolbox;O(o)&&(o=o[0]),o||(o={feature:{}},t.toolbox=[o]);var a=o.feature||(o.feature={}),r=a.brush||(a.brush={}),s=r.type||(r.type=[]);s.push.apply(s,n),function(i){var e={};E(i,function(t){e[t]=1}),i.length=0,E(e,function(t,e){i.push(e)})}(s),e&&!s.length&&s.push.apply(s,MD)}}),If({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),Tf({type:"title",render:function(t,e,i){if(this.group.removeAll(),t.get("show")){var n=this.group,o=t.getModel("textStyle"),a=t.getModel("subtextStyle"),r=t.get("textAlign"),s=H(t.get("textBaseline"),t.get("textVerticalAlign")),l=new Ur({style:nl({},o,{text:t.get("text"),textFill:o.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new Ur({style:nl({},a,{text:h,textFill:a.getTextColor(),y:u.height+t.get("itemGap"),textVerticalAlign:"top"},{disableBox:!0}),z2:10}),d=t.get("link"),f=t.get("sublink"),p=t.get("triggerEvent",!0);l.silent=!d&&!p,c.silent=!f&&!p,d&&l.on("click",function(){window.open(d,"_"+t.get("target"))}),f&&c.on("click",function(){window.open(f,"_"+t.get("subtarget"))}),l.eventData=c.eventData=p?{componentType:"title",componentIndex:t.componentIndex}:null,n.add(l),h&&n.add(c);var g=n.getBoundingRect(),m=t.getBoxLayoutParams();m.width=g.width,m.height=g.height;var v=wu(m,{width:i.getWidth(),height:i.getHeight()},t.get("padding"));r||("middle"===(r=t.get("left")||t.get("right"))&&(r="center"),"right"===r?v.x+=v.width:"center"===r&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),n.attr("position",[v.x,v.y]);var y={textAlign:r,textVerticalAlign:s};l.setStyle(y),c.setStyle(y),g=n.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var w=new rs({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,subPixelOptimize:!0,silent:!0});n.add(w)}}});function jD(t){var e=t.itemStyle||(t.itemStyle={}),i=e.emphasis||(e.emphasis={}),n=t.label||t.label||{},o=n.normal||(n.normal={}),a={normal:1,emphasis:1};E(n,function(t,e){a[e]||qD(o,e)||(o[e]=t)}),i.label&&!qD(n,"emphasis")&&(n.emphasis=i.label,delete i.label)}function qD(t,e){return t.hasOwnProperty(e)}Lu.registerSubTypeDefaulter("timeline",function(){return"slider"}),xf({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},function(t,e){var i=e.getComponent("timeline");return i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get("loop",!0)&&i.isIndexMax()&&i.setPlayState(!1)),e.resetOption("timeline"),D({currentIndex:i.option.currentIndex},t)}),xf({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},function(t,e){var i=e.getComponent("timeline");i&&null!=t.playState&&i.setPlayState(t.playState)});var KD=Lu.extend({type:"timeline",layoutMode:"box",defaultOption:{zlevel:0,z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},init:function(t,e,i){this._data,this._names,this.mergeDefaultAndTheme(t,i),this._initData()},mergeOption:function(t){KD.superApply(this,"mergeOption",arguments),this._initData()},setCurrentIndex:function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(e<=t&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},getCurrentIndex:function(){return this.option.currentIndex},isIndexMax:function(){return this.getCurrentIndex()>=this._data.count()-1},setPlayState:function(t){this.option.autoPlay=!!t},getPlayState:function(){return!!this.option.autoPlay},_initData:function(){var t=this.option,e=t.data||[],i=t.axisType,o=this._names=[];if("category"===i){var a=[];E(e,function(t,e){var i,n=Wo(t);z(t)?(i=L(t)).value=e:i=e,a.push(i),R(n)||null!=n&&!isNaN(n)||(n=""),o.push(n+"")}),e=a}var n={category:"ordinal",time:"time"}[i]||"number";(this._data=new Xf([{name:"value",type:n}],this)).initData(e,o)},getData:function(){return this._data},getCategories:function(){if("category"===this.get("axisType"))return this._names.slice()}});b(KD.extend({type:"timeline.slider",defaultOption:{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"emptyCircle",symbolSize:10,lineStyle:{show:!0,width:2,color:"#304654"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#304654"},itemStyle:{color:"#304654",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:13,color:"#c23531",borderWidth:5,borderColor:"rgba(194,53,49, 0.5)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:22,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z",prevIcon:"path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z",color:"#304654",borderColor:"#304654",borderWidth:1},emphasis:{label:{show:!0,color:"#c23531"},itemStyle:{color:"#c23531"},controlStyle:{color:"#c23531",borderColor:"#c23531",borderWidth:2}},data:[]}}),Uh);function $D(t,e,i,n){Vg.call(this,t,e,i),this.type=n||"value",this.model=null}var JD=pc.extend({type:"timeline"});$D.prototype={constructor:$D,getLabelModel:function(){return this.model.getModel("label")},isHorizontal:function(){return"horizontal"===this.model.get("orient")}},w($D,Vg);var QD=A,tC=E,eC=Math.PI;function iC(t,e,i,n,o,a){var r=e.get("color");o?(o.setColor(r),i.add(o),a&&a.onUpdate(o)):((o=_g(t.get("symbol"),-1,-1,2,2,r)).setStyle("strokeNoScale",!0),i.add(o),a&&a.onCreate(o));var s=e.getItemStyle(["color","symbol","symbolSize"]);o.setStyle(s),n=m({rectHover:!0,z2:100},n,!0);var l=t.get("symbolSize");(l=l instanceof Array?l.slice():[+l,+l])[0]/=2,l[1]/=2,n.scale=l;var u=t.get("symbolOffset");if(u){var h=n.position=n.position||[0,0];h[0]+=Rl(u[0],l[0]),h[1]+=Rl(u[1],l[1])}var c=t.get("symbolRotate");return n.rotation=(c||0)*Math.PI/180||0,o.attr(n),o.updateTransform(),o}function nC(t,e,i,n,o){if(!t.dragging){var a=n.getModel("checkpointStyle"),r=i.dataToCoord(n.getData().get(["value"],e));o||!a.get("animation",!0)?t.attr({position:[r,0]}):(t.stopAnimation(!0),t.animateTo({position:[r,0]},a.get("animationDuration",!0),a.get("animationEasing",!0)))}}JD.extend({type:"timeline.slider",init:function(t,e){this.api=e,this._axis,this._viewRect,this._timer,this._currentPointer,this._mainGroup,this._labelGroup},render:function(e,t,i,n){if(this.model=e,this.api=i,this.ecModel=t,this.group.removeAll(),e.get("show",!0)){var o=this._layout(e,i),a=this._createGroup("mainGroup"),r=this._createGroup("labelGroup"),s=this._axis=this._createAxis(o,e);e.formatTooltip=function(t){return au(s.scale.getLabel(t))},tC(["AxisLine","AxisTick","Control","CurrentPointer"],function(t){this["_render"+t](o,a,s,e)},this),this._renderAxisLabel(o,r,s,e),this._position(o,e)}this._doPlayStop()},remove:function(){this._clearTimer(),this.group.removeAll()},dispose:function(){this._clearTimer()},_layout:function(t,e){var i=t.get("label.position"),n=t.get("orient"),o=function(t,e){return wu(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e);null==i||"auto"===i?i="horizontal"===n?o.y+o.height/2n[1]&&(i=n[1]),i"),o&&(a+=aC(o),null!=i&&(a+=" : ")),null!=i&&(a+=aC(n)),a},getData:function(){return this._data},setData:function(t){this._data=t}});b(sC,Uh),sC.extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{show:!0,position:"inside"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}}});var lC=_;function uC(t,e,i,n,o,a){var r=[],s=dp(e,n)?e.getCalculationInfo("stackResultDimension"):n,l=mC(e,s,t),u=e.indicesOfNearest(s,l)[0];r[o]=e.get(i,u),r[a]=e.get(s,u);var h=e.get(n,u),c=Vl(e.get(n,u));return 0<=(c=Math.min(c,20))&&(r[a]=+r[a].toFixed(c)),[r,h]}var hC=T,cC={min:hC(uC,"min"),max:hC(uC,"max"),average:hC(uC,"average")};function dC(t,e){var i=t.getData(),n=t.coordinateSystem;if(e&&!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!O(e.coord)&&n){var o=n.dimensions,a=fC(e,i,n,t);if((e=L(e)).type&&cC[e.type]&&a.baseAxis&&a.valueAxis){var r=lC(o,a.baseAxis.dim),s=lC(o,a.valueAxis.dim),l=cC[e.type](i,a.baseDataDim,a.valueDataDim,r,s);e.coord=l[0],e.value=l[1]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)cC[u[h]]&&(u[h]=mC(i,i.mapDimension(o[h]),u[h]));e.coord=u}}return e}function fC(t,e,i,n){var o={};return null!=t.valueIndex||null!=t.valueDim?(o.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,o.valueAxis=i.getAxis(function(t,e){var i=t.getData(),n=i.dimensions;e=i.getDimension(e);for(var o=0;oi[o],f=[-h.x,-h.y];e||(f[n]=s.position[n]);var p=[0,0],g=[-c.x,-c.y],m=H(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?g[n]+=i[o]-c[o]:p[n]+=c[o]+m);g[1-n]+=h[a]/2-c[a]/2,s.attr("position",f),l.attr("position",p),u.attr("position",g);var v={x:0,y:0};if(v[o]=d?i[o]:h[o],v[a]=Math.max(h[a],c[a]),v[r]=Math.min(0,c[r]+g[1-n]),l.__rectSize=i[o],d){var y={x:0,y:0};y[o]=Math.max(i[o]-c[o]-m,0),y[a]=v[a],l.setClipPath(new rs({shape:y})),l.__rectSize=y[o]}else u.eachChild(function(t){t.attr({invisible:!0,silent:!0})});var x=this._getPageInfo(t);return null!=x.pageIndex&&cl(s,{position:x.contentPosition},d&&t),this._updatePageInfoView(t,x),v},_pageGo:function(t,e,i){var n=this._getPageInfo(e)[t];null!=n&&i.dispatchAction({type:"legendScroll",scrollDataIndex:n,legendId:e.id})},_updatePageInfoView:function(n,o){var a=this._controllerGroup;E(["pagePrev","pageNext"],function(t){var e=null!=o[t+"DataIndex"],i=a.childOfName(t);i&&(i.setStyle("fill",e?n.get("pageIconColor",!0):n.get("pageIconInactiveColor",!0)),i.cursor=e?"pointer":"default")});var t=a.childOfName("pageText"),e=n.get("pageFormatter"),i=o.pageIndex,r=null!=i?i+1:0,s=o.pageCount;t&&e&&t.setStyle("text",R(e)?e.replace("{current}",r).replace("{total}",s):e({current:r,total:s}))},_getPageInfo:function(t){var e=t.get("scrollDataIndex",!0),i=this.getContentGroup(),n=this._containerGroup.__rectSize,o=t.getOrient().index,a=UC[o],r=XC[o],s=this._findTargetItemIndex(e),l=i.children(),u=l[s],h=l.length,c=h?1:0,d={contentPosition:i.position.slice(),pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return d;var f=y(u);d.contentPosition[o]=-f.s;for(var p=s+1,g=f,m=f,v=null;p<=h;++p)(!(v=y(l[p]))&&m.e>g.s+n||v&&!x(v,g.s))&&(g=m.i>g.i?m:v)&&(null==d.pageNextDataIndex&&(d.pageNextDataIndex=g.i),++d.pageCount),m=v;for(p=s-1,g=f,m=f,v=null;-1<=p;--p)(v=y(l[p]))&&x(m,v.s)||!(g.i=e&&t.s<=e+n}},_findTargetItemIndex:function(n){return this._showController?(this.getContentGroup().eachChild(function(t,e){var i=t.__legendDataIndex;null==a&&null!=i&&(a=e),i===n&&(o=e)}),null!=o?o:a):0;var o,a}});xf("legendScroll","legendscroll",function(t,e){var i=t.scrollDataIndex;null!=i&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},function(t){t.setScrollDataIndex(i)})});JA.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}});var jC=rs,qC=El,KC=Bl,$C=A,JC=E,QC="horizontal",tL="vertical",eL=["line","bar","candlestick","scatter"],iL=eD.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){iL.superApply(this,"render",arguments),Lc(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),!1!==this.dataZoomModel.get("show")?(n&&"dataZoom"===n.type&&n.from===this.uid||this._buildView(),this._updateView()):this.group.removeAll()},remove:function(){iL.superApply(this,"remove",arguments),kc(this,"_dispatchZoomAction")},dispose:function(){iL.superApply(this,"dispose",arguments),kc(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new Ci;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},o=this._orient===QC?{right:n.width-i.x-i.width,top:n.height-30-7,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=Mu(t.option);E(["right","top","width","height"],function(t){"ph"===a[t]&&(a[t]=o[t])});var r=wu(a,n,t.padding);this._location={x:r.x,y:r.y},this._size=[r.width,r.height],this._orient===tL&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),o=n&&n.get("inverse"),a=this._displayables.barGroup,r=(this._dataShadowInfo||{}).otherAxisInverse;a.attr(i!==QC||o?i===QC&&o?{scale:r?[-1,1]:[-1,-1]}:i!==tL||o?{scale:r?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:r?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:r?[1,1]:[1,-1]});var s=t.getBoundingRect([a]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size,i=this._displayables.barGroup;i.add(new jC({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40})),i.add(new jC({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:A(this._onClickPanelClick,this)}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),o=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=o){var a=n.getDataExtent(o),r=.3*(a[1]-a[0]);a=[a[0]-r,a[1]+r];var s,l=[0,e[1]],u=[0,e[0]],h=[[e[0],0],[0,0]],c=[],d=u[1]/(n.count()-1),f=0,p=Math.round(n.count()/e[0]);n.each([o],function(t,e){if(0e[0]||i[1]<0||i[1]>e[1])){var n=this._handleEnds,o=(n[0]+n[1])/2,a=this._updateInterval("all",i[0]-o);this._updateView(),a&&this._dispatchZoomAction()}},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_findCoordRect:function(){var i;if(JC(this.getTargetCoordInfo(),function(t){if(!i&&t.length){var e=t[0].model.coordinateSystem;i=e.getRect&&e.getRect()}}),!i){var t=this.api.getWidth(),e=this.api.getHeight();i={x:.2*t,y:.2*e,width:.6*t,height:.6*e}}return i}});function nL(t){return"vertical"===t?"ns-resize":"ew-resize"}JA.extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}});var oL="\0_ec_dataZoom_roams";function aL(t,n){var e=sL(t),o=n.dataZoomId,a=n.coordId;E(e,function(t,e){var i=t.dataZoomInfos;i[o]&&_(n.allCoordIds,a)<0&&(delete i[o],t.count--)}),lL(e);var i=e[a];i||((i=e[a]={coordId:a,dataZoomInfos:{},count:0}).controller=function(t,r){var e=new zy(t.getZr());return E(["pan","zoom","scrollMove"],function(a){e.on(a,function(n){var o=[];E(r.dataZoomInfos,function(t){if(n.isAvailableBehavior(t.dataZoomModel.option)){var e=(t.getRange||{})[a],i=e&&e(r.controller,n);!t.dataZoomModel.get("disabled",!0)&&i&&o.push({dataZoomId:t.dataZoomId,start:i[0],end:i[1]})}}),o.length&&r.dispatchAction(o)})}),e}(t,i),i.dispatchAction=T(uL,t)),i.dataZoomInfos[o]||i.count++,i.dataZoomInfos[o]=n;var r=function(t){var n,o={type_true:2,type_move:1,type_false:0,type_undefined:-1},a=!0;return E(t,function(t){var e=t.dataZoomModel,i=!e.get("disabled",!0)&&(!e.get("zoomLock",!0)||"move");o["type_"+n]"],O(t)&&(t=t.slice(),n=!0),o=e?t:n?[u(t[0]),u(t[1])]:u(t),R(l)?l.replace("{value}",n?o[0]:o).replace("{value2}",n?o[1]:o):C(l)?n?l(t[0],t[1]):l(t):n?t[0]===s[0]?i[0]+" "+o[1]:t[1]===s[1]?i[1]+" "+o[0]:o[0]+" - "+o[1]:o;function u(t){return t===s[0]?"min":t===s[1]?"max":(+t).toFixed(Math.min(r,20))}},resetExtent:function(){var t=this.option,e=TL([t.min,t.max]);this._dataExtent=e},getDataDimension:function(t){var e=this.option.dimension,i=t.dimensions;if(null!=e||i.length){if(null!=e)return t.getDimension(e);for(var n=t.dimensions,o=n.length-1;0<=o;o--){var a=n[o];if(!t.getDimensionInfo(a).isCalculationCoord)return a}}},getExtent:function(){return this._dataExtent.slice()},completeVisualOption:function(){var t=this.ecModel,e=this.option,i={inRange:e.inRange,outOfRange:e.outOfRange},n=e.target||(e.target={}),o=e.controller||(e.controller={});m(n,i),m(o,i);var u=this.isCategory();function a(n){ML(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")},IL(this.stateList,function(t){var e=n[t];if(R(e)){var i=_L(e,"active",u);i?(n[t]={},n[t][e]=i):delete n[t]}},this)}a.call(this,n),a.call(this,o),function(t,e,i){var n=t[e],o=t[i];n&&!o&&(o=t[i]={},IL(n,function(t,e){if(f_.isValidType(e)){var i=_L(e,"inactive",u);null!=i&&(o[e]=i,"color"!==e||o.hasOwnProperty("opacity")||o.hasOwnProperty("colorAlpha")||(o.opacity=[0,0]))}}))}.call(this,n,"inRange","outOfRange"),function(a){var r=(a.inRange||{}).symbol||(a.outOfRange||{}).symbol,s=(a.inRange||{}).symbolSize||(a.outOfRange||{}).symbolSize,l=this.get("inactiveColor");IL(this.stateList,function(t){var e=this.itemSize,i=a[t];null==(i=i||(a[t]={color:u?l:[l]})).symbol&&(i.symbol=r&&L(r)||(u?"roundRect":["roundRect"])),null==i.symbolSize&&(i.symbolSize=s&&L(s)||(u?e[0]:[e[0],e[0]])),i.symbol=bL(i.symbol,function(t){return"none"===t||"square"===t?"roundRect":t});var n=i.symbolSize;if(null!=n){var o=-1/0;SL(n,function(t){oe[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},completeVisualOption:function(){DL.prototype.completeVisualOption.apply(this,arguments),E(this.stateList,function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=0)},this)},setSelected:function(t){this.option.range=t.slice(),this._resetRange()},getSelected:function(){var t=this.getExtent(),e=Bl((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]=i[1]||t<=e[1])?"inRange":"outOfRange"},findTargetDataIndices:function(n){var o=[];return this.eachTargetSeries(function(t){var i=[],e=t.getData();e.each(this.getDataDimension(e),function(t,e){n[0]<=t&&t<=n[1]&&i.push(e)},this),o.push({seriesId:t.id,dataIndex:i})},this),o},getVisualMeta:function(i){var t=kL(this,"outOfRange",this.getExtent()),e=kL(this,"inRange",this.option.range.slice()),n=[];function o(t,e){n.push({value:t,color:i(t,e)})}for(var a=0,r=0,s=e.length,l=t.length;rt[1])break;i.push({color:this.getControllerVisual(a,"color",e),offset:o/100})}return i.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),i},_createBarPoints:function(t,e){var i=this.visualMapModel.itemSize;return[[i[0]-e[0],t[0]],[i[0],t[0]],[i[0],t[1]],[i[0]-e[1],t[1]]]},_createBarGroup:function(t){var e=this._orient,i=this.visualMapModel.get("inverse");return new Ci("horizontal"!==e||i?"horizontal"===e&&i?{scale:"bottom"===t?[-1,1]:[1,1],rotation:-Math.PI/2}:"vertical"!==e||i?{scale:"left"===t?[1,1]:[-1,1]}:{scale:"left"===t?[1,-1]:[-1,-1]}:{scale:"bottom"===t?[1,1]:[-1,1],rotation:Math.PI/2})},_updateHandle:function(n,o){if(this._useHandle){var a=this._shapes,r=this.visualMapModel,s=a.handleThumbs,l=a.handleLabels;RL([0,1],function(t){var e=s[t];e.setStyle("fill",o.handlesColor[t]),e.position[1]=n[t];var i=pl(a.handleLabelPoints[t],fl(e,this.group));l[t].setStyle({x:i[0],y:i[1],text:r.formatValueText(this._dataInterval[t]),textVerticalAlign:"middle",textAlign:this._applyTransform("horizontal"===this._orient?0===t?"bottom":"top":"left",a.barGroup)})},this)}},_showIndicator:function(t,e,i,n){var o=this.visualMapModel,a=o.getExtent(),r=o.itemSize,s=[0,r[1]],l=EL(t,a,s,!0),u=this._shapes,h=u.indicator;if(h){h.position[1]=l,h.attr("invisible",!1),h.setShape("points",function(t,e,i,n){return t?[[0,-zL(e,BL(i,0))],[6,0],[0,zL(e,BL(n-i,0))]]:[[0,0],[5,-5],[5,5]]}(!!i,n,l,r[1]));var c=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0});h.setStyle("fill",c);var d=pl(u.indicatorLabelPoint,fl(h,this.group)),f=u.indicatorLabel;f.attr("invisible",!1);var p=this._applyTransform("left",u.barGroup),g=this._orient;f.setStyle({text:(i||"")+o.formatValueText(e),textVerticalAlign:"horizontal"===g?p:"middle",textAlign:"horizontal"===g?"center":p,x:d[0],y:d[1]})}},_enableHoverLinkToSeries:function(){var n=this;this._shapes.barGroup.on("mousemove",function(t){if(n._hovering=!0,!n._dragging){var e=n.visualMapModel.itemSize,i=n._applyTransform([t.offsetX,t.offsetY],n._shapes.barGroup,!0,!0);i[1]=zL(BL(0,i[1]),e[1]),n._doHoverLinkToSeries(i[1],0<=i[0]&&i[0]<=e[0])}}).on("mouseout",function(){n._hovering=!1,n._dragging||n._clearHoverLinkToSeries()})},_enableHoverLinkFromSeries:function(){var t=this.api.getZr();this.visualMapModel.option.hoverLink?(t.on("mouseover",this._hoverLinkFromSeriesMouseOver,this),t.on("mouseout",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},_doHoverLinkToSeries:function(t,e){var i=this.visualMapModel,n=i.itemSize;if(i.option.hoverLink){var o=[0,n[1]],a=i.getExtent();t=zL(BL(o[0],t),o[1]);var r=function(t,e,i){var n=6,o=t.get("hoverLinkDataSize");o&&(n=EL(o,e,i,!0)/2);return n}(i,a,o),s=[t-r,t+r],l=EL(t,o,a,!0),u=[EL(s[0],o,a,!0),EL(s[1],o,a,!0)];s[0] ",r):this._showIndicator(l,l,"≈ ",r));var h=this._hoverLinkDataIndices,c=[];(e||FL(i))&&(c=this._hoverLinkDataIndices=i.findTargetDataIndices(u));var d=function(t,e){var i={},n={};return o(t||[],i),o(e||[],n,i),[a(i),a(n)];function o(t,e,i){for(var n=0,o=t.length;ni&&n([i,e[0]],"outOfRange"),n(e.slice()),i=e[1])},this),{stops:a,outerColors:r}}function n(t,e){var i=s.getRepresentValue({interval:t});e=e||s.getValueState(i);var n=o(i,e);t[0]===-1/0?r[0]=n:t[1]===1/0?r[1]=n:a.push({value:t[0],color:n},{value:t[1],color:n})}}}),ZL={splitNumber:function(){var t=this.option,e=this._pieceList,i=Math.min(t.precision,20),n=this.getExtent(),o=t.splitNumber;o=Math.max(parseInt(o,10),1),t.splitNumber=o;for(var a=(n[1]-n[0])/o;+a.toFixed(i)!==a&&i<5;)i++;t.precision=i,a=+a.toFixed(i);var r=0;t.minOpen&&e.push({index:r++,interval:[-1/0,n[0]],close:[0,0]});for(var s=n[0],l=r+o;r","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,i)},this)}};function UL(t,e){var i=t.inverse;("vertical"===t.orient?!i:i)&&e.reverse()}PL.extend({type:"visualMap.piecewise",doRender:function(){var a=this.group;a.removeAll();var r=this.visualMapModel,s=r.get("textGap"),t=r.textStyleModel,l=t.getFont(),u=t.getTextColor(),h=this._getItemAlign(),c=r.itemSize,e=this._getViewData(),i=e.endsText,d=W(r.get("showLabel",!0),!i);i&&this._renderEndsText(a,i[0],c,d,h),E(e.viewPieceList,function(t){var e=t.piece,i=new Ci;i.onclick=A(this._onItemClick,this,e),this._enableHoverLink(i,t.indexInModelPieceList);var n=r.getRepresentValue(e);if(this._createItemSymbol(i,n,[0,0,c[0],c[1]]),d){var o=this.visualMapModel.getValueState(n);i.add(new Ur({style:{x:"right"===h?-s:c[0]+s,y:c[1]/2,text:e.text,textVerticalAlign:"middle",textAlign:h,textFont:l,textFill:u,opacity:"outOfRange"===o?.5:1}}))}a.add(i)},this),i&&this._renderEndsText(a,i[1],c,d,h),_u(r.get("orient"),a,r.get("itemGap")),this.renderBackground(a),this.positionGroup(a)},_enableHoverLink:function(t,i){function e(t){var e=this.visualMapModel;e.option.hoverLink&&this.api.dispatchAction({type:t,batch:OL(e.findTargetDataIndices(i),e)})}t.on("mouseover",A(e,this,"highlight")).on("mouseout",A(e,this,"downplay"))},_getItemAlign:function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return NL(t,this.api,t.itemSize);var i=e.align;return i&&"auto"!==i||(i="left"),i},_renderEndsText:function(t,e,i,n,o){if(e){var a=new Ci,r=this.visualMapModel.textStyleModel;a.add(new Ur({style:{x:n?"right"===o?i[0]:0:i[0]/2,y:i[1]/2,textVerticalAlign:"middle",textAlign:n?o:"center",text:e,textFont:r.getFont(),textFill:r.getTextColor()}})),t.add(a)}},_getViewData:function(){var t=this.visualMapModel,e=N(t.getPieceList(),function(t,e){return{piece:t,indexInModelPieceList:e}}),i=t.get("text"),n=t.get("orient"),o=t.get("inverse");return("horizontal"===n?o:!o)?e.reverse():i=i&&i.slice().reverse(),{viewPieceList:e,endsText:i}},_createItemSymbol:function(t,e,i){t.add(_g(this.getControllerVisual(e,"symbol"),i[0],i[1],i[2],i[3],this.getControllerVisual(e,"color")))},_onItemClick:function(t){var e=this.visualMapModel,i=e.option,n=L(i.selected),o=e.getSelectedMapKey(t);"single"===i.selectedMode?(n[o]=!0,E(n,function(t,e){n[e]=e===o})):n[o]=!n[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:n})}});vf(pL);var XL,YL="urn:schemas-microsoft-com:vml",jL="undefined"==typeof window?null:window,qL=!1,KL=jL&&jL.document;function $L(t){return XL(t)}if(KL&&!v.canvasSupported)try{KL.namespaces.zrvml||KL.namespaces.add("zrvml",YL),XL=function(t){return KL.createElement("')}}catch(t){XL=function(t){return KL.createElement("<"+t+' xmlns="'+YL+'" class="zrvml">')}}var JL,QL=rr.CMD,tk=Math.round,ek=Math.sqrt,ik=Math.abs,nk=Math.cos,ok=Math.sin,ak=Math.max;if(!v.canvasSupported){var rk=",",sk="progid:DXImageTransform.Microsoft",lk=21600,uk=lk/2,hk=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=lk+","+lk,t.coordorigin="0,0"},ck=function(t,e,i){return"rgb("+[t,e,i].join(",")+")"},dk=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},fk=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},pk=function(t,e,i){return 1e5*(parseFloat(t)||0)+1e3*(parseFloat(e)||0)+i},gk=Yn,mk=function(t,e,i){var n=Fe(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=ck(n[0],n[1],n[2]),t.opacity=i*n[3])},vk=function(t,e,i,n){var o="fill"===e,a=t.getElementsByTagName(e)[0];null!=i[e]&&"none"!==i[e]&&(o||!o&&i.lineWidth)?(t[o?"filled":"stroked"]="true",i[e]instanceof cs&&fk(t,a),a=a||$L(e),o?function(t,e,i){var n,o,a=e.fill;if(null!=a)if(a instanceof cs){var r,s=0,l=[0,0],u=0,h=1,c=i.getBoundingRect(),d=c.width,f=c.height;if("linear"===a.type){r="gradient";var p=i.transform,g=[a.x*d,a.y*f],m=[a.x2*d,a.y2*f];p&&(bt(g,g,p),bt(m,m,p));var v=m[0]-g[0],y=m[1]-g[1];(s=180*Math.atan2(v,y)/Math.PI)<0&&(s+=360),s<1e-6&&(s=0)}else{r="gradientradial";g=[a.x*d,a.y*f],p=i.transform;var x=i.scale,_=d,w=f;l=[(g[0]-c.x)/_,(g[1]-c.y)/w],p&&bt(g,g,p),_/=x[0]*lk,w/=x[1]*lk;var b=ak(_,w);u=0/b,h=2*a.r/b-u}var S=a.colorStops.slice();S.sort(function(t,e){return t.offset-e.offset});for(var M=S.length,I=[],T=[],A=0;A=c&&d<=i+1){for(var n=[],o=0;o=c&&d<=o+1)return rP(h,e.components,u,l);p[t]=e}else p[t]=void 0}var s;f++}for(;f<=e;){var r=a();if(r)return r}},pushComponent:function(t,e,i){var n=t[t.length-1];n&&n.added===e&&n.removed===i?t[t.length-1]={count:n.count+1,added:e,removed:i}:t.push({count:1,added:e,removed:i})},extractCommon:function(t,e,i,n){for(var o=e.length,a=i.length,r=t.newPos,s=r-n,l=0;r+1el día", + eventLimitText: "más", + noEventsMessage: "No hay eventos para mostrar" + }; + + var _m19 = { + code: "es", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Sig", + today: "Hoy", + month: "Mes", + week: "Semana", + day: "Día", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
el día", + eventLimitText: "más", + noEventsMessage: "No hay eventos para mostrar" + }; + + var _m20 = { + code: "et", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Eelnev", + next: "Järgnev", + today: "Täna", + month: "Kuu", + week: "Nädal", + day: "Päev", + list: "Päevakord" + }, + weekLabel: "näd", + allDayText: "Kogu päev", + eventLimitText: function (n) { + return "+ veel " + n; + }, + noEventsMessage: "Kuvamiseks puuduvad sündmused" + }; + + var _m21 = { + code: "eu", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Aur", + next: "Hur", + today: "Gaur", + month: "Hilabetea", + week: "Astea", + day: "Eguna", + list: "Agenda" + }, + weekLabel: "As", + allDayHtml: "Egun
osoa", + eventLimitText: "gehiago", + noEventsMessage: "Ez dago ekitaldirik erakusteko" + }; + + var _m22 = { + code: "fa", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "قبلی", + next: "بعدی", + today: "امروز", + month: "ماه", + week: "هفته", + day: "روز", + list: "برنامه" + }, + weekLabel: "هف", + allDayText: "تمام روز", + eventLimitText: function (n) { + return "بیش از " + n; + }, + noEventsMessage: "هیچ رویدادی به نمایش" + }; + + var _m23 = { + code: "fi", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Edellinen", + next: "Seuraava", + today: "Tänään", + month: "Kuukausi", + week: "Viikko", + day: "Päivä", + list: "Tapahtumat" + }, + weekLabel: "Vk", + allDayText: "Koko päivä", + eventLimitText: "lisää", + noEventsMessage: "Ei näytettäviä tapahtumia" + }; + + var _m24 = { + code: "fr", + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Aujourd'hui", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sem.", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + var _m25 = { + code: "fr-ch", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Courant", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sm", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + var _m26 = { + code: "fr", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Aujourd'hui", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sem.", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + var _m27 = { + code: "gl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Seg", + today: "Hoxe", + month: "Mes", + week: "Semana", + day: "Día", + list: "Axenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
o día", + eventLimitText: "máis", + noEventsMessage: "Non hai eventos para amosar" + }; + + var _m28 = { + code: "he", + dir: 'rtl', + buttonText: { + prev: "הקודם", + next: "הבא", + today: "היום", + month: "חודש", + week: "שבוע", + day: "יום", + list: "סדר יום" + }, + allDayText: "כל היום", + eventLimitText: "אחר", + noEventsMessage: "אין אירועים להצגה", + weekLabel: "שבוע" + }; + + var _m29 = { + code: "hi", + week: { + dow: 0, + doy: 6 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "पिछला", + next: "अगला", + today: "आज", + month: "महीना", + week: "सप्ताह", + day: "दिन", + list: "कार्यसूची" + }, + weekLabel: "हफ्ता", + allDayText: "सभी दिन", + eventLimitText: function (n) { + return "+अधिक " + n; + }, + noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए" + }; + + var _m30 = { + code: "hr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prijašnji", + next: "Sljedeći", + today: "Danas", + month: "Mjesec", + week: "Tjedan", + day: "Dan", + list: "Raspored" + }, + weekLabel: "Tje", + allDayText: "Cijeli dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nema događaja za prikaz" + }; + + var _m31 = { + code: "hu", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "vissza", + next: "előre", + today: "ma", + month: "Hónap", + week: "Hét", + day: "Nap", + list: "Napló" + }, + weekLabel: "Hét", + allDayText: "Egész nap", + eventLimitText: "további", + noEventsMessage: "Nincs megjeleníthető esemény" + }; + + var _m32 = { + code: "id", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "mundur", + next: "maju", + today: "hari ini", + month: "Bulan", + week: "Minggu", + day: "Hari", + list: "Agenda" + }, + weekLabel: "Mg", + allDayHtml: "Sehari
penuh", + eventLimitText: "lebih", + noEventsMessage: "Tidak ada acara untuk ditampilkan" + }; + + var _m33 = { + code: "is", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Fyrri", + next: "Næsti", + today: "Í dag", + month: "Mánuður", + week: "Vika", + day: "Dagur", + list: "Dagskrá" + }, + weekLabel: "Vika", + allDayHtml: "Allan
daginn", + eventLimitText: "meira", + noEventsMessage: "Engir viðburðir til að sýna" + }; + + var _m34 = { + code: "it", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Prec", + next: "Succ", + today: "Oggi", + month: "Mese", + week: "Settimana", + day: "Giorno", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Tutto il
giorno", + eventLimitText: function (n) { + return "+altri " + n; + }, + noEventsMessage: "Non ci sono eventi da visualizzare" + }; + + var _m35 = { + code: "ja", + buttonText: { + prev: "前", + next: "次", + today: "今日", + month: "月", + week: "週", + day: "日", + list: "予定リスト" + }, + weekLabel: "週", + allDayText: "終日", + eventLimitText: function (n) { + return "他 " + n + " 件"; + }, + noEventsMessage: "表示する予定はありません" + }; + + var _m36 = { + code: "ka", + week: { + dow: 1, + doy: 7 + }, + buttonText: { + prev: "წინა", + next: "შემდეგი", + today: "დღეს", + month: "თვე", + week: "კვირა", + day: "დღე", + list: "დღის წესრიგი" + }, + weekLabel: "კვ", + allDayText: "მთელი დღე", + eventLimitText: function (n) { + return "+ კიდევ " + n; + }, + noEventsMessage: "ღონისძიებები არ არის" + }; + + var _m37 = { + code: "kk", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Алдыңғы", + next: "Келесі", + today: "Бүгін", + month: "Ай", + week: "Апта", + day: "Күн", + list: "Күн тәртібі" + }, + weekLabel: "Не", + allDayText: "Күні бойы", + eventLimitText: function (n) { + return "+ тағы " + n; + }, + noEventsMessage: "Көрсету үшін оқиғалар жоқ" + }; + + var _m38 = { + code: "ko", + buttonText: { + prev: "이전달", + next: "다음달", + today: "오늘", + month: "월", + week: "주", + day: "일", + list: "일정목록" + }, + weekLabel: "주", + allDayText: "종일", + eventLimitText: "개", + noEventsMessage: "일정이 없습니다" + }; + + var _m39 = { + code: "lb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Zréck", + next: "Weider", + today: "Haut", + month: "Mount", + week: "Woch", + day: "Dag", + list: "Terminiwwersiicht" + }, + weekLabel: "W", + allDayText: "Ganzen Dag", + eventLimitText: "méi", + noEventsMessage: "Nee Evenementer ze affichéieren" + }; + + var _m40 = { + code: "lt", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Atgal", + next: "Pirmyn", + today: "Šiandien", + month: "Mėnuo", + week: "Savaitė", + day: "Diena", + list: "Darbotvarkė" + }, + weekLabel: "SAV", + allDayText: "Visą dieną", + eventLimitText: "daugiau", + noEventsMessage: "Nėra įvykių rodyti" + }; + + var _m41 = { + code: "lv", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Iepr.", + next: "Nāk.", + today: "Šodien", + month: "Mēnesis", + week: "Nedēļa", + day: "Diena", + list: "Dienas kārtība" + }, + weekLabel: "Ned.", + allDayText: "Visu dienu", + eventLimitText: function (n) { + return "+vēl " + n; + }, + noEventsMessage: "Nav notikumu" + }; + + var _m42 = { + code: "mk", + buttonText: { + prev: "претходно", + next: "следно", + today: "Денес", + month: "Месец", + week: "Недела", + day: "Ден", + list: "График" + }, + weekLabel: "Сед", + allDayText: "Цел ден", + eventLimitText: function (n) { + return "+повеќе " + n; + }, + noEventsMessage: "Нема настани за прикажување" + }; + + var _m43 = { + code: "ms", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Sebelum", + next: "Selepas", + today: "hari ini", + month: "Bulan", + week: "Minggu", + day: "Hari", + list: "Agenda" + }, + weekLabel: "Mg", + allDayText: "Sepanjang hari", + eventLimitText: function (n) { + return "masih ada " + n + " acara"; + }, + noEventsMessage: "Tiada peristiwa untuk dipaparkan" + }; + + var _m44 = { + code: "nb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Forrige", + next: "Neste", + today: "I dag", + month: "Måned", + week: "Uke", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Uke", + allDayText: "Hele dagen", + eventLimitText: "til", + noEventsMessage: "Ingen hendelser å vise" + }; + + var _m45 = { + code: "nl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Voorgaand", + next: "Volgende", + today: "Vandaag", + year: "Jaar", + month: "Maand", + week: "Week", + day: "Dag", + list: "Agenda" + }, + allDayText: "Hele dag", + eventLimitText: "extra", + noEventsMessage: "Geen evenementen om te laten zien" + }; + + var _m46 = { + code: "nn", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Førre", + next: "Neste", + today: "I dag", + month: "Månad", + week: "Veke", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Veke", + allDayText: "Heile dagen", + eventLimitText: "til", + noEventsMessage: "Ingen hendelser å vise" + }; + + var _m47 = { + code: "pl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Poprzedni", + next: "Następny", + today: "Dziś", + month: "Miesiąc", + week: "Tydzień", + day: "Dzień", + list: "Plan dnia" + }, + weekLabel: "Tydz", + allDayText: "Cały dzień", + eventLimitText: "więcej", + noEventsMessage: "Brak wydarzeń do wyświetlenia" + }; + + var _m48 = { + code: "pt-br", + buttonText: { + prev: "Anterior", + next: "Próximo", + today: "Hoje", + month: "Mês", + week: "Semana", + day: "Dia", + list: "Compromissos" + }, + weekLabel: "Sm", + allDayText: "dia inteiro", + eventLimitText: function (n) { + return "mais +" + n; + }, + noEventsMessage: "Não há eventos para mostrar" + }; + + var _m49 = { + code: "pt", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Anterior", + next: "Seguinte", + today: "Hoje", + month: "Mês", + week: "Semana", + day: "Dia", + list: "Agenda" + }, + weekLabel: "Sem", + allDayText: "Todo o dia", + eventLimitText: "mais", + noEventsMessage: "Não há eventos para mostrar" + }; + + var _m50 = { + code: "ro", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "precedentă", + next: "următoare", + today: "Azi", + month: "Lună", + week: "Săptămână", + day: "Zi", + list: "Agendă" + }, + weekLabel: "Săpt", + allDayText: "Toată ziua", + eventLimitText: function (n) { + return "+alte " + n; + }, + noEventsMessage: "Nu există evenimente de afișat" + }; + + var _m51 = { + code: "ru", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Пред", + next: "След", + today: "Сегодня", + month: "Месяц", + week: "Неделя", + day: "День", + list: "Повестка дня" + }, + weekLabel: "Нед", + allDayText: "Весь день", + eventLimitText: function (n) { + return "+ ещё " + n; + }, + noEventsMessage: "Нет событий для отображения" + }; + + var _m52 = { + code: "sk", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Predchádzajúci", + next: "Nasledujúci", + today: "Dnes", + month: "Mesiac", + week: "Týždeň", + day: "Deň", + list: "Rozvrh" + }, + weekLabel: "Ty", + allDayText: "Celý deň", + eventLimitText: function (n) { + return "+ďalšie: " + n; + }, + noEventsMessage: "Žiadne akcie na zobrazenie" + }; + + var _m53 = { + code: "sl", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prejšnji", + next: "Naslednji", + today: "Trenutni", + month: "Mesec", + week: "Teden", + day: "Dan", + list: "Dnevni red" + }, + weekLabel: "Teden", + allDayText: "Ves dan", + eventLimitText: "več", + noEventsMessage: "Ni dogodkov za prikaz" + }; + + var _m54 = { + code: "sq", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "mbrapa", + next: "Përpara", + today: "sot", + month: "Muaj", + week: "Javë", + day: "Ditë", + list: "Listë" + }, + weekLabel: "Ja", + allDayHtml: "Gjithë
ditën", + eventLimitText: function (n) { + return "+më tepër " + n; + }, + noEventsMessage: "Nuk ka evente për të shfaqur" + }; + + var _m55 = { + code: "sr-cyrl", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Претходна", + next: "следећи", + today: "Данас", + month: "Месец", + week: "Недеља", + day: "Дан", + list: "Планер" + }, + weekLabel: "Сед", + allDayText: "Цео дан", + eventLimitText: function (n) { + return "+ још " + n; + }, + noEventsMessage: "Нема догађаја за приказ" + }; + + var _m56 = { + code: "sr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prethodna", + next: "Sledeći", + today: "Danas", + month: "Mеsеc", + week: "Nеdеlja", + day: "Dan", + list: "Planеr" + }, + weekLabel: "Sed", + allDayText: "Cеo dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nеma događaja za prikaz" + }; + + var _m57 = { + code: "sv", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Förra", + next: "Nästa", + today: "Idag", + month: "Månad", + week: "Vecka", + day: "Dag", + list: "Program" + }, + weekLabel: "v.", + allDayText: "Heldag", + eventLimitText: "till", + noEventsMessage: "Inga händelser att visa" + }; + + var _m58 = { + code: "th", + buttonText: { + prev: "ย้อน", + next: "ถัดไป", + today: "วันนี้", + month: "เดือน", + week: "สัปดาห์", + day: "วัน", + list: "แผนงาน" + }, + allDayText: "ตลอดวัน", + eventLimitText: "เพิ่มเติม", + noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง" + }; + + var _m59 = { + code: "tr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "geri", + next: "ileri", + today: "bugün", + month: "Ay", + week: "Hafta", + day: "Gün", + list: "Ajanda" + }, + weekLabel: "Hf", + allDayText: "Tüm gün", + eventLimitText: "daha fazla", + noEventsMessage: "Gösterilecek etkinlik yok" + }; + + var _m60 = { + code: "uk", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Попередній", + next: "далі", + today: "Сьогодні", + month: "Місяць", + week: "Тиждень", + day: "День", + list: "Порядок денний" + }, + weekLabel: "Тиж", + allDayText: "Увесь день", + eventLimitText: function (n) { + return "+ще " + n + "..."; + }, + noEventsMessage: "Немає подій для відображення" + }; + + var _m61 = { + code: "vi", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Trước", + next: "Tiếp", + today: "Hôm nay", + month: "Tháng", + week: "Tuần", + day: "Ngày", + list: "Lịch biểu" + }, + weekLabel: "Tu", + allDayText: "Cả ngày", + eventLimitText: function (n) { + return "+ thêm " + n; + }, + noEventsMessage: "Không có sự kiện để hiển thị" + }; + + var _m62 = { + code: "zh-cn", + week: { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "上月", + next: "下月", + today: "今天", + month: "月", + week: "周", + day: "日", + list: "日程" + }, + weekLabel: "周", + allDayText: "全天", + eventLimitText: function (n) { + return "另外 " + n + " 个"; + }, + noEventsMessage: "没有事件显示" + }; + + var _m63 = { + code: "zh-tw", + buttonText: { + prev: "上月", + next: "下月", + today: "今天", + month: "月", + week: "週", + day: "天", + list: "活動列表" + }, + weekLabel: "周", + allDayText: "整天", + eventLimitText: '顯示更多', + noEventsMessage: "没有任何活動" + }; + + var _rollupPluginMultiEntry_entryPoint = [ + _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7, _m8, _m9, _m10, _m11, _m12, _m13, _m14, _m15, _m16, _m17, _m18, _m19, _m20, _m21, _m22, _m23, _m24, _m25, _m26, _m27, _m28, _m29, _m30, _m31, _m32, _m33, _m34, _m35, _m36, _m37, _m38, _m39, _m40, _m41, _m42, _m43, _m44, _m45, _m46, _m47, _m48, _m49, _m50, _m51, _m52, _m53, _m54, _m55, _m56, _m57, _m58, _m59, _m60, _m61, _m62, _m63 + ]; + + return _rollupPluginMultiEntry_entryPoint; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales-all.min.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales-all.min.js new file mode 100644 index 0000000..810d6de --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales-all.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).FullCalendarLocalesAll=t()}(this,function(){"use strict";return[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"Няма събития за показване"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekLabel:"Sed",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekLabel:"Set",allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekLabel:"Týd",allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekLabel:"Uge",allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekLabel:"KW",allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekLabel:"Εβδ",allDayText:"Ολοήμερο",eventLimitText:"περισσότερα",noEventsMessage:"Δεν υπάρχουν γεγονότα για να εμφανιστεί"},{code:"en-au",week:{dow:1,doy:4}},{code:"en-gb",week:{dow:1,doy:4}},{code:"en-nz",week:{dow:1,doy:4}},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo
el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo
el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekLabel:"näd",allDayText:"Kogu päev",eventLimitText:function(e){return"+ veel "+e},noEventsMessage:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekLabel:"As",allDayHtml:"Egun
osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekLabel:"هف",allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekLabel:"Vk",allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la
journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sm",allDayHtml:"Toute la
journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la
journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekLabel:"Sm",allDayHtml:"Todo
o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"},{code:"he",dir:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",eventLimitText:"אחר",noEventsMessage:"אין אירועים להצגה",weekLabel:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekLabel:"हफ्ता",allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekLabel:"Tje",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},weekLabel:"Hét",allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthető esemény"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayHtml:"Sehari
penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekLabel:"Vika",allDayHtml:"Allan
daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Tutto il
giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekLabel:"週",allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"},noEventsMessage:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekLabel:"კვ",allDayText:"მთელი დღე",eventLimitText:function(e){return"+ კიდევ "+e},noEventsMessage:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekLabel:"Не",allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"Көрсету үшін оқиғалар жоқ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekLabel:"주",allDayText:"종일",eventLimitText:"개",noEventsMessage:"일정이 없습니다"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekLabel:"W",allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekLabel:"SAV",allDayText:"Visą dieną",eventLimitText:"daugiau",noEventsMessage:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekLabel:"Ned.",allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e},noEventsMessage:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekLabel:"Сед",allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekLabel:"Uke",allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Voorgaand",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekLabel:"Veke",allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekLabel:"Tydz",allDayText:"Cały dzień",eventLimitText:"więcej",noEventsMessage:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},weekLabel:"Sm",allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekLabel:"Sem",allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekLabel:"Săpt",allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekLabel:"Нед",allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Нет событий для отображения"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekLabel:"Ty",allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekLabel:"Teden",allDayText:"Ves dan",eventLimitText:"več",noEventsMessage:"Ni dogodkov za prikaz"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekLabel:"Ja",allDayHtml:"Gjithë
ditën",eventLimitText:function(e){return"+më tepër "+e},noEventsMessage:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekLabel:"Сед",allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekLabel:"Sed",allDayText:"Cеo dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},weekLabel:"v.",allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"},{code:"th",buttonText:{prev:"ย้อน",next:"ถัดไป",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekLabel:"Hf",allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Gösterilecek etkinlik yok"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekLabel:"Тиж",allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Немає подій для відображення"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekLabel:"Tu",allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekLabel:"周",allDayText:"全天",eventLimitText:function(e){return"另外 "+e+" 个"},noEventsMessage:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekLabel:"周",allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"}]}); \ No newline at end of file diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/af.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/af.js new file mode 100644 index 0000000..ee9f9f7 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/af.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.af = factory())); +}(this, function () { 'use strict'; + + var af = { + code: "af", + week: { + dow: 1, + doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + }, + buttonText: { + prev: "Vorige", + next: "Volgende", + today: "Vandag", + year: "Jaar", + month: "Maand", + week: "Week", + day: "Dag", + list: "Agenda" + }, + allDayHtml: "Heeldag", + eventLimitText: "Addisionele", + noEventsMessage: "Daar is geen gebeurtenisse nie" + }; + + return af; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-dz.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-dz.js new file mode 100644 index 0000000..201eb17 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-dz.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-dz'] = factory())); +}(this, function () { 'use strict'; + + var arDz = { + code: "ar-dz", + week: { + dow: 0, + doy: 4 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arDz; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-kw.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-kw.js new file mode 100644 index 0000000..94c6900 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-kw.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-kw'] = factory())); +}(this, function () { 'use strict'; + + var arKw = { + code: "ar-kw", + week: { + dow: 0, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arKw; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-ly.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-ly.js new file mode 100644 index 0000000..e1c8aeb --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-ly.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ly'] = factory())); +}(this, function () { 'use strict'; + + var arLy = { + code: "ar-ly", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arLy; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-ma.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-ma.js new file mode 100644 index 0000000..00cc7c6 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-ma.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ma'] = factory())); +}(this, function () { 'use strict'; + + var arMa = { + code: "ar-ma", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arMa; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-sa.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-sa.js new file mode 100644 index 0000000..0361f6d --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-sa.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-sa'] = factory())); +}(this, function () { 'use strict'; + + var arSa = { + code: "ar-sa", + week: { + dow: 0, + doy: 6 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arSa; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-tn.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-tn.js new file mode 100644 index 0000000..57a07f8 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar-tn.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-tn'] = factory())); +}(this, function () { 'use strict'; + + var arTn = { + code: "ar-tn", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arTn; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar.js new file mode 100644 index 0000000..f789afd --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ar.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ar = factory())); +}(this, function () { 'use strict'; + + var ar = { + code: "ar", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return ar; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/bg.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/bg.js new file mode 100644 index 0000000..e7343a6 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/bg.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bg = factory())); +}(this, function () { 'use strict'; + + var bg = { + code: "bg", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "назад", + next: "напред", + today: "днес", + month: "Месец", + week: "Седмица", + day: "Ден", + list: "График" + }, + allDayText: "Цял ден", + eventLimitText: function (n) { + return "+още " + n; + }, + noEventsMessage: "Няма събития за показване" + }; + + return bg; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/bs.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/bs.js new file mode 100644 index 0000000..d96b8ad --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/bs.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bs = factory())); +}(this, function () { 'use strict'; + + var bs = { + code: "bs", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prošli", + next: "Sljedeći", + today: "Danas", + month: "Mjesec", + week: "Sedmica", + day: "Dan", + list: "Raspored" + }, + weekLabel: "Sed", + allDayText: "Cijeli dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nema događaja za prikazivanje" + }; + + return bs; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ca.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ca.js new file mode 100644 index 0000000..d2d3e2a --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ca.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ca = factory())); +}(this, function () { 'use strict'; + + var ca = { + code: "ca", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Anterior", + next: "Següent", + today: "Avui", + month: "Mes", + week: "Setmana", + day: "Dia", + list: "Agenda" + }, + weekLabel: "Set", + allDayText: "Tot el dia", + eventLimitText: "més", + noEventsMessage: "No hi ha esdeveniments per mostrar" + }; + + return ca; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/cs.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/cs.js new file mode 100644 index 0000000..2624e36 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/cs.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.cs = factory())); +}(this, function () { 'use strict'; + + var cs = { + code: "cs", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Dříve", + next: "Později", + today: "Nyní", + month: "Měsíc", + week: "Týden", + day: "Den", + list: "Agenda" + }, + weekLabel: "Týd", + allDayText: "Celý den", + eventLimitText: function (n) { + return "+další: " + n; + }, + noEventsMessage: "Žádné akce k zobrazení" + }; + + return cs; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/da.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/da.js new file mode 100644 index 0000000..73d1559 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/da.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.da = factory())); +}(this, function () { 'use strict'; + + var da = { + code: "da", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Forrige", + next: "Næste", + today: "I dag", + month: "Måned", + week: "Uge", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Uge", + allDayText: "Hele dagen", + eventLimitText: "flere", + noEventsMessage: "Ingen arrangementer at vise" + }; + + return da; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/de.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/de.js new file mode 100644 index 0000000..ab5a815 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/de.js @@ -0,0 +1,33 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.de = factory())); +}(this, function () { 'use strict'; + + var de = { + code: "de", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Zurück", + next: "Vor", + today: "Heute", + year: "Jahr", + month: "Monat", + week: "Woche", + day: "Tag", + list: "Terminübersicht" + }, + weekLabel: "KW", + allDayText: "Ganztägig", + eventLimitText: function (n) { + return "+ weitere " + n; + }, + noEventsMessage: "Keine Ereignisse anzuzeigen" + }; + + return de; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/el.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/el.js new file mode 100644 index 0000000..9f59e36 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/el.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.el = factory())); +}(this, function () { 'use strict'; + + var el = { + code: "el", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4st is the first week of the year. + }, + buttonText: { + prev: "Προηγούμενος", + next: "Επόμενος", + today: "Σήμερα", + month: "Μήνας", + week: "Εβδομάδα", + day: "Ημέρα", + list: "Ατζέντα" + }, + weekLabel: "Εβδ", + allDayText: "Ολοήμερο", + eventLimitText: "περισσότερα", + noEventsMessage: "Δεν υπάρχουν γεγονότα για να εμφανιστεί" + }; + + return el; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/en-au.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/en-au.js new file mode 100644 index 0000000..be10bfb --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/en-au.js @@ -0,0 +1,17 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-au'] = factory())); +}(this, function () { 'use strict'; + + var enAu = { + code: "en-au", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }; + + return enAu; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/en-gb.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/en-gb.js new file mode 100644 index 0000000..8a4a84e --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/en-gb.js @@ -0,0 +1,17 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-gb'] = factory())); +}(this, function () { 'use strict'; + + var enGb = { + code: "en-gb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }; + + return enGb; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/en-nz.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/en-nz.js new file mode 100644 index 0000000..df56c14 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/en-nz.js @@ -0,0 +1,17 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-nz'] = factory())); +}(this, function () { 'use strict'; + + var enNz = { + code: "en-nz", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }; + + return enNz; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/es-us.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/es-us.js new file mode 100644 index 0000000..1efa89a --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/es-us.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['es-us'] = factory())); +}(this, function () { 'use strict'; + + var esUs = { + code: "es", + week: { + dow: 0, + doy: 6 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Sig", + today: "Hoy", + month: "Mes", + week: "Semana", + day: "Día", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
el día", + eventLimitText: "más", + noEventsMessage: "No hay eventos para mostrar" + }; + + return esUs; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/es.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/es.js new file mode 100644 index 0000000..bfd9af4 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/es.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.es = factory())); +}(this, function () { 'use strict'; + + var es = { + code: "es", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Sig", + today: "Hoy", + month: "Mes", + week: "Semana", + day: "Día", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
el día", + eventLimitText: "más", + noEventsMessage: "No hay eventos para mostrar" + }; + + return es; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/et.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/et.js new file mode 100644 index 0000000..c44fcae --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/et.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.et = factory())); +}(this, function () { 'use strict'; + + var et = { + code: "et", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Eelnev", + next: "Järgnev", + today: "Täna", + month: "Kuu", + week: "Nädal", + day: "Päev", + list: "Päevakord" + }, + weekLabel: "näd", + allDayText: "Kogu päev", + eventLimitText: function (n) { + return "+ veel " + n; + }, + noEventsMessage: "Kuvamiseks puuduvad sündmused" + }; + + return et; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/eu.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/eu.js new file mode 100644 index 0000000..91903aa --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/eu.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.eu = factory())); +}(this, function () { 'use strict'; + + var eu = { + code: "eu", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Aur", + next: "Hur", + today: "Gaur", + month: "Hilabetea", + week: "Astea", + day: "Eguna", + list: "Agenda" + }, + weekLabel: "As", + allDayHtml: "Egun
osoa", + eventLimitText: "gehiago", + noEventsMessage: "Ez dago ekitaldirik erakusteko" + }; + + return eu; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/fa.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fa.js new file mode 100644 index 0000000..031fc7b --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fa.js @@ -0,0 +1,33 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fa = factory())); +}(this, function () { 'use strict'; + + var fa = { + code: "fa", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "قبلی", + next: "بعدی", + today: "امروز", + month: "ماه", + week: "هفته", + day: "روز", + list: "برنامه" + }, + weekLabel: "هف", + allDayText: "تمام روز", + eventLimitText: function (n) { + return "بیش از " + n; + }, + noEventsMessage: "هیچ رویدادی به نمایش" + }; + + return fa; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/fi.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fi.js new file mode 100644 index 0000000..3912845 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fi.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fi = factory())); +}(this, function () { 'use strict'; + + var fi = { + code: "fi", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Edellinen", + next: "Seuraava", + today: "Tänään", + month: "Kuukausi", + week: "Viikko", + day: "Päivä", + list: "Tapahtumat" + }, + weekLabel: "Vk", + allDayText: "Koko päivä", + eventLimitText: "lisää", + noEventsMessage: "Ei näytettäviä tapahtumia" + }; + + return fi; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/fr-ca.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fr-ca.js new file mode 100644 index 0000000..d554c14 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fr-ca.js @@ -0,0 +1,27 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ca'] = factory())); +}(this, function () { 'use strict'; + + var frCa = { + code: "fr", + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Aujourd'hui", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sem.", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + return frCa; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/fr-ch.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fr-ch.js new file mode 100644 index 0000000..358b8bf --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fr-ch.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ch'] = factory())); +}(this, function () { 'use strict'; + + var frCh = { + code: "fr-ch", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Courant", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sm", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + return frCh; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/fr.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fr.js new file mode 100644 index 0000000..b679cef --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/fr.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fr = factory())); +}(this, function () { 'use strict'; + + var fr = { + code: "fr", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Aujourd'hui", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sem.", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + return fr; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/gl.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/gl.js new file mode 100644 index 0000000..721a6a8 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/gl.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.gl = factory())); +}(this, function () { 'use strict'; + + var gl = { + code: "gl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Seg", + today: "Hoxe", + month: "Mes", + week: "Semana", + day: "Día", + list: "Axenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
o día", + eventLimitText: "máis", + noEventsMessage: "Non hai eventos para amosar" + }; + + return gl; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/he.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/he.js new file mode 100644 index 0000000..3521d9e --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/he.js @@ -0,0 +1,27 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.he = factory())); +}(this, function () { 'use strict'; + + var he = { + code: "he", + dir: 'rtl', + buttonText: { + prev: "הקודם", + next: "הבא", + today: "היום", + month: "חודש", + week: "שבוע", + day: "יום", + list: "סדר יום" + }, + allDayText: "כל היום", + eventLimitText: "אחר", + noEventsMessage: "אין אירועים להצגה", + weekLabel: "שבוע" + }; + + return he; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/hi.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/hi.js new file mode 100644 index 0000000..15348e6 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/hi.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hi = factory())); +}(this, function () { 'use strict'; + + var hi = { + code: "hi", + week: { + dow: 0, + doy: 6 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "पिछला", + next: "अगला", + today: "आज", + month: "महीना", + week: "सप्ताह", + day: "दिन", + list: "कार्यसूची" + }, + weekLabel: "हफ्ता", + allDayText: "सभी दिन", + eventLimitText: function (n) { + return "+अधिक " + n; + }, + noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए" + }; + + return hi; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/hr.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/hr.js new file mode 100644 index 0000000..295b485 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/hr.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hr = factory())); +}(this, function () { 'use strict'; + + var hr = { + code: "hr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prijašnji", + next: "Sljedeći", + today: "Danas", + month: "Mjesec", + week: "Tjedan", + day: "Dan", + list: "Raspored" + }, + weekLabel: "Tje", + allDayText: "Cijeli dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nema događaja za prikaz" + }; + + return hr; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/hu.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/hu.js new file mode 100644 index 0000000..2f0fe8a --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/hu.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hu = factory())); +}(this, function () { 'use strict'; + + var hu = { + code: "hu", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "vissza", + next: "előre", + today: "ma", + month: "Hónap", + week: "Hét", + day: "Nap", + list: "Napló" + }, + weekLabel: "Hét", + allDayText: "Egész nap", + eventLimitText: "további", + noEventsMessage: "Nincs megjeleníthető esemény" + }; + + return hu; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/id.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/id.js new file mode 100644 index 0000000..b742e80 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/id.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.id = factory())); +}(this, function () { 'use strict'; + + var id = { + code: "id", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "mundur", + next: "maju", + today: "hari ini", + month: "Bulan", + week: "Minggu", + day: "Hari", + list: "Agenda" + }, + weekLabel: "Mg", + allDayHtml: "Sehari
penuh", + eventLimitText: "lebih", + noEventsMessage: "Tidak ada acara untuk ditampilkan" + }; + + return id; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/is.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/is.js new file mode 100644 index 0000000..dd569bc --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/is.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.is = factory())); +}(this, function () { 'use strict'; + + var is = { + code: "is", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Fyrri", + next: "Næsti", + today: "Í dag", + month: "Mánuður", + week: "Vika", + day: "Dagur", + list: "Dagskrá" + }, + weekLabel: "Vika", + allDayHtml: "Allan
daginn", + eventLimitText: "meira", + noEventsMessage: "Engir viðburðir til að sýna" + }; + + return is; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/it.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/it.js new file mode 100644 index 0000000..39a2829 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/it.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.it = factory())); +}(this, function () { 'use strict'; + + var it = { + code: "it", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Prec", + next: "Succ", + today: "Oggi", + month: "Mese", + week: "Settimana", + day: "Giorno", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Tutto il
giorno", + eventLimitText: function (n) { + return "+altri " + n; + }, + noEventsMessage: "Non ci sono eventi da visualizzare" + }; + + return it; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ja.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ja.js new file mode 100644 index 0000000..eb4245b --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ja.js @@ -0,0 +1,28 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ja = factory())); +}(this, function () { 'use strict'; + + var ja = { + code: "ja", + buttonText: { + prev: "前", + next: "次", + today: "今日", + month: "月", + week: "週", + day: "日", + list: "予定リスト" + }, + weekLabel: "週", + allDayText: "終日", + eventLimitText: function (n) { + return "他 " + n + " 件"; + }, + noEventsMessage: "表示する予定はありません" + }; + + return ja; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ka.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ka.js new file mode 100644 index 0000000..b971c03 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ka.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ka = factory())); +}(this, function () { 'use strict'; + + var ka = { + code: "ka", + week: { + dow: 1, + doy: 7 + }, + buttonText: { + prev: "წინა", + next: "შემდეგი", + today: "დღეს", + month: "თვე", + week: "კვირა", + day: "დღე", + list: "დღის წესრიგი" + }, + weekLabel: "კვ", + allDayText: "მთელი დღე", + eventLimitText: function (n) { + return "+ კიდევ " + n; + }, + noEventsMessage: "ღონისძიებები არ არის" + }; + + return ka; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/kk.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/kk.js new file mode 100644 index 0000000..5b19b99 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/kk.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.kk = factory())); +}(this, function () { 'use strict'; + + var kk = { + code: "kk", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Алдыңғы", + next: "Келесі", + today: "Бүгін", + month: "Ай", + week: "Апта", + day: "Күн", + list: "Күн тәртібі" + }, + weekLabel: "Не", + allDayText: "Күні бойы", + eventLimitText: function (n) { + return "+ тағы " + n; + }, + noEventsMessage: "Көрсету үшін оқиғалар жоқ" + }; + + return kk; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ko.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ko.js new file mode 100644 index 0000000..ffe985d --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ko.js @@ -0,0 +1,26 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ko = factory())); +}(this, function () { 'use strict'; + + var ko = { + code: "ko", + buttonText: { + prev: "이전달", + next: "다음달", + today: "오늘", + month: "월", + week: "주", + day: "일", + list: "일정목록" + }, + weekLabel: "주", + allDayText: "종일", + eventLimitText: "개", + noEventsMessage: "일정이 없습니다" + }; + + return ko; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/lb.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/lb.js new file mode 100644 index 0000000..b9b17e3 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/lb.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lb = factory())); +}(this, function () { 'use strict'; + + var lb = { + code: "lb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Zréck", + next: "Weider", + today: "Haut", + month: "Mount", + week: "Woch", + day: "Dag", + list: "Terminiwwersiicht" + }, + weekLabel: "W", + allDayText: "Ganzen Dag", + eventLimitText: "méi", + noEventsMessage: "Nee Evenementer ze affichéieren" + }; + + return lb; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/lt.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/lt.js new file mode 100644 index 0000000..ec641b7 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/lt.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lt = factory())); +}(this, function () { 'use strict'; + + var lt = { + code: "lt", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Atgal", + next: "Pirmyn", + today: "Šiandien", + month: "Mėnuo", + week: "Savaitė", + day: "Diena", + list: "Darbotvarkė" + }, + weekLabel: "SAV", + allDayText: "Visą dieną", + eventLimitText: "daugiau", + noEventsMessage: "Nėra įvykių rodyti" + }; + + return lt; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/lv.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/lv.js new file mode 100644 index 0000000..5453630 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/lv.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lv = factory())); +}(this, function () { 'use strict'; + + var lv = { + code: "lv", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Iepr.", + next: "Nāk.", + today: "Šodien", + month: "Mēnesis", + week: "Nedēļa", + day: "Diena", + list: "Dienas kārtība" + }, + weekLabel: "Ned.", + allDayText: "Visu dienu", + eventLimitText: function (n) { + return "+vēl " + n; + }, + noEventsMessage: "Nav notikumu" + }; + + return lv; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/mk.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/mk.js new file mode 100644 index 0000000..6729fa6 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/mk.js @@ -0,0 +1,28 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.mk = factory())); +}(this, function () { 'use strict'; + + var mk = { + code: "mk", + buttonText: { + prev: "претходно", + next: "следно", + today: "Денес", + month: "Месец", + week: "Недела", + day: "Ден", + list: "График" + }, + weekLabel: "Сед", + allDayText: "Цел ден", + eventLimitText: function (n) { + return "+повеќе " + n; + }, + noEventsMessage: "Нема настани за прикажување" + }; + + return mk; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ms.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ms.js new file mode 100644 index 0000000..7205ecc --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ms.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ms = factory())); +}(this, function () { 'use strict'; + + var ms = { + code: "ms", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Sebelum", + next: "Selepas", + today: "hari ini", + month: "Bulan", + week: "Minggu", + day: "Hari", + list: "Agenda" + }, + weekLabel: "Mg", + allDayText: "Sepanjang hari", + eventLimitText: function (n) { + return "masih ada " + n + " acara"; + }, + noEventsMessage: "Tiada peristiwa untuk dipaparkan" + }; + + return ms; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/nb.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/nb.js new file mode 100644 index 0000000..6464461 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/nb.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nb = factory())); +}(this, function () { 'use strict'; + + var nb = { + code: "nb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Forrige", + next: "Neste", + today: "I dag", + month: "Måned", + week: "Uke", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Uke", + allDayText: "Hele dagen", + eventLimitText: "til", + noEventsMessage: "Ingen hendelser å vise" + }; + + return nb; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/nl.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/nl.js new file mode 100644 index 0000000..c91b5e5 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/nl.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nl = factory())); +}(this, function () { 'use strict'; + + var nl = { + code: "nl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Voorgaand", + next: "Volgende", + today: "Vandaag", + year: "Jaar", + month: "Maand", + week: "Week", + day: "Dag", + list: "Agenda" + }, + allDayText: "Hele dag", + eventLimitText: "extra", + noEventsMessage: "Geen evenementen om te laten zien" + }; + + return nl; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/nn.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/nn.js new file mode 100644 index 0000000..a5cdd16 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/nn.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nn = factory())); +}(this, function () { 'use strict'; + + var nn = { + code: "nn", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Førre", + next: "Neste", + today: "I dag", + month: "Månad", + week: "Veke", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Veke", + allDayText: "Heile dagen", + eventLimitText: "til", + noEventsMessage: "Ingen hendelser å vise" + }; + + return nn; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/pl.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/pl.js new file mode 100644 index 0000000..0a22e69 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/pl.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pl = factory())); +}(this, function () { 'use strict'; + + var pl = { + code: "pl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Poprzedni", + next: "Następny", + today: "Dziś", + month: "Miesiąc", + week: "Tydzień", + day: "Dzień", + list: "Plan dnia" + }, + weekLabel: "Tydz", + allDayText: "Cały dzień", + eventLimitText: "więcej", + noEventsMessage: "Brak wydarzeń do wyświetlenia" + }; + + return pl; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/pt-br.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/pt-br.js new file mode 100644 index 0000000..0133cd6 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/pt-br.js @@ -0,0 +1,28 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['pt-br'] = factory())); +}(this, function () { 'use strict'; + + var ptBr = { + code: "pt-br", + buttonText: { + prev: "Anterior", + next: "Próximo", + today: "Hoje", + month: "Mês", + week: "Semana", + day: "Dia", + list: "Compromissos" + }, + weekLabel: "Sm", + allDayText: "dia inteiro", + eventLimitText: function (n) { + return "mais +" + n; + }, + noEventsMessage: "Não há eventos para mostrar" + }; + + return ptBr; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/pt.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/pt.js new file mode 100644 index 0000000..5c54d8d --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/pt.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pt = factory())); +}(this, function () { 'use strict'; + + var pt = { + code: "pt", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Anterior", + next: "Seguinte", + today: "Hoje", + month: "Mês", + week: "Semana", + day: "Dia", + list: "Agenda" + }, + weekLabel: "Sem", + allDayText: "Todo o dia", + eventLimitText: "mais", + noEventsMessage: "Não há eventos para mostrar" + }; + + return pt; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ro.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ro.js new file mode 100644 index 0000000..e8992f2 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ro.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ro = factory())); +}(this, function () { 'use strict'; + + var ro = { + code: "ro", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "precedentă", + next: "următoare", + today: "Azi", + month: "Lună", + week: "Săptămână", + day: "Zi", + list: "Agendă" + }, + weekLabel: "Săpt", + allDayText: "Toată ziua", + eventLimitText: function (n) { + return "+alte " + n; + }, + noEventsMessage: "Nu există evenimente de afișat" + }; + + return ro; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/ru.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ru.js new file mode 100644 index 0000000..77e0308 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/ru.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ru = factory())); +}(this, function () { 'use strict'; + + var ru = { + code: "ru", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Пред", + next: "След", + today: "Сегодня", + month: "Месяц", + week: "Неделя", + day: "День", + list: "Повестка дня" + }, + weekLabel: "Нед", + allDayText: "Весь день", + eventLimitText: function (n) { + return "+ ещё " + n; + }, + noEventsMessage: "Нет событий для отображения" + }; + + return ru; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/sk.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sk.js new file mode 100644 index 0000000..3513a64 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sk.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sk = factory())); +}(this, function () { 'use strict'; + + var sk = { + code: "sk", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Predchádzajúci", + next: "Nasledujúci", + today: "Dnes", + month: "Mesiac", + week: "Týždeň", + day: "Deň", + list: "Rozvrh" + }, + weekLabel: "Ty", + allDayText: "Celý deň", + eventLimitText: function (n) { + return "+ďalšie: " + n; + }, + noEventsMessage: "Žiadne akcie na zobrazenie" + }; + + return sk; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/sl.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sl.js new file mode 100644 index 0000000..3233553 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sl.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sl = factory())); +}(this, function () { 'use strict'; + + var sl = { + code: "sl", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prejšnji", + next: "Naslednji", + today: "Trenutni", + month: "Mesec", + week: "Teden", + day: "Dan", + list: "Dnevni red" + }, + weekLabel: "Teden", + allDayText: "Ves dan", + eventLimitText: "več", + noEventsMessage: "Ni dogodkov za prikaz" + }; + + return sl; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/sq.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sq.js new file mode 100644 index 0000000..0d43a52 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sq.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sq = factory())); +}(this, function () { 'use strict'; + + var sq = { + code: "sq", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "mbrapa", + next: "Përpara", + today: "sot", + month: "Muaj", + week: "Javë", + day: "Ditë", + list: "Listë" + }, + weekLabel: "Ja", + allDayHtml: "Gjithë
ditën", + eventLimitText: function (n) { + return "+më tepër " + n; + }, + noEventsMessage: "Nuk ka evente për të shfaqur" + }; + + return sq; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/sr-cyrl.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sr-cyrl.js new file mode 100644 index 0000000..ba0d0df --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sr-cyrl.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['sr-cyrl'] = factory())); +}(this, function () { 'use strict'; + + var srCyrl = { + code: "sr-cyrl", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Претходна", + next: "следећи", + today: "Данас", + month: "Месец", + week: "Недеља", + day: "Дан", + list: "Планер" + }, + weekLabel: "Сед", + allDayText: "Цео дан", + eventLimitText: function (n) { + return "+ још " + n; + }, + noEventsMessage: "Нема догађаја за приказ" + }; + + return srCyrl; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/sr.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sr.js new file mode 100644 index 0000000..23e5c9b --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sr.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sr = factory())); +}(this, function () { 'use strict'; + + var sr = { + code: "sr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prethodna", + next: "Sledeći", + today: "Danas", + month: "Mеsеc", + week: "Nеdеlja", + day: "Dan", + list: "Planеr" + }, + weekLabel: "Sed", + allDayText: "Cеo dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nеma događaja za prikaz" + }; + + return sr; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/sv.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sv.js new file mode 100644 index 0000000..a887060 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/sv.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sv = factory())); +}(this, function () { 'use strict'; + + var sv = { + code: "sv", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Förra", + next: "Nästa", + today: "Idag", + month: "Månad", + week: "Vecka", + day: "Dag", + list: "Program" + }, + weekLabel: "v.", + allDayText: "Heldag", + eventLimitText: "till", + noEventsMessage: "Inga händelser att visa" + }; + + return sv; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/th.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/th.js new file mode 100644 index 0000000..caa3fe9 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/th.js @@ -0,0 +1,25 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.th = factory())); +}(this, function () { 'use strict'; + + var th = { + code: "th", + buttonText: { + prev: "ย้อน", + next: "ถัดไป", + today: "วันนี้", + month: "เดือน", + week: "สัปดาห์", + day: "วัน", + list: "แผนงาน" + }, + allDayText: "ตลอดวัน", + eventLimitText: "เพิ่มเติม", + noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง" + }; + + return th; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/tr.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/tr.js new file mode 100644 index 0000000..4845898 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/tr.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.tr = factory())); +}(this, function () { 'use strict'; + + var tr = { + code: "tr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "geri", + next: "ileri", + today: "bugün", + month: "Ay", + week: "Hafta", + day: "Gün", + list: "Ajanda" + }, + weekLabel: "Hf", + allDayText: "Tüm gün", + eventLimitText: "daha fazla", + noEventsMessage: "Gösterilecek etkinlik yok" + }; + + return tr; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/uk.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/uk.js new file mode 100644 index 0000000..de33f25 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/uk.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.uk = factory())); +}(this, function () { 'use strict'; + + var uk = { + code: "uk", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Попередній", + next: "далі", + today: "Сьогодні", + month: "Місяць", + week: "Тиждень", + day: "День", + list: "Порядок денний" + }, + weekLabel: "Тиж", + allDayText: "Увесь день", + eventLimitText: function (n) { + return "+ще " + n + "..."; + }, + noEventsMessage: "Немає подій для відображення" + }; + + return uk; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/vi.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/vi.js new file mode 100644 index 0000000..167ce11 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/vi.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.vi = factory())); +}(this, function () { 'use strict'; + + var vi = { + code: "vi", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Trước", + next: "Tiếp", + today: "Hôm nay", + month: "Tháng", + week: "Tuần", + day: "Ngày", + list: "Lịch biểu" + }, + weekLabel: "Tu", + allDayText: "Cả ngày", + eventLimitText: function (n) { + return "+ thêm " + n; + }, + noEventsMessage: "Không có sự kiện để hiển thị" + }; + + return vi; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/zh-cn.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/zh-cn.js new file mode 100644 index 0000000..4debbb9 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/zh-cn.js @@ -0,0 +1,33 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-cn'] = factory())); +}(this, function () { 'use strict'; + + var zhCn = { + code: "zh-cn", + week: { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "上月", + next: "下月", + today: "今天", + month: "月", + week: "周", + day: "日", + list: "日程" + }, + weekLabel: "周", + allDayText: "全天", + eventLimitText: function (n) { + return "另外 " + n + " 个"; + }, + noEventsMessage: "没有事件显示" + }; + + return zhCn; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/locales/zh-tw.js b/src/main/resources/static/assets/libs/fullcalendar/core/locales/zh-tw.js new file mode 100644 index 0000000..bc14dcd --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/locales/zh-tw.js @@ -0,0 +1,26 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-tw'] = factory())); +}(this, function () { 'use strict'; + + var zhTw = { + code: "zh-tw", + buttonText: { + prev: "上月", + next: "下月", + today: "今天", + month: "月", + week: "週", + day: "天", + list: "活動列表" + }, + weekLabel: "周", + allDayText: "整天", + eventLimitText: '顯示更多', + noEventsMessage: "没有任何活動" + }; + + return zhTw; + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/main.css b/src/main/resources/static/assets/libs/fullcalendar/core/main.css new file mode 100644 index 0000000..4412a18 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/main.css @@ -0,0 +1,1052 @@ +@charset "UTF-8"; +.fc { + direction: ltr; + text-align: left; +} + +.fc-rtl { + text-align: right; +} + +body .fc { + /* extra precedence to overcome jqui */ + font-size: 1em; +} + +/* Colors +--------------------------------------------------------------------------------------------------*/ +.fc-highlight { + /* when user is selecting cells */ + background: #bce8f1; + opacity: 0.3; +} + +.fc-bgevent { + /* default look for background events */ + background: #8fdf82; + opacity: 0.3; +} + +.fc-nonbusiness { + /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #d7d7d7; +} + +/* Popover +--------------------------------------------------------------------------------------------------*/ +.fc-popover { + position: absolute; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); +} + +.fc-popover .fc-header { + /* TODO: be more consistent with fc-head/fc-body */ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + padding: 2px 4px; +} + +.fc-rtl .fc-popover .fc-header { + flex-direction: row-reverse; +} + +.fc-popover .fc-header .fc-title { + margin: 0 2px; +} + +.fc-popover .fc-header .fc-close { + cursor: pointer; + opacity: 0.65; + font-size: 1.1em; +} + +/* Misc Reusable Components +--------------------------------------------------------------------------------------------------*/ +.fc-divider { + border-style: solid; + border-width: 1px; +} + +hr.fc-divider { + height: 0; + margin: 0; + padding: 0 0 2px; + /* height is unreliable across browsers, so use padding */ + border-width: 1px 0; +} + +.fc-bg, +.fc-bgevent-skeleton, +.fc-highlight-skeleton, +.fc-mirror-skeleton { + /* these element should always cling to top-left/right corners */ + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.fc-bg { + bottom: 0; + /* strech bg to bottom edge */ +} + +.fc-bg table { + height: 100%; + /* strech bg to bottom edge */ +} + +/* Tables +--------------------------------------------------------------------------------------------------*/ +.fc table { + width: 100%; + box-sizing: border-box; + /* fix scrollbar issue in firefox */ + table-layout: fixed; + border-collapse: collapse; + border-spacing: 0; + font-size: 1em; + /* normalize cross-browser */ +} + +.fc th { + text-align: center; +} + +.fc th, +.fc td { + border-style: solid; + border-width: 1px; + padding: 0; + vertical-align: top; +} + +.fc td.fc-today { + border-style: double; + /* overcome neighboring borders */ +} + +/* Internal Nav Links +--------------------------------------------------------------------------------------------------*/ +a[data-goto] { + cursor: pointer; +} + +a[data-goto]:hover { + text-decoration: underline; +} + +/* Fake Table Rows +--------------------------------------------------------------------------------------------------*/ +.fc .fc-row { + /* extra precedence to overcome themes forcing a 1px border */ + /* no visible border by default. but make available if need be (scrollbar width compensation) */ + border-style: solid; + border-width: 0; +} + +.fc-row table { + /* don't put left/right border on anything within a fake row. + the outer tbody will worry about this */ + border-left: 0 hidden transparent; + border-right: 0 hidden transparent; + /* no bottom borders on rows */ + border-bottom: 0 hidden transparent; +} + +.fc-row:first-child table { + border-top: 0 hidden transparent; + /* no top border on first row */ +} + +/* Day Row (used within the header and the DayGrid) +--------------------------------------------------------------------------------------------------*/ +.fc-row { + position: relative; +} + +.fc-row .fc-bg { + z-index: 1; +} + +/* highlighting cells & background event skeleton */ +.fc-row .fc-bgevent-skeleton, +.fc-row .fc-highlight-skeleton { + bottom: 0; + /* stretch skeleton to bottom of row */ +} + +.fc-row .fc-bgevent-skeleton table, +.fc-row .fc-highlight-skeleton table { + height: 100%; + /* stretch skeleton to bottom of row */ +} + +.fc-row .fc-highlight-skeleton td, +.fc-row .fc-bgevent-skeleton td { + border-color: transparent; +} + +.fc-row .fc-bgevent-skeleton { + z-index: 2; +} + +.fc-row .fc-highlight-skeleton { + z-index: 3; +} + +/* +row content (which contains day/week numbers and events) as well as "mirror" (which contains +temporary rendered events). +*/ +.fc-row .fc-content-skeleton { + position: relative; + z-index: 4; + padding-bottom: 2px; + /* matches the space above the events */ +} + +.fc-row .fc-mirror-skeleton { + z-index: 5; +} + +.fc .fc-row .fc-content-skeleton table, +.fc .fc-row .fc-content-skeleton td, +.fc .fc-row .fc-mirror-skeleton td { + /* see-through to the background below */ + /* extra precedence to prevent theme-provided backgrounds */ + background: none; + /* in case s are globally styled */ + border-color: transparent; +} + +.fc-row .fc-content-skeleton td, +.fc-row .fc-mirror-skeleton td { + /* don't put a border between events and/or the day number */ + border-bottom: 0; +} + +.fc-row .fc-content-skeleton tbody td, +.fc-row .fc-mirror-skeleton tbody td { + /* don't put a border between event cells */ + border-top: 0; +} + +/* Scrolling Container +--------------------------------------------------------------------------------------------------*/ +.fc-scroller { + -webkit-overflow-scrolling: touch; +} + +/* TODO: move to timegrid/daygrid */ +.fc-scroller > .fc-day-grid, +.fc-scroller > .fc-time-grid { + position: relative; + /* re-scope all positions */ + width: 100%; + /* hack to force re-sizing this inner element when scrollbars appear/disappear */ +} + +/* Global Event Styles +--------------------------------------------------------------------------------------------------*/ +.fc-event { + position: relative; + /* for resize handle and other inner positioning */ + display: block; + /* make the tag block */ + font-size: 0.85em; + line-height: 1.4; + border-radius: 3px; + border: 1px solid #3788d8; +} + +.fc-event, +.fc-event-dot { + background-color: #3788d8; + /* default BACKGROUND color */ +} + +.fc-event, +.fc-event:hover { + color: #fff; + /* default TEXT color */ + text-decoration: none; + /* if has an href */ +} + +.fc-event[href], +.fc-event.fc-draggable { + cursor: pointer; + /* give events with links and draggable events a hand mouse pointer */ +} + +.fc-not-allowed, +.fc-not-allowed .fc-event { + /* to override an event's custom cursor */ + cursor: not-allowed; +} + +.fc-event .fc-content { + position: relative; + z-index: 2; +} + +/* resizer (cursor AND touch devices) */ +.fc-event .fc-resizer { + position: absolute; + z-index: 4; +} + +/* resizer (touch devices) */ +.fc-event .fc-resizer { + display: none; +} + +.fc-event.fc-allow-mouse-resize .fc-resizer, +.fc-event.fc-selected .fc-resizer { + /* only show when hovering or selected (with touch) */ + display: block; +} + +/* hit area */ +.fc-event.fc-selected .fc-resizer:before { + /* 40x40 touch area */ + content: ""; + position: absolute; + z-index: 9999; + /* user of this util can scope within a lower z-index */ + top: 50%; + left: 50%; + width: 40px; + height: 40px; + margin-left: -20px; + margin-top: -20px; +} + +/* Event Selection (only for touch devices) +--------------------------------------------------------------------------------------------------*/ +.fc-event.fc-selected { + z-index: 9999 !important; + /* overcomes inline z-index */ + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); +} + +.fc-event.fc-selected:after { + content: ""; + position: absolute; + z-index: 1; + /* same z-index as fc-bg, behind text */ + /* overcome the borders */ + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; + /* darkening effect */ + background: #000; + opacity: 0.25; +} + +/* Event Dragging +--------------------------------------------------------------------------------------------------*/ +.fc-event.fc-dragging.fc-selected { + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3); +} + +.fc-event.fc-dragging:not(.fc-selected) { + opacity: 0.75; +} + +/* Horizontal Events +--------------------------------------------------------------------------------------------------*/ +/* bigger touch area when selected */ +.fc-h-event.fc-selected:before { + content: ""; + position: absolute; + z-index: 3; + /* below resizers */ + top: -10px; + bottom: -10px; + left: 0; + right: 0; +} + +/* events that are continuing to/from another week. kill rounded corners and butt up against edge */ +.fc-ltr .fc-h-event.fc-not-start, +.fc-rtl .fc-h-event.fc-not-end { + margin-left: 0; + border-left-width: 0; + padding-left: 1px; + /* replace the border with padding */ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.fc-ltr .fc-h-event.fc-not-end, +.fc-rtl .fc-h-event.fc-not-start { + margin-right: 0; + border-right-width: 0; + padding-right: 1px; + /* replace the border with padding */ + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +/* resizer (cursor AND touch devices) */ +/* left resizer */ +.fc-ltr .fc-h-event .fc-start-resizer, +.fc-rtl .fc-h-event .fc-end-resizer { + cursor: w-resize; + left: -1px; + /* overcome border */ +} + +/* right resizer */ +.fc-ltr .fc-h-event .fc-end-resizer, +.fc-rtl .fc-h-event .fc-start-resizer { + cursor: e-resize; + right: -1px; + /* overcome border */ +} + +/* resizer (mouse devices) */ +.fc-h-event.fc-allow-mouse-resize .fc-resizer { + width: 7px; + top: -1px; + /* overcome top border */ + bottom: -1px; + /* overcome bottom border */ +} + +/* resizer (touch devices) */ +.fc-h-event.fc-selected .fc-resizer { + /* 8x8 little dot */ + border-radius: 4px; + border-width: 1px; + width: 6px; + height: 6px; + border-style: solid; + border-color: inherit; + background: #fff; + /* vertically center */ + top: 50%; + margin-top: -4px; +} + +/* left resizer */ +.fc-ltr .fc-h-event.fc-selected .fc-start-resizer, +.fc-rtl .fc-h-event.fc-selected .fc-end-resizer { + margin-left: -4px; + /* centers the 8x8 dot on the left edge */ +} + +/* right resizer */ +.fc-ltr .fc-h-event.fc-selected .fc-end-resizer, +.fc-rtl .fc-h-event.fc-selected .fc-start-resizer { + margin-right: -4px; + /* centers the 8x8 dot on the right edge */ +} + +/* DayGrid events +---------------------------------------------------------------------------------------------------- +We use the full "fc-day-grid-event" class instead of using descendants because the event won't +be a descendant of the grid when it is being dragged. +*/ +.fc-day-grid-event { + margin: 1px 2px 0; + /* spacing between events and edges */ + padding: 0 1px; +} + +tr:first-child > td > .fc-day-grid-event { + margin-top: 2px; + /* a little bit more space before the first event */ +} + +.fc-mirror-skeleton tr:first-child > td > .fc-day-grid-event { + margin-top: 0; + /* except for mirror skeleton */ +} + +.fc-day-grid-event .fc-content { + /* force events to be one-line tall */ + white-space: nowrap; + overflow: hidden; +} + +.fc-day-grid-event .fc-time { + font-weight: bold; +} + +/* resizer (cursor devices) */ +/* left resizer */ +.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer, +.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer { + margin-left: -2px; + /* to the day cell's edge */ +} + +/* right resizer */ +.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer, +.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer { + margin-right: -2px; + /* to the day cell's edge */ +} + +/* Event Limiting +--------------------------------------------------------------------------------------------------*/ +/* "more" link that represents hidden events */ +a.fc-more { + margin: 1px 3px; + font-size: 0.85em; + cursor: pointer; + text-decoration: none; +} + +a.fc-more:hover { + text-decoration: underline; +} + +.fc-limited { + /* rows and cells that are hidden because of a "more" link */ + display: none; +} + +/* popover that appears when "more" link is clicked */ +.fc-day-grid .fc-row { + z-index: 1; + /* make the "more" popover one higher than this */ +} + +.fc-more-popover { + z-index: 2; + width: 220px; +} + +.fc-more-popover .fc-event-container { + padding: 10px; +} + +/* Now Indicator +--------------------------------------------------------------------------------------------------*/ +.fc-now-indicator { + position: absolute; + border: 0 solid red; +} + +/* Utilities +--------------------------------------------------------------------------------------------------*/ +.fc-unselectable { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-touch-callout: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +/* +TODO: more distinction between this file and common.css +*/ +/* Colors +--------------------------------------------------------------------------------------------------*/ +.fc-unthemed th, +.fc-unthemed td, +.fc-unthemed thead, +.fc-unthemed tbody, +.fc-unthemed .fc-divider, +.fc-unthemed .fc-row, +.fc-unthemed .fc-content, +.fc-unthemed .fc-popover, +.fc-unthemed .fc-list-view, +.fc-unthemed .fc-list-heading td { + border-color: #ddd; +} + +.fc-unthemed .fc-popover { + background-color: #fff; +} + +.fc-unthemed .fc-divider, +.fc-unthemed .fc-popover .fc-header, +.fc-unthemed .fc-list-heading td { + background: #eee; +} + +.fc-unthemed td.fc-today { + background: #fcf8e3; +} + +.fc-unthemed .fc-disabled-day { + background: #d7d7d7; + opacity: 0.3; +} + +/* Icons +-------------------------------------------------------------------------------------------------- +from https://feathericons.com/ and built with IcoMoon +*/ +@font-face { + font-family: "fcicons"; + src: url("data:application/x-font-ttf;charset=utf-8;base64,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") format("truetype"); + font-weight: normal; + font-style: normal; +} +.fc-icon { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: "fcicons" !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.fc-icon-chevron-left:before { + content: ""; +} + +.fc-icon-chevron-right:before { + content: ""; +} + +.fc-icon-chevrons-left:before { + content: ""; +} + +.fc-icon-chevrons-right:before { + content: ""; +} + +.fc-icon-minus-square:before { + content: ""; +} + +.fc-icon-plus-square:before { + content: ""; +} + +.fc-icon-x:before { + content: ""; +} + +.fc-icon { + display: inline-block; + width: 1em; + height: 1em; + text-align: center; +} + +/* Buttons +-------------------------------------------------------------------------------------------------- +Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css +*/ +/* reset */ +.fc-button { + border-radius: 0; + overflow: visible; + text-transform: none; + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.fc-button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +.fc-button { + -webkit-appearance: button; +} + +.fc-button:not(:disabled) { + cursor: pointer; +} + +.fc-button::-moz-focus-inner { + padding: 0; + border-style: none; +} + +/* theme */ +.fc-button { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.4em 0.65em; + font-size: 1em; + line-height: 1.5; + border-radius: 0.25em; +} + +.fc-button:hover { + color: #212529; + text-decoration: none; +} + +.fc-button:focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25); + box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25); +} + +.fc-button:disabled { + opacity: 0.65; +} + +/* "primary" coloring */ +.fc-button-primary { + color: #fff; + background-color: #2C3E50; + border-color: #2C3E50; +} + +.fc-button-primary:hover { + color: #fff; + background-color: #1e2b37; + border-color: #1a252f; +} + +.fc-button-primary:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); + box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); +} + +.fc-button-primary:disabled { + color: #fff; + background-color: #2C3E50; + border-color: #2C3E50; +} + +.fc-button-primary:not(:disabled):active, +.fc-button-primary:not(:disabled).fc-button-active { + color: #fff; + background-color: #1a252f; + border-color: #151e27; +} + +.fc-button-primary:not(:disabled):active:focus, +.fc-button-primary:not(:disabled).fc-button-active:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); + box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); +} + +/* icons within buttons */ +.fc-button .fc-icon { + vertical-align: middle; + font-size: 1.5em; +} + +/* Buttons Groups +--------------------------------------------------------------------------------------------------*/ +.fc-button-group { + position: relative; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} + +.fc-button-group > .fc-button { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} + +.fc-button-group > .fc-button:hover { + z-index: 1; +} + +.fc-button-group > .fc-button:focus, +.fc-button-group > .fc-button:active, +.fc-button-group > .fc-button.fc-button-active { + z-index: 1; +} + +.fc-button-group > .fc-button:not(:first-child) { + margin-left: -1px; +} + +.fc-button-group > .fc-button:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.fc-button-group > .fc-button:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +/* Popover +--------------------------------------------------------------------------------------------------*/ +.fc-unthemed .fc-popover { + border-width: 1px; + border-style: solid; +} + +/* List View +--------------------------------------------------------------------------------------------------*/ +.fc-unthemed .fc-list-item:hover td { + background-color: #f5f5f5; +} + +/* Toolbar +--------------------------------------------------------------------------------------------------*/ +.fc-toolbar { + display: flex; + justify-content: space-between; + align-items: center; +} + +.fc-toolbar.fc-header-toolbar { + margin-bottom: 1.5em; +} + +.fc-toolbar.fc-footer-toolbar { + margin-top: 1.5em; +} + +/* inner content */ +.fc-toolbar > * > :not(:first-child) { + margin-left: 0.75em; +} + +.fc-toolbar h2 { + font-size: 1.75em; + margin: 0; +} + +/* View Structure +--------------------------------------------------------------------------------------------------*/ +.fc-view-container { + position: relative; +} + +/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */ +/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */ +.fc-view-container *, +.fc-view-container *:before, +.fc-view-container *:after { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.fc-view, +.fc-view > table { + /* so dragged elements can be above the view's main element */ + position: relative; + z-index: 1; +} + +@media print { + .fc { + max-width: 100% !important; + } + + /* Global Event Restyling + --------------------------------------------------------------------------------------------------*/ + .fc-event { + background: #fff !important; + color: #000 !important; + page-break-inside: avoid; + } + + .fc-event .fc-resizer { + display: none; + } + + /* Table & Day-Row Restyling + --------------------------------------------------------------------------------------------------*/ + .fc th, +.fc td, +.fc hr, +.fc thead, +.fc tbody, +.fc-row { + border-color: #ccc !important; + background: #fff !important; + } + + /* kill the overlaid, absolutely-positioned components */ + /* common... */ + .fc-bg, +.fc-bgevent-skeleton, +.fc-highlight-skeleton, +.fc-mirror-skeleton, +.fc-bgevent-container, +.fc-business-container, +.fc-highlight-container, +.fc-mirror-container { + display: none; + } + + /* don't force a min-height on rows (for DayGrid) */ + .fc tbody .fc-row { + height: auto !important; + /* undo height that JS set in distributeHeight */ + min-height: 0 !important; + /* undo the min-height from each view's specific stylesheet */ + } + + .fc tbody .fc-row .fc-content-skeleton { + position: static; + /* undo .fc-rigid */ + padding-bottom: 0 !important; + /* use a more border-friendly method for this... */ + } + + .fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td { + /* only works in newer browsers */ + padding-bottom: 1em; + /* ...gives space within the skeleton. also ensures min height in a way */ + } + + .fc tbody .fc-row .fc-content-skeleton table { + /* provides a min-height for the row, but only effective for IE, which exaggerates this value, + making it look more like 3em. for other browers, it will already be this tall */ + height: 1em; + } + + /* Undo month-view event limiting. Display all events and hide the "more" links + --------------------------------------------------------------------------------------------------*/ + .fc-more-cell, +.fc-more { + display: none !important; + } + + .fc tr.fc-limited { + display: table-row !important; + } + + .fc td.fc-limited { + display: table-cell !important; + } + + .fc-popover { + display: none; + /* never display the "more.." popover in print mode */ + } + + /* TimeGrid Restyling + --------------------------------------------------------------------------------------------------*/ + /* undo the min-height 100% trick used to fill the container's height */ + .fc-time-grid { + min-height: 0 !important; + } + + /* don't display the side axis at all ("all-day" and time cells) */ + .fc-timeGrid-view .fc-axis { + display: none; + } + + /* don't display the horizontal lines */ + .fc-slats, +.fc-time-grid hr { + /* this hr is used when height is underused and needs to be filled */ + display: none !important; + /* important overrides inline declaration */ + } + + /* let the container that holds the events be naturally positioned and create real height */ + .fc-time-grid .fc-content-skeleton { + position: static; + } + + /* in case there are no events, we still want some height */ + .fc-time-grid .fc-content-skeleton table { + height: 4em; + } + + /* kill the horizontal spacing made by the event container. event margins will be done below */ + .fc-time-grid .fc-event-container { + margin: 0 !important; + } + + /* TimeGrid *Event* Restyling + --------------------------------------------------------------------------------------------------*/ + /* naturally position events, vertically stacking them */ + .fc-time-grid .fc-event { + position: static !important; + margin: 3px 2px !important; + } + + /* for events that continue to a future day, give the bottom border back */ + .fc-time-grid .fc-event.fc-not-end { + border-bottom-width: 1px !important; + } + + /* indicate the event continues via "..." text */ + .fc-time-grid .fc-event.fc-not-end:after { + content: "..."; + } + + /* for events that are continuations from previous days, give the top border back */ + .fc-time-grid .fc-event.fc-not-start { + border-top-width: 1px !important; + } + + /* indicate the event is a continuation via "..." text */ + .fc-time-grid .fc-event.fc-not-start:before { + content: "..."; + } + + /* time */ + /* undo a previous declaration and let the time text span to a second line */ + .fc-time-grid .fc-event .fc-time { + white-space: normal !important; + } + + /* hide the the time that is normally displayed... */ + .fc-time-grid .fc-event .fc-time span { + display: none; + } + + /* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */ + .fc-time-grid .fc-event .fc-time:after { + content: attr(data-full); + } + + /* Vertical Scroller & Containers + --------------------------------------------------------------------------------------------------*/ + /* kill the scrollbars and allow natural height */ + .fc-scroller, +.fc-day-grid-container, +.fc-time-grid-container { + /* */ + overflow: visible !important; + height: auto !important; + } + + /* kill the horizontal border/padding used to compensate for scrollbars */ + .fc-row { + border: 0 !important; + margin: 0 !important; + } + + /* Button Controls + --------------------------------------------------------------------------------------------------*/ + .fc-button-group, +.fc button { + display: none; + /* don't display any button-related controls */ + } +} diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/main.js b/src/main/resources/static/assets/libs/fullcalendar/core/main.js new file mode 100644 index 0000000..ec0808d --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/main.js @@ -0,0 +1,8717 @@ +/*! +FullCalendar Core Package v4.3.1 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.FullCalendar = {})); +}(this, function (exports) { 'use strict'; + + // Creating + // ---------------------------------------------------------------------------------------------------------------- + var elementPropHash = { + className: true, + colSpan: true, + rowSpan: true + }; + var containerTagHash = { + '= rect.left && + point.left < rect.right && + point.top >= rect.top && + point.top < rect.bottom; + } + // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false + function intersectRects(rect1, rect2) { + var res = { + left: Math.max(rect1.left, rect2.left), + right: Math.min(rect1.right, rect2.right), + top: Math.max(rect1.top, rect2.top), + bottom: Math.min(rect1.bottom, rect2.bottom) + }; + if (res.left < res.right && res.top < res.bottom) { + return res; + } + return false; + } + function translateRect(rect, deltaX, deltaY) { + return { + left: rect.left + deltaX, + right: rect.right + deltaX, + top: rect.top + deltaY, + bottom: rect.bottom + deltaY + }; + } + // Returns a new point that will have been moved to reside within the given rectangle + function constrainPoint(point, rect) { + return { + left: Math.min(Math.max(point.left, rect.left), rect.right), + top: Math.min(Math.max(point.top, rect.top), rect.bottom) + }; + } + // Returns a point that is the center of the given rectangle + function getRectCenter(rect) { + return { + left: (rect.left + rect.right) / 2, + top: (rect.top + rect.bottom) / 2 + }; + } + // Subtracts point2's coordinates from point1's coordinates, returning a delta + function diffPoints(point1, point2) { + return { + left: point1.left - point2.left, + top: point1.top - point2.top + }; + } + + // Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side + var isRtlScrollbarOnLeft = null; + function getIsRtlScrollbarOnLeft() { + if (isRtlScrollbarOnLeft === null) { + isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft(); + } + return isRtlScrollbarOnLeft; + } + function computeIsRtlScrollbarOnLeft() { + var outerEl = createElement('div', { + style: { + position: 'absolute', + top: -1000, + left: 0, + border: 0, + padding: 0, + overflow: 'scroll', + direction: 'rtl' + } + }, '
'); + document.body.appendChild(outerEl); + var innerEl = outerEl.firstChild; + var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left; + removeElement(outerEl); + return res; + } + // The scrollbar width computations in computeEdges are sometimes flawed when it comes to + // retina displays, rounding, and IE11. Massage them into a usable value. + function sanitizeScrollbarWidth(width) { + width = Math.max(0, width); // no negatives + width = Math.round(width); + return width; + } + + function computeEdges(el, getPadding) { + if (getPadding === void 0) { getPadding = false; } + var computedStyle = window.getComputedStyle(el); + var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0; + var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0; + var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0; + var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; + // must use offset(Width|Height) because compatible with client(Width|Height) + var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight); + var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom); + var res = { + borderLeft: borderLeft, + borderRight: borderRight, + borderTop: borderTop, + borderBottom: borderBottom, + scrollbarBottom: scrollbarBottom, + scrollbarLeft: 0, + scrollbarRight: 0 + }; + if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side? + res.scrollbarLeft = scrollbarLeftRight; + } + else { + res.scrollbarRight = scrollbarLeftRight; + } + if (getPadding) { + res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0; + res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0; + res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0; + res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0; + } + return res; + } + function computeInnerRect(el, goWithinPadding) { + if (goWithinPadding === void 0) { goWithinPadding = false; } + var outerRect = computeRect(el); + var edges = computeEdges(el, goWithinPadding); + var res = { + left: outerRect.left + edges.borderLeft + edges.scrollbarLeft, + right: outerRect.right - edges.borderRight - edges.scrollbarRight, + top: outerRect.top + edges.borderTop, + bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom + }; + if (goWithinPadding) { + res.left += edges.paddingLeft; + res.right -= edges.paddingRight; + res.top += edges.paddingTop; + res.bottom -= edges.paddingBottom; + } + return res; + } + function computeRect(el) { + var rect = el.getBoundingClientRect(); + return { + left: rect.left + window.pageXOffset, + top: rect.top + window.pageYOffset, + right: rect.right + window.pageXOffset, + bottom: rect.bottom + window.pageYOffset + }; + } + function computeViewportRect() { + return { + left: window.pageXOffset, + right: window.pageXOffset + document.documentElement.clientWidth, + top: window.pageYOffset, + bottom: window.pageYOffset + document.documentElement.clientHeight + }; + } + function computeHeightAndMargins(el) { + return el.getBoundingClientRect().height + computeVMargins(el); + } + function computeVMargins(el) { + var computed = window.getComputedStyle(el); + return parseInt(computed.marginTop, 10) + + parseInt(computed.marginBottom, 10); + } + // does not return window + function getClippingParents(el) { + var parents = []; + while (el instanceof HTMLElement) { // will stop when gets to document or null + var computedStyle = window.getComputedStyle(el); + if (computedStyle.position === 'fixed') { + break; + } + if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) { + parents.push(el); + } + el = el.parentNode; + } + return parents; + } + function computeClippingRect(el) { + return getClippingParents(el) + .map(function (el) { + return computeInnerRect(el); + }) + .concat(computeViewportRect()) + .reduce(function (rect0, rect1) { + return intersectRects(rect0, rect1) || rect1; // should always intersect + }); + } + + // Stops a mouse/touch event from doing it's native browser action + function preventDefault(ev) { + ev.preventDefault(); + } + // Event Delegation + // ---------------------------------------------------------------------------------------------------------------- + function listenBySelector(container, eventType, selector, handler) { + function realHandler(ev) { + var matchedChild = elementClosest(ev.target, selector); + if (matchedChild) { + handler.call(matchedChild, ev, matchedChild); + } + } + container.addEventListener(eventType, realHandler); + return function () { + container.removeEventListener(eventType, realHandler); + }; + } + function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) { + var currentMatchedChild; + return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) { + if (matchedChild !== currentMatchedChild) { + currentMatchedChild = matchedChild; + onMouseEnter(ev, matchedChild); + var realOnMouseLeave_1 = function (ev) { + currentMatchedChild = null; + onMouseLeave(ev, matchedChild); + matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1); + }; + // listen to the next mouseleave, and then unattach + matchedChild.addEventListener('mouseleave', realOnMouseLeave_1); + } + }); + } + // Animation + // ---------------------------------------------------------------------------------------------------------------- + var transitionEventNames = [ + 'webkitTransitionEnd', + 'otransitionend', + 'oTransitionEnd', + 'msTransitionEnd', + 'transitionend' + ]; + // triggered only when the next single subsequent transition finishes + function whenTransitionDone(el, callback) { + var realCallback = function (ev) { + callback(ev); + transitionEventNames.forEach(function (eventName) { + el.removeEventListener(eventName, realCallback); + }); + }; + transitionEventNames.forEach(function (eventName) { + el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes + }); + } + + var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; + // Adding + function addWeeks(m, n) { + var a = dateToUtcArray(m); + a[2] += n * 7; + return arrayToUtcDate(a); + } + function addDays(m, n) { + var a = dateToUtcArray(m); + a[2] += n; + return arrayToUtcDate(a); + } + function addMs(m, n) { + var a = dateToUtcArray(m); + a[6] += n; + return arrayToUtcDate(a); + } + // Diffing (all return floats) + function diffWeeks(m0, m1) { + return diffDays(m0, m1) / 7; + } + function diffDays(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24); + } + function diffHours(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60); + } + function diffMinutes(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / (1000 * 60); + } + function diffSeconds(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / 1000; + } + function diffDayAndTime(m0, m1) { + var m0day = startOfDay(m0); + var m1day = startOfDay(m1); + return { + years: 0, + months: 0, + days: Math.round(diffDays(m0day, m1day)), + milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf()) + }; + } + // Diffing Whole Units + function diffWholeWeeks(m0, m1) { + var d = diffWholeDays(m0, m1); + if (d !== null && d % 7 === 0) { + return d / 7; + } + return null; + } + function diffWholeDays(m0, m1) { + if (timeAsMs(m0) === timeAsMs(m1)) { + return Math.round(diffDays(m0, m1)); + } + return null; + } + // Start-Of + function startOfDay(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate() + ]); + } + function startOfHour(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + m.getUTCHours() + ]); + } + function startOfMinute(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + m.getUTCHours(), + m.getUTCMinutes() + ]); + } + function startOfSecond(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + m.getUTCHours(), + m.getUTCMinutes(), + m.getUTCSeconds() + ]); + } + // Week Computation + function weekOfYear(marker, dow, doy) { + var y = marker.getUTCFullYear(); + var w = weekOfGivenYear(marker, y, dow, doy); + if (w < 1) { + return weekOfGivenYear(marker, y - 1, dow, doy); + } + var nextW = weekOfGivenYear(marker, y + 1, dow, doy); + if (nextW >= 1) { + return Math.min(w, nextW); + } + return w; + } + function weekOfGivenYear(marker, year, dow, doy) { + var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]); + var dayStart = startOfDay(marker); + var days = Math.round(diffDays(firstWeekStart, dayStart)); + return Math.floor(days / 7) + 1; // zero-indexed + } + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + // first-week day -- which january is always in the first week (4 for iso, 1 for other) + var fwd = 7 + dow - doy; + // first-week day local weekday -- which local weekday is fwd + var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7; + return -fwdlw + fwd - 1; + } + // Array Conversion + function dateToLocalArray(date) { + return [ + date.getFullYear(), + date.getMonth(), + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), + date.getMilliseconds() + ]; + } + function arrayToLocalDate(a) { + return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month + a[3] || 0, a[4] || 0, a[5] || 0); + } + function dateToUtcArray(date) { + return [ + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + date.getUTCHours(), + date.getUTCMinutes(), + date.getUTCSeconds(), + date.getUTCMilliseconds() + ]; + } + function arrayToUtcDate(a) { + // according to web standards (and Safari), a month index is required. + // massage if only given a year. + if (a.length === 1) { + a = a.concat([0]); + } + return new Date(Date.UTC.apply(Date, a)); + } + // Other Utils + function isValidDate(m) { + return !isNaN(m.valueOf()); + } + function timeAsMs(m) { + return m.getUTCHours() * 1000 * 60 * 60 + + m.getUTCMinutes() * 1000 * 60 + + m.getUTCSeconds() * 1000 + + m.getUTCMilliseconds(); + } + + var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds']; + var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/; + // Parsing and Creation + function createDuration(input, unit) { + var _a; + if (typeof input === 'string') { + return parseString(input); + } + else if (typeof input === 'object' && input) { // non-null object + return normalizeObject(input); + } + else if (typeof input === 'number') { + return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a)); + } + else { + return null; + } + } + function parseString(s) { + var m = PARSE_RE.exec(s); + if (m) { + var sign = m[1] ? -1 : 1; + return { + years: 0, + months: 0, + days: sign * (m[2] ? parseInt(m[2], 10) : 0), + milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours + (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes + (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds + (m[6] ? parseInt(m[6], 10) : 0) // ms + ) + }; + } + return null; + } + function normalizeObject(obj) { + return { + years: obj.years || obj.year || 0, + months: obj.months || obj.month || 0, + days: (obj.days || obj.day || 0) + + getWeeksFromInput(obj) * 7, + milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours + (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes + (obj.seconds || obj.second || 0) * 1000 + // seconds + (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms + }; + } + function getWeeksFromInput(obj) { + return obj.weeks || obj.week || 0; + } + // Equality + function durationsEqual(d0, d1) { + return d0.years === d1.years && + d0.months === d1.months && + d0.days === d1.days && + d0.milliseconds === d1.milliseconds; + } + function isSingleDay(dur) { + return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0; + } + // Simple Math + function addDurations(d0, d1) { + return { + years: d0.years + d1.years, + months: d0.months + d1.months, + days: d0.days + d1.days, + milliseconds: d0.milliseconds + d1.milliseconds + }; + } + function subtractDurations(d1, d0) { + return { + years: d1.years - d0.years, + months: d1.months - d0.months, + days: d1.days - d0.days, + milliseconds: d1.milliseconds - d0.milliseconds + }; + } + function multiplyDuration(d, n) { + return { + years: d.years * n, + months: d.months * n, + days: d.days * n, + milliseconds: d.milliseconds * n + }; + } + // Conversions + // "Rough" because they are based on average-case Gregorian months/years + function asRoughYears(dur) { + return asRoughDays(dur) / 365; + } + function asRoughMonths(dur) { + return asRoughDays(dur) / 30; + } + function asRoughDays(dur) { + return asRoughMs(dur) / 864e5; + } + function asRoughMinutes(dur) { + return asRoughMs(dur) / (1000 * 60); + } + function asRoughSeconds(dur) { + return asRoughMs(dur) / 1000; + } + function asRoughMs(dur) { + return dur.years * (365 * 864e5) + + dur.months * (30 * 864e5) + + dur.days * 864e5 + + dur.milliseconds; + } + // Advanced Math + function wholeDivideDurations(numerator, denominator) { + var res = null; + for (var i = 0; i < INTERNAL_UNITS.length; i++) { + var unit = INTERNAL_UNITS[i]; + if (denominator[unit]) { + var localRes = numerator[unit] / denominator[unit]; + if (!isInt(localRes) || (res !== null && res !== localRes)) { + return null; + } + res = localRes; + } + else if (numerator[unit]) { + // needs to divide by something but can't! + return null; + } + } + return res; + } + function greatestDurationDenominator(dur, dontReturnWeeks) { + var ms = dur.milliseconds; + if (ms) { + if (ms % 1000 !== 0) { + return { unit: 'millisecond', value: ms }; + } + if (ms % (1000 * 60) !== 0) { + return { unit: 'second', value: ms / 1000 }; + } + if (ms % (1000 * 60 * 60) !== 0) { + return { unit: 'minute', value: ms / (1000 * 60) }; + } + if (ms) { + return { unit: 'hour', value: ms / (1000 * 60 * 60) }; + } + } + if (dur.days) { + if (!dontReturnWeeks && dur.days % 7 === 0) { + return { unit: 'week', value: dur.days / 7 }; + } + return { unit: 'day', value: dur.days }; + } + if (dur.months) { + return { unit: 'month', value: dur.months }; + } + if (dur.years) { + return { unit: 'year', value: dur.years }; + } + return { unit: 'millisecond', value: 0 }; + } + + /* FullCalendar-specific DOM Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + // Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left + // and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that. + function compensateScroll(rowEl, scrollbarWidths) { + if (scrollbarWidths.left) { + applyStyle(rowEl, { + borderLeftWidth: 1, + marginLeft: scrollbarWidths.left - 1 + }); + } + if (scrollbarWidths.right) { + applyStyle(rowEl, { + borderRightWidth: 1, + marginRight: scrollbarWidths.right - 1 + }); + } + } + // Undoes compensateScroll and restores all borders/margins + function uncompensateScroll(rowEl) { + applyStyle(rowEl, { + marginLeft: '', + marginRight: '', + borderLeftWidth: '', + borderRightWidth: '' + }); + } + // Make the mouse cursor express that an event is not allowed in the current area + function disableCursor() { + document.body.classList.add('fc-not-allowed'); + } + // Returns the mouse cursor to its original look + function enableCursor() { + document.body.classList.remove('fc-not-allowed'); + } + // Given a total available height to fill, have `els` (essentially child rows) expand to accomodate. + // By default, all elements that are shorter than the recommended height are expanded uniformly, not considering + // any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and + // reduces the available height. + function distributeHeight(els, availableHeight, shouldRedistribute) { + // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions, + // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars. + var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element + var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE* + var flexEls = []; // elements that are allowed to expand. array of DOM nodes + var flexOffsets = []; // amount of vertical space it takes up + var flexHeights = []; // actual css height + var usedHeight = 0; + undistributeHeight(els); // give all elements their natural height + // find elements that are below the recommended height (expandable). + // important to query for heights in a single first pass (to avoid reflow oscillation). + els.forEach(function (el, i) { + var minOffset = i === els.length - 1 ? minOffset2 : minOffset1; + var naturalHeight = el.getBoundingClientRect().height; + var naturalOffset = naturalHeight + computeVMargins(el); + if (naturalOffset < minOffset) { + flexEls.push(el); + flexOffsets.push(naturalOffset); + flexHeights.push(naturalHeight); + } + else { + // this element stretches past recommended height (non-expandable). mark the space as occupied. + usedHeight += naturalOffset; + } + }); + // readjust the recommended height to only consider the height available to non-maxed-out rows. + if (shouldRedistribute) { + availableHeight -= usedHeight; + minOffset1 = Math.floor(availableHeight / flexEls.length); + minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE* + } + // assign heights to all expandable elements + flexEls.forEach(function (el, i) { + var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1; + var naturalOffset = flexOffsets[i]; + var naturalHeight = flexHeights[i]; + var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding + if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things + el.style.height = newHeight + 'px'; + } + }); + } + // Undoes distrubuteHeight, restoring all els to their natural height + function undistributeHeight(els) { + els.forEach(function (el) { + el.style.height = ''; + }); + } + // Given `els`, a set of cells, find the cell with the largest natural width and set the widths of all the + // cells to be that width. + // PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline + function matchCellWidths(els) { + var maxInnerWidth = 0; + els.forEach(function (el) { + var innerEl = el.firstChild; // hopefully an element + if (innerEl instanceof HTMLElement) { + var innerWidth_1 = innerEl.getBoundingClientRect().width; + if (innerWidth_1 > maxInnerWidth) { + maxInnerWidth = innerWidth_1; + } + } + }); + maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance + els.forEach(function (el) { + el.style.width = maxInnerWidth + 'px'; + }); + return maxInnerWidth; + } + // Given one element that resides inside another, + // Subtracts the height of the inner element from the outer element. + function subtractInnerElHeight(outerEl, innerEl) { + // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked + var reflowStyleProps = { + position: 'relative', + left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll + }; + applyStyle(outerEl, reflowStyleProps); + applyStyle(innerEl, reflowStyleProps); + var diff = // grab the dimensions + outerEl.getBoundingClientRect().height - + innerEl.getBoundingClientRect().height; + // undo hack + var resetStyleProps = { position: '', left: '' }; + applyStyle(outerEl, resetStyleProps); + applyStyle(innerEl, resetStyleProps); + return diff; + } + /* Selection + ----------------------------------------------------------------------------------------------------------------------*/ + function preventSelection(el) { + el.classList.add('fc-unselectable'); + el.addEventListener('selectstart', preventDefault); + } + function allowSelection(el) { + el.classList.remove('fc-unselectable'); + el.removeEventListener('selectstart', preventDefault); + } + /* Context Menu + ----------------------------------------------------------------------------------------------------------------------*/ + function preventContextMenu(el) { + el.addEventListener('contextmenu', preventDefault); + } + function allowContextMenu(el) { + el.removeEventListener('contextmenu', preventDefault); + } + /* Object Ordering by Field + ----------------------------------------------------------------------------------------------------------------------*/ + function parseFieldSpecs(input) { + var specs = []; + var tokens = []; + var i; + var token; + if (typeof input === 'string') { + tokens = input.split(/\s*,\s*/); + } + else if (typeof input === 'function') { + tokens = [input]; + } + else if (Array.isArray(input)) { + tokens = input; + } + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + if (typeof token === 'string') { + specs.push(token.charAt(0) === '-' ? + { field: token.substring(1), order: -1 } : + { field: token, order: 1 }); + } + else if (typeof token === 'function') { + specs.push({ func: token }); + } + } + return specs; + } + function compareByFieldSpecs(obj0, obj1, fieldSpecs) { + var i; + var cmp; + for (i = 0; i < fieldSpecs.length; i++) { + cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]); + if (cmp) { + return cmp; + } + } + return 0; + } + function compareByFieldSpec(obj0, obj1, fieldSpec) { + if (fieldSpec.func) { + return fieldSpec.func(obj0, obj1); + } + return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field]) + * (fieldSpec.order || 1); + } + function flexibleCompare(a, b) { + if (!a && !b) { + return 0; + } + if (b == null) { + return -1; + } + if (a == null) { + return 1; + } + if (typeof a === 'string' || typeof b === 'string') { + return String(a).localeCompare(String(b)); + } + return a - b; + } + /* String Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + function capitaliseFirstLetter(str) { + return str.charAt(0).toUpperCase() + str.slice(1); + } + function padStart(val, len) { + var s = String(val); + return '000'.substr(0, len - s.length) + s; + } + /* Number Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + function compareNumbers(a, b) { + return a - b; + } + function isInt(n) { + return n % 1 === 0; + } + /* Weird Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + function applyAll(functions, thisObj, args) { + if (typeof functions === 'function') { // supplied a single function + functions = [functions]; + } + if (functions) { + var i = void 0; + var ret = void 0; + for (i = 0; i < functions.length; i++) { + ret = functions[i].apply(thisObj, args) || ret; + } + return ret; + } + } + function firstDefined() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + for (var i = 0; i < args.length; i++) { + if (args[i] !== undefined) { + return args[i]; + } + } + } + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + // https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714 + function debounce(func, wait) { + var timeout; + var args; + var context; + var timestamp; + var result; + var later = function () { + var last = new Date().valueOf() - timestamp; + if (last < wait) { + timeout = setTimeout(later, wait - last); + } + else { + timeout = null; + result = func.apply(context, args); + context = args = null; + } + }; + return function () { + context = this; + args = arguments; + timestamp = new Date().valueOf(); + if (!timeout) { + timeout = setTimeout(later, wait); + } + return result; + }; + } + // Number and Boolean are only types that defaults or not computed for + // TODO: write more comments + function refineProps(rawProps, processors, defaults, leftoverProps) { + if (defaults === void 0) { defaults = {}; } + var refined = {}; + for (var key in processors) { + var processor = processors[key]; + if (rawProps[key] !== undefined) { + // found + if (processor === Function) { + refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null; + } + else if (processor) { // a refining function? + refined[key] = processor(rawProps[key]); + } + else { + refined[key] = rawProps[key]; + } + } + else if (defaults[key] !== undefined) { + // there's an explicit default + refined[key] = defaults[key]; + } + else { + // must compute a default + if (processor === String) { + refined[key] = ''; // empty string is default for String + } + else if (!processor || processor === Number || processor === Boolean || processor === Function) { + refined[key] = null; // assign null for other non-custom processor funcs + } + else { + refined[key] = processor(null); // run the custom processor func + } + } + } + if (leftoverProps) { + for (var key in rawProps) { + if (processors[key] === undefined) { + leftoverProps[key] = rawProps[key]; + } + } + } + return refined; + } + /* Date stuff that doesn't belong in datelib core + ----------------------------------------------------------------------------------------------------------------------*/ + // given a timed range, computes an all-day range that has the same exact duration, + // but whose start time is aligned with the start of the day. + function computeAlignedDayRange(timedRange) { + var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1; + var start = startOfDay(timedRange.start); + var end = addDays(start, dayCnt); + return { start: start, end: end }; + } + // given a timed range, computes an all-day range based on how for the end date bleeds into the next day + // TODO: give nextDayThreshold a default arg + function computeVisibleDayRange(timedRange, nextDayThreshold) { + if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); } + var startDay = null; + var endDay = null; + if (timedRange.end) { + endDay = startOfDay(timedRange.end); + var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay` + // If the end time is actually inclusively part of the next day and is equal to or + // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`. + // Otherwise, leaving it as inclusive will cause it to exclude `endDay`. + if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) { + endDay = addDays(endDay, 1); + } + } + if (timedRange.start) { + startDay = startOfDay(timedRange.start); // the beginning of the day the range starts + // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day. + if (endDay && endDay <= startDay) { + endDay = addDays(startDay, 1); + } + } + return { start: startDay, end: endDay }; + } + // spans from one day into another? + function isMultiDayRange(range) { + var visibleRange = computeVisibleDayRange(range); + return diffDays(visibleRange.start, visibleRange.end) > 1; + } + function diffDates(date0, date1, dateEnv, largeUnit) { + if (largeUnit === 'year') { + return createDuration(dateEnv.diffWholeYears(date0, date1), 'year'); + } + else if (largeUnit === 'month') { + return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month'); + } + else { + return diffDayAndTime(date0, date1); // returns a duration + } + } + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) { + for (var i = 0; i < recurringTypes.length; i++) { + var localLeftovers = {}; + var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv); + if (parsed) { + var allDay = localLeftovers.allDay; + delete localLeftovers.allDay; // remove from leftovers + if (allDay == null) { + allDay = allDayDefault; + if (allDay == null) { + allDay = parsed.allDayGuess; + if (allDay == null) { + allDay = false; + } + } + } + __assign(leftovers, localLeftovers); + return { + allDay: allDay, + duration: parsed.duration, + typeData: parsed.typeData, + typeId: i + }; + } + } + return null; + } + /* + Event MUST have a recurringDef + */ + function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) { + var typeDef = recurringTypes[eventDef.recurringDef.typeId]; + var markers = typeDef.expand(eventDef.recurringDef.typeData, { + start: dateEnv.subtract(framingRange.start, duration), + end: framingRange.end + }, dateEnv); + // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to + if (eventDef.allDay) { + markers = markers.map(startOfDay); + } + return markers; + } + + var hasOwnProperty = Object.prototype.hasOwnProperty; + // Merges an array of objects into a single object. + // The second argument allows for an array of property names who's object values will be merged together. + function mergeProps(propObjs, complexProps) { + var dest = {}; + var i; + var name; + var complexObjs; + var j; + var val; + var props; + if (complexProps) { + for (i = 0; i < complexProps.length; i++) { + name = complexProps[i]; + complexObjs = []; + // collect the trailing object values, stopping when a non-object is discovered + for (j = propObjs.length - 1; j >= 0; j--) { + val = propObjs[j][name]; + if (typeof val === 'object' && val) { // non-null object + complexObjs.unshift(val); + } + else if (val !== undefined) { + dest[name] = val; // if there were no objects, this value will be used + break; + } + } + // if the trailing values were objects, use the merged value + if (complexObjs.length) { + dest[name] = mergeProps(complexObjs); + } + } + } + // copy values into the destination, going from last to first + for (i = propObjs.length - 1; i >= 0; i--) { + props = propObjs[i]; + for (name in props) { + if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign + dest[name] = props[name]; + } + } + } + return dest; + } + function filterHash(hash, func) { + var filtered = {}; + for (var key in hash) { + if (func(hash[key], key)) { + filtered[key] = hash[key]; + } + } + return filtered; + } + function mapHash(hash, func) { + var newHash = {}; + for (var key in hash) { + newHash[key] = func(hash[key], key); + } + return newHash; + } + function arrayToHash(a) { + var hash = {}; + for (var _i = 0, a_1 = a; _i < a_1.length; _i++) { + var item = a_1[_i]; + hash[item] = true; + } + return hash; + } + function hashValuesToArray(obj) { + var a = []; + for (var key in obj) { + a.push(obj[key]); + } + return a; + } + function isPropsEqual(obj0, obj1) { + for (var key in obj0) { + if (hasOwnProperty.call(obj0, key)) { + if (!(key in obj1)) { + return false; + } + } + } + for (var key in obj1) { + if (hasOwnProperty.call(obj1, key)) { + if (obj0[key] !== obj1[key]) { + return false; + } + } + } + return true; + } + + function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) { + var eventStore = createEmptyEventStore(); + for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) { + var rawEvent = rawEvents_1[_i]; + var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange); + if (tuple) { + eventTupleToStore(tuple, eventStore); + } + } + return eventStore; + } + function eventTupleToStore(tuple, eventStore) { + if (eventStore === void 0) { eventStore = createEmptyEventStore(); } + eventStore.defs[tuple.def.defId] = tuple.def; + if (tuple.instance) { + eventStore.instances[tuple.instance.instanceId] = tuple.instance; + } + return eventStore; + } + function expandRecurring(eventStore, framingRange, calendar) { + var dateEnv = calendar.dateEnv; + var defs = eventStore.defs, instances = eventStore.instances; + // remove existing recurring instances + instances = filterHash(instances, function (instance) { + return !defs[instance.defId].recurringDef; + }); + for (var defId in defs) { + var def = defs[defId]; + if (def.recurringDef) { + var duration = def.recurringDef.duration; + if (!duration) { + duration = def.allDay ? + calendar.defaultAllDayEventDuration : + calendar.defaultTimedEventDuration; + } + var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes); + for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) { + var start = starts_1[_i]; + var instance = createEventInstance(defId, { + start: start, + end: dateEnv.add(start, duration) + }); + instances[instance.instanceId] = instance; + } + } + } + return { defs: defs, instances: instances }; + } + // retrieves events that have the same groupId as the instance specified by `instanceId` + // or they are the same as the instance. + // why might instanceId not be in the store? an event from another calendar? + function getRelevantEvents(eventStore, instanceId) { + var instance = eventStore.instances[instanceId]; + if (instance) { + var def_1 = eventStore.defs[instance.defId]; + // get events/instances with same group + var newStore = filterEventStoreDefs(eventStore, function (lookDef) { + return isEventDefsGrouped(def_1, lookDef); + }); + // add the original + // TODO: wish we could use eventTupleToStore or something like it + newStore.defs[def_1.defId] = def_1; + newStore.instances[instance.instanceId] = instance; + return newStore; + } + return createEmptyEventStore(); + } + function isEventDefsGrouped(def0, def1) { + return Boolean(def0.groupId && def0.groupId === def1.groupId); + } + function transformRawEvents(rawEvents, eventSource, calendar) { + var calEachTransform = calendar.opt('eventDataTransform'); + var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null; + if (sourceEachTransform) { + rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform); + } + if (calEachTransform) { + rawEvents = transformEachRawEvent(rawEvents, calEachTransform); + } + return rawEvents; + } + function transformEachRawEvent(rawEvents, func) { + var refinedEvents; + if (!func) { + refinedEvents = rawEvents; + } + else { + refinedEvents = []; + for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) { + var rawEvent = rawEvents_2[_i]; + var refinedEvent = func(rawEvent); + if (refinedEvent) { + refinedEvents.push(refinedEvent); + } + else if (refinedEvent == null) { + refinedEvents.push(rawEvent); + } // if a different falsy value, do nothing + } + } + return refinedEvents; + } + function createEmptyEventStore() { + return { defs: {}, instances: {} }; + } + function mergeEventStores(store0, store1) { + return { + defs: __assign({}, store0.defs, store1.defs), + instances: __assign({}, store0.instances, store1.instances) + }; + } + function filterEventStoreDefs(eventStore, filterFunc) { + var defs = filterHash(eventStore.defs, filterFunc); + var instances = filterHash(eventStore.instances, function (instance) { + return defs[instance.defId]; // still exists? + }); + return { defs: defs, instances: instances }; + } + + function parseRange(input, dateEnv) { + var start = null; + var end = null; + if (input.start) { + start = dateEnv.createMarker(input.start); + } + if (input.end) { + end = dateEnv.createMarker(input.end); + } + if (!start && !end) { + return null; + } + if (start && end && end < start) { + return null; + } + return { start: start, end: end }; + } + // SIDE-EFFECT: will mutate ranges. + // Will return a new array result. + function invertRanges(ranges, constraintRange) { + var invertedRanges = []; + var start = constraintRange.start; // the end of the previous range. the start of the new range + var i; + var dateRange; + // ranges need to be in order. required for our date-walking algorithm + ranges.sort(compareRanges); + for (i = 0; i < ranges.length; i++) { + dateRange = ranges[i]; + // add the span of time before the event (if there is any) + if (dateRange.start > start) { // compare millisecond time (skip any ambig logic) + invertedRanges.push({ start: start, end: dateRange.start }); + } + if (dateRange.end > start) { + start = dateRange.end; + } + } + // add the span of time after the last event (if there is any) + if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic) + invertedRanges.push({ start: start, end: constraintRange.end }); + } + return invertedRanges; + } + function compareRanges(range0, range1) { + return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first + } + function intersectRanges(range0, range1) { + var start = range0.start; + var end = range0.end; + var newRange = null; + if (range1.start !== null) { + if (start === null) { + start = range1.start; + } + else { + start = new Date(Math.max(start.valueOf(), range1.start.valueOf())); + } + } + if (range1.end != null) { + if (end === null) { + end = range1.end; + } + else { + end = new Date(Math.min(end.valueOf(), range1.end.valueOf())); + } + } + if (start === null || end === null || start < end) { + newRange = { start: start, end: end }; + } + return newRange; + } + function rangesEqual(range0, range1) { + return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) && + (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf()); + } + function rangesIntersect(range0, range1) { + return (range0.end === null || range1.start === null || range0.end > range1.start) && + (range0.start === null || range1.end === null || range0.start < range1.end); + } + function rangeContainsRange(outerRange, innerRange) { + return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) && + (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end)); + } + function rangeContainsMarker(range, date) { + return (range.start === null || date >= range.start) && + (range.end === null || date < range.end); + } + // If the given date is not within the given range, move it inside. + // (If it's past the end, make it one millisecond before the end). + function constrainMarkerToRange(date, range) { + if (range.start != null && date < range.start) { + return range.start; + } + if (range.end != null && date >= range.end) { + return new Date(range.end.valueOf() - 1); + } + return date; + } + + function removeExact(array, exactVal) { + var removeCnt = 0; + var i = 0; + while (i < array.length) { + if (array[i] === exactVal) { + array.splice(i, 1); + removeCnt++; + } + else { + i++; + } + } + return removeCnt; + } + function isArraysEqual(a0, a1) { + var len = a0.length; + var i; + if (len !== a1.length) { // not array? or not same length? + return false; + } + for (i = 0; i < len; i++) { + if (a0[i] !== a1[i]) { + return false; + } + } + return true; + } + + function memoize(workerFunc) { + var args; + var res; + return function () { + if (!args || !isArraysEqual(args, arguments)) { + args = arguments; + res = workerFunc.apply(this, arguments); + } + return res; + }; + } + /* + always executes the workerFunc, but if the result is equal to the previous result, + return the previous result instead. + */ + function memoizeOutput(workerFunc, equalityFunc) { + var cachedRes = null; + return function () { + var newRes = workerFunc.apply(this, arguments); + if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) { + cachedRes = newRes; + } + return cachedRes; + }; + } + + var EXTENDED_SETTINGS_AND_SEVERITIES = { + week: 3, + separator: 0, + omitZeroMinute: 0, + meridiem: 0, + omitCommas: 0 + }; + var STANDARD_DATE_PROP_SEVERITIES = { + timeZoneName: 7, + era: 6, + year: 5, + month: 4, + day: 2, + weekday: 2, + hour: 1, + minute: 1, + second: 1 + }; + var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too + var COMMA_RE = /,/g; // we need re for globalness + var MULTI_SPACE_RE = /\s+/g; + var LTR_RE = /\u200e/g; // control character + var UTC_RE = /UTC|GMT/; + var NativeFormatter = /** @class */ (function () { + function NativeFormatter(formatSettings) { + var standardDateProps = {}; + var extendedSettings = {}; + var severity = 0; + for (var name_1 in formatSettings) { + if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) { + extendedSettings[name_1] = formatSettings[name_1]; + severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity); + } + else { + standardDateProps[name_1] = formatSettings[name_1]; + if (name_1 in STANDARD_DATE_PROP_SEVERITIES) { + severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity); + } + } + } + this.standardDateProps = standardDateProps; + this.extendedSettings = extendedSettings; + this.severity = severity; + this.buildFormattingFunc = memoize(buildFormattingFunc); + } + NativeFormatter.prototype.format = function (date, context) { + return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date); + }; + NativeFormatter.prototype.formatRange = function (start, end, context) { + var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings; + var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem); + if (!diffSeverity) { + return this.format(start, context); + } + var biggestUnitForPartial = diffSeverity; + if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time + (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') && + (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') && + (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) { + biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time + } + var full0 = this.format(start, context); + var full1 = this.format(end, context); + if (full0 === full1) { + return full0; + } + var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial); + var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context); + var partial0 = partialFormattingFunc(start); + var partial1 = partialFormattingFunc(end); + var insertion = findCommonInsertion(full0, partial0, full1, partial1); + var separator = extendedSettings.separator || ''; + if (insertion) { + return insertion.before + partial0 + separator + partial1 + insertion.after; + } + return full0 + separator + full1; + }; + NativeFormatter.prototype.getLargestUnit = function () { + switch (this.severity) { + case 7: + case 6: + case 5: + return 'year'; + case 4: + return 'month'; + case 3: + return 'week'; + default: + return 'day'; + } + }; + return NativeFormatter; + }()); + function buildFormattingFunc(standardDateProps, extendedSettings, context) { + var standardDatePropCnt = Object.keys(standardDateProps).length; + if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') { + return function (date) { + return formatTimeZoneOffset(date.timeZoneOffset); + }; + } + if (standardDatePropCnt === 0 && extendedSettings.week) { + return function (date) { + return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week); + }; + } + return buildNativeFormattingFunc(standardDateProps, extendedSettings, context); + } + function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) { + standardDateProps = __assign({}, standardDateProps); // copy + extendedSettings = __assign({}, extendedSettings); // copy + sanitizeSettings(standardDateProps, extendedSettings); + standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers + var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps); + var zeroFormat; // needed? + if (extendedSettings.omitZeroMinute) { + var zeroProps = __assign({}, standardDateProps); + delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings + zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps); + } + return function (date) { + var marker = date.marker; + var format; + if (zeroFormat && !marker.getUTCMinutes()) { + format = zeroFormat; + } + else { + format = normalFormat; + } + var s = format.format(marker); + return postProcess(s, date, standardDateProps, extendedSettings, context); + }; + } + function sanitizeSettings(standardDateProps, extendedSettings) { + // deal with a browser inconsistency where formatting the timezone + // requires that the hour/minute be present. + if (standardDateProps.timeZoneName) { + if (!standardDateProps.hour) { + standardDateProps.hour = '2-digit'; + } + if (!standardDateProps.minute) { + standardDateProps.minute = '2-digit'; + } + } + // only support short timezone names + if (standardDateProps.timeZoneName === 'long') { + standardDateProps.timeZoneName = 'short'; + } + // if requesting to display seconds, MUST display minutes + if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) { + delete extendedSettings.omitZeroMinute; + } + } + function postProcess(s, date, standardDateProps, extendedSettings, context) { + s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes + if (standardDateProps.timeZoneName === 'short') { + s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ? + 'UTC' : // important to normalize for IE, which does "GMT" + formatTimeZoneOffset(date.timeZoneOffset)); + } + if (extendedSettings.omitCommas) { + s = s.replace(COMMA_RE, '').trim(); + } + if (extendedSettings.omitZeroMinute) { + s = s.replace(':00', ''); // zeroFormat doesn't always achieve this + } + // ^ do anything that might create adjacent spaces before this point, + // because MERIDIEM_RE likes to eat up loading spaces + if (extendedSettings.meridiem === false) { + s = s.replace(MERIDIEM_RE, '').trim(); + } + else if (extendedSettings.meridiem === 'narrow') { // a/p + s = s.replace(MERIDIEM_RE, function (m0, m1) { + return m1.toLocaleLowerCase(); + }); + } + else if (extendedSettings.meridiem === 'short') { // am/pm + s = s.replace(MERIDIEM_RE, function (m0, m1) { + return m1.toLocaleLowerCase() + 'm'; + }); + } + else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase + s = s.replace(MERIDIEM_RE, function (m0) { + return m0.toLocaleLowerCase(); + }); + } + s = s.replace(MULTI_SPACE_RE, ' '); + s = s.trim(); + return s; + } + function injectTzoStr(s, tzoStr) { + var replaced = false; + s = s.replace(UTC_RE, function () { + replaced = true; + return tzoStr; + }); + // IE11 doesn't include UTC/GMT in the original string, so append to end + if (!replaced) { + s += ' ' + tzoStr; + } + return s; + } + function formatWeekNumber(num, weekLabel, locale, display) { + var parts = []; + if (display === 'narrow') { + parts.push(weekLabel); + } + else if (display === 'short') { + parts.push(weekLabel, ' '); + } + // otherwise, considered 'numeric' + parts.push(locale.simpleNumberFormat.format(num)); + if (locale.options.isRtl) { // TODO: use control characters instead? + parts.reverse(); + } + return parts.join(''); + } + // Range Formatting Utils + // 0 = exactly the same + // 1 = different by time + // and bigger + function computeMarkerDiffSeverity(d0, d1, ca) { + if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) { + return 5; + } + if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) { + return 4; + } + if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) { + return 2; + } + if (timeAsMs(d0) !== timeAsMs(d1)) { + return 1; + } + return 0; + } + function computePartialFormattingOptions(options, biggestUnit) { + var partialOptions = {}; + for (var name_2 in options) { + if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone) + STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) { + partialOptions[name_2] = options[name_2]; + } + } + return partialOptions; + } + function findCommonInsertion(full0, partial0, full1, partial1) { + var i0 = 0; + while (i0 < full0.length) { + var found0 = full0.indexOf(partial0, i0); + if (found0 === -1) { + break; + } + var before0 = full0.substr(0, found0); + i0 = found0 + partial0.length; + var after0 = full0.substr(i0); + var i1 = 0; + while (i1 < full1.length) { + var found1 = full1.indexOf(partial1, i1); + if (found1 === -1) { + break; + } + var before1 = full1.substr(0, found1); + i1 = found1 + partial1.length; + var after1 = full1.substr(i1); + if (before0 === before1 && after0 === after1) { + return { + before: before0, + after: after0 + }; + } + } + } + return null; + } + + /* + TODO: fix the terminology of "formatter" vs "formatting func" + */ + /* + At the time of instantiation, this object does not know which cmd-formatting system it will use. + It receives this at the time of formatting, as a setting. + */ + var CmdFormatter = /** @class */ (function () { + function CmdFormatter(cmdStr, separator) { + this.cmdStr = cmdStr; + this.separator = separator; + } + CmdFormatter.prototype.format = function (date, context) { + return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator)); + }; + CmdFormatter.prototype.formatRange = function (start, end, context) { + return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator)); + }; + return CmdFormatter; + }()); + + var FuncFormatter = /** @class */ (function () { + function FuncFormatter(func) { + this.func = func; + } + FuncFormatter.prototype.format = function (date, context) { + return this.func(createVerboseFormattingArg(date, null, context)); + }; + FuncFormatter.prototype.formatRange = function (start, end, context) { + return this.func(createVerboseFormattingArg(start, end, context)); + }; + return FuncFormatter; + }()); + + // Formatter Object Creation + function createFormatter(input, defaultSeparator) { + if (typeof input === 'object' && input) { // non-null object + if (typeof defaultSeparator === 'string') { + input = __assign({ separator: defaultSeparator }, input); + } + return new NativeFormatter(input); + } + else if (typeof input === 'string') { + return new CmdFormatter(input, defaultSeparator); + } + else if (typeof input === 'function') { + return new FuncFormatter(input); + } + } + // String Utils + // timeZoneOffset is in minutes + function buildIsoString(marker, timeZoneOffset, stripZeroTime) { + if (stripZeroTime === void 0) { stripZeroTime = false; } + var s = marker.toISOString(); + s = s.replace('.000', ''); + if (stripZeroTime) { + s = s.replace('T00:00:00Z', ''); + } + if (s.length > 10) { // time part wasn't stripped, can add timezone info + if (timeZoneOffset == null) { + s = s.replace('Z', ''); + } + else if (timeZoneOffset !== 0) { + s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true)); + } + // otherwise, its UTC-0 and we want to keep the Z + } + return s; + } + function formatIsoTimeString(marker) { + return padStart(marker.getUTCHours(), 2) + ':' + + padStart(marker.getUTCMinutes(), 2) + ':' + + padStart(marker.getUTCSeconds(), 2); + } + function formatTimeZoneOffset(minutes, doIso) { + if (doIso === void 0) { doIso = false; } + var sign = minutes < 0 ? '-' : '+'; + var abs = Math.abs(minutes); + var hours = Math.floor(abs / 60); + var mins = Math.round(abs % 60); + if (doIso) { + return sign + padStart(hours, 2) + ':' + padStart(mins, 2); + } + else { + return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : ''); + } + } + // Arg Utils + function createVerboseFormattingArg(start, end, context, separator) { + var startInfo = expandZonedMarker(start, context.calendarSystem); + var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null; + return { + date: startInfo, + start: startInfo, + end: endInfo, + timeZone: context.timeZone, + localeCodes: context.locale.codes, + separator: separator + }; + } + function expandZonedMarker(dateInfo, calendarSystem) { + var a = calendarSystem.markerToArray(dateInfo.marker); + return { + marker: dateInfo.marker, + timeZoneOffset: dateInfo.timeZoneOffset, + array: a, + year: a[0], + month: a[1], + day: a[2], + hour: a[3], + minute: a[4], + second: a[5], + millisecond: a[6] + }; + } + + var EventSourceApi = /** @class */ (function () { + function EventSourceApi(calendar, internalEventSource) { + this.calendar = calendar; + this.internalEventSource = internalEventSource; + } + EventSourceApi.prototype.remove = function () { + this.calendar.dispatch({ + type: 'REMOVE_EVENT_SOURCE', + sourceId: this.internalEventSource.sourceId + }); + }; + EventSourceApi.prototype.refetch = function () { + this.calendar.dispatch({ + type: 'FETCH_EVENT_SOURCES', + sourceIds: [this.internalEventSource.sourceId] + }); + }; + Object.defineProperty(EventSourceApi.prototype, "id", { + get: function () { + return this.internalEventSource.publicId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventSourceApi.prototype, "url", { + // only relevant to json-feed event sources + get: function () { + return this.internalEventSource.meta.url; + }, + enumerable: true, + configurable: true + }); + return EventSourceApi; + }()); + + var EventApi = /** @class */ (function () { + function EventApi(calendar, def, instance) { + this._calendar = calendar; + this._def = def; + this._instance = instance || null; + } + /* + TODO: make event struct more responsible for this + */ + EventApi.prototype.setProp = function (name, val) { + var _a, _b; + if (name in DATE_PROPS) ; + else if (name in NON_DATE_PROPS) { + if (typeof NON_DATE_PROPS[name] === 'function') { + val = NON_DATE_PROPS[name](val); + } + this.mutate({ + standardProps: (_a = {}, _a[name] = val, _a) + }); + } + else if (name in UNSCOPED_EVENT_UI_PROPS) { + var ui = void 0; + if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') { + val = UNSCOPED_EVENT_UI_PROPS[name](val); + } + if (name === 'color') { + ui = { backgroundColor: val, borderColor: val }; + } + else if (name === 'editable') { + ui = { startEditable: val, durationEditable: val }; + } + else { + ui = (_b = {}, _b[name] = val, _b); + } + this.mutate({ + standardProps: { ui: ui } + }); + } + }; + EventApi.prototype.setExtendedProp = function (name, val) { + var _a; + this.mutate({ + extendedProps: (_a = {}, _a[name] = val, _a) + }); + }; + EventApi.prototype.setStart = function (startInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = this._calendar.dateEnv; + var start = dateEnv.createMarker(startInput); + if (start && this._instance) { // TODO: warning if parsed bad + var instanceRange = this._instance.range; + var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!? + if (options.maintainDuration) { + this.mutate({ datesDelta: startDelta }); + } + else { + this.mutate({ startDelta: startDelta }); + } + } + }; + EventApi.prototype.setEnd = function (endInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = this._calendar.dateEnv; + var end; + if (endInput != null) { + end = dateEnv.createMarker(endInput); + if (!end) { + return; // TODO: warning if parsed bad + } + } + if (this._instance) { + if (end) { + var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity); + this.mutate({ endDelta: endDelta }); + } + else { + this.mutate({ standardProps: { hasEnd: false } }); + } + } + }; + EventApi.prototype.setDates = function (startInput, endInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = this._calendar.dateEnv; + var standardProps = { allDay: options.allDay }; + var start = dateEnv.createMarker(startInput); + var end; + if (!start) { + return; // TODO: warning if parsed bad + } + if (endInput != null) { + end = dateEnv.createMarker(endInput); + if (!end) { // TODO: warning if parsed bad + return; + } + } + if (this._instance) { + var instanceRange = this._instance.range; + // when computing the diff for an event being converted to all-day, + // compute diff off of the all-day values the way event-mutation does. + if (options.allDay === true) { + instanceRange = computeAlignedDayRange(instanceRange); + } + var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); + if (end) { + var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity); + if (durationsEqual(startDelta, endDelta)) { + this.mutate({ datesDelta: startDelta, standardProps: standardProps }); + } + else { + this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps }); + } + } + else { // means "clear the end" + standardProps.hasEnd = false; + this.mutate({ datesDelta: startDelta, standardProps: standardProps }); + } + } + }; + EventApi.prototype.moveStart = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // TODO: warning if parsed bad + this.mutate({ startDelta: delta }); + } + }; + EventApi.prototype.moveEnd = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // TODO: warning if parsed bad + this.mutate({ endDelta: delta }); + } + }; + EventApi.prototype.moveDates = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // TODO: warning if parsed bad + this.mutate({ datesDelta: delta }); + } + }; + EventApi.prototype.setAllDay = function (allDay, options) { + if (options === void 0) { options = {}; } + var standardProps = { allDay: allDay }; + var maintainDuration = options.maintainDuration; + if (maintainDuration == null) { + maintainDuration = this._calendar.opt('allDayMaintainDuration'); + } + if (this._def.allDay !== allDay) { + standardProps.hasEnd = maintainDuration; + } + this.mutate({ standardProps: standardProps }); + }; + EventApi.prototype.formatRange = function (formatInput) { + var dateEnv = this._calendar.dateEnv; + var instance = this._instance; + var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator')); + if (this._def.hasEnd) { + return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, { + forcedStartTzo: instance.forcedStartTzo, + forcedEndTzo: instance.forcedEndTzo + }); + } + else { + return dateEnv.format(instance.range.start, formatter, { + forcedTzo: instance.forcedStartTzo + }); + } + }; + EventApi.prototype.mutate = function (mutation) { + var def = this._def; + var instance = this._instance; + if (instance) { + this._calendar.dispatch({ + type: 'MUTATE_EVENTS', + instanceId: instance.instanceId, + mutation: mutation, + fromApi: true + }); + var eventStore = this._calendar.state.eventStore; + this._def = eventStore.defs[def.defId]; + this._instance = eventStore.instances[instance.instanceId]; + } + }; + EventApi.prototype.remove = function () { + this._calendar.dispatch({ + type: 'REMOVE_EVENT_DEF', + defId: this._def.defId + }); + }; + Object.defineProperty(EventApi.prototype, "source", { + get: function () { + var sourceId = this._def.sourceId; + if (sourceId) { + return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]); + } + return null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "start", { + get: function () { + return this._instance ? + this._calendar.dateEnv.toDate(this._instance.range.start) : + null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "end", { + get: function () { + return (this._instance && this._def.hasEnd) ? + this._calendar.dateEnv.toDate(this._instance.range.end) : + null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "id", { + // computable props that all access the def + // TODO: find a TypeScript-compatible way to do this at scale + get: function () { return this._def.publicId; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "groupId", { + get: function () { return this._def.groupId; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "allDay", { + get: function () { return this._def.allDay; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "title", { + get: function () { return this._def.title; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "url", { + get: function () { return this._def.url; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "rendering", { + get: function () { return this._def.rendering; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "startEditable", { + get: function () { return this._def.ui.startEditable; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "durationEditable", { + get: function () { return this._def.ui.durationEditable; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "constraint", { + get: function () { return this._def.ui.constraints[0] || null; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "overlap", { + get: function () { return this._def.ui.overlap; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "allow", { + get: function () { return this._def.ui.allows[0] || null; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "backgroundColor", { + get: function () { return this._def.ui.backgroundColor; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "borderColor", { + get: function () { return this._def.ui.borderColor; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "textColor", { + get: function () { return this._def.ui.textColor; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "classNames", { + // NOTE: user can't modify these because Object.freeze was called in event-def parsing + get: function () { return this._def.ui.classNames; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "extendedProps", { + get: function () { return this._def.extendedProps; }, + enumerable: true, + configurable: true + }); + return EventApi; + }()); + + /* + Specifying nextDayThreshold signals that all-day ranges should be sliced. + */ + function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) { + var inverseBgByGroupId = {}; + var inverseBgByDefId = {}; + var defByGroupId = {}; + var bgRanges = []; + var fgRanges = []; + var eventUis = compileEventUis(eventStore.defs, eventUiBases); + for (var defId in eventStore.defs) { + var def = eventStore.defs[defId]; + if (def.rendering === 'inverse-background') { + if (def.groupId) { + inverseBgByGroupId[def.groupId] = []; + if (!defByGroupId[def.groupId]) { + defByGroupId[def.groupId] = def; + } + } + else { + inverseBgByDefId[defId] = []; + } + } + } + for (var instanceId in eventStore.instances) { + var instance = eventStore.instances[instanceId]; + var def = eventStore.defs[instance.defId]; + var ui = eventUis[def.defId]; + var origRange = instance.range; + var normalRange = (!def.allDay && nextDayThreshold) ? + computeVisibleDayRange(origRange, nextDayThreshold) : + origRange; + var slicedRange = intersectRanges(normalRange, framingRange); + if (slicedRange) { + if (def.rendering === 'inverse-background') { + if (def.groupId) { + inverseBgByGroupId[def.groupId].push(slicedRange); + } + else { + inverseBgByDefId[instance.defId].push(slicedRange); + } + } + else { + (def.rendering === 'background' ? bgRanges : fgRanges).push({ + def: def, + ui: ui, + instance: instance, + range: slicedRange, + isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(), + isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf() + }); + } + } + } + for (var groupId in inverseBgByGroupId) { // BY GROUP + var ranges = inverseBgByGroupId[groupId]; + var invertedRanges = invertRanges(ranges, framingRange); + for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) { + var invertedRange = invertedRanges_1[_i]; + var def = defByGroupId[groupId]; + var ui = eventUis[def.defId]; + bgRanges.push({ + def: def, + ui: ui, + instance: null, + range: invertedRange, + isStart: false, + isEnd: false + }); + } + } + for (var defId in inverseBgByDefId) { + var ranges = inverseBgByDefId[defId]; + var invertedRanges = invertRanges(ranges, framingRange); + for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) { + var invertedRange = invertedRanges_2[_a]; + bgRanges.push({ + def: eventStore.defs[defId], + ui: eventUis[defId], + instance: null, + range: invertedRange, + isStart: false, + isEnd: false + }); + } + } + return { bg: bgRanges, fg: fgRanges }; + } + function hasBgRendering(def) { + return def.rendering === 'background' || def.rendering === 'inverse-background'; + } + function filterSegsViaEls(view, segs, isMirror) { + if (view.hasPublicHandlers('eventRender')) { + segs = segs.filter(function (seg) { + var custom = view.publiclyTrigger('eventRender', [ + { + event: new EventApi(view.calendar, seg.eventRange.def, seg.eventRange.instance), + isMirror: isMirror, + isStart: seg.isStart, + isEnd: seg.isEnd, + // TODO: include seg.range once all components consistently generate it + el: seg.el, + view: view + } + ]); + if (custom === false) { // means don't render at all + return false; + } + else if (custom && custom !== true) { + seg.el = custom; + } + return true; + }); + } + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + setElSeg(seg.el, seg); + } + return segs; + } + function setElSeg(el, seg) { + el.fcSeg = seg; + } + function getElSeg(el) { + return el.fcSeg || null; + } + // event ui computation + function compileEventUis(eventDefs, eventUiBases) { + return mapHash(eventDefs, function (eventDef) { + return compileEventUi(eventDef, eventUiBases); + }); + } + function compileEventUi(eventDef, eventUiBases) { + var uis = []; + if (eventUiBases['']) { + uis.push(eventUiBases['']); + } + if (eventUiBases[eventDef.defId]) { + uis.push(eventUiBases[eventDef.defId]); + } + uis.push(eventDef.ui); + return combineEventUis(uis); + } + + // applies the mutation to ALL defs/instances within the event store + function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) { + var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase); + var dest = createEmptyEventStore(); + for (var defId in eventStore.defs) { + var def = eventStore.defs[defId]; + dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar); + } + for (var instanceId in eventStore.instances) { + var instance = eventStore.instances[instanceId]; + var def = dest.defs[instance.defId]; // important to grab the newly modified def + dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar); + } + return dest; + } + function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) { + var standardProps = mutation.standardProps || {}; + // if hasEnd has not been specified, guess a good value based on deltas. + // if duration will change, there's no way the default duration will persist, + // and thus, we need to mark the event as having a real end + if (standardProps.hasEnd == null && + eventConfig.durationEditable && + (mutation.startDelta || mutation.endDelta)) { + standardProps.hasEnd = true; // TODO: is this mutation okay? + } + var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) }); + if (mutation.extendedProps) { + copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps); + } + for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) { + var applier = appliers_1[_i]; + applier(copy, mutation, calendar); + } + if (!copy.hasEnd && calendar.opt('forceEventDuration')) { + copy.hasEnd = true; + } + return copy; + } + function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef + eventConfig, mutation, calendar) { + var dateEnv = calendar.dateEnv; + var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true; + var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false; + var copy = __assign({}, eventInstance); + if (forceAllDay) { + copy.range = computeAlignedDayRange(copy.range); + } + if (mutation.datesDelta && eventConfig.startEditable) { + copy.range = { + start: dateEnv.add(copy.range.start, mutation.datesDelta), + end: dateEnv.add(copy.range.end, mutation.datesDelta) + }; + } + if (mutation.startDelta && eventConfig.durationEditable) { + copy.range = { + start: dateEnv.add(copy.range.start, mutation.startDelta), + end: copy.range.end + }; + } + if (mutation.endDelta && eventConfig.durationEditable) { + copy.range = { + start: copy.range.start, + end: dateEnv.add(copy.range.end, mutation.endDelta) + }; + } + if (clearEnd) { + copy.range = { + start: copy.range.start, + end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start) + }; + } + // in case event was all-day but the supplied deltas were not + // better util for this? + if (eventDef.allDay) { + copy.range = { + start: startOfDay(copy.range.start), + end: startOfDay(copy.range.end) + }; + } + // handle invalid durations + if (copy.range.end < copy.range.start) { + copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start); + } + return copy; + } + + function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) { + switch (action.type) { + case 'RECEIVE_EVENTS': // raw + return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar); + case 'ADD_EVENTS': // already parsed, but not expanded + return addEvent(eventStore, action.eventStore, // new ones + dateProfile ? dateProfile.activeRange : null, calendar); + case 'MERGE_EVENTS': // already parsed and expanded + return mergeEventStores(eventStore, action.eventStore); + case 'PREV': // TODO: how do we track all actions that affect dateProfile :( + case 'NEXT': + case 'SET_DATE': + case 'SET_VIEW_TYPE': + if (dateProfile) { + return expandRecurring(eventStore, dateProfile.activeRange, calendar); + } + else { + return eventStore; + } + case 'CHANGE_TIMEZONE': + return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv); + case 'MUTATE_EVENTS': + return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar); + case 'REMOVE_EVENT_INSTANCES': + return excludeInstances(eventStore, action.instances); + case 'REMOVE_EVENT_DEF': + return filterEventStoreDefs(eventStore, function (eventDef) { + return eventDef.defId !== action.defId; + }); + case 'REMOVE_EVENT_SOURCE': + return excludeEventsBySourceId(eventStore, action.sourceId); + case 'REMOVE_ALL_EVENT_SOURCES': + return filterEventStoreDefs(eventStore, function (eventDef) { + return !eventDef.sourceId; // only keep events with no source id + }); + case 'REMOVE_ALL_EVENTS': + return createEmptyEventStore(); + case 'RESET_EVENTS': + return { + defs: eventStore.defs, + instances: eventStore.instances + }; + default: + return eventStore; + } + } + function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) { + if (eventSource && // not already removed + fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources + ) { + var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar); + if (fetchRange) { + subset = expandRecurring(subset, fetchRange, calendar); + } + return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset); + } + return eventStore; + } + function addEvent(eventStore, subset, expandRange, calendar) { + if (expandRange) { + subset = expandRecurring(subset, expandRange, calendar); + } + return mergeEventStores(eventStore, subset); + } + function rezoneDates(eventStore, oldDateEnv, newDateEnv) { + var defs = eventStore.defs; + var instances = mapHash(eventStore.instances, function (instance) { + var def = defs[instance.defId]; + if (def.allDay || def.recurringDef) { + return instance; // isn't dependent on timezone + } + else { + return __assign({}, instance, { range: { + start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)), + end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo)) + }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo }); + } + }); + return { defs: defs, instances: instances }; + } + function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) { + var relevant = getRelevantEvents(eventStore, instanceId); + var eventConfigBase = fromApi ? + { '': { + startEditable: true, + durationEditable: true, + constraints: [], + overlap: null, + allows: [], + backgroundColor: '', + borderColor: '', + textColor: '', + classNames: [] + } } : + calendar.eventUiBases; + relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar); + return mergeEventStores(eventStore, relevant); + } + function excludeEventsBySourceId(eventStore, sourceId) { + return filterEventStoreDefs(eventStore, function (eventDef) { + return eventDef.sourceId !== sourceId; + }); + } + // QUESTION: why not just return instances? do a general object-property-exclusion util + function excludeInstances(eventStore, removals) { + return { + defs: eventStore.defs, + instances: filterHash(eventStore.instances, function (instance) { + return !removals[instance.instanceId]; + }) + }; + } + + // high-level segmenting-aware tester functions + // ------------------------------------------------------------------------------------------------------------------------ + function isInteractionValid(interaction, calendar) { + return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions + } + function isDateSelectionValid(dateSelection, calendar) { + return isNewPropsValid({ dateSelection: dateSelection }, calendar); + } + function isNewPropsValid(newProps, calendar) { + var view = calendar.view; + var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps); + return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar); + } + function isPropsValid(state, calendar, dateSpanMeta, filterConfig) { + if (dateSpanMeta === void 0) { dateSpanMeta = {}; } + if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) { + return false; + } + if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) { + return false; + } + return true; + } + // Moving Event Validation + // ------------------------------------------------------------------------------------------------------------------------ + function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) { + var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions + var subjectEventStore = interaction.mutatedEvents; + var subjectDefs = subjectEventStore.defs; + var subjectInstances = subjectEventStore.instances; + var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ? + state.eventUiBases : + { '': calendar.selectionConfig } // if not a real event, validate as a selection + ); + if (filterConfig) { + subjectConfigs = mapHash(subjectConfigs, filterConfig); + } + var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too? + var otherDefs = otherEventStore.defs; + var otherInstances = otherEventStore.instances; + var otherConfigs = compileEventUis(otherDefs, state.eventUiBases); + for (var subjectInstanceId in subjectInstances) { + var subjectInstance = subjectInstances[subjectInstanceId]; + var subjectRange = subjectInstance.range; + var subjectConfig = subjectConfigs[subjectInstance.defId]; + var subjectDef = subjectDefs[subjectInstance.defId]; + // constraint + if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) { + return false; + } + // overlap + var overlapFunc = calendar.opt('eventOverlap'); + if (typeof overlapFunc !== 'function') { + overlapFunc = null; + } + for (var otherInstanceId in otherInstances) { + var otherInstance = otherInstances[otherInstanceId]; + // intersect! evaluate + if (rangesIntersect(subjectRange, otherInstance.range)) { + var otherOverlap = otherConfigs[otherInstance.defId].overlap; + // consider the other event's overlap. only do this if the subject event is a "real" event + if (otherOverlap === false && interaction.isEvent) { + return false; + } + if (subjectConfig.overlap === false) { + return false; + } + if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event + new EventApi(calendar, subjectDef, subjectInstance) // moving event + )) { + return false; + } + } + } + // allow (a function) + var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state + for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) { + var subjectAllow = _a[_i]; + var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay }); + var origDef = calendarEventStore.defs[subjectDef.defId]; + var origInstance = calendarEventStore.instances[subjectInstanceId]; + var eventApi = void 0; + if (origDef) { // was previously in the calendar + eventApi = new EventApi(calendar, origDef, origInstance); + } + else { // was an external event + eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates + } + if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) { + return false; + } + } + } + return true; + } + // Date Selection Validation + // ------------------------------------------------------------------------------------------------------------------------ + function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) { + var relevantEventStore = state.eventStore; + var relevantDefs = relevantEventStore.defs; + var relevantInstances = relevantEventStore.instances; + var selection = state.dateSelection; + var selectionRange = selection.range; + var selectionConfig = calendar.selectionConfig; + if (filterConfig) { + selectionConfig = filterConfig(selectionConfig); + } + // constraint + if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) { + return false; + } + // overlap + var overlapFunc = calendar.opt('selectOverlap'); + if (typeof overlapFunc !== 'function') { + overlapFunc = null; + } + for (var relevantInstanceId in relevantInstances) { + var relevantInstance = relevantInstances[relevantInstanceId]; + // intersect! evaluate + if (rangesIntersect(selectionRange, relevantInstance.range)) { + if (selectionConfig.overlap === false) { + return false; + } + if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) { + return false; + } + } + } + // allow (a function) + for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) { + var selectionAllow = _a[_i]; + var fullDateSpan = __assign({}, dateSpanMeta, selection); + if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) { + return false; + } + } + return true; + } + // Constraint Utils + // ------------------------------------------------------------------------------------------------------------------------ + function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) { + for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) { + var constraint = constraints_1[_i]; + if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) { + return false; + } + } + return true; + } + function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours + otherEventStore, // for if constraint is an even group ID + businessHoursUnexpanded, // for if constraint is 'businessHours' + calendar // for expanding businesshours + ) { + if (constraint === 'businessHours') { + return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar)); + } + else if (typeof constraint === 'string') { // an group ID + return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) { + return eventDef.groupId === constraint; + })); + } + else if (typeof constraint === 'object' && constraint) { // non-null object + return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar)); + } + return []; // if it's false + } + // TODO: move to event-store file? + function eventStoreToRanges(eventStore) { + var instances = eventStore.instances; + var ranges = []; + for (var instanceId in instances) { + ranges.push(instances[instanceId].range); + } + return ranges; + } + // TODO: move to geom file? + function anyRangesContainRange(outerRanges, innerRange) { + for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) { + var outerRange = outerRanges_1[_i]; + if (rangeContainsRange(outerRange, innerRange)) { + return true; + } + } + return false; + } + // Parsing + // ------------------------------------------------------------------------------------------------------------------------ + function normalizeConstraint(input, calendar) { + if (Array.isArray(input)) { + return parseEvents(input, '', calendar, true); // allowOpenRange=true + } + else if (typeof input === 'object' && input) { // non-null object + return parseEvents([input], '', calendar, true); // allowOpenRange=true + } + else if (input != null) { + return String(input); + } + else { + return null; + } + } + + function htmlEscape(s) { + return (s + '').replace(/&/g, '&') + .replace(//g, '>') + .replace(/'/g, ''') + .replace(/"/g, '"') + .replace(/\n/g, '
'); + } + // Given a hash of CSS properties, returns a string of CSS. + // Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values. + function cssToStr(cssProps) { + var statements = []; + for (var name_1 in cssProps) { + var val = cssProps[name_1]; + if (val != null && val !== '') { + statements.push(name_1 + ':' + val); + } + } + return statements.join(';'); + } + // Given an object hash of HTML attribute names to values, + // generates a string that can be injected between < > in HTML + function attrsToStr(attrs) { + var parts = []; + for (var name_2 in attrs) { + var val = attrs[name_2]; + if (val != null) { + parts.push(name_2 + '="' + htmlEscape(val) + '"'); + } + } + return parts.join(' '); + } + function parseClassName(raw) { + if (Array.isArray(raw)) { + return raw; + } + else if (typeof raw === 'string') { + return raw.split(/\s+/); + } + else { + return []; + } + } + + var UNSCOPED_EVENT_UI_PROPS = { + editable: Boolean, + startEditable: Boolean, + durationEditable: Boolean, + constraint: null, + overlap: null, + allow: null, + className: parseClassName, + classNames: parseClassName, + color: String, + backgroundColor: String, + borderColor: String, + textColor: String + }; + function processUnscopedUiProps(rawProps, calendar, leftovers) { + var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers); + var constraint = normalizeConstraint(props.constraint, calendar); + return { + startEditable: props.startEditable != null ? props.startEditable : props.editable, + durationEditable: props.durationEditable != null ? props.durationEditable : props.editable, + constraints: constraint != null ? [constraint] : [], + overlap: props.overlap, + allows: props.allow != null ? [props.allow] : [], + backgroundColor: props.backgroundColor || props.color, + borderColor: props.borderColor || props.color, + textColor: props.textColor, + classNames: props.classNames.concat(props.className) + }; + } + function processScopedUiProps(prefix, rawScoped, calendar, leftovers) { + var rawUnscoped = {}; + var wasFound = {}; + for (var key in UNSCOPED_EVENT_UI_PROPS) { + var scopedKey = prefix + capitaliseFirstLetter(key); + rawUnscoped[key] = rawScoped[scopedKey]; + wasFound[scopedKey] = true; + } + if (prefix === 'event') { + rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable' + } + if (leftovers) { + for (var key in rawScoped) { + if (!wasFound[key]) { + leftovers[key] = rawScoped[key]; + } + } + } + return processUnscopedUiProps(rawUnscoped, calendar); + } + var EMPTY_EVENT_UI = { + startEditable: null, + durationEditable: null, + constraints: [], + overlap: null, + allows: [], + backgroundColor: '', + borderColor: '', + textColor: '', + classNames: [] + }; + // prevent against problems with <2 args! + function combineEventUis(uis) { + return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI); + } + function combineTwoEventUis(item0, item1) { + return { + startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable, + durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable, + constraints: item0.constraints.concat(item1.constraints), + overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap, + allows: item0.allows.concat(item1.allows), + backgroundColor: item1.backgroundColor || item0.backgroundColor, + borderColor: item1.borderColor || item0.borderColor, + textColor: item1.textColor || item0.textColor, + classNames: item0.classNames.concat(item1.classNames) + }; + } + + var NON_DATE_PROPS = { + id: String, + groupId: String, + title: String, + url: String, + rendering: String, + extendedProps: null + }; + var DATE_PROPS = { + start: null, + date: null, + end: null, + allDay: null + }; + var uid = 0; + function parseEvent(raw, sourceId, calendar, allowOpenRange) { + var allDayDefault = computeIsAllDayDefault(sourceId, calendar); + var leftovers0 = {}; + var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out + allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props + ); + if (recurringRes) { + var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar); + def.recurringDef = { + typeId: recurringRes.typeId, + typeData: recurringRes.typeData, + duration: recurringRes.duration + }; + return { def: def, instance: null }; + } + else { + var leftovers1 = {}; + var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange); + if (singleRes) { + var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar); + var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo); + return { def: def, instance: instance }; + } + } + return null; + } + /* + Will NOT populate extendedProps with the leftover properties. + Will NOT populate date-related props. + The EventNonDateInput has been normalized (id => publicId, etc). + */ + function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) { + var leftovers = {}; + var def = pluckNonDateProps(raw, calendar, leftovers); + def.defId = String(uid++); + def.sourceId = sourceId; + def.allDay = allDay; + def.hasEnd = hasEnd; + for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) { + var eventDefParser = _a[_i]; + var newLeftovers = {}; + eventDefParser(def, leftovers, newLeftovers); + leftovers = newLeftovers; + } + def.extendedProps = __assign(leftovers, def.extendedProps || {}); + // help out EventApi from having user modify props + Object.freeze(def.ui.classNames); + Object.freeze(def.extendedProps); + return def; + } + function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) { + return { + instanceId: String(uid++), + defId: defId, + range: range, + forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo, + forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo + }; + } + function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) { + var props = pluckDateProps(raw, leftovers); + var allDay = props.allDay; + var startMeta; + var startMarker = null; + var hasEnd = false; + var endMeta; + var endMarker = null; + startMeta = calendar.dateEnv.createMarkerMeta(props.start); + if (startMeta) { + startMarker = startMeta.marker; + } + else if (!allowOpenRange) { + return null; + } + if (props.end != null) { + endMeta = calendar.dateEnv.createMarkerMeta(props.end); + } + if (allDay == null) { + if (allDayDefault != null) { + allDay = allDayDefault; + } + else { + // fall back to the date props LAST + allDay = (!startMeta || startMeta.isTimeUnspecified) && + (!endMeta || endMeta.isTimeUnspecified); + } + } + if (allDay && startMarker) { + startMarker = startOfDay(startMarker); + } + if (endMeta) { + endMarker = endMeta.marker; + if (allDay) { + endMarker = startOfDay(endMarker); + } + if (startMarker && endMarker <= startMarker) { + endMarker = null; + } + } + if (endMarker) { + hasEnd = true; + } + else if (!allowOpenRange) { + hasEnd = calendar.opt('forceEventDuration') || false; + endMarker = calendar.dateEnv.add(startMarker, allDay ? + calendar.defaultAllDayEventDuration : + calendar.defaultTimedEventDuration); + } + return { + allDay: allDay, + hasEnd: hasEnd, + range: { start: startMarker, end: endMarker }, + forcedStartTzo: startMeta ? startMeta.forcedTzo : null, + forcedEndTzo: endMeta ? endMeta.forcedTzo : null + }; + } + function pluckDateProps(raw, leftovers) { + var props = refineProps(raw, DATE_PROPS, {}, leftovers); + props.start = (props.start !== null) ? props.start : props.date; + delete props.date; + return props; + } + function pluckNonDateProps(raw, calendar, leftovers) { + var preLeftovers = {}; + var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers); + var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers); + props.publicId = props.id; + delete props.id; + props.ui = ui; + return props; + } + function computeIsAllDayDefault(sourceId, calendar) { + var res = null; + if (sourceId) { + var source = calendar.state.eventSources[sourceId]; + res = source.allDayDefault; + } + if (res == null) { + res = calendar.opt('allDayDefault'); + } + return res; + } + + var DEF_DEFAULTS = { + startTime: '09:00', + endTime: '17:00', + daysOfWeek: [1, 2, 3, 4, 5], + rendering: 'inverse-background', + classNames: 'fc-nonbusiness', + groupId: '_businessHours' // so multiple defs get grouped + }; + /* + TODO: pass around as EventDefHash!!! + */ + function parseBusinessHours(input, calendar) { + return parseEvents(refineInputs(input), '', calendar); + } + function refineInputs(input) { + var rawDefs; + if (input === true) { + rawDefs = [{}]; // will get DEF_DEFAULTS verbatim + } + else if (Array.isArray(input)) { + // if specifying an array, every sub-definition NEEDS a day-of-week + rawDefs = input.filter(function (rawDef) { + return rawDef.daysOfWeek; + }); + } + else if (typeof input === 'object' && input) { // non-null object + rawDefs = [input]; + } + else { // is probably false + rawDefs = []; + } + rawDefs = rawDefs.map(function (rawDef) { + return __assign({}, DEF_DEFAULTS, rawDef); + }); + return rawDefs; + } + + function memoizeRendering(renderFunc, unrenderFunc, dependencies) { + if (dependencies === void 0) { dependencies = []; } + var dependents = []; + var thisContext; + var prevArgs; + function unrender() { + if (prevArgs) { + for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) { + var dependent = dependents_1[_i]; + dependent.unrender(); + } + if (unrenderFunc) { + unrenderFunc.apply(thisContext, prevArgs); + } + prevArgs = null; + } + } + function res() { + if (!prevArgs || !isArraysEqual(prevArgs, arguments)) { + unrender(); + thisContext = this; + prevArgs = arguments; + renderFunc.apply(this, arguments); + } + } + res.dependents = dependents; + res.unrender = unrender; + for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) { + var dependency = dependencies_1[_i]; + dependency.dependents.push(res); + } + return res; + } + + var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere + var Splitter = /** @class */ (function () { + function Splitter() { + this.getKeysForEventDefs = memoize(this._getKeysForEventDefs); + this.splitDateSelection = memoize(this._splitDateSpan); + this.splitEventStore = memoize(this._splitEventStore); + this.splitIndividualUi = memoize(this._splitIndividualUi); + this.splitEventDrag = memoize(this._splitInteraction); + this.splitEventResize = memoize(this._splitInteraction); + this.eventUiBuilders = {}; // TODO: typescript protection + } + Splitter.prototype.splitProps = function (props) { + var _this = this; + var keyInfos = this.getKeyInfo(props); + var defKeys = this.getKeysForEventDefs(props.eventStore); + var dateSelections = this.splitDateSelection(props.dateSelection); + var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases* + var eventStores = this.splitEventStore(props.eventStore, defKeys); + var eventDrags = this.splitEventDrag(props.eventDrag); + var eventResizes = this.splitEventResize(props.eventResize); + var splitProps = {}; + this.eventUiBuilders = mapHash(keyInfos, function (info, key) { + return _this.eventUiBuilders[key] || memoize(buildEventUiForKey); + }); + for (var key in keyInfos) { + var keyInfo = keyInfos[key]; + var eventStore = eventStores[key] || EMPTY_EVENT_STORE; + var buildEventUi = this.eventUiBuilders[key]; + splitProps[key] = { + businessHours: keyInfo.businessHours || props.businessHours, + dateSelection: dateSelections[key] || null, + eventStore: eventStore, + eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]), + eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '', + eventDrag: eventDrags[key] || null, + eventResize: eventResizes[key] || null + }; + } + return splitProps; + }; + Splitter.prototype._splitDateSpan = function (dateSpan) { + var dateSpans = {}; + if (dateSpan) { + var keys = this.getKeysForDateSpan(dateSpan); + for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { + var key = keys_1[_i]; + dateSpans[key] = dateSpan; + } + } + return dateSpans; + }; + Splitter.prototype._getKeysForEventDefs = function (eventStore) { + var _this = this; + return mapHash(eventStore.defs, function (eventDef) { + return _this.getKeysForEventDef(eventDef); + }); + }; + Splitter.prototype._splitEventStore = function (eventStore, defKeys) { + var defs = eventStore.defs, instances = eventStore.instances; + var splitStores = {}; + for (var defId in defs) { + for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { + var key = _a[_i]; + if (!splitStores[key]) { + splitStores[key] = createEmptyEventStore(); + } + splitStores[key].defs[defId] = defs[defId]; + } + } + for (var instanceId in instances) { + var instance = instances[instanceId]; + for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) { + var key = _c[_b]; + if (splitStores[key]) { // must have already been created + splitStores[key].instances[instanceId] = instance; + } + } + } + return splitStores; + }; + Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) { + var splitHashes = {}; + for (var defId in eventUiBases) { + if (defId) { // not the '' key + for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { + var key = _a[_i]; + if (!splitHashes[key]) { + splitHashes[key] = {}; + } + splitHashes[key][defId] = eventUiBases[defId]; + } + } + } + return splitHashes; + }; + Splitter.prototype._splitInteraction = function (interaction) { + var splitStates = {}; + if (interaction) { + var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar + ); + // can't rely on defKeys because event data is mutated + var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents); + var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId); + var populate = function (key) { + if (!splitStates[key]) { + splitStates[key] = { + affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE, + mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE, + isEvent: interaction.isEvent, + origSeg: interaction.origSeg + }; + } + }; + for (var key in affectedStores_1) { + populate(key); + } + for (var key in mutatedStores_1) { + populate(key); + } + } + return splitStates; + }; + return Splitter; + }()); + function buildEventUiForKey(allUi, eventUiForKey, individualUi) { + var baseParts = []; + if (allUi) { + baseParts.push(allUi); + } + if (eventUiForKey) { + baseParts.push(eventUiForKey); + } + var stuff = { + '': combineEventUis(baseParts) + }; + if (individualUi) { + __assign(stuff, individualUi); + } + return stuff; + } + + // Generates HTML for an anchor to another view into the calendar. + // Will either generate an
tag or a non-clickable tag, depending on enabled settings. + // `gotoOptions` can either be a DateMarker, or an object with the form: + // { date, type, forceOff } + // `type` is a view-type like "day" or "week". default value is "day". + // `attrs` and `innerHtml` are use to generate the rest of the HTML tag. + function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) { + var dateEnv = component.dateEnv; + var date; + var type; + var forceOff; + var finalOptions; + if (gotoOptions instanceof Date) { + date = gotoOptions; // a single date-like input + } + else { + date = gotoOptions.date; + type = gotoOptions.type; + forceOff = gotoOptions.forceOff; + } + finalOptions = { + date: dateEnv.formatIso(date, { omitTime: true }), + type: type || 'day' + }; + if (typeof attrs === 'string') { + innerHtml = attrs; + attrs = null; + } + attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space + innerHtml = innerHtml || ''; + if (!forceOff && component.opt('navLinks')) { + return '' + + innerHtml + + ''; + } + else { + return '' + + innerHtml + + ''; + } + } + function getAllDayHtml(component) { + return component.opt('allDayHtml') || htmlEscape(component.opt('allDayText')); + } + // Computes HTML classNames for a single-day element + function getDayClasses(date, dateProfile, context, noThemeHighlight) { + var calendar = context.calendar, view = context.view, theme = context.theme, dateEnv = context.dateEnv; + var classes = []; + var todayStart; + var todayEnd; + if (!rangeContainsMarker(dateProfile.activeRange, date)) { + classes.push('fc-disabled-day'); + } + else { + classes.push('fc-' + DAY_IDS[date.getUTCDay()]); + if (view.opt('monthMode') && + dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) { + classes.push('fc-other-month'); + } + todayStart = startOfDay(calendar.getNow()); + todayEnd = addDays(todayStart, 1); + if (date < todayStart) { + classes.push('fc-past'); + } + else if (date >= todayEnd) { + classes.push('fc-future'); + } + else { + classes.push('fc-today'); + if (noThemeHighlight !== true) { + classes.push(theme.getClass('today')); + } + } + } + return classes; + } + + // given a function that resolves a result asynchronously. + // the function can either call passed-in success and failure callbacks, + // or it can return a promise. + // if you need to pass additional params to func, bind them first. + function unpromisify(func, success, failure) { + // guard against success/failure callbacks being called more than once + // and guard against a promise AND callback being used together. + var isResolved = false; + var wrappedSuccess = function () { + if (!isResolved) { + isResolved = true; + success.apply(this, arguments); + } + }; + var wrappedFailure = function () { + if (!isResolved) { + isResolved = true; + if (failure) { + failure.apply(this, arguments); + } + } + }; + var res = func(wrappedSuccess, wrappedFailure); + if (res && typeof res.then === 'function') { + res.then(wrappedSuccess, wrappedFailure); + } + } + + var Mixin = /** @class */ (function () { + function Mixin() { + } + // mix into a CLASS + Mixin.mixInto = function (destClass) { + this.mixIntoObj(destClass.prototype); + }; + // mix into ANY object + Mixin.mixIntoObj = function (destObj) { + var _this = this; + Object.getOwnPropertyNames(this.prototype).forEach(function (name) { + if (!destObj[name]) { // if destination doesn't already define it + destObj[name] = _this.prototype[name]; + } + }); + }; + /* + will override existing methods + TODO: remove! not used anymore + */ + Mixin.mixOver = function (destClass) { + var _this = this; + Object.getOwnPropertyNames(this.prototype).forEach(function (name) { + destClass.prototype[name] = _this.prototype[name]; + }); + }; + return Mixin; + }()); + + /* + USAGE: + import { default as EmitterMixin, EmitterInterface } from './EmitterMixin' + in class: + on: EmitterInterface['on'] + one: EmitterInterface['one'] + off: EmitterInterface['off'] + trigger: EmitterInterface['trigger'] + triggerWith: EmitterInterface['triggerWith'] + hasHandlers: EmitterInterface['hasHandlers'] + after class: + EmitterMixin.mixInto(TheClass) + */ + var EmitterMixin = /** @class */ (function (_super) { + __extends(EmitterMixin, _super); + function EmitterMixin() { + return _super !== null && _super.apply(this, arguments) || this; + } + EmitterMixin.prototype.on = function (type, handler) { + addToHash(this._handlers || (this._handlers = {}), type, handler); + return this; // for chaining + }; + // todo: add comments + EmitterMixin.prototype.one = function (type, handler) { + addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler); + return this; // for chaining + }; + EmitterMixin.prototype.off = function (type, handler) { + if (this._handlers) { + removeFromHash(this._handlers, type, handler); + } + if (this._oneHandlers) { + removeFromHash(this._oneHandlers, type, handler); + } + return this; // for chaining + }; + EmitterMixin.prototype.trigger = function (type) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + this.triggerWith(type, this, args); + return this; // for chaining + }; + EmitterMixin.prototype.triggerWith = function (type, context, args) { + if (this._handlers) { + applyAll(this._handlers[type], context, args); + } + if (this._oneHandlers) { + applyAll(this._oneHandlers[type], context, args); + delete this._oneHandlers[type]; // will never fire again + } + return this; // for chaining + }; + EmitterMixin.prototype.hasHandlers = function (type) { + return (this._handlers && this._handlers[type] && this._handlers[type].length) || + (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length); + }; + return EmitterMixin; + }(Mixin)); + function addToHash(hash, type, handler) { + (hash[type] || (hash[type] = [])) + .push(handler); + } + function removeFromHash(hash, type, handler) { + if (handler) { + if (hash[type]) { + hash[type] = hash[type].filter(function (func) { + return func !== handler; + }); + } + } + else { + delete hash[type]; // remove all handler funcs for this type + } + } + + /* + Records offset information for a set of elements, relative to an origin element. + Can record the left/right OR the top/bottom OR both. + Provides methods for querying the cache by position. + */ + var PositionCache = /** @class */ (function () { + function PositionCache(originEl, els, isHorizontal, isVertical) { + this.originEl = originEl; + this.els = els; + this.isHorizontal = isHorizontal; + this.isVertical = isVertical; + } + // Queries the els for coordinates and stores them. + // Call this method before using and of the get* methods below. + PositionCache.prototype.build = function () { + var originEl = this.originEl; + var originClientRect = this.originClientRect = + originEl.getBoundingClientRect(); // relative to viewport top-left + if (this.isHorizontal) { + this.buildElHorizontals(originClientRect.left); + } + if (this.isVertical) { + this.buildElVerticals(originClientRect.top); + } + }; + // Populates the left/right internal coordinate arrays + PositionCache.prototype.buildElHorizontals = function (originClientLeft) { + var lefts = []; + var rights = []; + for (var _i = 0, _a = this.els; _i < _a.length; _i++) { + var el = _a[_i]; + var rect = el.getBoundingClientRect(); + lefts.push(rect.left - originClientLeft); + rights.push(rect.right - originClientLeft); + } + this.lefts = lefts; + this.rights = rights; + }; + // Populates the top/bottom internal coordinate arrays + PositionCache.prototype.buildElVerticals = function (originClientTop) { + var tops = []; + var bottoms = []; + for (var _i = 0, _a = this.els; _i < _a.length; _i++) { + var el = _a[_i]; + var rect = el.getBoundingClientRect(); + tops.push(rect.top - originClientTop); + bottoms.push(rect.bottom - originClientTop); + } + this.tops = tops; + this.bottoms = bottoms; + }; + // Given a left offset (from document left), returns the index of the el that it horizontally intersects. + // If no intersection is made, returns undefined. + PositionCache.prototype.leftToIndex = function (leftPosition) { + var lefts = this.lefts; + var rights = this.rights; + var len = lefts.length; + var i; + for (i = 0; i < len; i++) { + if (leftPosition >= lefts[i] && leftPosition < rights[i]) { + return i; + } + } + }; + // Given a top offset (from document top), returns the index of the el that it vertically intersects. + // If no intersection is made, returns undefined. + PositionCache.prototype.topToIndex = function (topPosition) { + var tops = this.tops; + var bottoms = this.bottoms; + var len = tops.length; + var i; + for (i = 0; i < len; i++) { + if (topPosition >= tops[i] && topPosition < bottoms[i]) { + return i; + } + } + }; + // Gets the width of the element at the given index + PositionCache.prototype.getWidth = function (leftIndex) { + return this.rights[leftIndex] - this.lefts[leftIndex]; + }; + // Gets the height of the element at the given index + PositionCache.prototype.getHeight = function (topIndex) { + return this.bottoms[topIndex] - this.tops[topIndex]; + }; + return PositionCache; + }()); + + /* + An object for getting/setting scroll-related information for an element. + Internally, this is done very differently for window versus DOM element, + so this object serves as a common interface. + */ + var ScrollController = /** @class */ (function () { + function ScrollController() { + } + ScrollController.prototype.getMaxScrollTop = function () { + return this.getScrollHeight() - this.getClientHeight(); + }; + ScrollController.prototype.getMaxScrollLeft = function () { + return this.getScrollWidth() - this.getClientWidth(); + }; + ScrollController.prototype.canScrollVertically = function () { + return this.getMaxScrollTop() > 0; + }; + ScrollController.prototype.canScrollHorizontally = function () { + return this.getMaxScrollLeft() > 0; + }; + ScrollController.prototype.canScrollUp = function () { + return this.getScrollTop() > 0; + }; + ScrollController.prototype.canScrollDown = function () { + return this.getScrollTop() < this.getMaxScrollTop(); + }; + ScrollController.prototype.canScrollLeft = function () { + return this.getScrollLeft() > 0; + }; + ScrollController.prototype.canScrollRight = function () { + return this.getScrollLeft() < this.getMaxScrollLeft(); + }; + return ScrollController; + }()); + var ElementScrollController = /** @class */ (function (_super) { + __extends(ElementScrollController, _super); + function ElementScrollController(el) { + var _this = _super.call(this) || this; + _this.el = el; + return _this; + } + ElementScrollController.prototype.getScrollTop = function () { + return this.el.scrollTop; + }; + ElementScrollController.prototype.getScrollLeft = function () { + return this.el.scrollLeft; + }; + ElementScrollController.prototype.setScrollTop = function (top) { + this.el.scrollTop = top; + }; + ElementScrollController.prototype.setScrollLeft = function (left) { + this.el.scrollLeft = left; + }; + ElementScrollController.prototype.getScrollWidth = function () { + return this.el.scrollWidth; + }; + ElementScrollController.prototype.getScrollHeight = function () { + return this.el.scrollHeight; + }; + ElementScrollController.prototype.getClientHeight = function () { + return this.el.clientHeight; + }; + ElementScrollController.prototype.getClientWidth = function () { + return this.el.clientWidth; + }; + return ElementScrollController; + }(ScrollController)); + var WindowScrollController = /** @class */ (function (_super) { + __extends(WindowScrollController, _super); + function WindowScrollController() { + return _super !== null && _super.apply(this, arguments) || this; + } + WindowScrollController.prototype.getScrollTop = function () { + return window.pageYOffset; + }; + WindowScrollController.prototype.getScrollLeft = function () { + return window.pageXOffset; + }; + WindowScrollController.prototype.setScrollTop = function (n) { + window.scroll(window.pageXOffset, n); + }; + WindowScrollController.prototype.setScrollLeft = function (n) { + window.scroll(n, window.pageYOffset); + }; + WindowScrollController.prototype.getScrollWidth = function () { + return document.documentElement.scrollWidth; + }; + WindowScrollController.prototype.getScrollHeight = function () { + return document.documentElement.scrollHeight; + }; + WindowScrollController.prototype.getClientHeight = function () { + return document.documentElement.clientHeight; + }; + WindowScrollController.prototype.getClientWidth = function () { + return document.documentElement.clientWidth; + }; + return WindowScrollController; + }(ScrollController)); + + /* + Embodies a div that has potential scrollbars + */ + var ScrollComponent = /** @class */ (function (_super) { + __extends(ScrollComponent, _super); + function ScrollComponent(overflowX, overflowY) { + var _this = _super.call(this, createElement('div', { + className: 'fc-scroller' + })) || this; + _this.overflowX = overflowX; + _this.overflowY = overflowY; + _this.applyOverflow(); + return _this; + } + // sets to natural height, unlocks overflow + ScrollComponent.prototype.clear = function () { + this.setHeight('auto'); + this.applyOverflow(); + }; + ScrollComponent.prototype.destroy = function () { + removeElement(this.el); + }; + // Overflow + // ----------------------------------------------------------------------------------------------------------------- + ScrollComponent.prototype.applyOverflow = function () { + applyStyle(this.el, { + overflowX: this.overflowX, + overflowY: this.overflowY + }); + }; + // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'. + // Useful for preserving scrollbar widths regardless of future resizes. + // Can pass in scrollbarWidths for optimization. + ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) { + var overflowX = this.overflowX; + var overflowY = this.overflowY; + scrollbarWidths = scrollbarWidths || this.getScrollbarWidths(); + if (overflowX === 'auto') { + overflowX = (scrollbarWidths.bottom || // horizontal scrollbars? + this.canScrollHorizontally() // OR scrolling pane with massless scrollbars? + ) ? 'scroll' : 'hidden'; + } + if (overflowY === 'auto') { + overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars? + this.canScrollVertically() // OR scrolling pane with massless scrollbars? + ) ? 'scroll' : 'hidden'; + } + applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY }); + }; + ScrollComponent.prototype.setHeight = function (height) { + applyStyleProp(this.el, 'height', height); + }; + ScrollComponent.prototype.getScrollbarWidths = function () { + var edges = computeEdges(this.el); + return { + left: edges.scrollbarLeft, + right: edges.scrollbarRight, + bottom: edges.scrollbarBottom + }; + }; + return ScrollComponent; + }(ElementScrollController)); + + var Theme = /** @class */ (function () { + function Theme(calendarOptions) { + this.calendarOptions = calendarOptions; + this.processIconOverride(); + } + Theme.prototype.processIconOverride = function () { + if (this.iconOverrideOption) { + this.setIconOverride(this.calendarOptions[this.iconOverrideOption]); + } + }; + Theme.prototype.setIconOverride = function (iconOverrideHash) { + var iconClassesCopy; + var buttonName; + if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object + iconClassesCopy = __assign({}, this.iconClasses); + for (buttonName in iconOverrideHash) { + iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]); + } + this.iconClasses = iconClassesCopy; + } + else if (iconOverrideHash === false) { + this.iconClasses = {}; + } + }; + Theme.prototype.applyIconOverridePrefix = function (className) { + var prefix = this.iconOverridePrefix; + if (prefix && className.indexOf(prefix) !== 0) { // if not already present + className = prefix + className; + } + return className; + }; + Theme.prototype.getClass = function (key) { + return this.classes[key] || ''; + }; + Theme.prototype.getIconClass = function (buttonName) { + var className = this.iconClasses[buttonName]; + if (className) { + return this.baseIconClass + ' ' + className; + } + return ''; + }; + Theme.prototype.getCustomButtonIconClass = function (customButtonProps) { + var className; + if (this.iconOverrideCustomButtonOption) { + className = customButtonProps[this.iconOverrideCustomButtonOption]; + if (className) { + return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className); + } + } + return ''; + }; + return Theme; + }()); + Theme.prototype.classes = {}; + Theme.prototype.iconClasses = {}; + Theme.prototype.baseIconClass = ''; + Theme.prototype.iconOverridePrefix = ''; + + var guid = 0; + var Component = /** @class */ (function () { + function Component(context, isView) { + // HACK to populate view at top of component instantiation call chain + if (isView) { + context.view = this; + } + this.uid = String(guid++); + this.context = context; + this.dateEnv = context.dateEnv; + this.theme = context.theme; + this.view = context.view; + this.calendar = context.calendar; + this.isRtl = this.opt('dir') === 'rtl'; + } + Component.addEqualityFuncs = function (newFuncs) { + this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs); + }; + Component.prototype.opt = function (name) { + return this.context.options[name]; + }; + Component.prototype.receiveProps = function (props) { + var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps; + this.props = comboProps; + if (anyChanges) { + this.render(comboProps); + } + }; + Component.prototype.render = function (props) { + }; + // after destroy is called, this component won't ever be used again + Component.prototype.destroy = function () { + }; + return Component; + }()); + Component.prototype.equalityFuncs = {}; + /* + Reuses old values when equal. If anything is unequal, returns newProps as-is. + Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing. + */ + function recycleProps(oldProps, newProps, equalityFuncs) { + var comboProps = {}; // some old, some new + var anyChanges = false; + for (var key in newProps) { + if (key in oldProps && (oldProps[key] === newProps[key] || + (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) { + // equal to old? use old prop + comboProps[key] = oldProps[key]; + } + else { + comboProps[key] = newProps[key]; + anyChanges = true; + } + } + for (var key in oldProps) { + if (!(key in newProps)) { + anyChanges = true; + break; + } + } + return { anyChanges: anyChanges, comboProps: comboProps }; + } + + /* + PURPOSES: + - hook up to fg, fill, and mirror renderers + - interface for dragging and hits + */ + var DateComponent = /** @class */ (function (_super) { + __extends(DateComponent, _super); + function DateComponent(context, el, isView) { + var _this = _super.call(this, context, isView) || this; + _this.el = el; + return _this; + } + DateComponent.prototype.destroy = function () { + _super.prototype.destroy.call(this); + removeElement(this.el); + }; + // TODO: WHAT ABOUT (sourceSeg && sourceSeg.component.doesDragMirror) + // + // Event Drag-n-Drop Rendering (for both events and external elements) + // --------------------------------------------------------------------------------------------------------------- + /* + renderEventDragSegs(state: EventSegUiInteractionState) { + if (state) { + let { isEvent, segs, sourceSeg } = state + + if (this.eventRenderer) { + this.eventRenderer.hideByHash(state.affectedInstances) + } + + // if the user is dragging something that is considered an event with real event data, + // and this component likes to do drag mirrors OR the component where the seg came from + // likes to do drag mirrors, then render a drag mirror. + if (isEvent && (this.doesDragMirror || sourceSeg && sourceSeg.component.doesDragMirror)) { + if (this.mirrorRenderer) { + this.mirrorRenderer.renderSegs(segs, { isDragging: true, sourceSeg }) + } + } + + // if it would be impossible to render a drag mirror OR this component likes to render + // highlights, then render a highlight. + if (!isEvent || this.doesDragHighlight) { + if (this.fillRenderer) { + this.fillRenderer.renderSegs('highlight', segs) + } + } + } + } + */ + // Hit System + // ----------------------------------------------------------------------------------------------------------------- + DateComponent.prototype.buildPositionCaches = function () { + }; + DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { + return null; // this should be abstract + }; + // Validation + // ----------------------------------------------------------------------------------------------------------------- + DateComponent.prototype.isInteractionValid = function (interaction) { + var calendar = this.calendar; + var dateProfile = this.props.dateProfile; // HACK + var instances = interaction.mutatedEvents.instances; + if (dateProfile) { // HACK for DayTile + for (var instanceId in instances) { + if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) { + return false; + } + } + } + return isInteractionValid(interaction, calendar); + }; + DateComponent.prototype.isDateSelectionValid = function (selection) { + var dateProfile = this.props.dateProfile; // HACK + if (dateProfile && // HACK for DayTile + !rangeContainsRange(dateProfile.validRange, selection.range)) { + return false; + } + return isDateSelectionValid(selection, this.calendar); + }; + // Triggering + // ----------------------------------------------------------------------------------------------------------------- + // TODO: move to Calendar + DateComponent.prototype.publiclyTrigger = function (name, args) { + var calendar = this.calendar; + return calendar.publiclyTrigger(name, args); + }; + DateComponent.prototype.publiclyTriggerAfterSizing = function (name, args) { + var calendar = this.calendar; + return calendar.publiclyTriggerAfterSizing(name, args); + }; + DateComponent.prototype.hasPublicHandlers = function (name) { + var calendar = this.calendar; + return calendar.hasPublicHandlers(name); + }; + DateComponent.prototype.triggerRenderedSegs = function (segs, isMirrors) { + var calendar = this.calendar; + if (this.hasPublicHandlers('eventPositioned')) { + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + this.publiclyTriggerAfterSizing('eventPositioned', [ + { + event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance), + isMirror: isMirrors, + isStart: seg.isStart, + isEnd: seg.isEnd, + el: seg.el, + view: this // safe to cast because this method is only called on context.view + } + ]); + } + } + if (!calendar.state.loadingLevel) { // avoid initial empty state while pending + calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once + } + }; + DateComponent.prototype.triggerWillRemoveSegs = function (segs, isMirrors) { + var calendar = this.calendar; + for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { + var seg = segs_2[_i]; + calendar.trigger('eventElRemove', seg.el); + } + if (this.hasPublicHandlers('eventDestroy')) { + for (var _a = 0, segs_3 = segs; _a < segs_3.length; _a++) { + var seg = segs_3[_a]; + this.publiclyTrigger('eventDestroy', [ + { + event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance), + isMirror: isMirrors, + el: seg.el, + view: this // safe to cast because this method is only called on context.view + } + ]); + } + } + }; + // Pointer Interaction Utils + // ----------------------------------------------------------------------------------------------------------------- + DateComponent.prototype.isValidSegDownEl = function (el) { + return !this.props.eventDrag && // HACK + !this.props.eventResize && // HACK + !elementClosest(el, '.fc-mirror') && + (this.isPopover() || !this.isInPopover(el)); + // ^above line ensures we don't detect a seg interaction within a nested component. + // it's a HACK because it only supports a popover as the nested component. + }; + DateComponent.prototype.isValidDateDownEl = function (el) { + var segEl = elementClosest(el, this.fgSegSelector); + return (!segEl || segEl.classList.contains('fc-mirror')) && + !elementClosest(el, '.fc-more') && // a "more.." link + !elementClosest(el, 'a[data-goto]') && // a clickable nav link + !this.isInPopover(el); + }; + DateComponent.prototype.isPopover = function () { + return this.el.classList.contains('fc-popover'); + }; + DateComponent.prototype.isInPopover = function (el) { + return Boolean(elementClosest(el, '.fc-popover')); + }; + return DateComponent; + }(Component)); + DateComponent.prototype.fgSegSelector = '.fc-event-container > *'; + DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)'; + + var uid$1 = 0; + function createPlugin(input) { + return { + id: String(uid$1++), + deps: input.deps || [], + reducers: input.reducers || [], + eventDefParsers: input.eventDefParsers || [], + isDraggableTransformers: input.isDraggableTransformers || [], + eventDragMutationMassagers: input.eventDragMutationMassagers || [], + eventDefMutationAppliers: input.eventDefMutationAppliers || [], + dateSelectionTransformers: input.dateSelectionTransformers || [], + datePointTransforms: input.datePointTransforms || [], + dateSpanTransforms: input.dateSpanTransforms || [], + views: input.views || {}, + viewPropsTransformers: input.viewPropsTransformers || [], + isPropsValid: input.isPropsValid || null, + externalDefTransforms: input.externalDefTransforms || [], + eventResizeJoinTransforms: input.eventResizeJoinTransforms || [], + viewContainerModifiers: input.viewContainerModifiers || [], + eventDropTransformers: input.eventDropTransformers || [], + componentInteractions: input.componentInteractions || [], + calendarInteractions: input.calendarInteractions || [], + themeClasses: input.themeClasses || {}, + eventSourceDefs: input.eventSourceDefs || [], + cmdFormatter: input.cmdFormatter, + recurringTypes: input.recurringTypes || [], + namedTimeZonedImpl: input.namedTimeZonedImpl, + defaultView: input.defaultView || '', + elementDraggingImpl: input.elementDraggingImpl, + optionChangeHandlers: input.optionChangeHandlers || {} + }; + } + var PluginSystem = /** @class */ (function () { + function PluginSystem() { + this.hooks = { + reducers: [], + eventDefParsers: [], + isDraggableTransformers: [], + eventDragMutationMassagers: [], + eventDefMutationAppliers: [], + dateSelectionTransformers: [], + datePointTransforms: [], + dateSpanTransforms: [], + views: {}, + viewPropsTransformers: [], + isPropsValid: null, + externalDefTransforms: [], + eventResizeJoinTransforms: [], + viewContainerModifiers: [], + eventDropTransformers: [], + componentInteractions: [], + calendarInteractions: [], + themeClasses: {}, + eventSourceDefs: [], + cmdFormatter: null, + recurringTypes: [], + namedTimeZonedImpl: null, + defaultView: '', + elementDraggingImpl: null, + optionChangeHandlers: {} + }; + this.addedHash = {}; + } + PluginSystem.prototype.add = function (plugin) { + if (!this.addedHash[plugin.id]) { + this.addedHash[plugin.id] = true; + for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) { + var dep = _a[_i]; + this.add(dep); + } + this.hooks = combineHooks(this.hooks, plugin); + } + }; + return PluginSystem; + }()); + function combineHooks(hooks0, hooks1) { + return { + reducers: hooks0.reducers.concat(hooks1.reducers), + eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers), + isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers), + eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers), + eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers), + dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers), + datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms), + dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms), + views: __assign({}, hooks0.views, hooks1.views), + viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers), + isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid, + externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms), + eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms), + viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers), + eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers), + calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions), + componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions), + themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses), + eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs), + cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter, + recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes), + namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl, + defaultView: hooks0.defaultView || hooks1.defaultView, + elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl, + optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers) + }; + } + + var eventSourceDef = { + ignoreRange: true, + parseMeta: function (raw) { + if (Array.isArray(raw)) { // short form + return raw; + } + else if (Array.isArray(raw.events)) { + return raw.events; + } + return null; + }, + fetch: function (arg, success) { + success({ + rawEvents: arg.eventSource.meta + }); + } + }; + var ArrayEventSourcePlugin = createPlugin({ + eventSourceDefs: [eventSourceDef] + }); + + var eventSourceDef$1 = { + parseMeta: function (raw) { + if (typeof raw === 'function') { // short form + return raw; + } + else if (typeof raw.events === 'function') { + return raw.events; + } + return null; + }, + fetch: function (arg, success, failure) { + var dateEnv = arg.calendar.dateEnv; + var func = arg.eventSource.meta; + unpromisify(func.bind(null, { + start: dateEnv.toDate(arg.range.start), + end: dateEnv.toDate(arg.range.end), + startStr: dateEnv.formatIso(arg.range.start), + endStr: dateEnv.formatIso(arg.range.end), + timeZone: dateEnv.timeZone + }), function (rawEvents) { + success({ rawEvents: rawEvents }); // needs an object response + }, failure // send errorObj directly to failure callback + ); + } + }; + var FuncEventSourcePlugin = createPlugin({ + eventSourceDefs: [eventSourceDef$1] + }); + + function requestJson(method, url, params, successCallback, failureCallback) { + method = method.toUpperCase(); + var body = null; + if (method === 'GET') { + url = injectQueryStringParams(url, params); + } + else { + body = encodeParams(params); + } + var xhr = new XMLHttpRequest(); + xhr.open(method, url, true); + if (method !== 'GET') { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + } + xhr.onload = function () { + if (xhr.status >= 200 && xhr.status < 400) { + try { + var res = JSON.parse(xhr.responseText); + successCallback(res, xhr); + } + catch (err) { + failureCallback('Failure parsing JSON', xhr); + } + } + else { + failureCallback('Request failed', xhr); + } + }; + xhr.onerror = function () { + failureCallback('Request failed', xhr); + }; + xhr.send(body); + } + function injectQueryStringParams(url, params) { + return url + + (url.indexOf('?') === -1 ? '?' : '&') + + encodeParams(params); + } + function encodeParams(params) { + var parts = []; + for (var key in params) { + parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key])); + } + return parts.join('&'); + } + + var eventSourceDef$2 = { + parseMeta: function (raw) { + if (typeof raw === 'string') { // short form + raw = { url: raw }; + } + else if (!raw || typeof raw !== 'object' || !raw.url) { + return null; + } + return { + url: raw.url, + method: (raw.method || 'GET').toUpperCase(), + extraParams: raw.extraParams, + startParam: raw.startParam, + endParam: raw.endParam, + timeZoneParam: raw.timeZoneParam + }; + }, + fetch: function (arg, success, failure) { + var meta = arg.eventSource.meta; + var requestParams = buildRequestParams(meta, arg.range, arg.calendar); + requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) { + success({ rawEvents: rawEvents, xhr: xhr }); + }, function (errorMessage, xhr) { + failure({ message: errorMessage, xhr: xhr }); + }); + } + }; + var JsonFeedEventSourcePlugin = createPlugin({ + eventSourceDefs: [eventSourceDef$2] + }); + function buildRequestParams(meta, range, calendar) { + var dateEnv = calendar.dateEnv; + var startParam; + var endParam; + var timeZoneParam; + var customRequestParams; + var params = {}; + startParam = meta.startParam; + if (startParam == null) { + startParam = calendar.opt('startParam'); + } + endParam = meta.endParam; + if (endParam == null) { + endParam = calendar.opt('endParam'); + } + timeZoneParam = meta.timeZoneParam; + if (timeZoneParam == null) { + timeZoneParam = calendar.opt('timeZoneParam'); + } + // retrieve any outbound GET/POST data from the options + if (typeof meta.extraParams === 'function') { + // supplied as a function that returns a key/value object + customRequestParams = meta.extraParams(); + } + else { + // probably supplied as a straight key/value object + customRequestParams = meta.extraParams || {}; + } + __assign(params, customRequestParams); + params[startParam] = dateEnv.formatIso(range.start); + params[endParam] = dateEnv.formatIso(range.end); + if (dateEnv.timeZone !== 'local') { + params[timeZoneParam] = dateEnv.timeZone; + } + return params; + } + + var recurring = { + parse: function (rawEvent, leftoverProps, dateEnv) { + var createMarker = dateEnv.createMarker.bind(dateEnv); + var processors = { + daysOfWeek: null, + startTime: createDuration, + endTime: createDuration, + startRecur: createMarker, + endRecur: createMarker + }; + var props = refineProps(rawEvent, processors, {}, leftoverProps); + var anyValid = false; + for (var propName in props) { + if (props[propName] != null) { + anyValid = true; + break; + } + } + if (anyValid) { + var duration = null; + if ('duration' in leftoverProps) { + duration = createDuration(leftoverProps.duration); + delete leftoverProps.duration; + } + if (!duration && props.startTime && props.endTime) { + duration = subtractDurations(props.endTime, props.startTime); + } + return { + allDayGuess: Boolean(!props.startTime && !props.endTime), + duration: duration, + typeData: props // doesn't need endTime anymore but oh well + }; + } + return null; + }, + expand: function (typeData, framingRange, dateEnv) { + var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur }); + if (clippedFramingRange) { + return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv); + } + else { + return []; + } + } + }; + var SimpleRecurrencePlugin = createPlugin({ + recurringTypes: [recurring] + }); + function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) { + var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null; + var dayMarker = startOfDay(framingRange.start); + var endMarker = framingRange.end; + var instanceStarts = []; + while (dayMarker < endMarker) { + var instanceStart + // if everyday, or this particular day-of-week + = void 0; + // if everyday, or this particular day-of-week + if (!dowHash || dowHash[dayMarker.getUTCDay()]) { + if (startTime) { + instanceStart = dateEnv.add(dayMarker, startTime); + } + else { + instanceStart = dayMarker; + } + instanceStarts.push(instanceStart); + } + dayMarker = addDays(dayMarker, 1); + } + return instanceStarts; + } + + var DefaultOptionChangeHandlers = createPlugin({ + optionChangeHandlers: { + events: function (events, calendar, deepEqual) { + handleEventSources([events], calendar, deepEqual); + }, + eventSources: handleEventSources, + plugins: handlePlugins + } + }); + function handleEventSources(inputs, calendar, deepEqual) { + var unfoundSources = hashValuesToArray(calendar.state.eventSources); + var newInputs = []; + for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { + var input = inputs_1[_i]; + var inputFound = false; + for (var i = 0; i < unfoundSources.length; i++) { + if (deepEqual(unfoundSources[i]._raw, input)) { + unfoundSources.splice(i, 1); // delete + inputFound = true; + break; + } + } + if (!inputFound) { + newInputs.push(input); + } + } + for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) { + var unfoundSource = unfoundSources_1[_a]; + calendar.dispatch({ + type: 'REMOVE_EVENT_SOURCE', + sourceId: unfoundSource.sourceId + }); + } + for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) { + var newInput = newInputs_1[_b]; + calendar.addEventSource(newInput); + } + } + // shortcoming: won't remove plugins + function handlePlugins(inputs, calendar) { + calendar.addPluginInputs(inputs); // will gracefully handle duplicates + } + + var config = {}; // TODO: make these options + var globalDefaults = { + defaultRangeSeparator: ' - ', + titleRangeSeparator: ' \u2013 ', + defaultTimedEventDuration: '01:00:00', + defaultAllDayEventDuration: { day: 1 }, + forceEventDuration: false, + nextDayThreshold: '00:00:00', + // display + columnHeader: true, + defaultView: '', + aspectRatio: 1.35, + header: { + left: 'title', + center: '', + right: 'today prev,next' + }, + weekends: true, + weekNumbers: false, + weekNumberCalculation: 'local', + editable: false, + // nowIndicator: false, + scrollTime: '06:00:00', + minTime: '00:00:00', + maxTime: '24:00:00', + showNonCurrentDates: true, + // event ajax + lazyFetching: true, + startParam: 'start', + endParam: 'end', + timeZoneParam: 'timeZone', + timeZone: 'local', + // allDayDefault: undefined, + // locale + locales: [], + locale: '', + // dir: will get this from the default locale + // buttonIcons: null, + // allows setting a min-height to the event segment to prevent short events overlapping each other + timeGridEventMinHeight: 0, + themeSystem: 'standard', + // eventResizableFromStart: false, + dragRevertDuration: 500, + dragScroll: true, + allDayMaintainDuration: false, + // selectable: false, + unselectAuto: true, + // selectMinDistance: 0, + dropAccept: '*', + eventOrder: 'start,-duration,allDay,title', + // ^ if start tie, longer events go before shorter. final tie-breaker is title text + // rerenderDelay: null, + eventLimit: false, + eventLimitClick: 'popover', + dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' }, + handleWindowResize: true, + windowResizeDelay: 100, + longPressDelay: 1000, + eventDragMinDistance: 5 // only applies to mouse + }; + var rtlDefaults = { + header: { + left: 'next,prev today', + center: '', + right: 'title' + }, + buttonIcons: { + // TODO: make RTL support the responibility of the theme + prev: 'fc-icon-chevron-right', + next: 'fc-icon-chevron-left', + prevYear: 'fc-icon-chevrons-right', + nextYear: 'fc-icon-chevrons-left' + } + }; + var complexOptions = [ + 'header', + 'footer', + 'buttonText', + 'buttonIcons' + ]; + // Merges an array of option objects into a single object + function mergeOptions(optionObjs) { + return mergeProps(optionObjs, complexOptions); + } + // TODO: move this stuff to a "plugin"-related file... + var INTERNAL_PLUGINS = [ + ArrayEventSourcePlugin, + FuncEventSourcePlugin, + JsonFeedEventSourcePlugin, + SimpleRecurrencePlugin, + DefaultOptionChangeHandlers + ]; + function refinePluginDefs(pluginInputs) { + var plugins = []; + for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) { + var pluginInput = pluginInputs_1[_i]; + if (typeof pluginInput === 'string') { + var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput); + if (!window[globalName]) { + console.warn('Plugin file not loaded for ' + pluginInput); + } + else { + plugins.push(window[globalName].default); // is an ES6 module + } + } + else { + plugins.push(pluginInput); + } + } + return INTERNAL_PLUGINS.concat(plugins); + } + + var RAW_EN_LOCALE = { + code: 'en', + week: { + dow: 0, + doy: 4 // 4 days need to be within the year to be considered the first week + }, + dir: 'ltr', + buttonText: { + prev: 'prev', + next: 'next', + prevYear: 'prev year', + nextYear: 'next year', + year: 'year', + today: 'today', + month: 'month', + week: 'week', + day: 'day', + list: 'list' + }, + weekLabel: 'W', + allDayText: 'all-day', + eventLimitText: 'more', + noEventsMessage: 'No events to display' + }; + function parseRawLocales(explicitRawLocales) { + var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en'; + var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js + var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless + var allRawLocales = globalArray.concat(// globalArray is low prio + hashValuesToArray(globalObject), // medium prio + explicitRawLocales // highest prio + ); + var rawLocaleMap = { + en: RAW_EN_LOCALE // necessary? + }; + for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) { + var rawLocale = allRawLocales_1[_i]; + rawLocaleMap[rawLocale.code] = rawLocale; + } + return { + map: rawLocaleMap, + defaultCode: defaultCode + }; + } + function buildLocale(inputSingular, available) { + if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) { + return parseLocale(inputSingular.code, [inputSingular.code], inputSingular); + } + else { + return queryLocale(inputSingular, available); + } + } + function queryLocale(codeArg, available) { + var codes = [].concat(codeArg || []); // will convert to array + var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE; + return parseLocale(codeArg, codes, raw); + } + function queryRawLocale(codes, available) { + for (var i = 0; i < codes.length; i++) { + var parts = codes[i].toLocaleLowerCase().split('-'); + for (var j = parts.length; j > 0; j--) { + var simpleId = parts.slice(0, j).join('-'); + if (available[simpleId]) { + return available[simpleId]; + } + } + } + return null; + } + function parseLocale(codeArg, codes, raw) { + var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']); + delete merged.code; // don't want this part of the options + var week = merged.week; + delete merged.week; + return { + codeArg: codeArg, + codes: codes, + week: week, + simpleNumberFormat: new Intl.NumberFormat(codeArg), + options: merged + }; + } + + var OptionsManager = /** @class */ (function () { + function OptionsManager(overrides) { + this.overrides = __assign({}, overrides); // make a copy + this.dynamicOverrides = {}; + this.compute(); + } + OptionsManager.prototype.mutate = function (updates, removals, isDynamic) { + var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides; + __assign(overrideHash, updates); + for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) { + var propName = removals_1[_i]; + delete overrideHash[propName]; + } + this.compute(); + }; + // Computes the flattened options hash for the calendar and assigns to `this.options`. + // Assumes this.overrides and this.dynamicOverrides have already been initialized. + OptionsManager.prototype.compute = function () { + // TODO: not a very efficient system + var locales = firstDefined(// explicit locale option given? + this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales); + var locale = firstDefined(// explicit locales option given? + this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale); + var available = parseRawLocales(locales); + var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options; + var dir = firstDefined(// based on options computed so far, is direction RTL? + this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir); + var dirDefaults = dir === 'rtl' ? rtlDefaults : {}; + this.dirDefaults = dirDefaults; + this.localeDefaults = localeDefaults; + this.computed = mergeOptions([ + globalDefaults, + dirDefaults, + localeDefaults, + this.overrides, + this.dynamicOverrides + ]); + }; + return OptionsManager; + }()); + + var calendarSystemClassMap = {}; + function registerCalendarSystem(name, theClass) { + calendarSystemClassMap[name] = theClass; + } + function createCalendarSystem(name) { + return new calendarSystemClassMap[name](); + } + var GregorianCalendarSystem = /** @class */ (function () { + function GregorianCalendarSystem() { + } + GregorianCalendarSystem.prototype.getMarkerYear = function (d) { + return d.getUTCFullYear(); + }; + GregorianCalendarSystem.prototype.getMarkerMonth = function (d) { + return d.getUTCMonth(); + }; + GregorianCalendarSystem.prototype.getMarkerDay = function (d) { + return d.getUTCDate(); + }; + GregorianCalendarSystem.prototype.arrayToMarker = function (arr) { + return arrayToUtcDate(arr); + }; + GregorianCalendarSystem.prototype.markerToArray = function (marker) { + return dateToUtcArray(marker); + }; + return GregorianCalendarSystem; + }()); + registerCalendarSystem('gregory', GregorianCalendarSystem); + + var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/; + function parse(str) { + var m = ISO_RE.exec(str); + if (m) { + var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0)); + if (isValidDate(marker)) { + var timeZoneOffset = null; + if (m[13]) { + timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 + + Number(m[18] || 0)); + } + return { + marker: marker, + isTimeUnspecified: !m[6], + timeZoneOffset: timeZoneOffset + }; + } + } + return null; + } + + var DateEnv = /** @class */ (function () { + function DateEnv(settings) { + var timeZone = this.timeZone = settings.timeZone; + var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC'; + if (settings.namedTimeZoneImpl && isNamedTimeZone) { + this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone); + } + this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl); + this.calendarSystem = createCalendarSystem(settings.calendarSystem); + this.locale = settings.locale; + this.weekDow = settings.locale.week.dow; + this.weekDoy = settings.locale.week.doy; + if (settings.weekNumberCalculation === 'ISO') { + this.weekDow = 1; + this.weekDoy = 4; + } + if (typeof settings.firstDay === 'number') { + this.weekDow = settings.firstDay; + } + if (typeof settings.weekNumberCalculation === 'function') { + this.weekNumberFunc = settings.weekNumberCalculation; + } + this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel; + this.cmdFormatter = settings.cmdFormatter; + } + // Creating / Parsing + DateEnv.prototype.createMarker = function (input) { + var meta = this.createMarkerMeta(input); + if (meta === null) { + return null; + } + return meta.marker; + }; + DateEnv.prototype.createNowMarker = function () { + if (this.canComputeOffset) { + return this.timestampToMarker(new Date().valueOf()); + } + else { + // if we can't compute the current date val for a timezone, + // better to give the current local date vals than UTC + return arrayToUtcDate(dateToLocalArray(new Date())); + } + }; + DateEnv.prototype.createMarkerMeta = function (input) { + if (typeof input === 'string') { + return this.parse(input); + } + var marker = null; + if (typeof input === 'number') { + marker = this.timestampToMarker(input); + } + else if (input instanceof Date) { + input = input.valueOf(); + if (!isNaN(input)) { + marker = this.timestampToMarker(input); + } + } + else if (Array.isArray(input)) { + marker = arrayToUtcDate(input); + } + if (marker === null || !isValidDate(marker)) { + return null; + } + return { marker: marker, isTimeUnspecified: false, forcedTzo: null }; + }; + DateEnv.prototype.parse = function (s) { + var parts = parse(s); + if (parts === null) { + return null; + } + var marker = parts.marker; + var forcedTzo = null; + if (parts.timeZoneOffset !== null) { + if (this.canComputeOffset) { + marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000); + } + else { + forcedTzo = parts.timeZoneOffset; + } + } + return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo }; + }; + // Accessors + DateEnv.prototype.getYear = function (marker) { + return this.calendarSystem.getMarkerYear(marker); + }; + DateEnv.prototype.getMonth = function (marker) { + return this.calendarSystem.getMarkerMonth(marker); + }; + // Adding / Subtracting + DateEnv.prototype.add = function (marker, dur) { + var a = this.calendarSystem.markerToArray(marker); + a[0] += dur.years; + a[1] += dur.months; + a[2] += dur.days; + a[6] += dur.milliseconds; + return this.calendarSystem.arrayToMarker(a); + }; + DateEnv.prototype.subtract = function (marker, dur) { + var a = this.calendarSystem.markerToArray(marker); + a[0] -= dur.years; + a[1] -= dur.months; + a[2] -= dur.days; + a[6] -= dur.milliseconds; + return this.calendarSystem.arrayToMarker(a); + }; + DateEnv.prototype.addYears = function (marker, n) { + var a = this.calendarSystem.markerToArray(marker); + a[0] += n; + return this.calendarSystem.arrayToMarker(a); + }; + DateEnv.prototype.addMonths = function (marker, n) { + var a = this.calendarSystem.markerToArray(marker); + a[1] += n; + return this.calendarSystem.arrayToMarker(a); + }; + // Diffing Whole Units + DateEnv.prototype.diffWholeYears = function (m0, m1) { + var calendarSystem = this.calendarSystem; + if (timeAsMs(m0) === timeAsMs(m1) && + calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && + calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) { + return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0); + } + return null; + }; + DateEnv.prototype.diffWholeMonths = function (m0, m1) { + var calendarSystem = this.calendarSystem; + if (timeAsMs(m0) === timeAsMs(m1) && + calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) { + return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) + + (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12; + } + return null; + }; + // Range / Duration + DateEnv.prototype.greatestWholeUnit = function (m0, m1) { + var n = this.diffWholeYears(m0, m1); + if (n !== null) { + return { unit: 'year', value: n }; + } + n = this.diffWholeMonths(m0, m1); + if (n !== null) { + return { unit: 'month', value: n }; + } + n = diffWholeWeeks(m0, m1); + if (n !== null) { + return { unit: 'week', value: n }; + } + n = diffWholeDays(m0, m1); + if (n !== null) { + return { unit: 'day', value: n }; + } + n = diffHours(m0, m1); + if (isInt(n)) { + return { unit: 'hour', value: n }; + } + n = diffMinutes(m0, m1); + if (isInt(n)) { + return { unit: 'minute', value: n }; + } + n = diffSeconds(m0, m1); + if (isInt(n)) { + return { unit: 'second', value: n }; + } + return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() }; + }; + DateEnv.prototype.countDurationsBetween = function (m0, m1, d) { + // TODO: can use greatestWholeUnit + var diff; + if (d.years) { + diff = this.diffWholeYears(m0, m1); + if (diff !== null) { + return diff / asRoughYears(d); + } + } + if (d.months) { + diff = this.diffWholeMonths(m0, m1); + if (diff !== null) { + return diff / asRoughMonths(d); + } + } + if (d.days) { + diff = diffWholeDays(m0, m1); + if (diff !== null) { + return diff / asRoughDays(d); + } + } + return (m1.valueOf() - m0.valueOf()) / asRoughMs(d); + }; + // Start-Of + DateEnv.prototype.startOf = function (m, unit) { + if (unit === 'year') { + return this.startOfYear(m); + } + else if (unit === 'month') { + return this.startOfMonth(m); + } + else if (unit === 'week') { + return this.startOfWeek(m); + } + else if (unit === 'day') { + return startOfDay(m); + } + else if (unit === 'hour') { + return startOfHour(m); + } + else if (unit === 'minute') { + return startOfMinute(m); + } + else if (unit === 'second') { + return startOfSecond(m); + } + }; + DateEnv.prototype.startOfYear = function (m) { + return this.calendarSystem.arrayToMarker([ + this.calendarSystem.getMarkerYear(m) + ]); + }; + DateEnv.prototype.startOfMonth = function (m) { + return this.calendarSystem.arrayToMarker([ + this.calendarSystem.getMarkerYear(m), + this.calendarSystem.getMarkerMonth(m) + ]); + }; + DateEnv.prototype.startOfWeek = function (m) { + return this.calendarSystem.arrayToMarker([ + this.calendarSystem.getMarkerYear(m), + this.calendarSystem.getMarkerMonth(m), + m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7) + ]); + }; + // Week Number + DateEnv.prototype.computeWeekNumber = function (marker) { + if (this.weekNumberFunc) { + return this.weekNumberFunc(this.toDate(marker)); + } + else { + return weekOfYear(marker, this.weekDow, this.weekDoy); + } + }; + // TODO: choke on timeZoneName: long + DateEnv.prototype.format = function (marker, formatter, dateOptions) { + if (dateOptions === void 0) { dateOptions = {}; } + return formatter.format({ + marker: marker, + timeZoneOffset: dateOptions.forcedTzo != null ? + dateOptions.forcedTzo : + this.offsetForMarker(marker) + }, this); + }; + DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) { + if (dateOptions === void 0) { dateOptions = {}; } + if (dateOptions.isEndExclusive) { + end = addMs(end, -1); + } + return formatter.formatRange({ + marker: start, + timeZoneOffset: dateOptions.forcedStartTzo != null ? + dateOptions.forcedStartTzo : + this.offsetForMarker(start) + }, { + marker: end, + timeZoneOffset: dateOptions.forcedEndTzo != null ? + dateOptions.forcedEndTzo : + this.offsetForMarker(end) + }, this); + }; + DateEnv.prototype.formatIso = function (marker, extraOptions) { + if (extraOptions === void 0) { extraOptions = {}; } + var timeZoneOffset = null; + if (!extraOptions.omitTimeZoneOffset) { + if (extraOptions.forcedTzo != null) { + timeZoneOffset = extraOptions.forcedTzo; + } + else { + timeZoneOffset = this.offsetForMarker(marker); + } + } + return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime); + }; + // TimeZone + DateEnv.prototype.timestampToMarker = function (ms) { + if (this.timeZone === 'local') { + return arrayToUtcDate(dateToLocalArray(new Date(ms))); + } + else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) { + return new Date(ms); + } + else { + return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms)); + } + }; + DateEnv.prototype.offsetForMarker = function (m) { + if (this.timeZone === 'local') { + return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset + } + else if (this.timeZone === 'UTC') { + return 0; + } + else if (this.namedTimeZoneImpl) { + return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)); + } + return null; + }; + // Conversion + DateEnv.prototype.toDate = function (m, forcedTzo) { + if (this.timeZone === 'local') { + return arrayToLocalDate(dateToUtcArray(m)); + } + else if (this.timeZone === 'UTC') { + return new Date(m.valueOf()); // make sure it's a copy + } + else if (!this.namedTimeZoneImpl) { + return new Date(m.valueOf() - (forcedTzo || 0)); + } + else { + return new Date(m.valueOf() - + this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms + ); + } + }; + return DateEnv; + }()); + + var SIMPLE_SOURCE_PROPS = { + id: String, + allDayDefault: Boolean, + eventDataTransform: Function, + success: Function, + failure: Function + }; + var uid$2 = 0; + function doesSourceNeedRange(eventSource, calendar) { + var defs = calendar.pluginSystem.hooks.eventSourceDefs; + return !defs[eventSource.sourceDefId].ignoreRange; + } + function parseEventSource(raw, calendar) { + var defs = calendar.pluginSystem.hooks.eventSourceDefs; + for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence + var def = defs[i]; + var meta = def.parseMeta(raw); + if (meta) { + var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar); + res._raw = raw; + return res; + } + } + return null; + } + function parseEventSourceProps(raw, meta, sourceDefId, calendar) { + var leftovers0 = {}; + var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0); + var leftovers1 = {}; + var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1); + props.isFetching = false; + props.latestFetchId = ''; + props.fetchRange = null; + props.publicId = String(raw.id || ''); + props.sourceId = String(uid$2++); + props.sourceDefId = sourceDefId; + props.meta = meta; + props.ui = ui; + props.extendedProps = leftovers1; + return props; + } + + function reduceEventSources (eventSources, action, dateProfile, calendar) { + switch (action.type) { + case 'ADD_EVENT_SOURCES': // already parsed + return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar); + case 'REMOVE_EVENT_SOURCE': + return removeSource(eventSources, action.sourceId); + case 'PREV': // TODO: how do we track all actions that affect dateProfile :( + case 'NEXT': + case 'SET_DATE': + case 'SET_VIEW_TYPE': + if (dateProfile) { + return fetchDirtySources(eventSources, dateProfile.activeRange, calendar); + } + else { + return eventSources; + } + case 'FETCH_EVENT_SOURCES': + case 'CHANGE_TIMEZONE': + return fetchSourcesByIds(eventSources, action.sourceIds ? + arrayToHash(action.sourceIds) : + excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar); + case 'RECEIVE_EVENTS': + case 'RECEIVE_EVENT_ERROR': + return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange); + case 'REMOVE_ALL_EVENT_SOURCES': + return {}; + default: + return eventSources; + } + } + var uid$3 = 0; + function addSources(eventSourceHash, sources, fetchRange, calendar) { + var hash = {}; + for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) { + var source = sources_1[_i]; + hash[source.sourceId] = source; + } + if (fetchRange) { + hash = fetchDirtySources(hash, fetchRange, calendar); + } + return __assign({}, eventSourceHash, hash); + } + function removeSource(eventSourceHash, sourceId) { + return filterHash(eventSourceHash, function (eventSource) { + return eventSource.sourceId !== sourceId; + }); + } + function fetchDirtySources(sourceHash, fetchRange, calendar) { + return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) { + return isSourceDirty(eventSource, fetchRange, calendar); + }), fetchRange, calendar); + } + function isSourceDirty(eventSource, fetchRange, calendar) { + if (!doesSourceNeedRange(eventSource, calendar)) { + return !eventSource.latestFetchId; + } + else { + return !calendar.opt('lazyFetching') || + !eventSource.fetchRange || + fetchRange.start < eventSource.fetchRange.start || + fetchRange.end > eventSource.fetchRange.end; + } + } + function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) { + var nextSources = {}; + for (var sourceId in prevSources) { + var source = prevSources[sourceId]; + if (sourceIdHash[sourceId]) { + nextSources[sourceId] = fetchSource(source, fetchRange, calendar); + } + else { + nextSources[sourceId] = source; + } + } + return nextSources; + } + function fetchSource(eventSource, fetchRange, calendar) { + var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId]; + var fetchId = String(uid$3++); + sourceDef.fetch({ + eventSource: eventSource, + calendar: calendar, + range: fetchRange + }, function (res) { + var rawEvents = res.rawEvents; + var calSuccess = calendar.opt('eventSourceSuccess'); + var calSuccessRes; + var sourceSuccessRes; + if (eventSource.success) { + sourceSuccessRes = eventSource.success(rawEvents, res.xhr); + } + if (calSuccess) { + calSuccessRes = calSuccess(rawEvents, res.xhr); + } + rawEvents = sourceSuccessRes || calSuccessRes || rawEvents; + calendar.dispatch({ + type: 'RECEIVE_EVENTS', + sourceId: eventSource.sourceId, + fetchId: fetchId, + fetchRange: fetchRange, + rawEvents: rawEvents + }); + }, function (error) { + var callFailure = calendar.opt('eventSourceFailure'); + console.warn(error.message, error); + if (eventSource.failure) { + eventSource.failure(error); + } + if (callFailure) { + callFailure(error); + } + calendar.dispatch({ + type: 'RECEIVE_EVENT_ERROR', + sourceId: eventSource.sourceId, + fetchId: fetchId, + fetchRange: fetchRange, + error: error + }); + }); + return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId }); + } + function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) { + var _a; + var eventSource = sourceHash[sourceId]; + if (eventSource && // not already removed + fetchId === eventSource.latestFetchId) { + return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange }), _a)); + } + return sourceHash; + } + function excludeStaticSources(eventSources, calendar) { + return filterHash(eventSources, function (eventSource) { + return doesSourceNeedRange(eventSource, calendar); + }); + } + + var DateProfileGenerator = /** @class */ (function () { + function DateProfileGenerator(viewSpec, calendar) { + this.viewSpec = viewSpec; + this.options = viewSpec.options; + this.dateEnv = calendar.dateEnv; + this.calendar = calendar; + this.initHiddenDays(); + } + /* Date Range Computation + ------------------------------------------------------------------------------------------------------------------*/ + // Builds a structure with info about what the dates/ranges will be for the "prev" view. + DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) { + var dateEnv = this.dateEnv; + var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month + currentDateProfile.dateIncrement); + return this.build(prevDate, -1); + }; + // Builds a structure with info about what the dates/ranges will be for the "next" view. + DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) { + var dateEnv = this.dateEnv; + var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month + currentDateProfile.dateIncrement); + return this.build(nextDate, 1); + }; + // Builds a structure holding dates/ranges for rendering around the given date. + // Optional direction param indicates whether the date is being incremented/decremented + // from its previous value. decremented = -1, incremented = 1 (default). + DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) { + if (forceToValid === void 0) { forceToValid = false; } + var validRange; + var minTime = null; + var maxTime = null; + var currentInfo; + var isRangeAllDay; + var renderRange; + var activeRange; + var isValid; + validRange = this.buildValidRange(); + validRange = this.trimHiddenDays(validRange); + if (forceToValid) { + currentDate = constrainMarkerToRange(currentDate, validRange); + } + currentInfo = this.buildCurrentRangeInfo(currentDate, direction); + isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit); + renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay); + renderRange = this.trimHiddenDays(renderRange); + activeRange = renderRange; + if (!this.options.showNonCurrentDates) { + activeRange = intersectRanges(activeRange, currentInfo.range); + } + minTime = createDuration(this.options.minTime); + maxTime = createDuration(this.options.maxTime); + activeRange = this.adjustActiveRange(activeRange, minTime, maxTime); + activeRange = intersectRanges(activeRange, validRange); // might return null + // it's invalid if the originally requested date is not contained, + // or if the range is completely outside of the valid range. + isValid = rangesIntersect(currentInfo.range, validRange); + return { + // constraint for where prev/next operations can go and where events can be dragged/resized to. + // an object with optional start and end properties. + validRange: validRange, + // range the view is formally responsible for. + // for example, a month view might have 1st-31st, excluding padded dates + currentRange: currentInfo.range, + // name of largest unit being displayed, like "month" or "week" + currentRangeUnit: currentInfo.unit, + isRangeAllDay: isRangeAllDay, + // dates that display events and accept drag-n-drop + // will be `null` if no dates accept events + activeRange: activeRange, + // date range with a rendered skeleton + // includes not-active days that need some sort of DOM + renderRange: renderRange, + // Duration object that denotes the first visible time of any given day + minTime: minTime, + // Duration object that denotes the exclusive visible end time of any given day + maxTime: maxTime, + isValid: isValid, + // how far the current date will move for a prev/next operation + dateIncrement: this.buildDateIncrement(currentInfo.duration) + // pass a fallback (might be null) ^ + }; + }; + // Builds an object with optional start/end properties. + // Indicates the minimum/maximum dates to display. + // not responsible for trimming hidden days. + DateProfileGenerator.prototype.buildValidRange = function () { + return this.getRangeOption('validRange', this.calendar.getNow()) || + { start: null, end: null }; // completely open-ended + }; + // Builds a structure with info about the "current" range, the range that is + // highlighted as being the current month for example. + // See build() for a description of `direction`. + // Guaranteed to have `range` and `unit` properties. `duration` is optional. + DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) { + var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv; + var duration = null; + var unit = null; + var range = null; + var dayCount; + if (viewSpec.duration) { + duration = viewSpec.duration; + unit = viewSpec.durationUnit; + range = this.buildRangeFromDuration(date, direction, duration, unit); + } + else if ((dayCount = this.options.dayCount)) { + unit = 'day'; + range = this.buildRangeFromDayCount(date, direction, dayCount); + } + else if ((range = this.buildCustomVisibleRange(date))) { + unit = dateEnv.greatestWholeUnit(range.start, range.end).unit; + } + else { + duration = this.getFallbackDuration(); + unit = greatestDurationDenominator(duration).unit; + range = this.buildRangeFromDuration(date, direction, duration, unit); + } + return { duration: duration, unit: unit, range: range }; + }; + DateProfileGenerator.prototype.getFallbackDuration = function () { + return createDuration({ day: 1 }); + }; + // Returns a new activeRange to have time values (un-ambiguate) + // minTime or maxTime causes the range to expand. + DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) { + var dateEnv = this.dateEnv; + var start = range.start; + var end = range.end; + if (this.viewSpec.class.prototype.usesMinMaxTime) { + // expand active range if minTime is negative (why not when positive?) + if (asRoughDays(minTime) < 0) { + start = startOfDay(start); // necessary? + start = dateEnv.add(start, minTime); + } + // expand active range if maxTime is beyond one day (why not when positive?) + if (asRoughDays(maxTime) > 1) { + end = startOfDay(end); // necessary? + end = addDays(end, -1); + end = dateEnv.add(end, maxTime); + } + } + return { start: start, end: end }; + }; + // Builds the "current" range when it is specified as an explicit duration. + // `unit` is the already-computed greatestDurationDenominator unit of duration. + DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) { + var dateEnv = this.dateEnv; + var alignment = this.options.dateAlignment; + var dateIncrementInput; + var dateIncrementDuration; + var start; + var end; + var res; + // compute what the alignment should be + if (!alignment) { + dateIncrementInput = this.options.dateIncrement; + if (dateIncrementInput) { + dateIncrementDuration = createDuration(dateIncrementInput); + // use the smaller of the two units + if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) { + alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit; + } + else { + alignment = unit; + } + } + else { + alignment = unit; + } + } + // if the view displays a single day or smaller + if (asRoughDays(duration) <= 1) { + if (this.isHiddenDay(start)) { + start = this.skipHiddenDays(start, direction); + start = startOfDay(start); + } + } + function computeRes() { + start = dateEnv.startOf(date, alignment); + end = dateEnv.add(start, duration); + res = { start: start, end: end }; + } + computeRes(); + // if range is completely enveloped by hidden days, go past the hidden days + if (!this.trimHiddenDays(res)) { + date = this.skipHiddenDays(date, direction); + computeRes(); + } + return res; + }; + // Builds the "current" range when a dayCount is specified. + DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) { + var dateEnv = this.dateEnv; + var customAlignment = this.options.dateAlignment; + var runningCount = 0; + var start = date; + var end; + if (customAlignment) { + start = dateEnv.startOf(start, customAlignment); + } + start = startOfDay(start); + start = this.skipHiddenDays(start, direction); + end = start; + do { + end = addDays(end, 1); + if (!this.isHiddenDay(end)) { + runningCount++; + } + } while (runningCount < dayCount); + return { start: start, end: end }; + }; + // Builds a normalized range object for the "visible" range, + // which is a way to define the currentRange and activeRange at the same time. + DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) { + var dateEnv = this.dateEnv; + var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date)); + if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) { + return null; + } + return visibleRange; + }; + // Computes the range that will represent the element/cells for *rendering*, + // but which may have voided days/times. + // not responsible for trimming hidden days. + DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { + return currentRange; + }; + // Compute the duration value that should be added/substracted to the current date + // when a prev/next operation happens. + DateProfileGenerator.prototype.buildDateIncrement = function (fallback) { + var dateIncrementInput = this.options.dateIncrement; + var customAlignment; + if (dateIncrementInput) { + return createDuration(dateIncrementInput); + } + else if ((customAlignment = this.options.dateAlignment)) { + return createDuration(1, customAlignment); + } + else if (fallback) { + return fallback; + } + else { + return createDuration({ days: 1 }); + } + }; + // Arguments after name will be forwarded to a hypothetical function value + // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects. + // Always clone your objects if you fear mutation. + DateProfileGenerator.prototype.getRangeOption = function (name) { + var otherArgs = []; + for (var _i = 1; _i < arguments.length; _i++) { + otherArgs[_i - 1] = arguments[_i]; + } + var val = this.options[name]; + if (typeof val === 'function') { + val = val.apply(null, otherArgs); + } + if (val) { + val = parseRange(val, this.dateEnv); + } + if (val) { + val = computeVisibleDayRange(val); + } + return val; + }; + /* Hidden Days + ------------------------------------------------------------------------------------------------------------------*/ + // Initializes internal variables related to calculating hidden days-of-week + DateProfileGenerator.prototype.initHiddenDays = function () { + var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden + var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) + var dayCnt = 0; + var i; + if (this.options.weekends === false) { + hiddenDays.push(0, 6); // 0=sunday, 6=saturday + } + for (i = 0; i < 7; i++) { + if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) { + dayCnt++; + } + } + if (!dayCnt) { + throw new Error('invalid hiddenDays'); // all days were hidden? bad. + } + this.isHiddenDayHash = isHiddenDayHash; + }; + // Remove days from the beginning and end of the range that are computed as hidden. + // If the whole range is trimmed off, returns null + DateProfileGenerator.prototype.trimHiddenDays = function (range) { + var start = range.start; + var end = range.end; + if (start) { + start = this.skipHiddenDays(start); + } + if (end) { + end = this.skipHiddenDays(end, -1, true); + } + if (start == null || end == null || start < end) { + return { start: start, end: end }; + } + return null; + }; + // Is the current day hidden? + // `day` is a day-of-week index (0-6), or a Date (used for UTC) + DateProfileGenerator.prototype.isHiddenDay = function (day) { + if (day instanceof Date) { + day = day.getUTCDay(); + } + return this.isHiddenDayHash[day]; + }; + // Incrementing the current day until it is no longer a hidden day, returning a copy. + // DOES NOT CONSIDER validRange! + // If the initial value of `date` is not a hidden day, don't do anything. + // Pass `isExclusive` as `true` if you are dealing with an end date. + // `inc` defaults to `1` (increment one day forward each time) + DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) { + if (inc === void 0) { inc = 1; } + if (isExclusive === void 0) { isExclusive = false; } + while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) { + date = addDays(date, inc); + } + return date; + }; + return DateProfileGenerator; + }()); + // TODO: find a way to avoid comparing DateProfiles. it's tedious + function isDateProfilesEqual(p0, p1) { + return rangesEqual(p0.validRange, p1.validRange) && + rangesEqual(p0.activeRange, p1.activeRange) && + rangesEqual(p0.renderRange, p1.renderRange) && + durationsEqual(p0.minTime, p1.minTime) && + durationsEqual(p0.maxTime, p1.maxTime); + /* + TODO: compare more? + currentRange: DateRange + currentRangeUnit: string + isRangeAllDay: boolean + isValid: boolean + dateIncrement: Duration + */ + } + + function reduce (state, action, calendar) { + var viewType = reduceViewType(state.viewType, action); + var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar); + var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar); + var nextState = __assign({}, state, { viewType: viewType, + dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) }); + for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) { + var reducerFunc = _a[_i]; + nextState = reducerFunc(nextState, action, calendar); + } + // console.log(action.type, nextState) + return nextState; + } + function reduceViewType(currentViewType, action) { + switch (action.type) { + case 'SET_VIEW_TYPE': + return action.viewType; + default: + return currentViewType; + } + } + function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) { + var newDateProfile; + switch (action.type) { + case 'PREV': + newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate); + break; + case 'NEXT': + newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate); + break; + case 'SET_DATE': + if (!currentDateProfile.activeRange || + !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) { + newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid + ); + } + break; + case 'SET_VIEW_TYPE': + var generator = calendar.dateProfileGenerators[viewType]; + if (!generator) { + throw new Error(viewType ? + 'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' : + 'No available FullCalendar view plugins.'); + } + newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid + ); + break; + } + if (newDateProfile && + newDateProfile.isValid && + !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) { + return newDateProfile; + } + else { + return currentDateProfile; + } + } + function reduceCurrentDate(currentDate, action, dateProfile) { + switch (action.type) { + case 'PREV': + case 'NEXT': + if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) { + return dateProfile.currentRange.start; + } + else { + return currentDate; + } + case 'SET_DATE': + case 'SET_VIEW_TYPE': + var newDate = action.dateMarker || currentDate; + if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) { + return dateProfile.currentRange.start; + } + else { + return newDate; + } + default: + return currentDate; + } + } + function reduceDateSelection(currentSelection, action, calendar) { + switch (action.type) { + case 'SELECT_DATES': + return action.selection; + case 'UNSELECT_DATES': + return null; + default: + return currentSelection; + } + } + function reduceSelectedEvent(currentInstanceId, action) { + switch (action.type) { + case 'SELECT_EVENT': + return action.eventInstanceId; + case 'UNSELECT_EVENT': + return ''; + default: + return currentInstanceId; + } + } + function reduceEventDrag(currentDrag, action, sources, calendar) { + switch (action.type) { + case 'SET_EVENT_DRAG': + var newDrag = action.state; + return { + affectedEvents: newDrag.affectedEvents, + mutatedEvents: newDrag.mutatedEvents, + isEvent: newDrag.isEvent, + origSeg: newDrag.origSeg + }; + case 'UNSET_EVENT_DRAG': + return null; + default: + return currentDrag; + } + } + function reduceEventResize(currentResize, action, sources, calendar) { + switch (action.type) { + case 'SET_EVENT_RESIZE': + var newResize = action.state; + return { + affectedEvents: newResize.affectedEvents, + mutatedEvents: newResize.mutatedEvents, + isEvent: newResize.isEvent, + origSeg: newResize.origSeg + }; + case 'UNSET_EVENT_RESIZE': + return null; + default: + return currentResize; + } + } + function computeLoadingLevel(eventSources) { + var cnt = 0; + for (var sourceId in eventSources) { + if (eventSources[sourceId].isFetching) { + cnt++; + } + } + return cnt; + } + + var STANDARD_PROPS = { + start: null, + end: null, + allDay: Boolean + }; + function parseDateSpan(raw, dateEnv, defaultDuration) { + var span = parseOpenDateSpan(raw, dateEnv); + var range = span.range; + if (!range.start) { + return null; + } + if (!range.end) { + if (defaultDuration == null) { + return null; + } + else { + range.end = dateEnv.add(range.start, defaultDuration); + } + } + return span; + } + /* + TODO: somehow combine with parseRange? + Will return null if the start/end props were present but parsed invalidly. + */ + function parseOpenDateSpan(raw, dateEnv) { + var leftovers = {}; + var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers); + var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null; + var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null; + var allDay = standardProps.allDay; + if (allDay == null) { + allDay = (startMeta && startMeta.isTimeUnspecified) && + (!endMeta || endMeta.isTimeUnspecified); + } + // use this leftover object as the selection object + leftovers.range = { + start: startMeta ? startMeta.marker : null, + end: endMeta ? endMeta.marker : null + }; + leftovers.allDay = allDay; + return leftovers; + } + function isDateSpansEqual(span0, span1) { + return rangesEqual(span0.range, span1.range) && + span0.allDay === span1.allDay && + isSpanPropsEqual(span0, span1); + } + // the NON-DATE-RELATED props + function isSpanPropsEqual(span0, span1) { + for (var propName in span1) { + if (propName !== 'range' && propName !== 'allDay') { + if (span0[propName] !== span1[propName]) { + return false; + } + } + } + // are there any props that span0 has that span1 DOESN'T have? + // both have range/allDay, so no need to special-case. + for (var propName in span0) { + if (!(propName in span1)) { + return false; + } + } + return true; + } + function buildDateSpanApi(span, dateEnv) { + return { + start: dateEnv.toDate(span.range.start), + end: dateEnv.toDate(span.range.end), + startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }), + endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }), + allDay: span.allDay + }; + } + function buildDatePointApi(span, dateEnv) { + return { + date: dateEnv.toDate(span.range.start), + dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }), + allDay: span.allDay + }; + } + function fabricateEventRange(dateSpan, eventUiBases, calendar) { + var def = parseEventDef({ editable: false }, '', // sourceId + dateSpan.allDay, true, // hasEnd + calendar); + return { + def: def, + ui: compileEventUi(def, eventUiBases), + instance: createEventInstance(def.defId, dateSpan.range), + range: dateSpan.range, + isStart: true, + isEnd: true + }; + } + + function compileViewDefs(defaultConfigs, overrideConfigs) { + var hash = {}; + var viewType; + for (viewType in defaultConfigs) { + ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); + } + for (viewType in overrideConfigs) { + ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); + } + return hash; + } + function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) { + if (hash[viewType]) { + return hash[viewType]; + } + var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs); + if (viewDef) { + hash[viewType] = viewDef; + } + return viewDef; + } + function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) { + var defaultConfig = defaultConfigs[viewType]; + var overrideConfig = overrideConfigs[viewType]; + var queryProp = function (name) { + return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] : + ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null); + }; + var theClass = queryProp('class'); + var superType = queryProp('superType'); + if (!superType && theClass) { + superType = + findViewNameBySubclass(theClass, overrideConfigs) || + findViewNameBySubclass(theClass, defaultConfigs); + } + var superDef = null; + if (superType) { + if (superType === viewType) { + throw new Error('Can\'t have a custom view type that references itself'); + } + superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs); + } + if (!theClass && superDef) { + theClass = superDef.class; + } + if (!theClass) { + return null; // don't throw a warning, might be settings for a single-unit view + } + return { + type: viewType, + class: theClass, + defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})), + overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {})) + }; + } + function findViewNameBySubclass(viewSubclass, configs) { + var superProto = Object.getPrototypeOf(viewSubclass.prototype); + for (var viewType in configs) { + var parsed = configs[viewType]; + // need DIRECT subclass, so instanceof won't do it + if (parsed.class && parsed.class.prototype === superProto) { + return viewType; + } + } + return ''; + } + + function parseViewConfigs(inputs) { + return mapHash(inputs, parseViewConfig); + } + var VIEW_DEF_PROPS = { + type: String, + class: null + }; + function parseViewConfig(input) { + if (typeof input === 'function') { + input = { class: input }; + } + var options = {}; + var props = refineProps(input, VIEW_DEF_PROPS, {}, options); + return { + superType: props.type, + class: props.class, + options: options + }; + } + + function buildViewSpecs(defaultInputs, optionsManager) { + var defaultConfigs = parseViewConfigs(defaultInputs); + var overrideConfigs = parseViewConfigs(optionsManager.overrides.views); + var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs); + return mapHash(viewDefs, function (viewDef) { + return buildViewSpec(viewDef, overrideConfigs, optionsManager); + }); + } + function buildViewSpec(viewDef, overrideConfigs, optionsManager) { + var durationInput = viewDef.overrides.duration || + viewDef.defaults.duration || + optionsManager.dynamicOverrides.duration || + optionsManager.overrides.duration; + var duration = null; + var durationUnit = ''; + var singleUnit = ''; + var singleUnitOverrides = {}; + if (durationInput) { + duration = createDuration(durationInput); + if (duration) { // valid? + var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput)); + durationUnit = denom.unit; + if (denom.value === 1) { + singleUnit = durationUnit; + singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {}; + } + } + } + var queryButtonText = function (options) { + var buttonTextMap = options.buttonText || {}; + var buttonTextKey = viewDef.defaults.buttonTextKey; + if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) { + return buttonTextMap[buttonTextKey]; + } + if (buttonTextMap[viewDef.type] != null) { + return buttonTextMap[viewDef.type]; + } + if (buttonTextMap[singleUnit] != null) { + return buttonTextMap[singleUnit]; + } + }; + return { + type: viewDef.type, + class: viewDef.class, + duration: duration, + durationUnit: durationUnit, + singleUnit: singleUnit, + options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides), + buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) || + queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence + viewDef.overrides.buttonText, + buttonTextDefault: queryButtonText(optionsManager.localeDefaults) || + queryButtonText(optionsManager.dirDefaults) || + viewDef.defaults.buttonText || + queryButtonText(globalDefaults) || + viewDef.type // fall back to given view name + }; + } + + var Toolbar = /** @class */ (function (_super) { + __extends(Toolbar, _super); + function Toolbar(context, extraClassName) { + var _this = _super.call(this, context) || this; + _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout); + _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]); + _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]); + _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]); + _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]); + _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]); + _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName }); + return _this; + } + Toolbar.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this._renderLayout.unrender(); // should unrender everything else + removeElement(this.el); + }; + Toolbar.prototype.render = function (props) { + this._renderLayout(props.layout); + this._updateTitle(props.title); + this._updateActiveButton(props.activeButton); + this._updateToday(props.isTodayEnabled); + this._updatePrev(props.isPrevEnabled); + this._updateNext(props.isNextEnabled); + }; + Toolbar.prototype.renderLayout = function (layout) { + var el = this.el; + this.viewsWithButtons = []; + appendToElement(el, this.renderSection('left', layout.left)); + appendToElement(el, this.renderSection('center', layout.center)); + appendToElement(el, this.renderSection('right', layout.right)); + }; + Toolbar.prototype.unrenderLayout = function () { + this.el.innerHTML = ''; + }; + Toolbar.prototype.renderSection = function (position, buttonStr) { + var _this = this; + var _a = this, theme = _a.theme, calendar = _a.calendar; + var optionsManager = calendar.optionsManager; + var viewSpecs = calendar.viewSpecs; + var sectionEl = createElement('div', { className: 'fc-' + position }); + var calendarCustomButtons = optionsManager.computed.customButtons || {}; + var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {}; + var calendarButtonText = optionsManager.computed.buttonText || {}; + if (buttonStr) { + buttonStr.split(' ').forEach(function (buttonGroupStr, i) { + var groupChildren = []; + var isOnlyButtons = true; + var groupEl; + buttonGroupStr.split(',').forEach(function (buttonName, j) { + var customButtonProps; + var viewSpec; + var buttonClick; + var buttonIcon; // only one of these will be set + var buttonText; // " + var buttonInnerHtml; + var buttonClasses; + var buttonEl; + var buttonAriaAttr; + if (buttonName === 'title') { + groupChildren.push(htmlToElement('

 

')); // we always want it to take up height + isOnlyButtons = false; + } + else { + if ((customButtonProps = calendarCustomButtons[buttonName])) { + buttonClick = function (ev) { + if (customButtonProps.click) { + customButtonProps.click.call(buttonEl, ev); + } + }; + (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) || + (buttonIcon = theme.getIconClass(buttonName)) || + (buttonText = customButtonProps.text); + } + else if ((viewSpec = viewSpecs[buttonName])) { + _this.viewsWithButtons.push(buttonName); + buttonClick = function () { + calendar.changeView(buttonName); + }; + (buttonText = viewSpec.buttonTextOverride) || + (buttonIcon = theme.getIconClass(buttonName)) || + (buttonText = viewSpec.buttonTextDefault); + } + else if (calendar[buttonName]) { // a calendar method + buttonClick = function () { + calendar[buttonName](); + }; + (buttonText = calendarButtonTextOverrides[buttonName]) || + (buttonIcon = theme.getIconClass(buttonName)) || + (buttonText = calendarButtonText[buttonName]); + // ^ everything else is considered default + } + if (buttonClick) { + buttonClasses = [ + 'fc-' + buttonName + '-button', + theme.getClass('button') + ]; + if (buttonText) { + buttonInnerHtml = htmlEscape(buttonText); + buttonAriaAttr = ''; + } + else if (buttonIcon) { + buttonInnerHtml = ""; + buttonAriaAttr = ' aria-label="' + buttonName + '"'; + } + buttonEl = htmlToElement(// type="button" so that it doesn't submit a form + ''); + buttonEl.addEventListener('click', buttonClick); + groupChildren.push(buttonEl); + } + } + }); + if (groupChildren.length > 1) { + groupEl = document.createElement('div'); + var buttonGroupClassName = theme.getClass('buttonGroup'); + if (isOnlyButtons && buttonGroupClassName) { + groupEl.classList.add(buttonGroupClassName); + } + appendToElement(groupEl, groupChildren); + sectionEl.appendChild(groupEl); + } + else { + appendToElement(sectionEl, groupChildren); // 1 or 0 children + } + }); + } + return sectionEl; + }; + Toolbar.prototype.updateToday = function (isTodayEnabled) { + this.toggleButtonEnabled('today', isTodayEnabled); + }; + Toolbar.prototype.updatePrev = function (isPrevEnabled) { + this.toggleButtonEnabled('prev', isPrevEnabled); + }; + Toolbar.prototype.updateNext = function (isNextEnabled) { + this.toggleButtonEnabled('next', isNextEnabled); + }; + Toolbar.prototype.updateTitle = function (text) { + findElements(this.el, 'h2').forEach(function (titleEl) { + titleEl.innerText = text; + }); + }; + Toolbar.prototype.updateActiveButton = function (buttonName) { + var className = this.theme.getClass('buttonActive'); + findElements(this.el, 'button').forEach(function (buttonEl) { + if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) { + buttonEl.classList.add(className); + } + else { + buttonEl.classList.remove(className); + } + }); + }; + Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) { + findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) { + buttonEl.disabled = !bool; + }); + }; + return Toolbar; + }(Component)); + + var CalendarComponent = /** @class */ (function (_super) { + __extends(CalendarComponent, _super); + function CalendarComponent(context, el) { + var _this = _super.call(this, context) || this; + _this._renderToolbars = memoizeRendering(_this.renderToolbars); + _this.buildViewPropTransformers = memoize(buildViewPropTransformers); + _this.el = el; + prependToElement(el, _this.contentEl = createElement('div', { className: 'fc-view-container' })); + var calendar = _this.calendar; + for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) { + var modifyViewContainer = _a[_i]; + modifyViewContainer(_this.contentEl, calendar); + } + _this.toggleElClassNames(true); + _this.computeTitle = memoize(computeTitle); + _this.parseBusinessHours = memoize(function (input) { + return parseBusinessHours(input, _this.calendar); + }); + return _this; + } + CalendarComponent.prototype.destroy = function () { + if (this.header) { + this.header.destroy(); + } + if (this.footer) { + this.footer.destroy(); + } + if (this.view) { + this.view.destroy(); + } + removeElement(this.contentEl); + this.toggleElClassNames(false); + _super.prototype.destroy.call(this); + }; + CalendarComponent.prototype.toggleElClassNames = function (bool) { + var classList = this.el.classList; + var dirClassName = 'fc-' + this.opt('dir'); + var themeClassName = this.theme.getClass('widget'); + if (bool) { + classList.add('fc'); + classList.add(dirClassName); + classList.add(themeClassName); + } + else { + classList.remove('fc'); + classList.remove(dirClassName); + classList.remove(themeClassName); + } + }; + CalendarComponent.prototype.render = function (props) { + this.freezeHeight(); + var title = this.computeTitle(props.dateProfile, props.viewSpec.options); + this._renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, props.dateProfileGenerator, title); + this.renderView(props, title); + this.updateSize(); + this.thawHeight(); + }; + CalendarComponent.prototype.renderToolbars = function (viewSpec, dateProfile, currentDate, dateProfileGenerator, title) { + var headerLayout = this.opt('header'); + var footerLayout = this.opt('footer'); + var now = this.calendar.getNow(); + var todayInfo = dateProfileGenerator.build(now); + var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate); + var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate); + var toolbarProps = { + title: title, + activeButton: viewSpec.type, + isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now), + isPrevEnabled: prevInfo.isValid, + isNextEnabled: nextInfo.isValid + }; + if (headerLayout) { + if (!this.header) { + this.header = new Toolbar(this.context, 'fc-header-toolbar'); + prependToElement(this.el, this.header.el); + } + this.header.receiveProps(__assign({ layout: headerLayout }, toolbarProps)); + } + else if (this.header) { + this.header.destroy(); + this.header = null; + } + if (footerLayout) { + if (!this.footer) { + this.footer = new Toolbar(this.context, 'fc-footer-toolbar'); + appendToElement(this.el, this.footer.el); + } + this.footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps)); + } + else if (this.footer) { + this.footer.destroy(); + this.footer = null; + } + }; + CalendarComponent.prototype.renderView = function (props, title) { + var view = this.view; + var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator; + if (!view || view.viewSpec !== viewSpec) { + if (view) { + view.destroy(); + } + view = this.view = new viewSpec['class']({ + calendar: this.calendar, + view: null, + dateEnv: this.dateEnv, + theme: this.theme, + options: viewSpec.options + }, viewSpec, dateProfileGenerator, this.contentEl); + } + else { + view.addScroll(view.queryScroll()); + } + view.title = title; // for the API + var viewProps = { + dateProfile: props.dateProfile, + businessHours: this.parseBusinessHours(viewSpec.options.businessHours), + eventStore: props.eventStore, + eventUiBases: props.eventUiBases, + dateSelection: props.dateSelection, + eventSelection: props.eventSelection, + eventDrag: props.eventDrag, + eventResize: props.eventResize + }; + var transformers = this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers); + for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { + var transformer = transformers_1[_i]; + __assign(viewProps, transformer.transform(viewProps, viewSpec, props, view)); + } + view.receiveProps(viewProps); + }; + // Sizing + // ----------------------------------------------------------------------------------------------------------------- + CalendarComponent.prototype.updateSize = function (isResize) { + if (isResize === void 0) { isResize = false; } + var view = this.view; + if (isResize) { + view.addScroll(view.queryScroll()); + } + if (isResize || this.isHeightAuto == null) { + this.computeHeightVars(); + } + view.updateSize(isResize, this.viewHeight, this.isHeightAuto); + view.updateNowIndicator(); // we need to guarantee this will run after updateSize + view.popScroll(isResize); + }; + CalendarComponent.prototype.computeHeightVars = function () { + var calendar = this.calendar; // yuck. need to handle dynamic options + var heightInput = calendar.opt('height'); + var contentHeightInput = calendar.opt('contentHeight'); + this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto'; + if (typeof contentHeightInput === 'number') { // exists and not 'auto' + this.viewHeight = contentHeightInput; + } + else if (typeof contentHeightInput === 'function') { // exists and is a function + this.viewHeight = contentHeightInput(); + } + else if (typeof heightInput === 'number') { // exists and not 'auto' + this.viewHeight = heightInput - this.queryToolbarsHeight(); + } + else if (typeof heightInput === 'function') { // exists and is a function + this.viewHeight = heightInput() - this.queryToolbarsHeight(); + } + else if (heightInput === 'parent') { // set to height of parent element + var parentEl = this.el.parentNode; + this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight(); + } + else { + this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width / + Math.max(calendar.opt('aspectRatio'), .5)); + } + }; + CalendarComponent.prototype.queryToolbarsHeight = function () { + var height = 0; + if (this.header) { + height += computeHeightAndMargins(this.header.el); + } + if (this.footer) { + height += computeHeightAndMargins(this.footer.el); + } + return height; + }; + // Height "Freezing" + // ----------------------------------------------------------------------------------------------------------------- + CalendarComponent.prototype.freezeHeight = function () { + applyStyle(this.el, { + height: this.el.getBoundingClientRect().height, + overflow: 'hidden' + }); + }; + CalendarComponent.prototype.thawHeight = function () { + applyStyle(this.el, { + height: '', + overflow: '' + }); + }; + return CalendarComponent; + }(Component)); + // Title and Date Formatting + // ----------------------------------------------------------------------------------------------------------------- + // Computes what the title at the top of the calendar should be for this view + function computeTitle(dateProfile, viewOptions) { + var range; + // for views that span a large unit of time, show the proper interval, ignoring stray days before and after + if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) { + range = dateProfile.currentRange; + } + else { // for day units or smaller, use the actual day range + range = dateProfile.activeRange; + } + return this.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay }); + } + // Generates the format string that should be used to generate the title for the current date range. + // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`. + function computeTitleFormat(dateProfile) { + var currentRangeUnit = dateProfile.currentRangeUnit; + if (currentRangeUnit === 'year') { + return { year: 'numeric' }; + } + else if (currentRangeUnit === 'month') { + return { year: 'numeric', month: 'long' }; // like "September 2014" + } + else { + var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end); + if (days !== null && days > 1) { + // multi-day range. shorter, like "Sep 9 - 10 2014" + return { year: 'numeric', month: 'short', day: 'numeric' }; + } + else { + // one day. longer, like "September 9 2014" + return { year: 'numeric', month: 'long', day: 'numeric' }; + } + } + } + // Plugin + // ----------------------------------------------------------------------------------------------------------------- + function buildViewPropTransformers(theClasses) { + return theClasses.map(function (theClass) { + return new theClass(); + }); + } + + var Interaction = /** @class */ (function () { + function Interaction(settings) { + this.component = settings.component; + } + Interaction.prototype.destroy = function () { + }; + return Interaction; + }()); + function parseInteractionSettings(component, input) { + return { + component: component, + el: input.el, + useEventCenter: input.useEventCenter != null ? input.useEventCenter : true + }; + } + function interactionSettingsToStore(settings) { + var _a; + return _a = {}, + _a[settings.component.uid] = settings, + _a; + } + // global state + var interactionSettingsStore = {}; + + /* + Detects when the user clicks on an event within a DateComponent + */ + var EventClicking = /** @class */ (function (_super) { + __extends(EventClicking, _super); + function EventClicking(settings) { + var _this = _super.call(this, settings) || this; + _this.handleSegClick = function (ev, segEl) { + var component = _this.component; + var seg = getElSeg(segEl); + if (seg && // might be the
surrounding the more link + component.isValidSegDownEl(ev.target)) { + // our way to simulate a link click for elements that can't be tags + // grab before trigger fired in case trigger trashes DOM thru rerendering + var hasUrlContainer = elementClosest(ev.target, '.fc-has-url'); + var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : ''; + component.publiclyTrigger('eventClick', [ + { + el: segEl, + event: new EventApi(component.calendar, seg.eventRange.def, seg.eventRange.instance), + jsEvent: ev, + view: component.view + } + ]); + if (url && !ev.defaultPrevented) { + window.location.href = url; + } + } + }; + var component = settings.component; + _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick); + return _this; + } + return EventClicking; + }(Interaction)); + + /* + Triggers events and adds/removes core classNames when the user's pointer + enters/leaves event-elements of a component. + */ + var EventHovering = /** @class */ (function (_super) { + __extends(EventHovering, _super); + function EventHovering(settings) { + var _this = _super.call(this, settings) || this; + // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it + _this.handleEventElRemove = function (el) { + if (el === _this.currentSegEl) { + _this.handleSegLeave(null, _this.currentSegEl); + } + }; + _this.handleSegEnter = function (ev, segEl) { + if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper + segEl.classList.add('fc-allow-mouse-resize'); + _this.currentSegEl = segEl; + _this.triggerEvent('eventMouseEnter', ev, segEl); + } + }; + _this.handleSegLeave = function (ev, segEl) { + if (_this.currentSegEl) { + segEl.classList.remove('fc-allow-mouse-resize'); + _this.currentSegEl = null; + _this.triggerEvent('eventMouseLeave', ev, segEl); + } + }; + var component = settings.component; + _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave); + component.calendar.on('eventElRemove', _this.handleEventElRemove); + return _this; + } + EventHovering.prototype.destroy = function () { + this.removeHoverListeners(); + this.component.calendar.off('eventElRemove', this.handleEventElRemove); + }; + EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) { + var component = this.component; + var seg = getElSeg(segEl); + if (!ev || component.isValidSegDownEl(ev.target)) { + component.publiclyTrigger(publicEvName, [ + { + el: segEl, + event: new EventApi(this.component.calendar, seg.eventRange.def, seg.eventRange.instance), + jsEvent: ev, + view: component.view + } + ]); + } + }; + return EventHovering; + }(Interaction)); + + var StandardTheme = /** @class */ (function (_super) { + __extends(StandardTheme, _super); + function StandardTheme() { + return _super !== null && _super.apply(this, arguments) || this; + } + return StandardTheme; + }(Theme)); + StandardTheme.prototype.classes = { + widget: 'fc-unthemed', + widgetHeader: 'fc-widget-header', + widgetContent: 'fc-widget-content', + buttonGroup: 'fc-button-group', + button: 'fc-button fc-button-primary', + buttonActive: 'fc-button-active', + popoverHeader: 'fc-widget-header', + popoverContent: 'fc-widget-content', + // day grid + headerRow: 'fc-widget-header', + dayRow: 'fc-widget-content', + // list view + listView: 'fc-widget-content' + }; + StandardTheme.prototype.baseIconClass = 'fc-icon'; + StandardTheme.prototype.iconClasses = { + close: 'fc-icon-x', + prev: 'fc-icon-chevron-left', + next: 'fc-icon-chevron-right', + prevYear: 'fc-icon-chevrons-left', + nextYear: 'fc-icon-chevrons-right' + }; + StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; + StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon'; + StandardTheme.prototype.iconOverridePrefix = 'fc-icon-'; + + var Calendar = /** @class */ (function () { + function Calendar(el, overrides) { + var _this = this; + this.parseRawLocales = memoize(parseRawLocales); + this.buildLocale = memoize(buildLocale); + this.buildDateEnv = memoize(buildDateEnv); + this.buildTheme = memoize(buildTheme); + this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase); + this.buildSelectionConfig = memoize(this._buildSelectionConfig); + this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual); + this.buildEventUiBases = memoize(buildEventUiBases); + this.interactionsStore = {}; + this.actionQueue = []; + this.isReducing = false; + // isDisplaying: boolean = false // installed in DOM? accepting renders? + this.needsRerender = false; // needs a render? + this.needsFullRerender = false; + this.isRendering = false; // currently in the executeRender function? + this.renderingPauseDepth = 0; + this.buildDelayedRerender = memoize(buildDelayedRerender); + this.afterSizingTriggers = {}; + this.isViewUpdated = false; + this.isDatesUpdated = false; + this.isEventsUpdated = false; + this.el = el; + this.optionsManager = new OptionsManager(overrides || {}); + this.pluginSystem = new PluginSystem(); + // only do once. don't do in handleOptions. because can't remove plugins + this.addPluginInputs(this.optionsManager.computed.plugins || []); + this.handleOptions(this.optionsManager.computed); + this.publiclyTrigger('_init'); // for tests + this.hydrate(); + this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions + .map(function (calendarInteractionClass) { + return new calendarInteractionClass(_this); + }); + } + Calendar.prototype.addPluginInputs = function (pluginInputs) { + var pluginDefs = refinePluginDefs(pluginInputs); + for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) { + var pluginDef = pluginDefs_1[_i]; + this.pluginSystem.add(pluginDef); + } + }; + Object.defineProperty(Calendar.prototype, "view", { + // public API + get: function () { + return this.component ? this.component.view : null; + }, + enumerable: true, + configurable: true + }); + // Public API for rendering + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.render = function () { + if (!this.component) { + this.renderableEventStore = createEmptyEventStore(); + this.bindHandlers(); + this.executeRender(); + } + else { + this.requestRerender(true); + } + }; + Calendar.prototype.destroy = function () { + if (this.component) { + this.unbindHandlers(); + this.component.destroy(); // don't null-out. in case API needs access + this.component = null; // umm ??? + for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) { + var interaction = _a[_i]; + interaction.destroy(); + } + this.publiclyTrigger('_destroyed'); + } + }; + // Handlers + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.bindHandlers = function () { + var _this = this; + // event delegation for nav links + this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) { + var gotoOptions = anchorEl.getAttribute('data-goto'); + gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {}; + var dateEnv = _this.dateEnv; + var dateMarker = dateEnv.createMarker(gotoOptions.date); + var viewType = gotoOptions.type; + // property like "navLinkDayClick". might be a string or a function + var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click'); + if (typeof customAction === 'function') { + customAction(dateEnv.toDate(dateMarker), ev); + } + else { + if (typeof customAction === 'string') { + viewType = customAction; + } + _this.zoomTo(dateMarker, viewType); + } + }); + if (this.opt('handleWindowResize')) { + window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls + this.windowResize.bind(this), this.opt('windowResizeDelay'))); + } + }; + Calendar.prototype.unbindHandlers = function () { + this.removeNavLinkListener(); + if (this.windowResizeProxy) { + window.removeEventListener('resize', this.windowResizeProxy); + this.windowResizeProxy = null; + } + }; + // Dispatcher + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.hydrate = function () { + var _this = this; + this.state = this.buildInitialState(); + var rawSources = this.opt('eventSources') || []; + var singleRawSource = this.opt('events'); + var sources = []; // parsed + if (singleRawSource) { + rawSources.unshift(singleRawSource); + } + for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) { + var rawSource = rawSources_1[_i]; + var source = parseEventSource(rawSource, this); + if (source) { + sources.push(source); + } + } + this.batchRendering(function () { + _this.dispatch({ type: 'INIT' }); // pass in sources here? + _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources }); + _this.dispatch({ + type: 'SET_VIEW_TYPE', + viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView + }); + }); + }; + Calendar.prototype.buildInitialState = function () { + return { + viewType: null, + loadingLevel: 0, + eventSourceLoadingLevel: 0, + currentDate: this.getInitialDate(), + dateProfile: null, + eventSources: {}, + eventStore: createEmptyEventStore(), + dateSelection: null, + eventSelection: '', + eventDrag: null, + eventResize: null + }; + }; + Calendar.prototype.dispatch = function (action) { + this.actionQueue.push(action); + if (!this.isReducing) { + this.isReducing = true; + var oldState = this.state; + while (this.actionQueue.length) { + this.state = this.reduce(this.state, this.actionQueue.shift(), this); + } + var newState = this.state; + this.isReducing = false; + if (!oldState.loadingLevel && newState.loadingLevel) { + this.publiclyTrigger('loading', [true]); + } + else if (oldState.loadingLevel && !newState.loadingLevel) { + this.publiclyTrigger('loading', [false]); + } + var view = this.component && this.component.view; + if (oldState.eventStore !== newState.eventStore || this.needsFullRerender) { + if (oldState.eventStore) { + this.isEventsUpdated = true; + } + } + if (oldState.dateProfile !== newState.dateProfile || this.needsFullRerender) { + if (oldState.dateProfile && view) { // why would view be null!? + this.publiclyTrigger('datesDestroy', [ + { + view: view, + el: view.el + } + ]); + } + this.isDatesUpdated = true; + } + if (oldState.viewType !== newState.viewType || this.needsFullRerender) { + if (oldState.viewType && view) { // why would view be null!? + this.publiclyTrigger('viewSkeletonDestroy', [ + { + view: view, + el: view.el + } + ]); + } + this.isViewUpdated = true; + } + this.requestRerender(); + } + }; + Calendar.prototype.reduce = function (state, action, calendar) { + return reduce(state, action, calendar); + }; + // Render Queue + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.requestRerender = function (needsFull) { + if (needsFull === void 0) { needsFull = false; } + this.needsRerender = true; + this.needsFullRerender = this.needsFullRerender || needsFull; + this.delayedRerender(); // will call a debounced-version of tryRerender + }; + Calendar.prototype.tryRerender = function () { + if (this.component && // must be accepting renders + this.needsRerender && // indicates that a rerender was requested + !this.renderingPauseDepth && // not paused + !this.isRendering // not currently in the render loop + ) { + this.executeRender(); + } + }; + Calendar.prototype.batchRendering = function (func) { + this.renderingPauseDepth++; + func(); + this.renderingPauseDepth--; + if (this.needsRerender) { + this.requestRerender(); + } + }; + // Rendering + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.executeRender = function () { + var needsFullRerender = this.needsFullRerender; // save before clearing + // clear these BEFORE the render so that new values will accumulate during render + this.needsRerender = false; + this.needsFullRerender = false; + this.isRendering = true; + this.renderComponent(needsFullRerender); + this.isRendering = false; + // received a rerender request while rendering + if (this.needsRerender) { + this.delayedRerender(); + } + }; + /* + don't call this directly. use executeRender instead + */ + Calendar.prototype.renderComponent = function (needsFull) { + var _a = this, state = _a.state, component = _a.component; + var viewType = state.viewType; + var viewSpec = this.viewSpecs[viewType]; + var savedScroll = (needsFull && component) ? component.view.queryScroll() : null; + if (!viewSpec) { + throw new Error("View type \"" + viewType + "\" is not valid"); + } + // if event sources are still loading and progressive rendering hasn't been enabled, + // keep rendering the last fully loaded set of events + var renderableEventStore = this.renderableEventStore = + (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ? + this.renderableEventStore : + state.eventStore; + var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options); + var eventUiBySource = this.buildEventUiBySource(state.eventSources); + var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource); + if (needsFull || !component) { + if (component) { + component.freezeHeight(); // next component will unfreeze it + component.destroy(); + } + component = this.component = new CalendarComponent({ + calendar: this, + view: null, + dateEnv: this.dateEnv, + theme: this.theme, + options: this.optionsManager.computed + }, this.el); + this.isViewUpdated = true; + this.isDatesUpdated = true; + this.isEventsUpdated = true; + } + component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfile: state.dateProfile, dateProfileGenerator: this.dateProfileGenerators[viewType], eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize })); + if (savedScroll) { + component.view.applyScroll(savedScroll, false); + } + if (this.isViewUpdated) { + this.isViewUpdated = false; + this.publiclyTrigger('viewSkeletonRender', [ + { + view: component.view, + el: component.view.el + } + ]); + } + if (this.isDatesUpdated) { + this.isDatesUpdated = false; + this.publiclyTrigger('datesRender', [ + { + view: component.view, + el: component.view.el + } + ]); + } + if (this.isEventsUpdated) { + this.isEventsUpdated = false; + } + this.releaseAfterSizingTriggers(); + }; + // Options + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.setOption = function (name, val) { + var _a; + this.mutateOptions((_a = {}, _a[name] = val, _a), [], true); + }; + Calendar.prototype.getOption = function (name) { + return this.optionsManager.computed[name]; + }; + Calendar.prototype.opt = function (name) { + return this.optionsManager.computed[name]; + }; + Calendar.prototype.viewOpt = function (name) { + return this.viewOpts()[name]; + }; + Calendar.prototype.viewOpts = function () { + return this.viewSpecs[this.state.viewType].options; + }; + /* + handles option changes (like a diff) + */ + Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) { + var _this = this; + var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers; + var normalUpdates = {}; + var specialUpdates = {}; + var oldDateEnv = this.dateEnv; // do this before handleOptions + var isTimeZoneDirty = false; + var isSizeDirty = false; + var anyDifficultOptions = Boolean(removals.length); + for (var name_1 in updates) { + if (changeHandlers[name_1]) { + specialUpdates[name_1] = updates[name_1]; + } + else { + normalUpdates[name_1] = updates[name_1]; + } + } + for (var name_2 in normalUpdates) { + if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) { + isSizeDirty = true; + } + else if (/^(defaultDate|defaultView)$/.test(name_2)) ; + else { + anyDifficultOptions = true; + if (name_2 === 'timeZone') { + isTimeZoneDirty = true; + } + } + } + this.optionsManager.mutate(normalUpdates, removals, isDynamic); + if (anyDifficultOptions) { + this.handleOptions(this.optionsManager.computed); + this.needsFullRerender = true; + } + this.batchRendering(function () { + if (anyDifficultOptions) { + if (isTimeZoneDirty) { + _this.dispatch({ + type: 'CHANGE_TIMEZONE', + oldDateEnv: oldDateEnv + }); + } + /* HACK + has the same effect as calling this.requestRerender(true) + but recomputes the state's dateProfile + */ + _this.dispatch({ + type: 'SET_VIEW_TYPE', + viewType: _this.state.viewType + }); + } + else if (isSizeDirty) { + _this.updateSize(); + } + // special updates + if (deepEqual) { + for (var name_3 in specialUpdates) { + changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual); + } + } + }); + }; + /* + rebuilds things based off of a complete set of refined options + */ + Calendar.prototype.handleOptions = function (options) { + var _this = this; + var pluginHooks = this.pluginSystem.hooks; + this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration); + this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration); + this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay); + this.theme = this.buildTheme(options); + var available = this.parseRawLocales(options.locales); + this.availableRawLocales = available.map; + var locale = this.buildLocale(options.locale || available.defaultCode, available.map); + this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter); + this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :( + // ineffecient to do every time? + this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager); + // ineffecient to do every time? + this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) { + return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this); + }); + }; + Calendar.prototype.getAvailableLocaleCodes = function () { + return Object.keys(this.availableRawLocales); + }; + Calendar.prototype._buildSelectionConfig = function (rawOpts) { + return processScopedUiProps('select', rawOpts, this); + }; + Calendar.prototype._buildEventUiSingleBase = function (rawOpts) { + if (rawOpts.editable) { // so 'editable' affected events + rawOpts = __assign({}, rawOpts, { eventEditable: true }); + } + return processScopedUiProps('event', rawOpts, this); + }; + // Trigger + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.hasPublicHandlers = function (name) { + return this.hasHandlers(name) || + this.opt(name); // handler specified in options + }; + Calendar.prototype.publiclyTrigger = function (name, args) { + var optHandler = this.opt(name); + this.triggerWith(name, this, args); + if (optHandler) { + return optHandler.apply(this, args); + } + }; + Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) { + var afterSizingTriggers = this.afterSizingTriggers; + (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args); + }; + Calendar.prototype.releaseAfterSizingTriggers = function () { + var afterSizingTriggers = this.afterSizingTriggers; + for (var name_4 in afterSizingTriggers) { + for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) { + var args = _a[_i]; + this.publiclyTrigger(name_4, args); + } + } + this.afterSizingTriggers = {}; + }; + // View + // ----------------------------------------------------------------------------------------------------------------- + // Returns a boolean about whether the view is okay to instantiate at some point + Calendar.prototype.isValidViewType = function (viewType) { + return Boolean(this.viewSpecs[viewType]); + }; + Calendar.prototype.changeView = function (viewType, dateOrRange) { + var dateMarker = null; + if (dateOrRange) { + if (dateOrRange.start && dateOrRange.end) { // a range + this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender + this.handleOptions(this.optionsManager.computed); // ...but yuck + } + else { // a date + dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate + } + } + this.unselect(); + this.dispatch({ + type: 'SET_VIEW_TYPE', + viewType: viewType, + dateMarker: dateMarker + }); + }; + // Forces navigation to a view for the given date. + // `viewType` can be a specific view name or a generic one like "week" or "day". + // needs to change + Calendar.prototype.zoomTo = function (dateMarker, viewType) { + var spec; + viewType = viewType || 'day'; // day is default zoom + spec = this.viewSpecs[viewType] || + this.getUnitViewSpec(viewType); + this.unselect(); + if (spec) { + this.dispatch({ + type: 'SET_VIEW_TYPE', + viewType: spec.type, + dateMarker: dateMarker + }); + } + else { + this.dispatch({ + type: 'SET_DATE', + dateMarker: dateMarker + }); + } + }; + // Given a duration singular unit, like "week" or "day", finds a matching view spec. + // Preference is given to views that have corresponding buttons. + Calendar.prototype.getUnitViewSpec = function (unit) { + var component = this.component; + var viewTypes = []; + var i; + var spec; + // put views that have buttons first. there will be duplicates, but oh + if (component.header) { + viewTypes.push.apply(viewTypes, component.header.viewsWithButtons); + } + if (component.footer) { + viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons); + } + for (var viewType in this.viewSpecs) { + viewTypes.push(viewType); + } + for (i = 0; i < viewTypes.length; i++) { + spec = this.viewSpecs[viewTypes[i]]; + if (spec) { + if (spec.singleUnit === unit) { + return spec; + } + } + } + }; + // Current Date + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.getInitialDate = function () { + var defaultDateInput = this.opt('defaultDate'); + // compute the initial ambig-timezone date + if (defaultDateInput != null) { + return this.dateEnv.createMarker(defaultDateInput); + } + else { + return this.getNow(); // getNow already returns unzoned + } + }; + Calendar.prototype.prev = function () { + this.unselect(); + this.dispatch({ type: 'PREV' }); + }; + Calendar.prototype.next = function () { + this.unselect(); + this.dispatch({ type: 'NEXT' }); + }; + Calendar.prototype.prevYear = function () { + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.dateEnv.addYears(this.state.currentDate, -1) + }); + }; + Calendar.prototype.nextYear = function () { + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.dateEnv.addYears(this.state.currentDate, 1) + }); + }; + Calendar.prototype.today = function () { + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.getNow() + }); + }; + Calendar.prototype.gotoDate = function (zonedDateInput) { + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.dateEnv.createMarker(zonedDateInput) + }); + }; + Calendar.prototype.incrementDate = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // else, warn about invalid input? + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.dateEnv.add(this.state.currentDate, delta) + }); + } + }; + // for external API + Calendar.prototype.getDate = function () { + return this.dateEnv.toDate(this.state.currentDate); + }; + // Date Formatting Utils + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.formatDate = function (d, formatter) { + var dateEnv = this.dateEnv; + return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter)); + }; + // `settings` is for formatter AND isEndExclusive + Calendar.prototype.formatRange = function (d0, d1, settings) { + var dateEnv = this.dateEnv; + return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings); + }; + Calendar.prototype.formatIso = function (d, omitTime) { + var dateEnv = this.dateEnv; + return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime }); + }; + // Sizing + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.windowResize = function (ev) { + if (!this.isHandlingWindowResize && + this.component && // why? + ev.target === window // not a jqui resize event + ) { + this.isHandlingWindowResize = true; + this.updateSize(); + this.publiclyTrigger('windowResize', [this.view]); + this.isHandlingWindowResize = false; + } + }; + Calendar.prototype.updateSize = function () { + if (this.component) { // when? + this.component.updateSize(true); + } + }; + // Component Registration + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) { + var settings = parseInteractionSettings(component, settingsInput); + var DEFAULT_INTERACTIONS = [ + EventClicking, + EventHovering + ]; + var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions); + var interactions = interactionClasses.map(function (interactionClass) { + return new interactionClass(settings); + }); + this.interactionsStore[component.uid] = interactions; + interactionSettingsStore[component.uid] = settings; + }; + Calendar.prototype.unregisterInteractiveComponent = function (component) { + for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) { + var listener = _a[_i]; + listener.destroy(); + } + delete this.interactionsStore[component.uid]; + delete interactionSettingsStore[component.uid]; + }; + // Date Selection / Event Selection / DayClick + // ----------------------------------------------------------------------------------------------------------------- + // this public method receives start/end dates in any format, with any timezone + // NOTE: args were changed from v3 + Calendar.prototype.select = function (dateOrObj, endDate) { + var selectionInput; + if (endDate == null) { + if (dateOrObj.start != null) { + selectionInput = dateOrObj; + } + else { + selectionInput = { + start: dateOrObj, + end: null + }; + } + } + else { + selectionInput = { + start: dateOrObj, + end: endDate + }; + } + var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this? + ); + if (selection) { // throw parse error otherwise? + this.dispatch({ type: 'SELECT_DATES', selection: selection }); + this.triggerDateSelect(selection); + } + }; + // public method + Calendar.prototype.unselect = function (pev) { + if (this.state.dateSelection) { + this.dispatch({ type: 'UNSELECT_DATES' }); + this.triggerDateUnselect(pev); + } + }; + Calendar.prototype.triggerDateSelect = function (selection, pev) { + var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view }); + this.publiclyTrigger('select', [arg]); + }; + Calendar.prototype.triggerDateUnselect = function (pev) { + this.publiclyTrigger('unselect', [ + { + jsEvent: pev ? pev.origEvent : null, + view: this.view + } + ]); + }; + // TODO: receive pev? + Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) { + var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655 + view: view }); + this.publiclyTrigger('dateClick', [arg]); + }; + Calendar.prototype.buildDatePointApi = function (dateSpan) { + var props = {}; + for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) { + var transform = _a[_i]; + __assign(props, transform(dateSpan, this)); + } + __assign(props, buildDatePointApi(dateSpan, this.dateEnv)); + return props; + }; + Calendar.prototype.buildDateSpanApi = function (dateSpan) { + var props = {}; + for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) { + var transform = _a[_i]; + __assign(props, transform(dateSpan, this)); + } + __assign(props, buildDateSpanApi(dateSpan, this.dateEnv)); + return props; + }; + // Date Utils + // ----------------------------------------------------------------------------------------------------------------- + // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option + Calendar.prototype.getNow = function () { + var now = this.opt('now'); + if (typeof now === 'function') { + now = now(); + } + if (now == null) { + return this.dateEnv.createNowMarker(); + } + return this.dateEnv.createMarker(now); + }; + // Event-Date Utilities + // ----------------------------------------------------------------------------------------------------------------- + // Given an event's allDay status and start date, return what its fallback end date should be. + // TODO: rename to computeDefaultEventEnd + Calendar.prototype.getDefaultEventEnd = function (allDay, marker) { + var end = marker; + if (allDay) { + end = startOfDay(end); + end = this.dateEnv.add(end, this.defaultAllDayEventDuration); + } + else { + end = this.dateEnv.add(end, this.defaultTimedEventDuration); + } + return end; + }; + // Public Events API + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.addEvent = function (eventInput, sourceInput) { + if (eventInput instanceof EventApi) { + var def = eventInput._def; + var instance = eventInput._instance; + // not already present? don't want to add an old snapshot + if (!this.state.eventStore.defs[def.defId]) { + this.dispatch({ + type: 'ADD_EVENTS', + eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args? + }); + } + return eventInput; + } + var sourceId; + if (sourceInput instanceof EventSourceApi) { + sourceId = sourceInput.internalEventSource.sourceId; + } + else if (sourceInput != null) { + var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function + if (!sourceApi) { + console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test + return null; + } + else { + sourceId = sourceApi.internalEventSource.sourceId; + } + } + var tuple = parseEvent(eventInput, sourceId, this); + if (tuple) { + this.dispatch({ + type: 'ADD_EVENTS', + eventStore: eventTupleToStore(tuple) + }); + return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance); + } + return null; + }; + // TODO: optimize + Calendar.prototype.getEventById = function (id) { + var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances; + id = String(id); + for (var defId in defs) { + var def = defs[defId]; + if (def.publicId === id) { + if (def.recurringDef) { + return new EventApi(this, def, null); + } + else { + for (var instanceId in instances) { + var instance = instances[instanceId]; + if (instance.defId === def.defId) { + return new EventApi(this, def, instance); + } + } + } + } + } + return null; + }; + Calendar.prototype.getEvents = function () { + var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances; + var eventApis = []; + for (var id in instances) { + var instance = instances[id]; + var def = defs[instance.defId]; + eventApis.push(new EventApi(this, def, instance)); + } + return eventApis; + }; + Calendar.prototype.removeAllEvents = function () { + this.dispatch({ type: 'REMOVE_ALL_EVENTS' }); + }; + Calendar.prototype.rerenderEvents = function () { + this.dispatch({ type: 'RESET_EVENTS' }); + }; + // Public Event Sources API + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.getEventSources = function () { + var sourceHash = this.state.eventSources; + var sourceApis = []; + for (var internalId in sourceHash) { + sourceApis.push(new EventSourceApi(this, sourceHash[internalId])); + } + return sourceApis; + }; + Calendar.prototype.getEventSourceById = function (id) { + var sourceHash = this.state.eventSources; + id = String(id); + for (var sourceId in sourceHash) { + if (sourceHash[sourceId].publicId === id) { + return new EventSourceApi(this, sourceHash[sourceId]); + } + } + return null; + }; + Calendar.prototype.addEventSource = function (sourceInput) { + if (sourceInput instanceof EventSourceApi) { + // not already present? don't want to add an old snapshot + if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) { + this.dispatch({ + type: 'ADD_EVENT_SOURCES', + sources: [sourceInput.internalEventSource] + }); + } + return sourceInput; + } + var eventSource = parseEventSource(sourceInput, this); + if (eventSource) { // TODO: error otherwise? + this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] }); + return new EventSourceApi(this, eventSource); + } + return null; + }; + Calendar.prototype.removeAllEventSources = function () { + this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' }); + }; + Calendar.prototype.refetchEvents = function () { + this.dispatch({ type: 'FETCH_EVENT_SOURCES' }); + }; + // Scroll + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.scrollToTime = function (timeInput) { + var duration = createDuration(timeInput); + if (duration) { + this.component.view.scrollToDuration(duration); + } + }; + return Calendar; + }()); + EmitterMixin.mixInto(Calendar); + // for memoizers + // ----------------------------------------------------------------------------------------------------------------- + function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) { + return new DateEnv({ + calendarSystem: 'gregory', + timeZone: timeZone, + namedTimeZoneImpl: namedTimeZoneImpl, + locale: locale, + weekNumberCalculation: weekNumberCalculation, + firstDay: firstDay, + weekLabel: weekLabel, + cmdFormatter: cmdFormatter + }); + } + function buildTheme(calendarOptions) { + var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme; + return new themeClass(calendarOptions); + } + function buildDelayedRerender(wait) { + var func = this.tryRerender.bind(this); + if (wait != null) { + func = debounce(func, wait); + } + return func; + } + function buildEventUiBySource(eventSources) { + return mapHash(eventSources, function (eventSource) { + return eventSource.ui; + }); + } + function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) { + var eventUiBases = { '': eventUiSingleBase }; + for (var defId in eventDefs) { + var def = eventDefs[defId]; + if (def.sourceId && eventUiBySource[def.sourceId]) { + eventUiBases[defId] = eventUiBySource[def.sourceId]; + } + } + return eventUiBases; + } + + var View = /** @class */ (function (_super) { + __extends(View, _super); + function View(context, viewSpec, dateProfileGenerator, parentEl) { + var _this = _super.call(this, context, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' }), true // isView (HACK) + ) || this; + _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap); + _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]); + _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]); + _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]); + _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]); + _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]); + _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]); + _this.viewSpec = viewSpec; + _this.dateProfileGenerator = dateProfileGenerator; + _this.type = viewSpec.type; + _this.eventOrderSpecs = parseFieldSpecs(_this.opt('eventOrder')); + _this.nextDayThreshold = createDuration(_this.opt('nextDayThreshold')); + parentEl.appendChild(_this.el); + _this.initialize(); + return _this; + } + View.prototype.initialize = function () { + }; + Object.defineProperty(View.prototype, "activeStart", { + // Date Setting/Unsetting + // ----------------------------------------------------------------------------------------------------------------- + get: function () { + return this.dateEnv.toDate(this.props.dateProfile.activeRange.start); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(View.prototype, "activeEnd", { + get: function () { + return this.dateEnv.toDate(this.props.dateProfile.activeRange.end); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(View.prototype, "currentStart", { + get: function () { + return this.dateEnv.toDate(this.props.dateProfile.currentRange.start); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(View.prototype, "currentEnd", { + get: function () { + return this.dateEnv.toDate(this.props.dateProfile.currentRange.end); + }, + enumerable: true, + configurable: true + }); + // General Rendering + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.render = function (props) { + this.renderDatesMem(props.dateProfile); + this.renderBusinessHoursMem(props.businessHours); + this.renderDateSelectionMem(props.dateSelection); + this.renderEventsMem(props.eventStore); + this.renderEventSelectionMem(props.eventSelection); + this.renderEventDragMem(props.eventDrag); + this.renderEventResizeMem(props.eventResize); + }; + View.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.renderDatesMem.unrender(); // should unrender everything else + }; + // Sizing + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.updateSize = function (isResize, viewHeight, isAuto) { + var calendar = this.calendar; + if (isResize || // HACKS... + calendar.isViewUpdated || + calendar.isDatesUpdated || + calendar.isEventsUpdated) { + // sort of the catch-all sizing + // anything that might cause dimension changes + this.updateBaseSize(isResize, viewHeight, isAuto); + } + }; + View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) { + }; + // Date Rendering + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderDatesWrap = function (dateProfile) { + this.renderDates(dateProfile); + this.addScroll({ + duration: createDuration(this.opt('scrollTime')) + }); + this.startNowIndicator(dateProfile); // shouldn't render yet because updateSize will be called soon + }; + View.prototype.unrenderDatesWrap = function () { + this.stopNowIndicator(); + this.unrenderDates(); + }; + View.prototype.renderDates = function (dateProfile) { }; + View.prototype.unrenderDates = function () { }; + // Business Hours + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderBusinessHours = function (businessHours) { }; + View.prototype.unrenderBusinessHours = function () { }; + // Date Selection + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderDateSelectionWrap = function (selection) { + if (selection) { + this.renderDateSelection(selection); + } + }; + View.prototype.unrenderDateSelectionWrap = function (selection) { + if (selection) { + this.unrenderDateSelection(selection); + } + }; + View.prototype.renderDateSelection = function (selection) { }; + View.prototype.unrenderDateSelection = function (selection) { }; + // Event Rendering + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderEvents = function (eventStore) { }; + View.prototype.unrenderEvents = function () { }; + // util for subclasses + View.prototype.sliceEvents = function (eventStore, allDay) { + var props = this.props; + return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.nextDayThreshold : null).fg; + }; + View.prototype.computeEventDraggable = function (eventDef, eventUi) { + var transformers = this.calendar.pluginSystem.hooks.isDraggableTransformers; + var val = eventUi.startEditable; + for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { + var transformer = transformers_1[_i]; + val = transformer(val, eventDef, eventUi, this); + } + return val; + }; + View.prototype.computeEventStartResizable = function (eventDef, eventUi) { + return eventUi.durationEditable && this.opt('eventResizableFromStart'); + }; + View.prototype.computeEventEndResizable = function (eventDef, eventUi) { + return eventUi.durationEditable; + }; + // Event Selection + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderEventSelectionWrap = function (instanceId) { + if (instanceId) { + this.renderEventSelection(instanceId); + } + }; + View.prototype.unrenderEventSelectionWrap = function (instanceId) { + if (instanceId) { + this.unrenderEventSelection(instanceId); + } + }; + View.prototype.renderEventSelection = function (instanceId) { }; + View.prototype.unrenderEventSelection = function (instanceId) { }; + // Event Drag + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderEventDragWrap = function (state) { + if (state) { + this.renderEventDrag(state); + } + }; + View.prototype.unrenderEventDragWrap = function (state) { + if (state) { + this.unrenderEventDrag(state); + } + }; + View.prototype.renderEventDrag = function (state) { }; + View.prototype.unrenderEventDrag = function (state) { }; + // Event Resize + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderEventResizeWrap = function (state) { + if (state) { + this.renderEventResize(state); + } + }; + View.prototype.unrenderEventResizeWrap = function (state) { + if (state) { + this.unrenderEventResize(state); + } + }; + View.prototype.renderEventResize = function (state) { }; + View.prototype.unrenderEventResize = function (state) { }; + /* Now Indicator + ------------------------------------------------------------------------------------------------------------------*/ + // Immediately render the current time indicator and begins re-rendering it at an interval, + // which is defined by this.getNowIndicatorUnit(). + // TODO: somehow do this for the current whole day's background too + View.prototype.startNowIndicator = function (dateProfile) { + var _this = this; + var dateEnv = this.dateEnv; + var unit; + var update; + var delay; // ms wait value + if (this.opt('nowIndicator')) { + unit = this.getNowIndicatorUnit(dateProfile); + if (unit) { + update = this.updateNowIndicator.bind(this); + this.initialNowDate = this.calendar.getNow(); + this.initialNowQueriedMs = new Date().valueOf(); + // wait until the beginning of the next interval + delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf(); + // TODO: maybe always use setTimeout, waiting until start of next unit + this.nowIndicatorTimeoutID = setTimeout(function () { + _this.nowIndicatorTimeoutID = null; + update(); + if (unit === 'second') { + delay = 1000; // every second + } + else { + delay = 1000 * 60; // otherwise, every minute + } + _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval + }, delay); + } + // rendering will be initiated in updateSize + } + }; + // rerenders the now indicator, computing the new current time from the amount of time that has passed + // since the initial getNow call. + View.prototype.updateNowIndicator = function () { + if (this.props.dateProfile && // a way to determine if dates were rendered yet + this.initialNowDate // activated before? + ) { + this.unrenderNowIndicator(); // won't unrender if unnecessary + this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs)); + this.isNowIndicatorRendered = true; + } + }; + // Immediately unrenders the view's current time indicator and stops any re-rendering timers. + // Won't cause side effects if indicator isn't rendered. + View.prototype.stopNowIndicator = function () { + if (this.isNowIndicatorRendered) { + if (this.nowIndicatorTimeoutID) { + clearTimeout(this.nowIndicatorTimeoutID); + this.nowIndicatorTimeoutID = null; + } + if (this.nowIndicatorIntervalID) { + clearInterval(this.nowIndicatorIntervalID); + this.nowIndicatorIntervalID = null; + } + this.unrenderNowIndicator(); + this.isNowIndicatorRendered = false; + } + }; + View.prototype.getNowIndicatorUnit = function (dateProfile) { + // subclasses should implement + }; + // Renders a current time indicator at the given datetime + View.prototype.renderNowIndicator = function (date) { + // SUBCLASSES MUST PASS TO CHILDREN! + }; + // Undoes the rendering actions from renderNowIndicator + View.prototype.unrenderNowIndicator = function () { + // SUBCLASSES MUST PASS TO CHILDREN! + }; + /* Scroller + ------------------------------------------------------------------------------------------------------------------*/ + View.prototype.addScroll = function (scroll) { + var queuedScroll = this.queuedScroll || (this.queuedScroll = {}); + __assign(queuedScroll, scroll); + }; + View.prototype.popScroll = function (isResize) { + this.applyQueuedScroll(isResize); + this.queuedScroll = null; + }; + View.prototype.applyQueuedScroll = function (isResize) { + this.applyScroll(this.queuedScroll || {}, isResize); + }; + View.prototype.queryScroll = function () { + var scroll = {}; + if (this.props.dateProfile) { // dates rendered yet? + __assign(scroll, this.queryDateScroll()); + } + return scroll; + }; + View.prototype.applyScroll = function (scroll, isResize) { + var duration = scroll.duration; + if (duration != null) { + delete scroll.duration; + if (this.props.dateProfile) { // dates rendered yet? + __assign(scroll, this.computeDateScroll(duration)); + } + } + if (this.props.dateProfile) { // dates rendered yet? + this.applyDateScroll(scroll); + } + }; + View.prototype.computeDateScroll = function (duration) { + return {}; // subclasses must implement + }; + View.prototype.queryDateScroll = function () { + return {}; // subclasses must implement + }; + View.prototype.applyDateScroll = function (scroll) { + // subclasses must implement + }; + // for API + View.prototype.scrollToDuration = function (duration) { + this.applyScroll({ duration: duration }, false); + }; + return View; + }(DateComponent)); + EmitterMixin.mixInto(View); + View.prototype.usesMinMaxTime = false; + View.prototype.dateProfileGeneratorClass = DateProfileGenerator; + + var FgEventRenderer = /** @class */ (function () { + function FgEventRenderer(context) { + this.segs = []; + this.isSizeDirty = false; + this.context = context; + } + FgEventRenderer.prototype.renderSegs = function (segs, mirrorInfo) { + this.rangeUpdated(); // called too frequently :( + // render an `.el` on each seg + // returns a subset of the segs. segs that were actually rendered + segs = this.renderSegEls(segs, mirrorInfo); + this.segs = segs; + this.attachSegs(segs, mirrorInfo); + this.isSizeDirty = true; + this.context.view.triggerRenderedSegs(this.segs, Boolean(mirrorInfo)); + }; + FgEventRenderer.prototype.unrender = function (_segs, mirrorInfo) { + this.context.view.triggerWillRemoveSegs(this.segs, Boolean(mirrorInfo)); + this.detachSegs(this.segs); + this.segs = []; + }; + // Updates values that rely on options and also relate to range + FgEventRenderer.prototype.rangeUpdated = function () { + var options = this.context.options; + var displayEventTime; + var displayEventEnd; + this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator); + displayEventTime = options.displayEventTime; + if (displayEventTime == null) { + displayEventTime = this.computeDisplayEventTime(); // might be based off of range + } + displayEventEnd = options.displayEventEnd; + if (displayEventEnd == null) { + displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range + } + this.displayEventTime = displayEventTime; + this.displayEventEnd = displayEventEnd; + }; + // Renders and assigns an `el` property for each foreground event segment. + // Only returns segments that successfully rendered. + FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) { + var html = ''; + var i; + if (segs.length) { // don't build an empty html string + // build a large concatenation of event segment HTML + for (i = 0; i < segs.length; i++) { + html += this.renderSegHtml(segs[i], mirrorInfo); + } + // Grab individual elements from the combined HTML string. Use each as the default rendering. + // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false. + htmlToElements(html).forEach(function (el, i) { + var seg = segs[i]; + if (el) { + seg.el = el; + } + }); + segs = filterSegsViaEls(this.context.view, segs, Boolean(mirrorInfo)); + } + return segs; + }; + // Generic utility for generating the HTML classNames for an event segment's element + FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) { + var classes = [ + 'fc-event', + seg.isStart ? 'fc-start' : 'fc-not-start', + seg.isEnd ? 'fc-end' : 'fc-not-end' + ].concat(seg.eventRange.ui.classNames); + if (isDraggable) { + classes.push('fc-draggable'); + } + if (isResizable) { + classes.push('fc-resizable'); + } + if (mirrorInfo) { + classes.push('fc-mirror'); + if (mirrorInfo.isDragging) { + classes.push('fc-dragging'); + } + if (mirrorInfo.isResizing) { + classes.push('fc-resizing'); + } + } + return classes; + }; + // Compute the text that should be displayed on an event's element. + // `range` can be the Event object itself, or something range-like, with at least a `start`. + // If event times are disabled, or the event has no time, will return a blank string. + // If not specified, formatter will default to the eventTimeFormat setting, + // and displayEnd will default to the displayEventEnd setting. + FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) { + var def = eventRange.def, instance = eventRange.instance; + return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo); + }; + FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) { + var dateEnv = this.context.dateEnv; + if (formatter == null) { + formatter = this.eventTimeFormat; + } + if (displayEnd == null) { + displayEnd = this.displayEventEnd; + } + if (this.displayEventTime && !allDay) { + if (displayEnd && end) { + return dateEnv.formatRange(start, end, formatter, { + forcedStartTzo: forcedStartTzo, + forcedEndTzo: forcedEndTzo + }); + } + else { + return dateEnv.format(start, formatter, { + forcedTzo: forcedStartTzo + }); + } + } + return ''; + }; + FgEventRenderer.prototype.computeEventTimeFormat = function () { + return { + hour: 'numeric', + minute: '2-digit', + omitZeroMinute: true + }; + }; + FgEventRenderer.prototype.computeDisplayEventTime = function () { + return true; + }; + FgEventRenderer.prototype.computeDisplayEventEnd = function () { + return true; + }; + // Utility for generating event skin-related CSS properties + FgEventRenderer.prototype.getSkinCss = function (ui) { + return { + 'background-color': ui.backgroundColor, + 'border-color': ui.borderColor, + color: ui.textColor + }; + }; + FgEventRenderer.prototype.sortEventSegs = function (segs) { + var specs = this.context.view.eventOrderSpecs; + var objs = segs.map(buildSegCompareObj); + objs.sort(function (obj0, obj1) { + return compareByFieldSpecs(obj0, obj1, specs); + }); + return objs.map(function (c) { + return c._seg; + }); + }; + FgEventRenderer.prototype.computeSizes = function (force) { + if (force || this.isSizeDirty) { + this.computeSegSizes(this.segs); + } + }; + FgEventRenderer.prototype.assignSizes = function (force) { + if (force || this.isSizeDirty) { + this.assignSegSizes(this.segs); + this.isSizeDirty = false; + } + }; + FgEventRenderer.prototype.computeSegSizes = function (segs) { + }; + FgEventRenderer.prototype.assignSegSizes = function (segs) { + }; + // Manipulation on rendered segs + FgEventRenderer.prototype.hideByHash = function (hash) { + if (hash) { + for (var _i = 0, _a = this.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + if (hash[seg.eventRange.instance.instanceId]) { + seg.el.style.visibility = 'hidden'; + } + } + } + }; + FgEventRenderer.prototype.showByHash = function (hash) { + if (hash) { + for (var _i = 0, _a = this.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + if (hash[seg.eventRange.instance.instanceId]) { + seg.el.style.visibility = ''; + } + } + } + }; + FgEventRenderer.prototype.selectByInstanceId = function (instanceId) { + if (instanceId) { + for (var _i = 0, _a = this.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + var eventInstance = seg.eventRange.instance; + if (eventInstance && eventInstance.instanceId === instanceId && + seg.el // necessary? + ) { + seg.el.classList.add('fc-selected'); + } + } + } + }; + FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) { + if (instanceId) { + for (var _i = 0, _a = this.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + if (seg.el) { // necessary? + seg.el.classList.remove('fc-selected'); + } + } + } + }; + return FgEventRenderer; + }()); + // returns a object with all primitive props that can be compared + function buildSegCompareObj(seg) { + var eventDef = seg.eventRange.def; + var range = seg.eventRange.instance.range; + var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events + var end = range.end ? range.end.valueOf() : 0; // " + return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start, + end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval + }); + } + + var FillRenderer = /** @class */ (function () { + function FillRenderer(context) { + this.fillSegTag = 'div'; + this.dirtySizeFlags = {}; + this.context = context; + this.containerElsByType = {}; + this.segsByType = {}; + } + FillRenderer.prototype.getSegsByType = function (type) { + return this.segsByType[type] || []; + }; + FillRenderer.prototype.renderSegs = function (type, segs) { + var _a; + var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs + var containerEls = this.attachSegs(type, renderedSegs); + if (containerEls) { + (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls); + } + this.segsByType[type] = renderedSegs; + if (type === 'bgEvent') { + this.context.view.triggerRenderedSegs(renderedSegs, false); // isMirror=false + } + this.dirtySizeFlags[type] = true; + }; + // Unrenders a specific type of fill that is currently rendered on the grid + FillRenderer.prototype.unrender = function (type) { + var segs = this.segsByType[type]; + if (segs) { + if (type === 'bgEvent') { + this.context.view.triggerWillRemoveSegs(segs, false); // isMirror=false + } + this.detachSegs(type, segs); + } + }; + // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types. + // Only returns segments that successfully rendered. + FillRenderer.prototype.renderSegEls = function (type, segs) { + var _this = this; + var html = ''; + var i; + if (segs.length) { + // build a large concatenation of segment HTML + for (i = 0; i < segs.length; i++) { + html += this.renderSegHtml(type, segs[i]); + } + // Grab individual elements from the combined HTML string. Use each as the default rendering. + // Then, compute the 'el' for each segment. + htmlToElements(html).forEach(function (el, i) { + var seg = segs[i]; + if (el) { + seg.el = el; + } + }); + if (type === 'bgEvent') { + segs = filterSegsViaEls(this.context.view, segs, false // isMirror. background events can never be mirror elements + ); + } + // correct element type? (would be bad if a non-TD were inserted into a table for example) + segs = segs.filter(function (seg) { + return elementMatches(seg.el, _this.fillSegTag); + }); + } + return segs; + }; + // Builds the HTML needed for one fill segment. Generic enough to work with different types. + FillRenderer.prototype.renderSegHtml = function (type, seg) { + var css = null; + var classNames = []; + if (type !== 'highlight' && type !== 'businessHours') { + css = { + 'background-color': seg.eventRange.ui.backgroundColor + }; + } + if (type !== 'highlight') { + classNames = classNames.concat(seg.eventRange.ui.classNames); + } + if (type === 'businessHours') { + classNames.push('fc-bgevent'); + } + else { + classNames.push('fc-' + type.toLowerCase()); + } + return '<' + this.fillSegTag + + (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') + + (css ? ' style="' + cssToStr(css) + '"' : '') + + '>'; + }; + FillRenderer.prototype.detachSegs = function (type, segs) { + var containerEls = this.containerElsByType[type]; + if (containerEls) { + containerEls.forEach(removeElement); + delete this.containerElsByType[type]; + } + }; + FillRenderer.prototype.computeSizes = function (force) { + for (var type in this.segsByType) { + if (force || this.dirtySizeFlags[type]) { + this.computeSegSizes(this.segsByType[type]); + } + } + }; + FillRenderer.prototype.assignSizes = function (force) { + for (var type in this.segsByType) { + if (force || this.dirtySizeFlags[type]) { + this.assignSegSizes(this.segsByType[type]); + } + } + this.dirtySizeFlags = {}; + }; + FillRenderer.prototype.computeSegSizes = function (segs) { + }; + FillRenderer.prototype.assignSegSizes = function (segs) { + }; + return FillRenderer; + }()); + + var NamedTimeZoneImpl = /** @class */ (function () { + function NamedTimeZoneImpl(timeZoneName) { + this.timeZoneName = timeZoneName; + } + return NamedTimeZoneImpl; + }()); + + /* + An abstraction for a dragging interaction originating on an event. + Does higher-level things than PointerDragger, such as possibly: + - a "mirror" that moves with the pointer + - a minimum number of pixels or other criteria for a true drag to begin + + subclasses must emit: + - pointerdown + - dragstart + - dragmove + - pointerup + - dragend + */ + var ElementDragging = /** @class */ (function () { + function ElementDragging(el) { + this.emitter = new EmitterMixin(); + } + ElementDragging.prototype.destroy = function () { + }; + ElementDragging.prototype.setMirrorIsVisible = function (bool) { + // optional if subclass doesn't want to support a mirror + }; + ElementDragging.prototype.setMirrorNeedsRevert = function (bool) { + // optional if subclass doesn't want to support a mirror + }; + ElementDragging.prototype.setAutoScrollEnabled = function (bool) { + // optional + }; + return ElementDragging; + }()); + + function formatDate(dateInput, settings) { + if (settings === void 0) { settings = {}; } + var dateEnv = buildDateEnv$1(settings); + var formatter = createFormatter(settings); + var dateMeta = dateEnv.createMarkerMeta(dateInput); + if (!dateMeta) { // TODO: warning? + return ''; + } + return dateEnv.format(dateMeta.marker, formatter, { + forcedTzo: dateMeta.forcedTzo + }); + } + function formatRange(startInput, endInput, settings // mixture of env and formatter settings + ) { + var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object + var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator); + var startMeta = dateEnv.createMarkerMeta(startInput); + var endMeta = dateEnv.createMarkerMeta(endInput); + if (!startMeta || !endMeta) { // TODO: warning? + return ''; + } + return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, { + forcedStartTzo: startMeta.forcedTzo, + forcedEndTzo: endMeta.forcedTzo, + isEndExclusive: settings.isEndExclusive + }); + } + // TODO: more DRY and optimized + function buildDateEnv$1(settings) { + var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere + // ensure required settings + settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale }); + return new DateEnv(settings); + } + + var DRAG_META_PROPS = { + startTime: createDuration, + duration: createDuration, + create: Boolean, + sourceId: String + }; + var DRAG_META_DEFAULTS = { + create: true + }; + function parseDragMeta(raw) { + var leftoverProps = {}; + var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps); + refined.leftoverProps = leftoverProps; + return refined; + } + + // Computes a default column header formatting string if `colFormat` is not explicitly defined + function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) { + // if more than one week row, or if there are a lot of columns with not much space, + // put just the day numbers will be in each cell + if (!datesRepDistinctDays || dayCnt > 10) { + return { weekday: 'short' }; // "Sat" + } + else if (dayCnt > 1) { + return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12" + } + else { + return { weekday: 'long' }; // "Saturday" + } + } + function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) { + var view = context.view, dateEnv = context.dateEnv, theme = context.theme, options = context.options; + var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow. + var classNames = [ + 'fc-day-header', + theme.getClass('widgetHeader') + ]; + var innerHtml; + if (typeof options.columnHeaderHtml === 'function') { + innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker)); + } + else if (typeof options.columnHeaderText === 'function') { + innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker))); + } + else { + innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat)); + } + // if only one row of days, the classNames on the header can represent the specific days beneath + if (datesRepDistinctDays) { + classNames = classNames.concat( + // includes the day-of-week class + // noThemeHighlight=true (don't highlight the header) + getDayClasses(dateMarker, dateProfile, context, true)); + } + else { + classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class + } + return '' + + ' 1 ? + ' colspan="' + colspan + '"' : + '') + + (otherAttrs ? + ' ' + otherAttrs : + '') + + '>' + + (isDateValid ? + // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff) + buildGotoAnchorHtml(view, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) : + // if not valid, display text, but no link + innerHtml) + + ''; + } + + var DayHeader = /** @class */ (function (_super) { + __extends(DayHeader, _super); + function DayHeader(context, parentEl) { + var _this = _super.call(this, context) || this; + parentEl.innerHTML = ''; // because might be nbsp + parentEl.appendChild(_this.el = htmlToElement('
' + + '' + + '' + + '
' + + '
')); + _this.thead = _this.el.querySelector('thead'); + return _this; + } + DayHeader.prototype.destroy = function () { + removeElement(this.el); + }; + DayHeader.prototype.render = function (props) { + var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays; + var parts = []; + if (props.renderIntroHtml) { + parts.push(props.renderIntroHtml()); + } + var colHeadFormat = createFormatter(this.opt('columnHeaderFormat') || + computeFallbackHeaderFormat(datesRepDistinctDays, dates.length)); + for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) { + var date = dates_1[_i]; + parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, this.context)); + } + if (this.isRtl) { + parts.reverse(); + } + this.thead.innerHTML = '' + parts.join('') + ''; + }; + return DayHeader; + }(Component)); + + var DaySeries = /** @class */ (function () { + function DaySeries(range, dateProfileGenerator) { + var date = range.start; + var end = range.end; + var indices = []; + var dates = []; + var dayIndex = -1; + while (date < end) { // loop each day from start to end + if (dateProfileGenerator.isHiddenDay(date)) { + indices.push(dayIndex + 0.5); // mark that it's between indices + } + else { + dayIndex++; + indices.push(dayIndex); + dates.push(date); + } + date = addDays(date, 1); + } + this.dates = dates; + this.indices = indices; + this.cnt = dates.length; + } + DaySeries.prototype.sliceRange = function (range) { + var firstIndex = this.getDateDayIndex(range.start); // inclusive first index + var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index + var clippedFirstIndex = Math.max(0, firstIndex); + var clippedLastIndex = Math.min(this.cnt - 1, lastIndex); + // deal with in-between indices + clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell + clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell + if (clippedFirstIndex <= clippedLastIndex) { + return { + firstIndex: clippedFirstIndex, + lastIndex: clippedLastIndex, + isStart: firstIndex === clippedFirstIndex, + isEnd: lastIndex === clippedLastIndex + }; + } + else { + return null; + } + }; + // Given a date, returns its chronolocial cell-index from the first cell of the grid. + // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets. + // If before the first offset, returns a negative number. + // If after the last offset, returns an offset past the last cell offset. + // Only works for *start* dates of cells. Will not work for exclusive end dates for cells. + DaySeries.prototype.getDateDayIndex = function (date) { + var indices = this.indices; + var dayOffset = Math.floor(diffDays(this.dates[0], date)); + if (dayOffset < 0) { + return indices[0] - 1; + } + else if (dayOffset >= indices.length) { + return indices[indices.length - 1] + 1; + } + else { + return indices[dayOffset]; + } + }; + return DaySeries; + }()); + + var DayTable = /** @class */ (function () { + function DayTable(daySeries, breakOnWeeks) { + var dates = daySeries.dates; + var daysPerRow; + var firstDay; + var rowCnt; + if (breakOnWeeks) { + // count columns until the day-of-week repeats + firstDay = dates[0].getUTCDay(); + for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) { + if (dates[daysPerRow].getUTCDay() === firstDay) { + break; + } + } + rowCnt = Math.ceil(dates.length / daysPerRow); + } + else { + rowCnt = 1; + daysPerRow = dates.length; + } + this.rowCnt = rowCnt; + this.colCnt = daysPerRow; + this.daySeries = daySeries; + this.cells = this.buildCells(); + this.headerDates = this.buildHeaderDates(); + } + DayTable.prototype.buildCells = function () { + var rows = []; + for (var row = 0; row < this.rowCnt; row++) { + var cells = []; + for (var col = 0; col < this.colCnt; col++) { + cells.push(this.buildCell(row, col)); + } + rows.push(cells); + } + return rows; + }; + DayTable.prototype.buildCell = function (row, col) { + return { + date: this.daySeries.dates[row * this.colCnt + col] + }; + }; + DayTable.prototype.buildHeaderDates = function () { + var dates = []; + for (var col = 0; col < this.colCnt; col++) { + dates.push(this.cells[0][col].date); + } + return dates; + }; + DayTable.prototype.sliceRange = function (range) { + var colCnt = this.colCnt; + var seriesSeg = this.daySeries.sliceRange(range); + var segs = []; + if (seriesSeg) { + var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex; + var index = firstIndex; + while (index <= lastIndex) { + var row = Math.floor(index / colCnt); + var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1); + segs.push({ + row: row, + firstCol: index % colCnt, + lastCol: (nextIndex - 1) % colCnt, + isStart: seriesSeg.isStart && index === firstIndex, + isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex + }); + index = nextIndex; + } + } + return segs; + }; + return DayTable; + }()); + + var Slicer = /** @class */ (function () { + function Slicer() { + this.sliceBusinessHours = memoize(this._sliceBusinessHours); + this.sliceDateSelection = memoize(this._sliceDateSpan); + this.sliceEventStore = memoize(this._sliceEventStore); + this.sliceEventDrag = memoize(this._sliceInteraction); + this.sliceEventResize = memoize(this._sliceInteraction); + } + Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, component) { + var extraArgs = []; + for (var _i = 4; _i < arguments.length; _i++) { + extraArgs[_i - 4] = arguments[_i]; + } + var eventUiBases = props.eventUiBases; + var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)); + return { + dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)), + businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, component].concat(extraArgs)), + fgEventSegs: eventSegs.fg, + bgEventSegs: eventSegs.bg, + eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)), + eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)), + eventSelection: props.eventSelection + }; // TODO: give interactionSegs? + }; + Slicer.prototype.sliceNowDate = function (// does not memoize + date, component) { + var extraArgs = []; + for (var _i = 2; _i < arguments.length; _i++) { + extraArgs[_i - 2] = arguments[_i]; + } + return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false }, + {}, + component].concat(extraArgs)); + }; + Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, component) { + var extraArgs = []; + for (var _i = 4; _i < arguments.length; _i++) { + extraArgs[_i - 4] = arguments[_i]; + } + if (!businessHours) { + return []; + } + return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), component.calendar), + {}, + dateProfile, + nextDayThreshold, + component].concat(extraArgs)).bg; + }; + Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) { + var extraArgs = []; + for (var _i = 5; _i < arguments.length; _i++) { + extraArgs[_i - 5] = arguments[_i]; + } + if (eventStore) { + var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); + return { + bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs), + fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs) + }; + } + else { + return { bg: [], fg: [] }; + } + }; + Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) { + var extraArgs = []; + for (var _i = 5; _i < arguments.length; _i++) { + extraArgs[_i - 5] = arguments[_i]; + } + if (!interaction) { + return null; + } + var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); + return { + segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs), + affectedInstances: interaction.affectedEvents.instances, + isEvent: interaction.isEvent, + sourceSeg: interaction.origSeg + }; + }; + Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) { + var extraArgs = []; + for (var _i = 3; _i < arguments.length; _i++) { + extraArgs[_i - 3] = arguments[_i]; + } + if (!dateSpan) { + return []; + } + var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.calendar); + var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs)); + for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) { + var seg = segs_1[_a]; + seg.component = component; + seg.eventRange = eventRange; + } + return segs; + }; + /* + "complete" seg means it has component and eventRange + */ + Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill + extraArgs) { + var segs = []; + for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { + var eventRange = eventRanges_1[_i]; + segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs)); + } + return segs; + }; + /* + "complete" seg means it has component and eventRange + */ + Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill + extraArgs) { + var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs)); + for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { + var seg = segs_2[_i]; + seg.component = component; + seg.eventRange = eventRange; + seg.isStart = eventRange.isStart && seg.isStart; + seg.isEnd = eventRange.isEnd && seg.isEnd; + } + return segs; + }; + return Slicer; + }()); + /* + for incorporating minTime/maxTime if appropriate + TODO: should be part of DateProfile! + TimelineDateProfile already does this btw + */ + function computeActiveRange(dateProfile, isComponentAllDay) { + var range = dateProfile.activeRange; + if (isComponentAllDay) { + return range; + } + return { + start: addMs(range.start, dateProfile.minTime.milliseconds), + end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day + }; + } + + // exports + // -------------------------------------------------------------------------------------------------- + var version = '4.3.1'; + + exports.Calendar = Calendar; + exports.Component = Component; + exports.DateComponent = DateComponent; + exports.DateEnv = DateEnv; + exports.DateProfileGenerator = DateProfileGenerator; + exports.DayHeader = DayHeader; + exports.DaySeries = DaySeries; + exports.DayTable = DayTable; + exports.ElementDragging = ElementDragging; + exports.ElementScrollController = ElementScrollController; + exports.EmitterMixin = EmitterMixin; + exports.EventApi = EventApi; + exports.FgEventRenderer = FgEventRenderer; + exports.FillRenderer = FillRenderer; + exports.Interaction = Interaction; + exports.Mixin = Mixin; + exports.NamedTimeZoneImpl = NamedTimeZoneImpl; + exports.PositionCache = PositionCache; + exports.ScrollComponent = ScrollComponent; + exports.ScrollController = ScrollController; + exports.Slicer = Slicer; + exports.Splitter = Splitter; + exports.Theme = Theme; + exports.View = View; + exports.WindowScrollController = WindowScrollController; + exports.addDays = addDays; + exports.addDurations = addDurations; + exports.addMs = addMs; + exports.addWeeks = addWeeks; + exports.allowContextMenu = allowContextMenu; + exports.allowSelection = allowSelection; + exports.appendToElement = appendToElement; + exports.applyAll = applyAll; + exports.applyMutationToEventStore = applyMutationToEventStore; + exports.applyStyle = applyStyle; + exports.applyStyleProp = applyStyleProp; + exports.asRoughMinutes = asRoughMinutes; + exports.asRoughMs = asRoughMs; + exports.asRoughSeconds = asRoughSeconds; + exports.buildGotoAnchorHtml = buildGotoAnchorHtml; + exports.buildSegCompareObj = buildSegCompareObj; + exports.capitaliseFirstLetter = capitaliseFirstLetter; + exports.combineEventUis = combineEventUis; + exports.compareByFieldSpec = compareByFieldSpec; + exports.compareByFieldSpecs = compareByFieldSpecs; + exports.compareNumbers = compareNumbers; + exports.compensateScroll = compensateScroll; + exports.computeClippingRect = computeClippingRect; + exports.computeEdges = computeEdges; + exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat; + exports.computeHeightAndMargins = computeHeightAndMargins; + exports.computeInnerRect = computeInnerRect; + exports.computeRect = computeRect; + exports.computeVisibleDayRange = computeVisibleDayRange; + exports.config = config; + exports.constrainPoint = constrainPoint; + exports.createDuration = createDuration; + exports.createElement = createElement; + exports.createEmptyEventStore = createEmptyEventStore; + exports.createEventInstance = createEventInstance; + exports.createFormatter = createFormatter; + exports.createPlugin = createPlugin; + exports.cssToStr = cssToStr; + exports.debounce = debounce; + exports.diffDates = diffDates; + exports.diffDayAndTime = diffDayAndTime; + exports.diffDays = diffDays; + exports.diffPoints = diffPoints; + exports.diffWeeks = diffWeeks; + exports.diffWholeDays = diffWholeDays; + exports.diffWholeWeeks = diffWholeWeeks; + exports.disableCursor = disableCursor; + exports.distributeHeight = distributeHeight; + exports.elementClosest = elementClosest; + exports.elementMatches = elementMatches; + exports.enableCursor = enableCursor; + exports.eventTupleToStore = eventTupleToStore; + exports.filterEventStoreDefs = filterEventStoreDefs; + exports.filterHash = filterHash; + exports.findChildren = findChildren; + exports.findElements = findElements; + exports.flexibleCompare = flexibleCompare; + exports.forceClassName = forceClassName; + exports.formatDate = formatDate; + exports.formatIsoTimeString = formatIsoTimeString; + exports.formatRange = formatRange; + exports.getAllDayHtml = getAllDayHtml; + exports.getClippingParents = getClippingParents; + exports.getDayClasses = getDayClasses; + exports.getElSeg = getElSeg; + exports.getRectCenter = getRectCenter; + exports.getRelevantEvents = getRelevantEvents; + exports.globalDefaults = globalDefaults; + exports.greatestDurationDenominator = greatestDurationDenominator; + exports.hasBgRendering = hasBgRendering; + exports.htmlEscape = htmlEscape; + exports.htmlToElement = htmlToElement; + exports.insertAfterElement = insertAfterElement; + exports.interactionSettingsStore = interactionSettingsStore; + exports.interactionSettingsToStore = interactionSettingsToStore; + exports.intersectRanges = intersectRanges; + exports.intersectRects = intersectRects; + exports.isArraysEqual = isArraysEqual; + exports.isDateSpansEqual = isDateSpansEqual; + exports.isInt = isInt; + exports.isInteractionValid = isInteractionValid; + exports.isMultiDayRange = isMultiDayRange; + exports.isPropsEqual = isPropsEqual; + exports.isPropsValid = isPropsValid; + exports.isSingleDay = isSingleDay; + exports.isValidDate = isValidDate; + exports.listenBySelector = listenBySelector; + exports.mapHash = mapHash; + exports.matchCellWidths = matchCellWidths; + exports.memoize = memoize; + exports.memoizeOutput = memoizeOutput; + exports.memoizeRendering = memoizeRendering; + exports.mergeEventStores = mergeEventStores; + exports.multiplyDuration = multiplyDuration; + exports.padStart = padStart; + exports.parseBusinessHours = parseBusinessHours; + exports.parseDragMeta = parseDragMeta; + exports.parseEventDef = parseEventDef; + exports.parseFieldSpecs = parseFieldSpecs; + exports.parseMarker = parse; + exports.pointInsideRect = pointInsideRect; + exports.prependToElement = prependToElement; + exports.preventContextMenu = preventContextMenu; + exports.preventDefault = preventDefault; + exports.preventSelection = preventSelection; + exports.processScopedUiProps = processScopedUiProps; + exports.rangeContainsMarker = rangeContainsMarker; + exports.rangeContainsRange = rangeContainsRange; + exports.rangesEqual = rangesEqual; + exports.rangesIntersect = rangesIntersect; + exports.refineProps = refineProps; + exports.removeElement = removeElement; + exports.removeExact = removeExact; + exports.renderDateCell = renderDateCell; + exports.requestJson = requestJson; + exports.sliceEventStore = sliceEventStore; + exports.startOfDay = startOfDay; + exports.subtractInnerElHeight = subtractInnerElHeight; + exports.translateRect = translateRect; + exports.uncompensateScroll = uncompensateScroll; + exports.undistributeHeight = undistributeHeight; + exports.unpromisify = unpromisify; + exports.version = version; + exports.whenTransitionDone = whenTransitionDone; + exports.wholeDivideDurations = wholeDivideDurations; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/main.min.css b/src/main/resources/static/assets/libs/fullcalendar/core/main.min.css new file mode 100644 index 0000000..8948b53 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/main.min.css @@ -0,0 +1 @@ +@charset "UTF-8";.fc-button:not(:disabled),.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a.fc-more,a[data-goto]{cursor:pointer}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:2px 4px}.fc-rtl .fc-popover .fc-header{flex-direction:row-reverse}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{opacity:.65;font-size:1.1em}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-bg,.fc-bgevent-skeleton,.fc-highlight-skeleton,.fc-mirror-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-mirror-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-mirror-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-mirror-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-mirror-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.4;border-radius:3px;border:1px solid #3788d8}.fc-event,.fc-event-dot{background-color:#3788d8}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-event.fc-dragging.fc-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event.fc-dragging:not(.fc-selected){opacity:.75}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-mirror-skeleton tr:first-child>td>.fc-day-grid-event{margin-top:0}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-button,.fc-icon{display:inline-block;font-weight:400;text-align:center}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,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") format("truetype");font-weight:400;font-style:normal}.fc-icon{font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:1em;height:1em}.fc-icon-chevron-left:before{content:""}.fc-icon-chevron-right:before{content:""}.fc-icon-chevrons-left:before{content:""}.fc-icon-chevrons-right:before{content:""}.fc-icon-minus-square:before{content:""}.fc-icon-plus-square:before{content:""}.fc-icon-x:before{content:""}.fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc-button::-moz-focus-inner{padding:0;border-style:none}.fc-button{-webkit-appearance:button;color:#212529;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc-button:hover{color:#212529;text-decoration:none}.fc-button:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(44,62,80,.25);box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc-button:disabled{opacity:.65}.fc-button-primary{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.fc-button-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:disabled{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:not(:disabled).fc-button-active,.fc-button-primary:not(:disabled):active{color:#fff;background-color:#1a252f;border-color:#151e27}.fc-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc-button-group{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.fc-button-group>.fc-button{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus,.fc-button-group>.fc-button:hover{z-index:1}.fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-toolbar h2{font-size:1.75em;margin:0}.fc-view-container{position:relative}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}@media print{.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-highlight-container,.fc-highlight-skeleton,.fc-mirror-container,.fc-mirror-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-popover,.fc-timeGrid-view .fc-axis{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}} \ No newline at end of file diff --git a/src/main/resources/static/assets/libs/fullcalendar/core/main.min.js b/src/main/resources/static/assets/libs/fullcalendar/core/main.min.js new file mode 100644 index 0000000..6b72fff --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/core/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Core Package v4.3.1 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).FullCalendar={})}(this,function(e){"use strict";var t={className:!0,colSpan:!0,rowSpan:!0},n={"
");document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return c(e),t}()),S}function D(e){return e=Math.max(0,e),e=Math.round(e)}function T(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,o=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=D(e.offsetWidth-e.clientWidth-r-i),u={borderLeft:r,borderRight:i,borderTop:o,borderBottom:a,scrollbarBottom:D(e.offsetHeight-e.clientHeight-o-a),scrollbarLeft:0,scrollbarRight:0};return b()&&"rtl"===n.direction?u.scrollbarLeft=s:u.scrollbarRight=s,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function w(e,t){void 0===t&&(t=!1);var n=R(e),r=T(e,t),i={left:n.left+r.borderLeft+r.scrollbarLeft,right:n.right-r.borderRight-r.scrollbarRight,top:n.top+r.borderTop,bottom:n.bottom-r.borderBottom-r.scrollbarBottom};return t&&(i.left+=r.paddingLeft,i.right-=r.paddingRight,i.top+=r.paddingTop,i.bottom-=r.paddingBottom),i}function R(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function I(e){return e.getBoundingClientRect().height+C(e)}function C(e){var t=window.getComputedStyle(e);return parseInt(t.marginTop,10)+parseInt(t.marginBottom,10)}function M(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function k(e){e.preventDefault()}function O(e,t,n,r){function i(e){var t=p(e.target,n);t&&r.call(t,e,t)}return e.addEventListener(t,i),function(){e.removeEventListener(t,i)}}var _=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];var P=["sun","mon","tue","wed","thu","fri","sat"];function x(e,t){var n=Z(e);return n[2]+=t,j(n)}function H(e,t){var n=Z(e);return n[6]+=t,j(n)}function N(e,t){return(t.valueOf()-e.valueOf())/864e5}function z(e,t){var n=B(e),r=B(t);return{years:0,months:0,days:Math.round(N(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function U(e,t){var n=L(e,t);return null!==n&&n%7==0?n/7:null}function L(e,t){return q(e)===q(t)?Math.round(N(e,t)):null}function B(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function V(e,t,n,r){var i=j([t,0,1+A(t,n,r)]),o=B(e),a=Math.round(N(i,o));return Math.floor(a/7)+1}function A(e,t,n){var r=7+t-n;return-((7+j([e,0,r]).getUTCDay()-t)%7)+r-1}function F(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function W(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function Z(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function j(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC.apply(Date,e))}function Y(e){return!isNaN(e.valueOf())}function q(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}var G=["years","months","days","milliseconds"],X=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function J(e,t){var n;return"string"==typeof e?function(e){var t=X.exec(e);if(t){var n=t[1]?-1:1;return{years:0,months:0,days:n*(t[2]?parseInt(t[2],10):0),milliseconds:n*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?K(e):"number"==typeof e?K(((n={})[t||"milliseconds"]=e,n)):null}function K(e){return{years:e.years||e.year||0,months:e.months||e.month||0,days:(e.days||e.day||0)+7*Q(e),milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)}}function Q(e){return e.weeks||e.week||0}function $(e,t){return e.years===t.years&&e.months===t.months&&e.days===t.days&&e.milliseconds===t.milliseconds}function ee(e){return te(e)/864e5}function te(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function ne(e,t){var n=e.milliseconds;if(n){if(n%1e3!=0)return{unit:"millisecond",value:n};if(n%6e4!=0)return{unit:"second",value:n/1e3};if(n%36e5!=0)return{unit:"minute",value:n/6e4};if(n)return{unit:"hour",value:n/36e5}}return e.days?t||e.days%7!=0?{unit:"day",value:e.days}:{unit:"week",value:e.days/7}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}function re(e){e.forEach(function(e){e.style.height=""})}function ie(e){var t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;t=te(t)&&(r=x(r,1))}return e.start&&(n=B(e.start),r&&r<=n&&(r=x(n,1))),{start:n,end:r}}function ye(e,t,n,r){return"year"===r?J(n.diffWholeYears(e,t),"year"):"month"===r?J(n.diffWholeMonths(e,t),"month"):z(e,t)}var me=function(e,t){return(me=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function Ee(e,t){function n(){this.constructor=e}me(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var Se=function(){return(Se=Object.assign||function(e){for(var t,n=1,r=arguments.length;n=0;o--)if("object"==typeof(a=e[o][r])&&a)i.unshift(a);else if(void 0!==a){u[r]=a;break}i.length&&(u[r]=Te(i))}for(n=e.length-1;n>=0;n--)for(r in s=e[n])r in u||(u[r]=s[r]);return u}function we(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Re(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Ie(e){for(var t={},n=0,r=e;no&&i.push({start:o,end:r.start}),r.end>o&&(o=r.end);return ot.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Ze(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t1)||"numeric"!==r.year&&"2-digit"!==r.year||"numeric"!==r.month&&"2-digit"!==r.month||"numeric"!==r.day&&"2-digit"!==r.day||(a=1);var s=this.format(e,n),u=this.format(t,n);if(s===u)return s;var l=nt(function(e,t){var n={};for(var r in e)r in Xe&&!(Xe[r]<=t)||(n[r]=e[r]);return n}(r,a),i,n),c=l(e),d=l(t),f=function(e,t,n,r){var i=0;for(;i/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function _t(e){var t=[];for(var n in e){var r=e[n];null!=r&&""!==r&&t.push(n+":"+r)}return t.join(";")}function Pt(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}var xt={editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:null,overlap:null,allow:null,className:Pt,classNames:Pt,color:String,backgroundColor:String,borderColor:String,textColor:String};function Ht(e,t,n){var r=he(e,xt,{},n),i=function(e,t){return Array.isArray(e)?ke(e,"",t,!0):"object"==typeof e&&e?ke([e],"",t,!0):null!=e?String(e):null}(r.constraint,t);return{startEditable:null!=r.startEditable?r.startEditable:r.editable,durationEditable:null!=r.durationEditable?r.durationEditable:r.editable,constraints:null!=i?[i]:[],overlap:r.overlap,allows:null!=r.allow?[r.allow]:[],backgroundColor:r.backgroundColor||r.color,borderColor:r.borderColor||r.color,textColor:r.textColor,classNames:r.classNames.concat(r.className)}}function Nt(e,t,n,r){var i={},o={};for(var a in xt){var s=e+ue(a);i[a]=t[s],o[s]=!0}if("event"===e&&(i.editable=t.editable),r)for(var a in t)o[a]||(r[a]=t[a]);return Ht(i,n)}var zt={startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function Ut(e){return e.reduce(Lt,zt)}function Lt(e,t){return{startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}var Bt={id:String,groupId:String,title:String,url:String,rendering:String,extendedProps:null},Vt={start:null,date:null,end:null,allDay:null},At=0;function Ft(e,t,n,r){var i=function(e,t){var n=null;if(e){var r=t.state.eventSources[e];n=r.allDayDefault}null==n&&(n=t.opt("allDayDefault"));return n}(t,n),o={},a=function(e,t,n,r,i){for(var o=0;o'+r+"
":""+r+""}function Qt(e,t,n,r){var i,o,a=n.calendar,s=n.view,u=n.theme,l=n.dateEnv,c=[];return Ze(t.activeRange,e)?(c.push("fc-"+P[e.getUTCDay()]),s.opt("monthMode")&&l.getMonth(e)!==l.getMonth(t.currentRange.start)&&c.push("fc-other-month"),o=x(i=B(a.getNow()),1),e=o?c.push("fc-future"):(c.push("fc-today"),!0!==r&&c.push(u.getClass("today")))):c.push("fc-disabled-day"),c}function $t(e,t,n){var r=!1,i=function(){r||(r=!0,t.apply(this,arguments))},o=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(i,o);a&&"function"==typeof a.then&&a.then(i,o)}var en=function(){function e(){}return e.mixInto=function(e){this.mixIntoObj(e.prototype)},e.mixIntoObj=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){e[n]||(e[n]=t.prototype[n])})},e.mixOver=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){e.prototype[n]=t.prototype[n]})},e}(),tn=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t.prototype.on=function(e,t){return nn(this._handlers||(this._handlers={}),e,t),this},t.prototype.one=function(e,t){return nn(this._oneHandlers||(this._oneHandlers={}),e,t),this},t.prototype.off=function(e,t){return this._handlers&&rn(this._handlers,e,t),this._oneHandlers&&rn(this._oneHandlers,e,t),this},t.prototype.trigger=function(e){for(var t=[],n=1;n=n[t]&&e=n[t]&&e0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()0},e.prototype.canScrollRight=function(){return this.getScrollLeft()=200&&a.status<400)try{var e=JSON.parse(a.responseText);r(e,a)}catch(e){i("Failure parsing JSON",a)}else i("Request failed",a)},a.onerror=function(){i("Request failed",a)},a.send(o)}function Sn(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}var bn=vn({eventSourceDefs:[{parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam}},fetch:function(e,t,n){var r=e.eventSource.meta,i=function(e,t,n){var r,i,o,a,s=n.dateEnv,u={};null==(r=e.startParam)&&(r=n.opt("startParam"));null==(i=e.endParam)&&(i=n.opt("endParam"));null==(o=e.timeZoneParam)&&(o=n.opt("timeZoneParam"));a="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Se(u,a),u[r]=s.formatIso(t.start),u[i]=s.formatIso(t.end),"local"!==s.timeZone&&(u[o]=s.timeZone);return u}(r,e.range,e.calendar);En(r.method,r.url,i,function(e,n){t({rawEvents:e,xhr:n})},function(e,t){n({message:e,xhr:t})})}}]});var Dn=vn({recurringTypes:[{parse:function(e,t,n){var r,i,o=n.createMarker.bind(n),a=he(e,{daysOfWeek:null,startTime:J,endTime:J,startRecur:o,endRecur:o},{},t),s=!1;for(var u in a)if(null!=a[u]){s=!0;break}if(s){var l=null;return"duration"in t&&(l=J(t.duration),delete t.duration),!l&&a.startTime&&a.endTime&&(r=a.endTime,i=a.startTime,l={years:r.years-i.years,months:r.months-i.months,days:r.days-i.days,milliseconds:r.milliseconds-i.milliseconds}),{allDayGuess:Boolean(!a.startTime&&!a.endTime),duration:l,typeData:a}}return null},expand:function(e,t,n){var r=Ve(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){var i=e?Ie(e):null,o=B(n.start),a=n.end,s=[];for(;o0?e[0].code:"en",n=window.FullCalendarLocalesAll||[],r=window.FullCalendarLocales||{},i=n.concat(Ce(r),e),o={en:kn},a=0,s=i;a0;i--){var o=r.slice(0,i).join("-");if(t[o])return t[o]}return null}(n,t)||kn;return Pn(e,n,r)}(e,t):Pn(e.code,[e.code],e)}function Pn(e,t,n){var r=Te([kn,n],["buttonText"]);delete r.code;var i=r.week;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}var xn=function(){function e(e){this.overrides=Se({},e),this.dynamicOverrides={},this.compute()}return e.prototype.mutate=function(e,t,n){var r=n?this.dynamicOverrides:this.overrides;Se(r,e);for(var i=0,o=t;i=1?Math.min(i,o):i}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=H(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),function(e,t,n){void 0===n&&(n=!1);var r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",at(t,!0)))),r}(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?j(F(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?j(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-W(Z(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(Z(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?W(Z(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(Z(e))*60):new Date(e.valueOf()-(t||0))},e}(),Vn={id:String,allDayDefault:Boolean,eventDataTransform:Function,success:Function,failure:Function},An=0;function Fn(e,t){return!t.pluginSystem.hooks.eventSourceDefs[e.sourceDefId].ignoreRange}function Wn(e,t){for(var n=t.pluginSystem.hooks.eventSourceDefs,r=n.length-1;r>=0;r--){var i=n[r].parseMeta(e);if(i){var o=Zn("object"==typeof e?e:{},i,r,t);return o._raw=e,o}}return null}function Zn(e,t,n,r){var i={},o=he(e,Vn,{},i),a={},s=Ht(i,r,a);return o.isFetching=!1,o.latestFetchId="",o.fetchRange=null,o.publicId=String(e.id||""),o.sourceId=String(An++),o.sourceDefId=n,o.meta=t,o.ui=s,o.extendedProps=a,o}function jn(e,t,n,r){switch(t.type){case"ADD_EVENT_SOURCES":return function(e,t,n,r){for(var i={},o=0,a=t;oe.fetchRange.end:!e.latestFetchId}(e,t,n)}),t,n)}function Gn(e,t,n,r){var i={};for(var o in e){var a=e[o];t[o]?i[o]=Xn(a,n,r):i[o]=a}return i}function Xn(e,t,n){var r=n.pluginSystem.hooks.eventSourceDefs[e.sourceDefId],i=String(Yn++);return r.fetch({eventSource:e,calendar:n,range:t},function(r){var o,a,s=r.rawEvents,u=n.opt("eventSourceSuccess");e.success&&(a=e.success(s,r.xhr)),u&&(o=u(s,r.xhr)),s=a||o||s,n.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:i,fetchRange:t,rawEvents:s})},function(r){var o=n.opt("eventSourceFailure");console.warn(r.message,r),e.failure&&e.failure(r),o&&o(r),n.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:i,fetchRange:t,error:r})}),Se({},e,{isFetching:!0,latestFetchId:i})}var Jn=function(){function e(e,t){this.viewSpec=e,this.options=e.options,this.dateEnv=t.dateEnv,this.calendar=t,this.initHiddenDays()}return e.prototype.buildPrev=function(e,t){var n=this.dateEnv,r=n.subtract(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,-1)},e.prototype.buildNext=function(e,t){var n=this.dateEnv,r=n.add(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,1)},e.prototype.build=function(e,t,n){var r;void 0===n&&(n=!1);var i,o,a,s,u,l,c,d,f;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(f=r).start&&d=f.end?new Date(f.end.valueOf()-1):d),a=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(a.unit),u=this.buildRenderRange(this.trimHiddenDays(a.range),a.unit,s),l=u=this.trimHiddenDays(u),this.options.showNonCurrentDates||(l=Ve(l,a.range)),i=J(this.options.minTime),o=J(this.options.maxTime),l=Ve(l=this.adjustActiveRange(l,i,o),r),c=Fe(a.range,r),{validRange:r,currentRange:a.range,currentRangeUnit:a.unit,isRangeAllDay:s,activeRange:l,renderRange:u,minTime:i,maxTime:o,isValid:c,dateIncrement:this.buildDateIncrement(a.duration)}},e.prototype.buildValidRange=function(){return this.getRangeOption("validRange",this.calendar.getNow())||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.viewSpec,i=this.dateEnv,o=null,a=null,s=null;return r.duration?(o=r.duration,a=r.durationUnit,s=this.buildRangeFromDuration(e,t,o,a)):(n=this.options.dayCount)?(a="day",s=this.buildRangeFromDayCount(e,t,n)):(s=this.buildCustomVisibleRange(e))?a=i.greatestWholeUnit(s.start,s.end).unit:(a=ne(o=this.getFallbackDuration()).unit,s=this.buildRangeFromDuration(e,t,o,a)),{duration:o,unit:a,range:s}},e.prototype.getFallbackDuration=function(){return J({day:1})},e.prototype.adjustActiveRange=function(e,t,n){var r=this.dateEnv,i=e.start,o=e.end;return this.viewSpec.class.prototype.usesMinMaxTime&&(ee(t)<0&&(i=B(i),i=r.add(i,t)),ee(n)>1&&(o=x(o=B(o),-1),o=r.add(o,n))),{start:i,end:o}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var i,o,a,s,u,l=this.dateEnv,c=this.options.dateAlignment;function d(){a=l.startOf(e,c),s=l.add(a,n),u={start:a,end:s}}return c||((i=this.options.dateIncrement)?(o=J(i),c=te(o) ")),h=!1):((r=d[e])?(c=function(e){r.click&&r.click.call(E,e)},(v=o.getCustomButtonIconClass(r))||(v=o.getIconClass(e))||(g=r.text)):(s=l[e])?(n.viewsWithButtons.push(e),c=function(){a.changeView(e)},(g=s.buttonTextOverride)||(v=o.getIconClass(e))||(g=s.buttonTextDefault)):a[e]&&(c=function(){a[e]()},(g=f[e])||(v=o.getIconClass(e))||(g=p[e])),c&&(m=["fc-"+e+"-button",o.getClass("button")],g?(y=Ot(g),S=""):v&&(y="",S=' aria-label="'+e+'"'),(E=i('")).addEventListener("click",c),u.push(E)))}),u.length>1){r=document.createElement("div");var v=o.getClass("buttonGroup");h&&v&&r.classList.add(v),s(r,u),c.appendChild(r)}else s(c,u)}),c},t.prototype.updateToday=function(e){this.toggleButtonEnabled("today",e)},t.prototype.updatePrev=function(e){this.toggleButtonEnabled("prev",e)},t.prototype.updateNext=function(e){this.toggleButtonEnabled("next",e)},t.prototype.updateTitle=function(e){v(this.el,"h2").forEach(function(t){t.innerText=e})},t.prototype.updateActiveButton=function(e){var t=this.theme.getClass("buttonActive");v(this.el,"button").forEach(function(n){e&&n.classList.contains("fc-"+e+"-button")?n.classList.add(t):n.classList.remove(t)})},t.prototype.toggleButtonEnabled=function(e,t){v(this.el,".fc-"+e+"-button").forEach(function(e){e.disabled=!t})},t}(fn),hr=function(e){function t(t,n){var i=e.call(this,t)||this;i._renderToolbars=qt(i.renderToolbars),i.buildViewPropTransformers=Ye(gr),i.el=n,u(n,i.contentEl=r("div",{className:"fc-view-container"}));for(var o=i.calendar,a=0,s=o.pluginSystem.hooks.viewContainerModifiers;a1?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}(e),t.titleRangeSeparator),{isEndExclusive:e.isRangeAllDay})}function gr(e){return e.map(function(e){return new e})}var yr=function(){function e(e){this.component=e.component}return e.prototype.destroy=function(){},e}();var mr={},Er=function(e){function t(t){var n=e.call(this,t)||this;n.handleSegClick=function(e,t){var r=n.component,i=ht(t);if(i&&r.isValidSegDownEl(e.target)){var o=p(e.target,".fc-has-url"),a=o?o.querySelector("a[href]").href:"";r.publiclyTrigger("eventClick",[{el:t,event:new ct(r.calendar,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:r.view}]),a&&!e.defaultPrevented&&(window.location.href=a)}};var r=t.component;return n.destroy=O(r.el,"click",r.fgSegSelector+","+r.bgSegSelector,n.handleSegClick),n}return Ee(t,e),t}(yr),Sr=function(e){function t(t){var n=e.call(this,t)||this;n.handleEventElRemove=function(e){e===n.currentSegEl&&n.handleSegLeave(null,n.currentSegEl)},n.handleSegEnter=function(e,t){ht(t)&&(t.classList.add("fc-allow-mouse-resize"),n.currentSegEl=t,n.triggerEvent("eventMouseEnter",e,t))},n.handleSegLeave=function(e,t){n.currentSegEl&&(t.classList.remove("fc-allow-mouse-resize"),n.currentSegEl=null,n.triggerEvent("eventMouseLeave",e,t))};var r,i,o,a,s,u=t.component;return n.removeHoverListeners=(r=u.el,i=u.fgSegSelector+","+u.bgSegSelector,o=n.handleSegEnter,a=n.handleSegLeave,O(r,"mouseover",i,function(e,t){if(t!==s){s=t,o(e,t);var n=function(e){s=null,a(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}})),u.calendar.on("eventElRemove",n.handleEventElRemove),n}return Ee(t,e),t.prototype.destroy=function(){this.removeHoverListeners(),this.component.calendar.off("eventElRemove",this.handleEventElRemove)},t.prototype.triggerEvent=function(e,t,n){var r=this.component,i=ht(n);t&&!r.isValidSegDownEl(t.target)||r.publiclyTrigger(e,[{el:n,event:new ct(this.component.calendar,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:r.view}])},t}(yr),br=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t}(cn);br.prototype.classes={widget:"fc-unthemed",widgetHeader:"fc-widget-header",widgetContent:"fc-widget-content",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active",popoverHeader:"fc-widget-header",popoverContent:"fc-widget-content",headerRow:"fc-widget-header",dayRow:"fc-widget-content",listView:"fc-widget-content"},br.prototype.baseIconClass="fc-icon",br.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},br.prototype.iconOverrideOption="buttonIcons",br.prototype.iconOverrideCustomButtonOption="icon",br.prototype.iconOverridePrefix="fc-icon-";var Dr=function(){function e(e,t){var n=this;this.parseRawLocales=Ye(On),this.buildLocale=Ye(_n),this.buildDateEnv=Ye(Tr),this.buildTheme=Ye(wr),this.buildEventUiSingleBase=Ye(this._buildEventUiSingleBase),this.buildSelectionConfig=Ye(this._buildSelectionConfig),this.buildEventUiBySource=qe(Ir,Me),this.buildEventUiBases=Ye(Cr),this.interactionsStore={},this.actionQueue=[],this.isReducing=!1,this.needsRerender=!1,this.needsFullRerender=!1,this.isRendering=!1,this.renderingPauseDepth=0,this.buildDelayedRerender=Ye(Rr),this.afterSizingTriggers={},this.isViewUpdated=!1,this.isDatesUpdated=!1,this.isEventsUpdated=!1,this.el=e,this.optionsManager=new xn(t||{}),this.pluginSystem=new gn,this.addPluginInputs(this.optionsManager.computed.plugins||[]),this.handleOptions(this.optionsManager.computed),this.publiclyTrigger("_init"),this.hydrate(),this.calendarInteractions=this.pluginSystem.hooks.calendarInteractions.map(function(e){return new e(n)})}return e.prototype.addPluginInputs=function(e){for(var t=function(e){for(var t=[],n=0,r=e;n"},e.prototype.detachSegs=function(e,t){var n=this.containerElsByType[e];n&&(n.forEach(c),delete this.containerElsByType[e])},e.prototype.computeSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.computeSegSizes(this.segsByType[t])},e.prototype.assignSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.assignSegSizes(this.segsByType[t]);this.dirtySizeFlags={}},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e}(),Pr=function(e){this.timeZoneName=e},xr=function(){function e(e){this.emitter=new tn}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}();function Hr(e){var t=_n(e.locale||"en",On([]).map);return e=Se({timeZone:Rn.timeZone,calendarSystem:"gregory"},e,{locale:t}),new Bn(e)}var Nr={startTime:J,duration:J,create:Boolean,sourceId:String},zr={create:!0};function Ur(e,t){return!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"}}function Lr(e,t,n,r,i,o,a,s){var u,l=o.view,c=o.dateEnv,d=o.theme,f=o.options,p=Ze(t.activeRange,e),h=["fc-day-header",d.getClass("widgetHeader")];return u="function"==typeof f.columnHeaderHtml?f.columnHeaderHtml(c.toDate(e)):"function"==typeof f.columnHeaderText?Ot(f.columnHeaderText(c.toDate(e))):Ot(c.format(e,i)),n?h=h.concat(Qt(e,t,o,!0)):h.push("fc-"+P[e.getUTCDay()]),'1?' colspan="'+a+'"':"")+(s?" "+s:"")+">"+(p?Kt(l,{date:e,forceOff:!n||1===r},u):u)+""}var Br=function(e){function t(t,n){var r=e.call(this,t)||this;return n.innerHTML="",n.appendChild(r.el=i('
')),r.thead=r.el.querySelector("thead"),r}return Ee(t,e),t.prototype.destroy=function(){c(this.el)},t.prototype.render=function(e){var t=e.dates,n=e.datesRepDistinctDays,r=[];e.renderIntroHtml&&r.push(e.renderIntroHtml());for(var i=ot(this.opt("columnHeaderFormat")||Ur(n,t.length)),o=0,a=t;o"+r.join("")+""},t}(fn),Vr=function(){function e(e,t){for(var n=e.start,r=e.end,i=[],o=[],a=-1;n=t.length?t[t.length-1]+1:t[n]},e}(),Ar=function(){function e(e,t){var n,r,i,o=e.dates;if(t){for(r=o[0].getUTCDay(),n=1;n1},e.isPropsEqual=Me,e.isPropsValid=Rt,e.isSingleDay=function(e){return 0===e.years&&0===e.months&&1===e.days&&0===e.milliseconds},e.isValidDate=Y,e.listenBySelector=O,e.mapHash=Re,e.matchCellWidths=function(e){var t=0;return e.forEach(function(e){var n=e.firstChild;if(n instanceof HTMLElement){var r=n.getBoundingClientRect().width;r>t&&(t=r)}}),t++,e.forEach(function(e){e.style.width=t+"px"}),t},e.memoize=Ye,e.memoizeOutput=qe,e.memoizeRendering=qt,e.mergeEventStores=Ne,e.multiplyDuration=function(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}},e.padStart=le,e.parseBusinessHours=Yt,e.parseDragMeta=function(e){var t={},n=he(e,Nr,zr,t);return n.leftoverProps=t,n},e.parseEventDef=Wt,e.parseFieldSpecs=ie,e.parseMarker=Ln,e.pointInsideRect=function(e,t){return e.left>=t.left&&e.left=t.top&&e.top * { + /* work around the way we do column resizing and ensure a minimum width */ + display: inline-block; + min-width: 1.25em; +} diff --git a/src/main/resources/static/assets/libs/fullcalendar/daygrid/main.js b/src/main/resources/static/assets/libs/fullcalendar/daygrid/main.js new file mode 100644 index 0000000..d1cc407 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/daygrid/main.js @@ -0,0 +1,1641 @@ +/*! +FullCalendar Day Grid Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) : + typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) : + (global = global || self, factory(global.FullCalendarDayGrid = {}, global.FullCalendar)); +}(this, function (exports, core) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var DayGridDateProfileGenerator = /** @class */ (function (_super) { + __extends(DayGridDateProfileGenerator, _super); + function DayGridDateProfileGenerator() { + return _super !== null && _super.apply(this, arguments) || this; + } + // Computes the date range that will be rendered. + DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { + var dateEnv = this.dateEnv; + var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay); + var start = renderRange.start; + var end = renderRange.end; + var endOfWeek; + // year and month views should be aligned with weeks. this is already done for week + if (/^(year|month)$/.test(currentRangeUnit)) { + start = dateEnv.startOfWeek(start); + // make end-of-week if not already + endOfWeek = dateEnv.startOfWeek(end); + if (endOfWeek.valueOf() !== end.valueOf()) { + end = core.addWeeks(endOfWeek, 1); + } + } + // ensure 6 weeks + if (this.options.monthMode && + this.options.fixedWeekCount) { + var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays + core.diffWeeks(start, end)); + end = core.addWeeks(end, 6 - rowCnt); + } + return { start: start, end: end }; + }; + return DayGridDateProfileGenerator; + }(core.DateProfileGenerator)); + + /* A rectangular panel that is absolutely positioned over other content + ------------------------------------------------------------------------------------------------------------------------ + Options: + - className (string) + - content (HTML string, element, or element array) + - parentEl + - top + - left + - right (the x coord of where the right edge should be. not a "CSS" right) + - autoHide (boolean) + - show (callback) + - hide (callback) + */ + var Popover = /** @class */ (function () { + function Popover(options) { + var _this = this; + this.isHidden = true; + this.margin = 10; // the space required between the popover and the edges of the scroll container + // Triggered when the user clicks *anywhere* in the document, for the autoHide feature + this.documentMousedown = function (ev) { + // only hide the popover if the click happened outside the popover + if (_this.el && !_this.el.contains(ev.target)) { + _this.hide(); + } + }; + this.options = options; + } + // Shows the popover on the specified position. Renders it if not already + Popover.prototype.show = function () { + if (this.isHidden) { + if (!this.el) { + this.render(); + } + this.el.style.display = ''; + this.position(); + this.isHidden = false; + this.trigger('show'); + } + }; + // Hides the popover, through CSS, but does not remove it from the DOM + Popover.prototype.hide = function () { + if (!this.isHidden) { + this.el.style.display = 'none'; + this.isHidden = true; + this.trigger('hide'); + } + }; + // Creates `this.el` and renders content inside of it + Popover.prototype.render = function () { + var _this = this; + var options = this.options; + var el = this.el = core.createElement('div', { + className: 'fc-popover ' + (options.className || ''), + style: { + top: '0', + left: '0' + } + }); + if (typeof options.content === 'function') { + options.content(el); + } + options.parentEl.appendChild(el); + // when a click happens on anything inside with a 'fc-close' className, hide the popover + core.listenBySelector(el, 'click', '.fc-close', function (ev) { + _this.hide(); + }); + if (options.autoHide) { + document.addEventListener('mousedown', this.documentMousedown); + } + }; + // Hides and unregisters any handlers + Popover.prototype.destroy = function () { + this.hide(); + if (this.el) { + core.removeElement(this.el); + this.el = null; + } + document.removeEventListener('mousedown', this.documentMousedown); + }; + // Positions the popover optimally, using the top/left/right options + Popover.prototype.position = function () { + var options = this.options; + var el = this.el; + var elDims = el.getBoundingClientRect(); // only used for width,height + var origin = core.computeRect(el.offsetParent); + var clippingRect = core.computeClippingRect(options.parentEl); + var top; // the "position" (not "offset") values for the popover + var left; // + // compute top and left + top = options.top || 0; + if (options.left !== undefined) { + left = options.left; + } + else if (options.right !== undefined) { + left = options.right - elDims.width; // derive the left value from the right value + } + else { + left = 0; + } + // constrain to the view port. if constrained by two edges, give precedence to top/left + top = Math.min(top, clippingRect.bottom - elDims.height - this.margin); + top = Math.max(top, clippingRect.top + this.margin); + left = Math.min(left, clippingRect.right - elDims.width - this.margin); + left = Math.max(left, clippingRect.left + this.margin); + core.applyStyle(el, { + top: top - origin.top, + left: left - origin.left + }); + }; + // Triggers a callback. Calls a function in the option hash of the same name. + // Arguments beyond the first `name` are forwarded on. + // TODO: better code reuse for this. Repeat code + // can kill this??? + Popover.prototype.trigger = function (name) { + if (this.options[name]) { + this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); + } + }; + return Popover; + }()); + + /* Event-rendering methods for the DayGrid class + ----------------------------------------------------------------------------------------------------------------------*/ + // "Simple" is bad a name. has nothing to do with SimpleDayGrid + var SimpleDayGridEventRenderer = /** @class */ (function (_super) { + __extends(SimpleDayGridEventRenderer, _super); + function SimpleDayGridEventRenderer() { + return _super !== null && _super.apply(this, arguments) || this; + } + // Builds the HTML to be used for the default element for an individual segment + SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) { + var _a = this.context, view = _a.view, options = _a.options; + var eventRange = seg.eventRange; + var eventDef = eventRange.def; + var eventUi = eventRange.ui; + var allDay = eventDef.allDay; + var isDraggable = view.computeEventDraggable(eventDef, eventUi); + var isResizableFromStart = allDay && seg.isStart && view.computeEventStartResizable(eventDef, eventUi); + var isResizableFromEnd = allDay && seg.isEnd && view.computeEventEndResizable(eventDef, eventUi); + var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo); + var skinCss = core.cssToStr(this.getSkinCss(eventUi)); + var timeHtml = ''; + var timeText; + var titleHtml; + classes.unshift('fc-day-grid-event', 'fc-h-event'); + // Only display a timed events time if it is the starting segment + if (seg.isStart) { + timeText = this.getTimeText(eventRange); + if (timeText) { + timeHtml = '' + core.htmlEscape(timeText) + ''; + } + } + titleHtml = + '' + + (core.htmlEscape(eventDef.title || '') || ' ') + // we always want one line of height + ''; + return '' + + '
' + + (options.dir === 'rtl' ? + titleHtml + ' ' + timeHtml : // put a natural space in between + timeHtml + ' ' + titleHtml // + ) + + '
' + + (isResizableFromStart ? + '
' : + '') + + (isResizableFromEnd ? + '
' : + '') + + '
'; + }; + // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined + SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () { + return { + hour: 'numeric', + minute: '2-digit', + omitZeroMinute: true, + meridiem: 'narrow' + }; + }; + SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () { + return false; // TODO: somehow consider the originating DayGrid's column count + }; + return SimpleDayGridEventRenderer; + }(core.FgEventRenderer)); + + /* Event-rendering methods for the DayGrid class + ----------------------------------------------------------------------------------------------------------------------*/ + var DayGridEventRenderer = /** @class */ (function (_super) { + __extends(DayGridEventRenderer, _super); + function DayGridEventRenderer(dayGrid) { + var _this = _super.call(this, dayGrid.context) || this; + _this.dayGrid = dayGrid; + return _this; + } + // Renders the given foreground event segments onto the grid + DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) { + var rowStructs = this.rowStructs = this.renderSegRows(segs); + // append to each row's content skeleton + this.dayGrid.rowEls.forEach(function (rowNode, i) { + rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl); + }); + // removes the "more.." events popover + if (!mirrorInfo) { + this.dayGrid.removeSegPopover(); + } + }; + // Unrenders all currently rendered foreground event segments + DayGridEventRenderer.prototype.detachSegs = function () { + var rowStructs = this.rowStructs || []; + var rowStruct; + while ((rowStruct = rowStructs.pop())) { + core.removeElement(rowStruct.tbodyEl); + } + this.rowStructs = null; + }; + // Uses the given events array to generate elements that should be appended to each row's content skeleton. + // Returns an array of rowStruct objects (see the bottom of `renderSegRow`). + // PRECONDITION: each segment shoud already have a rendered and assigned `.el` + DayGridEventRenderer.prototype.renderSegRows = function (segs) { + var rowStructs = []; + var segRows; + var row; + segRows = this.groupSegRows(segs); // group into nested arrays + // iterate each row of segment groupings + for (row = 0; row < segRows.length; row++) { + rowStructs.push(this.renderSegRow(row, segRows[row])); + } + return rowStructs; + }; + // Given a row # and an array of segments all in the same row, render a element, a skeleton that contains + // the segments. Returns object with a bunch of internal data about how the render was calculated. + // NOTE: modifies rowSegs + DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) { + var dayGrid = this.dayGrid; + var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl; + var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels + var levelCnt = Math.max(1, segLevels.length); // ensure at least one level + var tbody = document.createElement('tbody'); + var segMatrix = []; // lookup for which segments are rendered into which level+col cells + var cellMatrix = []; // lookup for all elements of the level+col matrix + var loneCellMatrix = []; // lookup for elements that only take up a single column + var i; + var levelSegs; + var col; + var tr; + var j; + var seg; + var td; + // populates empty cells from the current column (`col`) to `endCol` + function emptyCellsUntil(endCol) { + while (col < endCol) { + // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell + td = (loneCellMatrix[i - 1] || [])[col]; + if (td) { + td.rowSpan = (td.rowSpan || 1) + 1; + } + else { + td = document.createElement('td'); + tr.appendChild(td); + } + cellMatrix[i][col] = td; + loneCellMatrix[i][col] = td; + col++; + } + } + for (i = 0; i < levelCnt; i++) { // iterate through all levels + levelSegs = segLevels[i]; + col = 0; + tr = document.createElement('tr'); + segMatrix.push([]); + cellMatrix.push([]); + loneCellMatrix.push([]); + // levelCnt might be 1 even though there are no actual levels. protect against this. + // this single empty row is useful for styling. + if (levelSegs) { + for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level + seg = levelSegs[j]; + var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; + var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol; + emptyCellsUntil(leftCol); + // create a container that occupies or more columns. append the event element. + td = core.createElement('td', { className: 'fc-event-container' }, seg.el); + if (leftCol !== rightCol) { + td.colSpan = rightCol - leftCol + 1; + } + else { // a single-column segment + loneCellMatrix[i][col] = td; + } + while (col <= rightCol) { + cellMatrix[i][col] = td; + segMatrix[i][col] = seg; + col++; + } + tr.appendChild(td); + } + } + emptyCellsUntil(colCnt); // finish off the row + var introHtml = dayGrid.renderProps.renderIntroHtml(); + if (introHtml) { + if (dayGrid.isRtl) { + core.appendToElement(tr, introHtml); + } + else { + core.prependToElement(tr, introHtml); + } + } + tbody.appendChild(tr); + } + return { + row: row, + tbodyEl: tbody, + cellMatrix: cellMatrix, + segMatrix: segMatrix, + segLevels: segLevels, + segs: rowSegs + }; + }; + // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels. + // NOTE: modifies segs + DayGridEventRenderer.prototype.buildSegLevels = function (segs) { + var _a = this.dayGrid, isRtl = _a.isRtl, colCnt = _a.colCnt; + var levels = []; + var i; + var seg; + var j; + // Give preference to elements with certain criteria, so they have + // a chance to be closer to the top. + segs = this.sortEventSegs(segs); + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + // loop through levels, starting with the topmost, until the segment doesn't collide with other segments + for (j = 0; j < levels.length; j++) { + if (!isDaySegCollision(seg, levels[j])) { + break; + } + } + // `j` now holds the desired subrow index + seg.level = j; + seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only + seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only + ; + (levels[j] || (levels[j] = [])).push(seg); + } + // order segments left-to-right. very important if calendar is RTL + for (j = 0; j < levels.length; j++) { + levels[j].sort(compareDaySegCols); + } + return levels; + }; + // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row + DayGridEventRenderer.prototype.groupSegRows = function (segs) { + var segRows = []; + var i; + for (i = 0; i < this.dayGrid.rowCnt; i++) { + segRows.push([]); + } + for (i = 0; i < segs.length; i++) { + segRows[segs[i].row].push(segs[i]); + } + return segRows; + }; + // Computes a default `displayEventEnd` value if one is not expliclty defined + DayGridEventRenderer.prototype.computeDisplayEventEnd = function () { + return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day + }; + return DayGridEventRenderer; + }(SimpleDayGridEventRenderer)); + // Computes whether two segments' columns collide. They are assumed to be in the same row. + function isDaySegCollision(seg, otherSegs) { + var i; + var otherSeg; + for (i = 0; i < otherSegs.length; i++) { + otherSeg = otherSegs[i]; + if (otherSeg.firstCol <= seg.lastCol && + otherSeg.lastCol >= seg.firstCol) { + return true; + } + } + return false; + } + // A cmp function for determining the leftmost event + function compareDaySegCols(a, b) { + return a.leftCol - b.leftCol; + } + + var DayGridMirrorRenderer = /** @class */ (function (_super) { + __extends(DayGridMirrorRenderer, _super); + function DayGridMirrorRenderer() { + return _super !== null && _super.apply(this, arguments) || this; + } + DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) { + var sourceSeg = mirrorInfo.sourceSeg; + var rowStructs = this.rowStructs = this.renderSegRows(segs); + // inject each new event skeleton into each associated row + this.dayGrid.rowEls.forEach(function (rowNode, row) { + var skeletonEl = core.htmlToElement('
'); // will be absolutely positioned + var skeletonTopEl; + var skeletonTop; + // If there is an original segment, match the top position. Otherwise, put it at the row's top level + if (sourceSeg && sourceSeg.row === row) { + skeletonTopEl = sourceSeg.el; + } + else { + skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody'); + if (!skeletonTopEl) { // when no events + skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table'); + } + } + skeletonTop = skeletonTopEl.getBoundingClientRect().top - + rowNode.getBoundingClientRect().top; // the offsetParent origin + skeletonEl.style.top = skeletonTop + 'px'; + skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl); + rowNode.appendChild(skeletonEl); + }); + }; + return DayGridMirrorRenderer; + }(DayGridEventRenderer)); + + var EMPTY_CELL_HTML = ''; + var DayGridFillRenderer = /** @class */ (function (_super) { + __extends(DayGridFillRenderer, _super); + function DayGridFillRenderer(dayGrid) { + var _this = _super.call(this, dayGrid.context) || this; + _this.fillSegTag = 'td'; // override the default tag name + _this.dayGrid = dayGrid; + return _this; + } + DayGridFillRenderer.prototype.renderSegs = function (type, segs) { + // don't render timed background events + if (type === 'bgEvent') { + segs = segs.filter(function (seg) { + return seg.eventRange.def.allDay; + }); + } + _super.prototype.renderSegs.call(this, type, segs); + }; + DayGridFillRenderer.prototype.attachSegs = function (type, segs) { + var els = []; + var i; + var seg; + var skeletonEl; + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + skeletonEl = this.renderFillRow(type, seg); + this.dayGrid.rowEls[seg.row].appendChild(skeletonEl); + els.push(skeletonEl); + } + return els; + }; + // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered. + DayGridFillRenderer.prototype.renderFillRow = function (type, seg) { + var dayGrid = this.dayGrid; + var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl; + var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; + var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol; + var startCol = leftCol; + var endCol = rightCol + 1; + var className; + var skeletonEl; + var trEl; + if (type === 'businessHours') { + className = 'bgevent'; + } + else { + className = type.toLowerCase(); + } + skeletonEl = core.htmlToElement('
' + + '
' + + '
'); + trEl = skeletonEl.getElementsByTagName('tr')[0]; + if (startCol > 0) { + core.appendToElement(trEl, + // will create (startCol + 1) td's + new Array(startCol + 1).join(EMPTY_CELL_HTML)); + } + seg.el.colSpan = endCol - startCol; + trEl.appendChild(seg.el); + if (endCol < colCnt) { + core.appendToElement(trEl, + // will create (colCnt - endCol) td's + new Array(colCnt - endCol + 1).join(EMPTY_CELL_HTML)); + } + var introHtml = dayGrid.renderProps.renderIntroHtml(); + if (introHtml) { + if (dayGrid.isRtl) { + core.appendToElement(trEl, introHtml); + } + else { + core.prependToElement(trEl, introHtml); + } + } + return skeletonEl; + }; + return DayGridFillRenderer; + }(core.FillRenderer)); + + var DayTile = /** @class */ (function (_super) { + __extends(DayTile, _super); + function DayTile(context, el) { + var _this = _super.call(this, context, el) || this; + var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this); + var renderFrame = _this.renderFrame = core.memoizeRendering(_this._renderFrame); + _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]); + _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]); + _this.renderEventDrag = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]); + _this.renderEventResize = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]); + context.calendar.registerInteractiveComponent(_this, { + el: _this.el, + useEventCenter: false + }); + return _this; + } + DayTile.prototype.render = function (props) { + this.renderFrame(props.date); + this.renderFgEvents(props.fgSegs); + this.renderEventSelection(props.eventSelection); + this.renderEventDrag(props.eventDragInstances); + this.renderEventResize(props.eventResizeInstances); + }; + DayTile.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.renderFrame.unrender(); // should unrender everything else + this.calendar.unregisterInteractiveComponent(this); + }; + DayTile.prototype._renderFrame = function (date) { + var _a = this, theme = _a.theme, dateEnv = _a.dateEnv; + var title = dateEnv.format(date, core.createFormatter(this.opt('dayPopoverFormat')) // TODO: cache + ); + this.el.innerHTML = + '
' + + '' + + core.htmlEscape(title) + + '' + + '' + + '
' + + '
' + + '
' + + '
'; + this.segContainerEl = this.el.querySelector('.fc-event-container'); + }; + DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { + var date = this.props.date; // HACK + if (positionLeft < elWidth && positionTop < elHeight) { + return { + component: this, + dateSpan: { + allDay: true, + range: { start: date, end: core.addDays(date, 1) } + }, + dayEl: this.el, + rect: { + left: 0, + top: 0, + right: elWidth, + bottom: elHeight + }, + layer: 1 + }; + } + }; + return DayTile; + }(core.DateComponent)); + var DayTileEventRenderer = /** @class */ (function (_super) { + __extends(DayTileEventRenderer, _super); + function DayTileEventRenderer(dayTile) { + var _this = _super.call(this, dayTile.context) || this; + _this.dayTile = dayTile; + return _this; + } + DayTileEventRenderer.prototype.attachSegs = function (segs) { + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + this.dayTile.segContainerEl.appendChild(seg.el); + } + }; + DayTileEventRenderer.prototype.detachSegs = function (segs) { + for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { + var seg = segs_2[_i]; + core.removeElement(seg.el); + } + }; + return DayTileEventRenderer; + }(SimpleDayGridEventRenderer)); + + var DayBgRow = /** @class */ (function () { + function DayBgRow(context) { + this.context = context; + } + DayBgRow.prototype.renderHtml = function (props) { + var parts = []; + if (props.renderIntroHtml) { + parts.push(props.renderIntroHtml()); + } + for (var _i = 0, _a = props.cells; _i < _a.length; _i++) { + var cell = _a[_i]; + parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs)); + } + if (!props.cells.length) { + parts.push(''); + } + if (this.context.options.dir === 'rtl') { + parts.reverse(); + } + return '' + parts.join('') + ''; + }; + return DayBgRow; + }()); + function renderCellHtml(date, dateProfile, context, otherAttrs) { + var dateEnv = context.dateEnv, theme = context.theme; + var isDateValid = core.rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow. + var classes = core.getDayClasses(date, dateProfile, context); + classes.unshift('fc-day', theme.getClass('widgetContent')); + return ''; + } + + var DAY_NUM_FORMAT = core.createFormatter({ day: 'numeric' }); + var WEEK_NUM_FORMAT = core.createFormatter({ week: 'numeric' }); + var DayGrid = /** @class */ (function (_super) { + __extends(DayGrid, _super); + function DayGrid(context, el, renderProps) { + var _this = _super.call(this, context, el) || this; + _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid + _this.isCellSizesDirty = false; + var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this); + var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this); + _this.mirrorRenderer = new DayGridMirrorRenderer(_this); + var renderCells = _this.renderCells = core.memoizeRendering(_this._renderCells, _this._unrenderCells); + _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]); + _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]); + _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]); + _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]); + _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]); + _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]); + _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]); + _this.renderProps = renderProps; + return _this; + } + DayGrid.prototype.render = function (props) { + var cells = props.cells; + this.rowCnt = cells.length; + this.colCnt = cells[0].length; + this.renderCells(cells, props.isRigid); + this.renderBusinessHours(props.businessHourSegs); + this.renderDateSelection(props.dateSelectionSegs); + this.renderBgEvents(props.bgEventSegs); + this.renderFgEvents(props.fgEventSegs); + this.renderEventSelection(props.eventSelection); + this.renderEventDrag(props.eventDrag); + this.renderEventResize(props.eventResize); + if (this.segPopoverTile) { + this.updateSegPopoverTile(); + } + }; + DayGrid.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.renderCells.unrender(); // will unrender everything else + }; + DayGrid.prototype.getCellRange = function (row, col) { + var start = this.props.cells[row][col].date; + var end = core.addDays(start, 1); + return { start: start, end: end }; + }; + DayGrid.prototype.updateSegPopoverTile = function (date, segs) { + var ownProps = this.props; + this.segPopoverTile.receiveProps({ + date: date || this.segPopoverTile.props.date, + fgSegs: segs || this.segPopoverTile.props.fgSegs, + eventSelection: ownProps.eventSelection, + eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null, + eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null + }); + }; + /* Date Rendering + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype._renderCells = function (cells, isRigid) { + var _a = this, view = _a.view, dateEnv = _a.dateEnv; + var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt; + var html = ''; + var row; + var col; + for (row = 0; row < rowCnt; row++) { + html += this.renderDayRowHtml(row, isRigid); + } + this.el.innerHTML = html; + this.rowEls = core.findElements(this.el, '.fc-row'); + this.cellEls = core.findElements(this.el, '.fc-day, .fc-disabled-day'); + if (this.isRtl) { + this.cellEls.reverse(); + } + this.rowPositions = new core.PositionCache(this.el, this.rowEls, false, true // vertical + ); + this.colPositions = new core.PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row + true, false // horizontal + ); + // trigger dayRender with each cell's element + for (row = 0; row < rowCnt; row++) { + for (col = 0; col < colCnt; col++) { + this.publiclyTrigger('dayRender', [ + { + date: dateEnv.toDate(cells[row][col].date), + el: this.getCellEl(row, col), + view: view + } + ]); + } + } + this.isCellSizesDirty = true; + }; + DayGrid.prototype._unrenderCells = function () { + this.removeSegPopover(); + }; + // Generates the HTML for a single row, which is a div that wraps a table. + // `row` is the row number. + DayGrid.prototype.renderDayRowHtml = function (row, isRigid) { + var theme = this.theme; + var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')]; + if (isRigid) { + classes.push('fc-rigid'); + } + var bgRow = new DayBgRow(this.context); + return '' + + '
' + + '
' + + '' + + bgRow.renderHtml({ + cells: this.props.cells[row], + dateProfile: this.props.dateProfile, + renderIntroHtml: this.renderProps.renderBgIntroHtml + }) + + '
' + + '
' + + '
' + + '' + + (this.getIsNumbersVisible() ? + '' + + this.renderNumberTrHtml(row) + + '' : + '') + + '
' + + '
' + + '
'; + }; + DayGrid.prototype.getIsNumbersVisible = function () { + return this.getIsDayNumbersVisible() || + this.renderProps.cellWeekNumbersVisible || + this.renderProps.colWeekNumbersVisible; + }; + DayGrid.prototype.getIsDayNumbersVisible = function () { + return this.rowCnt > 1; + }; + /* Grid Number Rendering + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype.renderNumberTrHtml = function (row) { + var intro = this.renderProps.renderNumberIntroHtml(row, this); + return '' + + '' + + (this.isRtl ? '' : intro) + + this.renderNumberCellsHtml(row) + + (this.isRtl ? intro : '') + + ''; + }; + DayGrid.prototype.renderNumberCellsHtml = function (row) { + var htmls = []; + var col; + var date; + for (col = 0; col < this.colCnt; col++) { + date = this.props.cells[row][col].date; + htmls.push(this.renderNumberCellHtml(date)); + } + if (this.isRtl) { + htmls.reverse(); + } + return htmls.join(''); + }; + // Generates the HTML for the s of the "number" row in the DayGrid's content skeleton. + // The number row will only exist if either day numbers or week numbers are turned on. + DayGrid.prototype.renderNumberCellHtml = function (date) { + var _a = this, view = _a.view, dateEnv = _a.dateEnv; + var html = ''; + var isDateValid = core.rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow. + var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid; + var classes; + var weekCalcFirstDow; + if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) { + // no numbers in day cell (week number must be along the side) + return ''; // will create an empty space above events :( + } + classes = core.getDayClasses(date, this.props.dateProfile, this.context); + classes.unshift('fc-day-top'); + if (this.renderProps.cellWeekNumbersVisible) { + weekCalcFirstDow = dateEnv.weekDow; + } + html += ''; + if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) { + html += core.buildGotoAnchorHtml(view, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML + ); + } + if (isDayNumberVisible) { + html += core.buildGotoAnchorHtml(view, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML + ); + } + html += ''; + return html; + }; + /* Sizing + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype.updateSize = function (isResize) { + var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer; + if (isResize || + this.isCellSizesDirty || + this.view.calendar.isEventsUpdated // hack + ) { + this.buildPositionCaches(); + this.isCellSizesDirty = false; + } + fillRenderer.computeSizes(isResize); + eventRenderer.computeSizes(isResize); + mirrorRenderer.computeSizes(isResize); + fillRenderer.assignSizes(isResize); + eventRenderer.assignSizes(isResize); + mirrorRenderer.assignSizes(isResize); + }; + DayGrid.prototype.buildPositionCaches = function () { + this.buildColPositions(); + this.buildRowPositions(); + }; + DayGrid.prototype.buildColPositions = function () { + this.colPositions.build(); + }; + DayGrid.prototype.buildRowPositions = function () { + this.rowPositions.build(); + this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack + }; + /* Hit System + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype.positionToHit = function (leftPosition, topPosition) { + var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions; + var col = colPositions.leftToIndex(leftPosition); + var row = rowPositions.topToIndex(topPosition); + if (row != null && col != null) { + return { + row: row, + col: col, + dateSpan: { + range: this.getCellRange(row, col), + allDay: true + }, + dayEl: this.getCellEl(row, col), + relativeRect: { + left: colPositions.lefts[col], + right: colPositions.rights[col], + top: rowPositions.tops[row], + bottom: rowPositions.bottoms[row] + } + }; + } + }; + /* Cell System + ------------------------------------------------------------------------------------------------------------------*/ + // FYI: the first column is the leftmost column, regardless of date + DayGrid.prototype.getCellEl = function (row, col) { + return this.cellEls[row * this.colCnt + col]; + }; + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype._renderEventDrag = function (state) { + if (state) { + this.eventRenderer.hideByHash(state.affectedInstances); + this.fillRenderer.renderSegs('highlight', state.segs); + } + }; + DayGrid.prototype._unrenderEventDrag = function (state) { + if (state) { + this.eventRenderer.showByHash(state.affectedInstances); + this.fillRenderer.unrender('highlight'); + } + }; + /* Event Resize Visualization + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype._renderEventResize = function (state) { + if (state) { + this.eventRenderer.hideByHash(state.affectedInstances); + this.fillRenderer.renderSegs('highlight', state.segs); + this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg }); + } + }; + DayGrid.prototype._unrenderEventResize = function (state) { + if (state) { + this.eventRenderer.showByHash(state.affectedInstances); + this.fillRenderer.unrender('highlight'); + this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg }); + } + }; + /* More+ Link Popover + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype.removeSegPopover = function () { + if (this.segPopover) { + this.segPopover.hide(); // in handler, will call segPopover's removeElement + } + }; + // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid. + // `levelLimit` can be false (don't limit), a number, or true (should be computed). + DayGrid.prototype.limitRows = function (levelLimit) { + var rowStructs = this.eventRenderer.rowStructs || []; + var row; // row # + var rowLevelLimit; + for (row = 0; row < rowStructs.length; row++) { + this.unlimitRow(row); + if (!levelLimit) { + rowLevelLimit = false; + } + else if (typeof levelLimit === 'number') { + rowLevelLimit = levelLimit; + } + else { + rowLevelLimit = this.computeRowLevelLimit(row); + } + if (rowLevelLimit !== false) { + this.limitRow(row, rowLevelLimit); + } + } + }; + // Computes the number of levels a row will accomodate without going outside its bounds. + // Assumes the row is "rigid" (maintains a constant height regardless of what is inside). + // `row` is the row number. + DayGrid.prototype.computeRowLevelLimit = function (row) { + var rowEl = this.rowEls[row]; // the containing "fake" row div + var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport! + var trEls = core.findChildren(this.eventRenderer.rowStructs[row].tbodyEl); + var i; + var trEl; + // Reveal one level at a time and stop when we find one out of bounds + for (i = 0; i < trEls.length; i++) { + trEl = trEls[i]; + trEl.classList.remove('fc-limited'); // reset to original state (reveal) + if (trEl.getBoundingClientRect().bottom > rowBottom) { + return i; + } + } + return false; // should not limit at all + }; + // Limits the given grid row to the maximum number of levels and injects "more" links if necessary. + // `row` is the row number. + // `levelLimit` is a number for the maximum (inclusive) number of levels allowed. + DayGrid.prototype.limitRow = function (row, levelLimit) { + var _this = this; + var _a = this, colCnt = _a.colCnt, isRtl = _a.isRtl; + var rowStruct = this.eventRenderer.rowStructs[row]; + var moreNodes = []; // array of "more" links and DOM nodes + var col = 0; // col #, left-to-right (not chronologically) + var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right + var cellMatrix; // a matrix (by level, then column) of all elements in the row + var limitedNodes; // array of temporarily hidden level and segment DOM nodes + var i; + var seg; + var segsBelow; // array of segment objects below `seg` in the current `col` + var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies + var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column) + var td; + var rowSpan; + var segMoreNodes; // array of "more" cells that will stand-in for the current seg's cell + var j; + var moreTd; + var moreWrap; + var moreLink; + // Iterates through empty level cells and places "more" links inside if need be + var emptyCellsUntil = function (endCol) { + while (col < endCol) { + segsBelow = _this.getCellSegs(row, col, levelLimit); + if (segsBelow.length) { + td = cellMatrix[levelLimit - 1][col]; + moreLink = _this.renderMoreLink(row, col, segsBelow); + moreWrap = core.createElement('div', null, moreLink); + td.appendChild(moreWrap); + moreNodes.push(moreWrap); + } + col++; + } + }; + if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit? + levelSegs = rowStruct.segLevels[levelLimit - 1]; + cellMatrix = rowStruct.cellMatrix; + limitedNodes = core.findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level elements past the limit + limitedNodes.forEach(function (node) { + node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array + }); + // iterate though segments in the last allowable level + for (i = 0; i < levelSegs.length; i++) { + seg = levelSegs[i]; + var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; + var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol; + emptyCellsUntil(leftCol); // process empty cells before the segment + // determine *all* segments below `seg` that occupy the same columns + colSegsBelow = []; + totalSegsBelow = 0; + while (col <= rightCol) { + segsBelow = this.getCellSegs(row, col, levelLimit); + colSegsBelow.push(segsBelow); + totalSegsBelow += segsBelow.length; + col++; + } + if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links? + td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell + rowSpan = td.rowSpan || 1; + segMoreNodes = []; + // make a replacement for each column the segment occupies. will be one for each colspan + for (j = 0; j < colSegsBelow.length; j++) { + moreTd = core.createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan }); + segsBelow = colSegsBelow[j]; + moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too + ); + moreWrap = core.createElement('div', null, moreLink); + moreTd.appendChild(moreWrap); + segMoreNodes.push(moreTd); + moreNodes.push(moreTd); + } + td.classList.add('fc-limited'); + core.insertAfterElement(td, segMoreNodes); + limitedNodes.push(td); + } + } + emptyCellsUntil(this.colCnt); // finish off the level + rowStruct.moreEls = moreNodes; // for easy undoing later + rowStruct.limitedEls = limitedNodes; // for easy undoing later + } + }; + // Reveals all levels and removes all "more"-related elements for a grid's row. + // `row` is a row number. + DayGrid.prototype.unlimitRow = function (row) { + var rowStruct = this.eventRenderer.rowStructs[row]; + if (rowStruct.moreEls) { + rowStruct.moreEls.forEach(core.removeElement); + rowStruct.moreEls = null; + } + if (rowStruct.limitedEls) { + rowStruct.limitedEls.forEach(function (limitedEl) { + limitedEl.classList.remove('fc-limited'); + }); + rowStruct.limitedEls = null; + } + }; + // Renders an element that represents hidden event element for a cell. + // Responsible for attaching click handler as well. + DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) { + var _this = this; + var _a = this, view = _a.view, dateEnv = _a.dateEnv; + var a = core.createElement('a', { className: 'fc-more' }); + a.innerText = this.getMoreLinkText(hiddenSegs.length); + a.addEventListener('click', function (ev) { + var clickOption = _this.opt('eventLimitClick'); + var _col = _this.isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system? + var date = _this.props.cells[row][_col].date; + var moreEl = ev.currentTarget; + var dayEl = _this.getCellEl(row, col); + var allSegs = _this.getCellSegs(row, col); + // rescope the segments to be within the cell's date + var reslicedAllSegs = _this.resliceDaySegs(allSegs, date); + var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date); + if (typeof clickOption === 'function') { + // the returned value can be an atomic option + clickOption = _this.publiclyTrigger('eventLimitClick', [ + { + date: dateEnv.toDate(date), + allDay: true, + dayEl: dayEl, + moreEl: moreEl, + segs: reslicedAllSegs, + hiddenSegs: reslicedHiddenSegs, + jsEvent: ev, + view: view + } + ]); + } + if (clickOption === 'popover') { + _this.showSegPopover(row, col, moreEl, reslicedAllSegs); + } + else if (typeof clickOption === 'string') { // a view name + view.calendar.zoomTo(date, clickOption); + } + }); + return a; + }; + // Reveals the popover that displays all events within a cell + DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) { + var _this = this; + var _a = this, calendar = _a.calendar, view = _a.view, theme = _a.theme; + var _col = this.isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system? + var moreWrap = moreLink.parentNode; // the
wrapper around the + var topEl; // the element we want to match the top coordinate of + var options; + if (this.rowCnt === 1) { + topEl = view.el; // will cause the popover to cover any sort of header + } + else { + topEl = this.rowEls[row]; // will align with top of row + } + options = { + className: 'fc-more-popover ' + theme.getClass('popover'), + parentEl: view.el, + top: core.computeRect(topEl).top, + autoHide: true, + content: function (el) { + _this.segPopoverTile = new DayTile(_this.context, el); + _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs); + }, + hide: function () { + _this.segPopoverTile.destroy(); + _this.segPopoverTile = null; + _this.segPopover.destroy(); + _this.segPopover = null; + } + }; + // Determine horizontal coordinate. + // We use the moreWrap instead of the to avoid border confusion. + if (this.isRtl) { + options.right = core.computeRect(moreWrap).right + 1; // +1 to be over cell border + } + else { + options.left = core.computeRect(moreWrap).left - 1; // -1 to be over cell border + } + this.segPopover = new Popover(options); + this.segPopover.show(); + calendar.releaseAfterSizingTriggers(); // hack for eventPositioned + }; + // Given the events within an array of segment objects, reslice them to be in a single day + DayGrid.prototype.resliceDaySegs = function (segs, dayDate) { + var dayStart = dayDate; + var dayEnd = core.addDays(dayStart, 1); + var dayRange = { start: dayStart, end: dayEnd }; + var newSegs = []; + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + var eventRange = seg.eventRange; + var origRange = eventRange.range; + var slicedRange = core.intersectRanges(origRange, dayRange); + if (slicedRange) { + newSegs.push(__assign({}, seg, { eventRange: { + def: eventRange.def, + ui: __assign({}, eventRange.ui, { durationEditable: false }), + instance: eventRange.instance, + range: slicedRange + }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() })); + } + } + return newSegs; + }; + // Generates the text that should be inside a "more" link, given the number of events it represents + DayGrid.prototype.getMoreLinkText = function (num) { + var opt = this.opt('eventLimitText'); + if (typeof opt === 'function') { + return opt(num); + } + else { + return '+' + num + ' ' + opt; + } + }; + // Returns segments within a given cell. + // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs. + DayGrid.prototype.getCellSegs = function (row, col, startLevel) { + var segMatrix = this.eventRenderer.rowStructs[row].segMatrix; + var level = startLevel || 0; + var segs = []; + var seg; + while (level < segMatrix.length) { + seg = segMatrix[level][col]; + if (seg) { + segs.push(seg); + } + level++; + } + return segs; + }; + return DayGrid; + }(core.DateComponent)); + + var WEEK_NUM_FORMAT$1 = core.createFormatter({ week: 'numeric' }); + /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. + ----------------------------------------------------------------------------------------------------------------------*/ + // It is a manager for a DayGrid subcomponent, which does most of the heavy lifting. + // It is responsible for managing width/height. + var DayGridView = /** @class */ (function (_super) { + __extends(DayGridView, _super); + function DayGridView(context, viewSpec, dateProfileGenerator, parentEl) { + var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this; + /* Header Rendering + ------------------------------------------------------------------------------------------------------------------*/ + // Generates the HTML that will go before the day-of week header cells + _this.renderHeadIntroHtml = function () { + var theme = _this.theme; + if (_this.colWeekNumbersVisible) { + return '' + + '' + + '' + // needed for matchCellWidths + core.htmlEscape(_this.opt('weekLabel')) + + '' + + ''; + } + return ''; + }; + /* Day Grid Rendering + ------------------------------------------------------------------------------------------------------------------*/ + // Generates the HTML that will go before content-skeleton cells that display the day/week numbers + _this.renderDayGridNumberIntroHtml = function (row, dayGrid) { + var dateEnv = _this.dateEnv; + var weekStart = dayGrid.props.cells[row][0].date; + if (_this.colWeekNumbersVisible) { + return '' + + '' + + core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths + _this, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML + ) + + ''; + } + return ''; + }; + // Generates the HTML that goes before the day bg cells for each day-row + _this.renderDayGridBgIntroHtml = function () { + var theme = _this.theme; + if (_this.colWeekNumbersVisible) { + return ''; + } + return ''; + }; + // Generates the HTML that goes before every other type of row generated by DayGrid. + // Affects mirror-skeleton and highlight-skeleton rows. + _this.renderDayGridIntroHtml = function () { + if (_this.colWeekNumbersVisible) { + return ''; + } + return ''; + }; + _this.el.classList.add('fc-dayGrid-view'); + _this.el.innerHTML = _this.renderSkeletonHtml(); + _this.scroller = new core.ScrollComponent('hidden', // overflow x + 'auto' // overflow y + ); + var dayGridContainerEl = _this.scroller.el; + _this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl); + dayGridContainerEl.classList.add('fc-day-grid-container'); + var dayGridEl = core.createElement('div', { className: 'fc-day-grid' }); + dayGridContainerEl.appendChild(dayGridEl); + var cellWeekNumbersVisible; + if (_this.opt('weekNumbers')) { + if (_this.opt('weekNumbersWithinDays')) { + cellWeekNumbersVisible = true; + _this.colWeekNumbersVisible = false; + } + else { + cellWeekNumbersVisible = false; + _this.colWeekNumbersVisible = true; + } + } + else { + _this.colWeekNumbersVisible = false; + cellWeekNumbersVisible = false; + } + _this.dayGrid = new DayGrid(_this.context, dayGridEl, { + renderNumberIntroHtml: _this.renderDayGridNumberIntroHtml, + renderBgIntroHtml: _this.renderDayGridBgIntroHtml, + renderIntroHtml: _this.renderDayGridIntroHtml, + colWeekNumbersVisible: _this.colWeekNumbersVisible, + cellWeekNumbersVisible: cellWeekNumbersVisible + }); + return _this; + } + DayGridView.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.dayGrid.destroy(); + this.scroller.destroy(); + }; + // Builds the HTML skeleton for the view. + // The day-grid component will render inside of a container defined by this HTML. + DayGridView.prototype.renderSkeletonHtml = function () { + var theme = this.theme; + return '' + + '' + + (this.opt('columnHeader') ? + '' + + '' + + '' + + '' + + '' : + '') + + '' + + '' + + '' + + '' + + '' + + '
 
'; + }; + // Generates an HTML attribute string for setting the width of the week number column, if it is known + DayGridView.prototype.weekNumberStyleAttr = function () { + if (this.weekNumberWidth != null) { + return 'style="width:' + this.weekNumberWidth + 'px"'; + } + return ''; + }; + // Determines whether each row should have a constant height + DayGridView.prototype.hasRigidRows = function () { + var eventLimit = this.opt('eventLimit'); + return eventLimit && typeof eventLimit !== 'number'; + }; + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + DayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) { + _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first + this.dayGrid.updateSize(isResize); + }; + // Refreshes the horizontal dimensions of the view + DayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) { + var dayGrid = this.dayGrid; + var eventLimit = this.opt('eventLimit'); + var headRowEl = this.header ? this.header.el : null; // HACK + var scrollerHeight; + var scrollbarWidths; + // hack to give the view some height prior to dayGrid's columns being rendered + // TODO: separate setting height from scroller VS dayGrid. + if (!dayGrid.rowEls) { + if (!isAuto) { + scrollerHeight = this.computeScrollerHeight(viewHeight); + this.scroller.setHeight(scrollerHeight); + } + return; + } + if (this.colWeekNumbersVisible) { + // Make sure all week number cells running down the side have the same width. + this.weekNumberWidth = core.matchCellWidths(core.findElements(this.el, '.fc-week-number')); + } + // reset all heights to be natural + this.scroller.clear(); + if (headRowEl) { + core.uncompensateScroll(headRowEl); + } + dayGrid.removeSegPopover(); // kill the "more" popover if displayed + // is the event limit a constant level number? + if (eventLimit && typeof eventLimit === 'number') { + dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after + } + // distribute the height to the rows + // (viewHeight is a "recommended" value if isAuto) + scrollerHeight = this.computeScrollerHeight(viewHeight); + this.setGridHeight(scrollerHeight, isAuto); + // is the event limit dynamically calculated? + if (eventLimit && typeof eventLimit !== 'number') { + dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set + } + if (!isAuto) { // should we force dimensions of the scroll container? + this.scroller.setHeight(scrollerHeight); + scrollbarWidths = this.scroller.getScrollbarWidths(); + if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars? + if (headRowEl) { + core.compensateScroll(headRowEl, scrollbarWidths); + } + // doing the scrollbar compensation might have created text overflow which created more height. redo + scrollerHeight = this.computeScrollerHeight(viewHeight); + this.scroller.setHeight(scrollerHeight); + } + // guarantees the same scrollbar widths + this.scroller.lockOverflow(scrollbarWidths); + } + }; + // given a desired total height of the view, returns what the height of the scroller should be + DayGridView.prototype.computeScrollerHeight = function (viewHeight) { + return viewHeight - + core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller + }; + // Sets the height of just the DayGrid component in this view + DayGridView.prototype.setGridHeight = function (height, isAuto) { + if (this.opt('monthMode')) { + // if auto, make the height of each row the height that it would be if there were 6 weeks + if (isAuto) { + height *= this.dayGrid.rowCnt / 6; + } + core.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows + } + else { + if (isAuto) { + core.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding + } + else { + core.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows + } + } + }; + /* Scroll + ------------------------------------------------------------------------------------------------------------------*/ + DayGridView.prototype.computeDateScroll = function (duration) { + return { top: 0 }; + }; + DayGridView.prototype.queryDateScroll = function () { + return { top: this.scroller.getScrollTop() }; + }; + DayGridView.prototype.applyDateScroll = function (scroll) { + if (scroll.top !== undefined) { + this.scroller.setScrollTop(scroll.top); + } + }; + return DayGridView; + }(core.View)); + DayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator; + + var SimpleDayGrid = /** @class */ (function (_super) { + __extends(SimpleDayGrid, _super); + function SimpleDayGrid(context, dayGrid) { + var _this = _super.call(this, context, dayGrid.el) || this; + _this.slicer = new DayGridSlicer(); + _this.dayGrid = dayGrid; + context.calendar.registerInteractiveComponent(_this, { el: _this.dayGrid.el }); + return _this; + } + SimpleDayGrid.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.calendar.unregisterInteractiveComponent(this); + }; + SimpleDayGrid.prototype.render = function (props) { + var dayGrid = this.dayGrid; + var dateProfile = props.dateProfile, dayTable = props.dayTable; + dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid })); + }; + SimpleDayGrid.prototype.buildPositionCaches = function () { + this.dayGrid.buildPositionCaches(); + }; + SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) { + var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop); + if (rawHit) { + return { + component: this.dayGrid, + dateSpan: rawHit.dateSpan, + dayEl: rawHit.dayEl, + rect: { + left: rawHit.relativeRect.left, + right: rawHit.relativeRect.right, + top: rawHit.relativeRect.top, + bottom: rawHit.relativeRect.bottom + }, + layer: 0 + }; + } + }; + return SimpleDayGrid; + }(core.DateComponent)); + var DayGridSlicer = /** @class */ (function (_super) { + __extends(DayGridSlicer, _super); + function DayGridSlicer() { + return _super !== null && _super.apply(this, arguments) || this; + } + DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) { + return dayTable.sliceRange(dateRange); + }; + return DayGridSlicer; + }(core.Slicer)); + + var DayGridView$1 = /** @class */ (function (_super) { + __extends(DayGridView, _super); + function DayGridView(_context, viewSpec, dateProfileGenerator, parentEl) { + var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this; + _this.buildDayTable = core.memoize(buildDayTable); + if (_this.opt('columnHeader')) { + _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container')); + } + _this.simpleDayGrid = new SimpleDayGrid(_this.context, _this.dayGrid); + return _this; + } + DayGridView.prototype.destroy = function () { + _super.prototype.destroy.call(this); + if (this.header) { + this.header.destroy(); + } + this.simpleDayGrid.destroy(); + }; + DayGridView.prototype.render = function (props) { + _super.prototype.render.call(this, props); + var dateProfile = this.props.dateProfile; + var dayTable = this.dayTable = + this.buildDayTable(dateProfile, this.dateProfileGenerator); + if (this.header) { + this.header.receiveProps({ + dateProfile: dateProfile, + dates: dayTable.headerDates, + datesRepDistinctDays: dayTable.rowCnt === 1, + renderIntroHtml: this.renderHeadIntroHtml + }); + } + this.simpleDayGrid.receiveProps({ + dateProfile: dateProfile, + dayTable: dayTable, + businessHours: props.businessHours, + dateSelection: props.dateSelection, + eventStore: props.eventStore, + eventUiBases: props.eventUiBases, + eventSelection: props.eventSelection, + eventDrag: props.eventDrag, + eventResize: props.eventResize, + isRigid: this.hasRigidRows(), + nextDayThreshold: this.nextDayThreshold + }); + }; + return DayGridView; + }(DayGridView)); + function buildDayTable(dateProfile, dateProfileGenerator) { + var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator); + return new core.DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit)); + } + + var main = core.createPlugin({ + defaultView: 'dayGridMonth', + views: { + dayGrid: DayGridView$1, + dayGridDay: { + type: 'dayGrid', + duration: { days: 1 } + }, + dayGridWeek: { + type: 'dayGrid', + duration: { weeks: 1 } + }, + dayGridMonth: { + type: 'dayGrid', + duration: { months: 1 }, + monthMode: true, + fixedWeekCount: true + } + } + }); + + exports.AbstractDayGridView = DayGridView; + exports.DayBgRow = DayBgRow; + exports.DayGrid = DayGrid; + exports.DayGridSlicer = DayGridSlicer; + exports.DayGridView = DayGridView$1; + exports.SimpleDayGrid = SimpleDayGrid; + exports.buildBasicDayTable = buildDayTable; + exports.default = main; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/daygrid/main.min.css b/src/main/resources/static/assets/libs/fullcalendar/daygrid/main.min.css new file mode 100644 index 0000000..55a5724 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/daygrid/main.min.css @@ -0,0 +1 @@ +.fc-dayGridDay-view .fc-content-skeleton,.fc-dayGridWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-dayGrid-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-dayGrid-view .fc-day-number,.fc-dayGrid-view .fc-week-number{padding:2px}.fc-dayGrid-view th.fc-day-number,.fc-dayGrid-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-dayGrid-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-dayGrid-view td.fc-week-number{text-align:center}.fc-dayGrid-view td.fc-week-number>*{display:inline-block;min-width:1.25em} \ No newline at end of file diff --git a/src/main/resources/static/assets/libs/fullcalendar/daygrid/main.min.js b/src/main/resources/static/assets/libs/fullcalendar/daygrid/main.min.js new file mode 100644 index 0000000..2f4c0d4 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/daygrid/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Day Grid Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarDayGrid={},e.FullCalendar)}(this,function(e,t){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function n(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var i=function(){return(i=Object.assign||function(e){for(var t,r=1,n=arguments.length;r'+t.htmlEscape(n)+""),i=''+(t.htmlEscape(d.title||"")||" ")+"",'
'+("rtl"===l.dir?i+" "+y:y+" "+i)+"
"+(u?'
':"")+(f?'
':"")+"
"},r.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"}},r.prototype.computeDisplayEventEnd=function(){return!1},r}(t.FgEventRenderer),a=function(e){function r(t){var r=e.call(this,t.context)||this;return r.dayGrid=t,r}return n(r,e),r.prototype.attachSegs=function(e,t){var r=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach(function(e,t){e.querySelector(".fc-content-skeleton > table").appendChild(r[t].tbodyEl)}),t||this.dayGrid.removeSegPopover()},r.prototype.detachSegs=function(){for(var e,r=this.rowStructs||[];e=r.pop();)t.removeElement(e.tbodyEl);this.rowStructs=null},r.prototype.renderSegRows=function(e){var t,r,n=[];for(t=this.groupSegRows(e),r=0;r=e.firstCol)return!0;return!1}function c(e,t){return e.leftCol-t.leftCol}var h=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.attachSegs=function(e,r){var n=r.sourceSeg,i=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach(function(e,r){var o,s,l=t.htmlToElement('
');n&&n.row===r?o=n.el:(o=e.querySelector(".fc-content-skeleton tbody"))||(o=e.querySelector(".fc-content-skeleton table")),s=o.getBoundingClientRect().top-e.getBoundingClientRect().top,l.style.top=s+"px",l.querySelector("table").appendChild(i[r].tbodyEl),e.appendChild(l)})},r}(a),p=function(e){function r(t){var r=e.call(this,t.context)||this;return r.fillSegTag="td",r.dayGrid=t,r}return n(r,e),r.prototype.renderSegs=function(t,r){"bgEvent"===t&&(r=r.filter(function(e){return e.eventRange.def.allDay})),e.prototype.renderSegs.call(this,t,r)},r.prototype.attachSegs=function(e,t){var r,n,i,o=[];for(r=0;r
')).getElementsByTagName("tr")[0],d>0&&t.appendToElement(o,new Array(d+1).join('')),r.el.colSpan=c-d,o.appendChild(r.el),c'));var h=s.renderProps.renderIntroHtml();return h&&(s.isRtl?t.appendToElement(o,h):t.prependToElement(o,h)),i},r}(t.FillRenderer),u=function(e){function r(r,n){var i=e.call(this,r,n)||this,o=i.eventRenderer=new f(i),s=i.renderFrame=t.memoizeRendering(i._renderFrame);return i.renderFgEvents=t.memoizeRendering(o.renderSegs.bind(o),o.unrender.bind(o),[s]),i.renderEventSelection=t.memoizeRendering(o.selectByInstanceId.bind(o),o.unselectByInstanceId.bind(o),[i.renderFgEvents]),i.renderEventDrag=t.memoizeRendering(o.hideByHash.bind(o),o.showByHash.bind(o),[s]),i.renderEventResize=t.memoizeRendering(o.hideByHash.bind(o),o.showByHash.bind(o),[s]),r.calendar.registerInteractiveComponent(i,{el:i.el,useEventCenter:!1}),i}return n(r,e),r.prototype.render=function(e){this.renderFrame(e.date),this.renderFgEvents(e.fgSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDragInstances),this.renderEventResize(e.eventResizeInstances)},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderFrame.unrender(),this.calendar.unregisterInteractiveComponent(this)},r.prototype._renderFrame=function(e){var r=this.theme,n=this.dateEnv.format(e,t.createFormatter(this.opt("dayPopoverFormat")));this.el.innerHTML='
'+t.htmlEscape(n)+'
',this.segContainerEl=this.el.querySelector(".fc-event-container")},r.prototype.queryHit=function(e,r,n,i){var o=this.props.date;if(e'),"rtl"===this.context.options.dir&&t.reverse(),""+t.join("")+""},e}();function m(e,r,n,i){var o=n.dateEnv,s=n.theme,l=t.rangeContainsMarker(r.activeRange,e),a=t.getDayClasses(e,r,n);return a.unshift("fc-day",s.getClass("widgetContent")),'"}var y=t.createFormatter({day:"numeric"}),v=t.createFormatter({week:"numeric"}),b=function(e){function r(r,n,i){var o=e.call(this,r,n)||this;o.bottomCoordPadding=0,o.isCellSizesDirty=!1;var s=o.eventRenderer=new a(o),l=o.fillRenderer=new p(o);o.mirrorRenderer=new h(o);var d=o.renderCells=t.memoizeRendering(o._renderCells,o._unrenderCells);return o.renderBusinessHours=t.memoizeRendering(l.renderSegs.bind(l,"businessHours"),l.unrender.bind(l,"businessHours"),[d]),o.renderDateSelection=t.memoizeRendering(l.renderSegs.bind(l,"highlight"),l.unrender.bind(l,"highlight"),[d]),o.renderBgEvents=t.memoizeRendering(l.renderSegs.bind(l,"bgEvent"),l.unrender.bind(l,"bgEvent"),[d]),o.renderFgEvents=t.memoizeRendering(s.renderSegs.bind(s),s.unrender.bind(s),[d]),o.renderEventSelection=t.memoizeRendering(s.selectByInstanceId.bind(s),s.unselectByInstanceId.bind(s),[o.renderFgEvents]),o.renderEventDrag=t.memoizeRendering(o._renderEventDrag,o._unrenderEventDrag,[d]),o.renderEventResize=t.memoizeRendering(o._renderEventResize,o._unrenderEventResize,[d]),o.renderProps=i,o}return n(r,e),r.prototype.render=function(e){var t=e.cells;this.rowCnt=t.length,this.colCnt=t[0].length,this.renderCells(t,e.isRigid),this.renderBusinessHours(e.businessHourSegs),this.renderDateSelection(e.dateSelectionSegs),this.renderBgEvents(e.bgEventSegs),this.renderFgEvents(e.fgEventSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDrag),this.renderEventResize(e.eventResize),this.segPopoverTile&&this.updateSegPopoverTile()},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderCells.unrender()},r.prototype.getCellRange=function(e,r){var n=this.props.cells[e][r].date;return{start:n,end:t.addDays(n,1)}},r.prototype.updateSegPopoverTile=function(e,t){var r=this.props;this.segPopoverTile.receiveProps({date:e||this.segPopoverTile.props.date,fgSegs:t||this.segPopoverTile.props.fgSegs,eventSelection:r.eventSelection,eventDragInstances:r.eventDrag?r.eventDrag.affectedInstances:null,eventResizeInstances:r.eventResize?r.eventResize.affectedInstances:null})},r.prototype._renderCells=function(e,r){var n,i,o=this.view,s=this.dateEnv,l=this.rowCnt,a=this.colCnt,d="";for(n=0;n
'+i.renderHtml({cells:this.props.cells[e],dateProfile:this.props.dateProfile,renderIntroHtml:this.renderProps.renderBgIntroHtml})+'
'+(this.getIsNumbersVisible()?""+this.renderNumberTrHtml(e)+"":"")+"
"},r.prototype.getIsNumbersVisible=function(){return this.getIsDayNumbersVisible()||this.renderProps.cellWeekNumbersVisible||this.renderProps.colWeekNumbersVisible},r.prototype.getIsDayNumbersVisible=function(){return this.rowCnt>1},r.prototype.renderNumberTrHtml=function(e){var t=this.renderProps.renderNumberIntroHtml(e,this);return""+(this.isRtl?"":t)+this.renderNumberCellsHtml(e)+(this.isRtl?t:"")+""},r.prototype.renderNumberCellsHtml=function(e){var t,r,n=[];for(t=0;t",this.renderProps.cellWeekNumbersVisible&&e.getUTCDay()===n&&(s+=t.buildGotoAnchorHtml(i,{date:e,type:"week"},{class:"fc-week-number"},o.format(e,v))),a&&(s+=t.buildGotoAnchorHtml(i,e,{class:"fc-day-number"},o.format(e,y))),s+=""):""},r.prototype.updateSize=function(e){var t=this.fillRenderer,r=this.eventRenderer,n=this.mirrorRenderer;(e||this.isCellSizesDirty||this.view.calendar.isEventsUpdated)&&(this.buildPositionCaches(),this.isCellSizesDirty=!1),t.computeSizes(e),r.computeSizes(e),n.computeSizes(e),t.assignSizes(e),r.assignSizes(e),n.assignSizes(e)},r.prototype.buildPositionCaches=function(){this.buildColPositions(),this.buildRowPositions()},r.prototype.buildColPositions=function(){this.colPositions.build()},r.prototype.buildRowPositions=function(){this.rowPositions.build(),this.rowPositions.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},r.prototype.positionToHit=function(e,t){var r=this.colPositions,n=this.rowPositions,i=r.leftToIndex(e),o=n.topToIndex(t);if(null!=o&&null!=i)return{row:o,col:i,dateSpan:{range:this.getCellRange(o,i),allDay:!0},dayEl:this.getCellEl(o,i),relativeRect:{left:r.lefts[i],right:r.rights[i],top:n.tops[o],bottom:n.bottoms[o]}}},r.prototype.getCellEl=function(e,t){return this.cellEls[e*this.colCnt+t]},r.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",e.segs))},r.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"))},r.prototype._renderEventResize=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",e.segs),this.mirrorRenderer.renderSegs(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},r.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"),this.mirrorRenderer.unrender(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},r.prototype.removeSegPopover=function(){this.segPopover&&this.segPopover.hide()},r.prototype.limitRows=function(e){var t,r,n=this.eventRenderer.rowStructs||[];for(t=0;ti)return r;return!1},r.prototype.limitRow=function(e,r){var n,i,o,s,l,a,d,c,h,p,u,f,g,m,y,v=this,b=this.colCnt,w=this.isRtl,S=this.eventRenderer.rowStructs[e],C=[],E=0,R=function(n){for(;E"+t.htmlEscape(s.opt("weekLabel"))+"":""},s.renderDayGridNumberIntroHtml=function(e,r){var n=s.dateEnv,i=r.props.cells[e][0].date;return s.colWeekNumbersVisible?'"+t.buildGotoAnchorHtml(s,{date:i,type:"week",forceOff:1===r.colCnt},n.format(i,w))+"":""},s.renderDayGridBgIntroHtml=function(){var e=s.theme;return s.colWeekNumbersVisible?'":""},s.renderDayGridIntroHtml=function(){return s.colWeekNumbersVisible?'":""},s.el.classList.add("fc-dayGrid-view"),s.el.innerHTML=s.renderSkeletonHtml(),s.scroller=new t.ScrollComponent("hidden","auto");var l=s.scroller.el;s.el.querySelector(".fc-body > tr > td").appendChild(l),l.classList.add("fc-day-grid-container");var a,d=t.createElement("div",{className:"fc-day-grid"});return l.appendChild(d),s.opt("weekNumbers")?s.opt("weekNumbersWithinDays")?(a=!0,s.colWeekNumbersVisible=!1):(a=!1,s.colWeekNumbersVisible=!0):(s.colWeekNumbersVisible=!1,a=!1),s.dayGrid=new b(s.context,d,{renderNumberIntroHtml:s.renderDayGridNumberIntroHtml,renderBgIntroHtml:s.renderDayGridBgIntroHtml,renderIntroHtml:s.renderDayGridIntroHtml,colWeekNumbersVisible:s.colWeekNumbersVisible,cellWeekNumbersVisible:a}),s}return n(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this.dayGrid.destroy(),this.scroller.destroy()},r.prototype.renderSkeletonHtml=function(){var e=this.theme;return''+(this.opt("columnHeader")?'':"")+'
 
'},r.prototype.weekNumberStyleAttr=function(){return null!=this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},r.prototype.hasRigidRows=function(){var e=this.opt("eventLimit");return e&&"number"!=typeof e},r.prototype.updateSize=function(t,r,n){e.prototype.updateSize.call(this,t,r,n),this.dayGrid.updateSize(t)},r.prototype.updateBaseSize=function(e,r,n){var i,o,s=this.dayGrid,l=this.opt("eventLimit"),a=this.header?this.header.el:null;s.rowEls?(this.colWeekNumbersVisible&&(this.weekNumberWidth=t.matchCellWidths(t.findElements(this.el,".fc-week-number"))),this.scroller.clear(),a&&t.uncompensateScroll(a),s.removeSegPopover(),l&&"number"==typeof l&&s.limitRows(l),i=this.computeScrollerHeight(r),this.setGridHeight(i,n),l&&"number"!=typeof l&&s.limitRows(l),n||(this.scroller.setHeight(i),((o=this.scroller.getScrollbarWidths()).left||o.right)&&(a&&t.compensateScroll(a,o),i=this.computeScrollerHeight(r),this.scroller.setHeight(i)),this.scroller.lockOverflow(o))):n||(i=this.computeScrollerHeight(r),this.scroller.setHeight(i))},r.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},r.prototype.setGridHeight=function(e,r){this.opt("monthMode")?(r&&(e*=this.dayGrid.rowCnt/6),t.distributeHeight(this.dayGrid.rowEls,e,!r)):r?t.undistributeHeight(this.dayGrid.rowEls):t.distributeHeight(this.dayGrid.rowEls,e,!0)},r.prototype.computeDateScroll=function(e){return{top:0}},r.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},r.prototype.applyDateScroll=function(e){void 0!==e.top&&this.scroller.setScrollTop(e.top)},r}(t.View);S.prototype.dateProfileGeneratorClass=o;var C=function(e){function t(t,r){var n=e.call(this,t,r.el)||this;return n.slicer=new E,n.dayGrid=r,t.calendar.registerInteractiveComponent(n,{el:n.dayGrid.el}),n}return n(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},t.prototype.render=function(e){var t=this.dayGrid,r=e.dateProfile,n=e.dayTable;t.receiveProps(i({},this.slicer.sliceProps(e,r,e.nextDayThreshold,t,n),{dateProfile:r,cells:n.cells,isRigid:e.isRigid}))},t.prototype.buildPositionCaches=function(){this.dayGrid.buildPositionCaches()},t.prototype.queryHit=function(e,t){var r=this.dayGrid.positionToHit(e,t);if(r)return{component:this.dayGrid,dateSpan:r.dateSpan,dayEl:r.dayEl,rect:{left:r.relativeRect.left,right:r.relativeRect.right,top:r.relativeRect.top,bottom:r.relativeRect.bottom},layer:0}},t}(t.DateComponent),E=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(t.Slicer),R=function(e){function r(r,n,i,o){var s=e.call(this,r,n,i,o)||this;return s.buildDayTable=t.memoize(H),s.opt("columnHeader")&&(s.header=new t.DayHeader(s.context,s.el.querySelector(".fc-head-container"))),s.simpleDayGrid=new C(s.context,s.dayGrid),s}return n(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.simpleDayGrid.destroy()},r.prototype.render=function(t){e.prototype.render.call(this,t);var r=this.props.dateProfile,n=this.dayTable=this.buildDayTable(r,this.dateProfileGenerator);this.header&&this.header.receiveProps({dateProfile:r,dates:n.headerDates,datesRepDistinctDays:1===n.rowCnt,renderIntroHtml:this.renderHeadIntroHtml}),this.simpleDayGrid.receiveProps({dateProfile:r,dayTable:n,businessHours:t.businessHours,dateSelection:t.dateSelection,eventStore:t.eventStore,eventUiBases:t.eventUiBases,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,isRigid:this.hasRigidRows(),nextDayThreshold:this.nextDayThreshold})},r}(S);function H(e,r){var n=new t.DaySeries(e.renderRange,r);return new t.DayTable(n,/year|month|week/.test(e.currentRangeUnit))}var D=t.createPlugin({defaultView:"dayGridMonth",views:{dayGrid:R,dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}});e.AbstractDayGridView=S,e.DayBgRow=g,e.DayGrid=b,e.DayGridSlicer=E,e.DayGridView=R,e.SimpleDayGrid=C,e.buildBasicDayTable=H,e.default=D,Object.defineProperty(e,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/src/main/resources/static/assets/libs/fullcalendar/google-calendar/main.js b/src/main/resources/static/assets/libs/fullcalendar/google-calendar/main.js new file mode 100644 index 0000000..fca85d4 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/google-calendar/main.js @@ -0,0 +1,170 @@ +/*! +FullCalendar Google Calendar Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) : + typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) : + (global = global || self, factory(global.FullCalendarGoogleCalendar = {}, global.FullCalendar)); +}(this, function (exports, core) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + // TODO: expose somehow + var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars'; + var STANDARD_PROPS = { + url: String, + googleCalendarApiKey: String, + googleCalendarId: String, + data: null + }; + var eventSourceDef = { + parseMeta: function (raw) { + if (typeof raw === 'string') { + raw = { url: raw }; + } + if (typeof raw === 'object') { + var standardProps = core.refineProps(raw, STANDARD_PROPS); + if (!standardProps.googleCalendarId && standardProps.url) { + standardProps.googleCalendarId = parseGoogleCalendarId(standardProps.url); + } + delete standardProps.url; + if (standardProps.googleCalendarId) { + return standardProps; + } + } + return null; + }, + fetch: function (arg, onSuccess, onFailure) { + var calendar = arg.calendar; + var meta = arg.eventSource.meta; + var apiKey = meta.googleCalendarApiKey || calendar.opt('googleCalendarApiKey'); + if (!apiKey) { + onFailure({ + message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/' + }); + } + else { + var url = buildUrl(meta); + var requestParams_1 = buildRequestParams(arg.range, apiKey, meta.data, calendar.dateEnv); + core.requestJson('GET', url, requestParams_1, function (body, xhr) { + if (body.error) { + onFailure({ + message: 'Google Calendar API: ' + body.error.message, + errors: body.error.errors, + xhr: xhr + }); + } + else { + onSuccess({ + rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone), + xhr: xhr + }); + } + }, function (message, xhr) { + onFailure({ message: message, xhr: xhr }); + }); + } + } + }; + function parseGoogleCalendarId(url) { + var match; + // detect if the ID was specified as a single string. + // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars. + if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) { + return url; + } + else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) || + (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) { + return decodeURIComponent(match[1]); + } + } + function buildUrl(meta) { + return API_BASE + '/' + encodeURIComponent(meta.googleCalendarId) + '/events'; + } + function buildRequestParams(range, apiKey, extraParams, dateEnv) { + var params; + var startStr; + var endStr; + if (dateEnv.canComputeOffset) { + // strings will naturally have offsets, which GCal needs + startStr = dateEnv.formatIso(range.start); + endStr = dateEnv.formatIso(range.end); + } + else { + // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day + // from the UTC day-start to guarantee we're getting all the events + // (start/end will be UTC-coerced dates, so toISOString is okay) + startStr = core.addDays(range.start, -1).toISOString(); + endStr = core.addDays(range.end, 1).toISOString(); + } + params = __assign({}, (extraParams || {}), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 }); + if (dateEnv.timeZone !== 'local') { + params.timeZone = dateEnv.timeZone; + } + return params; + } + function gcalItemsToRawEventDefs(items, gcalTimezone) { + return items.map(function (item) { + return gcalItemToRawEventDef(item, gcalTimezone); + }); + } + function gcalItemToRawEventDef(item, gcalTimezone) { + var url = item.htmlLink || null; + // make the URLs for each event show times in the correct timezone + if (url && gcalTimezone) { + url = injectQsComponent(url, 'ctz=' + gcalTimezone); + } + return { + id: item.id, + title: item.summary, + start: item.start.dateTime || item.start.date, + end: item.end.dateTime || item.end.date, + url: url, + location: item.location, + description: item.description + }; + } + // Injects a string like "arg=value" into the querystring of a URL + // TODO: move to a general util file? + function injectQsComponent(url, component) { + // inject it after the querystring but before the fragment + return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) { + return (qs ? qs + '&' : '?') + component + hash; + }); + } + var main = core.createPlugin({ + eventSourceDefs: [eventSourceDef] + }); + + exports.default = main; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/google-calendar/main.min.js b/src/main/resources/static/assets/libs/fullcalendar/google-calendar/main.min.js new file mode 100644 index 0000000..e762612 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/google-calendar/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Google Calendar Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],r):r((e=e||self).FullCalendarGoogleCalendar={},e.FullCalendar)}(this,function(e,r){"use strict";var t=function(){return(t=Object.assign||function(e){for(var r,t=1,n=arguments.length;t 0) { + this.everMovedDown = true; + } + if (xDelta < 0) { + this.everMovedLeft = true; + } + else if (xDelta > 0) { + this.everMovedRight = true; + } + this.pointerScreenX = pointerScreenX; + this.pointerScreenY = pointerScreenY; + if (!this.isAnimating) { + this.isAnimating = true; + this.requestAnimation(getTime()); + } + } + }; + AutoScroller.prototype.stop = function () { + if (this.isEnabled) { + this.isAnimating = false; // will stop animation + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + scrollCache.destroy(); + } + this.scrollCaches = null; + } + }; + AutoScroller.prototype.requestAnimation = function (now) { + this.msSinceRequest = now; + requestAnimationFrame(this.animate); + }; + AutoScroller.prototype.handleSide = function (edge, seconds) { + var scrollCache = edge.scrollCache; + var edgeThreshold = this.edgeThreshold; + var invDistance = edgeThreshold - edge.distance; + var velocity = // the closer to the edge, the faster we scroll + (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic + this.maxVelocity * seconds; + var sign = 1; + switch (edge.name) { + case 'left': + sign = -1; + // falls through + case 'right': + scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign); + break; + case 'top': + sign = -1; + // falls through + case 'bottom': + scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign); + break; + } + }; + // left/top are relative to document topleft + AutoScroller.prototype.computeBestEdge = function (left, top) { + var edgeThreshold = this.edgeThreshold; + var bestSide = null; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + var rect = scrollCache.clientRect; + var leftDist = left - rect.left; + var rightDist = rect.right - left; + var topDist = top - rect.top; + var bottomDist = rect.bottom - top; + // completely within the rect? + if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) { + if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() && + (!bestSide || bestSide.distance > topDist)) { + bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist }; + } + if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() && + (!bestSide || bestSide.distance > bottomDist)) { + bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist }; + } + if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() && + (!bestSide || bestSide.distance > leftDist)) { + bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist }; + } + if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() && + (!bestSide || bestSide.distance > rightDist)) { + bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist }; + } + } + } + return bestSide; + }; + AutoScroller.prototype.buildCaches = function () { + return this.queryScrollEls().map(function (el) { + if (el === window) { + return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls + } + else { + return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls + } + }); + }; + AutoScroller.prototype.queryScrollEls = function () { + var els = []; + for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) { + var query = _a[_i]; + if (typeof query === 'object') { + els.push(query); + } + else { + els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query))); + } + } + return els; + }; + return AutoScroller; + }()); + + /* + Monitors dragging on an element. Has a number of high-level features: + - minimum distance required before dragging + - minimum wait time ("delay") before dragging + - a mirror element that follows the pointer + */ + var FeaturefulElementDragging = /** @class */ (function (_super) { + __extends(FeaturefulElementDragging, _super); + function FeaturefulElementDragging(containerEl) { + var _this = _super.call(this, containerEl) || this; + // options that can be directly set by caller + // the caller can also set the PointerDragging's options as well + _this.delay = null; + _this.minDistance = 0; + _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag + _this.mirrorNeedsRevert = false; + _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup + _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation + _this.isDelayEnded = false; + _this.isDistanceSurpassed = false; + _this.delayTimeoutId = null; + _this.onPointerDown = function (ev) { + if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going + _this.isInteracting = true; + _this.isDelayEnded = false; + _this.isDistanceSurpassed = false; + core.preventSelection(document.body); + core.preventContextMenu(document.body); + // prevent links from being visited if there's an eventual drag. + // also prevents selection in older browsers (maybe?). + // not necessary for touch, besides, browser would complain about passiveness. + if (!ev.isTouch) { + ev.origEvent.preventDefault(); + } + _this.emitter.trigger('pointerdown', ev); + if (!_this.pointer.shouldIgnoreMove) { + // actions related to initiating dragstart+dragmove+dragend... + _this.mirror.setIsVisible(false); // reset. caller must set-visible + _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down + _this.startDelay(ev); + if (!_this.minDistance) { + _this.handleDistanceSurpassed(ev); + } + } + } + }; + _this.onPointerMove = function (ev) { + if (_this.isInteracting) { // if false, still waiting for previous drag's revert + _this.emitter.trigger('pointermove', ev); + if (!_this.isDistanceSurpassed) { + var minDistance = _this.minDistance; + var distanceSq = void 0; // current distance from the origin, squared + var deltaX = ev.deltaX, deltaY = ev.deltaY; + distanceSq = deltaX * deltaX + deltaY * deltaY; + if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem + _this.handleDistanceSurpassed(ev); + } + } + if (_this.isDragging) { + // a real pointer move? (not one simulated by scrolling) + if (ev.origEvent.type !== 'scroll') { + _this.mirror.handleMove(ev.pageX, ev.pageY); + _this.autoScroller.handleMove(ev.pageX, ev.pageY); + } + _this.emitter.trigger('dragmove', ev); + } + } + }; + _this.onPointerUp = function (ev) { + if (_this.isInteracting) { // if false, still waiting for previous drag's revert + _this.isInteracting = false; + core.allowSelection(document.body); + core.allowContextMenu(document.body); + _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert + if (_this.isDragging) { + _this.autoScroller.stop(); + _this.tryStopDrag(ev); // which will stop the mirror + } + if (_this.delayTimeoutId) { + clearTimeout(_this.delayTimeoutId); + _this.delayTimeoutId = null; + } + } + }; + var pointer = _this.pointer = new PointerDragging(containerEl); + pointer.emitter.on('pointerdown', _this.onPointerDown); + pointer.emitter.on('pointermove', _this.onPointerMove); + pointer.emitter.on('pointerup', _this.onPointerUp); + _this.mirror = new ElementMirror(); + _this.autoScroller = new AutoScroller(); + return _this; + } + FeaturefulElementDragging.prototype.destroy = function () { + this.pointer.destroy(); + }; + FeaturefulElementDragging.prototype.startDelay = function (ev) { + var _this = this; + if (typeof this.delay === 'number') { + this.delayTimeoutId = setTimeout(function () { + _this.delayTimeoutId = null; + _this.handleDelayEnd(ev); + }, this.delay); // not assignable to number! + } + else { + this.handleDelayEnd(ev); + } + }; + FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) { + this.isDelayEnded = true; + this.tryStartDrag(ev); + }; + FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) { + this.isDistanceSurpassed = true; + this.tryStartDrag(ev); + }; + FeaturefulElementDragging.prototype.tryStartDrag = function (ev) { + if (this.isDelayEnded && this.isDistanceSurpassed) { + if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) { + this.isDragging = true; + this.mirrorNeedsRevert = false; + this.autoScroller.start(ev.pageX, ev.pageY); + this.emitter.trigger('dragstart', ev); + if (this.touchScrollAllowed === false) { + this.pointer.cancelTouchScroll(); + } + } + } + }; + FeaturefulElementDragging.prototype.tryStopDrag = function (ev) { + // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events + // that come from the document to fire beforehand. much more convenient this way. + this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args + ); + }; + FeaturefulElementDragging.prototype.stopDrag = function (ev) { + this.isDragging = false; + this.emitter.trigger('dragend', ev); + }; + // fill in the implementations... + FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) { + this.pointer.shouldIgnoreMove = bool; + }; + FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) { + this.mirror.setIsVisible(bool); + }; + FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) { + this.mirrorNeedsRevert = bool; + }; + FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) { + this.autoScroller.isEnabled = bool; + }; + return FeaturefulElementDragging; + }(core.ElementDragging)); + + /* + When this class is instantiated, it records the offset of an element (relative to the document topleft), + and continues to monitor scrolling, updating the cached coordinates if it needs to. + Does not access the DOM after instantiation, so highly performant. + + Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element + and an determine if a given point is inside the combined clipping rectangle. + */ + var OffsetTracker = /** @class */ (function () { + function OffsetTracker(el) { + this.origRect = core.computeRect(el); + // will work fine for divs that have overflow:hidden + this.scrollCaches = core.getClippingParents(el).map(function (el) { + return new ElementScrollGeomCache(el, true); // listen=true + }); + } + OffsetTracker.prototype.destroy = function () { + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + scrollCache.destroy(); + } + }; + OffsetTracker.prototype.computeLeft = function () { + var left = this.origRect.left; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + left += scrollCache.origScrollLeft - scrollCache.getScrollLeft(); + } + return left; + }; + OffsetTracker.prototype.computeTop = function () { + var top = this.origRect.top; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + top += scrollCache.origScrollTop - scrollCache.getScrollTop(); + } + return top; + }; + OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) { + var point = { left: pageX, top: pageY }; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + if (!isIgnoredClipping(scrollCache.getEventTarget()) && + !core.pointInsideRect(point, scrollCache.clientRect)) { + return false; + } + } + return true; + }; + return OffsetTracker; + }()); + // certain clipping containers should never constrain interactions, like and + // https://github.com/fullcalendar/fullcalendar/issues/3615 + function isIgnoredClipping(node) { + var tagName = node.tagName; + return tagName === 'HTML' || tagName === 'BODY'; + } + + /* + Tracks movement over multiple droppable areas (aka "hits") + that exist in one or more DateComponents. + Relies on an existing draggable. + + emits: + - pointerdown + - dragstart + - hitchange - fires initially, even if not over a hit + - pointerup + - (hitchange - again, to null, if ended over a hit) + - dragend + */ + var HitDragging = /** @class */ (function () { + function HitDragging(dragging, droppableStore) { + var _this = this; + // options that can be set by caller + this.useSubjectCenter = false; + this.requireInitial = true; // if doesn't start out on a hit, won't emit any events + this.initialHit = null; + this.movingHit = null; + this.finalHit = null; // won't ever be populated if shouldIgnoreMove + this.handlePointerDown = function (ev) { + var dragging = _this.dragging; + _this.initialHit = null; + _this.movingHit = null; + _this.finalHit = null; + _this.prepareHits(); + _this.processFirstCoord(ev); + if (_this.initialHit || !_this.requireInitial) { + dragging.setIgnoreMove(false); + _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :( + } + else { + dragging.setIgnoreMove(true); + } + }; + this.handleDragStart = function (ev) { + _this.emitter.trigger('dragstart', ev); + _this.handleMove(ev, true); // force = fire even if initially null + }; + this.handleDragMove = function (ev) { + _this.emitter.trigger('dragmove', ev); + _this.handleMove(ev); + }; + this.handlePointerUp = function (ev) { + _this.releaseHits(); + _this.emitter.trigger('pointerup', ev); + }; + this.handleDragEnd = function (ev) { + if (_this.movingHit) { + _this.emitter.trigger('hitupdate', null, true, ev); + } + _this.finalHit = _this.movingHit; + _this.movingHit = null; + _this.emitter.trigger('dragend', ev); + }; + this.droppableStore = droppableStore; + dragging.emitter.on('pointerdown', this.handlePointerDown); + dragging.emitter.on('dragstart', this.handleDragStart); + dragging.emitter.on('dragmove', this.handleDragMove); + dragging.emitter.on('pointerup', this.handlePointerUp); + dragging.emitter.on('dragend', this.handleDragEnd); + this.dragging = dragging; + this.emitter = new core.EmitterMixin(); + } + // sets initialHit + // sets coordAdjust + HitDragging.prototype.processFirstCoord = function (ev) { + var origPoint = { left: ev.pageX, top: ev.pageY }; + var adjustedPoint = origPoint; + var subjectEl = ev.subjectEl; + var subjectRect; + if (subjectEl !== document) { + subjectRect = core.computeRect(subjectEl); + adjustedPoint = core.constrainPoint(adjustedPoint, subjectRect); + } + var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top); + if (initialHit) { + if (this.useSubjectCenter && subjectRect) { + var slicedSubjectRect = core.intersectRects(subjectRect, initialHit.rect); + if (slicedSubjectRect) { + adjustedPoint = core.getRectCenter(slicedSubjectRect); + } + } + this.coordAdjust = core.diffPoints(adjustedPoint, origPoint); + } + else { + this.coordAdjust = { left: 0, top: 0 }; + } + }; + HitDragging.prototype.handleMove = function (ev, forceHandle) { + var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top); + if (forceHandle || !isHitsEqual(this.movingHit, hit)) { + this.movingHit = hit; + this.emitter.trigger('hitupdate', hit, false, ev); + } + }; + HitDragging.prototype.prepareHits = function () { + this.offsetTrackers = core.mapHash(this.droppableStore, function (interactionSettings) { + interactionSettings.component.buildPositionCaches(); + return new OffsetTracker(interactionSettings.el); + }); + }; + HitDragging.prototype.releaseHits = function () { + var offsetTrackers = this.offsetTrackers; + for (var id in offsetTrackers) { + offsetTrackers[id].destroy(); + } + this.offsetTrackers = {}; + }; + HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) { + var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers; + var bestHit = null; + for (var id in droppableStore) { + var component = droppableStore[id].component; + var offsetTracker = offsetTrackers[id]; + if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) { + var originLeft = offsetTracker.computeLeft(); + var originTop = offsetTracker.computeTop(); + var positionLeft = offsetLeft - originLeft; + var positionTop = offsetTop - originTop; + var origRect = offsetTracker.origRect; + var width = origRect.right - origRect.left; + var height = origRect.bottom - origRect.top; + if ( + // must be within the element's bounds + positionLeft >= 0 && positionLeft < width && + positionTop >= 0 && positionTop < height) { + var hit = component.queryHit(positionLeft, positionTop, width, height); + if (hit && + ( + // make sure the hit is within activeRange, meaning it's not a deal cell + !component.props.dateProfile || // hack for DayTile + core.rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) && + (!bestHit || hit.layer > bestHit.layer)) { + // TODO: better way to re-orient rectangle + hit.rect.left += originLeft; + hit.rect.right += originLeft; + hit.rect.top += originTop; + hit.rect.bottom += originTop; + bestHit = hit; + } + } + } + } + return bestHit; + }; + return HitDragging; + }()); + function isHitsEqual(hit0, hit1) { + if (!hit0 && !hit1) { + return true; + } + if (Boolean(hit0) !== Boolean(hit1)) { + return false; + } + return core.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan); + } + + /* + Monitors when the user clicks on a specific date/time of a component. + A pointerdown+pointerup on the same "hit" constitutes a click. + */ + var DateClicking = /** @class */ (function (_super) { + __extends(DateClicking, _super); + function DateClicking(settings) { + var _this = _super.call(this, settings) || this; + _this.handlePointerDown = function (ev) { + var dragging = _this.dragging; + // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired + dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl)); + }; + // won't even fire if moving was ignored + _this.handleDragEnd = function (ev) { + var component = _this.component; + var pointer = _this.dragging.pointer; + if (!pointer.wasTouchScroll) { + var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit; + if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) { + component.calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, component.view, ev.origEvent); + } + } + }; + var component = settings.component; + // we DO want to watch pointer moves because otherwise finalHit won't get populated + _this.dragging = new FeaturefulElementDragging(component.el); + _this.dragging.autoScroller.isEnabled = false; + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings)); + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragend', _this.handleDragEnd); + return _this; + } + DateClicking.prototype.destroy = function () { + this.dragging.destroy(); + }; + return DateClicking; + }(core.Interaction)); + + /* + Tracks when the user selects a portion of time of a component, + constituted by a drag over date cells, with a possible delay at the beginning of the drag. + */ + var DateSelecting = /** @class */ (function (_super) { + __extends(DateSelecting, _super); + function DateSelecting(settings) { + var _this = _super.call(this, settings) || this; + _this.dragSelection = null; + _this.handlePointerDown = function (ev) { + var _a = _this, component = _a.component, dragging = _a.dragging; + var canSelect = component.opt('selectable') && + component.isValidDateDownEl(ev.origEvent.target); + // don't bother to watch expensive moves if component won't do selection + dragging.setIgnoreMove(!canSelect); + // if touch, require user to hold down + dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null; + }; + _this.handleDragStart = function (ev) { + _this.component.calendar.unselect(ev); // unselect previous selections + }; + _this.handleHitUpdate = function (hit, isFinal) { + var calendar = _this.component.calendar; + var dragSelection = null; + var isInvalid = false; + if (hit) { + dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers); + if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) { + isInvalid = true; + dragSelection = null; + } + } + if (dragSelection) { + calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection }); + } + else if (!isFinal) { // only unselect if moved away while dragging + calendar.dispatch({ type: 'UNSELECT_DATES' }); + } + if (!isInvalid) { + core.enableCursor(); + } + else { + core.disableCursor(); + } + if (!isFinal) { + _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging + } + }; + _this.handlePointerUp = function (pev) { + if (_this.dragSelection) { + // selection is already rendered, so just need to report selection + _this.component.calendar.triggerDateSelect(_this.dragSelection, pev); + _this.dragSelection = null; + } + }; + var component = settings.component; + var dragging = _this.dragging = new FeaturefulElementDragging(component.el); + dragging.touchScrollAllowed = false; + dragging.minDistance = component.opt('selectMinDistance') || 0; + dragging.autoScroller.isEnabled = component.opt('dragScroll'); + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings)); + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragstart', _this.handleDragStart); + hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); + hitDragging.emitter.on('pointerup', _this.handlePointerUp); + return _this; + } + DateSelecting.prototype.destroy = function () { + this.dragging.destroy(); + }; + return DateSelecting; + }(core.Interaction)); + function getComponentTouchDelay(component) { + var delay = component.opt('selectLongPressDelay'); + if (delay == null) { + delay = component.opt('longPressDelay'); + } + return delay; + } + function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) { + var dateSpan0 = hit0.dateSpan; + var dateSpan1 = hit1.dateSpan; + var ms = [ + dateSpan0.range.start, + dateSpan0.range.end, + dateSpan1.range.start, + dateSpan1.range.end + ]; + ms.sort(core.compareNumbers); + var props = {}; + for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) { + var transformer = dateSelectionTransformers_1[_i]; + var res = transformer(hit0, hit1); + if (res === false) { + return null; + } + else if (res) { + __assign(props, res); + } + } + props.range = { start: ms[0], end: ms[3] }; + props.allDay = dateSpan0.allDay; + return props; + } + + var EventDragging = /** @class */ (function (_super) { + __extends(EventDragging, _super); + function EventDragging(settings) { + var _this = _super.call(this, settings) || this; + // internal state + _this.subjectSeg = null; // the seg being selected/dragged + _this.isDragging = false; + _this.eventRange = null; + _this.relevantEvents = null; // the events being dragged + _this.receivingCalendar = null; + _this.validMutation = null; + _this.mutatedRelevantEvents = null; + _this.handlePointerDown = function (ev) { + var origTarget = ev.origEvent.target; + var _a = _this, component = _a.component, dragging = _a.dragging; + var mirror = dragging.mirror; + var initialCalendar = component.calendar; + var subjectSeg = _this.subjectSeg = core.getElSeg(ev.subjectEl); + var eventRange = _this.eventRange = subjectSeg.eventRange; + var eventInstanceId = eventRange.instance.instanceId; + _this.relevantEvents = core.getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId); + dragging.minDistance = ev.isTouch ? 0 : component.opt('eventDragMinDistance'); + dragging.delay = + // only do a touch delay if touch and this event hasn't been selected yet + (ev.isTouch && eventInstanceId !== component.props.eventSelection) ? + getComponentTouchDelay$1(component) : + null; + mirror.parentNode = initialCalendar.el; + mirror.revertDuration = component.opt('dragRevertDuration'); + var isValid = component.isValidSegDownEl(origTarget) && + !core.elementClosest(origTarget, '.fc-resizer'); // NOT on a resizer + dragging.setIgnoreMove(!isValid); + // disable dragging for elements that are resizable (ie, selectable) + // but are not draggable + _this.isDragging = isValid && + ev.subjectEl.classList.contains('fc-draggable'); + }; + _this.handleDragStart = function (ev) { + var initialCalendar = _this.component.calendar; + var eventRange = _this.eventRange; + var eventInstanceId = eventRange.instance.instanceId; + if (ev.isTouch) { + // need to select a different event? + if (eventInstanceId !== _this.component.props.eventSelection) { + initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId }); + } + } + else { + // if now using mouse, but was previous touch interaction, clear selected event + initialCalendar.dispatch({ type: 'UNSELECT_EVENT' }); + } + if (_this.isDragging) { + initialCalendar.unselect(ev); // unselect *date* selection + initialCalendar.publiclyTrigger('eventDragStart', [ + { + el: _this.subjectSeg.el, + event: new core.EventApi(initialCalendar, eventRange.def, eventRange.instance), + jsEvent: ev.origEvent, + view: _this.component.view + } + ]); + } + }; + _this.handleHitUpdate = function (hit, isFinal) { + if (!_this.isDragging) { + return; + } + var relevantEvents = _this.relevantEvents; + var initialHit = _this.hitDragging.initialHit; + var initialCalendar = _this.component.calendar; + // states based on new hit + var receivingCalendar = null; + var mutation = null; + var mutatedRelevantEvents = null; + var isInvalid = false; + var interaction = { + affectedEvents: relevantEvents, + mutatedEvents: core.createEmptyEventStore(), + isEvent: true, + origSeg: _this.subjectSeg + }; + if (hit) { + var receivingComponent = hit.component; + receivingCalendar = receivingComponent.calendar; + if (initialCalendar === receivingCalendar || + receivingComponent.opt('editable') && receivingComponent.opt('droppable')) { + mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers); + if (mutation) { + mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar); + interaction.mutatedEvents = mutatedRelevantEvents; + if (!receivingComponent.isInteractionValid(interaction)) { + isInvalid = true; + mutation = null; + mutatedRelevantEvents = null; + interaction.mutatedEvents = core.createEmptyEventStore(); + } + } + } + else { + receivingCalendar = null; + } + } + _this.displayDrag(receivingCalendar, interaction); + if (!isInvalid) { + core.enableCursor(); + } + else { + core.disableCursor(); + } + if (!isFinal) { + if (initialCalendar === receivingCalendar && // TODO: write test for this + isHitsEqual(initialHit, hit)) { + mutation = null; + } + _this.dragging.setMirrorNeedsRevert(!mutation); + // render the mirror if no already-rendered mirror + // TODO: wish we could somehow wait for dispatch to guarantee render + _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror')); + // assign states based on new hit + _this.receivingCalendar = receivingCalendar; + _this.validMutation = mutation; + _this.mutatedRelevantEvents = mutatedRelevantEvents; + } + }; + _this.handlePointerUp = function () { + if (!_this.isDragging) { + _this.cleanup(); // because handleDragEnd won't fire + } + }; + _this.handleDragEnd = function (ev) { + if (_this.isDragging) { + var initialCalendar_1 = _this.component.calendar; + var initialView = _this.component.view; + var _a = _this, receivingCalendar = _a.receivingCalendar, validMutation = _a.validMutation; + var eventDef = _this.eventRange.def; + var eventInstance = _this.eventRange.instance; + var eventApi = new core.EventApi(initialCalendar_1, eventDef, eventInstance); + var relevantEvents_1 = _this.relevantEvents; + var mutatedRelevantEvents = _this.mutatedRelevantEvents; + var finalHit = _this.hitDragging.finalHit; + _this.clearDrag(); // must happen after revert animation + initialCalendar_1.publiclyTrigger('eventDragStop', [ + { + el: _this.subjectSeg.el, + event: eventApi, + jsEvent: ev.origEvent, + view: initialView + } + ]); + if (validMutation) { + // dropped within same calendar + if (receivingCalendar === initialCalendar_1) { + initialCalendar_1.dispatch({ + type: 'MERGE_EVENTS', + eventStore: mutatedRelevantEvents + }); + var transformed = {}; + for (var _i = 0, _b = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _b.length; _i++) { + var transformer = _b[_i]; + __assign(transformed, transformer(validMutation, initialCalendar_1)); + } + var eventDropArg = __assign({}, transformed, { el: ev.subjectEl, delta: validMutation.datesDelta, oldEvent: eventApi, event: new core.EventApi(// the data AFTER the mutation + initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), revert: function () { + initialCalendar_1.dispatch({ + type: 'MERGE_EVENTS', + eventStore: relevantEvents_1 + }); + }, jsEvent: ev.origEvent, view: initialView }); + initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]); + // dropped in different calendar + } + else if (receivingCalendar) { + initialCalendar_1.publiclyTrigger('eventLeave', [ + { + draggedEl: ev.subjectEl, + event: eventApi, + view: initialView + } + ]); + initialCalendar_1.dispatch({ + type: 'REMOVE_EVENT_INSTANCES', + instances: _this.mutatedRelevantEvents.instances + }); + receivingCalendar.dispatch({ + type: 'MERGE_EVENTS', + eventStore: _this.mutatedRelevantEvents + }); + if (ev.isTouch) { + receivingCalendar.dispatch({ + type: 'SELECT_EVENT', + eventInstanceId: eventInstance.instanceId + }); + } + var dropArg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.component // should this be finalHit.component.view? See #4644 + }); + receivingCalendar.publiclyTrigger('drop', [dropArg]); + receivingCalendar.publiclyTrigger('eventReceive', [ + { + draggedEl: ev.subjectEl, + event: new core.EventApi(// the data AFTER the mutation + receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]), + view: finalHit.component // should this be finalHit.component.view? See #4644 + } + ]); + } + } + else { + initialCalendar_1.publiclyTrigger('_noEventDrop'); + } + } + _this.cleanup(); + }; + var component = _this.component; + var dragging = _this.dragging = new FeaturefulElementDragging(component.el); + dragging.pointer.selector = EventDragging.SELECTOR; + dragging.touchScrollAllowed = false; + dragging.autoScroller.isEnabled = component.opt('dragScroll'); + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsStore); + hitDragging.useSubjectCenter = settings.useEventCenter; + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragstart', _this.handleDragStart); + hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); + hitDragging.emitter.on('pointerup', _this.handlePointerUp); + hitDragging.emitter.on('dragend', _this.handleDragEnd); + return _this; + } + EventDragging.prototype.destroy = function () { + this.dragging.destroy(); + }; + // render a drag state on the next receivingCalendar + EventDragging.prototype.displayDrag = function (nextCalendar, state) { + var initialCalendar = this.component.calendar; + var prevCalendar = this.receivingCalendar; + // does the previous calendar need to be cleared? + if (prevCalendar && prevCalendar !== nextCalendar) { + // does the initial calendar need to be cleared? + // if so, don't clear all the way. we still need to to hide the affectedEvents + if (prevCalendar === initialCalendar) { + prevCalendar.dispatch({ + type: 'SET_EVENT_DRAG', + state: { + affectedEvents: state.affectedEvents, + mutatedEvents: core.createEmptyEventStore(), + isEvent: true, + origSeg: state.origSeg + } + }); + // completely clear the old calendar if it wasn't the initial + } + else { + prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + } + if (nextCalendar) { + nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state }); + } + }; + EventDragging.prototype.clearDrag = function () { + var initialCalendar = this.component.calendar; + var receivingCalendar = this.receivingCalendar; + if (receivingCalendar) { + receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + // the initial calendar might have an dummy drag state from displayDrag + if (initialCalendar !== receivingCalendar) { + initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + }; + EventDragging.prototype.cleanup = function () { + this.subjectSeg = null; + this.isDragging = false; + this.eventRange = null; + this.relevantEvents = null; + this.receivingCalendar = null; + this.validMutation = null; + this.mutatedRelevantEvents = null; + }; + EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11 + return EventDragging; + }(core.Interaction)); + function computeEventMutation(hit0, hit1, massagers) { + var dateSpan0 = hit0.dateSpan; + var dateSpan1 = hit1.dateSpan; + var date0 = dateSpan0.range.start; + var date1 = dateSpan1.range.start; + var standardProps = {}; + if (dateSpan0.allDay !== dateSpan1.allDay) { + standardProps.allDay = dateSpan1.allDay; + standardProps.hasEnd = hit1.component.opt('allDayMaintainDuration'); + if (dateSpan1.allDay) { + // means date1 is already start-of-day, + // but date0 needs to be converted + date0 = core.startOfDay(date0); + } + } + var delta = core.diffDates(date0, date1, hit0.component.dateEnv, hit0.component === hit1.component ? + hit0.component.largeUnit : + null); + if (delta.milliseconds) { // has hours/minutes/seconds + standardProps.allDay = false; + } + var mutation = { + datesDelta: delta, + standardProps: standardProps + }; + for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) { + var massager = massagers_1[_i]; + massager(mutation, hit0, hit1); + } + return mutation; + } + function getComponentTouchDelay$1(component) { + var delay = component.opt('eventLongPressDelay'); + if (delay == null) { + delay = component.opt('longPressDelay'); + } + return delay; + } + + var EventDragging$1 = /** @class */ (function (_super) { + __extends(EventDragging, _super); + function EventDragging(settings) { + var _this = _super.call(this, settings) || this; + // internal state + _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg? + _this.eventRange = null; + _this.relevantEvents = null; + _this.validMutation = null; + _this.mutatedRelevantEvents = null; + _this.handlePointerDown = function (ev) { + var component = _this.component; + var seg = _this.querySeg(ev); + var eventRange = _this.eventRange = seg.eventRange; + _this.dragging.minDistance = component.opt('eventDragMinDistance'); + // if touch, need to be working with a selected event + _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) || + (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId)); + }; + _this.handleDragStart = function (ev) { + var calendar = _this.component.calendar; + var eventRange = _this.eventRange; + _this.relevantEvents = core.getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId); + _this.draggingSeg = _this.querySeg(ev); + calendar.unselect(); + calendar.publiclyTrigger('eventResizeStart', [ + { + el: _this.draggingSeg.el, + event: new core.EventApi(calendar, eventRange.def, eventRange.instance), + jsEvent: ev.origEvent, + view: _this.component.view + } + ]); + }; + _this.handleHitUpdate = function (hit, isFinal, ev) { + var calendar = _this.component.calendar; + var relevantEvents = _this.relevantEvents; + var initialHit = _this.hitDragging.initialHit; + var eventInstance = _this.eventRange.instance; + var mutation = null; + var mutatedRelevantEvents = null; + var isInvalid = false; + var interaction = { + affectedEvents: relevantEvents, + mutatedEvents: core.createEmptyEventStore(), + isEvent: true, + origSeg: _this.draggingSeg + }; + if (hit) { + mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms); + } + if (mutation) { + mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar); + interaction.mutatedEvents = mutatedRelevantEvents; + if (!_this.component.isInteractionValid(interaction)) { + isInvalid = true; + mutation = null; + mutatedRelevantEvents = null; + interaction.mutatedEvents = null; + } + } + if (mutatedRelevantEvents) { + calendar.dispatch({ + type: 'SET_EVENT_RESIZE', + state: interaction + }); + } + else { + calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' }); + } + if (!isInvalid) { + core.enableCursor(); + } + else { + core.disableCursor(); + } + if (!isFinal) { + if (mutation && isHitsEqual(initialHit, hit)) { + mutation = null; + } + _this.validMutation = mutation; + _this.mutatedRelevantEvents = mutatedRelevantEvents; + } + }; + _this.handleDragEnd = function (ev) { + var calendar = _this.component.calendar; + var view = _this.component.view; + var eventDef = _this.eventRange.def; + var eventInstance = _this.eventRange.instance; + var eventApi = new core.EventApi(calendar, eventDef, eventInstance); + var relevantEvents = _this.relevantEvents; + var mutatedRelevantEvents = _this.mutatedRelevantEvents; + calendar.publiclyTrigger('eventResizeStop', [ + { + el: _this.draggingSeg.el, + event: eventApi, + jsEvent: ev.origEvent, + view: view + } + ]); + if (_this.validMutation) { + calendar.dispatch({ + type: 'MERGE_EVENTS', + eventStore: mutatedRelevantEvents + }); + calendar.publiclyTrigger('eventResize', [ + { + el: _this.draggingSeg.el, + startDelta: _this.validMutation.startDelta || core.createDuration(0), + endDelta: _this.validMutation.endDelta || core.createDuration(0), + prevEvent: eventApi, + event: new core.EventApi(// the data AFTER the mutation + calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), + revert: function () { + calendar.dispatch({ + type: 'MERGE_EVENTS', + eventStore: relevantEvents + }); + }, + jsEvent: ev.origEvent, + view: view + } + ]); + } + else { + calendar.publiclyTrigger('_noEventResize'); + } + // reset all internal state + _this.draggingSeg = null; + _this.relevantEvents = null; + _this.validMutation = null; + // okay to keep eventInstance around. useful to set it in handlePointerDown + }; + var component = settings.component; + var dragging = _this.dragging = new FeaturefulElementDragging(component.el); + dragging.pointer.selector = '.fc-resizer'; + dragging.touchScrollAllowed = false; + dragging.autoScroller.isEnabled = component.opt('dragScroll'); + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings)); + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragstart', _this.handleDragStart); + hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); + hitDragging.emitter.on('dragend', _this.handleDragEnd); + return _this; + } + EventDragging.prototype.destroy = function () { + this.dragging.destroy(); + }; + EventDragging.prototype.querySeg = function (ev) { + return core.getElSeg(core.elementClosest(ev.subjectEl, this.component.fgSegSelector)); + }; + return EventDragging; + }(core.Interaction)); + function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) { + var dateEnv = hit0.component.dateEnv; + var date0 = hit0.dateSpan.range.start; + var date1 = hit1.dateSpan.range.start; + var delta = core.diffDates(date0, date1, dateEnv, hit0.component.largeUnit); + var props = {}; + for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) { + var transform = transforms_1[_i]; + var res = transform(hit0, hit1); + if (res === false) { + return null; + } + else if (res) { + __assign(props, res); + } + } + if (isFromStart) { + if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) { + props.startDelta = delta; + return props; + } + } + else { + if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) { + props.endDelta = delta; + return props; + } + } + return null; + } + + var UnselectAuto = /** @class */ (function () { + function UnselectAuto(calendar) { + var _this = this; + this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system + this.onSelect = function (selectInfo) { + if (selectInfo.jsEvent) { + _this.isRecentPointerDateSelect = true; + } + }; + this.onDocumentPointerUp = function (pev) { + var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer; + var state = calendar.state; + // touch-scrolling should never unfocus any type of selection + if (!documentPointer.wasTouchScroll) { + if (state.dateSelection && // an existing date selection? + !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp? + ) { + var unselectAuto = calendar.viewOpt('unselectAuto'); + var unselectCancel = calendar.viewOpt('unselectCancel'); + if (unselectAuto && (!unselectAuto || !core.elementClosest(documentPointer.downEl, unselectCancel))) { + calendar.unselect(pev); + } + } + if (state.eventSelection && // an existing event selected? + !core.elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event + ) { + calendar.dispatch({ type: 'UNSELECT_EVENT' }); + } + } + _this.isRecentPointerDateSelect = false; + }; + this.calendar = calendar; + var documentPointer = this.documentPointer = new PointerDragging(document); + documentPointer.shouldIgnoreMove = true; + documentPointer.shouldWatchScroll = false; + documentPointer.emitter.on('pointerup', this.onDocumentPointerUp); + /* + TODO: better way to know about whether there was a selection with the pointer + */ + calendar.on('select', this.onSelect); + } + UnselectAuto.prototype.destroy = function () { + this.calendar.off('select', this.onSelect); + this.documentPointer.destroy(); + }; + return UnselectAuto; + }()); + + /* + Given an already instantiated draggable object for one-or-more elements, + Interprets any dragging as an attempt to drag an events that lives outside + of a calendar onto a calendar. + */ + var ExternalElementDragging = /** @class */ (function () { + function ExternalElementDragging(dragging, suppliedDragMeta) { + var _this = this; + this.receivingCalendar = null; + this.droppableEvent = null; // will exist for all drags, even if create:false + this.suppliedDragMeta = null; + this.dragMeta = null; + this.handleDragStart = function (ev) { + _this.dragMeta = _this.buildDragMeta(ev.subjectEl); + }; + this.handleHitUpdate = function (hit, isFinal, ev) { + var dragging = _this.hitDragging.dragging; + var receivingCalendar = null; + var droppableEvent = null; + var isInvalid = false; + var interaction = { + affectedEvents: core.createEmptyEventStore(), + mutatedEvents: core.createEmptyEventStore(), + isEvent: _this.dragMeta.create, + origSeg: null + }; + if (hit) { + receivingCalendar = hit.component.calendar; + if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) { + droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar); + interaction.mutatedEvents = core.eventTupleToStore(droppableEvent); + isInvalid = !core.isInteractionValid(interaction, receivingCalendar); + if (isInvalid) { + interaction.mutatedEvents = core.createEmptyEventStore(); + droppableEvent = null; + } + } + } + _this.displayDrag(receivingCalendar, interaction); + // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?) + // TODO: wish we could somehow wait for dispatch to guarantee render + dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror')); + if (!isInvalid) { + core.enableCursor(); + } + else { + core.disableCursor(); + } + if (!isFinal) { + dragging.setMirrorNeedsRevert(!droppableEvent); + _this.receivingCalendar = receivingCalendar; + _this.droppableEvent = droppableEvent; + } + }; + this.handleDragEnd = function (pev) { + var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent; + _this.clearDrag(); + if (receivingCalendar && droppableEvent) { + var finalHit = _this.hitDragging.finalHit; + var finalView = finalHit.component.view; + var dragMeta = _this.dragMeta; + var arg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView }); + receivingCalendar.publiclyTrigger('drop', [arg]); + if (dragMeta.create) { + receivingCalendar.dispatch({ + type: 'MERGE_EVENTS', + eventStore: core.eventTupleToStore(droppableEvent) + }); + if (pev.isTouch) { + receivingCalendar.dispatch({ + type: 'SELECT_EVENT', + eventInstanceId: droppableEvent.instance.instanceId + }); + } + // signal that an external event landed + receivingCalendar.publiclyTrigger('eventReceive', [ + { + draggedEl: pev.subjectEl, + event: new core.EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance), + view: finalView + } + ]); + } + } + _this.receivingCalendar = null; + _this.droppableEvent = null; + }; + var hitDragging = this.hitDragging = new HitDragging(dragging, core.interactionSettingsStore); + hitDragging.requireInitial = false; // will start outside of a component + hitDragging.emitter.on('dragstart', this.handleDragStart); + hitDragging.emitter.on('hitupdate', this.handleHitUpdate); + hitDragging.emitter.on('dragend', this.handleDragEnd); + this.suppliedDragMeta = suppliedDragMeta; + } + ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) { + if (typeof this.suppliedDragMeta === 'object') { + return core.parseDragMeta(this.suppliedDragMeta); + } + else if (typeof this.suppliedDragMeta === 'function') { + return core.parseDragMeta(this.suppliedDragMeta(subjectEl)); + } + else { + return getDragMetaFromEl(subjectEl); + } + }; + ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) { + var prevCalendar = this.receivingCalendar; + if (prevCalendar && prevCalendar !== nextCalendar) { + prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + if (nextCalendar) { + nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state }); + } + }; + ExternalElementDragging.prototype.clearDrag = function () { + if (this.receivingCalendar) { + this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + }; + ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) { + var dropAccept = receivingCalendar.opt('dropAccept'); + if (typeof dropAccept === 'function') { + return dropAccept(el); + } + else if (typeof dropAccept === 'string' && dropAccept) { + return Boolean(core.elementMatches(el, dropAccept)); + } + return true; + }; + return ExternalElementDragging; + }()); + // Utils for computing event store from the DragMeta + // ---------------------------------------------------------------------------------------------------- + function computeEventForDateSpan(dateSpan, dragMeta, calendar) { + var defProps = __assign({}, dragMeta.leftoverProps); + for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) { + var transform = _a[_i]; + __assign(defProps, transform(dateSpan, dragMeta)); + } + var def = core.parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd + calendar); + var start = dateSpan.range.start; + // only rely on time info if drop zone is all-day, + // otherwise, we already know the time + if (dateSpan.allDay && dragMeta.startTime) { + start = calendar.dateEnv.add(start, dragMeta.startTime); + } + var end = dragMeta.duration ? + calendar.dateEnv.add(start, dragMeta.duration) : + calendar.getDefaultEventEnd(dateSpan.allDay, start); + var instance = core.createEventInstance(def.defId, { start: start, end: end }); + return { def: def, instance: instance }; + } + // Utils for extracting data from element + // ---------------------------------------------------------------------------------------------------- + function getDragMetaFromEl(el) { + var str = getEmbeddedElData(el, 'event'); + var obj = str ? + JSON.parse(str) : + { create: false }; // if no embedded data, assume no event creation + return core.parseDragMeta(obj); + } + core.config.dataAttrPrefix = ''; + function getEmbeddedElData(el, name) { + var prefix = core.config.dataAttrPrefix; + var prefixedName = (prefix ? prefix + '-' : '') + name; + return el.getAttribute('data-' + prefixedName) || ''; + } + + /* + Makes an element (that is *external* to any calendar) draggable. + Can pass in data that determines how an event will be created when dropped onto a calendar. + Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system. + */ + var ExternalDraggable = /** @class */ (function () { + function ExternalDraggable(el, settings) { + var _this = this; + if (settings === void 0) { settings = {}; } + this.handlePointerDown = function (ev) { + var dragging = _this.dragging; + var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay; + dragging.minDistance = + minDistance != null ? + minDistance : + (ev.isTouch ? 0 : core.globalDefaults.eventDragMinDistance); + dragging.delay = + ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv + (longPressDelay != null ? longPressDelay : core.globalDefaults.longPressDelay) : + 0; + }; + this.handleDragStart = function (ev) { + if (ev.isTouch && + _this.dragging.delay && + ev.subjectEl.classList.contains('fc-event')) { + _this.dragging.mirror.getMirrorEl().classList.add('fc-selected'); + } + }; + this.settings = settings; + var dragging = this.dragging = new FeaturefulElementDragging(el); + dragging.touchScrollAllowed = false; + if (settings.itemSelector != null) { + dragging.pointer.selector = settings.itemSelector; + } + if (settings.appendTo != null) { + dragging.mirror.parentNode = settings.appendTo; // TODO: write tests + } + dragging.emitter.on('pointerdown', this.handlePointerDown); + dragging.emitter.on('dragstart', this.handleDragStart); + new ExternalElementDragging(dragging, settings.eventData); + } + ExternalDraggable.prototype.destroy = function () { + this.dragging.destroy(); + }; + return ExternalDraggable; + }()); + + /* + Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements. + The third-party system is responsible for drawing the visuals effects of the drag. + This class simply monitors for pointer movements and fires events. + It also has the ability to hide the moving element (the "mirror") during the drag. + */ + var InferredElementDragging = /** @class */ (function (_super) { + __extends(InferredElementDragging, _super); + function InferredElementDragging(containerEl) { + var _this = _super.call(this, containerEl) || this; + _this.shouldIgnoreMove = false; + _this.mirrorSelector = ''; + _this.currentMirrorEl = null; + _this.handlePointerDown = function (ev) { + _this.emitter.trigger('pointerdown', ev); + if (!_this.shouldIgnoreMove) { + // fire dragstart right away. does not support delay or min-distance + _this.emitter.trigger('dragstart', ev); + } + }; + _this.handlePointerMove = function (ev) { + if (!_this.shouldIgnoreMove) { + _this.emitter.trigger('dragmove', ev); + } + }; + _this.handlePointerUp = function (ev) { + _this.emitter.trigger('pointerup', ev); + if (!_this.shouldIgnoreMove) { + // fire dragend right away. does not support a revert animation + _this.emitter.trigger('dragend', ev); + } + }; + var pointer = _this.pointer = new PointerDragging(containerEl); + pointer.emitter.on('pointerdown', _this.handlePointerDown); + pointer.emitter.on('pointermove', _this.handlePointerMove); + pointer.emitter.on('pointerup', _this.handlePointerUp); + return _this; + } + InferredElementDragging.prototype.destroy = function () { + this.pointer.destroy(); + }; + InferredElementDragging.prototype.setIgnoreMove = function (bool) { + this.shouldIgnoreMove = bool; + }; + InferredElementDragging.prototype.setMirrorIsVisible = function (bool) { + if (bool) { + // restore a previously hidden element. + // use the reference in case the selector class has already been removed. + if (this.currentMirrorEl) { + this.currentMirrorEl.style.visibility = ''; + this.currentMirrorEl = null; + } + } + else { + var mirrorEl = this.mirrorSelector ? + document.querySelector(this.mirrorSelector) : + null; + if (mirrorEl) { + this.currentMirrorEl = mirrorEl; + mirrorEl.style.visibility = 'hidden'; + } + } + }; + return InferredElementDragging; + }(core.ElementDragging)); + + /* + Bridges third-party drag-n-drop systems with FullCalendar. + Must be instantiated and destroyed by caller. + */ + var ThirdPartyDraggable = /** @class */ (function () { + function ThirdPartyDraggable(containerOrSettings, settings) { + var containerEl = document; + if ( + // wish we could just test instanceof EventTarget, but doesn't work in IE11 + containerOrSettings === document || + containerOrSettings instanceof Element) { + containerEl = containerOrSettings; + settings = settings || {}; + } + else { + settings = (containerOrSettings || {}); + } + var dragging = this.dragging = new InferredElementDragging(containerEl); + if (typeof settings.itemSelector === 'string') { + dragging.pointer.selector = settings.itemSelector; + } + else if (containerEl === document) { + dragging.pointer.selector = '[data-event]'; + } + if (typeof settings.mirrorSelector === 'string') { + dragging.mirrorSelector = settings.mirrorSelector; + } + new ExternalElementDragging(dragging, settings.eventData); + } + ThirdPartyDraggable.prototype.destroy = function () { + this.dragging.destroy(); + }; + return ThirdPartyDraggable; + }()); + + var main = core.createPlugin({ + componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1], + calendarInteractions: [UnselectAuto], + elementDraggingImpl: FeaturefulElementDragging + }); + + exports.Draggable = ExternalDraggable; + exports.FeaturefulElementDragging = FeaturefulElementDragging; + exports.PointerDragging = PointerDragging; + exports.ThirdPartyDraggable = ThirdPartyDraggable; + exports.default = main; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/interaction/main.min.js b/src/main/resources/static/assets/libs/fullcalendar/interaction/main.min.js new file mode 100644 index 0000000..7a36731 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/interaction/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Interaction Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarInteraction={},e.FullCalendar)}(this,function(e,t){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var i=function(){return(i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&(this.everMovedDown=!0),o<0?this.everMovedLeft=!0:o>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(p()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e=0&&c>=0&&d>=0&&g>=0&&(d<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"top",distance:d}),g<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>g)&&(r={scrollCache:a,name:"bottom",distance:g}),s<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>s)&&(r={scrollCache:a,name:"left",distance:s}),c<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"right",distance:c}))}return r},e.prototype.buildCaches=function(){return this.queryScrollEls().map(function(e){return e===window?new h(!1):new u(e,!1)})},e.prototype.queryScrollEls=function(){for(var e=[],t=0,n=this.scrollQuery;t=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,t.allowSelection(document.body),t.allowContextMenu(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var i=r.pointer=new s(n);return i.emitter.on("pointerdown",r.onPointerDown),i.emitter.on("pointermove",r.onPointerMove),i.emitter.on("pointerup",r.onPointerUp),r.mirror=new d,r.autoScroller=new v,r}return r(n,e),n.prototype.destroy=function(){this.pointer.destroy()},n.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout(function(){t.delayTimeoutId=null,t.handleDelayEnd(e)},this.delay):this.handleDelayEnd(e)},n.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},n.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},n.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},n.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},n.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},n.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},n.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},n.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},n.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},n}(t.ElementDragging),E=function(){function e(e){this.origRect=t.computeRect(e),this.scrollCaches=t.getClippingParents(e).map(function(e){return new u(e,!0)})}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e=0&&g=0&&uo.layer)||(f.rect.left+=c,f.rect.right+=c,f.rect.top+=d,f.rect.bottom+=d,o=f)}}}return o},e}();function S(e,n){return!e&&!n||Boolean(e)===Boolean(n)&&t.isDateSpansEqual(e.dateSpan,n.dateSpan)}var y=function(e){function n(n){var r=e.call(this,n)||this;r.handlePointerDown=function(e){var t=r.dragging;t.setIgnoreMove(!r.component.isValidDateDownEl(t.pointer.downEl))},r.handleDragEnd=function(e){var t=r.component;if(!r.dragging.pointer.wasTouchScroll){var n=r.hitDragging,i=n.initialHit,o=n.finalHit;i&&o&&S(i,o)&&t.calendar.triggerDateClick(i.dateSpan,i.dayEl,t.view,e.origEvent)}};var i=n.component;r.dragging=new f(i.el),r.dragging.autoScroller.isEnabled=!1;var o=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return o.emitter.on("pointerdown",r.handlePointerDown),o.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n}(t.Interaction),D=function(e){function n(n){var r=e.call(this,n)||this;r.dragSelection=null,r.handlePointerDown=function(e){var t=r,n=t.component,i=t.dragging,o=n.opt("selectable")&&n.isValidDateDownEl(e.origEvent.target);i.setIgnoreMove(!o),i.delay=e.isTouch?function(e){var t=e.opt("selectLongPressDelay");null==t&&(t=e.opt("longPressDelay"));return t}(n):null},r.handleDragStart=function(e){r.component.calendar.unselect(e)},r.handleHitUpdate=function(e,n){var o=r.component.calendar,a=null,l=!1;e&&((a=function(e,n,r){var o=e.dateSpan,a=n.dateSpan,l=[o.range.start,o.range.end,a.range.start,a.range.end];l.sort(t.compareNumbers);for(var s={},c=0,d=r;co.start)return g.endDelta=d,g;return null}(s,e,o.subjectEl.classList.contains("fc-start-resizer"),c.range,a.pluginSystem.hooks.eventResizeJoinTransforms)),d&&(g=t.applyMutationToEventStore(l,a.eventUiBases,d,a),h.mutatedEvents=g,r.component.isInteractionValid(h)||(u=!0,d=null,g=null,h.mutatedEvents=null)),g?a.dispatch({type:"SET_EVENT_RESIZE",state:h}):a.dispatch({type:"UNSET_EVENT_RESIZE"}),u?t.disableCursor():t.enableCursor(),n||(d&&S(s,e)&&(d=null),r.validMutation=d,r.mutatedRelevantEvents=g)},r.handleDragEnd=function(e){var n=r.component.calendar,i=r.component.view,o=r.eventRange.def,a=r.eventRange.instance,l=new t.EventApi(n,o,a),s=r.relevantEvents,c=r.mutatedRelevantEvents;n.publiclyTrigger("eventResizeStop",[{el:r.draggingSeg.el,event:l,jsEvent:e.origEvent,view:i}]),r.validMutation?(n.dispatch({type:"MERGE_EVENTS",eventStore:c}),n.publiclyTrigger("eventResize",[{el:r.draggingSeg.el,startDelta:r.validMutation.startDelta||t.createDuration(0),endDelta:r.validMutation.endDelta||t.createDuration(0),prevEvent:l,event:new t.EventApi(n,c.defs[o.defId],a?c.instances[a.instanceId]:null),revert:function(){n.dispatch({type:"MERGE_EVENTS",eventStore:s})},jsEvent:e.origEvent,view:i}])):n.publiclyTrigger("_noEventResize"),r.draggingSeg=null,r.relevantEvents=null,r.validMutation=null};var o=n.component,a=r.dragging=new f(o.el);a.pointer.selector=".fc-resizer",a.touchScrollAllowed=!1,a.autoScroller.isEnabled=o.opt("dragScroll");var l=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return l.emitter.on("pointerdown",r.handlePointerDown),l.emitter.on("dragstart",r.handleDragStart),l.emitter.on("hitupdate",r.handleHitUpdate),l.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n.prototype.querySeg=function(e){return t.getElSeg(t.elementClosest(e.subjectEl,this.component.fgSegSelector))},n}(t.Interaction);var M=function(){function e(e){var n=this;this.isRecentPointerDateSelect=!1,this.onSelect=function(e){e.jsEvent&&(n.isRecentPointerDateSelect=!0)},this.onDocumentPointerUp=function(e){var r=n,i=r.calendar,o=r.documentPointer,a=i.state;if(!o.wasTouchScroll){if(a.dateSelection&&!n.isRecentPointerDateSelect){var l=i.viewOpt("unselectAuto"),s=i.viewOpt("unselectCancel");!l||l&&t.elementClosest(o.downEl,s)||i.unselect(e)}a.eventSelection&&!t.elementClosest(o.downEl,w.SELECTOR)&&i.dispatch({type:"UNSELECT_EVENT"})}n.isRecentPointerDateSelect=!1},this.calendar=e;var r=this.documentPointer=new s(document);r.shouldIgnoreMove=!0,r.shouldWatchScroll=!1,r.emitter.on("pointerup",this.onDocumentPointerUp),e.on("select",this.onSelect)}return e.prototype.destroy=function(){this.calendar.off("select",this.onSelect),this.documentPointer.destroy()},e}(),b=function(){function e(e,n){var r=this;this.receivingCalendar=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){r.dragMeta=r.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,n,o){var a=r.hitDragging.dragging,l=null,s=null,c=!1,d={affectedEvents:t.createEmptyEventStore(),mutatedEvents:t.createEmptyEventStore(),isEvent:r.dragMeta.create,origSeg:null};e&&(l=e.component.calendar,r.canDropElOnCalendar(o.subjectEl,l)&&(s=function(e,n,r){for(var o=i({},n.leftoverProps),a=0,l=r.pluginSystem.hooks.externalDefTransforms;a tag */ + text-decoration: none; + color: inherit; +} + +.fc-list-item-title a[href]:hover { + /* hover effect only on titles with hrefs */ + text-decoration: underline; +} + +/* message when no events */ +.fc-list-empty-wrap2 { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.fc-list-empty-wrap1 { + width: 100%; + height: 100%; + display: table; +} + +.fc-list-empty { + display: table-cell; + vertical-align: middle; + text-align: center; +} + +.fc-unthemed .fc-list-empty { + /* theme will provide own background */ + background-color: #eee; +} diff --git a/src/main/resources/static/assets/libs/fullcalendar/list/main.js b/src/main/resources/static/assets/libs/fullcalendar/list/main.js new file mode 100644 index 0000000..b855e4e --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/list/main.js @@ -0,0 +1,343 @@ +/*! +FullCalendar List View Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) : + typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) : + (global = global || self, factory(global.FullCalendarList = {}, global.FullCalendar)); +}(this, function (exports, core) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var ListEventRenderer = /** @class */ (function (_super) { + __extends(ListEventRenderer, _super); + function ListEventRenderer(listView) { + var _this = _super.call(this, listView.context) || this; + _this.listView = listView; + return _this; + } + ListEventRenderer.prototype.attachSegs = function (segs) { + if (!segs.length) { + this.listView.renderEmptyMessage(); + } + else { + this.listView.renderSegList(segs); + } + }; + ListEventRenderer.prototype.detachSegs = function () { + }; + // generates the HTML for a single event row + ListEventRenderer.prototype.renderSegHtml = function (seg) { + var _a = this.context, view = _a.view, theme = _a.theme; + var eventRange = seg.eventRange; + var eventDef = eventRange.def; + var eventInstance = eventRange.instance; + var eventUi = eventRange.ui; + var url = eventDef.url; + var classes = ['fc-list-item'].concat(eventUi.classNames); + var bgColor = eventUi.backgroundColor; + var timeHtml; + if (eventDef.allDay) { + timeHtml = core.getAllDayHtml(view); + } + else if (core.isMultiDayRange(eventRange.range)) { + if (seg.isStart) { + timeHtml = core.htmlEscape(this._getTimeText(eventInstance.range.start, seg.end, false // allDay + )); + } + else if (seg.isEnd) { + timeHtml = core.htmlEscape(this._getTimeText(seg.start, eventInstance.range.end, false // allDay + )); + } + else { // inner segment that lasts the whole day + timeHtml = core.getAllDayHtml(view); + } + } + else { + // Display the normal time text for the *event's* times + timeHtml = core.htmlEscape(this.getTimeText(eventRange)); + } + if (url) { + classes.push('fc-has-url'); + } + return '' + + (this.displayEventTime ? + '' + + (timeHtml || '') + + '' : + '') + + '' + + '' + + '' + + '' + + '' + + core.htmlEscape(eventDef.title || '') + + '' + + '' + + ''; + }; + // like "4:00am" + ListEventRenderer.prototype.computeEventTimeFormat = function () { + return { + hour: 'numeric', + minute: '2-digit', + meridiem: 'short' + }; + }; + return ListEventRenderer; + }(core.FgEventRenderer)); + + /* + Responsible for the scroller, and forwarding event-related actions into the "grid". + */ + var ListView = /** @class */ (function (_super) { + __extends(ListView, _super); + function ListView(context, viewSpec, dateProfileGenerator, parentEl) { + var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this; + _this.computeDateVars = core.memoize(computeDateVars); + _this.eventStoreToSegs = core.memoize(_this._eventStoreToSegs); + var eventRenderer = _this.eventRenderer = new ListEventRenderer(_this); + _this.renderContent = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer)); + _this.el.classList.add('fc-list-view'); + var listViewClassNames = (_this.theme.getClass('listView') || '').split(' '); // wish we didn't have to do this + for (var _i = 0, listViewClassNames_1 = listViewClassNames; _i < listViewClassNames_1.length; _i++) { + var listViewClassName = listViewClassNames_1[_i]; + if (listViewClassName) { // in case input was empty string + _this.el.classList.add(listViewClassName); + } + } + _this.scroller = new core.ScrollComponent('hidden', // overflow x + 'auto' // overflow y + ); + _this.el.appendChild(_this.scroller.el); + _this.contentEl = _this.scroller.el; // shortcut + context.calendar.registerInteractiveComponent(_this, { + el: _this.el + // TODO: make aware that it doesn't do Hits + }); + return _this; + } + ListView.prototype.render = function (props) { + var _a = this.computeDateVars(props.dateProfile), dayDates = _a.dayDates, dayRanges = _a.dayRanges; + this.dayDates = dayDates; + this.renderContent(this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges)); + }; + ListView.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.renderContent.unrender(); + this.scroller.destroy(); // will remove the Grid too + this.calendar.unregisterInteractiveComponent(this); + }; + ListView.prototype.updateSize = function (isResize, viewHeight, isAuto) { + _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); + this.eventRenderer.computeSizes(isResize); + this.eventRenderer.assignSizes(isResize); + this.scroller.clear(); // sets height to 'auto' and clears overflow + if (!isAuto) { + this.scroller.setHeight(this.computeScrollerHeight(viewHeight)); + } + }; + ListView.prototype.computeScrollerHeight = function (viewHeight) { + return viewHeight - + core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller + }; + ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) { + return this.eventRangesToSegs(core.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.nextDayThreshold).fg, dayRanges); + }; + ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) { + var segs = []; + for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { + var eventRange = eventRanges_1[_i]; + segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges)); + } + return segs; + }; + ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) { + var _a = this, dateEnv = _a.dateEnv, nextDayThreshold = _a.nextDayThreshold; + var range = eventRange.range; + var allDay = eventRange.def.allDay; + var dayIndex; + var segRange; + var seg; + var segs = []; + for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) { + segRange = core.intersectRanges(range, dayRanges[dayIndex]); + if (segRange) { + seg = { + component: this, + eventRange: eventRange, + start: segRange.start, + end: segRange.end, + isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(), + isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(), + dayIndex: dayIndex + }; + segs.push(seg); + // detect when range won't go fully into the next day, + // and mutate the latest seg to the be the end. + if (!seg.isEnd && !allDay && + dayIndex + 1 < dayRanges.length && + range.end < + dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) { + seg.end = range.end; + seg.isEnd = true; + break; + } + } + } + return segs; + }; + ListView.prototype.renderEmptyMessage = function () { + this.contentEl.innerHTML = + '
' + // TODO: try less wraps + '
' + + '
' + + core.htmlEscape(this.opt('noEventsMessage')) + + '
' + + '
' + + '
'; + }; + // called by ListEventRenderer + ListView.prototype.renderSegList = function (allSegs) { + var segsByDay = this.groupSegsByDay(allSegs); // sparse array + var dayIndex; + var daySegs; + var i; + var tableEl = core.htmlToElement('
'); + var tbodyEl = tableEl.querySelector('tbody'); + for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) { + daySegs = segsByDay[dayIndex]; + if (daySegs) { // sparse array, so might be undefined + // append a day header + tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex])); + daySegs = this.eventRenderer.sortEventSegs(daySegs); + for (i = 0; i < daySegs.length; i++) { + tbodyEl.appendChild(daySegs[i].el); // append event row + } + } + } + this.contentEl.innerHTML = ''; + this.contentEl.appendChild(tableEl); + }; + // Returns a sparse array of arrays, segs grouped by their dayIndex + ListView.prototype.groupSegsByDay = function (segs) { + var segsByDay = []; // sparse array + var i; + var seg; + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = [])) + .push(seg); + } + return segsByDay; + }; + // generates the HTML for the day headers that live amongst the event rows + ListView.prototype.buildDayHeaderRow = function (dayDate) { + var dateEnv = this.dateEnv; + var mainFormat = core.createFormatter(this.opt('listDayFormat')); // TODO: cache + var altFormat = core.createFormatter(this.opt('listDayAltFormat')); // TODO: cache + return core.createElement('tr', { + className: 'fc-list-heading', + 'data-date': dateEnv.formatIso(dayDate, { omitTime: true }) + }, '' + + (mainFormat ? + core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-main' }, core.htmlEscape(dateEnv.format(dayDate, mainFormat)) // inner HTML + ) : + '') + + (altFormat ? + core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-alt' }, core.htmlEscape(dateEnv.format(dayDate, altFormat)) // inner HTML + ) : + '') + + ''); + }; + return ListView; + }(core.View)); + ListView.prototype.fgSegSelector = '.fc-list-item'; // which elements accept event actions + function computeDateVars(dateProfile) { + var dayStart = core.startOfDay(dateProfile.renderRange.start); + var viewEnd = dateProfile.renderRange.end; + var dayDates = []; + var dayRanges = []; + while (dayStart < viewEnd) { + dayDates.push(dayStart); + dayRanges.push({ + start: dayStart, + end: core.addDays(dayStart, 1) + }); + dayStart = core.addDays(dayStart, 1); + } + return { dayDates: dayDates, dayRanges: dayRanges }; + } + + var main = core.createPlugin({ + views: { + list: { + class: ListView, + buttonTextKey: 'list', + listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016" + }, + listDay: { + type: 'list', + duration: { days: 1 }, + listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in header + }, + listWeek: { + type: 'list', + duration: { weeks: 1 }, + listDayFormat: { weekday: 'long' }, + listDayAltFormat: { month: 'long', day: 'numeric', year: 'numeric' } + }, + listMonth: { + type: 'list', + duration: { month: 1 }, + listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have + }, + listYear: { + type: 'list', + duration: { year: 1 }, + listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have + } + } + }); + + exports.ListView = ListView; + exports.default = main; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/src/main/resources/static/assets/libs/fullcalendar/list/main.min.css b/src/main/resources/static/assets/libs/fullcalendar/list/main.min.css new file mode 100644 index 0000000..18446f4 --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/list/main.min.css @@ -0,0 +1 @@ +.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee} \ No newline at end of file diff --git a/src/main/resources/static/assets/libs/fullcalendar/list/main.min.js b/src/main/resources/static/assets/libs/fullcalendar/list/main.min.js new file mode 100644 index 0000000..f954aac --- /dev/null +++ b/src/main/resources/static/assets/libs/fullcalendar/list/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar List View Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarList={},e.FullCalendar)}(this,function(e,t){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var s=function(e){function n(t){var n=e.call(this,t.context)||this;return n.listView=t,n}return r(n,e),n.prototype.attachSegs=function(e){e.length?this.listView.renderSegList(e):this.listView.renderEmptyMessage()},n.prototype.detachSegs=function(){},n.prototype.renderSegHtml=function(e){var n,r=this.context,s=r.view,a=r.theme,i=e.eventRange,o=i.def,l=i.instance,d=i.ui,c=o.url,p=["fc-list-item"].concat(d.classNames),h=d.backgroundColor;return n=o.allDay?t.getAllDayHtml(s):t.isMultiDayRange(i.range)?e.isStart?t.htmlEscape(this._getTimeText(l.range.start,e.end,!1)):e.isEnd?t.htmlEscape(this._getTimeText(e.start,l.range.end,!1)):t.getAllDayHtml(s):t.htmlEscape(this.getTimeText(i)),c&&p.push("fc-has-url"),''+(this.displayEventTime?''+(n||"")+"":"")+'"+t.htmlEscape(o.title||"")+""},n.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",meridiem:"short"}},n}(t.FgEventRenderer),a=function(e){function n(n,r,a,o){var l=e.call(this,n,r,a,o)||this;l.computeDateVars=t.memoize(i),l.eventStoreToSegs=t.memoize(l._eventStoreToSegs);var d=l.eventRenderer=new s(l);l.renderContent=t.memoizeRendering(d.renderSegs.bind(d),d.unrender.bind(d)),l.el.classList.add("fc-list-view");for(var c=0,p=(l.theme.getClass("listView")||"").split(" ");c
'+t.htmlEscape(this.opt("noEventsMessage"))+"
"},n.prototype.renderSegList=function(e){var n,r,s,a=this.groupSegsByDay(e),i=t.htmlToElement('
'),o=i.querySelector("tbody");for(n=0;n'+(r?t.buildGotoAnchorHtml(this,e,{class:"fc-list-heading-main"},t.htmlEscape(n.format(e,r))):"")+(s?t.buildGotoAnchorHtml(this,e,{class:"fc-list-heading-alt"},t.htmlEscape(n.format(e,s))):"")+"")},n}(t.View);function i(e){for(var n=t.startOfDay(e.renderRange.start),r=e.renderRange.end,s=[],a=[];n
',o.rootBgContainerEl=i.querySelector(".fc-bg"),o.slatContainerEl=i.querySelector(".fc-slats"),o.bottomRuleEl=i.querySelector(".fc-divider"),o.renderProps=n,o}return n(i,e),i.prototype.processOptions=function(){var e,r,i=this.opt("slotDuration"),n=this.opt("snapDuration");i=t.createDuration(i),n=n?t.createDuration(n):i,null===(e=t.wholeDivideDurations(i,n))&&(n=i,e=1),this.slotDuration=i,this.snapDuration=n,this.snapsPerSlot=e,r=this.opt("slotLabelFormat"),Array.isArray(r)&&(r=r[r.length-1]),this.labelFormat=t.createFormatter(r||{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"}),r=this.opt("slotLabelInterval"),this.labelInterval=r?t.createDuration(r):this.computeLabelInterval(i)},i.prototype.computeLabelInterval=function(e){var r,i,n;for(r=u.length-1;r>=0;r--)if(i=t.createDuration(u[r]),null!==(n=t.wholeDivideDurations(i,e))&&n>1)return i;return e},i.prototype.render=function(e){var t=e.cells;this.colCnt=t.length,this.renderSlats(e.dateProfile),this.renderColumns(e.cells,e.dateProfile),this.renderBusinessHours(e.businessHourSegs),this.renderDateSelection(e.dateSelectionSegs),this.renderFgEvents(e.fgEventSegs),this.renderBgEvents(e.bgEventSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDrag),this.renderEventResize(e.eventResize)},i.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderSlats.unrender(),this.renderColumns.unrender()},i.prototype.updateSize=function(e){var t=this.fillRenderer,r=this.eventRenderer,i=this.mirrorRenderer;(e||this.isSlatSizesDirty)&&(this.buildSlatPositions(),this.isSlatSizesDirty=!1),(e||this.isColSizesDirty)&&(this.buildColPositions(),this.isColSizesDirty=!1),t.computeSizes(e),r.computeSizes(e),i.computeSizes(e),t.assignSizes(e),r.assignSizes(e),i.assignSizes(e)},i.prototype._renderSlats=function(e){var r=this.theme;this.slatContainerEl.innerHTML=''+this.renderSlatRowHtml(e)+"
",this.slatEls=t.findElements(this.slatContainerEl,"tr"),this.slatPositions=new t.PositionCache(this.el,this.slatEls,!1,!0),this.isSlatSizesDirty=!0},i.prototype.renderSlatRowHtml=function(e){for(var r,i,n,o=this.dateEnv,s=this.theme,a=this.isRtl,l="",d=t.startOfDay(e.renderRange.start),c=e.minTime,h=t.createDuration(0);t.asRoughMs(c)'+(i?""+t.htmlEscape(o.format(r,this.labelFormat))+"":"")+"",l+='"+(a?"":n)+''+(a?n:"")+"",c=t.addDurations(c,this.slotDuration),h=t.addDurations(h,this.slotDuration);return l},i.prototype._renderColumns=function(e,i){var n=this.theme,o=this.dateEnv,s=this.view,a=new r.DayBgRow(this.context);this.rootBgContainerEl.innerHTML=''+a.renderHtml({cells:e,dateProfile:i,renderIntroHtml:this.renderProps.renderBgIntroHtml})+"
",this.colEls=t.findElements(this.el,".fc-day, .fc-disabled-day");for(var l=0;l
');this.isRtl&&r.reverse(),e=this.contentSkeletonEl=t.htmlToElement('
'+r.join("")+"
"),this.colContainerEls=t.findElements(e,".fc-content-col"),this.mirrorContainerEls=t.findElements(e,".fc-mirror-container"),this.fgContainerEls=t.findElements(e,".fc-event-container:not(.fc-mirror-container)"),this.bgContainerEls=t.findElements(e,".fc-bgevent-container"),this.highlightContainerEls=t.findElements(e,".fc-highlight-container"),this.businessContainerEls=t.findElements(e,".fc-business-container"),this.isRtl&&(this.colContainerEls.reverse(),this.mirrorContainerEls.reverse(),this.fgContainerEls.reverse(),this.bgContainerEls.reverse(),this.highlightContainerEls.reverse(),this.businessContainerEls.reverse()),this.el.appendChild(e)},i.prototype.unrenderContentSkeleton=function(){t.removeElement(this.contentSkeletonEl)},i.prototype.groupSegsByCol=function(e){var t,r=[];for(t=0;t0){var a=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-arrow"});a.style.top=n+"px",this.contentSkeletonEl.appendChild(a),o.push(a)}this.nowIndicatorEls=o}},i.prototype.unrenderNowIndicator=function(){this.nowIndicatorEls&&(this.nowIndicatorEls.forEach(t.removeElement),this.nowIndicatorEls=null)},i.prototype.getTotalSlatHeight=function(){return this.slatContainerEl.getBoundingClientRect().height},i.prototype.computeDateTop=function(e,r){return r||(r=t.startOfDay(e)),this.computeTimeTop(t.createDuration(e.valueOf()-r.valueOf()))},i.prototype.computeTimeTop=function(e){var r,i,n=this.slatEls.length,o=this.props.dateProfile,s=(e.milliseconds-t.asRoughMs(o.minTime))/t.asRoughMs(this.slotDuration);return s=Math.max(0,s),s=Math.min(n,s),r=Math.floor(s),i=s-(r=Math.min(r,n-1)),this.slatPositions.tops[r]+this.slatPositions.getHeight(r)*i},i.prototype.computeSegVerticals=function(e){var t,r,i,n=this.opt("timeGridEventMinHeight");for(t=0;t"+t.buildGotoAnchorHtml(a,{date:o.start,type:"week",forceOff:s>1},t.htmlEscape(e))+""):'"},a.renderTimeGridBgIntroHtml=function(){return'"},a.renderTimeGridIntroHtml=function(){return'"},a.renderDayGridBgIntroHtml=function(){return'"+t.getAllDayHtml(a)+""},a.renderDayGridIntroHtml=function(){return'"},a.el.classList.add("fc-timeGrid-view"),a.el.innerHTML=a.renderSkeletonHtml(),a.scroller=new t.ScrollComponent("hidden","auto");var l=a.scroller.el;a.el.querySelector(".fc-body > tr > td").appendChild(l),l.classList.add("fc-time-grid-container");var d=t.createElement("div",{className:"fc-time-grid"});if(l.appendChild(d),a.timeGrid=new p(a.context,d,{renderBgIntroHtml:a.renderTimeGridBgIntroHtml,renderIntroHtml:a.renderTimeGridIntroHtml}),a.opt("allDaySlot")){a.dayGrid=new r.DayGrid(a.context,a.el.querySelector(".fc-day-grid"),{renderNumberIntroHtml:a.renderDayGridIntroHtml,renderBgIntroHtml:a.renderDayGridBgIntroHtml,renderIntroHtml:a.renderDayGridIntroHtml,colWeekNumbersVisible:!1,cellWeekNumbersVisible:!1});var c=a.el.querySelector(".fc-divider");a.dayGrid.bottomCoordPadding=c.getBoundingClientRect().height}return a}return n(i,e),i.prototype.destroy=function(){e.prototype.destroy.call(this),this.timeGrid.destroy(),this.dayGrid&&this.dayGrid.destroy(),this.scroller.destroy()},i.prototype.renderSkeletonHtml=function(){var e=this.theme;return''+(this.opt("columnHeader")?'':"")+'
 
'+(this.opt("allDaySlot")?'

':"")+"
"},i.prototype.getNowIndicatorUnit=function(){return this.timeGrid.getNowIndicatorUnit()},i.prototype.unrenderNowIndicator=function(){this.timeGrid.unrenderNowIndicator()},i.prototype.updateSize=function(t,r,i){e.prototype.updateSize.call(this,t,r,i),this.timeGrid.updateSize(t),this.dayGrid&&this.dayGrid.updateSize(t)},i.prototype.updateBaseSize=function(e,r,i){var n,o,s,a=this;if(this.axisWidth=t.matchCellWidths(t.findElements(this.el,".fc-axis")),this.timeGrid.colEls){var l=t.findElements(this.el,".fc-row").filter(function(e){return!a.scroller.el.contains(e)});this.timeGrid.bottomRuleEl.style.display="none",this.scroller.clear(),l.forEach(t.uncompensateScroll),this.dayGrid&&(this.dayGrid.removeSegPopover(),(n=this.opt("eventLimit"))&&"number"!=typeof n&&(n=5),n&&this.dayGrid.limitRows(n)),i||(o=this.computeScrollerHeight(r),this.scroller.setHeight(o),((s=this.scroller.getScrollbarWidths()).left||s.right)&&(l.forEach(function(e){t.compensateScroll(e,s)}),o=this.computeScrollerHeight(r),this.scroller.setHeight(o)),this.scroller.lockOverflow(s),this.timeGrid.getTotalSlatHeight()=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,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"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + diff --git a/src/main/resources/templates/carmi/cards.html b/src/main/resources/templates/carmi/cards.html new file mode 100644 index 0000000..d4beeb3 --- /dev/null +++ b/src/main/resources/templates/carmi/cards.html @@ -0,0 +1,345 @@ + + + + <:include file="../common/css.html" title="卡密管理"/> + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+
+ + +
+
+ +
+
+
  + +
+
+ +
+ +
+
+
+
+ + + + + + + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/common/css.html b/src/main/resources/templates/common/css.html new file mode 100644 index 0000000..04243fc --- /dev/null +++ b/src/main/resources/templates/common/css.html @@ -0,0 +1,11 @@ +${title!} + + + +${ctxPath}/assets/images/logo.svg<:if test="${favicon! != null || favicon! != ''}">${favicon!}" rel="icon"> + + + \ No newline at end of file diff --git a/src/main/resources/templates/common/js.html b/src/main/resources/templates/common/js.html new file mode 100644 index 0000000..f1d0da6 --- /dev/null +++ b/src/main/resources/templates/common/js.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/main/resources/templates/common/side.html b/src/main/resources/templates/common/side.html new file mode 100644 index 0000000..2548737 --- /dev/null +++ b/src/main/resources/templates/common/side.html @@ -0,0 +1,12 @@ +<:if test="${children.~size>0}"> +
+ <:for items="${children}" var="subItem"> + <:if test="${subItem.hide==0}"> +
+ ${subItem.menuName} + <:include file="./side.html" children="${subItem.children}"/> +
+ + +
+ \ No newline at end of file diff --git a/src/main/resources/templates/content/add-article.html b/src/main/resources/templates/content/add-article.html new file mode 100644 index 0000000..cad7be0 --- /dev/null +++ b/src/main/resources/templates/content/add-article.html @@ -0,0 +1,139 @@ + + + + <:include file="../common/css.html" title="添加文章"/> + + + + + +
+ + +
+
+
+ 添加文章 +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+
推荐图片尺寸为【256x146】
+
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+
+ +
+ + +
+
+
+
+ + +<:include file="../common/js.html"/> + + + + diff --git a/src/main/resources/templates/content/article.html b/src/main/resources/templates/content/article.html new file mode 100644 index 0000000..40d295a --- /dev/null +++ b/src/main/resources/templates/content/article.html @@ -0,0 +1,165 @@ + + + + <:include file="../common/css.html" title="文章管理"/> + + + +
+
+
+ 文章管理 +
+
+ +
+
+
+
+ + + + + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/content/carousel.html b/src/main/resources/templates/content/carousel.html new file mode 100644 index 0000000..9a2bcd4 --- /dev/null +++ b/src/main/resources/templates/content/carousel.html @@ -0,0 +1,269 @@ + + + + <:include file="../common/css.html" title="轮播图管理"/> + + + + +
+
+
+ 轮播图管理 +
+
+ +
+
+
+
+ + + + + + + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/content/edit-article.html b/src/main/resources/templates/content/edit-article.html new file mode 100644 index 0000000..153ee5e --- /dev/null +++ b/src/main/resources/templates/content/edit-article.html @@ -0,0 +1,144 @@ + + + + <:include file="../common/css.html" title="修改文章"/> + + + + + +
+ + +
+
+
+ 修改文章 +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+
推荐图片尺寸为【256x146】
+
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+
+ +
+ + +
+
+
+ +<:include file="../common/js.html"/> + + + + diff --git a/src/main/resources/templates/dashboard/workplace.html b/src/main/resources/templates/dashboard/workplace.html new file mode 100644 index 0000000..553a506 --- /dev/null +++ b/src/main/resources/templates/dashboard/workplace.html @@ -0,0 +1,424 @@ + + + + <:include file="../common/css.html" title="网站设置管理"/> + + + + +
+
+
+
+
+
+
+ 今日成交今日 +
+
+

¥ ${money!}

+

今日成交订单${count!} 笔

+
+
+
+
+
+
+ 昨日成交昨日 +
+
+

¥ + ${YesterDayMoney!} +

+

昨日成交订单${YesterDayCount!} 笔

+
+
+
+
+
+
+ 近七天成交七天 +
+
+

¥ + ${SevenDaysMoney!} +

+

近七天成交订单${SevenDaysCount!} 笔

+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
最新订单
+
+ +
+
+
+
+
+
+ +
+
+
+ 总交易金额 +
+
+

¥ + ${total_amount!} +

+

总成交订单${total_number!} 笔

+
+
+
+
+ Hi ${user.nickName}, 欢迎来到后台管理系统! +
+
+
+
版本信息
+
+ + + + + + + + + + + + + + + + +
主要特色界面美观、多种支付
获取渠道 + 获取最新 +
+
+
+
+
友情链接
+ +
+
+
+
+ +<:include file="../common/js.html"/> + + + + diff --git a/src/main/resources/templates/email/sendShip.html b/src/main/resources/templates/email/sendShip.html new file mode 100644 index 0000000..77249ed --- /dev/null +++ b/src/main/resources/templates/email/sendShip.html @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/error/1000.html b/src/main/resources/templates/error/1000.html new file mode 100644 index 0000000..b600fd8 --- /dev/null +++ b/src/main/resources/templates/error/1000.html @@ -0,0 +1,57 @@ + + + + <:include file="../common/title.html" websiteName="商品详情"/> + <:include file="../common/css.html" title="1000"/> + + + + +<:include file="../common/header.html"/> + +
+
+ +

1000

+

监控为离线状态

+
+
+ +<:include file="../common/footer.html"/> +<:include file="../common/js.html"/> + + \ No newline at end of file diff --git a/src/main/resources/templates/error/1001.html b/src/main/resources/templates/error/1001.html new file mode 100644 index 0000000..12392f8 --- /dev/null +++ b/src/main/resources/templates/error/1001.html @@ -0,0 +1,57 @@ + + + + <:include file="../common/title.html" websiteName="商品详情"/> + <:include file="../common/css.html" title="1001"/> + + + + +<:include file="../common/header.html"/> + +
+
+ +

1001

+

额度不足,无法创建订单

+
+
+ +<:include file="../common/footer.html"/> +<:include file="../common/js.html"/> + + \ No newline at end of file diff --git a/src/main/resources/templates/error/403.html b/src/main/resources/templates/error/403.html new file mode 100644 index 0000000..e6adf13 --- /dev/null +++ b/src/main/resources/templates/error/403.html @@ -0,0 +1,60 @@ + + + + <:include file="../common/css.html" title="403"/> + + + +
+ +
+

403

+

抱歉,你无权访问此页面!

+ +
+
+<:include file="../common/js.html"/> + + \ No newline at end of file diff --git a/src/main/resources/templates/error/404.html b/src/main/resources/templates/error/404.html new file mode 100644 index 0000000..ac59981 --- /dev/null +++ b/src/main/resources/templates/error/404.html @@ -0,0 +1,60 @@ + + + + <:include file="../common/css.html" title="404"/> + + + +
+ +
+

404

+

啊哦,你访问的页面不存在(⋟﹏⋞)

+ +
+
+<:include file="../common/js.html"/> + + \ No newline at end of file diff --git a/src/main/resources/templates/error/500.html b/src/main/resources/templates/error/500.html new file mode 100644 index 0000000..addfaad --- /dev/null +++ b/src/main/resources/templates/error/500.html @@ -0,0 +1,60 @@ + + + + <:include file="../common/css.html" title="500"/> + + + +
+ +
+

500

+

诶呦,服务器出了一个故障~

+ +
+
+<:include file="../common/js.html"/> + + \ No newline at end of file diff --git a/src/main/resources/templates/index/message.html b/src/main/resources/templates/index/message.html new file mode 100644 index 0000000..21080e1 --- /dev/null +++ b/src/main/resources/templates/index/message.html @@ -0,0 +1,252 @@ + + + + + diff --git a/src/main/resources/templates/index/note.html b/src/main/resources/templates/index/note.html new file mode 100644 index 0000000..ba63faf --- /dev/null +++ b/src/main/resources/templates/index/note.html @@ -0,0 +1,210 @@ +
本地便签
+
+
+ +

没有便签

+
+
+ +
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/index/password.html b/src/main/resources/templates/index/password.html new file mode 100644 index 0000000..ae56da8 --- /dev/null +++ b/src/main/resources/templates/index/password.html @@ -0,0 +1,58 @@ + +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/index/theme.html b/src/main/resources/templates/index/theme.html new file mode 100644 index 0000000..281c20b --- /dev/null +++ b/src/main/resources/templates/index/theme.html @@ -0,0 +1,139 @@ +
主题设置
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/index/user-info.html b/src/main/resources/templates/index/user-info.html new file mode 100644 index 0000000..cd0f5e3 --- /dev/null +++ b/src/main/resources/templates/index/user-info.html @@ -0,0 +1,268 @@ + + + + <:include file="../common/css.html" title="个人中心"/> + + + + +
+
+ +
+
+
+
+ +

${user.nickName!}

+

${user.introduction!'这家伙很懒,什么都不说~'}

+
+
+ + + +
+
+

标签

+
+ 很有想法的 + 专注设计 + 辣~ + 大长腿 + 川妹子 + 海纳百川 +
+
+
+
+ +
+
+ +
+
    +
  • 个人信息
  • +
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..8447cde --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,77 @@ + + + + + <:include file="./common/css.html" title="登入后台 - ${website.websiteName}" favicon="${website.favicon}"/> + + + + + + +<:include file="./common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/main.html b/src/main/resources/templates/main.html new file mode 100644 index 0000000..26d282b --- /dev/null +++ b/src/main/resources/templates/main.html @@ -0,0 +1,93 @@ + + + + <:include file="./common/css.html" title="${website.websiteName} - 后台系统" favicon="${website.favicon}"/> + + +
+ +
+ +
    +
  • + +
  • +
  • + +
  • +
+ +
+ +
+
+
    + <:for items="${menus}" var="item"> + <:if test="${item.hide==0}"> +
  • + + ${item.menuName} + + <:include file="./common/side.html" children="${item.children}"/> +
  • + + +
+
+
+ +
+ + +
+<:include file="./common/js.html"/> + + + diff --git a/src/main/resources/templates/orders/orders.html b/src/main/resources/templates/orders/orders.html new file mode 100644 index 0000000..e7ac293 --- /dev/null +++ b/src/main/resources/templates/orders/orders.html @@ -0,0 +1,537 @@ + + + + <:include file="../common/css.html" title="订单表管理"/> + + + + +
+
+
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
  + +
+
+
+ +
+
+
+
+ + + + + + + + + + + + +<:include file="../common/js.html"/> + + + + diff --git a/src/main/resources/templates/products/add-product.html b/src/main/resources/templates/products/add-product.html new file mode 100644 index 0000000..7433fc0 --- /dev/null +++ b/src/main/resources/templates/products/add-product.html @@ -0,0 +1,373 @@ + + + + <:include file="../common/css.html" title="添加商品"/> + + + + +
+ +
+
+
+ 添加商品 +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ +
值为0时表示没有无限制
+
+
+ + +
+ +
+ + +
+
+ + + + +
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
提示类型为文件下载有效
+
+
+ +
+ +
+ + +
+
+ + + + + + + + +
+ +
+ + +
+
+ + +
+ +
+ + +
+
+ + + + +
+ +
+ +
+ +
+ +
+
+
推荐图片尺寸为【256x146】
+
+
+ +
+ +
+ +
+ +
+ +
+
+
推荐图片尺寸为【230x230】
+
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+
+
+ +
+ + +
+
+ +
+<:include file="../common/js.html"/> + + + + diff --git a/src/main/resources/templates/products/classifys.html b/src/main/resources/templates/products/classifys.html new file mode 100644 index 0000000..0b670d1 --- /dev/null +++ b/src/main/resources/templates/products/classifys.html @@ -0,0 +1,231 @@ + + + + <:include file="../common/css.html" title="分类管理"/> + + + +
+
+
+ +
+
+
+ +
+ +
+
+
  + +
+
+
+ +
+
+
+
+ + + + + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/products/edit-product.html b/src/main/resources/templates/products/edit-product.html new file mode 100644 index 0000000..56fc37d --- /dev/null +++ b/src/main/resources/templates/products/edit-product.html @@ -0,0 +1,411 @@ + + + + <:include file="../common/css.html" title="编辑商品"/> + + + + +
+
+
+
+ 编辑商品 +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ +
值为0时表示没有无限制
+
+
+ + +
+ +
+ + +
+
+ + + + +
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
提示类型为文件下载有效
+
+
+ +
+ +
+ + +
+
+ + + + + + + + +
+ +
+ + +
+
+ + +
+ +
+ + +
+
+ + + +
+ +
+ +
+ +
+ +
+
+
推荐图片尺寸为【256x146】
+
+
+ +
+ +
+ +
+ +
+ +
+
+
推荐图片尺寸为【230x230】
+
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+
+ +
+ + +
+
+
+ +<:include file="../common/js.html"/> + + + + diff --git a/src/main/resources/templates/products/products.html b/src/main/resources/templates/products/products.html new file mode 100644 index 0000000..79377c4 --- /dev/null +++ b/src/main/resources/templates/products/products.html @@ -0,0 +1,183 @@ + + + + <:include file="../common/css.html" title="商品管理"/> + + + +
+
+
+ +
+
+
+ +
+ +
+
+
  + +
+
+
+ +
+
+
+
+ + + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/settings/coupon.html b/src/main/resources/templates/settings/coupon.html new file mode 100644 index 0000000..a0e868f --- /dev/null +++ b/src/main/resources/templates/settings/coupon.html @@ -0,0 +1,193 @@ + + + + <:include file="../common/css.html" title="优惠券管理"/> + + + +
+
+
+ 优惠券管理 +
+
+ +
+
+
+
+ + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/settings/coupon_add.html b/src/main/resources/templates/settings/coupon_add.html new file mode 100644 index 0000000..8e4d41d --- /dev/null +++ b/src/main/resources/templates/settings/coupon_add.html @@ -0,0 +1,214 @@ + + + + <:include file="../common/css.html" title="优惠券添加"/> + + + + +
+ + +
+
+
+ 添加优惠券 +
+
+ +
+ +
+ +
+ +
+ +
+
+ + +
+ +
+ +
请输入金额,金额在0.1-20000元之间
+
+
+ +
+
+ + +
+ +
+ +
请输入金额,金额在0-20000元之间,如您输入了200,则代表此优惠券需订单金额满了200元才可以使用
+
+
+ + + +
+ +
+ +
+
+ + + + + +
+ +
+ + +
+
+
+
+ +
+ + +
+
+ +
+
+ 温馨提示: 在重复使用类型下,如果代码券为手动输入的相同商品不允许出现优惠券代码相同的情况,否则会出现互斥的情况提示报错 +
+
+
+ +<:include file="../common/js.html"/> + + + diff --git a/src/main/resources/templates/settings/pays.html b/src/main/resources/templates/settings/pays.html new file mode 100644 index 0000000..36d448d --- /dev/null +++ b/src/main/resources/templates/settings/pays.html @@ -0,0 +1,994 @@ + + + + <:include file="../common/css.html" title="支付配置"/> + + + +
+
+
+ 支付配置 +
+
+ +
+
+
+
+
+ 手续费示以百分比计算的,例如:填写的是10 就以当前订单金额x10% 就是当前订单的手续费了。 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<:include file="../common/js.html"/> + + + diff --git a/src/main/resources/templates/settings/shopSettings.html b/src/main/resources/templates/settings/shopSettings.html new file mode 100644 index 0000000..9e91cda --- /dev/null +++ b/src/main/resources/templates/settings/shopSettings.html @@ -0,0 +1,246 @@ + + + + <:include file="../common/css.html" title="商店设置管理"/> + + + + +
+ +
+
+
+ 商店设置 +
+
+ + + +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
申请地址:https://crisp.chat/zh/ +
+
+
+ + + +
+ +
+ + + +
+
+ + +
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+
+ +
+ + +
+
+
+ +<:include file="../common/js.html"/> + + + + diff --git a/src/main/resources/templates/settings/wxpusher.html b/src/main/resources/templates/settings/wxpusher.html new file mode 100644 index 0000000..be67b36 --- /dev/null +++ b/src/main/resources/templates/settings/wxpusher.html @@ -0,0 +1,111 @@ + + + + <:include file="../common/css.html" title="微信通知"/> + + + + + +
+
+
+
+
+ 配置二维码 + +
+
+
+ +
+
+
+
+
+
+
+ 使用说明 +
+
+
+

扫码关注公众号


+

注意事项一:

+

1. 扫码一次性绑定微信公众号、即可收到订单通知

+

2. 微信公众号上提示绑定成功后,刷新本页面

+

注意事项二:

+

1. 绑定微信后可通过微信获取实时订单信息和交易通知!

+
+
+
+
+ +
+
+
+ WxPusher +
+
+
+

WxPusher (微信推送服务)是一个使用微信公众号作为通道的,实时信息推送平台,你可以通过调用API的方式,把信息推送到微信上,无需安装额外的软件,即可做到信息实时通知。 你可以使用WxPusher来做服务器报警通知、抢课通知、抢票通知,信息更新提示等。

+
+

注册并且创建应用

+

http://wxpusher.zjiecode.com/admin ,使用微信扫码登录,无需注册,新用户首次扫码自动注册。

+

创建一个应用,如下图:

+

创建应用

+

事件回调地址:[你发卡的域名] 加上 /wxpusher/callback 比如我的就填写 https://shop.zlianpay.cn/wxpusher/callback

+

设置URL:可以不填写,填写以后,用户在微信端打开「我的订阅」,可以直接跳转到这个地址,并且会携带uid作为参数,方便做定制化页面展示。

+

联系方式:可以不填写,告诉用户,如何联系到你,给你反馈问题。

+

关注提示:用户关注或者扫应用码的时候发送给用户的提示,你可以不填写,Wxpusher会提供一个默认文案。你也可以在用户关注回调给你UID的时候,再主动推送一个提示消息给用户。

+

说明:描述一下,你的应用,推送的是啥内容,用户通过链接关注,或者在微信端查看的时候可以看到。

+

创建完成后拿到 app_token 在发卡-商店设置-appToken 设置保存

+
+
+
+
+
+ +
+ +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/system/dictionary.html b/src/main/resources/templates/system/dictionary.html new file mode 100644 index 0000000..b8d8a6b --- /dev/null +++ b/src/main/resources/templates/system/dictionary.html @@ -0,0 +1,409 @@ + + + + <:include file="../common/css.html" title="字典管理"/> + + + + +
+
+
+
+
+ +
+
+   + +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
  + +
+
+
+ +
+
+
+
+
+
+ + + + + + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/system/email.html b/src/main/resources/templates/system/email.html new file mode 100644 index 0000000..5402307 --- /dev/null +++ b/src/main/resources/templates/system/email.html @@ -0,0 +1,88 @@ + + + + <:include file="../common/css.html" title="发送邮件"/> + + + +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+<:include file="../common/js.html"/> + + + + \ No newline at end of file diff --git a/src/main/resources/templates/system/file.html b/src/main/resources/templates/system/file.html new file mode 100644 index 0000000..086dc22 --- /dev/null +++ b/src/main/resources/templates/system/file.html @@ -0,0 +1,179 @@ + + + + <:include file="../common/css.html" title="文件管理"/> + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/system/login-record.html b/src/main/resources/templates/system/login-record.html new file mode 100644 index 0000000..7e9a889 --- /dev/null +++ b/src/main/resources/templates/system/login-record.html @@ -0,0 +1,123 @@ + + + + <:include file="../common/css.html" title="登录日志"/> + + + +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
  +   + +
+
+
+ +
+
+
+
+<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/system/menu.html b/src/main/resources/templates/system/menu.html new file mode 100644 index 0000000..5325c6c --- /dev/null +++ b/src/main/resources/templates/system/menu.html @@ -0,0 +1,313 @@ + + + + <:include file="../common/css.html" title="菜单管理"/> + + + +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+ + +
+
+
+ + + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/system/oper-record.html b/src/main/resources/templates/system/oper-record.html new file mode 100644 index 0000000..d7da889 --- /dev/null +++ b/src/main/resources/templates/system/oper-record.html @@ -0,0 +1,257 @@ + + + + <:include file="../common/css.html" title="操作日志"/> + + + + +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
  + + +
+
+
+ +
+
+
+
+ + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/system/organization.html b/src/main/resources/templates/system/organization.html new file mode 100644 index 0000000..521fdcd --- /dev/null +++ b/src/main/resources/templates/system/organization.html @@ -0,0 +1,544 @@ + + + + <:include file="../common/css.html" title="机构管理"/> + + + + +
+
+
+
+
+ +
+   +   + +
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ + + + + + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/system/role.html b/src/main/resources/templates/system/role.html new file mode 100644 index 0000000..93187ec --- /dev/null +++ b/src/main/resources/templates/system/role.html @@ -0,0 +1,269 @@ + + + + <:include file="../common/css.html" title="角色管理"/> + + + +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
  + +
+
+
+ +
+
+
+
+ + + + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/system/supplier.html b/src/main/resources/templates/system/supplier.html new file mode 100644 index 0000000..6f67830 --- /dev/null +++ b/src/main/resources/templates/system/supplier.html @@ -0,0 +1,214 @@ + + + + <:include file="../common/css.html" title="供应商管理"/> + + + +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
  + +
+
+
+ +
+
+
+
+ + + + +<:include file="../common/js.html"/> + + + diff --git a/src/main/resources/templates/system/user.html b/src/main/resources/templates/system/user.html new file mode 100644 index 0000000..ff13384 --- /dev/null +++ b/src/main/resources/templates/system/user.html @@ -0,0 +1,401 @@ + + + + <:include file="../common/css.html" title="用户管理"/> + + + +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
  + +
+
+
+ +
+
+
+
+ + + + + + +<:include file="../common/js.html"/> + + + diff --git a/src/main/resources/templates/theme/default/article-content.html b/src/main/resources/templates/theme/default/article-content.html new file mode 100644 index 0000000..304c726 --- /dev/null +++ b/src/main/resources/templates/theme/default/article-content.html @@ -0,0 +1,117 @@ + + + + <:include file="./common/title.html" websiteName="热门文章 - ${website.websiteName}" keywords="${website.keywords}" + description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + + +
+
+ +
+
+ +<:include file="./common/header-article.html" websiteName="${website.websiteName}" + websiteLogo="${website.websiteLogo}"/> + +
+
+
+
+
+ 文章详情 +
+
+
+ ${article.content} +
+
+ +
+
+
+
+
+ 热门商品 +
+
+
+ <:for items="${hotProductList}" var="item"> +
+
+
+ ../default/images/commodity.svg<:if test="${item.image != null || item.image != ''}">${item.image!}"> +
+
+

${item.name}

+
+ ¥ ${item.price} +
+
+ +
+
+ +
+
+
+
+
+
+ + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/footer-menu-help.html"/> + +<:include file="./common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/article.html b/src/main/resources/templates/theme/default/article.html new file mode 100644 index 0000000..0697cfd --- /dev/null +++ b/src/main/resources/templates/theme/default/article.html @@ -0,0 +1,150 @@ + + + + <:include file="./common/title.html" websiteName="热门文章 - ${website.websiteName}" keywords="${website.keywords}" + description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + + + +<:include file="./common/header-article.html" websiteName="${website.websiteName}" + websiteLogo="${website.websiteLogo}"/> + +
+
+
+
+
+
    +
+
+
+
+
+
+
+ 热门商品 +
+
+
+ <:for items="${hotProductList}" var="item"> +
+
+
+ ../default/images/commodity.svg<:if test="${item.image != null || item.image != ''}">${item.image!}"> +
+
+

${item.name}

+
+ ¥ ${item.price} +
+
+ +
+
+ +
+
+
+
+
+
+ + + + + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/footer-menu-help.html"/> + +<:include file="./common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/common/footer-menu-help.html b/src/main/resources/templates/theme/default/common/footer-menu-help.html new file mode 100644 index 0000000..106cb8c --- /dev/null +++ b/src/main/resources/templates/theme/default/common/footer-menu-help.html @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/common/footer-menu-home.html b/src/main/resources/templates/theme/default/common/footer-menu-home.html new file mode 100644 index 0000000..5c2619f --- /dev/null +++ b/src/main/resources/templates/theme/default/common/footer-menu-home.html @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/common/footer-menu-search.html b/src/main/resources/templates/theme/default/common/footer-menu-search.html new file mode 100644 index 0000000..d90953f --- /dev/null +++ b/src/main/resources/templates/theme/default/common/footer-menu-search.html @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/common/footer.html b/src/main/resources/templates/theme/default/common/footer.html new file mode 100644 index 0000000..7392074 --- /dev/null +++ b/src/main/resources/templates/theme/default/common/footer.html @@ -0,0 +1,64 @@ + + +
+
+
+ + +
+
+
diff --git a/src/main/resources/templates/theme/default/common/header-article.html b/src/main/resources/templates/theme/default/common/header-article.html new file mode 100644 index 0000000..258a012 --- /dev/null +++ b/src/main/resources/templates/theme/default/common/header-article.html @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/common/header.html b/src/main/resources/templates/theme/default/common/header.html new file mode 100644 index 0000000..d65243d --- /dev/null +++ b/src/main/resources/templates/theme/default/common/header.html @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/common/js.html b/src/main/resources/templates/theme/default/common/js.html new file mode 100644 index 0000000..913998a --- /dev/null +++ b/src/main/resources/templates/theme/default/common/js.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/common/payError.html b/src/main/resources/templates/theme/default/common/payError.html new file mode 100644 index 0000000..74c2359 --- /dev/null +++ b/src/main/resources/templates/theme/default/common/payError.html @@ -0,0 +1,44 @@ + + + + <:include file="./title.html" websiteName="${title} - ${website.websiteName}" keywords="${website.keywords}" description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + +
+
+ +
+
+ +<:include file="./header.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}"/> + +
+
+
+ +

${msg}

+ +
+
+
+ + +<:include file="./footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + + +<:include file="./js.html"/> + + + + + diff --git a/src/main/resources/templates/theme/default/common/title.html b/src/main/resources/templates/theme/default/common/title.html new file mode 100644 index 0000000..9d48b3a --- /dev/null +++ b/src/main/resources/templates/theme/default/common/title.html @@ -0,0 +1,27 @@ +${websiteName!} + + + + + +${ctxPath}/default/images/logo.svg<:if test="${favicon != null || favicon != ''}">${favicon!}" rel="icon"> + + + + +<:if test="${shop.isClient == 1}"> + + diff --git a/src/main/resources/templates/theme/default/index-easy.html b/src/main/resources/templates/theme/default/index-easy.html new file mode 100644 index 0000000..d9e35a5 --- /dev/null +++ b/src/main/resources/templates/theme/default/index-easy.html @@ -0,0 +1,371 @@ + + + + <:include file="./common/title.html" websiteName="商店首页 - ${website.websiteName}" keywords="${website.keywords}" + description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + + + + + + +<:include file="./common/header.html" websiteName="${website.websiteName}" + websiteLogo="${website.websiteLogo}"/> + + +
+
+
+ <:if test="${carouselList != []}"> +
+ +
+
+ <:for items="${carouselList}" var="item"> +
+ <:if test="${item.imageLogo== null || item.imageLogo==''}"> + +
+

${item.title}

+
+
+ + <:if test="${item.imageLogo != null && item.imageLogo != ''}"> + +
+

${item.title}

+
+
+ +
+ +
+
+
+
+ + +
+ +
+ + +
+
+ 选择分类 +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ 购物须知 + + 文章教程 + + +
+
+
+ ${shop.storeDetails} +
+
+
+
+ +
+
+
+ 推荐商品 +
+
+
+ <:for items="${hotProductList}" var="item"> +
+
+
+ <:if test="${item.image == null || item.image == ''}"> + + + <:if test="${item.image != null && item.image != ''}"> + + +
+
+

${item.name}

+
+ ¥ + <:if test="${item.price == '0.00'}">免费 + <:if test="${item.price != '0.00'}">${item.price} +
+
+ +
+
+ + <:if test="${hotProductList == []}"> +
+ +

暂无商品

+
+ +
+
+
+
+
+
+ + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}"/> + +<:include file="./common/footer-menu-home.html"/> + + + + + + + +<:include file="./common/js.html"/> + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/index-list.html b/src/main/resources/templates/theme/default/index-list.html new file mode 100644 index 0000000..6c3435c --- /dev/null +++ b/src/main/resources/templates/theme/default/index-list.html @@ -0,0 +1,214 @@ + + + + <:include file="./common/title.html" websiteName="商店首页 - ${website.websiteName}" keywords="${website.keywords}" + description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + + + + + +<:include file="./common/header.html" websiteName="${website.websiteName}" + websiteLogo="${website.websiteLogo}"/> + + +
+
+ +
+
+
+
+

欢迎访问${website.websiteName}个人小店

+
${shop.storeDetails}
+
+
+
+
+
自动发货
+
+
+
+
数据安全
+
+
+
+
实时查询
+
+
+
+ +
+
+
+
+ + +
+ <:for items="${productListDTOList}" var="item"> +
+
+ ${item.title} + + 商品数量 ${item.productNum} 个 + +
+
+ <:if test="${item.productDTOList != null}"> +
+ <:for items="${item.productDTOList}" var="item"> +
+
+
+ + + ../default/images/commodity.svg<:if test="${item.indexLogo != null || item.indexLogo != ''}">${item.indexLogo}" class="post-thumb lazy"> + + +
+ +
+
+ <:if test="${item.shipType == 0}"> + 自动发货 + + <:if test="${item.shipType == 1}"> + 手动发货 + +
+ <:if test="${item.cardMember == 0}"> +
售罄
+ +
+ +
+ + <:if test="${item.productDTOList == []}"> +
+
+ + + + 没有更多商品了~ +
+
+ + +
+ + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/footer-menu-home.html"/> + +<:include file="./common/js.html"/> + + + + + + diff --git a/src/main/resources/templates/theme/default/index.html b/src/main/resources/templates/theme/default/index.html new file mode 100644 index 0000000..d7ccfc0 --- /dev/null +++ b/src/main/resources/templates/theme/default/index.html @@ -0,0 +1,295 @@ + + + + <:include file="./common/title.html" websiteName="商店首页 - ${website.websiteName}" keywords="${website.keywords}" + description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + + + + + +<:include file="./common/header.html" websiteName="${website.websiteName}" + websiteLogo="${website.websiteLogo}"/> + + +
+
+ +
+
+
+
+

欢迎访问${website.websiteName}个人小店

+
${shop.storeDetails}
+
+
+
+
+
自动发货
+
+
+
+
数据安全
+
+
+
+
实时查询
+
+
+
+ +
+
+
+
+ + +
+
+
+ 选择分类 +
+ +
+
+
+
+
+
+
+
+
+
+ + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/footer-menu-home.html"/> + + + + + + + +<:include file="./common/js.html"/> + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/order.html b/src/main/resources/templates/theme/default/order.html new file mode 100644 index 0000000..8424ac4 --- /dev/null +++ b/src/main/resources/templates/theme/default/order.html @@ -0,0 +1,112 @@ + + + + <:include file="./common/title.html" websiteName="订单详情 - ${website.websiteName}" + keywords="${website.keywords}" description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + +
+
+ +
+
+ +<:include file="./common/header.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}"/> + +
+
+ +
+
+ <:if test="${orders.status == 0}"> +
+ 订单还未付款! +
+ + + <:if test="${orders.status == 2}"> +
+ 请耐心等待店主发货哦! +
+ + + <:if test="${orders.status == 1 || orders.status == 3}"> +
+ +
+ + +
+
+ +
+
+
+
+
联系方式
+
${orders.email!orders.contact}
+
+
+
订单号
+
${orders.member!}
+
+
+
支付状态
+
+ <:if test="${orders.status==3}"> + 已发货 + + <:if test="${orders.status==2}"> + 待发货 + + <:if test="${orders.status==1}"> + 已支付 + + <:if test="${orders.status==0}"> + 未支付 + +
+
+
+
支付时间
+
${orders.payTime!}
+
+
+
付款金额
+
${orders.money!} 元
+
+
+
+
+
+
+ + + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/orderPass.html b/src/main/resources/templates/theme/default/orderPass.html new file mode 100644 index 0000000..7547c85 --- /dev/null +++ b/src/main/resources/templates/theme/default/orderPass.html @@ -0,0 +1,80 @@ + + + + <:include file="./common/title.html" websiteName="订单详情 - ${website.websiteName}" + keywords="${website.keywords}" description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + +
+
+ +
+
+ +<:include file="./common/header.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}"/> + +
+
+

查询该订单需要密码

+

输入取卡密码才可查看卡密

+
+
+
+ ${member!} +
+
+
请输入取卡密码:
+
+ +
+ +
+
+ +
+
+
+
+
+ + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + + +<:include file="./common/js.html"/> + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/pay-error.html b/src/main/resources/templates/theme/default/pay-error.html new file mode 100644 index 0000000..3d0db93 --- /dev/null +++ b/src/main/resources/templates/theme/default/pay-error.html @@ -0,0 +1,36 @@ + + + + <:include file="./common/title.html" websiteName="调用支付接口错误 - ${website.websiteName}" keywords="${website.keywords}" + description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + +
+
+ +
+
+ +<:include file="./common/header.html" websiteName="${website.websiteName}" + websiteLogo="${website.websiteLogo}"/> + +
+
+
+ +

【后台填写的 APPID 或 密钥不正确】

+ +
+
+
+ + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + + +<:include file="./common/js.html"/> + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/pay.html b/src/main/resources/templates/theme/default/pay.html new file mode 100644 index 0000000..ff603cf --- /dev/null +++ b/src/main/resources/templates/theme/default/pay.html @@ -0,0 +1,216 @@ + + + + <:include file="./common/title.html" websiteName="订单付款 - ${website.websiteName}" + keywords="${website.keywords}" + description="${website.description}" + favicon="${website.favicon}" + shop="${shop}"/> + + + + +
+
+ +
+
+ +<:include file="./common/header.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}"/> + +
+ +
+
订单提交成功,请尽快完成付款!
+
商品说明:${goodsName!}
+
+ 应付金额${price!}元 +
+
+ +
+
+
+ <:if test="${type==1}"> + + + <:if test="${type==2}"> + + +
+
+
+
+
+
+ <:if test="${type==2}"> + + + <:if test="${type==1}"> + + +
+ + +
+ +
请使用 + <:if test="${type==1}"> + 微信 + + <:if test="${type==2}"> + 支付宝 + + 扫一扫
扫描二维码支付 +
+
+ 0时 + 0分 + 0秒 +
+
+ + +
+ +
+ +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/js.html"/> + + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/payState.html b/src/main/resources/templates/theme/default/payState.html new file mode 100644 index 0000000..d954783 --- /dev/null +++ b/src/main/resources/templates/theme/default/payState.html @@ -0,0 +1,67 @@ + + + + <:include file="./common/title.html" websiteName="等待完成支付 - ${website.websiteName}" keywords="${website.keywords}" description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + +
+
+ +
+
+ +<:include file="./common/header.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}"/> + +
+
+ +

正在查询订单...

+ + +
+
+ + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + + +<:include file="./common/js.html"/> + + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/product.html b/src/main/resources/templates/theme/default/product.html new file mode 100644 index 0000000..4a95f56 --- /dev/null +++ b/src/main/resources/templates/theme/default/product.html @@ -0,0 +1,526 @@ + + + +<:include file="./common/title.html" websiteName="${products.name!} - ${website.websiteName}" keywords="${website.keywords}" description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + +
+
+ +
+
+ +<:include file="./common/header.html" websiteName="${website.websiteName}" + websiteLogo="${website.websiteLogo}"/> + + +
+
'../default/images/info_logo.svg'<:if test="${products.indexLogo != null || products.indexLogo != ''}">${products.indexLogo!}); filter: blur(1px);"> +
+
+ + +
+ +
+ + +
+
+ +
+
+
+ 商品介绍 + <:if test="${isCoupon >= 1}"> + + + <:if test="${products.restricts >= 1}"> + 限购: ${products.restricts!} + + <:if test="${products.shipType == 1}"> + 手动发货 + + <:if test="${products.shipType == 0}"> + 自动发货 + +
+
+
+
+
../default/images/commodity.svg<:if test="${products.imageLogo != null || products.imageLogo != ''}">${products.imageLogo!})">
+
+
+
+
+
+
商品名称
+
${products.name!}
+
+
+
商品分类
+
${classifyName!}
+
+
+
商品单价
+
+ <:if test="${products.price == 0.00}"> + 免费 + + <:if test="${products.price != 0.00}"> + ${products.price!} + +
+
+
+
商品库存
+
+ <:if test="${cardCount == 0}">缺货 + <:if test="${cardCount != 0}">${cardCount} +
+
+
+
+
+
+
+ <:if test="${products.componentEnabled == 0}"> +
+
+ + 提示 + ${products.componentPoint} +
+ <:if test="${products.componentType == 2}"> + 立即下载 + +
+ +
+
+
+ 商品详情 + 请详细阅读如下说明 +
+
+
+ ${products.pdInfo!} +
+
+
+
+ +
+ <:if test="${products.isWholesale == 1}"> +
+
+ 批发价格 + <:if test="${products.isWholesale == 1}"> + 折扣 + +
+
+ +
+ <:for items="${wholesaleList}" var="item"> + <:if test="${item.id == '0'}"> +
+
购买数量满${item.number}个或以上每个
+
+ ¥ ${item.money} +
+
+ + <:if test="${item.id != '0'}"> +
+
购买数量满${item.number}个或以上每个
+
+ ¥ ${item.money} +
+
+ + +
+
+
+ +
+
+ 购买信息 +
+
+
+
+ +
+ +
+
+ <:if test="${products.isPassword == 1}"> +
+ +
+ +
+
+ + <:if test="${isCustomize == 1}"> + <:for items="${customizeList!}" var="item"> +
+ +
+ +
+
+ + +
+ +
+
+
+ +
+ +
+ +
+
+
+
+ <:if test="${isCoupon >= 1}"> +
+ +
+ +
+
+ +
+
+
+ <:for items="${paysList}" var="item"> + <:if test="${item.driver=='mqpay_wxpay' || item.driver=='epay_wxpay' || item.driver=='budpay_wechat' || item.driver=='yungouos_wxpay' || item.driver=='xunhupay_wxpay' || item.driver=='payjs_wxpay' || item.driver=='wxpay_h5' || item.driver=='wxpay'}"> +
+
active" data-id="${item.driver}"> + + ${item.name} + <:if test="${item.isHandlingFee == 1}"> +
+ 手续费 +
+ +
+
+ + <:if test="${item.driver=='mqpay_alipay' || item.driver=='budpay_alipay' || item.driver=='epay_alipay' || item.driver=='yungouos_alipay' || item.driver=='xunhupay_alipay' || item.driver=='payjs_alipay' || item.driver=='alipay' || item.driver=='alipay_pc'}"> +
+
active" data-id="${item.driver}"> + + ${item.name} + <:if test="${item.isHandlingFee == 1}"> +
+ 手续费 +
+ +
+
+ + <:if test="${item.driver == 'epay_qqpay'}"> +
+
active" data-id="${item.driver}"> + + ${item.name} + <:if test="${item.isHandlingFee == 1}"> +
+ 手续费 +
+ +
+
+ + <:if test="${item.driver=='paypal'}"> +
+
active" data-id="${item.driver}"> + + ${item.name} + <:if test="${item.isHandlingFee == 1}"> +
+ 手续费 +
+ +
+
+ + <:if test="${item.driver=='epusdt'}"> +
+
active" data-id="${item.driver}"> + + ${item.name} + <:if test="${item.isHandlingFee == 1}"> +
+ 手续费 +
+ +
+
+ + +
+
+ +
+ + + + <:if test="${products.price == 0.00}">免费 + <:if test="${products.price != 0.00}">${products.price} + + + +
+
+
+ +
+
+ 商品详情 + 请详细阅读如下说明 +
+
+
+ ${products.pdInfo!} +
+
+
+
+
+
+ + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/js.html"/> + + + diff --git a/src/main/resources/templates/theme/default/product404.html b/src/main/resources/templates/theme/default/product404.html new file mode 100644 index 0000000..971ad61 --- /dev/null +++ b/src/main/resources/templates/theme/default/product404.html @@ -0,0 +1,31 @@ + + + + <:include file="./common/title.html" websiteName="商品未找到或已下架 - ${website.websiteName}" keywords="${website.keywords}" description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + +
+
+ +
+
+ +<:include file="./common/header.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}"/> +
+
+
+ +

 抱歉,此商品不存在或已下架。

+ +
+
+
+ +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/js.html"/> + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/search.html b/src/main/resources/templates/theme/default/search.html new file mode 100644 index 0000000..6cda585 --- /dev/null +++ b/src/main/resources/templates/theme/default/search.html @@ -0,0 +1,168 @@ + + + + <:include file="./common/title.html" websiteName="订单查询 - ${website.websiteName}" keywords="${website.keywords}" + description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + + + +<:include file="./common/header.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}"/> +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ +

暂无记录

+
+
+
+
+ + +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/footer-menu-search.html"/> + + + + +<:include file="./common/js.html"/> + + + + + diff --git a/src/main/resources/templates/theme/default/xunhupay.html b/src/main/resources/templates/theme/default/xunhupay.html new file mode 100644 index 0000000..be8176d --- /dev/null +++ b/src/main/resources/templates/theme/default/xunhupay.html @@ -0,0 +1,132 @@ + + + + <:include file="./common/title.html" websiteName="订单付款 - ${website.websiteName}" keywords="${website.keywords}" description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + + +
+
+ +
+
+ + +<:include file="./common/header.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}"/> + +
+ +
+
订单提交成功,请尽快完成付款!
+
商品说明:${goodsName!}
+
+ 应付金额${price!}元 +
+
+ +
+
+
+ <:if test="${type==1}"> + + + <:if test="${type==2}"> + + +
+
+
+
+
+
+ +
+ <:if test="${type==2}"> + + + <:if test="${type==1}"> + + +
+ + +
+ +
请使用 + <:if test="${type==1}"> + 微信 + + <:if test="${type==2}"> + 支付宝 + + 扫一扫
扫描二维码支付 +
+
+
+
+ + +
+ +
+ +<:include file="./common/footer.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}" shop="${shop}"/> + +<:include file="./common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/default/yunpay.html b/src/main/resources/templates/theme/default/yunpay.html new file mode 100644 index 0000000..81537c1 --- /dev/null +++ b/src/main/resources/templates/theme/default/yunpay.html @@ -0,0 +1,134 @@ + + + + <:include file="./common/title.html" websiteName="订单付款 - ${website.websiteName}" keywords="${website.keywords}" description="${website.description}" favicon="${website.favicon}" shop="${shop}"/> + + + + +
+
+ +
+
+ +<:include file="./common/header.html" websiteName="${website.websiteName}" websiteLogo="${website.websiteLogo}"/> +
+
+
订单提交成功,请尽快完成付款!
+
商品说明:${goodsName!}
+
+ 应付金额${price!}元 +
+
+
+
+
+ <:if test="${type==1}"> + + + <:if test="${type==2}"> + + +
+
+
+
+
+
+ <:if test="${type==2}"> + + + <:if test="${type==1}"> + + +
+ + +
+ +
请使用 + <:if test="${type==1}"> + 微信 + + <:if test="${type==2}"> + 支付宝 + + 扫一扫
扫描二维码支付 +
+
+
+
+ +
+
+ +<:include file="./common/footer.html" websiteName="${website.websiteName}" beianIcp="${website.beianIcp}" shop="${shop}"/> + +<:include file="./common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/theme/theme.html b/src/main/resources/templates/theme/theme.html new file mode 100644 index 0000000..749a1aa --- /dev/null +++ b/src/main/resources/templates/theme/theme.html @@ -0,0 +1,70 @@ + + + + <:include file="../common/css.html" title="主题配置管理"/> + + + +
+
+
+ +
+
+
+
+ + +<:include file="../common/js.html"/> + + + \ No newline at end of file diff --git a/src/main/resources/templates/website/website.html b/src/main/resources/templates/website/website.html new file mode 100644 index 0000000..1a460a0 --- /dev/null +++ b/src/main/resources/templates/website/website.html @@ -0,0 +1,173 @@ + + + + <:include file="../common/css.html" title="发送邮件"/> + + + + +
+ +
+
+
+ 网站设置 +
+
+ +
+ + +
+
+ +
+ +
+
推荐图片尺寸为【100x100】
+
+
+
+
+ + +
+
+ +
+ +
+
推荐图片尺寸为【100x100】
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+ + +
+
+
+<:include file="../common/js.html"/> + + + +