From 60703480d35b99ad54088899e53b6cc3213d867a Mon Sep 17 00:00:00 2001 From: honue Date: Mon, 19 May 2025 18:52:19 +0800 Subject: [PATCH 01/46] =?UTF-8?q?fix(TrackerEditor):=20=E7=BC=A9=E8=BF=9B?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E8=AE=A1=E6=95=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- plugins/trackereditor/__init__.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 28f01cf..db8de10 100644 --- a/package.json +++ b/package.json @@ -742,7 +742,7 @@ "name": "Tracker替换", "description": "批量替换修改种子tracker。", "labels": "做种", - "version": "1.8", + "version": "1.9", "icon": "trackereditor_A.png", "author": "honue", "level": 1, diff --git a/plugins/trackereditor/__init__.py b/plugins/trackereditor/__init__.py index a12e427..a1a225f 100644 --- a/plugins/trackereditor/__init__.py +++ b/plugins/trackereditor/__init__.py @@ -19,7 +19,7 @@ class TrackerEditor(_PluginBase): # 插件图标 plugin_icon = "trackereditor_A.png" # 插件版本 - plugin_version = "1.8" + plugin_version = "1.9" # 插件作者 plugin_author = "honue" # 作者主页 @@ -91,7 +91,7 @@ class TrackerEditor(_PluginBase): new_url = tracker.url.replace(target_domain, tracker_dict[target_domain]) logger.info(f"{original_url[:30]}... 替换为 {new_url[:30]}...") torrent.edit_tracker(orig_url=original_url, new_url=new_url) - torrent_update_cnt += 1 + torrent_update_cnt += 1 elif self._downloader_type == "transmission": self._downloader = Transmission(self._host, self._port, self._username, self._password) From e58a7c5a6af2575070f5ff96e3720b34bd10c8fa Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 10:54:13 +0800 Subject: [PATCH 02/46] =?UTF-8?q?brushflow:=20=E5=A2=9E=E5=8A=A0=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E4=BF=83=E9=94=80=E7=BB=93=E6=9D=9F=E7=9A=84=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=8B=E8=BD=BD=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/brushflow/__init__.py | 74 +++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 4e692c9..3103c87 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -54,6 +54,7 @@ class BrushConfig: self.exclude = config.get("exclude") self.size = config.get("size") self.seeder = config.get("seeder") + self.timezone_offset = (self.__parse_number(config.get("timezone_offset", "+0")) or 0) * 60 # 转换到分钟 self.pubtime = config.get("pubtime") self.seed_time = self.__parse_number(config.get("seed_time")) self.hr_seed_time = self.__parse_number(config.get("hr_seed_time")) @@ -72,6 +73,7 @@ class BrushConfig: self.except_subscribe = config.get("except_subscribe", True) self.brush_sequential = config.get("brush_sequential", False) self.proxy_delete = config.get("proxy_delete", False) + self.del_no_free = config.get("del_no_free", False) if self.freeleech in ["free", "2xfree"] else False self.active_time_range = config.get("active_time_range") self.cron = config.get("cron") self.qb_category = config.get("qb_category") @@ -107,6 +109,7 @@ class BrushConfig: "exclude", "size", "seeder", + "timezone_offset", "pubtime", "seed_time", "hr_seed_time", @@ -119,7 +122,8 @@ class BrushConfig: "proxy_delete", "qb_category", "site_hr_active", - "site_skip_tips" + "site_skip_tips", + "del_no_free" # 当新增支持字段时,仅在此处添加字段名 } try: @@ -173,6 +177,8 @@ class BrushConfig: "exclude": "", "size": "10-500", "seeder": "1", + // 用户本地时区与站点时区的时间偏移,单位为小时。例如:主机时区是UTC+8,站点时区是UTC,应配置为+8;主机时区是UTC,站点时区是UTC+8,应配置为-8 + "timezone_offset": "+0", "pubtime": "5-120", "seed_time": 120, "hr_seed_time": 144, @@ -183,6 +189,8 @@ class BrushConfig: "seed_inactivetime": "", "save_path": "/downloads/site1", "proxy_delete": false, + // 是否删除促销超时的未完成下载,仅当freeleech配置为free或2xfree时有效 + "del_no_free": false, "qb_category": "刷流", "site_hr_active": true, "site_skip_tips": true @@ -251,7 +259,7 @@ class BrushFlow(_PluginBase): # 插件图标 plugin_icon = "brush.jpg" # 插件版本 - plugin_version = "4.3.1" + plugin_version = "4.3.2" # 插件作者 plugin_author = "jxxghp,InfinityPacer" # 作者主页 @@ -1621,6 +1629,27 @@ class BrushFlow(_PluginBase): ] } ] + }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VSwitch', + 'props': { + 'model': 'del_no_free', + 'label': '删除促销过期的未完成下载', + } + } + ] + } + ] } ] } @@ -1794,6 +1823,7 @@ class BrushFlow(_PluginBase): "except_subscribe": True, "brush_sequential": False, "proxy_delete": False, + "del_no_free": False, "freeleech": "free", "hr": "yes", "enable_site_config": False, @@ -2232,8 +2262,13 @@ class BrushFlow(_PluginBase): if not (seeders_range[0] <= torrent.seeders <= seeders_range[1]): return False, f"做种人数 {torrent.seeders},不在指定范围内" - # 发布时间 - pubdate_minutes = self.__get_pubminutes(torrent.pubdate) + # 发布时间:用户时间 - 站点时间 - 时区偏移 + # e.g.1: 用户UTC+8,站点UTC,timezone_offset应为+8,种子在UTC 0:00/UTC+8 8:00发布; + # 9:17 - 0:00 - 8:00 = 1:17;1小时17分为正确的发布时间与当前的时间差 + # e.g.2: 用户UTC,站点UTC+8,timezone_offset应为-8,种子在UTC 0:00/UTC+8 8:00发布: + # 1:17 - 8:00 - (-8:00) = 1:17;1小时17分为正确的发布时间与当前的时间差 + # timezone_offset为后加功能,默认为0,方便后续更多与时间相关的功能开发,之前在单独站点配置中使用pubtime计算过时区偏移的用户也不受影响 + pubdate_minutes = self.__get_pubminutes(torrent.pubdate) - brush_config.timezone_offset # 已支持独立站点配置,取消单独适配站点时区逻辑,可通过配置项「pubtime」自行适配 # pubdate_minutes = self.__adjust_site_pubminutes(pubdate_minutes, torrent) if brush_config.pubtime: @@ -2241,11 +2276,11 @@ class BrushFlow(_PluginBase): if len(pubtimes) == 1: # 单个值:选择发布时间小于等于该值的种子 if pubdate_minutes > pubtimes[0]: - return False, f"发布时间 {torrent.pubdate},{pubdate_minutes:.0f} 分钟前,不符合条件" + return False, f"发布时间(站点时区){torrent.pubdate},当前配置时区偏移 {brush_config.timezone_offset} 小时,{pubdate_minutes:.0f} 分钟前,不符合条件" else: # 范围值:选择发布时间在范围内的种子 if not (pubtimes[0] <= pubdate_minutes <= pubtimes[1]): - return False, f"发布时间 {torrent.pubdate},{pubdate_minutes:.0f} 分钟前,不在指定范围内" + return False, f"发布时间(站点时区){torrent.pubdate},当前配置时区偏移 {brush_config.timezone_offset} 小时,{pubdate_minutes:.0f} 分钟前,不在指定范围内" return True, None @@ -2528,13 +2563,38 @@ class BrushFlow(_PluginBase): 评估动态删除前置条件并返回是否应删除种子及其原因 """ brush_config = self.__get_brush_config(sitename=site_name) + torrent = (self.get_data("torrents") or {}).get(torrent_info.get("hash", ""), None) + should_delete = False reason = "未能满足动态删除设置的前置删除条件" + if not torrent: + logger.debug(f"未获取到种子 {torrent_info.get("hash", "?")} 的任务信息。") + + while torrent and brush_config.del_no_free: + if not torrent.get("freedate", None): + logger.warning(f"配置了‘删除促销过期的未完成下载’,但未获取到该种子的促销截止时间,跳过。") + break + try: + now = datetime.now() + freedate_origin = torrent.get("freedate") + freedate = freedate_origin.replace("T", " ").replace("Z", "") + freedate = datetime.strptime(freedate, "%Y-%m-%d %H:%M:%S") + delta_minutes = (((now - freedate).total_seconds() + 60) // 60) - brush_config.timezone_offset + logger.debug(f"促销截止(站点时间): {freedate_origin}, 时区偏移: {brush_config.timezone_offset}, 用户当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}, 时间差: {delta_minutes}分") + if delta_minutes <= 0: + should_delete = True + reason = f"促销已过期。" + except Exception as e: + logger.warning(f"处理‘删除促销过期的未完成下载’时报错,继续判断其他删除条件。") + logger.debug(f"error: {e}") + finally: + break + if brush_config.download_time and torrent_info.get("downloaded") < torrent_info.get( "total_size") and torrent_info.get("dltime") >= float(brush_config.download_time) * 3600: reason = f"下载耗时 {torrent_info.get('dltime') / 3600:.1f} 小时,大于 {brush_config.download_time} 小时" - else: + elif not should_delete: return False, reason return True, reason From 61377118fb886630b93d2a884f9ea508d36c8c81 Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 10:59:24 +0800 Subject: [PATCH 03/46] =?UTF-8?q?brushflow:=20=E6=9B=B4=E6=96=B0package.v2?= =?UTF-8?q?.json=E4=B8=AD=E7=9A=84=E7=89=88=E6=9C=AC=E5=8F=B7=E5=92=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.v2.json b/package.v2.json index 88c0d3a..c7623ce 100644 --- a/package.v2.json +++ b/package.v2.json @@ -21,11 +21,12 @@ "name": "站点刷流", "description": "自动托管刷流,将会提高对应站点的访问频率。", "labels": "刷流,仪表板", - "version": "4.3.1", + "version": "4.3.2", "icon": "brush.jpg", "author": "jxxghp,InfinityPacer", "level": 2, "history": { + "v4.3.2": "增加'删除促销结束的未完成下载'功能", "v4.3.1": "修复了一些细节问题", "v4.3": "支持带宽采样并计算平均值,以优化刷流效率", "v4.2": "优化执行周期输入,需要MoviePilot v2.2.1+", From caf508217b2dedaff6e140291b65dbcade81d616 Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 11:08:23 +0800 Subject: [PATCH 04/46] brushflow: fix typo bug --- plugins.v2/brushflow/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 3103c87..03412e3 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -2569,7 +2569,7 @@ class BrushFlow(_PluginBase): reason = "未能满足动态删除设置的前置删除条件" if not torrent: - logger.debug(f"未获取到种子 {torrent_info.get("hash", "?")} 的任务信息。") + logger.debug(f"未获取到种子 {torrent_info.get('hash', '?')} 的任务信息。") while torrent and brush_config.del_no_free: if not torrent.get("freedate", None): From 5d604b9b1402599547f4c733fa94ae5752b91773 Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 11:24:55 +0800 Subject: [PATCH 05/46] =?UTF-8?q?=E5=A2=9E=E5=8A=A0debug=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=8E=92=E6=9F=A5del=5Fno=5Ffree=E6=97=A0=E6=B3=95=E8=A2=AB?= =?UTF-8?q?=E4=BD=BF=E8=83=BD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/brushflow/__init__.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 03412e3..3fb0094 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -39,6 +39,8 @@ class BrushConfig: """ def __init__(self, config: dict, process_site_config=True): + logger.debug(f"[xx]根据配置创建BrushConfig:{config}") + self.enabled = config.get("enabled", False) self.notify = config.get("notify", True) self.onlyonce = config.get("onlyonce", False) @@ -74,6 +76,7 @@ class BrushConfig: self.brush_sequential = config.get("brush_sequential", False) self.proxy_delete = config.get("proxy_delete", False) self.del_no_free = config.get("del_no_free", False) if self.freeleech in ["free", "2xfree"] else False + logger.debug(f'self.freeleech: {self.freeleech}, self.freeleech in ["free", "2xfree"]: {self.freeleech in ["free", "2xfree"]}, del_no_free: {del_no_free}') self.active_time_range = config.get("active_time_range") self.cron = config.get("cron") self.qb_category = config.get("qb_category") @@ -2571,6 +2574,8 @@ class BrushFlow(_PluginBase): if not torrent: logger.debug(f"未获取到种子 {torrent_info.get('hash', '?')} 的任务信息。") + logger.debug(f"brush_config.del_no_free: {brush_config.del_no_free}") + while torrent and brush_config.del_no_free: if not torrent.get("freedate", None): logger.warning(f"配置了‘删除促销过期的未完成下载’,但未获取到该种子的促销截止时间,跳过。") From 7cc2571027fc3b993f6a6e8968c22b35bcda2e00 Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 11:37:25 +0800 Subject: [PATCH 06/46] =?UTF-8?q?=E4=BF=AE=E5=A4=8Ddel=5Fno=5Ffree?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=A2=ABGUI=E8=AE=BE=E7=BD=AE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/brushflow/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 3fb0094..77178b0 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -3022,6 +3022,7 @@ class BrushFlow(_PluginBase): "exclude": brush_config.exclude, "size": brush_config.size, "seeder": brush_config.seeder, + "timezone_offset": brush_config.timezone_offset, "pubtime": brush_config.pubtime, "seed_time": brush_config.seed_time, "hr_seed_time": brush_config.hr_seed_time, @@ -3045,6 +3046,7 @@ class BrushFlow(_PluginBase): "qb_category": brush_config.qb_category, "enable_site_config": brush_config.enable_site_config, "site_config": brush_config.site_config, + "del_no_free": brush_config.del_no_free, "_tabs": self._tabs } From 0df7d4ae0ca123ae2bc76550f9532c88cd19c92e Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 11:41:50 +0800 Subject: [PATCH 07/46] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E4=B8=ADdel=5Fno=5Ffree=E5=8F=98=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在日志输出中,将错误的变量名`del_no_free`修正为`self.del_no_free`,以确保日志信息正确反映对象属性值。 --- plugins.v2/brushflow/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 77178b0..1cdfb00 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -76,7 +76,7 @@ class BrushConfig: self.brush_sequential = config.get("brush_sequential", False) self.proxy_delete = config.get("proxy_delete", False) self.del_no_free = config.get("del_no_free", False) if self.freeleech in ["free", "2xfree"] else False - logger.debug(f'self.freeleech: {self.freeleech}, self.freeleech in ["free", "2xfree"]: {self.freeleech in ["free", "2xfree"]}, del_no_free: {del_no_free}') + logger.debug(f'self.freeleech: {self.freeleech}, self.freeleech in ["free", "2xfree"]: {self.freeleech in ["free", "2xfree"]}, del_no_free: {self.del_no_free}') self.active_time_range = config.get("active_time_range") self.cron = config.get("cron") self.qb_category = config.get("qb_category") From 4a1bdb6c45176ccf3e0fb2a6f02a7241a387f1ce Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 12:00:17 +0800 Subject: [PATCH 08/46] =?UTF-8?q?=E5=9C=A8=E6=9C=AA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E5=88=A0=E7=A7=8D=E7=9A=84=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E4=B8=AD=E5=A2=9E=E5=8A=A0del=5Fno=5Ffree=E7=9A=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/brushflow/__init__.py | 38 ++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 1cdfb00..1098e09 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -39,8 +39,6 @@ class BrushConfig: """ def __init__(self, config: dict, process_site_config=True): - logger.debug(f"[xx]根据配置创建BrushConfig:{config}") - self.enabled = config.get("enabled", False) self.notify = config.get("notify", True) self.onlyonce = config.get("onlyonce", False) @@ -76,7 +74,6 @@ class BrushConfig: self.brush_sequential = config.get("brush_sequential", False) self.proxy_delete = config.get("proxy_delete", False) self.del_no_free = config.get("del_no_free", False) if self.freeleech in ["free", "2xfree"] else False - logger.debug(f'self.freeleech: {self.freeleech}, self.freeleech in ["free", "2xfree"]: {self.freeleech in ["free", "2xfree"]}, del_no_free: {self.del_no_free}') self.active_time_range = config.get("active_time_range") self.cron = config.get("cron") self.qb_category = config.get("qb_category") @@ -2539,6 +2536,24 @@ class BrushFlow(_PluginBase): return True, f"H&R种子,分享率 {torrent_info.get('ratio'):.2f},大于 {brush_config.seed_ratio}" return False, "H&R种子,未能满足设置的H&R删除条件" + while brush_config.del_no_free: + if not torrent_task.get("freedate", None): + logger.warning(f"配置了‘删除促销过期的未完成下载’,但未获取到该种子的促销截止时间,跳过。") + break + try: + now = datetime.now() + freedate_origin = torrent_task.get("freedate") + freedate = freedate_origin.replace("T", " ").replace("Z", "") + freedate = datetime.strptime(freedate, "%Y-%m-%d %H:%M:%S") + delta_minutes = (((now - freedate).total_seconds() + 60) // 60) - brush_config.timezone_offset + logger.debug(f"促销截止(站点时间): {freedate_origin}, 时区偏移: {brush_config.timezone_offset}, 用户当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}, 时间差: {delta_minutes}分") + if delta_minutes <= 0: + return True, "促销过期" + except Exception as e: + logger.warning(f"处理‘删除促销过期的未完成下载’时报错,继续判断其他删除条件。") + logger.debug(f"error: {e}") + break + # 处理其他场景,1. 不是H&R种子;2. 是H&R种子但没有特定条件配置 reason = reason if not hit_and_run else "H&R种子(未设置H&R条件),未能满足设置的删除条件" if brush_config.seed_time and torrent_info.get("seeding_time") >= float(brush_config.seed_time) * 3600: @@ -2561,28 +2576,22 @@ class BrushFlow(_PluginBase): return True, reason if not hit_and_run else "H&R种子(未设置H&R条件)," + reason - def __evaluate_proxy_pre_conditions_for_delete(self, site_name: str, torrent_info: dict) -> Tuple[bool, str]: + def __evaluate_proxy_pre_conditions_for_delete(self, site_name: str, torrent_info: dict, torrent_task: dict) -> Tuple[bool, str]: """ 评估动态删除前置条件并返回是否应删除种子及其原因 """ brush_config = self.__get_brush_config(sitename=site_name) - torrent = (self.get_data("torrents") or {}).get(torrent_info.get("hash", ""), None) should_delete = False reason = "未能满足动态删除设置的前置删除条件" - if not torrent: - logger.debug(f"未获取到种子 {torrent_info.get('hash', '?')} 的任务信息。") - - logger.debug(f"brush_config.del_no_free: {brush_config.del_no_free}") - - while torrent and brush_config.del_no_free: - if not torrent.get("freedate", None): + while brush_config.del_no_free: + if not torrent_task.get("freedate", None): logger.warning(f"配置了‘删除促销过期的未完成下载’,但未获取到该种子的促销截止时间,跳过。") break try: now = datetime.now() - freedate_origin = torrent.get("freedate") + freedate_origin = torrent_task.get("freedate") freedate = freedate_origin.replace("T", " ").replace("Z", "") freedate = datetime.strptime(freedate, "%Y-%m-%d %H:%M:%S") delta_minutes = (((now - freedate).total_seconds() + 60) // 60) - brush_config.timezone_offset @@ -2664,7 +2673,8 @@ class BrushFlow(_PluginBase): # 删除种子的具体实现可能会根据实际情况略有不同 should_delete, reason = self.__evaluate_proxy_pre_conditions_for_delete(site_name=site_name, - torrent_info=torrent_info) + torrent_info=torrent_info, + torrent_task=torrent_task) if should_delete: delete_hashes.append(torrent_hash) self.__send_delete_message(site_name=site_name, torrent_title=torrent_title, torrent_desc=torrent_desc, From b5b193aaac69ca14f767a445210a5f3bfa183f0c Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 12:19:02 +0800 Subject: [PATCH 09/46] fix bug --- plugins.v2/brushflow/__init__.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 1098e09..76e7422 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -2545,7 +2545,7 @@ class BrushFlow(_PluginBase): freedate_origin = torrent_task.get("freedate") freedate = freedate_origin.replace("T", " ").replace("Z", "") freedate = datetime.strptime(freedate, "%Y-%m-%d %H:%M:%S") - delta_minutes = (((now - freedate).total_seconds() + 60) // 60) - brush_config.timezone_offset + delta_minutes = (((freedate - now).total_seconds() + 60) // 60) - brush_config.timezone_offset logger.debug(f"促销截止(站点时间): {freedate_origin}, 时区偏移: {brush_config.timezone_offset}, 用户当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}, 时间差: {delta_minutes}分") if delta_minutes <= 0: return True, "促销过期" @@ -2582,7 +2582,6 @@ class BrushFlow(_PluginBase): """ brush_config = self.__get_brush_config(sitename=site_name) - should_delete = False reason = "未能满足动态删除设置的前置删除条件" while brush_config.del_no_free: @@ -2594,16 +2593,14 @@ class BrushFlow(_PluginBase): freedate_origin = torrent_task.get("freedate") freedate = freedate_origin.replace("T", " ").replace("Z", "") freedate = datetime.strptime(freedate, "%Y-%m-%d %H:%M:%S") - delta_minutes = (((now - freedate).total_seconds() + 60) // 60) - brush_config.timezone_offset + delta_minutes = (((freedate - now).total_seconds() + 60) // 60) - brush_config.timezone_offset logger.debug(f"促销截止(站点时间): {freedate_origin}, 时区偏移: {brush_config.timezone_offset}, 用户当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}, 时间差: {delta_minutes}分") if delta_minutes <= 0: - should_delete = True - reason = f"促销已过期。" + return True, f"促销已过期" except Exception as e: logger.warning(f"处理‘删除促销过期的未完成下载’时报错,继续判断其他删除条件。") logger.debug(f"error: {e}") - finally: - break + break if brush_config.download_time and torrent_info.get("downloaded") < torrent_info.get( "total_size") and torrent_info.get("dltime") >= float(brush_config.download_time) * 3600: From 7c976748833363cf30eb22beac4dbab290431333 Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 12:23:17 +0800 Subject: [PATCH 10/46] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E2=80=9C=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=9A=84=E4=B8=8B=E8=BD=BD=E2=80=9D=E7=9A=84?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/brushflow/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 76e7422..7c81996 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -2536,7 +2536,7 @@ class BrushFlow(_PluginBase): return True, f"H&R种子,分享率 {torrent_info.get('ratio'):.2f},大于 {brush_config.seed_ratio}" return False, "H&R种子,未能满足设置的H&R删除条件" - while brush_config.del_no_free: + while brush_config.del_no_free and torrent_info.get("downloaded") < torrent_info.get("total_size"): if not torrent_task.get("freedate", None): logger.warning(f"配置了‘删除促销过期的未完成下载’,但未获取到该种子的促销截止时间,跳过。") break From edba761e92700f72918f6804ad351c0c3d1ea53d Mon Sep 17 00:00:00 2001 From: pren Date: Thu, 22 May 2025 14:17:37 +0800 Subject: [PATCH 11/46] =?UTF-8?q?brushflow:=20=E5=A2=9E=E5=8A=A0=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E5=88=A0=E7=A7=8D=E6=97=B6=E7=9A=84=E2=80=9C=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=8B=E8=BD=BD=E2=80=9D=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/brushflow/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 7c81996..8cc8126 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -2584,7 +2584,7 @@ class BrushFlow(_PluginBase): reason = "未能满足动态删除设置的前置删除条件" - while brush_config.del_no_free: + while brush_config.del_no_free and torrent_info.get("downloaded") < torrent_info.get("total_size"): if not torrent_task.get("freedate", None): logger.warning(f"配置了‘删除促销过期的未完成下载’,但未获取到该种子的促销截止时间,跳过。") break From 96e8d0fbea5e3c2d872859d9f7e4a89967de2744 Mon Sep 17 00:00:00 2001 From: wumode Date: Thu, 22 May 2025 18:10:25 +0800 Subject: [PATCH 12/46] =?UTF-8?q?add:=20IMDb=E6=BA=90=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- icons/IMDb_IOS-OSX_App.png | Bin 0 -> 17876 bytes package.v2.json | 12 + plugins.v2/imdbsource/__init__.py | 953 +++++++++++++++++++++++++ plugins.v2/imdbsource/imdb_helper.py | 651 +++++++++++++++++ plugins.v2/imdbsource/requirements.txt | 3 + 5 files changed, 1619 insertions(+) create mode 100644 icons/IMDb_IOS-OSX_App.png create mode 100644 plugins.v2/imdbsource/__init__.py create mode 100644 plugins.v2/imdbsource/imdb_helper.py create mode 100644 plugins.v2/imdbsource/requirements.txt diff --git a/icons/IMDb_IOS-OSX_App.png b/icons/IMDb_IOS-OSX_App.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5b8737ad10a24c08a47ff30a9f354bb2a0704a GIT binary patch literal 17876 zcmeHvi9eL>*Z4JK-$|hml~M`GPMD&El1IwE6iV6364_=vDoP=eB8;a}Le{KdDngPe z%DzO|v+v8yd+zD^zQ4cW_kOE^2VC2S%>t_|P^RT5Le5r7%5-HWU`X~lDQ2XfF&W}&P0)Bf(A(n9Fi`w~zWf!vy}AJve(L&Jr+Uu$3tjk@5e}imG2#b9{;9E+8zy2n z0+-Lkf<$!ujVd7`Lgd}Tj?ZNJ+--4<(#RzjXn&uVKTN;cVTcfkd+p$vGQ9S2TlRGU zq(lXvc@~ySL|ONp2oY}5PG&LVq)!PS_GCspX^j#Hz1ZBzwB;x=@#fpN7Oh`x((eVD zxm8(0z%yKuyugfsgx$Q;&Mb?eNsA z)(NixJP7iYLIU(I%Ts^t7e_3KNn*=}SzYrw_e(Ycf$5r}GTo@k$o7~uJL05np7A@l z-R`6<7c6U7Q`_F7B6WF|86~xpj?u>=L<|@MMz(h%Jcn7^#1xTAT7mqp;b_%vM=1ISEdqvS(G=^g#@ z8xrscQEt;W11hY{R}Ud7OBhDar3Mm3t{tBn3i2N~O9grfw%wxq{s(=x`95cI;7NW! zFW%ALnc)h`M3&Ksju1oTq5ev!!7V&NY{%PXL(F%g*RZ9PQbI>pf-MY2hgM4zSy%<)f1cAmqk+pmxJ|Nwmjw7b z3QTu0=GWDm=&cnM?D}MU6-O8%&NZ2~0cUb(gp(pw9LCM}St+CLQ8LU5#T# z!T!$V*XM-t+0j0XL4|wbvQx`s|A2RUmlm;Ux z1WTymt@+rIf7)sj62S;29I{ds$yLUYFy%rluBX|lw-Kcu!#K8Z7qd$ca$qd0w-UfB zX&_AXg&4@+pX^Llc5zfzLBl~mh!4tmVR`;^!LD$`aKFAhT1l94>aD5xio=l8NYz2V zpZ$}j!e25!_%g(h{t7rtatm&=Oj0p?qJh9)r$j}7qdhii1uN=0Y9f|Cdh5&46nwXJ zUpmf4xG+sWYq184VtS5c`QQ&Gm&JG}??Mp~pf@I?+hGlPz$7c{v}l?D4&%J&j}nZi z(ILRp_4l_BR;*KXd%w@926Q`!%VQYjoD$AUv0_7f$JZnbF~dYz7qqwYwl4cqIy`X0 z+@@-q8T7XFn&>^wnl+(xu%ffWz#r6TI+jLy&5hw56`n?f9;K#YP1lZ&jBaky=Sq4n zgFvM6qpHPyDbe*U36 z&+81vkHRl$pF31Do?0WZWlY#dW4H1=%wnS4!?1PQHS&eDrx=OxF<{0--?OmflD_A} zMf#2nA9&y-LwLzcio2B}3{6wbNBsseeCYT(0Fv}JFlKq-!_e=Zh^3*ADf}>HbWBGJ zlW}H1{!2|{d}b{OI!(-_GlTL!;{P?9*Dq5*3(=(s*W}k;JNLHZsp>;hivkK}D{+|N zcz@Eb?iq@*S#xYZX?B{8BFa#F6usqkyt4O*;UwC>ge_MwTOm;PYQP>-V$h^INjHT2 zZOVl0@&4=-CLFh)uF1+i7e7uQHOrX+&>4dD<9)Mljku78{^mRP=a;Z$2X;7b<+Aw5 zPpHM1O0YN76w1xwB@O)9v;y1I_Xp=By1a;iRC#t^j&wi+bzvMJ(c-_dn7FWEDur?2 z-ByePGxMn_V4jOdv@E`eBhQU%{?Hkdsd_so_Z=pGdd{X92k0W`RVyB8#P7~$BH!P0 z1Dlig?t8}#AM|hyBk$SnaXr#M8t6C;+o^xk)$NpY&42eb-30sUv60H@FwrFCa2dMI zj-obAi9nOm5#_#sQ`v+*orn^PjJVe*geg{*>(c_($Q}d_%>L=E{B9Y!=&UG?YE`C7v3ZkG^Q*Ul#hKdFS0=5hPGYt(_xn*u6!Um7lS6YY zhA9djaXr!Fi7sa~H35^6%8-RlYKu3f!ZUX-&tYtPdf=;N(&E!pUXo*Q5auOJ9y?Zq z96qUwc<7h|=or2z;*bNo2CS{ZC_z1HekK8qWRTDC+JNN-TQ zLUvEQod$}Uw}Yb%nf&9}O{=lPlTxBFCLqIa^Hvp^h}>+t|Er%mbPzTlE$e2by0cO8 zXxQn341Kbaz$g)U9Yb(5BU5?xCXTc~gvN{4uZnO!&A7{Mv#+6vc4`!Tu^--rs5Fe+ z`Jx{k!QF_kssjzBcQ-qc$|zE^v5|!);TCVsVz?*^s^yfy@Z8;;H&2_&EBBjxwZitt zjlbT&31=hvIQ3N4 z(J>0{7LAILzG)!d1UpQgCh6~^X*b~qLLEa>Ppa~)kOQ4TT&M8&1-tzfizX+Pyow(fMGR)nQHvA5r z3e#sI>3;i$$>9DlEE-~Xs~;b+01_F__F2*2@}gBbw8*yF_G3CCXgs^}4-tWr>xcg^ zr1hmZ!q|vh5>7Lb(wH&(LBE!Rva5E!P< zvp)pos@ncx)xuGBYz6uE!qJBq4#<6x%1zSc;KCXoy?4W0>{Hn0NL*?p9uyOxYx-`3 z4#GuRCWaTPqdd6GK&G(Ujsc*s*UlOnkYvKB1{HI|x=Gw^j9KcKmp}y8Kb;GmIgYc4eMyh>fX?g6>HKNxZIor}x z_1>?)zyy)5<+em(<%PxXZ3Ugb%#uFYl?p!Jm0+6ih5dbb@dqP)R?`IB97R)TOk)~y zZJn3g=(Bx^c(Y>h-azf|s#X4~z8skv%B35*j2bc;BtuVK5UMyTbs*&Os;)%zU607L zP+7jbUb>eum>gFu8clEvD>=G8Zrm6lJ9Ejy8x|Ndh(GD;=F8;*+w9k}V| zc~`4Rn|93tAy-HRHja1I7Q6axt2AkL=OEB0ZZJo)GQTgM2*)`-={)B)$6?KdmLB^t zlm2eBqwVW=7~MOexW+egWn?tD#Ap7q?pw;#t89fUE`fI>f)3Dv&go}s+($1Sz`^6- zn^dChN!M}u{q>vXmC;YhYQE?9gj_!7yh=$uIUeyuQ1hIdkM-ybdJ%)oE>Pw|aA@!XvPN!B~+Y?na ze`{hJNeG+gmUc97!j{6cj$xQWr~O(QbTt>-$w}Rghp?f=`G-4_%-sxpBhX_s+Q68X10%k=B_u1 zD~)q^{TJuvTbz-T5jJ2Jwq(k}heXw>~@@xMGb%u@DVG z=l;qTX?{q%0|p;F!QnPQXQ9bQL3UI&y`tIrm=l>O0OhyRFL<1$J?@}~?y|73QsL(( zp99Ino(>LgKm_uh9 zHodsS?-1Y3ijJ&e+P48&odCQ-m!Dm-nw2jNWL0WoJ4Js`#!NaRh>%$yn2^l1t-lKh zaVMI(4m2>6^?+(lGv7lpP;&LSG409s-1&lX)I?mNGQowov_uC`OBMWSI88k7Ymv6Hw@go}&7I!ky~j>l$@u^8mU1CDnoez(+17&PBFA)MUOC{)g=eiwfZq5Erm{IvOgxTWSNoOl#$KZ`6hmW zS3U0vr%D{NJ?aQ{cN>iB1@)cjv^Xl`B&$am2kimyPRBudX$K}+H1~2PI`;Q1wCq&+ z0ItF`0Z}yo-c9d&+>Ht)-bUlS#j?Je?_M5x2^r`SZ11e$Tk8qqaW{^(7pzW$D#q*q z{jL!bniN{`XLUYQASMFY7hwwkxt%P(B!zHDsiDs}!M=O%%KQdNzn)OESH*tH01e3p zSq%^1er*vA-VTTMUvpzS2@{w$$gD)2*{sinM^tSLNTaYC6L~oFZ^H6TR+|u9%uPQ@ z((T~6Jgw}Q0tH=EKKSqy=^Pm4hTWGg_s+Fj-#Exi5LX}ENVb60%(poacO4#)tr?9= zuD*JZ19gL|kTNl|&Row!$Om*ghEn?XM3;TpCE`A%FSKA*9NwgYp=MtW;{q2W6L%mp zPnRLb3?rB8|GYDu@u9u@{m|Yjs=XmqtL2(%RpFaap)ySRDcyYX(I1W$*Ytg^J+rRp zvc0zkaXhY?8cCM`-%w~PaCXn{qTCX(A?-?WI7ezA3{VLCWehVe+V^TU=S|mZye}{M zka9sH`c~M<4^tD_R~+Uz^aH={W}sj4LUy|zBJENq{XCFv`5eU7tLF(y+1aFoy7u* zX^7FLzupUNalWUpz8l^8?^<8A^mHnH z#`G~3=BYcu@eosYNuS@hfks3fecjEi1DVA6aJA{k<&KF-`HpvAy&f;s1Tn&f)i|S! zhHZ)%T7$xq3+tsr+E-Ons39839j=!K&%>N}OShEa`M+9Xdp@e}Y>(uIEyYh~XGju!fn74AS0Wf&1d*cYTT8 zsG%yq_P?s`9|h`6sCoV6HKjM z)-GrLaR|71ePska)DFzNZipPbv50F2&2SDo*Z1w~Fnv1+{%6CO@|V=&)D5J>ye0Ww z#@XKc)%M>Z-$OYp{3MO#FPg3UXfiWNBcju9Tkf_vQylG^}Rf8Nd&_S1@V zg|b5Yot;PQEo#|0_uDk#{W=(0yp4f+;u@Xxm}}3|YZk45QxW@DWgMbz(bbeNvOU~e z_GqH_r|RM^dKHdT7D&G%hsxkEumUd~mtiz)t%@TQd*er4+|1Y@ws9WKQb#^;78ic( zBPiN`FH`TysrSa;+_FMvL5Y2;&8l0v_Z;)JxrfU>pt7Pjx?v@sTC=s)V~Dxs9+a1M zx0>k=G5;kC+wX;Q;{B|8gDm#eW00ll^t@%&f;CbIV_GCojO=q09gF z|Ew7d$PVmSL8QA6nJ7n@5n)Veem7;graZ%Fcg<4T?+hbE+UKTpl0ETSJa=wX`c{^u zFSV}E7epI@Xj07z2jKSSS%ACji1hv9i~-_`%#>a{VLX@gMwSUBR`W2aYzMrb1Ky>| zWoUea2{{xnHd@|IxuHCWlzg=*ONX#h;3&kyg`ZQpqo2#AdAfFw*n4UN89q-+gY%KA zix(RO+_dew-6^PV#-zRtmA&F~PG2l}$@I=$?dcoY*C5A?YL`i^fn@BVMxarhEqRx{ zq6ru|)ev*$&oUbW1>LOC{*qHqHWQ3#gEyY{hs*P2ude7oIPl@<4lKrqh+ix{6=yU( zF*24%?Mo~6rT%nfefi@fx63oFCKYc{3Y^WAQ-N@1CX!>%Da{`{iUJn>azfNYX1Xr~ z@Ddltd$#0M9@t3l&AB=7Eg{_SC2s@-Te9Dv2A%0Eo8_zIAjr+*pM+gj^a4Y{n! zx*E3N0_{h;$Q%v#Y$}eW&@@gsC7Kt1u(fXoO4?G5s7a|olaJnQb%iu;ZKl!oFxnlO zx|baPflqmHsdQO?K}W?`=P8#e>0nTBP^~cQy8Cx5(f-VJa?{E~5|mFf&ikQ*Z-$5g zgJ=FRRH>yANe3~;?TMB_!`*BB-7Py!yc;VHvs&oKSvN^^&G!CWr$bS5X8&KNt=)Z} zWfeklOT~ltsF~ioTcW{afK#cJXRkb~x%r zfrwp|L6_KMl}h4sS{=#AB_)57s(LM*ujO8*BKdV<8BgC^EqZhcJ5}mD2;RQEvx0Zr zbudu91x(&0dlw)6P4OZTBEIVQxtw}?A}Twza5d*`vh}C?q4?#Cc&p5M_prqUnyNZ- zxx~hb=Kp!ZeH*jT%ui{0&gI36^e;PbN&jRpiQtA$#J#^-caH&<4Z#}ueaf>U6cug< zX7bj@%%}$Q4@FgJ@59dLbX}Z7lwINSP$33yV&%?=H-;Oq5TTb^P8R^LWn(rSpfj$; z!invco#7q^c|qhzL9q%gQu)_89!b8_%%~{-&=uf8CeMW1U_;llOdhyg%40<)nvHJ` zunwEXMe{<5;(ponN{FSAi4KHD-xA;OyN_}pfks*xlZkxKDY6>YYolc5>7S6Jj%udu zco~Scwmd;eA2A`a2c=!ZYzbp@`WDemCFm!ikE;|PS}|1f5fuC=xRxc18%B@t2w zrv|?qN}2Zo7K4{W>TW_xg6bYY;T(Q7IK$-yp@IXhmDM=;5$W-tU%55|;hzAJ7m7F( z!=sPGqZmc=_k=UYU&=>s#z@}<`{&n6QcTs(0roVTJe;Kfy6@;VcMC#jl#7F9@p*rR zp$0N|wm;*WyOu3RH&~6399R(c+zH_f_e+^@L5N>Rn>LBYi2oj~QT#KRg{eKyLbfNy z1e*w;+plaOOmmwd8@b-d-EJ%_KSQ2=%ecoe@ z3aJ;cZHIXUVL^1+{Wm#6EiU`F=!RHy8sxRHHeQTS zn;ZFwhXa5of_YN&7#3#|cylKnDJ96LlX&%U9-p|;?tfED!cD+We8R)itqwY?AsB>w zlW^0f9(R!P7imnCq0V_Qhj0I{5cl`x+y>0Z<$!tFpY}~DfC^DxA1(@SlT=WWCQ@Jy zB@szDX(>!yzwBV>_BIF$Heqcz4jz?V@AxVX$FLi?PJI#P5{+(p0MLa0=0g!_K^&1nTLAF2*R7|GWxw_@I^!#$gA5mcDCz%0S(ITSV4*+T& zT>>2baLS{7sAlFR=TyX7OwZD;Uf*u=m=VLca4TA(+YE?LP?bxat=jHS5ZfDr5FuUwy?>7M;Of`)IUWuY2Sv#fV1i>o(-WXb%H zP8lQe>GSgN2n{n?A9!)PWXvbkgMIf0ofF;1Z1EdMzn<2WO}hwtyMo2?LPQ+1Lm-X6 zSy2^yDd?3T<#f@p*PHdww{=LRA5fhzD9TVlRK z;BrAkSVkr)14&ubLe|{`!N+%uD!P*I4v5u1w6t5>$#W{bX>h(IXm-UfVIe{OCUVCQsYk4~dF&U`I`?TFjM2rkE62 z)Hr?el&WFic*chJH&na=SVgB{qfi^RQI{$f(~sA<&NK(jP5(As7;UmEbwrXIKYbIY zuzK0DyTWiDOU5&naj$4UiaqlDwe)Bq&x!;?(=F8GXc*S-0cQIjaY2}1UJ7hjL zCR%l9-=!6_o~&1ym-ZBr11oirO0INss78lpsM#BuQZq4dz#fVmjjzW~Hg?^?YU&`p z4D!pFH1C@pOLDk2LKKb^$u9X!%-*ll;p|0qMu{A1btyWFSgoS5^%a(`U+N{M`h2GH z8&-=hs+$VqiFR0=u{9r&PN0y-o+}1Pjb3s=)+7 z6Otesl!4S+@Ju)FyFe@}8b0iyk1Jbced-irIcr-MARQ9060lYn?SWPXmh8&5?ZPu= za3Ye~O+R<#I_{PI;}uDA{=O{GFZ=`$Fx$oJ4l1Jb^^dCX#I$abC8T&@aBMx>)3-7OT>!GZf+Y??T@PyZhI-et6jf4=}^0+B%Ti_e^=d8v07@1s)^! z(!0iY1@LYuH9F4I;w;o~6;_1SJ75E>&i?z<=j!UTyG#RlU)-mO^jhL&JqL+>v^{Z? zdr8`bzbC#Q_47t&yghTO%4ydg4bNyfULJa|^ew6UP3>IY*nlQXji1~HQ|EURNFLn0 zZnr=UZqrwFXkit!N1MgkzMg7RggQ8+zunWL4Q0A2UXyjlBZ(iMhHoPCxp&I<7SXqo z#jr%*k2aIxKeCLAynlQ?P?Zkqja`32wJHv-ljKTXo)?Acst#>J@tqP@EgWv{qdfR- zQ(Y3n_8pTTR6~=o%EGAWv8<$Zx~n<};q%%+!4;^xVFzF6Y30_B3Pj>LE}nRZW9BYG z?(p4)qV}ENzl9du+5c<@6D$vZ`#k7XCoFG=u#JHUZXmb?gq|wnXJYsq4>8 z?HX|_g>cvXFzPBZ(v7-=KljU+{^gc@O?BFDq4l6cIji*6*<_fHxkG)rzifzN@ROKY zx7$B#tp|R$(yA9UW2ZjyQlG2Xin(fCU*n$a*aC6}VMv?P+!fxj-cA{;0{BbqqI7NT zhh+jfE48lJrSf5kDi5%+YCk*wy_K`?PED-D9S?kEhufootU32mJL$I2B%^C~AZ|%x4EDF4uUzf*W+JX+_f- z{Mn|7?9U|QYJ6_xME5=WhKd_&VGH9um$vwkvILkM-7}x5N_x zc>B7)m`L~em|b@v!+?~1WbH<$LRFy{SEL`DwDP>09@|^l`3lu8rNyiB4|-5l@Yu9E zQYEB~|9yJw|L_BIBzkL)xXtT(&Sw!#i^IqBb*!SxuD{Pe`>huCVROk27s0nBiu{|~ zth0ZzvmP+XF1*41@P?sevjf3wBz`owSN*Xg;k55b)uh$d;7J_Zj{>u$a4gL@6#*%q#x(}Ssh>(*=+-VvA3Ui*r-#$XH3FSc&_Ko&BK#+~l zonE-YgwMbQ?73<5B9zf9q64KA2<`9>us;Nzp6;HW^A!(!9>`&KG+gWS{S6cu;j^iY z6`3E&#D1=L#dooxRu(R7V8uHb8kt_c*oc-D)MDTxQhwS?0@*ysgo+^={^ER&v871) znAA1Dz`!IaOZoKTBMsPc4b?}=ld-EDB&pIpW?axgjV`w%s-j%RiaQOqIr7knNYepI z$U^+jv(x&Szjcmdy%hiM`4zwCNXi)7m88&~f@0Rxa4}NmY_C|LXSkM6i}oHl_?AGX z4RyKft5w%TP#YUG(1#!4Tj^&}?m-)@VoQjAP~Q6x>nB|a2*5iWaDC;tg8)sntLE;} z#GxO|gmawOa8$QWz-ld?2usp>^XGgmV&c{DhCn!J{VKK3&nEuvL z5ZwyKru128bu{a2Li<+#<;zT-g!U#B^!v|q?fTIRbJ4750b>j4$=vV?{pSb=srmr6 zR86JfdB}7DqWo#eom`kllM{l5j~Jm1 zP(-;RJ3EYSb6E+F*L-GhyBNq^iwT8f`d*O)}|N zdoBE?yrLp_{?zx#k-hbE--Ize@%#pxthU+}HvLDahL0w_zf|HV30gTApq}$NDM2}i z-0jkLF4Yw}6rAL1AQE64~(MWBhsGqxCsy!#xLZPU0_#U zfXFALby`W=&Igf=a zy;Ai73bs2REi3>mBocl8fNRg9?`-7*oX?Y7nGY=niGED172X z?|*jj|7_XIH>`yoeo8zYTeTX3sgzhoRcBABdH6$gEVk*&K1t|0=z~2-RvyNTqOg;n zq(6UkyjQnkE7KAckl3}n?!bq2|5(v}r2ITQpe+r+l-CDE+s_@CH)${JDTfKa0cQoej8wE>HZF7^kZRr4pEd9tUFLrr>(N(2+mY zuoasozG@aQM|9-}d_cEbrRaO$y&}+nzD}p_+~;Rk4;@G2YLW2xA^47v6RZbTs+3&vX7*bC8BPK`YK+nVepe4bc*CBNnOyjUaWG>#Sy%UB`B67 znA`2!d_mU+I;l89EEry^)X+1`;z`nviz~*+JXZxN;clFu>lDOuwYe&sRR@>*KAi+J zxa-NP>w&{Am>;WnNK5>ApuW%tb7yAR23`k#o}h2lNarB^u16C6PSA@!mKx0bc$i54 zS+|S96oXiLJmZzjy#Pg%rZe~g`a9@U2_uYy1Yhl~j9`%WVt) z=#RKCk$%cCm+WS+^oieyuYKl)3VUSEeNeg6+5`&?|Do2{ch4&%Wf zOO3s@Fks~P#s4h)EvxVBgCor7vOB0_pyYk;-BY0(%uFmS6#4K}Sjnf)N)hif2s|X( zok$Nqs*cNT_&|cG2OZ}ciKd583_FIQzv(7u8T{K?3cr*{e+n3ta^bWeFqZdge{Wfn zj%Psz2OcTUGS*yL$otKcd0^!fO3Al7elm7n+?px&N;cvh*p=i+lQR-FJ?txptbfy| znx#(s!1RCEKJIoB{b@f3W;!dbDsiZ4lN@L`Da6LPdCfjS?&;G@(jWjGQnMOHrNbS$ zf0j?4!}qa`)y#RvRx$LNApKdoV9iV~o(9^eEEAL~&T{s(&o*7t z^$n!(4xN~0x9?DHN0)7i#@3bTeDKzEp7&u=Fh+A!?bQn6Yt41~ot>!3LOwk;cCDD9 z&}%KJ0OgsFfbK5j9||@e`_nb{;)oTjSvnN=Gpv}_RKVQF(xLM-PO8_i6?Ud1dm0!k z(d8ZSeeqywma+0zut18iN7X?4#QDZIKHF;bP;U5D1IodA&l^Ut`-{fYD*9{J#^{E4 zk}9@&+}dgEePWW~OGqG9l`!KsZ(lu2h9*idatZ^5;(s=c;#A{;27 z$nJPkY>>f>5ko9DM|agfug`jvAm{YS4c}Ixp)(1hjkzH50uFroAK)dsl0FbE%VIj<9sGP9m}Vj{w#Eh1U?bv*nT+)f;9-%Y zcU)s+lRS6}+p>p=9EkOtH2YE}!(PSJqdyS$Gb5&EkBv*}^%4xQZJkGAn^cxWg>V#t zwjs3*nujQsViMpU?zcL5zbXAdKL&4yngj;*S;qD< zh%g%tj4d5li;6~l5!u4c&2E1qQC1)>xV$cX+Wvvu^>uc1lrjS_$|zX5orN56>*j6ZL`}hCSym;IYu3db9&U6M0<93&Hosp6o7)Qc7@}l1u%!muVf(C ztg;?wS+LiNCrldked{3fDJ_PQc0!awt;+0DT{Gg*$=Qke8as9}b!ssi$G(X+0jNFw zd+YZu^3b2%3+XY0$Jqet#R;a+xP`HVzjwkF7`4l(`KNul`;v6QdCPps4@QXc_VruJ z)k}TBtMjhMA&A^>Y;N$X;Np~dyV7dwmSEl!h|*VxJLDz7dvI-WAutKtnaSa}6FaJ2 jcP!H;dbb4K9Ha-lPd(DXQFRdzKn6#Q^ bool: + return self._enabled + + @staticmethod + def get_command() -> List[Dict[str, Any]]: + pass + + def get_form(self) -> Tuple[List[dict], Dict[str, Any]]: + """ + 拼装插件配置页面,需要返回两块数据:1、页面配置;2、数据结构 + """ + return [ + { + "component": "VForm", + "content": [ + { + "component": "VRow", + "content": [ + { + "component": "VCol", + "props": {"cols": 12, "md": 4}, + "content": [ + { + "component": "VSwitch", + "props": { + "model": "enabled", + "label": "启用插件", + }, + } + ], + }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VSwitch', + 'props': { + 'model': 'proxy', + 'label': '使用代理服务器', + } + } + ] + } + ], + } + ], + } + ], { + "enabled": False, + "proxy": False + } + + def get_page(self) -> List[dict]: + pass + + def stop_service(self): + """ + 退出插件 + """ + pass + + def get_module(self) -> Dict[str, Any]: + """ + 获取插件模块声明,用于胁持系统模块实现(方法名:方法实现) + { + "id1": self.xxx1, + "id2": self.xxx2, + } + """ + # return {"recognize_media": (self.recognize_media, ModuleExecutionType.Hijack)} + pass + + @staticmethod + # @MediaInfo.source_processor("imdb") + def process_imdb_info(mediainfo: MediaInfo, info: dict): + """处理 IMDB 信息""" + mediainfo.source_info["imdb"] = info + if isinstance(info.get('media_type'), MediaType): + mediainfo.type = info.get('media_type') + elif info.get('media_type'): + mediainfo.type = MediaType.MOVIE if info.get("type") == "movie" else MediaType.TV + mediainfo.title = info.get("title") + mediainfo.release_date = info.get('release_date') + if info.get("id"): + mediainfo.source_id["imdb"] = info.get("id") + mediainfo.imdb_id = info.get('id') + if not mediainfo.source_id: + return + mediainfo.vote_average = round(float(info.get("rating").get("aggregate_rating")), 1) if info.get("rating") else 0 + mediainfo.overview = info.get('plot') + mediainfo.genre_ids = info.get('genre') or [] + # 风格 + if not mediainfo.genres: + mediainfo.genres = [{"id": genre, "name": genre} for genre in info.get("genres") or []] + if info.get('spoken_languages', []): + mediainfo.original_language = info.get('spoken_languages', [])[0].get("name") + mediainfo.en_title = info.get('primary_title') + mediainfo.title = info.get('primary_title') + mediainfo.original_title = info.get('original_title') + # mediainfo.release_date = info.get('start_year') + mediainfo.year = info.get('start_year') + if info.get('posters', []): + mediainfo.poster_path = info.get("posters", [])[0].get("url") + directors = [] + if info.get('directors', []): + for dn in info.get('directors', []): + director = dn.get("name") + if not director: + continue + d_ = {"name": director.get("display_name"), "id": director.get("id"), "avatars": director.get("avatars")} + directors.append(d_) + if info.get('writers', []): + for wn in info.get('writers', []): + writer = wn.get("name") + d_ = {"name": writer.get("display_name"), "id": writer.get("id"), "avatars": writer.get("avatars")} + directors.append(d_) + mediainfo.directors = directors + actors = [] + if info.get('casts', []): + for cast in info.get('casts', []): + cn = cast.get("name", {}) + character_name = cast.get("characters")[0] if cast.get("characters") else '' + d_ = {"name": cn.get("display_name"), "id": cn.get("id"), + "avatars": cn.get("avatars"), "character": character_name} + actors.append(d_) + + def recognize_media(self, meta: MetaBase = None, + mtype: MediaType = None, + imdbid: Optional[str] = None, + episode_group: Optional[str] = None, + cache: Optional[bool] = True, + **kwargs) -> Optional[MediaInfo]: + logger.warn(f"IMDb Source: {MetaBase.title}") + if not self._imdb_helper: + return None + if not imdbid and not meta: + return None + if not meta: + # 未提供元数据时,直接使用imdbid查询,不使用缓存 + cache_info = {} + elif not meta.name: + logger.warn("识别媒体信息时未提供元数据名称") + return None + cache_info = {} + if not cache_info or not cache: + info = None + if imdbid: + info = self._imdb_helper.get_info(mtype=mtype, imdbid=imdbid) + if not info and meta: + info = {} + names = list(dict.fromkeys([k for k in [meta.cn_name, meta.en_name] if k])) + for name in names: + if meta.begin_season: + logger.info(f"正在识别 {name} 第{meta.begin_season}季 ...") + else: + logger.info(f"正在识别 {name} ...") + if meta.type == MediaType.UNKNOWN and not meta.year: + info = self._imdb_helper.match_multi(name) + else: + if meta.type == MediaType.TV: + # 确定是电视 + info = self._imdb_helper.match(name=name, + year=meta.year, + mtype=meta.type,season_year=meta.year, + season_number=meta.begin_season) + if not info: + # 去掉年份再查一次 + info = self._imdb_helper.match(name=name, mtype=meta.type) + else: + # 有年份先按电影查 + info = self._imdb_helper.match(name=name, year=meta.year, mtype=MediaType.MOVIE) + # 没有再按电视剧查 + if not info: + info = self._imdb_helper.match(name=name, + year=meta.year, + mtype=MediaType.TV) + if not info: + # 去掉年份和类型再查一次 + info = self._imdb_helper.match_multi(name=name) + if info: + break + else: + info = None + if info: + # mediainfo = MediaInfo(source_info={"imdb": info}) + mediainfo = MediaInfo() + if meta: + logger.info(f"{meta.name} IMDB识别结果:{mediainfo.type.value} " + f"{mediainfo.title_year} " + f"{mediainfo.imdb_id}") + else: + logger.info(f"{imdbid} IMDB识别结果:{mediainfo.type.value} " + f"{mediainfo.title_year}") + return mediainfo + + logger.info(f"{meta.name if meta else imdbid} 未匹配到IMDB媒体信息") + return None + + def imdb_discover(self, apikey: str, mtype: str = "series", + country: str = None, + lang: str = None, + genre: str = None, + sort_by: str = 'POPULARITY', + sort_order: str = 'ASC', + using_rating: bool = False, + user_rating: str = None, + year: str = None, + award: str = None, + page: int = 1, count: int = 30) -> List[schemas.MediaInfo]: + + def __movie_to_media(movie_info: dict) -> schemas.MediaInfo: + title = "" + if movie_info.get("titleText"): + title = movie_info.get("titleText", {}).get("text", "") + release_year = 0 + if movie_info.get("releaseYear"): + release_year = movie_info.get("releaseYear", {}).get("year") + poster_path = None + if movie_info.get("primaryImage"): + poster_path = movie_info.get("primaryImage").get("url") + vote_average = 0 + if movie_info.get("ratingsSummary"): + vote_average = movie_info.get("ratingsSummary").get("aggregateRating") + runtime = 0 + if movie_info.get("runtime"): + runtime = movie_info.get("runtime").get("seconds") + overview = '' + if movie_info.get("plot"): + overview = movie_info.get("plot").get("plotText").get("plainText") + return schemas.MediaInfo( + type="电影", + title=title, + year=release_year, + title_year=f"{title} ({release_year})", + mediaid_prefix="imdb", + media_id=str(movie_info.get("id")), + poster_path=poster_path, + vote_average=vote_average, + runtime=runtime, + overview=overview + ) + + def __series_to_media(series_info: dict) -> schemas.MediaInfo: + title = "" + if series_info.get("titleText"): + title = series_info.get("titleText", {}).get("text", "") + release_year = 0 + if series_info.get("releaseYear"): + release_year = series_info.get("releaseYear", {}).get("year") + poster_path = None + if series_info.get("primaryImage"): + poster_path = series_info.get("primaryImage").get("url") + vote_average = 0 + if series_info.get("ratingsSummary"): + vote_average = series_info.get("ratingsSummary").get("aggregateRating") + runtime = 0 + if series_info.get("runtime"): + runtime = series_info.get("runtime").get("seconds") + overview = '' + if series_info.get("plot"): + if series_info.get("plot").get("plotText"): + overview = series_info.get("plot").get("plotText").get("plainText") + release_date_str = '0000-00-00' + if series_info.get("releaseDate"): + release_date = series_info.get('releaseDate') + release_date_str = f"{release_date.get('year')}-{release_date.get('month')}-{release_date.get('day')}" + return schemas.MediaInfo( + type="电视剧", + title=title, + year=release_year, + title_year=f"{title} ({release_year})", + mediaid_prefix="imdb", + media_id=str(series_info.get("id")), + release_date=release_date_str, + poster_path=poster_path, + vote_average=vote_average, + runtime=runtime, + overview=overview + ) + if not self._imdb_helper: + return [] + title_type: MediaType = MediaType.TV + if mtype == 'movies': + title_type = MediaType.MOVIE + if user_rating and using_rating: + user_rating = float(user_rating) + else: + user_rating = None + genres = [genre] if genre else None + countries = [country] if country else None + languages = [lang] if lang else None + release_date_start = None + release_date_end = None + if year: + if year == "2025": + release_date_start = "2025-01-01" + elif year == "2024": + release_date_start = "2024-01-01" + release_date_end = "2024-12-31" + elif year == "2023": + release_date_start = "2023-01-01" + release_date_end = "2023-12-31" + elif year == "2022": + release_date_start = "2022-01-01" + release_date_end = "2022-12-31" + elif year == "2021": + release_date_start = "2021-01-01" + release_date_end = "2021-12-31" + elif year == "2020": + release_date_start = "2020-01-01" + release_date_end = "2020-12-31" + elif year == "2020s": + release_date_start = "2020-01-01" + release_date_end = "2029-12-31" + elif year == "2010s": + release_date_start = "2010-01-01" + release_date_end = "2019-12-31" + elif year == "2000s": + release_date_start = "2000-01-01" + release_date_end = "2009-12-31" + elif year == "1990s": + release_date_start = "1990-01-01" + release_date_end = "1999-12-31" + elif year == "1980s": + release_date_start = "1980-01-01" + release_date_end = "1989-12-31" + elif year == "1970s": + release_date_start = "1970-01-01" + release_date_end = "1979-12-31" + awards = [award] if award else None + first_page = False + if page == 1: + first_page = True + self._discover_cache = [] # 清空缓存 + results = [] + if len(self._discover_cache) >= count: + results = self._discover_cache[:30] + self._discover_cache = self._discover_cache[30:] + else: + results.extend(self._discover_cache) + remaining = 30 - len(results) + self._discover_cache = [] # 清空缓存 + data = self._imdb_helper.advanced_title_search(first_page=first_page, + title_type=title_type, + genres=genres, + sort_by=sort_by, + sort_order=sort_order, + rating_min=user_rating, + countries=countries, + languages=languages, + release_date_end=release_date_end, + release_date_start=release_date_start, + award_constraint=awards) + if not data: + new_results = [] + else: + new_results = data.get("edges") + if new_results: + results.extend(new_results[:remaining]) + self._discover_cache = new_results[remaining:] + if mtype == "movies": + results = [__movie_to_media(movie.get('node').get("title")) for movie in results] + else: + results = [__series_to_media(series.get('node').get("title")) for series in results] + return results + + def get_api(self) -> List[Dict[str, Any]]: + """ + 获取插件API + [{ + "path": "/xx", + "endpoint": self.xxx, + "methods": ["GET", "POST"], + "summary": "API说明" + }] + """ + return [{ + "path": "/imdb_discover", + "endpoint": self.imdb_discover, + "methods": ["GET"], + "summary": "TheTVDB探索数据源", + "description": "获取TheTVDB探索数据", + }] + + @staticmethod + def imdb_filter_ui() -> List[dict]: + """ + IMDb过滤参数UI配置 + """ + # 国家字典 + country_dict = { + "US": "美国", + "CN": "中国", + "JP": "日本", + "KR": "韩国", + "IN": "印度", + "FR": "法国", + "DE": "德国", + "IT": "意大利", + "ES": "西班牙", + "UK": "英国", + "AU": "澳大利亚", + "CA": "加拿大", + "RU": "俄罗斯", + "BR": "巴西", + "MX": "墨西哥", + "AR": "阿根廷" + } + + cuntry_ui = [ + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": key + }, + "text": value + } for key, value in country_dict.items() + ] + + # 原始语种字典 + lang_dict = { + "en": "英语", + "zh": "中文", + "jp": "日语", + "ko": "韩语", + "fr": "法语", + "de": "德语", + "it": "意大利语", + "es": "西班牙语", + "pt": "葡萄牙语", + "ru": "俄语" + } + + lang_ui = [ + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": key + }, + "text": value + } for key, value in lang_dict.items() + ] + + # 风格字典 + genre_dict = { + "Action": "动作", + "Adventure": "冒险", + "Animation": "动画", + "Biography": "传记", + "Comedy": "喜剧", + "Crime": "犯罪", + "Documentary": "纪录片", + "Drama": "剧情", + "Family": "家庭", + "Fantasy": "奇幻", + "Game-Show": "游戏节目", + "History": "历史", + "Horror": "恐怖", + "Music": "音乐", + "Musical": "歌舞", + "Mystery": "悬疑", + "News": "新闻", + "Reality-TV": "真人秀", + "Romance": "爱情", + "Sci-Fi": "科幻", + "Short": "短片", + "Sport": "体育", + "Talk-Show": "脱口秀", + "Thriller": "惊悚", + "War": "战争", + "Western": "西部片" + } + + genre_ui = [ + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": key + }, + "text": value + } for key, value in genre_dict.items() + ] + + # 排序字典 + sort_dict = { + "POPULARITY": "人气", + "USER_RATING": "评分", + "RELEASE_DATE": "发布日期", + "TITLE_REGIONAL": "A-Z" + } + + sort_ui = [ + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": key + }, + "text": value + } for key, value in sort_dict.items() + ] + + sort_order_dict = { + "ASC": "升序", + "DESC": "降序", + } + + sort_order_ui = [ + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": key + }, + "text": value + } for key, value in sort_order_dict.items() + ] + + year_dict = { + "2025": "2025", + "2024": "2024", + "2023": "2023", + "2022": "2022", + "2021": "2021", + "2020": "2020", + "2020s": "2020s", + "2010s": "2010s", + "2000s": "2000s", + "1990s": "1990s", + "1980s": "1980s", + "1970s": "1970s", + } + + year_ui = [ + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": key + }, + "text": value + } for key, value in year_dict.items() + ] + + award_dict = { + "ev0000003-Winning": "奥斯卡奖", + "ev0000223-Winning": "艾美奖", + "ev0000292-Winning": "金球奖", + "ev0000003-Nominated": "奥斯卡提名", + "ev0000223-Nominated": "艾美奖提名", + "ev0000292-Nominated": "金球奖提名", + "ev0000003-bestPicture-Winning": "最佳影片", + "ev0000003-bestPicture-Nominated": "最佳影片提名", + "ev0000003-bestDirector-Winning": "最佳导演", + "ev0000003-bestDirector-Nominated": "最佳导演提名", + "ev0000558-Winning": "金酸莓奖", + "ev0000558-Nominated": "金酸莓奖提名" + } + + award_ui = [ + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": key + }, + "text": value + } for key, value in award_dict.items() + ] + + return [ + { + "component": "div", + "props": { + "class": "flex justify-start items-center" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "类型" + } + ] + }, + { + "component": "VChipGroup", + "props": { + "model": "mtype" + }, + "content": [ + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": "series" + }, + "text": "电视剧" + }, + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": "movies" + }, + "text": "电影" + } + ] + } + ] + }, + { + "component": "div", + "props": { + "class": "flex justify-start items-center" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "风格" + } + ] + }, + { + "component": "VChipGroup", + "props": { + "model": "genre" + }, + "content": genre_ui + } + ] + }, + { + "component": "div", + "props": { + "class": "flex justify-start items-center" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "国家" + } + ] + }, + { + "component": "VChipGroup", + "props": { + "model": "country" + }, + "content": cuntry_ui + } + ] + }, + { + "component": "div", + "props": { + "class": "flex justify-start items-center" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "语言" + } + ] + }, + { + "component": "VChipGroup", + "props": { + "model": "lang" + }, + "content": lang_ui + } + ] + }, + { + "component": "div", + "props": { + "class": "flex justify-start items-center" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "年份" + } + ] + }, + { + "component": "VChipGroup", + "props": { + "model": "year" + }, + "content": year_ui + } + ] + }, + { + "component": "div", + "props": { + "class": "flex justify-start items-center" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "奖项" + } + ] + }, + { + "component": "VChipGroup", + "props": { + "model": "award" + }, + "content": award_ui + } + ] + }, + { + "component": "div", + "props": { + "class": "flex justify-start items-center" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "排序依据" + } + ] + }, + { + "component": "VChipGroup", + "props": { + "model": "sort_by" + }, + "content": sort_ui + } + ] + }, + { + "component": "div", + "props": { + "class": "flex justify-start items-center" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "排序方式" + } + ] + }, + { + "component": "VChipGroup", + "props": { + "model": "sort_order" + }, + "content": sort_order_ui + } + ] + }, + { + "component": "div", + "props": { + "class": "flex justify-start items-center" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "评分" + } + ] + }, + { + "component": "VSwitch", + "props": { + "model": "using_rating", + "label": "启用", + }, + }, + { + "component": "VDivider", + "props": { + "class": "my-3" + } + }, + { + "component": "VSlider", + "props": { + "v-model": "user_rating", + "thumb-label": True, + "max": "10", + "min": "1", + "step": "1", + "hide-details": True, + } + } + ] + } + ] + + @eventmanager.register(ChainEventType.DiscoverSource) + def discover_source(self, event: Event): + """ + 监听识别事件 + """ + if not self._enabled: + return + event_data: DiscoverSourceEventData = event.event_data + imdb_source = schemas.DiscoverMediaSource( + name="IMDb", + mediaid_prefix="imdb", + api_path=f"plugin/ImdbSource/imdb_discover?apikey={settings.API_TOKEN}", + filter_params={ + "mtype": "series", + "company": None, + "contentRating": None, + "country": None, + "genre": None, + "lang": None, + "sort_by": "POPULARITY", + "sort_order": "ASC", + "status": None, + "year": None, + "user_rating": 1, + "using_rating": False, + "award": None + }, + filter_ui=self.imdb_filter_ui() + ) + if not event_data.extra_sources: + event_data.extra_sources = [imdb_source] + else: + event_data.extra_sources.append(imdb_source) diff --git a/plugins.v2/imdbsource/imdb_helper.py b/plugins.v2/imdbsource/imdb_helper.py new file mode 100644 index 0000000..ca4aab8 --- /dev/null +++ b/plugins.v2/imdbsource/imdb_helper.py @@ -0,0 +1,651 @@ +import re +from typing import Optional, Dict, List +from io import StringIO + +import graphene +from requests_html import HTMLSession +import ijson +import json +import base64 + +from app.log import logger +from app.utils.http import RequestUtils +from app.utils.string import StringUtils +from app.schemas.types import MediaType +from app.core.cache import cached + + +class ImdbHelper: + _query_by_id = """query queryWithVariables($id: ID!) { + title(id: $id) { + id + type + is_adult + primary_title + original_title + start_year + end_year + runtime_minutes + plot + rating { + aggregate_rating + votes_count + } + genres + posters { + url + width + height + } + certificates { + country { + code + name + } + rating + } + spoken_languages { + code + name + } + origin_countries { + code + name + } + critic_review { + score + review_count + } + directors: credits(first: 5, categories: ["director"]) { + name { + id + display_name + avatars { + url + width + height + } + } + } + writers: credits(first: 5, categories: ["writer"]) { + name { + id + display_name + avatars { + url + width + height + } + } + } + casts: credits(first: 5, categories: ["actor", "actress"]) { + name { + id + display_name + avatars { + url + width + height + } + } + characters + } + } +}""" + _endpoint = "https://graph.imdbapi.dev/v1" + _search_endpoint = "https://v3.sg.media-imdb.com/suggestion/x/%s.json?includeVideos=0" + _official_endpoint = "https://caching.graphql.imdb.com/" + _hash_update_url = ("https://raw.githubusercontent.com/wumode/MoviePilot-Plugins/" + "refs/heads/imdbsource_assets/plugins.v2/imdbsource/imdb_hash.json") + _qid_map = { + MediaType.TV: ["tvSeries", "tvMiniSeries"], + MediaType.MOVIE: ["movie"] + } + _imdb_headers = { + "Accept": "application/json, text/plain, */*", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome" + "/84.0.4147.105 Safari/537.36", + "Referer": "https://www.imdb.com/", + } + + def __init__(self, proxies=None): + self._proxies = proxies + self._session = HTMLSession() + self._req_utils = RequestUtils(headers=self._imdb_headers, session=self._session, timeout=10, proxies=proxies) + self._imdb_req = RequestUtils(accept_type="application/json", content_type="application/json", + headers=self._imdb_headers, timeout=10, proxies=proxies) + self._last_cursor = '' + self._imdb_api_hash = {"AdvancedTitleSearch": None, "TitleAkasPaginated": None} + + def imdbid(self, imdbid: str) -> Optional[Dict]: + params = {"operationName": "queryWithVariables", "query": self._query_by_id, "variables": {"id": imdbid}} + ret = RequestUtils( + accept_type="application/json", content_type="application/json" + ).post_res(f"{self._endpoint}", json=params) + if not ret: + return None + data = ret.json() + if "errors" in data: + logger.error(f"Imdb query ({imdbid}) errors {data.get('errors')}") + logger.error(f"{params}") + return None + info = data.get("data").get("title", None) + return info + + @cached(maxsize=1000, ttl=3600) + def __episodes_by_season(self, imdbid: str, build_id: str, season: str) -> Optional[Dict]: + if not build_id or not season: + return None + prefix = "pageProps.contentData.section" + url = (f"https://www.imdb.com/_next/data/{build_id}" + f"/en-US/title/{imdbid}/episodes.json?season={season}&ref_=ttep&tconst={imdbid}") + response = self._req_utils.get_res(url) + if not response or response.status_code != 200: + return + json_content = response.text + try: + section = next(ijson.items(json_content, prefix)) + except StopIteration: + logger.warn(f"No data found at prefix: {prefix}") + return None + except (ijson.JSONError, ValueError) as e: + logger.warn(f"JSON parsing error: {e}") + return None + except TypeError as e: + logger.warn(f"Invalid input type: {e}") + return None + return section + + @cached(maxsize=1000, ttl=3600) + def __episodes(self, imdbid: str) -> Optional[Dict]: + prefix = "props.pageProps.contentData.section" + url = f"https://www.imdb.com/title/{imdbid}/episodes/" + + response = self._req_utils.get_res(url) + if not response or response.status_code != 200: + return + script_content = response.html.xpath('//script[@id="__NEXT_DATA__"]/text()') + if len(script_content) == 0: + return None + json_content = script_content[0] + # 直接定位到目标路径提取 items + try: + section = next(ijson.items(json_content, prefix)) + except StopIteration: + logger.warn(f"No data found at prefix: {prefix}") + return None + except (ijson.JSONError, ValueError) as e: + logger.warn(f"JSON parsing error: {e}") + return None + except TypeError as e: + logger.warn(f"Invalid input type: {e}") + return None + total_seasons = [] + for s in section.get("seasons"): + if s.get("value") and s.get("value") not in total_seasons: + total_seasons.append(s.get("value")) + build_id = next(ijson.items(json_content, 'buildId')) + current_season = section.get('currentSeason') or '1' + total_seasons.remove(current_season) + for season in total_seasons: + section_next = self.__episodes_by_season(imdbid, build_id=build_id, season=season) + if section_next: + section["episodes"]["items"].extend(section_next.get("episodes", {}).get("items", [])) + section["episodes"]["total"] += section_next.get("episodes", {}).get("total", 0) + return section + + @cached(maxsize=32, ttl=1800) + def __request(self, params: Dict, sha256) -> Optional[Dict]: + params["extensions"] = {"persistedQuery": {"sha256Hash": sha256, "version": 1}} + ret = self._imdb_req.post_res(f"{self._official_endpoint}", json=params) + if not ret: + return None + data = ret.json() + if "errors" in data: + logger.error(f"Imdb query errors") + return None + return data.get("data") + + @cached(maxsize=1, ttl=30 * 24 * 3600) + def __get_hash(self) -> Optional[dict]: + """ + 根据IMDb hash使用 + """ + headers = { + "Accept": "text/html", + } + res = RequestUtils(headers=headers).get_res( + self._hash_update_url, + proxies=self._proxies + ) + if not res: + logger.error("获取IMDb hash") + return None + return res.json() + + def __update_hash(self): + imdb_hash = self.__get_hash() + if imdb_hash: + self._imdb_api_hash["AdvancedTitleSearch"] = imdb_hash.get("AdvancedTitleSearch") + self._imdb_api_hash["TitleAkasPaginated"] = imdb_hash.get("TitleAkasPaginated") + + @staticmethod + def __award_to_constraint(award: str) -> Optional[Dict]: + pattern = r'^(ev\d+)(?:-(best\w+))?-(Winning|Nominated)$' + match = re.match(pattern, award) + constraint = {} + if match: + ev_id = match.group(1) # 第一部分:evXXXXXXXX + best = match.group(2) # 第二部分:bestXX(可选) + status = match.group(3) # 第三部分:Winning/Nominated + constraint["eventId"] = ev_id + if status == "Winning": + constraint["winnerFilter"] = "WINNER_ONLY" + if best: + constraint["searchAwardCategoryId"] = best + return constraint + else: + return None + + def advanced_title_search(self, + sha256: str = 'be358d7b41add9fd174461f4c8c673dfee5e2a88744e2d5dc037362a96e2b4e4', + first_page: bool = True, + title_type: MediaType = MediaType.TV, + genres: Optional[List] = None, + sort_by: str = 'POPULARITY', + sort_order: str = 'ASC', + rating_min: Optional[float] = None, + rating_max: Optional[float] = None, + countries: Optional[List] = None, + languages: Optional[list] = None, + release_date_end: Optional[str] = None, + release_date_start: Optional[str] = None, + award_constraint: Optional[List[str]] = None + ) -> Optional[Dict]: + self.__update_hash() + if self._imdb_api_hash.get("AdvancedTitleSearch"): + sha256 = self._imdb_api_hash["AdvancedTitleSearch"] + if title_type not in [MediaType.TV, MediaType.MOVIE]: + return None + variables = {"first": 50, + "locale": "en-US", + "sortBy": sort_by, + "sortOrder": sort_order, + "titleTypeConstraint": {"anyTitleTypeIds": self._qid_map[title_type], + "excludeTitleTypeIds": []}} + if genres: + variables["genreConstraint"] = {"allGenreIds": genres, "excludeGenreIds": []} + if countries: + variables["originCountryConstraint"] = {"allCountries": countries} + if languages: + variables["languageConstraint"] = {"anyPrimaryLanguages": languages} + if rating_min or rating_max: + rating_min = rating_min if rating_min else 1 + rating_min = max(rating_min, 1) + rating_max = rating_max if rating_max else 10 + rating_max = min(rating_max, 10) + variables["userRatingsConstraint"] = {"aggregateRatingRange": {"max": rating_max, "min": rating_min}} + if release_date_start or release_date_end: + release_dict = {} + if release_date_start: + release_dict["start"] = release_date_start + if release_date_end: + release_dict["end"] = release_date_end + variables["releaseDateConstraint"] = {"releaseDateRange": release_dict} + if award_constraint: + constraints = [] + for award in award_constraint: + c = self.__award_to_constraint(award) + if c: + constraints.append(c) + variables["awardConstraint"] = {"allEventNominations": constraints} + if not first_page and self._last_cursor: + variables["after"] = self._last_cursor + + params = {"operationName": "AdvancedTitleSearch", + "variables": variables} + data = self.__request(params, sha256) + if not data: + return None + page_info = data.get("advancedTitleSearch", {}).get("pageInfo", {}) + end_cursor = page_info.get("endCursor", "") + self._last_cursor = end_cursor + return data.get("advancedTitleSearch") + + def __known_as(self, imdbid: str, + sha256='48d4f7bfa73230fb550147bd4704d8050080e65fe2ad576da6276cac2330e446') -> Optional[List]: + """ + 获取电影和电视别名 + :param imdbid: IMBd id + :return: 别名列表 + """ + self.__update_hash() + if self._imdb_api_hash.get("TitleAkasPaginated"): + sha256 = self._imdb_api_hash["TitleAkasPaginated"] + params = {"operationName": "TitleAkasPaginated", + "variables": {"const": imdbid, "first": 50, "locale": "en-US", "originalTitleText": False}} + data = self.__request(params=params, sha256=sha256) + if not data: + return None + if not data.get("data", {}).get("title", {}).get("akas", {}).get("total"): + return None + akas = [] + for edge in data["data"]["title"]["akas"]["edges"]: + title = edge.get("node", {}).get("displayableProperty", {}).get("value", {}).get("plainText") + if not title: + continue + country = edge.get("node", {}).get("country", {}) + language = edge.get("node", {}).get("language", {}) + akas.append({"title": title, "country": country, "language": language}) + return akas + + def __search_on_imdb(self, term, mtype, release_year=None): + params = f"{term}" + if release_year is not None: + params += f" {release_year}" + ret = RequestUtils( + accept_type="application/json", + ).get_res(f"{self._search_endpoint % params}") + if not ret: + return None + data = ret.json() + if "d" not in data: + return None + result = [d for d in data["d"] if d.get("qid") in self._qid_map.get(mtype)] + return result + + def search_tvs(self, title: str, year: str = None) -> List[dict]: + if not title: + return [] + if year: + tvs = self.__search_on_imdb(title, MediaType.TV, year) or [] + else: + tvs = self.__search_on_imdb(title, MediaType.TV, ) or [] + ret_infos = [] + for tv in tvs: + # if title in tv.get("l"): + # if self.__compare_names(title, [tv.get("l")]): + # tv['media_type'] = MediaType.TV + ret_infos.append(tv) + return ret_infos + + def search_movies(self, title: str, year: str = None) -> List[dict]: + if not title: + return [] + if year: + movies = self.__search_on_imdb(title, MediaType.MOVIE, year) or [] + else: + movies = self.__search_on_imdb(title, MediaType.MOVIE) or [] + ret_infos = [] + for movie in movies: + # if title in movie.get("l"): + # if self.__compare_names(title, [movie.get("l")]): + # movie['media_type'] = MediaType.MOVIE + ret_infos.append(movie) + return ret_infos + + @staticmethod + def __compare_names(file_name: str, tmdb_names: list) -> bool: + """ + 比较文件名是否匹配,忽略大小写和特殊字符 + :param file_name: 识别的文件名或者种子名 + :param tmdb_names: TMDB返回的译名 + :return: True or False + """ + if not file_name or not tmdb_names: + return False + if not isinstance(tmdb_names, list): + tmdb_names = [tmdb_names] + file_name = StringUtils.clear(file_name).upper() + for tmdb_name in tmdb_names: + tmdb_name = StringUtils.clear(tmdb_name).strip().upper() + if file_name == tmdb_name: + return True + return False + + def __search_movie_by_name(self, name: str, year: str) -> Optional[dict]: + """ + 根据名称查询电影IMDB匹配 + :param name: 识别的文件名或种子名 + :param year: 电影上映日期 + :return: 匹配的媒体信息 + """ + movies = self.search_movies(name, year=year) + if (movies is None) or (len(movies) == 0): + logger.debug(f"{name} 未找到相关电影信息!") + return {} + movies = sorted( + movies, + key=lambda x: str(x.get("y") or '0000'), + reverse=True + ) + for movie in movies: + movie_year = f"{movie.get('y')}" + if year and movie_year != year: + # 年份不匹配 + continue + # 匹配标题、原标题 + movie_info = self.imdbid(movie.get("id")) + if not movie_info: + continue + if self.__compare_names(name, [movie_info.get("primary_title")]): + return movie_info + if movie_info.get("original_title") and self.__compare_names(name, [movie_info.get("original_title")]): + return movie_info + akas = self.__known_as(movie.get("id")) + if not akas: + continue + akas_names = [item.get("title") for item in akas] + if self.__compare_names(name, akas_names): + return movie_info + return {} + + def __search_tv_by_name(self, name: str, year: str) -> Optional[dict]: + """ + 根据名称查询电视剧IMDB匹配 + :param name: 识别的文件名或者种子名 + :param year: 电视剧的首播年份 + :return: 匹配的媒体信息 + """ + tvs = self.search_tvs(name, year=year) + if (tvs is None) or (len(tvs) == 0): + logger.debug(f"{name} 未找到相关电影信息!") + return {} + tvs = sorted( + tvs, + key=lambda x: str(x.get("y") or '0000'), + reverse=True + ) + for tv in tvs: + tv_year = f"{tv.get('y')}" + if year and tv_year != year: + # 年份不匹配 + continue + # 匹配标题、原标题 + tv_info = self.imdbid(tv.get("id")) + if not tv_info: + continue + if self.__compare_names(name, [tv_info.get("primary_title")]): + return tv_info + if tv_info.get("original_title") and self.__compare_names(name, [tv_info.get("original_title")]): + return tv_info + akas = self.__known_as(tv.get("id")) + if not akas: + continue + akas_names = [item.get("title") for item in akas] + if self.__compare_names(name, akas_names): + return tv_info + return {} + + def __search_tv_by_season(self, name: str, season_year: str, season_number: int) -> Optional[dict]: + """ + 根据电视剧的名称和季的年份及序号匹配IMDB + :param name: 识别的文件名或者种子名 + :param season_year: 季的年份 + :param season_number: 季序号 + :return: 匹配的媒体信息 + """ + + def __season_match(_tv_info: dict, _season_year: str) -> bool: + tv_extra_info = self.__episodes(_tv_info.get("id")) + if not tv_extra_info: + return False + release_year = [] + for item in tv_extra_info["episodes"]["items"]: + if item.get("season") == season_number: + release_year.append(item.get("releaseDate").get("year") or item.get("releaseYear")) + first_release_year = min(release_year) if release_year else tv_extra_info["currentYear"] + if first_release_year == _season_year: + _tv_info["seasons"] = tv_extra_info["seasons"] + _tv_info["episodes"] = tv_extra_info["episodes"] + return True + + tvs = self.search_tvs(title=name) + if (tvs is None) or (len(tvs) == 0): + logger.debug("%s 未找到季%s相关信息!" % (name, season_number)) + return {} + tvs = sorted( + tvs, + key=lambda x: str(x.get('y') or '0000'), + reverse=True + ) + for tv in tvs: + tv_info = self.imdbid(tv.get("id")) + if not tv_info: + continue + tv_year = f"{tv.get('y')}" if tv.get('y') else None + if (self.__compare_names(name, [tv_info.get('primary_title')]) + or (tv_info.get('original_title') and self.__compare_names(name, [tv_info.get('original_title')]))) \ + and (tv_year == str(season_year)): + return tv_info + akas = self.__known_as(tv.get("id")) + if not akas: + continue + akas_names = [item.get("title") for item in akas] + if not self.__compare_names(name, akas_names): + continue + if __season_match(_tv_info=tv_info, _season_year=season_year): + return tv_info + + def get_info(self, + mtype: MediaType, + imdbid: str) -> dict: + """ + 给定IMDB号,查询一条媒体信息 + :param mtype: 类型:电影、电视剧,为空时都查(此时用不上年份) + :param imdbid: IMDB的ID + """ + # 查询TMDB详情 + if mtype == MediaType.MOVIE: + imdb_info = self.imdbid(imdbid) + if imdb_info: + imdb_info['media_type'] = MediaType.MOVIE + elif mtype == MediaType.TV: + imdb_info = self.imdbid(imdbid) + if imdb_info: + imdb_info['media_type'] = MediaType.TV + tv_extra_info = self.__episodes(imdbid) + imdb_info["seasons"] = tv_extra_info["seasons"] + imdb_info["episodes"] = tv_extra_info["episodes"] + else: + imdb_info = None + logger.warn(f"IMDb id:{imdbid} 未查询到媒体信息") + return imdb_info + + def match_multi(self, name: str) -> Optional[dict]: + """ + 根据名称同时查询电影和电视剧,没有类型也没有年份时使用 + :param name: 识别的文件名或种子名 + :return: 匹配的媒体信息 + """ + + multis = self.search_tvs(name) + self.search_movies(name) + ret_info = {} + if len(multis) == 0: + logger.debug(f"{name} 未找到相关媒体息!") + return {} + else: + multis = sorted( + multis, + key=lambda x: ("1" if x.get("media_type") == MediaType.MOVIE else "0") + str(x.get('y') or '0000'), + reverse=True + ) + media_t = MediaType.UNKNOWN + for multi in multis: + media_info = self.imdbid(multi.get("id")) + if not media_info: + continue + if multi.get("media_type") == MediaType.MOVIE: + if self.__compare_names(name, media_info.get('primary_title')) \ + or self.__compare_names(name, multi.get('primary_title')): + ret_info = media_info + media_t = MediaType.MOVIE + break + elif multi.get("media_type") == MediaType.TV: + if self.__compare_names(name, media_info.get('primary_title')) \ + or self.__compare_names(name, multi.get('primary_title')): + ret_info = media_info + media_t = MediaType.TV + break + if ret_info and not isinstance(ret_info.get("media_type"), MediaType): + ret_info['media_type'] = media_t + return ret_info + + def match(self, name: str, + mtype: MediaType, + year: Optional[str] = None, + season_year: Optional[str] = None, + season_number: Optional[int] = None, + group_seasons: Optional[List[dict]] = None) -> Optional[dict]: + """ + 搜索imdb中的媒体信息,匹配返回一条尽可能正确的信息 + :param name: 检索的名称 + :param mtype: 类型:电影、电视剧 + :param year: 年份,如要是季集需要是首播年份(first_air_date) + :param season_year: 当前季集年份 + :param season_number: 季集,整数 + :param group_seasons: 集数组信息 + :return: TMDB的INFO,同时会将mtype赋值到media_type中 + """ + if not name: + return None + info = {} + if mtype != MediaType.TV: + year_range = [year] + if year: + year_range.append(str(int(year) + 1)) + year_range.append(str(int(year) - 1)) + for year in year_range: + logger.debug( + f"正在识别{mtype.value}:{name}, 年份={year} ...") + info = self.__search_movie_by_name(name, year) + if info: + info['media_type'] = MediaType.MOVIE + break + else: + # 有当前季和当前季集年份,使用精确匹配 + if season_year and season_number: + logger.debug( + f"正在识别{mtype.value}:{name}, 季集={season_number}, 季集年份={season_year} ...") + info = self.__search_tv_by_season(name, + season_year, + season_number) + if not info: + year_range = [year] + if year: + year_range.append(str(int(year) + 1)) + year_range.append(str(int(year) - 1)) + for year in year_range: + logger.debug( + f"正在识别{mtype.value}:{name}, 年份={year} ...") + info = self.__search_tv_by_name(name, year) + if info: + break + if info: + info['media_type'] = MediaType.TV + if not info.get("seasons"): + tv_extra_info = self.__episodes(info.get('id')) + if tv_extra_info: + info["seasons"] = tv_extra_info["seasons"] + info["episodes"] = tv_extra_info["episodes"] + return info diff --git a/plugins.v2/imdbsource/requirements.txt b/plugins.v2/imdbsource/requirements.txt new file mode 100644 index 0000000..86d7fe2 --- /dev/null +++ b/plugins.v2/imdbsource/requirements.txt @@ -0,0 +1,3 @@ +graphene~=3.4.3 +ijson~=3.4.0 +requests-html~=0.10.0 \ No newline at end of file From ed46ee9cbbd96c236a80d7281a139c6df4a58609 Mon Sep 17 00:00:00 2001 From: behinder85 <60542924+behinder85@users.noreply.github.com> Date: Fri, 23 May 2025 14:22:28 +0800 Subject: [PATCH 13/46] =?UTF-8?q?=E4=BF=AE=E6=AD=A3should=5Fdelete?= =?UTF-8?q?=E6=9C=AA=E8=A2=AB=E5=91=BD=E5=90=8D=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/brushflow/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 8cc8126..475f38a 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -2582,6 +2582,7 @@ class BrushFlow(_PluginBase): """ brush_config = self.__get_brush_config(sitename=site_name) + should_delete = False reason = "未能满足动态删除设置的前置删除条件" while brush_config.del_no_free and torrent_info.get("downloaded") < torrent_info.get("total_size"): From 9f268f45e80c14ea3075b409b1b1bd09966fa66a Mon Sep 17 00:00:00 2001 From: siritang <77008922+tc2664@users.noreply.github.com> Date: Fri, 23 May 2025 16:06:08 +0800 Subject: [PATCH 14/46] =?UTF-8?q?1.4.1=20=E5=A2=9E=E5=8A=A0=E7=AB=99?= =?UTF-8?q?=E7=82=B9=E7=8C=AA=E7=8C=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + plugins/contractcheck/__init__.py | 2 +- plugins/contractcheck/siteuserinfo/__init__.py | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index db8de10..9c5c75b 100644 --- a/package.json +++ b/package.json @@ -761,6 +761,7 @@ "author": "DzAvril", "level": 1, "history": { + "v1.4.1": "增加站点猪猪", "v1.4": "支持仪表板组件显示", "v1.3": "修复观众做种数据异常问题", "v1.2": "修复契约检查无数据返回的问题" diff --git a/plugins/contractcheck/__init__.py b/plugins/contractcheck/__init__.py index 00b98a1..e83cbf8 100644 --- a/plugins/contractcheck/__init__.py +++ b/plugins/contractcheck/__init__.py @@ -39,7 +39,7 @@ class ContractCheck(_PluginBase): # 插件图标 plugin_icon = "contract.png" # 插件版本 - plugin_version = "1.4" + plugin_version = "1.4.1" # 插件作者 plugin_author = "DzAvril" # 作者主页 diff --git a/plugins/contractcheck/siteuserinfo/__init__.py b/plugins/contractcheck/siteuserinfo/__init__.py index 07b4fed..eec076d 100644 --- a/plugins/contractcheck/siteuserinfo/__init__.py +++ b/plugins/contractcheck/siteuserinfo/__init__.py @@ -70,6 +70,7 @@ class ISiteUserInfo(metaclass=ABCMeta): "听听歌": ["TTG", "WiKi", "DoA", "NGB", "ARiN"], "馒头": ["MTeam", "MTeamTV"], "朋友": ["FRDS"], + "猪猪": ["PigoHD","PigoWeb","PigoNF"] } # 错误信息 From 325996dfb13e547927b12142eecf741e1c54a45b Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 23 May 2025 16:35:07 +0800 Subject: [PATCH 15/46] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=5F=5Finit=5F=5F.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/brushflow/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.v2/brushflow/__init__.py b/plugins.v2/brushflow/__init__.py index 475f38a..69d201f 100644 --- a/plugins.v2/brushflow/__init__.py +++ b/plugins.v2/brushflow/__init__.py @@ -259,7 +259,7 @@ class BrushFlow(_PluginBase): # 插件图标 plugin_icon = "brush.jpg" # 插件版本 - plugin_version = "4.3.2" + plugin_version = "4.3.3" # 插件作者 plugin_author = "jxxghp,InfinityPacer" # 作者主页 From 5f5246a7260baafaa2be248d324b90532292b1de Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 23 May 2025 16:35:28 +0800 Subject: [PATCH 16/46] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20package.v2.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.v2.json b/package.v2.json index 4ca9edf..29714c7 100644 --- a/package.v2.json +++ b/package.v2.json @@ -21,7 +21,7 @@ "name": "站点刷流", "description": "自动托管刷流,将会提高对应站点的访问频率。", "labels": "刷流,仪表板", - "version": "4.3.2", + "version": "4.3.3", "icon": "brush.jpg", "author": "jxxghp,InfinityPacer", "level": 2, From 8d20085565b7f6200e1bccbf1073bd4839c34d0f Mon Sep 17 00:00:00 2001 From: wumode Date: Fri, 23 May 2025 17:09:31 +0800 Subject: [PATCH 17/46] =?UTF-8?q?imdbsource:=20=E6=8E=A8=E8=8D=90=E6=94=AF?= =?UTF-8?q?=E6=8C=81IMDb=E6=95=B0=E6=8D=AE=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 3 +- plugins.v2/imdbsource/__init__.py | 532 +++++++++++++++++++++------ plugins.v2/imdbsource/imdb_helper.py | 203 +++++++--- 3 files changed, 593 insertions(+), 145 deletions(-) diff --git a/package.v2.json b/package.v2.json index 29714c7..75e61f0 100644 --- a/package.v2.json +++ b/package.v2.json @@ -424,11 +424,12 @@ "name": "IMDb源", "description": "让探索支持IMDb数据源。", "labels": "探索", - "version": "1.0", + "version": "1.1", "icon": "IMDb_IOS-OSX_App.png", "author": "wumode", "level": 1, "history": { + "v1.1": "推荐支持IMDB数据源; 优化海报尺寸,减少卡顿", "v1.0": "探索支持IMDb数据源" } } diff --git a/plugins.v2/imdbsource/__init__.py b/plugins.v2/imdbsource/__init__.py index 902a13c..a070727 100644 --- a/plugins.v2/imdbsource/__init__.py +++ b/plugins.v2/imdbsource/__init__.py @@ -6,24 +6,25 @@ from app.core.config import settings from app.core.event import eventmanager, Event from app.log import logger from app.plugins import _PluginBase -from app.schemas import DiscoverSourceEventData -from app.schemas.types import EventType, ChainEventType, MediaType +from app.schemas import DiscoverSourceEventData, MediaRecognizeConvertEventData, RecommendSourceEventData +from app.schemas.types import ChainEventType, MediaType from app.core.meta import MetaBase from app.core.context import MediaInfo from app.plugins.imdbsource.imdb_helper import ImdbHelper from app import schemas +from app.utils.http import RequestUtils class ImdbSource(_PluginBase): # 插件名称 plugin_name = "IMDb源" # 插件描述 - plugin_desc = "让探索支持IMDb数据源。" + plugin_desc = "让探索和推荐支持IMDb数据源。" # 插件图标 - plugin_icon = ("https://raw.githubusercontent.com/wumode/MoviePilot-Plugins/refs/heads/imdbsource_assets/icons/" - "IMDb_IOS-OSX_App.png") + plugin_icon = ("https://raw.githubusercontent.com/jxxghp/" + "MoviePilot-Plugins/refs/heads/main/icons/IMDb_IOS-OSX_App.png") # 插件版本 - plugin_version = "1.0" + plugin_version = "1.1" # 插件作者 plugin_author = "wumode" # 作者主页 @@ -40,7 +41,7 @@ class ImdbSource(_PluginBase): _proxy = False _imdb_helper = None - _discover_cache = [] + _cache = {"discover": [], "trending": [], "trending_in_anime": [], "trending_in_sitcom": []} def init_plugin(self, config: dict = None): if config: @@ -254,6 +255,251 @@ class ImdbSource(_PluginBase): logger.info(f"{meta.name if meta else imdbid} 未匹配到IMDB媒体信息") return None + @staticmethod + def __movie_to_media(movie_info: dict) -> schemas.MediaInfo: + title = "" + if movie_info.get("titleText"): + title = movie_info.get("titleText", {}).get("text", "") + release_year = 0 + if movie_info.get("releaseYear"): + release_year = movie_info.get("releaseYear", {}).get("year") + poster_path = None + if movie_info.get("primaryImage"): + primary_image = movie_info.get("primaryImage").get("url") + if primary_image: + poster_path = primary_image.replace('@._V1', '@._V1_QL75_UY414_CR6,0,280,414_') + vote_average = 0 + if movie_info.get("ratingsSummary"): + vote_average = movie_info.get("ratingsSummary").get("aggregateRating") + runtime = 0 + if movie_info.get("runtime"): + runtime = movie_info.get("runtime").get("seconds") + overview = '' + if movie_info.get("plot"): + overview = movie_info.get("plot").get("plotText").get("plainText") + return schemas.MediaInfo( + type="电影", + title=title, + year=release_year, + title_year=f"{title} ({release_year})", + mediaid_prefix="imdb", + media_id=str(movie_info.get("id")), + poster_path=poster_path, + vote_average=vote_average, + runtime=runtime, + overview=overview, + imdb_id=movie_info.get("id") + ) + + @staticmethod + def __series_to_media(series_info: dict) -> schemas.MediaInfo: + title = "" + if series_info.get("titleText"): + title = series_info.get("titleText", {}).get("text", "") + release_year = 0 + if series_info.get("releaseYear"): + release_year = series_info.get("releaseYear", {}).get("year") + poster_path = None + if series_info.get("primaryImage"): + primary_image = series_info.get("primaryImage").get("url") + if primary_image: + poster_path = primary_image.replace('@._V1', '@._V1_QL75_UY414_CR6,0,280,414_') + vote_average = 0 + if series_info.get("ratingsSummary"): + vote_average = series_info.get("ratingsSummary").get("aggregateRating") + runtime = 0 + if series_info.get("runtime"): + runtime = series_info.get("runtime").get("seconds") + overview = '' + if series_info.get("plot"): + if series_info.get("plot").get("plotText"): + overview = series_info.get("plot").get("plotText").get("plainText") + release_date_str = '0000-00-00' + if series_info.get("releaseDate"): + release_date = series_info.get('releaseDate') + release_date_str = f"{release_date.get('year')}-{release_date.get('month')}-{release_date.get('day')}" + return schemas.MediaInfo( + type="电视剧", + title=title, + year=release_year, + title_year=f"{title} ({release_year})", + mediaid_prefix="imdb", + media_id=str(series_info.get("id")), + release_date=release_date_str, + poster_path=poster_path, + vote_average=vote_average, + runtime=runtime, + overview=overview, + imdb_id=series_info.get("id") + ) + + @staticmethod + def title_id_to_mtype(title_id: str) -> MediaType: + if title_id in ["tvSeries", "tvMiniSeries", "tvShort", "tvEpisode"]: + return MediaType.TV + elif title_id in ["movie", "tvMovie"]: + return MediaType.MOVIE + return MediaType.UNKNOWN + + def imdb_top_250(self, apikey: str, page: int = 1, count: int = 30) -> List[schemas.MediaInfo]: + if apikey != settings.API_TOKEN: + return [] + if not self._imdb_helper: + return [] + title_types = ("movie",) + first_page = False + if page == 1: + first_page = True + self._cache["trending_in_sitcom"] = [] # 清空缓存 + results = [] + if len(self._cache["trending_in_sitcom"]) >= count: + results = self._cache["trending_in_sitcom"][:count] + self._cache["trending_in_sitcom"] = self._cache["trending_in_sitcom"][count:] + else: + results.extend(self._cache["trending_in_sitcom"]) + remaining = count - len(results) + self._cache["trending_in_sitcom"] = [] # 清空缓存 + data = self._imdb_helper.advanced_title_search(first_page=first_page, + title_types=title_types, + sort_by="POPULARITY", + sort_order="ASC", + ranked=("TOP_RATED_MOVIES-250",) + ) + if not data: + new_results = [] + else: + new_results = data.get("edges") + if new_results: + results.extend(new_results[:remaining]) + self._cache["trending_in_sitcom"] = new_results[remaining:] + res = [] + for item in results: + title_type_id = item.get('node').get("title").get("titleType", {}).get("id") + mtype = self.title_id_to_mtype(title_type_id) + if mtype == MediaType.MOVIE: + res.append(self.__movie_to_media(item.get('node').get("title"))) + return res + + def trending_in_sitcom(self, apikey: str, page: int = 1, count: int = 30) -> List[schemas.MediaInfo]: + if apikey != settings.API_TOKEN: + return [] + if not self._imdb_helper: + return [] + title_types = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode") + first_page = False + if page == 1: + first_page = True + self._cache["trending_in_sitcom"] = [] # 清空缓存 + results = [] + if len(self._cache["trending_in_sitcom"]) >= count: + results = self._cache["trending_in_sitcom"][:count] + self._cache["trending_in_sitcom"] = self._cache["trending_in_sitcom"][count:] + else: + results.extend(self._cache["trending_in_sitcom"]) + remaining = count - len(results) + self._cache["trending_in_sitcom"] = [] # 清空缓存 + data = self._imdb_helper.advanced_title_search(first_page=first_page, + title_types=title_types, + sort_by="POPULARITY", + sort_order="ASC", + interests=("Sitcom",) + ) + if not data: + new_results = [] + else: + new_results = data.get("edges") + if new_results: + results.extend(new_results[:remaining]) + self._cache["trending_in_sitcom"] = new_results[remaining:] + res = [] + for item in results: + title_type_id = item.get('node').get("title").get("titleType", {}).get("id") + mtype = self.title_id_to_mtype(title_type_id) + if mtype == MediaType.TV: + res.append(self.__series_to_media(item.get('node').get("title"))) + return res + + def trending_in_anime(self, apikey: str, page: int = 1, count: int = 30) -> List[schemas.MediaInfo]: + if apikey != settings.API_TOKEN: + return [] + if not self._imdb_helper: + return [] + title_types = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode", 'movie') + first_page = False + if page == 1: + first_page = True + self._cache["trending_in_anime"] = [] # 清空缓存 + results = [] + if len(self._cache["trending_in_anime"]) >= count: + results = self._cache["trending_in_anime"][:count] + self._cache["trending_in_anime"] = self._cache["trending_in_anime"][count:] + else: + results.extend(self._cache["trending_in_anime"]) + remaining = count - len(results) + self._cache["trending_in_anime"] = [] # 清空缓存 + data = self._imdb_helper.advanced_title_search(first_page=first_page, + title_types=title_types, + sort_by="POPULARITY", + sort_order="ASC", + interests=("Anime",) + ) + if not data: + new_results = [] + else: + new_results = data.get("edges") + if new_results: + results.extend(new_results[:remaining]) + self._cache["trending_in_anime"] = new_results[remaining:] + res = [] + for item in results: + title_type_id = item.get('node').get("title").get("titleType", {}).get("id") + mtype = self.title_id_to_mtype(title_type_id) + if mtype == MediaType.MOVIE: + res.append(self.__movie_to_media(item.get('node').get("title"))) + elif mtype == MediaType.TV: + res.append(self.__series_to_media(item.get('node').get("title"))) + return res + + def imdb_trending(self, apikey: str, page: int = 1, count: int = 30) -> List[schemas.MediaInfo]: + if apikey != settings.API_TOKEN: + return [] + if not self._imdb_helper: + return [] + title_types = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode", 'movie') + first_page = False + if page == 1: + first_page = True + self._cache["discover"] = [] # 清空缓存 + results = [] + if len(self._cache["discover"]) >= count: + results = self._cache["discover"][:count] + self._cache["discover"] = self._cache["discover"][count:] + else: + results.extend(self._cache["discover"]) + remaining = count - len(results) + self._cache["discover"] = [] # 清空缓存 + data = self._imdb_helper.advanced_title_search(first_page=first_page, + title_types=title_types, + sort_by="POPULARITY", + sort_order="ASC", + ) + if not data: + new_results = [] + else: + new_results = data.get("edges") + if new_results: + results.extend(new_results[:remaining]) + self._cache["discover"] = new_results[remaining:] + res = [] + for item in results: + title_type_id = item.get('node').get("title").get("titleType", {}).get("id") + mtype = self.title_id_to_mtype(title_type_id) + if mtype == MediaType.MOVIE: + res.append(self.__movie_to_media(item.get('node').get("title"))) + elif mtype == MediaType.TV: + res.append(self.__series_to_media(item.get('node').get("title"))) + return res + def imdb_discover(self, apikey: str, mtype: str = "series", country: str = None, lang: str = None, @@ -264,89 +510,23 @@ class ImdbSource(_PluginBase): user_rating: str = None, year: str = None, award: str = None, + ranked_list: str = None, page: int = 1, count: int = 30) -> List[schemas.MediaInfo]: - def __movie_to_media(movie_info: dict) -> schemas.MediaInfo: - title = "" - if movie_info.get("titleText"): - title = movie_info.get("titleText", {}).get("text", "") - release_year = 0 - if movie_info.get("releaseYear"): - release_year = movie_info.get("releaseYear", {}).get("year") - poster_path = None - if movie_info.get("primaryImage"): - poster_path = movie_info.get("primaryImage").get("url") - vote_average = 0 - if movie_info.get("ratingsSummary"): - vote_average = movie_info.get("ratingsSummary").get("aggregateRating") - runtime = 0 - if movie_info.get("runtime"): - runtime = movie_info.get("runtime").get("seconds") - overview = '' - if movie_info.get("plot"): - overview = movie_info.get("plot").get("plotText").get("plainText") - return schemas.MediaInfo( - type="电影", - title=title, - year=release_year, - title_year=f"{title} ({release_year})", - mediaid_prefix="imdb", - media_id=str(movie_info.get("id")), - poster_path=poster_path, - vote_average=vote_average, - runtime=runtime, - overview=overview - ) - - def __series_to_media(series_info: dict) -> schemas.MediaInfo: - title = "" - if series_info.get("titleText"): - title = series_info.get("titleText", {}).get("text", "") - release_year = 0 - if series_info.get("releaseYear"): - release_year = series_info.get("releaseYear", {}).get("year") - poster_path = None - if series_info.get("primaryImage"): - poster_path = series_info.get("primaryImage").get("url") - vote_average = 0 - if series_info.get("ratingsSummary"): - vote_average = series_info.get("ratingsSummary").get("aggregateRating") - runtime = 0 - if series_info.get("runtime"): - runtime = series_info.get("runtime").get("seconds") - overview = '' - if series_info.get("plot"): - if series_info.get("plot").get("plotText"): - overview = series_info.get("plot").get("plotText").get("plainText") - release_date_str = '0000-00-00' - if series_info.get("releaseDate"): - release_date = series_info.get('releaseDate') - release_date_str = f"{release_date.get('year')}-{release_date.get('month')}-{release_date.get('day')}" - return schemas.MediaInfo( - type="电视剧", - title=title, - year=release_year, - title_year=f"{title} ({release_year})", - mediaid_prefix="imdb", - media_id=str(series_info.get("id")), - release_date=release_date_str, - poster_path=poster_path, - vote_average=vote_average, - runtime=runtime, - overview=overview - ) + if apikey != settings.API_TOKEN: + return [] if not self._imdb_helper: return [] - title_type: MediaType = MediaType.TV + title_type = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode") if mtype == 'movies': - title_type = MediaType.MOVIE + title_type = ("movie",) if user_rating and using_rating: user_rating = float(user_rating) else: user_rating = None - genres = [genre] if genre else None - countries = [country] if country else None - languages = [lang] if lang else None + genres = (genre,) if genre else None + countries = (country,) if country else None + languages = (lang,) if lang else None release_date_start = None release_date_end = None if year: @@ -385,21 +565,22 @@ class ImdbSource(_PluginBase): elif year == "1970s": release_date_start = "1970-01-01" release_date_end = "1979-12-31" - awards = [award] if award else None + awards = (award,) if award else None + ranked_lists = (ranked_list,) if ranked_list else None first_page = False if page == 1: first_page = True - self._discover_cache = [] # 清空缓存 + self._cache["discover"] = [] # 清空缓存 results = [] - if len(self._discover_cache) >= count: - results = self._discover_cache[:30] - self._discover_cache = self._discover_cache[30:] + if len(self._cache["discover"]) >= count: + results = self._cache["discover"][:count] + self._cache["discover"] = self._cache["discover"][count:] else: - results.extend(self._discover_cache) - remaining = 30 - len(results) - self._discover_cache = [] # 清空缓存 + results.extend(self._cache["discover"]) + remaining = count - len(results) + self._cache["discover"] = [] # 清空缓存 data = self._imdb_helper.advanced_title_search(first_page=first_page, - title_type=title_type, + title_types=title_type, genres=genres, sort_by=sort_by, sort_order=sort_order, @@ -408,18 +589,19 @@ class ImdbSource(_PluginBase): languages=languages, release_date_end=release_date_end, release_date_start=release_date_start, - award_constraint=awards) + award_constraint=awards, + ranked=ranked_lists) if not data: new_results = [] else: new_results = data.get("edges") if new_results: results.extend(new_results[:remaining]) - self._discover_cache = new_results[remaining:] + self._cache["discover"] = new_results[remaining:] if mtype == "movies": - results = [__movie_to_media(movie.get('node').get("title")) for movie in results] + results = [self.__movie_to_media(movie.get('node').get("title")) for movie in results] else: - results = [__series_to_media(series.get('node').get("title")) for series in results] + results = [self.__series_to_media(series.get('node').get("title")) for series in results] return results def get_api(self) -> List[Dict[str, Any]]: @@ -432,13 +614,43 @@ class ImdbSource(_PluginBase): "summary": "API说明" }] """ - return [{ - "path": "/imdb_discover", - "endpoint": self.imdb_discover, - "methods": ["GET"], - "summary": "TheTVDB探索数据源", - "description": "获取TheTVDB探索数据", - }] + return [ + { + "path": "/imdb_discover", + "endpoint": self.imdb_discover, + "methods": ["GET"], + "summary": "IMDb探索数据源", + "description": "获取 IMDb探索 数据", + }, + { + "path": "/imdb_trending", + "endpoint": self.imdb_trending, + "methods": ["GET"], + "summary": "IMDb Trending", + "description": "获取 IMDb Trending 数据", + }, + { + "path": "/trending_in_anime", + "endpoint": self.trending_in_anime, + "methods": ["GET"], + "summary": "IMDb Trending in Anime", + "description": "获取 IMDb Trending in Anime 数据", + }, + { + "path": "/trending_in_sitcom", + "endpoint": self.trending_in_sitcom, + "methods": ["GET"], + "summary": "IMDb Trending in Sitcom", + "description": "获取 IMDb Trending in Sitcom 数据", + }, + { + "path": "/imdb_top_250", + "endpoint": self.imdb_top_250, + "methods": ["GET"], + "summary": "IMDb Top 250 Movies", + "description": "获取 IMDb Top 250 Movies 数据", + } + ] @staticmethod def imdb_filter_ui() -> List[dict]: @@ -481,7 +693,7 @@ class ImdbSource(_PluginBase): lang_dict = { "en": "英语", "zh": "中文", - "jp": "日语", + "ja": "日语", "ko": "韩语", "fr": "法语", "de": "德语", @@ -636,6 +848,27 @@ class ImdbSource(_PluginBase): } for key, value in award_dict.items() ] + ranked_list_dict = { + "TOP_RATED_MOVIES-100": "IMDb Top 100", + "TOP_RATED_MOVIES-250": "IMDb Top 250", + "TOP_RATED_MOVIES-1000": "IMDb Top 1000", + "LOWEST_RATED_MOVIES-100": "IMDb Bottom 100", + "LOWEST_RATED_MOVIES-250": "IMDb Bottom 250", + "LOWEST_RATED_MOVIES-1000": "IMDb Bottom 1000", + } + + ranked_list_ui = [ + { + "component": "VChip", + "props": { + "filter": True, + "tile": True, + "value": key + }, + "text": value + } for key, value in ranked_list_dict.items() + ] + return [ { "component": "div", @@ -818,6 +1051,34 @@ class ImdbSource(_PluginBase): } ] }, + { + "component": "div", + "props": { + "class": "flex justify-start items-center", + "show": "{{mtype == 'movies'}}" + }, + "content": [ + { + "component": "div", + "props": { + "class": "mr-5" + }, + "content": [ + { + "component": "VLabel", + "text": "排名" + } + ] + }, + { + "component": "VChipGroup", + "props": { + "model": "ranked_list" + }, + "content": ranked_list_ui + } + ] + }, { "component": "div", "props": { @@ -943,7 +1204,11 @@ class ImdbSource(_PluginBase): "year": None, "user_rating": 1, "using_rating": False, - "award": None + "award": None, + "ranked_list": None + }, + depends={ + "ranked_list": ["mtype"] }, filter_ui=self.imdb_filter_ui() ) @@ -951,3 +1216,64 @@ class ImdbSource(_PluginBase): event_data.extra_sources = [imdb_source] else: event_data.extra_sources.append(imdb_source) + + @eventmanager.register(ChainEventType.MediaRecognizeConvert) + def media_recognize_covert(self, event: Event) -> Optional[dict]: + if not self._enabled: + return + event_data: MediaRecognizeConvertEventData = event.event_data + if not event_data: + return + api_key = settings.TMDB_API_KEY + if event_data.convert_type != "themoviedb" or not api_key: + return + if not event_data.mediaid.startswith("imdb"): + return + imdb_id = event_data.mediaid[5:] + api_url = f"https://{settings.TMDB_API_DOMAIN}/3/find/{imdb_id}?api_key={api_key}&external_source=imdb_id" + ret = RequestUtils(accept_type="application/json").get_res(api_url) + if ret: + data = ret.json() + all_results = [] + for result_type in ["movie_results", "tv_results"]: + if data.get(result_type): + all_results.extend(data[result_type]) + if not all_results: + return # 无匹配结果 + # 按 popularity 降序排序,取最高人气的条目 + most_popular_item = max(all_results, key=lambda x: x.get("popularity", -1)) + event_data.media_dict["id"] = most_popular_item.get("id") + + @eventmanager.register(ChainEventType.RecommendSource) + def recommend_source(self, event: Event): + if not self._enabled: + return + event_data: RecommendSourceEventData = event.event_data + if not event_data: + return + imdb_trending: schemas.RecommendMediaSource = schemas.RecommendMediaSource( + name="IMDb Trending", + api_path=f"plugin/ImdbSource/imdb_trending?apikey={settings.API_TOKEN}", + type='Rankings' + ) + trending_in_anime: schemas.RecommendMediaSource = schemas.RecommendMediaSource( + name="IMDb Trending in Anime", + api_path=f"plugin/ImdbSource/trending_in_anime?apikey={settings.API_TOKEN}", + type='Anime' + ) + trending_in_sitcom: schemas.RecommendMediaSource = schemas.RecommendMediaSource( + name="IMDb Trending in Sitcom", + api_path=f"plugin/ImdbSource/trending_in_sitcom?apikey={settings.API_TOKEN}", + type='TV Shows' + ) + + imdb_top_250: schemas.RecommendMediaSource = schemas.RecommendMediaSource( + name="IMDb Top 250 Movies", + api_path=f"plugin/ImdbSource/imdb_top_250?apikey={settings.API_TOKEN}", + type='Movies' + ) + trending_source = [imdb_trending, trending_in_anime, trending_in_sitcom, imdb_top_250] + if not event_data.extra_sources: + event_data.extra_sources = trending_source + else: + event_data.extra_sources.extend(trending_source) diff --git a/plugins.v2/imdbsource/imdb_helper.py b/plugins.v2/imdbsource/imdb_helper.py index ca4aab8..26c39c4 100644 --- a/plugins.v2/imdbsource/imdb_helper.py +++ b/plugins.v2/imdbsource/imdb_helper.py @@ -1,6 +1,8 @@ import re -from typing import Optional, Dict, List +from typing import Optional, Any, Dict, List, Tuple from io import StringIO +from collections import OrderedDict +from dataclasses import dataclass import graphene from requests_html import HTMLSession @@ -15,6 +17,28 @@ from app.schemas.types import MediaType from app.core.cache import cached +@dataclass(frozen=True) +class SearchParams: + title_types: Optional[Tuple[str, ...]] = None + genres: Optional[Tuple[str, ...]] = None + sort_by: str = 'POPULARITY' + sort_order: str = 'ASC' + rating_min: Optional[float] = None + rating_max: Optional[float] = None + countries: Optional[Tuple[str, ...]] = None + languages: Optional[Tuple[str, ...]] = None + release_date_end: Optional[str] = None + release_date_start: Optional[str] = None + award_constraint: Optional[Tuple[str, ...]] = None + ranked: Optional[Tuple[str, ...]] = None + interests: Optional[Tuple[str, ...]] = None + + +class SearchState: + def __init__(self, last_cursor: str): + self.last_cursor = last_cursor + + class ImdbHelper: _query_by_id = """query queryWithVariables($id: ID!) { title(id: $id) { @@ -98,15 +122,27 @@ class ImdbHelper: _hash_update_url = ("https://raw.githubusercontent.com/wumode/MoviePilot-Plugins/" "refs/heads/imdbsource_assets/plugins.v2/imdbsource/imdb_hash.json") _qid_map = { - MediaType.TV: ["tvSeries", "tvMiniSeries"], + MediaType.TV: ["tvSeries", "tvMiniSeries", "tvShort", "tvEpisode"], MediaType.MOVIE: ["movie"] } + _imdb_headers = { "Accept": "application/json, text/plain, */*", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome" "/84.0.4147.105 Safari/537.36", "Referer": "https://www.imdb.com/", } + all_title_types = ["tvSeries", "tvMiniSeries", "movie", "tvMovie", "musicVideo", "tvShort", "short", + "tvEpisode", "tvSpecial", "videoGame"] + interest_id = { + "Anime": "in0000027", + "Superhero": "in0000008", + "Sitcom": "in0000044", + "Coming-of-Age": "in0000073", + "Slasher Horror": "in0000115", + "Raunchy Comedy": "in0000041", + "Documentary": "in0000060" + } def __init__(self, proxies=None): self._proxies = proxies @@ -114,8 +150,9 @@ class ImdbHelper: self._req_utils = RequestUtils(headers=self._imdb_headers, session=self._session, timeout=10, proxies=proxies) self._imdb_req = RequestUtils(accept_type="application/json", content_type="application/json", headers=self._imdb_headers, timeout=10, proxies=proxies) - self._last_cursor = '' self._imdb_api_hash = {"AdvancedTitleSearch": None, "TitleAkasPaginated": None} + self._search_states = OrderedDict() + self._max_states = 30 def imdbid(self, imdbid: str) -> Optional[Dict]: params = {"operationName": "queryWithVariables", "query": self._query_by_id, "variables": {"id": imdbid}} @@ -247,69 +284,153 @@ class ImdbHelper: else: return None + @staticmethod + def __ranked_list_to_constraint(ranked: str) -> Optional[Dict]: + """ + "TOP_RATED_MOVIES-100": "IMDb Top 100", + "TOP_RATED_MOVIES-250": "IMDb Top 250", + "TOP_RATED_MOVIES-1000": "IMDb Top 1000", + "LOWEST_RATED_MOVIES-100": "IMDb Bottom 100", + "LOWEST_RATED_MOVIES-250": "IMDb Bottom 250", + "LOWEST_RATED_MOVIES-1000": "IMDb Bottom 1000" + """ + pattern = r'^(TOP_RATED_MOVIES|LOWEST_RATED_MOVIES)-(\d+)$' + match = re.match(pattern, ranked) + if match: + ranked_title_list_type = match.group(1) + rank_range = int(match.group(2)) + constraint = {"rankRange": {"max": rank_range}, "rankedTitleListType": ranked_title_list_type} + return constraint + return None + def advanced_title_search(self, - sha256: str = 'be358d7b41add9fd174461f4c8c673dfee5e2a88744e2d5dc037362a96e2b4e4', first_page: bool = True, - title_type: MediaType = MediaType.TV, - genres: Optional[List] = None, + title_types: Optional[Tuple[str, ...]] = None, + genres: Optional[Tuple[str, ...]] = None, sort_by: str = 'POPULARITY', sort_order: str = 'ASC', rating_min: Optional[float] = None, rating_max: Optional[float] = None, - countries: Optional[List] = None, - languages: Optional[list] = None, + countries: Optional[Tuple[str, ...]] = None, + languages: Optional[Tuple[str, ...]] = None, release_date_end: Optional[str] = None, release_date_start: Optional[str] = None, - award_constraint: Optional[List[str]] = None - ) -> Optional[Dict]: + award_constraint: Optional[Tuple[str, ...]] = None, + ranked: Optional[Tuple[str, ...]] = None, + interests: Optional[Tuple[str, ...]] = None): + # 创建参数对象 + params = SearchParams( + title_types=title_types, + genres=genres, + sort_by=sort_by, + sort_order=sort_order, + rating_min=rating_min, + rating_max=rating_max, + countries=countries, + languages=languages, + release_date_end=release_date_end, + release_date_start=release_date_start, + award_constraint=award_constraint, + ranked=ranked, + interests=interests + ) + sha256 = 'be358d7b41add9fd174461f4c8c673dfee5e2a88744e2d5dc037362a96e2b4e4' self.__update_hash() if self._imdb_api_hash.get("AdvancedTitleSearch"): sha256 = self._imdb_api_hash["AdvancedTitleSearch"] - if title_type not in [MediaType.TV, MediaType.MOVIE]: - return None + # 获取或创建搜索状态 + last_cursor = None + if not first_page and params in self._search_states: + search_state = self._search_states.pop(params) # 移除并获取 + self._search_states[params] = search_state + # 不是第一页且已有状态 - 使用上次的结果 + if search_state.last_cursor: + last_cursor = search_state.last_cursor + # 这里实现基于上次结果的逻辑 + else: + # 重新搜索 + first_page = True + else: + first_page = True + result = self.__advanced_title_search(params, sha256, first_page, last_cursor) + if result: + page_info = result.get("pageInfo", {}) + end_cursor = page_info.get("endCursor", "") + search_state = SearchState(end_cursor) + self._search_states[params] = search_state + if len(self._search_states) > self._max_states: + self._search_states.popitem(last=False) # 移除最旧的条目 + return result + + def __advanced_title_search(self, + params: SearchParams, + sha256: str, + first_page: bool = True, + last_cursor: Optional[str] = None, + ) -> Optional[Dict]: + variables = {"first": 50, "locale": "en-US", - "sortBy": sort_by, - "sortOrder": sort_order, - "titleTypeConstraint": {"anyTitleTypeIds": self._qid_map[title_type], - "excludeTitleTypeIds": []}} - if genres: - variables["genreConstraint"] = {"allGenreIds": genres, "excludeGenreIds": []} - if countries: - variables["originCountryConstraint"] = {"allCountries": countries} - if languages: - variables["languageConstraint"] = {"anyPrimaryLanguages": languages} - if rating_min or rating_max: - rating_min = rating_min if rating_min else 1 + "sortBy": params.sort_by, + "sortOrder": params.sort_order, + } + if params.title_types: + title_type_ids = [] + for title_type in params.title_types: + if title_type in self.all_title_types: + title_type_ids.append(title_type) + if len(title_type_ids): + variables["titleTypeConstraint"] = {"anyTitleTypeIds": params.title_types, + "excludeTitleTypeIds": []} + if params.genres: + variables["genreConstraint"] = {"allGenreIds": params.genres, "excludeGenreIds": []} + if params.countries: + variables["originCountryConstraint"] = {"allCountries": params.countries} + if params.languages: + variables["languageConstraint"] = {"anyPrimaryLanguages": params.languages} + if params.rating_min or params.rating_max: + rating_min = params.rating_min if params.rating_min else 1 rating_min = max(rating_min, 1) - rating_max = rating_max if rating_max else 10 + rating_max = params.rating_max if params.rating_max else 10 rating_max = min(rating_max, 10) variables["userRatingsConstraint"] = {"aggregateRatingRange": {"max": rating_max, "min": rating_min}} - if release_date_start or release_date_end: + if params.release_date_start or params.release_date_end: release_dict = {} - if release_date_start: - release_dict["start"] = release_date_start - if release_date_end: - release_dict["end"] = release_date_end + if params.release_date_start: + release_dict["start"] = params.release_date_start + if params.release_date_end: + release_dict["end"] = params.release_date_end variables["releaseDateConstraint"] = {"releaseDateRange": release_dict} - if award_constraint: + if params.award_constraint: constraints = [] - for award in award_constraint: + for award in params.award_constraint: c = self.__award_to_constraint(award) if c: constraints.append(c) variables["awardConstraint"] = {"allEventNominations": constraints} - if not first_page and self._last_cursor: - variables["after"] = self._last_cursor + if params.ranked: + constraints = [] + for r in params.ranked: + c = self.__ranked_list_to_constraint(r) + if c: + constraints.append(c) + variables["rankedTitleListConstraint"] = {"allRankedTitleLists": constraints, + "excludeRankedTitleLists": []} + if params.interests: + constraints = [] + for interest in params.interests: + in_id = self.interest_id.get(interest) + if in_id: + constraints.append(in_id) + variables["interestConstraint"] = {"allInterestIds": constraints, "excludeInterestIds": []} + if not first_page and last_cursor: + variables["after"] = last_cursor params = {"operationName": "AdvancedTitleSearch", "variables": variables} data = self.__request(params, sha256) if not data: return None - page_info = data.get("advancedTitleSearch", {}).get("pageInfo", {}) - end_cursor = page_info.get("endCursor", "") - self._last_cursor = end_cursor return data.get("advancedTitleSearch") def __known_as(self, imdbid: str, @@ -531,10 +652,10 @@ class ImdbHelper: mtype: MediaType, imdbid: str) -> dict: """ - 给定IMDB号,查询一条媒体信息 - :param mtype: 类型:电影、电视剧,为空时都查(此时用不上年份) - :param imdbid: IMDB的ID - """ + 给定IMDB号,查询一条媒体信息 + :param mtype: 类型:电影、电视剧,为空时都查(此时用不上年份) + :param imdbid: IMDB的ID + """ # 查询TMDB详情 if mtype == MediaType.MOVIE: imdb_info = self.imdbid(imdbid) From 34f62b9434d7b83f971a56f3cf55cc1ccf0af4f9 Mon Sep 17 00:00:00 2001 From: wumode Date: Fri, 23 May 2025 17:20:08 +0800 Subject: [PATCH 18/46] =?UTF-8?q?fix(imdbsource):=20=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/imdbsource/__init__.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/plugins.v2/imdbsource/__init__.py b/plugins.v2/imdbsource/__init__.py index a070727..a460602 100644 --- a/plugins.v2/imdbsource/__init__.py +++ b/plugins.v2/imdbsource/__init__.py @@ -41,7 +41,8 @@ class ImdbSource(_PluginBase): _proxy = False _imdb_helper = None - _cache = {"discover": [], "trending": [], "trending_in_anime": [], "trending_in_sitcom": []} + _cache = {"discover": [], "trending": [], "trending_in_anime": [], "trending_in_sitcom": [], + "imdb_top_250": []} def init_plugin(self, config: dict = None): if config: @@ -352,13 +353,13 @@ class ImdbSource(_PluginBase): first_page = True self._cache["trending_in_sitcom"] = [] # 清空缓存 results = [] - if len(self._cache["trending_in_sitcom"]) >= count: - results = self._cache["trending_in_sitcom"][:count] - self._cache["trending_in_sitcom"] = self._cache["trending_in_sitcom"][count:] + if len(self._cache["imdb_top_250"]) >= count: + results = self._cache["imdb_top_250"][:count] + self._cache["imdb_top_250"] = self._cache["imdb_top_250"][count:] else: - results.extend(self._cache["trending_in_sitcom"]) + results.extend(self._cache["imdb_top_250"]) remaining = count - len(results) - self._cache["trending_in_sitcom"] = [] # 清空缓存 + self._cache["imdb_top_250"] = [] # 清空缓存 data = self._imdb_helper.advanced_title_search(first_page=first_page, title_types=title_types, sort_by="POPULARITY", @@ -371,7 +372,7 @@ class ImdbSource(_PluginBase): new_results = data.get("edges") if new_results: results.extend(new_results[:remaining]) - self._cache["trending_in_sitcom"] = new_results[remaining:] + self._cache["imdb_top_250"] = new_results[remaining:] res = [] for item in results: title_type_id = item.get('node').get("title").get("titleType", {}).get("id") From ad96eacf55edf3bb1df75ef951dabab23da23f51 Mon Sep 17 00:00:00 2001 From: wumode Date: Fri, 23 May 2025 17:50:55 +0800 Subject: [PATCH 19/46] =?UTF-8?q?imdbsource:=20=E6=8E=A8=E8=8D=90=E7=83=AD?= =?UTF-8?q?=E9=97=A8=E7=BA=AA=E5=BD=95=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 1 + plugins.v2/imdbsource/__init__.py | 59 +++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/package.v2.json b/package.v2.json index 75e61f0..3fe26f7 100644 --- a/package.v2.json +++ b/package.v2.json @@ -429,6 +429,7 @@ "author": "wumode", "level": 1, "history": { + "v1.2": "推荐热门纪录片", "v1.1": "推荐支持IMDB数据源; 优化海报尺寸,减少卡顿", "v1.0": "探索支持IMDb数据源" } diff --git a/plugins.v2/imdbsource/__init__.py b/plugins.v2/imdbsource/__init__.py index a460602..5ef78d3 100644 --- a/plugins.v2/imdbsource/__init__.py +++ b/plugins.v2/imdbsource/__init__.py @@ -42,7 +42,7 @@ class ImdbSource(_PluginBase): _imdb_helper = None _cache = {"discover": [], "trending": [], "trending_in_anime": [], "trending_in_sitcom": [], - "imdb_top_250": []} + "trending_in_documentary": [], "imdb_top_250": []} def init_plugin(self, config: dict = None): if config: @@ -342,6 +342,47 @@ class ImdbSource(_PluginBase): return MediaType.MOVIE return MediaType.UNKNOWN + def trending_in_documentary(self, apikey: str, page: int = 1, count: int = 30) -> List[schemas.MediaInfo]: + if apikey != settings.API_TOKEN: + return [] + if not self._imdb_helper: + return [] + title_types = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode", 'movie') + first_page = False + if page == 1: + first_page = True + self._cache["trending_in_documentary"] = [] # 清空缓存 + results = [] + if len(self._cache["trending_in_documentary"]) >= count: + results = self._cache["trending_in_documentary"][:count] + self._cache["trending_in_documentary"] = self._cache["trending_in_documentary"][count:] + else: + results.extend(self._cache["trending_in_documentary"]) + remaining = count - len(results) + self._cache["trending_in_documentary"] = [] # 清空缓存 + data = self._imdb_helper.advanced_title_search(first_page=first_page, + title_types=title_types, + sort_by="POPULARITY", + sort_order="ASC", + interests=("Documentary",) + ) + if not data: + new_results = [] + else: + new_results = data.get("edges") + if new_results: + results.extend(new_results[:remaining]) + self._cache["trending_in_documentary"] = new_results[remaining:] + res = [] + for item in results: + title_type_id = item.get('node').get("title").get("titleType", {}).get("id") + mtype = self.title_id_to_mtype(title_type_id) + if mtype == MediaType.MOVIE: + res.append(self.__movie_to_media(item.get('node').get("title"))) + elif mtype == MediaType.TV: + res.append(self.__series_to_media(item.get('node').get("title"))) + return res + def imdb_top_250(self, apikey: str, page: int = 1, count: int = 30) -> List[schemas.MediaInfo]: if apikey != settings.API_TOKEN: return [] @@ -351,7 +392,7 @@ class ImdbSource(_PluginBase): first_page = False if page == 1: first_page = True - self._cache["trending_in_sitcom"] = [] # 清空缓存 + self._cache["imdb_top_250"] = [] # 清空缓存 results = [] if len(self._cache["imdb_top_250"]) >= count: results = self._cache["imdb_top_250"][:count] @@ -650,6 +691,13 @@ class ImdbSource(_PluginBase): "methods": ["GET"], "summary": "IMDb Top 250 Movies", "description": "获取 IMDb Top 250 Movies 数据", + }, + { + "path": "/trending_in_documentary", + "endpoint": self.trending_in_documentary, + "methods": ["GET"], + "summary": "IMDb Trending in Documentary", + "description": "获取 IMDb Trending in Documentary 数据", } ] @@ -1273,7 +1321,12 @@ class ImdbSource(_PluginBase): api_path=f"plugin/ImdbSource/imdb_top_250?apikey={settings.API_TOKEN}", type='Movies' ) - trending_source = [imdb_trending, trending_in_anime, trending_in_sitcom, imdb_top_250] + imdb_documentary: schemas.RecommendMediaSource = schemas.RecommendMediaSource( + name="IMDb Trending in Documentary", + api_path=f"plugin/ImdbSource/trending_in_documentary?apikey={settings.API_TOKEN}", + type='Rankings' + ) + trending_source = [imdb_trending, trending_in_anime, trending_in_sitcom, imdb_top_250, imdb_documentary] if not event_data.extra_sources: event_data.extra_sources = trending_source else: From 6f2abafb69acab016ae88bd2f22e839a9a343761 Mon Sep 17 00:00:00 2001 From: wumode Date: Fri, 23 May 2025 17:56:04 +0800 Subject: [PATCH 20/46] =?UTF-8?q?=E6=9B=B4=E6=96=B0package.v2.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 2 +- plugins.v2/imdbsource/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.v2.json b/package.v2.json index 3fe26f7..8abacc5 100644 --- a/package.v2.json +++ b/package.v2.json @@ -424,7 +424,7 @@ "name": "IMDb源", "description": "让探索支持IMDb数据源。", "labels": "探索", - "version": "1.1", + "version": "1.2", "icon": "IMDb_IOS-OSX_App.png", "author": "wumode", "level": 1, diff --git a/plugins.v2/imdbsource/__init__.py b/plugins.v2/imdbsource/__init__.py index 5ef78d3..2466cd2 100644 --- a/plugins.v2/imdbsource/__init__.py +++ b/plugins.v2/imdbsource/__init__.py @@ -24,7 +24,7 @@ class ImdbSource(_PluginBase): plugin_icon = ("https://raw.githubusercontent.com/jxxghp/" "MoviePilot-Plugins/refs/heads/main/icons/IMDb_IOS-OSX_App.png") # 插件版本 - plugin_version = "1.1" + plugin_version = "1.2" # 插件作者 plugin_author = "wumode" # 作者主页 From 7e1da4393e0abf1ad084c3ef9e06aa7b681934be Mon Sep 17 00:00:00 2001 From: wumode Date: Mon, 26 May 2025 00:32:29 +0800 Subject: [PATCH 21/46] =?UTF-8?q?imdbsource:=20=E4=BC=98=E5=8C=96=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 1 + plugins.v2/imdbsource/__init__.py | 33 ++++++++++++++++++---------- plugins.v2/imdbsource/imdb_helper.py | 33 +++++++++++++++++++--------- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/package.v2.json b/package.v2.json index 8abacc5..4a12315 100644 --- a/package.v2.json +++ b/package.v2.json @@ -429,6 +429,7 @@ "author": "wumode", "level": 1, "history": { + "v1.3": "优化网络连接", "v1.2": "推荐热门纪录片", "v1.1": "推荐支持IMDB数据源; 优化海报尺寸,减少卡顿", "v1.0": "探索支持IMDb数据源" diff --git a/plugins.v2/imdbsource/__init__.py b/plugins.v2/imdbsource/__init__.py index 2466cd2..817dd45 100644 --- a/plugins.v2/imdbsource/__init__.py +++ b/plugins.v2/imdbsource/__init__.py @@ -24,7 +24,7 @@ class ImdbSource(_PluginBase): plugin_icon = ("https://raw.githubusercontent.com/jxxghp/" "MoviePilot-Plugins/refs/heads/main/icons/IMDb_IOS-OSX_App.png") # 插件版本 - plugin_version = "1.2" + plugin_version = "1.3" # 插件作者 plugin_author = "wumode" # 作者主页 @@ -347,7 +347,7 @@ class ImdbSource(_PluginBase): return [] if not self._imdb_helper: return [] - title_types = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode", 'movie') + title_types = ("tvSeries", "tvMiniSeries", "tvShort", 'movie') first_page = False if page == 1: first_page = True @@ -403,8 +403,8 @@ class ImdbSource(_PluginBase): self._cache["imdb_top_250"] = [] # 清空缓存 data = self._imdb_helper.advanced_title_search(first_page=first_page, title_types=title_types, - sort_by="POPULARITY", - sort_order="ASC", + sort_by="USER_RATING", + sort_order="DESC", ranked=("TOP_RATED_MOVIES-250",) ) if not data: @@ -427,7 +427,7 @@ class ImdbSource(_PluginBase): return [] if not self._imdb_helper: return [] - title_types = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode") + title_types = ("tvSeries", "tvMiniSeries", "tvShort") first_page = False if page == 1: first_page = True @@ -466,7 +466,7 @@ class ImdbSource(_PluginBase): return [] if not self._imdb_helper: return [] - title_types = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode", 'movie') + title_types = ("tvSeries", "tvMiniSeries", "tvShort", 'movie') first_page = False if page == 1: first_page = True @@ -507,7 +507,7 @@ class ImdbSource(_PluginBase): return [] if not self._imdb_helper: return [] - title_types = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode", 'movie') + title_types = ("tvSeries", "tvMiniSeries", "tvShort", 'movie') first_page = False if page == 1: first_page = True @@ -559,7 +559,7 @@ class ImdbSource(_PluginBase): return [] if not self._imdb_helper: return [] - title_type = ("tvSeries", "tvMiniSeries", "tvShort", "tvEpisode") + title_type = ("tvSeries", "tvMiniSeries", "tvShort") if mtype == 'movies': title_type = ("movie",) if user_rating and using_rating: @@ -640,11 +640,22 @@ class ImdbSource(_PluginBase): if new_results: results.extend(new_results[:remaining]) self._cache["discover"] = new_results[remaining:] + res = [] if mtype == "movies": - results = [self.__movie_to_media(movie.get('node').get("title")) for movie in results] + for movie in results: + movie_info = movie.get('node').get("title") + pub_status = movie_info.get("productionStatus") + if pub_status and pub_status.get("currentProductionStage"): + if pub_status.get("currentProductionStage", {}).get("id") == 'released': + res.append(self.__movie_to_media(movie_info)) else: - results = [self.__series_to_media(series.get('node').get("title")) for series in results] - return results + for tv in results: + tv_info = tv.get('node').get('title') + pub_status = tv_info.get("productionStatus") + if pub_status and pub_status.get("currentProductionStage"): + if pub_status.get("currentProductionStage", {}).get("id") == 'released': + res.append(self.__series_to_media(tv_info)) + return res def get_api(self) -> List[Dict[str, Any]]: """ diff --git a/plugins.v2/imdbsource/imdb_helper.py b/plugins.v2/imdbsource/imdb_helper.py index 26c39c4..12c1c09 100644 --- a/plugins.v2/imdbsource/imdb_helper.py +++ b/plugins.v2/imdbsource/imdb_helper.py @@ -5,6 +5,7 @@ from collections import OrderedDict from dataclasses import dataclass import graphene +import requests from requests_html import HTMLSession import ijson import json @@ -13,6 +14,7 @@ import base64 from app.log import logger from app.utils.http import RequestUtils from app.utils.string import StringUtils +from app.utils.common import retry from app.schemas.types import MediaType from app.core.cache import cached @@ -35,8 +37,9 @@ class SearchParams: class SearchState: - def __init__(self, last_cursor: str): - self.last_cursor = last_cursor + def __init__(self, pageinfo: dict, total: int): + self.pageinfo = pageinfo + self.total = total class ImdbHelper: @@ -148,8 +151,12 @@ class ImdbHelper: self._proxies = proxies self._session = HTMLSession() self._req_utils = RequestUtils(headers=self._imdb_headers, session=self._session, timeout=10, proxies=proxies) - self._imdb_req = RequestUtils(accept_type="application/json", content_type="application/json", - headers=self._imdb_headers, timeout=10, proxies=proxies) + self._imdb_req = RequestUtils(accept_type="application/json", + content_type="application/json", + headers=self._imdb_headers, + timeout=10, + proxies=proxies, + session=requests.Session()) self._imdb_api_hash = {"AdvancedTitleSearch": None, "TitleAkasPaginated": None} self._search_states = OrderedDict() self._max_states = 30 @@ -231,10 +238,11 @@ class ImdbHelper: section["episodes"]["total"] += section_next.get("episodes", {}).get("total", 0) return section + @retry(Exception, logger=logger) @cached(maxsize=32, ttl=1800) def __request(self, params: Dict, sha256) -> Optional[Dict]: params["extensions"] = {"persistedQuery": {"sha256Hash": sha256, "version": 1}} - ret = self._imdb_req.post_res(f"{self._official_endpoint}", json=params) + ret = self._imdb_req.post_res(f"{self._official_endpoint}", json=params, raise_exception=True) if not ret: return None data = ret.json() @@ -341,11 +349,16 @@ class ImdbHelper: # 获取或创建搜索状态 last_cursor = None if not first_page and params in self._search_states: - search_state = self._search_states.pop(params) # 移除并获取 + search_state: SearchState = self._search_states.pop(params) # 移除并获取 self._search_states[params] = search_state # 不是第一页且已有状态 - 使用上次的结果 - if search_state.last_cursor: - last_cursor = search_state.last_cursor + if not search_state.pageinfo.get("hasNextPage"): + return {'pageInfo': {'endCursor': None, 'hasNextPage': False, 'hasPreviousPage': True, + 'startCursor': None}, + 'edges': [], 'total': search_state.total, 'genres': [], 'keywords': [], + 'titleTypes': [], 'jobCategories': []} + if search_state.pageinfo.get('endCursor'): + last_cursor = search_state.pageinfo.get('endCursor') # 这里实现基于上次结果的逻辑 else: # 重新搜索 @@ -355,8 +368,8 @@ class ImdbHelper: result = self.__advanced_title_search(params, sha256, first_page, last_cursor) if result: page_info = result.get("pageInfo", {}) - end_cursor = page_info.get("endCursor", "") - search_state = SearchState(end_cursor) + total = result.get("total", 0) + search_state = SearchState(page_info, total) self._search_states[params] = search_state if len(self._search_states) > self._max_states: self._search_states.popitem(last=False) # 移除最旧的条目 From 74df9ef465dab920f1247862ac3d2ef96d488a36 Mon Sep 17 00:00:00 2001 From: wumode Date: Mon, 26 May 2025 00:34:02 +0800 Subject: [PATCH 22/46] =?UTF-8?q?=E6=9B=B4=E6=96=B0package.v2.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.v2.json b/package.v2.json index 4a12315..e2b628c 100644 --- a/package.v2.json +++ b/package.v2.json @@ -424,7 +424,7 @@ "name": "IMDb源", "description": "让探索支持IMDb数据源。", "labels": "探索", - "version": "1.2", + "version": "1.3", "icon": "IMDb_IOS-OSX_App.png", "author": "wumode", "level": 1, From 637cf9e83a20d714e9caac2268690dfe7e570eff Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 28 May 2025 20:01:26 +0800 Subject: [PATCH 23/46] fix https://github.com/jxxghp/MoviePilot-Plugins/issues/784 --- package.v2.json | 3 ++- plugins.v2/moviepilotupdatenotify/__init__.py | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package.v2.json b/package.v2.json index e2b628c..bb3d819 100644 --- a/package.v2.json +++ b/package.v2.json @@ -345,11 +345,12 @@ "name": "MoviePilot更新推送", "description": "MoviePilot推送release更新通知、自动重启。", "labels": "消息通知,自动更新", - "version": "2.1", + "version": "2.2", "icon": "Moviepilot_A.png", "author": "thsrite", "level": 1, "history": { + "v2.2": "支持 MoviePilot v2.5.0+", "v2.1": "优化执行周期输入,需要MoviePilot v2.2.1+", "v2.0": "兼容MoviePilot V2" } diff --git a/plugins.v2/moviepilotupdatenotify/__init__.py b/plugins.v2/moviepilotupdatenotify/__init__.py index 05866a3..3125c44 100644 --- a/plugins.v2/moviepilotupdatenotify/__init__.py +++ b/plugins.v2/moviepilotupdatenotify/__init__.py @@ -1,5 +1,6 @@ import datetime import re +from typing import Any, List, Dict, Tuple, Optional import pytz from apscheduler.schedulers.background import BackgroundScheduler @@ -7,12 +8,11 @@ from apscheduler.triggers.cron import CronTrigger from app.chain.system import SystemChain from app.core.config import settings -from app.plugins import _PluginBase -from typing import Any, List, Dict, Tuple, Optional +from app.helper.system import SystemHelper from app.log import logger +from app.plugins import _PluginBase from app.schemas import NotificationType from app.utils.http import RequestUtils -from app.utils.system import SystemUtils class MoviePilotUpdateNotify(_PluginBase): @@ -23,7 +23,7 @@ class MoviePilotUpdateNotify(_PluginBase): # 插件图标 plugin_icon = "Moviepilot_A.png" # 插件版本 - plugin_version = "2.1" + plugin_version = "2.2" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -70,7 +70,7 @@ class MoviePilotUpdateNotify(_PluginBase): # 自动重启 if (server_update or front_update) and self._restart: logger.info("开始执行自动重启…") - SystemUtils.restart() + SystemHelper.restart() def __check_server_update(self): """ @@ -165,7 +165,7 @@ class MoviePilotUpdateNotify(_PluginBase): logger.error("无法获取版本信息,请检查网络连接或GitHub API请求。") return None - def __get_backend_latest(self) -> Tuple[str, str, str]: + def __get_backend_latest(self) -> Tuple[Optional[str], Optional[str], Optional[str]]: """ 获取最新版本 """ From bddb5916d69976583a94f5955292352ca48ee7df Mon Sep 17 00:00:00 2001 From: wumode Date: Thu, 29 May 2025 18:14:25 +0800 Subject: [PATCH 24/46] add: ClashRuleProvider --- icons/Mihomo_Meta_A.png | Bin 0 -> 59288 bytes package.v2.json | 12 + plugins.v2/clashruleprovider/__init__.py | 624 ++++++++++++++++++ .../clashruleprovider/clash_rule_parser.py | 486 ++++++++++++++ 4 files changed, 1122 insertions(+) create mode 100755 icons/Mihomo_Meta_A.png create mode 100644 plugins.v2/clashruleprovider/__init__.py create mode 100644 plugins.v2/clashruleprovider/clash_rule_parser.py diff --git a/icons/Mihomo_Meta_A.png b/icons/Mihomo_Meta_A.png new file mode 100755 index 0000000000000000000000000000000000000000..eacd778118c3b42f47a2e85043e7d2120cf8dd94 GIT binary patch literal 59288 zcmeEtW0Ry?6K%CMZBE<9v~Angv~5k>wr$(yw5@4#rfr+I=A3iy=lcWRim2FC6;bhQ zWUgGfGIzLwoH#rzHY@-DfR~gIQ33$KfFHpC(4fEpcQu6}--q+0;5a6r;O+lf6zf%^l5&-=D zA&-;L4>$m3aghZ6j^+r^gnvgCC~%~|V+I%~^xts`1Oyy7_#OED`*)}R{r!Ji_dm1w z>l*)ang7AXUpx5!fXcq}!L^4?EACqCk9C*D61+&?M|!p;SG{(N<(}qq&#cS-m*?Bi z9{Yn^0>0 zbZwQ1p?LRIF!%{~_Hl&Yb$9OZZTX{rb^Q?m0BB|G#D6-f>^b~uweETgg})Pjz5Yma ziSTFlvwt|<2!}$Pw@E=1PSW}1XqYfLhSv3!nWBfS6@*@#(63Ll4vEoq1$+O&6Mob5ylnmjblWzndnEFk(bhyN}(u-50#OSpDV20J+5$?{KUv-kEV zTqpirnn9?_^lU%!egKjH5x9dR{Z}DA_b4p3C2<>PW20}_(XbW^Vucc1XiGD`_jYhP ze889#sJ~txTE$V=7EWz;RS+G6!2ET*GRN)DET&x| z4j5p=_DNRzk^g$Rb@O&TVIdxr60KemY)%bL;JqwvUTjH7lcKoS`#XfopR<)xHtM3M z?esYh=NEI|7juCb>{$T-Yt&`S=DojmP5UyXbAkS}(4)?uj^^vK);XG2r;`y?2n8}6 zC-<|NY_6*l%$&|+Wv6%mKwsW@-Syn}rm=PN*+;a{loX9DB#Cbj$O1q_KCwX1idHE{ z3q`g|<38@{1z|)boez#){xD>}?}!h)v`cqO+lNAdmMOAbzJ_?mdLA6mT<&x?EkZW| zDk{-hj1J@a>QmEvEy;7K4c^~=vUlB09`ZHuPy>EjO_k_+)_RXSwVriqmwE5Nc`I2U zC1X=6L?L-j6|I^{3{rq3$xj?UB!Ws<6goKVo{bq@KJPZ>es)T?$=ZJffGiMay6StM z|N5-8Jw;$Y%7OveOM=Y65NO^_o&98$K4M3BU!;-qxyhE^0Ri-sSZ{eQTjf3wu%EBs z@c3Tb&>*gsG;TnndF`j62^bxwBJK?KgR(#uDL@lSSw;Ci4X0+k&X3ql=>~FBA_>qn zT-Nt??fS$>srS0R@XE1J@Zkop;erW$|5_Lhd6-luN)NKDrMfFr4$TY<{Yy`D$QR6Y&4I{e0TCyWb4t z#s@yku~q*^@pf0Vt2!g7EL`5ssEy5sK>+u|&t*LK$4}+k0&svA-Kx(F)a7Tq*|V*a z635VT_8BLU-H3O&Pu5q8T&3{RL4Lg_J~J2NDSk;ch(+cS2!(GT?4L8AZ9Zou+ON=k zc<|792S+W|y{9w1LLrkdgnT+7mHb@xOYhGKll)*t{w_BJTkc1-dj24I0I&DD(~s@$ zONZXQ&Su5ZFv!^S17aLIF%TAy>mW3DB>)6A6oEXv5}-VA4Rir&v$(`HFkU!x`!3*C z|2b5;+tXeg06oJBM@?K#iK<>2#xH~ZUU68P%j3mZ4glDac)8sp zzU|aN`RK2~D;cH{A@114kV7cgTaPR1cVGw{pUwB9a+qKUB!4i>2`*J?`vWXdfoCHD zI@+$vI=i4z2Lqzg_*&E;Jycq!Y8=OxJgvp=GvTk!d)Xh)P#Xsh_{}z8x8^a0>SHs~ z-J2b_5EVpSlL*BFm)FIP?N$UBH;_D_Wr;$x8KZ|iMW8@^T#b0SmYi(6YTKZ zJXA!=)KS-{50W=wGwIW}OeGU@LXJpMhNGQFF9W*P!}SzJy$>heX>6Zg%Ktlg^q4~8_x&$O$dZ8$T;o{tXZ&zm{)c~HOx^-@T9PHv;gHoN_7(Rt|i zQZozz%~|kOvT68YApqz35y{jzXH3R}f+>S`tdPF3BhX!^7=i$nNWg8=PzAI{08gKt zkiS@$ejb{oI5B8K@QB^^c_KCUWx-Qj8W~_uW!-Zlx6F6`xzhA%i9ii5t_!9rJhGaV z2x8HM7_N8myZn%P9Mka*X4OgSg(Fdn32dYJvJr+Dl@bWXV@bdkW9Jp6H#Os$Ibjxp}ja-a@Ua9~HCzko;^>41%4Eg>cE%6-uI%ihl&m-u&z28ABzXG=@tpQNnosMik14GF0Ssn#O^DC_$kbDw4uPPXUn)_ot zzx6}$&Ts1czN1>D{WAi1Z74fWwsI^cx4BZHq;mZOo_{v>Vec)sKYZ6xY}@oW+xgY{G4YL&tJ=J%=I zMlQc@EEqt;pN8OiSDo+8qAQm)*m)ODbV9@$^422urvuMh5&+gC$diEuBbSk~+#vJ- zoGIAfKG$`6`t^*GWrXvs1T%*p7QsFM1SMY8ntuu$VWoxXn=g5`f5nM7qs2!) z$)WA@+fVi0@4I(%V`%_CDz8>x^r(By?BzdS3laZdq8S(Jz|FkW&DKU1sE7W38=XGe zUaI2svLvVC@?O8GM{Wuo`iTNsCi*YX@ISuV`anFzlUW6+nnCUm+LCxEpJ^WEDZ~qs zH%ngT8vc+}@Li6@jg z$m{C97_a*$mvWtP=0CNTK5fj9$?~#^F5ZfI+u!W)f-4jPja(c>AjXDM%4aaZq6d>! zoNhp*Noredh%TcwU|#Cxw>6y83G~nkhxglWs~q2t1K%7T2mm1v9(?BQY&%cERLYnt zp$E>o04Is1(?1eyR+xRAi++{lIIlNkxS^&kkEfb}vMe z1OYA61@3Ply`Rny!d^v5UIt#7W8D#SrAT9GO@YtG5KP{N9z4!zYuEG3uiWQ#^m(W} z#lOIGlO?OJV?|f13PKtz!PbWb!h$g8*tHal`L0@@k6zdq8*{M;YrS!;xkp)>OWH?$ zBCZuoeG)2#qv3}Q30xsLL>!H=)FK)SonOg)6c!@Jg5G(PJN?=lNk-bA+4aw(J&LW4 zGZaA6Xo}T^`?+#XXNyrRuLAogGy|?+?gaddbQ@xsA@TEr@kHFap)$ov9ogYW{;H1- zBSqYpn1aDLzt%Pi48woW&Iz)20&6@}tYl+<{H5rToJ77s=e5-tO)oEYg zC}qx!?m__1KQ6a-CYSIX99$t2Xfz`y7=$jy5TQro@k|=#xf$|zQGg6J{+;iuX-&H) z+1%H2y*zISjM&C;{0Gb9b?A*_KM&1JG;5Ee1cE3#>k}sXzj8_n&N)VIB zgvx_bMt}KrK%A-$eM*D5C>6?P6swLQt>p+o;}$S&$mQ|GpbrkRK={}Hkp$ePG4gDW zVXx4>gU==@P>l?)r%Am|V#mPxla%8%W$WA0`#0)8Jx$qpN&0?R?_&XM?DyS1R+6{x zopCCnC|y7X&*3&XlU;*$v+2kpAo_xAQBDgJ?Ej$cci?0tZb^|Dyr%2m>XGt>;I$+F z2M0uc7ecz#y^5ys1Vd9`6oDhuNtBBU;Cq(N7N(W z`}Tt_AAsQc!1Hv?)-@kh2403=vcbP!+$K5D*#uw;!Hu8-kE3axIFiBZ!nH|Bti_5@ zLJ9U%DoZZ~I>=v>Er2jTYQO9-;76xuWReJ)mPHus48|K3yS*XUhf!grl`KJ@8=TJ4 zpL?0B#r-jLyBxdC<0%QCr+Hf|sU-NU zSKmF&^`1Y1_X7>$RziS!v5K-NEhQxYC*~*(C4GE8S?VG~Kf2Z=2C0#vjJhKK+_(KI zw*-gmkbn7@0_dp8IwC`SV!Y23YiiyY+|%(77fII5TvM$?*8AO*G+*lS6vfwDGlZT8 z(L-Ay7-)K@rIyR~2dbIXhEF|emb6Q&>9<0|_^7L;ZSw3DGZ3_@{;vbOYnRR|p?YW{ zLSWapvwCeH+HIsifnyl>`}A`zN*~b=P3s6+jd0yP7Z*Z3fuXr@40er=kqvsxx%TU z`t`4RP)RX~z`6*Gq+i3N^_=yPCwW14#xq{w-@78q^rLVKZ<|Bh{kS+sf>CUj%qTG( z>;C1|q#!JYkyT$ce`zYqWi(hj3=U?Y2qbg#@0T7Sz^RToBcF(u+QrwG53Le-oYKhq z+~6(Jg4u_fPAs|+kb7*o7sHy&k(}`a)0MJZNPw_p*v?}q;+4iJ9@k&UYR8?zW$Qmsfj&YNXlpSQr;%y2*-UW|=f_vZ%%|GL~=l}F>7Xc@s*Y!e90 zNE#~T$@6USzZS>G;XG^tc*=<&I;)P08mIES&GyBp5N3viRG^Z zE>-3vhN)UeR}XfqSHam{q$&AM+x))3`SFJx-~BPS8U@v_*4K68&|pAhCbMM)Y*_QufNqIgpda*q*e?Mj3?hK_-fmp+|*`x4K7OLaZTrL30`x4%2hsLIk-*m#;r z;B;@~>(DPaQqNUxaL#eyG!Zx&**Me|lI3%=cNB5G+y;UmV10| zamI=_E)?WO^lt=C0z@R?$?M5;9R$TtfzMujRzNzcK~BNul~*10FI(I*FW;)lwqWEN zI$=M|czq18_g)tRvwM*YfLFKE&_J%^B8g9dV_u2RxKAl@58Hgy^k}ktT+e;mHw#CN z2RVsMG@1&+UjzFAr=n_uXR{tzsSDDaIxl>cWL)Osgvw||p1dBrcDek}|MD!wRzR}1 z!5)grWRm&J6gS*gmMBBKA%#OnX$HLBAKVIG^Xc78ho+R)<=-u-jyBXkj)7cnA(vNk ziV2`U^3)ysam>5@5Hud2_mRYwX8|(k5zyH*K3E7qQNzxq7ktPq^73-cX{j86l9D(| zsqz_|3~MK$ov6+VaE77o_0Ua<8rqn{`M;=dKqnBa+IGU6H7S&!1Q;@u!1f$22${)j z1*4*CSimtyzi*@!qBJaj|8o^QpwD-eacGmp!;_5)=;;A+qmQ5ZThGz4Rk+$EK02#Q zVg3ETsPwAFRh_E;NFpTTINI&VlqdCQ`Ybu`p=QJ z-j{!)kK!??6MAdr{9>ssY=u;)ZIh>)nL?VAgPERjk1ho83u`Ni#yN)6tT6wB; zIL=|?Yibb|uHQU*V3NGMxffT{3L?vf?gn(M=cS7xx#w8Jmx_mc0`CdC0jM&;|H$h5 zje*s^C|we(DLRM0shKwzNr?Z5aGN)^{N2$Bwe{jZkdyrm?Y%0gHOdV_4 zT5M2p#IECZpwH(hxeWHZa=K(wUH`S|(6;A>{(hhc1r|>!JjKg42|bw5Q}$ek$i+A? z7&jyU+L?#T3R(edd4JX|-ct*k7D|olPrxc%R&Mwb>VND91!T{KWUP`zbT55C50;R? zM!?Z0uAjg>oT_YrD-oY(f>IZMat=lm<0V?y?)hE$^C>5?3m>5G(sK41V&!|sY1R4Y zs6fegSj?**f22EUwDfCk?sBEG;*aB9F=;{Ocd3zml4LAa!}Z<MR_R5*-WX-)y4jkJm1oiyEnDlSZtbA zxEdvWXmDXkeZ;uPH_et5k}#$tDV(H3GI00Hg~wS|v+ij47)#9mAE8JEJTCJa#3~0W zNM(m;s7i+tzwhCgMz%6GY*kx_rAhi?GP4@G4Ru$B5Ty_~!*8ILcpkd-5;`r%3kTe= z8YrHZ6N0DK0glQ5Qu7;I1{sd6aH@1TiVPOo39@_U=efx{C&lmbP$ReP<%z$CP z*6w$JBDRxSykJcoARYB^{)*}1n?nHylI7Pnb9k2B?Z%E5hY5&T;NIhHt@Z=YUASlOt3J14?QOlv>BtnRkqiOG5Uo%`3Q^$Xo;aRP2AafL`ca-vzV6Hg zYSGS|uDYOBw$hSOY}!|RF{9otKAR@&`}|WcdCSqvg;o0f;X~KGYK9&FoPy_HPDbfh z06~fQWnP^kWQr!ADspD%A-MPpm06w=WVJDp7Pa4jXQj+c#-dw|Bfn8!JHzL|&*cwS z-;X=%6Trs7Q}_05)Fz^P0VW=Q19RjT{GJv)QNxqMw1yWfs0@uCD(^ndCxWo?M?Z~f z@|Nt)0+Gw{8JLr4g;*0&gRAGcWtC~T+|FzmLLmMHA0RbmfhDwMPmW<#nS5?QEN4=8 z76nt~>R0Jq=z_d4tRdvGQMFP?Z!9kUGl`l8J5Hs~@fHjO$B*H1lGHeE06oZd^||L+ z@8+}LrNI!1p1z&hX2w~6#uI%221&W7iWSk`6Lq)Vxr1B)_9xl$rP9tAnaQq`+(`ua zUY1&8eZUK&BkaFaB@jH$X&lvle(R4k@}KM_Q5Um3OH23dVb+QAlkn2rX6}q6-=5ra zHiL2i%FojgJHD%m&nBOAD{$gFI|*aCRGV$cDFpH#z+F}!T?q% zpezb>Nh)6OQ#l5~@g$uv%Jr!T+c{L^N?p5Ev^^JpYj~+vPS!a#)JA@%oxZ;r{qMsb zY%Y;oUg&LzO1+4 zYbG|!TUNO@8&jT_TKu%Kbhp_8#v<_nev87gb}P&JvF@pr;3Y*3fN(|+?~aQ(Qm+E}dH8`$s=M2Dv@~?dOP4_$fc-*R^u(o^9F_|Y~@#?Td zwT`hqRyiJm+Q-5})BM*X;^E2Kuw_<}AqK6p1E0QGyN#QJQ+e+f?^YW3$R?gRgR zd#39p>Za&!?{zn#TnH4iP&cM93^jB&OD#cLJ83~8+3+txg9$3k2iV~$iMzymrp+v` zj?VAOl9*Fq!=NxV1&I?|wpqlZCO8X7u5UIBf|weC|7Jls4q(R!oTyq+->g0HB@*&F z^wKhtDf8MsP)y=r+ay5tdZe(;9rZICi%3+UL${vw<-G2O*V!2IOj@>%dtP(zv^O6% z2V(343^X_wbOJi4j*Xf|pX`c9sOmZ-d1a1ujE=?>2YvK|GAy!n8~9VHM=Ti3)5i>v z(j&9&+<#_krKV$r_EHvj;Ontv`Mlu)>lHu|4p$Ojau-#`;}mw1U2$(N8KC;D2ZA}%l{&p!<)lVBA7$X}{^IEMV`QgyotgwVukGER%RJYbJ~qryvSkEj zoh1j*{%f2K6w+MJs~-+*%Y(!6DQJSFRyHbB&UZVB*;;c>l;(_k4LiuE1M0R6dm3 zshp-N*kY7G4U#}hWmV3e%`uh=BWSS4m)b&4w;dy2m!tDf2xZYg?SW}KuZ5nG_k_zO zjxZL9lZ$)>{(PUd2`;FhDhU}hHW1Y)!Ml4Hb~7_#4y{t&L&Q=Ex*)=|5In?ppHV)*$Oh~w%U0RDt91{UGC+vrQEV*Y4ZCg z+6w$-j$lDY$-S&Ja%PK=&3~55_g<#3ZzHiS*;StTm8{&_$hVz%`e;GG2oKL5;)sMM zsq&*PjVH-4u&B5iP7h4!mXnNbQ-UYR6`Pn!6jCtuixnmf>4nwAxk$&Y9%$EB#@**f zsUG(>E>Rw5VC{Wpaag+o#Pr@4BMHF&JyjZ5LJHP6X|{Z(lGc(~-0XxhSi*hYL9+!2 zg)|-h=5e4lSD{(5BV@ecb8_tQ9?NxohRN@6<+5y0VQwG)L__e5s_ylgsH*YcEQv5B z*=+x*TKp=dQ?!Kr^+7yZPJ!eNkc|5IstpamvtgjzN3)^lbXizKSjNiF( zXh^y;rNhwOZWV#$!)ZtN|CyU8xv@eS-qnDTP{FSEUGhOelWPFQFGcGgE}~uOdf$>Q z3Uld&z~;U$tEwoHnKrA{tMB&eh0+1F5hp0U_W+c5@pkv`@h zOl@nSH)e#Kg}XRaOWJBMdK}7N+;ekN$SzefN$vi2$K>HWicA6F5+PNZieftJW`VrK zr*T|39cf_Lp@NrxKvsQ0g79vCUGMJpmd&6W3a~^3qRMDt-*C1CcO0o(gb8Z+)m=KO z0DUC6MO3TO@P&%l(64Z!%%M(33J2m?Dn=2fY*__7Cezn1YQW6LS9I^*2&$J!2Ho49 zoF71YmD!^A{$ys```9WU0l9YL;a?52V?V8^8ue<*R-KL_pg-^Wx zV=@dyjtH(SZyUOImXM-FL9Gw&*9F{%|)s@L7IYemHygzlSc} z*%!8U7FNJ>ySl?@1&&=K!I((#GYZntsU%P85FeJGu)#2snZ(Zt*?vp7Q3V^YFz$*VzUG4T!f~(NRnyP(E(4gUDHMArbgS%Hbqx^0@ zA%$Nujfs^(aV@-zXMhfmIr>?ahA$yQG}S&s9dWLaEJ`Qj+FWygw_kZLmM4te=_Q>nxgWB78!}3EQ%hSDsa;dA;2Qnr~40Sa_V%;)t z5hCuFP}!{I`!h387%OPhe=%l-ndJa>K&*Z49a?X>wKmx~OUr^E3%r-4Y_3?EFQ2h9 zG)ocekw(m8s6fLx=;`b6XzK6%eo%~3m`NRNl97S_rl-o+2{J^_@nB8wxsm0?rnofb z)7Rv%v)K#w|0Kd?zTN#T7CMS?;YPz@+~UM0YKuh1p~Po#xm-KuZ>NZRIt|xPUb^(F zE?ZRS$xAxN@_YjMVZ20E&SmidL$bji{Xq3_^?1hXJ2hCIESs)-Y4FQx(_uyv!5+V3 zfvW{c`sK^`C%Bv#-u?dJWx25Qj|2NwMWP`UAzBS`Qy+y&w{m~;hF{|*%rR{__K|Xr zM29da&oZ0|1U6j}ZVtzA@~$O&y=iCi6kE4U|AJ);F^zESW)^Yh=If->R zO2vZ>L?yIWDtfZRLpvqB3g=LI0M}uKwh3rHlO)3%nelIw#Q7>@O4G}f)~*|%gxzB3 z(`Pc1^8UE>xo764?Hao~8H&W6-}n}0j-Au+sQCzIQk{3eUL_Opz&DOhIDD9IX2($z^1s?* z6zEZi&UdWH`UE_0THB)5I!dW?ned{x5}nvaN+fTCts;#<1nDFNQ3Esxc8io`RwM)4 zO`WEi&5~$=@_kOeT$0OoyOECv26{IB-#13Uf8$q89kSWkIz2oVH!O5{ z8Ci}m>D)x_EVvxc%m3k*CP35}ra)?_{`c>LR0^o{j0lCw@F6i(&e8FQVAUAeuj&Uy z6BXUs^wD^oKf2l_9AFCFha(JrSns`OM_=%D*bldj@V^ZYTs|eX>wU3rZ`|$KZoY)_ z2`2ZzS8t@=3eEdWzj#qf=pW7-i{m9I9wMIiOz$i_(vc58Sk```f~r06t}zztSeqrR z`hk+(EW(fW=n0WQ$~cjvXD*pl@RdZ^ChBhAJXQ9*mKqK5JXkFj%bSD-@k#pUXR>D+bZpF#82>CX zM}Y}lBWUK7nPF~55<`GCl^$hZBDo35`55z7Iv&*16O*E16q9-3pO_dXdg|FqRW~2_ zEeAw2A|Uem0jt{)5au0T##U}Eq^~u$=E&XOHH~E~^NhO)oC9#($=m z8yN!~W@Dy|loL{p!_ak2I@>gkR84Ls5BWWAPix^$4^s|db;NY8uSzf7SCoT=Yg|qi zP1AO~3dvH^kSn)c>qibymqfG<8+*#g4xMIH6;@$|UfQhd3_O(h+jU^%ra|#gi|po{ zn_zfT8Zk5=)R?KViZ5@{{`mS&xbNTBp>WgAsKWQOoCW!b%gU>v0>DmpT#1oJ#4rxQ8?Dk z@#XL=57l!}#nf6pMT49coUz^@zeuTJfmaqWURHZxsl2xxAM~FDk_0XfRMS4mmL@nT zyk~k(b<8Z>hShpY2CeAbea{ZXWJ0)(3eM()<4{8KcYo4deT>_PlO<5^*$ZQK&x022)|LB`2k&7CJY_rqYr z4CPfS2?@n*ydGtsqfjflC>#}%52OR~H-jR^bc(qFX**-8ec6|ToYf8!;z2OrL{-1<)oIC?`IlMUEbRx0Byi zdiEFOPsBPQ&g->pFX6q-?%TX)Ak4Y??j>)4*O$z4;zk=`NMLJGMV#qEtbJKZ&S$@A zQAhUPV)D88hR7%ic~Ftr@U`6}3v(%tv zqk0}F&h9%k0ha|PBk~b zRn{}pZdloFLyF{jFM-ED}m)oix0Onm#kTJrN_A6 zCX^ZlGu#k~@ri;$si3e=Z<%2#M=>>?_ndS@Bv;DcAp--Z8MTeM=@o;2UQoBywqIS# zaX;oZZH&F)zv6YzTl4Y9%x(R#=v~W9wkmIbZ2-;S07BM~vYS&d8g?ekJ$__xD0q0F z*_Oo2^cs1OzQ%fIOdW1V-#c@lIIsz1pC-Zr@mH0RURiD&oe0$cTFU3cgJDrUr7xAT zx9h1|htwwCe+r}!;QUjv1)vF{D5qv5b3CypdR#*yrLE5?nynxyX`ZKWE(GVUAccW$ zs5YE*tkBvsxiKt~Cc#2!pw7)XDv27JtT`f1bXul0qqo6xbHUI1k-y9^!TjW5cB+eC zcM0V?V6%$hW&1H+=m64XS^h_|PxO&(d)ar6}eIoPW#u7qOS#oFk9AadpAbylRZ^m5cb+?IG&1KR00g@*Yo}_d#8!)s!#8 z_?5DkR2{wvHqX_XD^Dg-e@TFi0-tbbIYW8{xY?ae32j8-#Qd2OI@82HQNdo}sTaa? z(rL~z78T_O8il#(FoVANx!XO zAdyfd!J(xRyYxEVQ2wPl-fm*JOqsc%|7=#^7 z2Di`=POg629oECX;^ZXLgo?#btg;WBq+L=~6y*u9GVP;?PXl{onY*kvPVQ^0>lfa} zId9AbcFIE>ji_w1p8Mc&Liv^3-Rw30hN(cnOZjQCbN>0aH8S(;K2krPRCoH+5SMxs z<*V|zit13Qgu!}9N4YRe+xPKbYKsExRFq7*6m;-n`!9QMVaydkZj=E~Di2o{a>a6c z2I0E5p4q%B&jeQ7KQ@k4Ye9QLo-QK9d5jLh2o4ief5DEOkQuc83D38p zlEW{^iUXI3;PcM9qk|+cKYOB_4E}VqP^eEea!0+pF^JExqs2Rs+!?)*NKbP#{!Uif

tbs*&%G@7Q1vEOdcQc3(5Be5i3;)p23;df$}7 z>~EVRu=}=RIX9AmKc%3XQd5jd<<4DI_DnC0#W?K3W9M^X8XzT}7Iwg*z)B%hEIXd2 zdd6;&)c;b<5|`wCqG+}#9wD2tv$svGeoA4>`E+tvP0(%OZu@f?wAX!oYvkQd`{Jh0 zfFgEBF0`V%@=f+x>Ym`S$j?+6UYjG~nX*@{aIUaT$)^}J`kVSvA=yDeL>i3^zv8R} zcg2E@b0kq&=ecf9r5Tz)w^WOINnZUIlyJ26qOWCO=dx{%hpVK)%d^19NB%d8koxIN z`H(ye$78j(DQqSE7|hZq31yK5V4@>qoZ)W#q$#Jj_1bwROYUYqjL6)Z)SLgA8c2*wn# z1SS?!YCBamDzVAqj=z0HuXYRbKCqKm?1@7gB@pfvOuK{kJ-#w0gKXJ`-c=@9qs{+pmKx! z3A?`KHKRNBv$~mgnc6BMR*qWFM-28N^?Wl|OsBl>dfSl~zS@U_-LSGN znv#plstHBgmG@auc}g6^QNH+pskRVjyA{?W^;IYU-S@@DW>cM)pm#;_M-n`LUZ0zs@|n=QYtrV6Bcmh zIbt2f5YjNu>W#=L$X{?qI6 zeC+#@S)2;l3YJ;ZvA#v{Hf1}K9HYnHDHq6cyiiRdcnp3qUM}pK7$dhdQrcsMlOSdq zZI_)pTB2$pr)5C7ew`S9*^Zx>435ZPo>7aw_lI=#2K}!1m7}*{DrR1(LAv%3BXioj zBQA2A0bF4KD2j;70>Q-Qf>(zPTSyC!7fxWp6tCqA#9a{DGk%(f}{3VXJ{w z_5^p0B!1!pz01^&Xp^4u+jPBp2<`^?`d+ehDR@Og*^NDU zmFU)6bq>iz1S0-tpFXbVwr?#ttSwZ_)_cCX*EYj*Gu?n(MdL)ObfKEV?|WjMhzn74 zeTC|!k=D*G1Xft;)8;U{F$6R?;uvSF0`4MRJbF3Ag`Kb&BXfkQ%G@Ju5m0&F0m4Gg zRqiPv=3@cIUrG+8f-8ZI@8TW?{|OhyAbVwk>LS<9-*6&sOWZ2Lh#li)+l8*oq0CUZMmx!gdY&O^h)N9VJ#{*Hk+SV3a*4jI7@v^ zqE-4>*zP^QTK{A&iRgJ>{fOS~JVfTF2vJ7gR(yl^e6cNgZ32af$gNS6)=vZtgt{qWhxTFG=ixon*2{gRO<{)ViMsAqJGbpLU!I`F(kNkGe);r|g3?kMWZ(>J7#&Iv z&0VL@&pWh9;(frS3-Ufans$enZ&tBy>IM|Omy zbWpgR6Vg`|mHdc0{@(NZnZfr4h=j|zBPw&PU_OrnzK$bc1ele!>TCo7@P;nG2P+p& zE3_VZ$LAsrSj#+H!E=0ct%3~L%utmRyvn8?#a^sOhswkPm_|lpB_3_U_l~V5F^IS( zbEa3n35!!$8+Rkq=YOM@&84|XhPNixP6FQj_^0n*5uj^_qi2Z*3(;Xs@lXy9%d@T( zQ-_w%;Z?DktSTa=SdxQVIRS}LExbUbmxV0c4kzGBr>YzmUcND>#xpP(R>aj)HXNqC z*6U#^Ftd|2{Y8e}k-8#z=fJ5iSewsx;#9BA;brA6xvzT2Ez_0%wA;5NQPW^NiVu>1Pg@5~FNd1}=6l%cg z+v-?vEX4>Nr2Zt1nMM;5(`wwh|I9N6#~z+2``J;DryMxs-I7++WgvN%lH zyUYa!j^apx1Loi`KAK*w0exAQhgMDa8wN9!@(qp#>6dR`EYg z%Nzu@#VhF~bZVd;y_3>XiMd%XPrd0^#nFk5CE4aDi?vIS`FR8nl!0$ORfVhL{?U(& zI#Nk;%Stlg4oah}u~n!fX)Af}?~9i6I>|3HJGsAKoJQrz)QWyZP-tOTsLmQ%L^)z-Cw2Wmy`!mp9}se+M7So|uZKYWF#)Oka!XAQMAEHId!|L}R@!{rtLvy8vD zc2qk0lt75Iw6^xQYBZ$4n+pOhzTX^IS`e~r9FeWEme(!1bRAue^FmXPh4a`~st=OO z_BT{=blYwlE~?@zkwsV(QcraWJBxZpHc7r4>hU&mlC`#te7vO#+j)$&Gx#>3!0VuF zPIs%n_4#V7JCzEd?rnE?$y3^YS+-(S0H5h~a6U**Q7Gqba*9T+wO4`O5H!{MEWc#z zjb>dwc(c9bHoJ%!lu9qdN5Y(WW9e*80d+|Bz! zxVP8gt`UI+61XyBkfMoNsm!q<$dxkrt|QRM>PeQ0elshNyEa^g-{VC>bDX53!OmLV zdX;hCby$VZ&QB<%mkxHG(MsXCImai_fTHb>Y!F?tv9-yt3OTpf^bUY<@dqND_Sg%r8F9{*jvYKL$~fZ=<&qAy?jr>8<2ZJu)a*bdkse|iBVc)0tr_HM$xOWcW7lTGr7XwMJ?&t?zT*%+N>iv4(1kp`TakNB~f^`24-a-v^6-wcV}-IQGmKb0|buaST7wlLpm>c(eB zsGtvxl}dXY3*-<_sBW#U2(yb&{~9Y%-cTh7d8tWwE1ZC5{I4&x3~q8vEEPMw;>3%! zOcY;ge)w=nV|C5ZJ%-6h8xvYQ(AYSAL3$yQJc`U(qFlq{Y_Uy1ZVRJ|zH6+d9&S-W ze(E$#X?rkmBI9F2F7>p{vaR_tnm#d>A*s@f+wBCE9pCpdclvoC09*U=eROmCxpBG{ zp1YmP6}|Jz;+<%!x(mZBRbd(YHF|!yYZbb&j==D}O729CybFv)-xuj-#qa(z0cAN( z2A;S}w2|q!pHmnbIj!D0%Q8ptzsqPirfVf0v7R{VxRkyY@iC3-(MttM(QcgxJoXbu z;|u#x7c4lHuex3g)E)sB{P+5j1|a&KgC~I1-c9VMNO+uWfOhjsRQf8kFb1y?oI=(4ba)W)kd6T6fGhdMP&#+>>anPc zq6+U0IMw}d4A?ZLdhl8UL$oCI)tTA0+ntRs(#t*BGgSKdP)Bq_8*;Y!}g+;f91KgCXRE-oRFlC z?7~VLq^ougi&(-Io5SKQqW)6pKmNl}S6RLCvH7U140HW!-$YMLBE6cEp7>UHHVM_5 zi%?y=a|>H$7ZO~tN;fHg1pT7mv!Wc&52D;@?_*SPTQAKvd)E)wzMb-OuhCe$&d=Q_ z+v|b7fMB@mE^@uGBU6`|CV?H2JI~unbQMoOL|8DXRUHR8990)#(HTd|f_=U^+Ms~< zFCzNM6BU#}3)w@vGshD}d0zN-$*lytH%-gW21#tBY;uyviPZvHy*aNyRpjrT0r3Vv zbRZ*S(Y~Hl_JU!es5GaQ4F;dirM7ms`aT+zmXqsvP7;HoAxgYoT8)B+oyZmxg&}i0 zHu|+RW|cjC4C4eFg(6v6u)^2PBL;*7yUL1AXWkOj+xx;T&Ocx{cFbfs(T3e<@kEc* z9&UdQX7GG|MZPvtq-^^%KG_})_`05U<1<<}I%37HsI#i)>ai11)=d}1Q%vS^UPX*e`cLU5*g?yD;jK=@jH||aoFjN5~lhD z!g$rlHx-x1c|>+c8$luTUI*h)*lGHZoc~#FIrCUxu<4ly3@RM|;THt)?%|3Ivlf=o zzYew^S%}d@iQqYt&0S<+7_z66D|oW^)_?ja(uM{%Bqk{yY{&F_s8nvPW(i_aS~_UK zSPHpx*j;gwkoi!;wwzUV$|g+lA|FLONo{Aj5Wn3L3L6~hZxOE^?kuFiTx!9K$RcKy z$yM|nTvw*{yFH^Mb*3VH{~h(U3a|7BN8@N9T4 zw>D(A+J5?fcz6fKI=ilGG;D0Av2ELScG%c%Y}+<>Y&TY8TMe2vws!23KJR_Le{f-~ zImes>KKUKie|jPaDH){b3_9aYbSI}3`n2C8Z`=08Sr8gl)l_aadA6CE)12j!G-Ae+ zC+PlIPOlf^b9r$h7A&Sb$C`Y>ek+*_hTWNA;>2ji65EF?8IV@mnn2fhNH|_mPY*17 zm)!^Z&-{rlQm3oAA*Ib=V#~M;xDO+k{FM@_I1q_KYRl6dOI|PL(+j(*Z;`v`dp&XF zw0M9d%II8m#&!))76v?gZA8ebGoq@hq){e|JsP46W)T=0-FIE|t@4;1>%Fl|*nHeU zfO)sJR{C1F;lEsW`SxI|wJ8~P(AiQ(B(vs>qQw?V}8VMF8N4KF&$Oaq|BworeVjnmc@szI1 zo~se&OayG4+;5c(scWIObivwMBbqI^|l-PQMX=I~+Cp^c;&) z#*9Cn^E^jM6q8;KEAnpA5>C-uOVFi|m>G*3Fjsw_aY51arVgV)So7lPVoZUWCHC~M zm9Q2)kw!+Hl%Af}@?H{eq^L^O9H_~yofitr@!6raj}VU3%q9S1g+Tb98Sb@U=x zt>JvJ%!nDm10N#awQUVhe-7oKw6k$of7YW?ks}t`vxnl`kFSzjI>PZ0H0_u_cjlC1 zxF?Q7nO*q4jqUp}lCHn1*U?>ENE1MPsZ|Jd5Xj+l1S zTV2a6RSRQ@B+Mkp$(VVB$@NOn&tCVHYGxPV*y&R9$uf!}-TZV&A`(?Z@gJSjgfO*c zBD@C_Fe&j67-n~iRz*8rK&u;`)GTma*kACnYi#m~o9t>zI%&FbtHq&T-?%a0qujH{ z_~YUsDVaaE0!-6Y!pz&Jrg$sb=dSb%2@m9PP>;?`1y@%7B}1&G zA*|#Nt2YMVpHMKSlE=pqr)|zXc%09Z#?emsY&;QX5H9iST3Khp^e^BNU35%dCz4(? zQ-AZabAKiMkT+!PzOqb9C%=Z9N>rVL z*36!(s2n`Z+O()M-o}m-{J`&MuhR#s>?a>M{Lr@a{TuQkHO1`!d+1C7qWLWdr2xr4Qx&Fp%QdrmG^I z90p!f9wrj_Vz6ISqg|eGDrf*0KfQW>%vJv`nEWMxQu+6X|Jf1Qz6F|O(NGgc znZtx-_ED(2qRFxXbSQGt?iTDJim}>Xzuv)l$vgt`-FaR7xNfed+jXCadZfGLbnwY7 zgi+jdUC&Eo27ns!!7jNY#R&oelAShdn(!$LQF++919y-snBPt~3GEiz^z0>?bl5G!P+r!Jo!sCYr+6Hx-e1vjI= z2~pBv2Hl>%H+vbNYe8A#o1EXQ1kOR67@oT8iP^c$lWYntCK>tZ*E{^QHDq3nu|*yU z9UR_`G_gQt{hP-^@iZf+-A3cGH}6|>iA_vdg<<1qNvz7DD6#)rMLaU{*S%Gqc6`pN zg%&ugqpYP0w1KeEv~tON_-HaKGGZO)H@*&O?q+6=eDQf)#WoYqkr=G@x49y2&jn=k z2E@~GI}nTS2WyQtS^Iko7%ipDF(A8(dC0+|O3hSE$-l-7&+DW*Ik_>m5!YCYkT@<# zhu6|E!e6EPe9st}kClll58vWr4L6$J`2GEF^7=Fo5Y~^Dm;~#FPuo4~_bL{fl9K@^U%t?TyMq(;FRqjx$m`9XnTS{A3FOD+;7Mr%1*K#;K2DkDiH4 zL$-WkGu@YVPaC*HQI3?6@=Rdo6G_uim}3%FzGGpgZ2Qq<42ts)?l?G*ZryH}r+x!S zkG6g&*Z-}Od~^%66SvDfy|;rL@u%Bwl-%EZvG=7!zs0@YGiD?tEknp16Iv)2DRn_y zI90gxIewuZ&e#t2xn-(Q?nKi}NATLU-i(+|2{SIu`ffLrqmVfz-_(~!3@i+&ROo19 z3XsU|)m$T}-ZXl?gUH}fACFce!8~Wz{y+bt?*&B4o-^+T;%7)pI=?8^<5oQII&HzF z$Tgq54Ru!+JcufFH`O{@f3#L_%`+XDb@?>In>;OE3Y{0fUo#2aoL-LrGe@-GYdaOa zJvgtb^3AdN12tzdeR!(Y9{7v6w|=7xUEUZxt=oOr`|J4bcb~Oq#td1%Ir}b?(PDpl z`&pKGmnFty^9(K)TCnzm``6KZzI zJsY3e9uOh7Ui&cyJGV;&aHA#QkUXGvqfxn|e(BVrKryApuSRd0E0yUxpbqyVR#0zE zNG*kV|4#qyO_P^^``0(#B}0O=D*w_)MJ)DA@AvNAQ22Rn-o!IzwOtG8PJK1uJz++E z%Y8w}8J9#c5s({bl1#Qr}728M?8C4nNc|Ug42`@)vevQ<)-{YoB=%$|i{6pGvX0 z)LQY)bZ3U*8!7By_!UGttCA-@6z4 z(;9AcOz5NoSjE%lW$DtaxEEeP_d|FkW+94Z=+!MtGTi^o8Q3CDm{Zye_i|w4=>}`+ zhP3ZXCow_Kn8E7okeXPtvHPLf9VThTl#`+Q(Cyg zA?JTUUT+hdcEs<5h%DCbM(T&-?6#x;Xs_mxZk!M7D91V%;JD^gMHYMlSGVxZyjH=} z(CIW^TSmCy#@R~i8rlm-%$M`t8|yi zBgGE8^x{tO-jCvIwj56~+0nTQ>}tGu4H!w^`2-YYGO10Z7x0Lz)HYr0Qefy$jIa&gnTcF2}PeAp@P;e!8sScAyNJZ_wY%AJmFQb=6@ql1x<~Pgg3x7K@fO2`!1Y z-nqwV520N6xe9^X&$mhp^v&I!|G|9&=i~gi^$hgQgOSU3^H-A#srTl(MW1yJp{$m& zeJcLf5X6(&0^~zw#`kY_?ZbVCO5x3;FYMCK?9wQ23{x{JGNa^-BOifh%~dW%bwjpk+7$v%A*3Ho(#;$aD7P;WI;1?KoPfL5!U{~r_4 z1p0G3rXc*t92j(%U`ozS1Qw{Q7M`K_{QD~4Q8buQZPl+LMZ5p={k{vDuM zU7vu{lb%#jg0<5laTR4H{akRvsVmx%fXbYy6nH%9om>yWh=kcmAl9tOmc`&nM68IY z&D=>8#;HE$gXDCA*sX?)6V2C?rvK6t62VNOFmC0L_2~9to93ERB+A*sf=xCW+2FU( zKNIs-*x4126QwI7x(PxHsvIP|i{$XUMZ0PEB=2fcmDAZ4`1VVmLWyKFD6zcgj6`1T3vPc%v~C=`21 zfuOlZ;IBn$;stKph)1~Nep9Na-xF)3e@uFleecxe2RDI>hnS;uhUKkHYaaCG!6gZp zRzV4?%w_7V!s;~mn*VLe5x`xim0#=VSKz0i6~~(QCp_nQ!CycfoM~-DI)E`z(6cA@sOHJUmbPgK3R(}XL25Q#8BnXS;&zUUO)5yCO zIxFdD_Fx6wzy0mX2C+g~o7gy;O#`DxguYbQ@12*Fc{$`DjOvr)SA`RN$GDT-^Pj4)2sHx86OR#-mn&E&jyfAI*_BBzH};G7NX`Hrg&HE-r=$dQiv$LTTImZ! zHEyN|Qj~5%PtYB7U1w3H#0@smd;a#6GQZ9h5#fswOK_$H>Ui!lhy%d>R2B>!TgpG7 zugkSm3;YhE5tDhVfPx%e3Bs5<;pim#Pp(N4Sb?BWN2}WULyztNLc>u&AZjB6Kwi0E z+bMxxJz3Qf8t+nSIlw==O$z%GyvjR^NUq4 zt)og*LkDQEr})c3*b-J_T%=F^@p#DwDzakL)}Fq=VVBa=?rY@KRW?$1?0RSAzUbGO zRk@O#>|2^D!qI&lv8#Rvs86OSgh7NU6J5Nu))Xmcy{V_BK+U=Y8Wl^UwMe$VYFAM6 zlC<_TE!bO?{>yx}J5|fyk|dF>j2coa%|0)i4lG*lZ@>)bmW(QKMTR3ubI~3ISN^T2 z_penDblK)`RR-8k0EfT3^;DJxTrHjLl$ZP-8%dYcPPE5?NR0iU#f0^s&lFy+J zEJ3{fmOc}>2EXFzoU*#saE1u5+#4&|efQshDb?ig<~vVW64Dj4`*{a606eS=rUV7M zw1|c3<7pgG7d+W6!z3l&@;iC$$%vHMv^KMGktq5`3l4?(-pV(cmH|b5%}-^-zmT#d zsJXx_r!@K8##F{lsmkB!2-~PbYEeZUQum05&Tj?p=a9TjWA3IW?ihCg2G#5Q^}F%1 z&$+TmEl%ePq^aITWeWI9A6!ar~+syv15fD0cZjv)0sw108BSC z1yeB>DBZ;$Qp$4dBN~^_H6Tt85#@vz;_03V|M4hVICcD%9N4sOg>FDimBtWI>3AQ- zhA3E0(ITkNN|!w?y>0tC-z1psFg3U`T3l6=2Zwr+W|YI~4#NlVl5hADZNz4cshm6X zDHhpTZG+4E_$3DBH&X`5^p;{eK3IC1}R3iXyrIVsr;+;WXyqXY*h_vdC;ujh9az5Nh5a&G0go{cB-Cf^I!D@u`0^rD>mbJxxUN?0h11SB9RtfobS-3c(*QSMJy|w zg-aY#Lo$kXAZwrADXC#F;8LuCrNl~y=DIS9*I|@bs)}lYfyOvh(R4wq+3%>DBgQoF zY4agtHJv$rGzn_=bZ1eafm^dMv7&k@AIviOJz%bRXFN|e$Y8|q&nUNOno8IOU4GJ5 zi4W}z4F~G~(`@U%)f-5Cfn(A(`KFjDK4cThG>rX8zHwXaCfF=g#&v-Ai@tEh6zR1< zDhe9wcGkpB$R|QuOe_tqR#K=K@O_Wsr?;b8z$kY%uUhMF=kE}Sm-5N{Q}?!bQXE?$XVsvnbx*ABpe0Q;Kw_itq>V9+2{>~nEKQK59*NGn1$>wX&!Y+p?Ueh~>gR%Uc)|JiV99>jc zmQis3>?{|r|0$vOGw|+z86u>C_ixo1#|IS`(pP$$8ZkOHItw;n1i0O>w@r{{t#V2ZDw6Fy^?cqj%W5a^aI%m?EO%5;USg;p)JcHNsU0fs&bs4-8|zNv zPEBl*)-Dc@>mi2B$w)pXn4=RNTb+GJGDFmxCM}{?ty$xphRqhdiisT&W*yd0)pz%C z?zKaH#I+ncB4j$zER2pRLvKyLd=^;?iZ<=kiJHf=y|Y-DIJGnsl9_pyOIJz#^jzpl zh*AKZGSl78W(!H6$iMygCkowVUKDkpVGc!{yTia@0`QJQM0p3xfF+s#bONt2IeiYQ zq3&d&!aDG6)D)ljQTt=&c%!RRj-Y-E|=Rf*BB*QTS)0+^MOzFp(ocJ`%C zz|AzT&}&G3(*C|*f4tLOG|&Z>X(TymEZ9sGBGj0FR*7P=Ks}r7;ay&mNb%#PM3hJi zT3)=wQ4v*4=xBY8C6n36ly{L~^rKeJ39cwzj7^RTTPS0(xoz>%JljY>7>s+9s=b*% zqW(lcoy`PS*DALWbfy6CnTp;T+UsFIinjHLRQ0Z+t%K~GV)aktL#lZ~b{h5Umt!wh z#$)t7p2U`mirgCcH>-goP|x^7aFyU%6#3%bx?rj7QE73VsToXOSAqFkq+&8%w*q=v)*8)Q~{bu$HbnDxPS0vG+)J5iK|)UIJZ*& zCedA$%HfNed6hGG9ap5rTEQNotdJ6OtUgAEn|@=E%D|3DHg$v@OT5$n9g@ZP?>4`%`W$8#y*{jK>U%F-q)@=n95`7(fYj4@1)et*E3v<&c4W< z8v0yVS+1XLqhMy3pgnpND4Tjae#5>X5O+KoEzL{$d=dSS>vGXFa;2kQ^7AM*pL~9( zf+=TT+mFJ7r9Kt#s=d(BG`g{Yc;sB7%NH6A-cYno<$o02r9vAxV*lU5=JU4P{!zuw z(7kCbmqb#;8wiJB1=pXu7JF_}K1h1<*g}7_j4eXVN+IB3GM?vCJ|-mFnG{ zPfV^f)zlzh`NYN4J63oW=k#Wc6F?QR)DX>t%bv#DWM0+3Z;#aw`2MwK{IetrO9sf^;QT-Il*NPI^U0g@nat_hFzP0mukn)Mxu_0(6sd@AlLZzL$kQN(7X0>`Nt>27@SNNG(Q78XO z`!J7vP9&_!by|wN#_A9Wj{&$|7TPhBfG`OTbi8*})t9)Bl4pUZvcxsuLWZ22o6ez@ zwGanxRL-S#*qD_?S2XKLN%L8tPk|ZuIQ~0c%SQf+#1llkt12y^2VLaE#h6i&4UpqF zv@w-Fss>itzBD;m0DP7$Gp}aC8rm=lu*K8at4zoKe?9cv?|E{>i9*ll(MVcd11gat z;fnZjr^Z|;t&df+YRtL6@=l@KgoTu;%^AT%m##Goya>lBJsR4!Z~ncj?2lY-vN;S80%pXH7Jqb_n2X~@ODD@T#9I_UXHZagS-KEK?MXsHsHFpRm}}b> zAJ{Qs4un`V-L+3e!AQPI+hfXh=6{pbr=_JaBm3t-@m#fussvrMvICIX1N{DcOwwQH z0>)=qudC8KIF@7AO=7wB;NxzM_gjr6;m4gb1%L!HXqoKCPwj2iL6kwjHf=WxOIRHjIqS5sCN49*W=7S) zHSb1Lc?gC_MSkk1q97sp`UJ2F?T3`^r!y0I(gEt7XQnq819_#-{=pKiAbqm|=@?S1 zuYNO+6(7o(#GAh4Q1lzer-7mk3`GSPJ|{{k=Ve^CcQj$e97m+Vr3DYt_$-eS zFaN0l@G8BhC|CUeRC%Gu31k1KA(R0(dp?)sLl;~VRsl=dxiI)wOIks8Wt=*fOCC@I_K zBVfdj*^;tI=8bi5;&U8nIYrw{^O!a#S(>kvEs}dw|MUx$gTS^eSJt0Na#g4M#@!N)(H zo%e~`jF0}2WSKntNi&MslNPy#)|D)Qc#H<}*`0Mk+`$YqtFgUTZ+Wc@b$pgg3lZVv zq^P3_H)dBE{>sT195hxmozhH!Np|^JryhwjGRebSgG%$biKjp*H&}z z$!edeJ{DEIs3n7l9+=leg2rHqFx`JQ+z8xz-Az&zvnpq|&Ox~BMEb6FBmSw!5Y~nLiu3@iW)sw&#*yY2bdiF}|*sj8) z&ZoipPb2OBlC5+Y-Fc%qK`~Gr1E`eQ zvA?eI)}ky2Bm>Q+M!edbw!W_)bSmzPXV+5iK3PaSVHW+WtqL`|l+_#9U+%D*&PF8t zJ>;b76sdUWtSJCTH5&keW9WM>RHh@&wdu+khu+I`CqvkaO^XPuq(-|1lStFW^gVbk z%4VvsZrahFnb0!m7OhrGi!Mw}N?TRRqc)W#-M$O&*dFkr{+*#XJdcjIE8H{NEE<>C z_jm;!de=OthZdtOvd8{09|v`35IyTs*;;8`30G(}L|^?z_MObXc4@*w>@GM{Fzr)0 zTm6qo|I@u&Rj$wN|6p2*X%FY8`fJ#PK4-pTXmPqh_6|b=Zr^6#NH}%6XxajM4}CaY zL7j@nFUGg5GCB8~@YMrO?`_-H2qBCaLSphyN!GjKs{hSFmvGaDSDc&_@>f<;r;#IV z#!2Ht_VNfl)5>gZ%-bDR(3@qB3O=)`+8Aq@jT0$2&u%yWx~dx2!a$*DXU(sT?9Qnr z3cl;q+hE#Sv1wO9i#|z+;@qJ7L_x!OqB15fIo&)6FmLcGCqO}Y9VvHVk{rSFvR`JfwR{K95d zhzj?<%OUBRZkis?mA{L(@%J5LLqgd14yRszJTN@B7WfPt9?r zhPgbI8_o%rThD>iT8Lt;`brM02S4p}`ottrUC(icG|oD8X=nG*&&4#4CguDl@fG5W zF3qTRLx}E@ly7EY6I3mK_(L{%DEx6}g@`YHv@u8l139ZU17@vx#d)jur*RWgrIWjV zL<2%|Vn=^pnApiI4^4_IRT3Ah-Y04*jhgNrN0~WQFQYuTL3?Z)Zn?d)f5%4@=6r3X zZ`=B)wAB)BNG|YZ+BGk`aBAV+S_4U$jcsTK(fWh@qJT|~4Te~@6vpX%8mjLb2VjANtJ%5O;oV!S1cOq z$=iozD0xp;1s(o9M2w62*GT+C_uoGsVxhE>mv9W1T_^_Ap~_(ci^Lvrq;N4N$jDs7 zicYWdBi{S>Z7Il#mo+ekO;0FxCTGMEn>)XpMgiu>y7NFFMYHzFmvt&)oB9620!y6_ zuQdEO)u#3XWOVh?mL2^Ihw2`D(XFr!=!~$DSfnTl(@=_awK9O{G?8RNNsNQC>*5Zj zO8KqVZ{}0kW=~PB8UM4{)jrU6Dc+`U{is97EXsAlp4o_4r$9&jtcqan>;0|r)Mc{& zx8}V@Zz*}a%E0J5_X$JQuTjoa#^C>9MqrSL!_e`pHh^mOxAyXQ){(cW^J8~%EB%D4 z!%ogZgl19#f?aq?FaeGgcCul|5Q>xTCf0iTPWbQV=>mb9cP-5WQ2o69pRPClfVIhs z29g5RnasSpRRa#_Y|BJ@4kZCER&e8%6~%qu1$IC&!ixluNP$yTdDvOi%hQPr>~dJ! zR;iW>_{(bNoHXORGH%e6?@v)_3Qp@2`D%*1NoFLiSkTr{+j+_JqQ6l$Se7#DG?Q^E z20}aNR);(hGjd=4TZ=$x7m6v!uJiAzq7}s5>!^7D$r!8a+u0h*+x1A&tb+Ms1F8rD zUMe;tYhTSfgeJ>}7468=y>Bka@TFlo;iok=5|~f$w8&iz<|je;ujqbedus{ZQ7Qox z=1bVPR;=ND(S*6^hw+g`-ODE{)X=Ya==kL*6<>AJJ(@5^e;DyL&v1zsRe$`#OrCXk@Lm^&^ocj5r2L+C@4?|dm}XvM*K(ajSz9oxJ+*Z{NJ}8Uk-XM zbMQj`{PKKwc$)s@->hvEV$ZU5^()Ywv;q8U0yx~#ZyVWK&3fHVN)0y;d+y!eQ;`@> zGf`tc)m7Cenp(NUOK$A!Y;0`bw=e=;4~O8yUV~pD`|=z&Zq0_Wg!ut0wm!jFEsjMI>LB=uL$Mr$PYF>Hvf1_?0_=@gm=m4=nF zM;@r*oV>0IT~AF3f3$)2*ah)13R{jBk}_Tq>t=5LZZ!%b(Dc7^3Eo74(LN_Xl3(cH z7O3PGlwC{WL92-cI)|YG&r~{o`X99^F6`hQ+1B8ye6!RaI7$7I?*3h7m!QhY*6=H) zu)Z=28DWl6J#%evBOBd1R9(nuPerp6I7yIEstfhS6EwSrbAJL%p;cV>)hNtNfRi@Q zz_;}a@;B&lu-I~^_ByI;BdioM;yW-2O=>D6>sgOYj~J@&{GhM-4EH|3!#FjXLQT9r z)J!L`(9_}SJpVMb>deQ}W%Teu?uckjV!7_cHi&_-*h!T5Y9reQ&){DY4z8|0U}$Qi zs!NwDk|4Jcu#zrO-1gjz>oZdCCu@~F`p9v>5(w2NknpMq_g!9;-zNjOo7DxsGejXV zf3yuhK1C{bZG207-TibJfr)%U+v6AW5S@wS!u2`+6v|g;PfqLsNJYHFU{%~JFoDS6 zV(Bdx?UA%>e7F=y>12Ds_in?ja~UN*Mvv==2Kj?5-gN}AusYmo}+WSzgi~wF| z^C^EGXM2d{$ZxMWg*iO0Pu2W%oKsP_wtW8Dq4n)y6P4QvpGTvU5bxU9if}{IMy#u84A38sj%_bSE8Wi(KQ**!Yw;|3rL(*R{4r%cA801M* z+7%?dqVcRhOz`!2?iX&g_D_!ux-n#X4JJm=qFj=83M%(5n4kQ*^8^&}bk)Zu`2jtM zgT0vUIL`z{BS~LKz=}a676=OcyhA`3ZUEHS+q*vTNq8C!#8L$i>XXb)_$GMQpV!Kd z`RQk25Di8bOuwFRBXhv-xXx4_*%<2(Y@5C4@B>#ah55qlJ$%)2sp52aB8(IDcI~YX zY_)#I9f%vkOW>@f5KO7{XM<)yyr4cpGpI&|DWdgw8smpbeRfZkj#&ke+PYjG6dh{inZj^IQ~DO~F1Slelnt$OeseOxGcv+k6ZZ_nmf zM^0iSS$-aOT>oG?k;mtJ82U4N_WTNQDBv!7T0=;_8X%G+v2d|Yn>Sg~3-%scyodqy zr5-CGeqM?NMe|h!gGw%`UL2Do2o;DpPb!kLb-!U}Xs&{=&=sz8!BfY=`vd;RxDo3X zVJ!h}2@FT{7n1Aj#w4-s2@koFKQ$ldlv{4GEhJ_Z#2uzOuqrT+hx**0frp9}5?fD` zHzp|DK9_5-Qfm(QC#(_xQ0L&k>WExqi`-!S_JCZ$C&QdFj#F zB`)R~a(-fBS3|pd6sjVvyPb@HcqU%uFwCgsZ&cdxNX=gbO=HTkhKhj+VZvP$X~D%p zT;ns;^fFR%BiWplP$*z_njvIX-yUWAi8fU(59XT_HiaIJ2yJ-h)_tGGVuTT)VuF*z z%==)Ur^7Gt(L@RHzoypG7-RKlW{^8Z3g`++rs;ka&nFOpRmn$%NF}6$KC8Ou-2nSuz?F16ba<(fu1tB7X;QfhzA}J z=@3DbR52NEjL8d?oV276+<-Lm6P!MSR6L^ONW*uDs>yzr2vf3TQXxxRv^hkPb89q2 zK1fUCAr$!N70w-5HD#>E!!7=_;K4q~B!#z_8-I5jK(ee=o973@Mv2vasWJ=nFj5>) zCyZ<^uaZb5OiISx`thS=?|y?}nbf3iomI&6e@Y^2Ym4LGXcuGGYXH2dN5%x+s)P|KsQl(XRLvR)C7swaxMAV3|v!*xzW$ z%hZDqW|aR5t0O#W?9VfyeSWyi+lv(kGR%lGXt1XEJbx>TS!Z-0aelmTd)PlF?wUIl0svM3cc5Pc8JqnjdNlJ|&7 zeqU(>6Fh=h8+j!1Hx~L_RWZ|kr84{L%u;ozE3)XP+iE4)2HesrP8 zS=+fG0z!6Sua2hD&O{i#F1;HLP)omK??GuBP9X7c_PvLHVI6a<(| zk6byJjHv%`)Gg?T8cQg?>M}O8z=y@uW+7e%l0BZEytk5+#eFd<1pksjArN^{|A|GE zVZkSmvB01E|3rIyliQ`H>M+jc#-Y5}Ro9Ov4(p2FWQBw!kCp)=N1_?8r^m_>UeZF# z!G2(K^mNd{BJpTJvW)M(EsvRRR;58KNS5?LOvyaKgfD7jIR@u+uO_ucR{sU}p$FCo zixY+mtWXttB8oYy{Laz~$*&$e!WR_X--|IT{+C`JX^58I{R0?$WE%Xi+?A6b(t27{ zOo-1Dnot;owG2O2V=pq)kDny#m!e7(qA~`g-qy+?MdZ0VhgSO8Z8Qf#LZtC>sH_xV zix!oS6S;!75pMXZj^+~+@Dj&ch}SdZz&~@(NTV;e6ot$>f=f^tr76arvrY{~qxJ6t z#Dk%Y1n#HPW$43_T{p(vYd3{l;|D~6!j>j`q(=me3pQIOj7ZW-4S+_~0GN5l@7+go zsK66G@m+G}r*V^A$z>^%P-VtuHz{7pI6+TeK5|};d$AWghHwFDVZlx2v^7O$GQK!! zhxIROJaYH~mh)>tvz}g~GZ^elpb;rXac*oVoc5kMl;P1=aT2ZjMzSQXK^{~TSWFi0Fj?G;xG{yUml;8A^P6zOnW^#>M2Ds?EBc|-|> zghKMRk1_j+fn(o(^9?<>2%{ogc+><0+#?>S!bCj2>sM;1T~fuA-(2UQKOaHGDx7=} z5iU{hyI(DP+u|28`;ZenI@cYl+i-lG5SR*m-LfT`l_;d%01H1j9qJekoI6P-*eHLz zIw5@+wXX#lBt-A4w?FS(IfT z(xILz94IJ)Hp=pY>`NsC1{F+jBPvM3X2swB$_^NQs{yNwo6{8YD+=F$DKu_W|1I=% zyMQjp43!DSDFnHqa_ZA`8D2V!l)y9`RK$&J0Og9G67b4Dn2+=AhMtSY*Y=|86NLV2 zpekrU;zz|U7K-E>zXe|5J%wL?Z+{?k>3`WEgeXTkBZKtgs;J+G`LX0XNFv16j{r-P z<#QX4MJ9q3z4F;O9r8Q`wOre+REUGhqc7JXFJ>@CWRO$!8mk=d)}6n@qGJF!^Mw zSB)$%VqizY8%gRz;3BT7phZ08ULsP5sMnY4YE=M5#_ilUGd$^aE@4EIo_?~TS(v`x z+nb;&92Vx{iSaj|*IglL7J&)4e(v1CCa&|U7bi6=a=Bs*H;LUnFKoTD{p76xq^c-oq9k;U60F)JtvhZ?8E6j#o) z=l`P_%ilu_8g@29nv+J-1HH9q%mdMo_ipKh&)sh-XDu?vG! ziR-uLM$&&zACUrp*;5sISqbkG3VOul$GnAfeI+1+BK@{fXxja)6rsC#svPU5UHki~ zpYo%*i1Nk_p%j(p5AI`%-HixcagU?fsy_X0?a0$tl`Z?B_rJ$tE`x*OHOViwK$QIw zVb5wAK_{ddy3!+hLMKhOhp9&luXZ_4nfTlO@Wr)t>0XzUsC*wXDiMQWigQy%&0BXe zxhR<^=Kg$v_1hiRuKfBC)={3@Q5=OIBm@}$R|R0C12I<%2<7@CkY zJW4EJ7$Y9A^BMaMm->%}x*rw_N(i#V6m3tOY3QJ>vOoiFqd(KN5DnklOA$8T$^usn z9{gHC*Ho;2EWL&aF9=}{1-?1Q=*9_$1mjNb+q|L`fvAKsg4*p`KQW!|NfP$+U9A?z5*a_B)NrH{6W+6>>(^o4!Yn_mP|LYEBao(+% zi&$XO|E@X)@Q-77B;uScZs!g~4QUvR>Rr%+H@49}?Ms1!k#He>NPtnFYN5CsuF#&# zjUT!JqZm2A{H7^#wNxOVRi4lJmD}a~u!uUi@Xm6)<;w2MoCPFI+8;n=`HoNS-&9u= zo?#2j^~2EI;1|L%+6sPVScHL~tqP~kxo!TtP3^&+q#1$U8bP?x;$Nh;NkmHT9P~Jo=h5srYwiM@Lzjxk>0^YaXN+O`P8v=;`8=VTNMEdqA zuolXf(&1)Dsv@3@p~50MM(B7t&sa#2VjOl)p^H>Qr^M6#%ldli zc!+L^1PIOblLe=di?FJe^%Jffvorw8-M(hrz@#(IyC}0jR~!U|cPGgWuP4w?!BsSR zqs2@W9wzF(0@(Cc^a&A)<~7vqtpbO@%s+wNS|ORppO2h67_-k}NOi_ZQwI}|FWeh` z76$JLGnCfOW_EUP{*?jlkAUkG{qv!bC3-v`@!n0Nun43zhABwC?(WZ{JwPWif#H(;Ez6N)$|`vfgJhV7nKzYE(xe5MNBxmWagaMJF(5lS92*XN zg5dLbiz^2DL*8Xzhkr==(y;lC#Tp+%(?$V^L96cV;lD)1&y8HOud86M6++3(3=&WK zs)Stn=WJtv2RlQ4kpE-Z=&m7Ra9Z#*aN0B z!5Ob~XQMbkv^a7Ynwv9DMlKToacovz=>C`{R0W3XX~uQL@9BK%=_u`;-ChRw$ApZY zgMT#OvN>h(10*~#9#V;~h0O{6?D!jY57Vu-nEjXFFaomTeVlRlbcdWN0vQBUpLg75 z<(M1^yVPF6qyAxe=F_F$=Qb$(-$)k-w#*_G2Agj*7AzzxL0FpTg>W-`Wkx_EeL>7{ zPyOtOj;5H98h=8wAs;q5FznfYfalnStTZd!y3W)PxN>zB<3CUyeILo_q%E6=Q!3QA z)f9Azr1E{Z`l3wOh|e?&qEc>nmGB z7ps4Ax2*88Lvps%Y<1Qc?sLhNV#Sfbg^p5*1DK7>jxOJ28}E}s+KHn%y5K`7xyTWJ zw8LZx5y06J1K&Urm-tAcaPQ$lmQ%2DQke?3eIf z#qD5k){LSGVzW-8uD8@tm~vg=t*2oVo${)=w1d4nNn@(z8xE_Bn1B_ z$#6cH4IDMT<|bAk-j_Lk=Y*dz|8w+o_2<}(+@2Tp!|*&r6W z7a8m{)ogNCsya%Rv{Fi!@hS~9%9QVEK#krf9IJqxi}6Qqy?Vp&BPXRf1yH9 zSP_(MuiY3ZLV;4+0FSxbVG!fN0pCr-kv}8(lEgo zM_v+U_?V@#-yBX@p7-+neah!QeNfiq`)oe|sG~4W@RR9$xBri*uV9Gk`?_X^p=;=d z8M?bAhVJfeq(mA7q`N`7yF{d=rAv@TK#*2aQUnR#fuH~9{Qz+1+_TTxYwf-ExtG#1 zHf_)DzN{QBlrg`@8&M2+-55D&g8^UKQ{A?n8-{GBL;u~k+V9v!wV66%IVr;Yhr&Qj z&G0?Wu*GG(1x`cV@u!XS#OV#T205+n4a9-~TBIC zHvUY@1@1!32h#_|@~rmXHRuPJ6g0~rNXu*>J`(~|uuDkX`c)glcIr>2zosm!MN@CFy{OqS2ynWZiW}{9YBze5dEr@v}uIGUUU0$K?JS zPEDN;euV#>S1c_ecW-{&eEXm~DlVS*?|&Q~j%9x}NfLTD-VRxA99vbeiJShf$^^Vz zG}rF~LL@>?5-_R0Y)c$fMVL1MZ5#=LVt1fi_E{tjMQZhooPnOD9`KniE1#tw{fE{FHz&&OGGY;GT;)*^6a(yFBd31i*HljM#%x^W$|esQ+XeEcbpDr@Ha~uEG4O} z1Gm-ATj_qW_n)Zz+chA-{p*56AIx{3GU;3G>ptsx3l$~x*F|}WU-+@Kg1vr+)6JF( zrUgW2UfXmsA#O_tOnWyVIozz!!fMnA#o(#*a$3%wSMHt1kjsc{Z}#m*Nn;LT+m{S% zu#m}zEz{&ctz1*IZzxLJp1uWDz50~j$$1>{JjM1dPWxbLCEZJvat@?o?O#+&copBy znhK|K+P^)19?&;UNn7%>AlhLHe(F}<=EB(l1;7Zhy|31YC02J&Euh$c+U|*-u4Czq zAa2)UX607ppkb*p6WxyTk{4bQ4}&Xu7;170oqg4gPl=d?1=DTAT(%;KmsngpIn&o$ zWOe=OY1c{B<`}uyQH%Cy>XpM@euFLkuel}DvHS|bBGcrbDS93T{4OVU`m||abao`a z6e7NxJMnNuQ_|$8_>4ykweh*Pv?E;g%4?#lidtjB>ytV7>}M(T5AQqy=OKt^*!-(S z?lW7e>DzBlfoZE7!@ldf+VSjuayI(=jmnXp1yy>yLGIr}Bv|yt;ILAL3f9QDhRVJ) zL7-mdJD>Re!ie)GghY>z1@?RJt}PJdd(SPr`9b>B5JH_c#s#2jXY98rG2`LyJQFBQ zF-=0Yrg!g(dbJ{n=lUzvP&lPeif;5nJlmVkO`l)Y4E}&kN(6o(qk~cI6*m+gO6bJD zgqB(kjdaC@5zi{r>)?he>-y^a`p7&2#?HSI)i!KFPa{wEm{w#e`Evb|zpcu%twVEv ze!=tvlPb}6!oXB2!S$Wa<*v~*;WcZH$jUs6N&m;}$clM2Gj08tg6BQ=D6bXa31Q8| zB9D*8ihx9}>`esL=d_%UCDDSi<{C8C26y!CSZlOc^X?rorPY z$q>+TU9FCoqySG2*%X=dJ%?b*h5t#;dM6Q@Mnp); z=Ap}r{8vcXq@OV#`W2IdT;g+=P8Ri$=xmD#QPxJCo+ZM+?H=ZjS0P5a{o$Ti^{W$x zm!-AFJcF~vemouplZNFNJ?S}2FrOGw*ZR_U$81Y4TE{4)daj}{`(cs#k`=yF5a9f2 zU=1>JG)4U^rEMIUoYt6#u*QPw3VF6P*;PkewuQ$Q@3FaJc-B*e4Hm3qvrzBajB zvd+wjWB#qwhZriLaz z;V=BAt$TlJ2=wFpNg?_U>nYeUdF#iW`8Bzb-U{(kDu(b333laPc`;kp7sEqP6{0Do z%ilgYM=^bUB^ZGeG00qf-#4`ohfofXcHe1`>L!_=yKcssPVbGF)<@)?lPlG)&K3{v z5m=1@B1P|@4u2C{CFvBrf)R3fPNoC~0OW;JAT@V6tiLSD+gH;f8aJu%*7YjUro=^V zH>j@!ACJ}rLiVXy%KN3)`_Xhx0pSucLdJ}#9<)kBQJOpZa-6AsXR)y#Wtyq3-?M|5 zlpndL1Du7$Kqzt8oFy?)(@x-ZdoQ#!@xFqCk9Z|g9g~I$z>;Fk{mo}nqtEX-xF##m zL%;d!Z!y<$W14txZ`cZcooc&HAu?`;3UF0$3hboo7rAu$_#gq4$IB*-$5H&l3;4bRHThHtDn1 zW+Gy^CQtvPm#Uyqh`pjN#&tVgc=d=M2Ea5c;co+D_tlEP9krNIOyvU^oGsq5pO>XL z>#Eidi!zg&M~?iyF@SL}Tq%ZmgfyVqIa7lHp-7|=shs8T&fxZ|+AOg>iF^)FRagkdiyC{u)}MGDC4L>|MC^aTjbZ+L{lzR)`1U9S z+_lxUmN{=dA4H23WN3;AH#+!Eseb!9Qy2g^9b$fFx-;uF_%qI!`eDn29$F9n^5NVM z!rna0lDPiW9wqUS2u?d>q7bmUr;#L|X}Mg-{b(`byxYur+nYo~J{Nq7b+)Ep=qyCY zmR5+q;iNJo!zxi^5;9;R>OHzbFT#j`>>tU1|QBck;5=Bxv-4;P-APDtq(P zuh283yFORSd5Yt(Q_7oO&`@~Y+*4|IDE1v@0A5V>Vpl!i^`ePu)d51KRx<~>ft2|Y}{649t6 z^xBZivxMK{BPvB!p8X8VDwyeDbnf?lNQxY3XrJ$iRE_+}D-I5fHGHBojX%;yrL)i( zHAq_w2bUzM-_TQIDiv$^cOqJ{cOnbcBv*M12R3<@{$}M4rB_>s7|q}t8jUVm7Q6Y? zf~oh_PcQ-Ye};K$02TF-F(f7V80moz??iKKM@?RsS`0gvH07Xb6nR|mV2MASBDlci zkBGEgM4v~lWsu1T?Uk(OMb5(f+8KQQF`<)FkV2s0RQkYmetd~FlH|E`m?)8V zSgU`XQytp0Ln(qG!8S4G$7^XvS1Ze*?pEYn#jCKPg8EA2yu;3X4dU9DHTyLtP}yW` zeh;K*yfT~8bRN2krc&zBLRo)l0;{dMgCA9H!yr+VGg3MpVc?ELN#z%C@YLaP4WKx+ z)m8Ymd#btck6Pxe6BzzuHKZv>Uln4$e(nnKKr94(R;Cuf+8M#aezx4EA3Wx-g0f31=G9P}uf|J2HETR*b$3d0t?dqqQ`{d~fd* z{HxG-8YFHN#m4ZqPbprF28++u2mtZuOw+L|Nri#%NEFe%R6oFaes=GcWD#)i`~&5X zxS%G@??Ur=*2S=+br}iyRionfJb|BB6tULvPL}Ux!3}u5XyBVTG>xr$rFP92;0~uF zOxHd0-CMR0I`(9LMky&TQHh^a#TR0#XvsA_74Ve}5;ZF`hYgZY zzw7s+{GO+ju&JFU&pPzcK!(5MYQ_bf4;mDzWh3&+6JFk|SI{7+ildne_Y4pjl+ z?{^`xpF~xI`TBHsk4H|#U&A?43BTuLr|}Q7O4R)eM4O`=S9P9%rVxZ;Ai?O{87@Og zR)yl9MZPrL<^%za76r1_Q_ZJaNiG+a*4S||P{_EF+iHI{IpM*$suivs z;WBOyCietY@#I%pgZZLV3A=Z7y=eoO`v$@gKuojdZJx6m;Si)0AOQze2FBc0^mX~f8Ldf(>%-n!2bd9~Hkb9@+cZKzNh62CFh>jD34&aXi|nGYd!HXPD(_YAdt#cV z3kYUt|E`Ay?>czu9`IZs@$Kp@{J4_-UqiREH?ZX)9FreEvk}l9;1tzs1#qST&eS?Un=*3#S5DrWYK#I@Klk=QtsyLWz{gkZgsAzORa&jId^y zC@wWtC$2o2D2GtL-?+q?Ss0m}e=ByA&lsV`+_X(m-7h~WqBTI`D`ofKn{J;eiJm|+ z0h!B5sXs4TbuYpc#Ja+T(yZxg7(l7K+#vCrWUp7kz5mAU=U@o(DwP}VW1RNqKrJM z^yafMmp_aPndNsY8P6hWkjqj&!n`nRp3t2=V3ht-Fd9b6hpTD*kHd>p= zX>;vSC+SXgT%;ASG78Dc%sgUFE?@n&q%RNv6|ed=|^13!nLo}oN9a9cwdmkjiSGeb^?>vUc{MFW3jxg2*bX;Au84 zNG-p51UK5uSQ~MZe68hop!9Caa604N%@lY=p&vMynr zFx8BvVvx65K>Tc!p=!`Ec!lA8<*us+?aS=qL1R>n;U||D&~xrR7zzPHUMh91gA9pY z8ue?D>X~Ycrp}LRRCg^)gHZd%6lbo7%foLmwtEoa1O1bvTUkBF&crt%RsK`A(<{E|ey2T{Zz;GrVk91al!)@_yPn?!gs2)n}4K&c^)~{hKU8*t%h;rtP+}cg!Z0Jk-y|P zIL|7&ym9-_ik+lBh)^0@70M5L`(2#*JlySvtRq*)H~5Zl=w6cQ!`{!265PS^j+NdN zW^r->)BNUlq_Q&ofP;tJJ)+nm0IEF6Z#m!T6jt9zI1g~Y0191WkmA|b?MXk%$|-AagT*Uk`PTuAXuvoW~S=J6%?2*hXoVh zhG@)_bute4*`ecmEyQ*gLO3ZUL~ncd^WkMOFrdF*AH+7(C@rR_ULqhB7HTvXu!i1O zRW`-7(3_|rUY5muoL@))OoPJhKPXbc3eUIi&6~Fys4b;3btCz%a&d#ZOiM_`$GsF? zc=vB&TWIu(gN&tXNK{%z z{MV%}UMbm!RrKSBCRi^^`Sa(lP-0+eDBrAFH?7~(dgU;}@#zQ9sf6?L_{=yELH9!C zI)`X9Fu?Y6Fw9g%?=mxdd%~qilj6s`v%+_Y*ni$85I`xuC0Rv-nyGJnid4mKy0Qxe zOCJY?hAkA)t6`+sb8Y47kJ98U61+H@d&dyxBEV2v9sZ@pgyL2+58abVP5AY^3N`P- z$EoagW?o*y`)9_lHFj5LPew}Z_xrfTnj0?OljTfHZ~OU{QZ29E1aUVSwnUmJI1!>9 zR#Nu+^{`>l9unhIjDE{;b3!1_DbS^Kl4w$U6uGj&2Zk2myj*`PD-h}`x(n|7#+tkyviRPp5owSJ zuQEn_YS_$BuZ&Hr1D;cbl&hm#aO#h)CU&nP^Qd%!fXXlgSX{e>|mgknit2>2P zTZ-EEw>m@qB5coR%op9Ia1swvcrPP8VrM)S_S%P*+Tp-v^nri@HqI)?6k6a@*ZbKE zfR{qk?f2U6_Ehi()x+Vh6nM1xF~L~&FKa&K*duA{Q^X1E|Hgh7hd0NesvL26qhyUJ zMf*;h_QQ&3`WEohBl`}cg&EY=eW%TI!BU)l1*6~*UqZRF9{pQxg@GFR$=4_x|1Y0s zMhthmBE`XsK5seAGhmr>&7RYG`7gNLLWEYuix##UAnaA2w`#6NRrL_G#k^pKE&IH@ zI1U?yWtfv~_`_Zd`_LfKLQS``ZA=>S)M`o`NKfOP#G!A*=bP8RZGLeqfcC=BUZl5E zBId)H2cKamASwlRv^Ih;B{ZAzfXs zVfeBfq6|H{G`n@N;_Z+AoKepVdQEC8vhcpHy+5+H{qdLb8?To^_SHd)e|ZtB_`IbQ zIVbz)Hl3t`F9e_$+0W?kzFfz6iGLP5|8U3#Cq&Z@rzFum8`Ra$%HU|N^a>ar8sRDn z^B*-Pk95#+z@ z6g{(fb%guLe`3Ppwc|O9B#!fRE=Tp)bgL3Yzg1)-2-WL@_uspTyPs1ng*V?0KD2&> zfuhIi(V+T1%Ue{e#Fy61F+qRoV40JVrs%o&qS7>~dC_F-9QDpmo-`!X%L7Msk|^Eo z()=I0`G_kcydEO~srO6-5ZuKi93u^;QPPCsTc{TC{yLgGX&#`^*RebR?64aoIb`(^h#eu5&rV zJe9DiN8TL92$ReVk#HGu)utJi8dl7C;ejB@bGI4}9Mq+>!8&`Da>42*AAf}k0PcmP zEG~Z`Am>~hc&?*j?^2T|q7x%Fb@GWW)hA@y`Uhcd>;4(W+kLx=7a};0=N7Lni@i8w zya0m;Na6A3--=}ihrqS9&`n;7FY&2u@t6TV;oyO~jg{z$YaVDuoQw-Jwqk69okZw& z64QUZ$WzH_bQ9BWq;+Q+pN;cowaJ8b#5LC6a4VdLm^R$uA85|s?6OmS{xPmZhZ0Zr zV~&@vR?q`T2WBJ9KuF;O79cSH?)$qh-tG~@HOhkYSI>Qi@R*l{u5T+8%x!1%kArXl z+#k;Ubd`LX%}{7<^dgE3CD^~^4_VxiBpr%Zq#(#TBftF;xKmZj%I?Jox%I^oZ~Y_{ z3<@ppV}@Z-op8h+x%W?bLU>#c#&t~P;u85q4mZnc%G!FLW*m|suyD(^SBI7vj#+j} zlm>TAXN=*r3>svO8~!$_)1F4x1K;Cd7t#w#mcVefvMUM&)MQvaAKcg1+d{1(xAqQ# zNlwykE;N&>x%sE+`_ahD^F_vR=T6O^chbD=zX`r_2pz-CCC@-Wo&JCY9(P$oaV?g* zub?^L*jAn;umVw8ka55p4wlFbp(W6gDF=wi|JD2@3f}fcg%?zyV2C=sl)Z(bK^(QW*YdVE8LGzoFRf}0 z+~`V%`mz88$?v%Xv>11?&dxab3xpNj(xqo*F2n8N2xuVXNZnvO6juWcpK#4sVwe1U zuB*(r@ccCOgrD2u9t;W|pZWz#xQRrZJqZ!vCtl*Qm<=cEZCX%Dio)ex!B4ZCXd9)) z-8VGpf6BGq4Td#-hUpgVO_xbsS+Cdu=FZ5}?WuDt57$iTygLNm=fC~%du@*BF%YP5 z0im`mqqVF>jb4pOM$Me)#x#^vmJuiu7GrnTv6kUfW92`rIZA<24^J z1ObeyQI9J*s#x-D9~yyoYaK-Dkr)v}TECjLInQK*sOKuj?h~~{GF8#HPR|V!eiZvf zpsLH8m%;#^c?Xv~J&@CY6VhP>Qp#v=jul&p$XH;%_iTxG5(iLe$Vcpv=+IkOvZzz1*k*Zgma2>#>9C9sWs zhkWp994(x6q-v9!*xhJk!nTsOH|*OK+Cb0N-iz5)wmmbFWAHEQ2ij}xEs+ceX~V~F zEF2VAVT0t6IAz{7$Q&g)EE+i!KdGoG=O6>B+JZR*CvcJS*bhUI306Qz{=qo@mT#Ea zqiN|7OEx}k?NYg7#j617IJ!WzhiiOBfT~eSsS+}RUS>dilx%1L?3;z5f^++9`=sv; z_{^kh3aI8s3f_`_aZC%nvGH}U-_P?^{?`X^1YWX^d!(WdGYiv~h>j0YJhR(gcy8CO zAtgmjZd1!tR*Se^fz*E#qsR}P7ja}}Nz$haWg$wAFUvt{Jt-&{0s#TivcYw)f=E>A zN5#rt8BpPv{Y0-NajO)xlbAS^4LnadnDZoUovQzs-VG-Q^pC4j4p!18G8)+N{Fyf^ zgHuw#S*P+wx1ZqF;N{u!RlQu3H=^=~GS9hq>@6VgUefv)N={#q9(r??L9z|lWxLk0*FdD{8sjWp@sDZ6Lk=%z5tH0#o&5pqT)ZXRyq|9*w zTt>+^)3n)3FUijtUCC{#F}cl=k&|?4vHxHf=odC-GGMpM_?IZs)Zy|!p@(!1f-pm$ z*m8<-9(o(J%n+BS|9v)|uOE#m3ly52T)}qaCC>u9ybk4HG?0IM5Zw82IY~X@vC7Y* z;{ep5al%Um$7~?7s5c_I1zIbGX$jMslXp@y7$IN!$cF#csSO4{#=j!WV#bc_UN1x_o<%un22+Kwf)JahX z-^ItGu!Kj(Dc+zo(NL<*$D8y~<@3b4jMZOard{FxMhD=bW&~Sp+rA_2G9REorn`5P z(#avBSJg2*R>lki_FB}xdGqn7%$j1yZo5unimS)}cr=;@l3FlXbH05UQnil>gg0j$ z7uk~|1gsq#FJbWfOfsXvk~^WO+du4ZuA*V4biEFBS_}`w4rT)sA;?ZZ(G3!(`0p4= z)#}Rz)Z(lDM$D+biA}p~J^NHa@A!soAlE3D@n0=a0UvVW$CDTi8pKx}m>vhwZcn_4 zRJ_=D=N=Dlgy$WiqfevCOKcqS)X$GkEz19vldE_+d{qg zn&b%24WDm9pTrh}=OU`A=4*fRz1peaUK#jT?6N@9Aik03$A#1>`^!eFxW9kDIYBO? zp4)uSgMsQnCkN)|r$S{24N>tge2lpAA{yA2d2|h_7_3tpX{XPes{yRH%lWlf-1uc= zHbP6qWr!1}Gz?_+XQ@z%oNx~xHMm}U3UjI8F5wao(~*;v1k81V4j&))1N_Ex(Xm0I zsjtvUlox2nWbwpfl)%M>Ach}`nDG275uuh79?`AOH=q~co5hX zR*D^6V1tbY{0-$>#%NRjbK>hX^?tkjWRKD!Zw9ClyR=alnuv63rK3~!BtGq7uPWy5 zO9CQhocq2Sh?Iy*2KaCv0Jnd|VW>b1$S#MKjrG5vCsUTfdN?9l^gGhrNcOT6E?<1- zQvD(?oANF0{n`LK5zeUfpfpt%B_0PxY=HwR*37b(|n2Rk-aJ z8y?uw`KS#HFo@+B|HGhe&9@RE`=>ntNYAVJ0R0zhn+W;qgjit8nFFQZWF48`bX9Nk zkmaqPP7tzuaEJJjNfMx{HbFUWL4RwMd5We1<-)+RG|6Y=oR4EEZw3q2NHxLZ=7LR3|2q3qMWbRi{x= zVqZ7%QAs{=F}Qaw=XY46_8j%)8x#AV0~%=uq78awhL(KVZ@+pa+a0eR4(d7Za1E3< z4E+yT#p*2wa)X$!FT1VZ3J7I2EuoRGxZ`3e>k5%Pw^B;iuoq?LPFoHiU||Cg%|d8G zMwt4e($v{>IxML1K*wJMckEit(4`+AZ*PEvTDIYr)KKE8&Y6i5KTO{#)KTQ8AbG-& z;>AqPG00M}KS(n~N=$bL$JwXdqX1})atWCmxNg%*qSQufCeM^&&T(a_;o}$mc~gk5 zyb|&yTreB~x|v&x`0_==a72BY8L?e8IO372Nk<_N>VKT_KzRqeJ%jo%2g^c`qLHR? ziIv(KxmzUXdS<_ze^)??TR`=mC}@>O)ku5{7&btSgcOn858#Dzf!qaq)fZL@)-gz| zE91ZsSih#4xRzPFIQasYI1A2m!9X1>YxGX)DdA{~CG!umf+=w| zm097)A~6`UlhMmK63;Y^7fAkL69Q0Y4z;i!5wC;=LU05-^6@!WpAM{#$_Kxh*CM%m z>5P&fc{hwD*3x*0vi!Av$Ucj%N)47;JpbZSX+LK5#Ku4RMDZeF$t#?p@Ch!XV+-z)Oy@HI=FlBxQ)S&Rjl%%nqd@+wF~uX zd(N28t%AyMkc=ZL%h2?1fjY*2-UjJ%1l^`yC1)a0!1+M}@)SW#T%AOugc+zGU1LNi zgPy%?xm_s&|3=1dXGx1g>)BGz(%3F~_}uYv+gT0Mn*wc%YRG$ZpzREk!5rE>z$#{~z1r&f!E?#-}pLll?83ObxBO| zD4F8FrTU4eB5!#ZV>~A0L|AZ|`hsl(!nfjN^fwPP{TiP%+(uuf)=N@ivkUp<$kKGE zJFry#qAi3ArYDmg7{3UtSbHd|#;>I-1lTg6KZ=jki@umnA%9;jsUYtrt3!+Pj=oW# zfEbxU_X$D_fP#<-oBOH0`S)E5{g{6lN>VRuZEqTP?~sKDz9XzqR1gYC97&|>;4hs@G5JoYKNwZjV9 zWRBZf{#byuC3(s4NO3#ssaeTcIeYnP153%g|Ljo;2nGUDW&(g+PS0=?{>>+awDpc+ zvi+&nd^k zed8jF(eBu|aYL4DJ5@;B95)*@M8CxdYe?1ZzdIWYj%(LL8e<{5H2l}*MAQqex|EWj zSHa2yJ5zffetF;|!Iz7a^N2AnCn(~=8l20X{i>%P9DOxVQ^exu|5pqi5W_w+U{pVg zExhjg#f|fRX_Cu});C>JJRFqbv<2aT4{YpUA}bRjnY?CKH|=%8Isd)9xnU;y(%6xI z+8=;h#52LKyLNAGPi)p@g$qJ$JuTvDm1i>7D0vV%5OHB_saxRledGana9@f3H*}N8 zg!F!#lo+9Ui$eW4oiO#d2FSrTC7Saf!Fi>F3T^r?ysw>CPV1dP zZnqV$eqO72l$7a#`K;It19esk6`a_Th?2SUogjvt3%;P3M`S=31@zDKyJg}0CEVJ? zU6ytSa?3T6Bt)5E)}jgUCa5YE81n1>pUp~#as2c)`mQvUsI-EjJjOdzmeo*++8o2% z*iyG6jz;wp^tEXS)(~hk_zjy0mcXa`lE-8iN)O|oy`=k2${?HEp|YlQFlcItnewi4 z1!u0Dgz`3f@tXvECi$r;p%I)_rCQ>28uF*m57Yj6?MVIZD>Z2y@(BtkAk~3zWS(~n zv!x^)VYvuVrCqup0L}SHjP~qdbWzK4oF@42~v%Pu4P^Afz=sqAem6IoLDMHZu)+Hgq?=)x^sgpj0Gt>7gC2LWWG^T3nlB-?*mo^*!LAg=krw@zBVQn* zlnk1Il_;80>bsCMxz+?yVa-QLVAVwfGx@+BNnhH#LFIYX6fb~h*6iXvJT{Qyuntd+79kz_k} z?^7aSTIO>^_sDE7*#hFDW<+Np$i@svB~tw^H6^%3+tr${&r^e zWBXUzf!D9H?)NYwyu6mh3|baH3kd6zB&i6vh9POqO|#xUkMfoq>GWKaNTSqL%xf*Hj@dzk%!6sTs5rwJ*BKat;%Z}~qr z3{3uuKE5E{$b=yd!obxx+_{e`{k0y8a7_GEpbJ5`F-@~6Bf;^uLNP;ZaeW5Up((*~ z8-u~ zYt+w4_^JVTdyXL<=3M3g?a;6)d6GVOn)r~v_!tu1$P$@<HSyA0`(G2a z6G*1+$Jg!)D$hYnj_J=^n@*U-mZp9a&Sctj@46xWlp^3n^#%MA3#*cu9n>Kd8T&9i z2*X8v4B=o`GU@MH&GB4RGs+b?75O2#a6P+ESVy2fN_KXN7RtO?eh0N?8xmkmi04_O)v&-wAWF8sWTMS2=FKhr22>c})@QDIq zn+XN{-y+AQe3vlOO4i@=**tY1)|MGf0~vWcDF4YSk=*N_#CR3K`Z6>g&cw z1Vn=;1=|z5+k+tf1$TVJ8K-ILwYQQf(=v?EK67Bt5eWI1yN7!zjwnZCRY>C^nvSQRBup%zN?07=*hCDi`isQS|Ej5iwQB`1Jz`c#5I;LS;mIocjFTPLmS--&; zkt9aj`->a@BTkyZIq}%)+UjT;`IjnD_XX*66ql!pwAI7QO-7*5kbLw!hVk5~m3q3mlEwQ9V7i;O2tv}x4V1#Hs zjPm&(;-f%d^D{pU;@mElmQB#gEp{=;2PcUB)FAp<(Gp*l!tWG;w>L9*=2sxmb2DY| z4cyRyQ?z5{b=}uS(|4SzifB4p3#JU%xm+JG57fhN%MG!q3z$#Do+FVj;Z%?Qq+I#i zzEuWq=0Bn$9D;~zmdHi6$BFG{leJV37yoOy;)N2cFoeWsg;Xzk4Mn_gwleH7?)PIa!!T!n6!}W zF1K!!zsUyWrznp-f1y@^WEGZiX`ACs&!jE#%rHz@lqwMSR#u%v9RAXt4q76D;WSiJ z@JD9;ml_A?un`ky3GWt`nAPhmmkehEo0PJk7HfH_oakNjCZ(dY3E}6a7APmm>*+9v zy<8N+r0F>aL_nNGgcNL(H2-#PuiwASlcsj$%eUk40CJq9`j_mlT$H{tv_fUu9f8ds zm2*Ldk3AT8N5Jf2#y1w(v^#22A!?P1<(;iRaNdFpA5>*0_$_PG4(8}6`W^#|-;Gvx zt0p?aiv|9R;V_9lu6YQgmGDgyBE0ILc1w%xr`;U=i7efOg3CG>JeKt(YhQ*_&9B6? z_4>4Lss)}29w%e_a3N92KN*MEPaRbEO>pthTO{%4tM}>bl-%a*r-N*8V%zw}BDKUB zA6YNmV>*KmaugP{I-NixGVeGn)yWhE!oRyNBP#Z6%jRc+xjklb?LyvCz+d7M(TGQw zIVC-Z_Nwkit3WxovA4TdW2n(*uI01Xt)$}VJr+76J{}|)4GCbH&Rl0ubxl#+xtFv6 zLyB0(XWm_8b~XLkSv7o6xL#&x(ci_n=vK89Ba_F+mFWBc${(ONq*_=Ql=ADqg#L<*Lsaf_C&8$EB41t;gxlONG> z29Ci)Co<3YZk8hoNrMlXu4VG3NEPBjWHY@^UALS3CgjVZL2Gn{OC8MkR~^SG(n0Wh z@ucA>g+mFvJVSKJ)Oces+hA;Z8uOrDK>Yg!!qpEDp3{+2m=Bg?TGpkX1zIVdND_Avqcv2iB#-I`ZgyUd3sfmB)Zt8)iYa{8 zZ-hfh{4GGm)M}dm}&F$X|Btm9fQZ z*-V|5}3t3YczwI%^ z6&r$D{cLmor+skHfHt^n%D>DxZz>%=XvVrHhqI|p6ggO^AWucURPfH2Xo{B4c>3k= zx~%axOD*>)sQ`Vmh=lK9T2$6LS?VD{?Pu>r_t#>bwHkFiSl5DRqyGN8MuOT%df@#{ zRY?1B3VRrsTs;_51aBZ2Co+}EY?yigDL#%CayhL2{C9c(pl=v@Z#hK@%Ne`Q3*msL zq7@pGpmTov9;FR2p*dfL?20Nl!NcD3lm1c>uJwa9dp+4FSyL6wm(iMfd67`HS(z5)yH+^4_2%ZPW|XGMl9<tju)0Yzf2-K`KTUdym}1Kn1*@zq-O zVbElQ2T5X`Wb{!I=f3FfaPV^m-l18oh=JdS@Qey?rI*sch##2B+7-eD7(Hl83VrV{ zaANv2g!ztGR2>Wx6B*?;4ruAo5^6R+oRl+7p`b zJhsVSTru~GuY+!J(ICy+S$ITS|2``=Rte@SVGp0t;6=}vnri>Of=^}k=S9HAss58B zf^{;$1h%rZ@+;1gV?4+^cxx}yC=6eHY;jBoYmmXqZ+*XWMN%2WIK?^0B7M%r%a_ipmgsI+0`O#p16@Dw z`;I?*7f+^9Bx&?W3Sf!_-jCpN!dp)T^m^(B^Aqv6Xgm6u%x>Lz6)pM9*wT6_FJt_^czq>u%$ zB|{GIZ5NLXe)UYXSzS)@%{RQ-*~lrDObH5M7s zRfd;?C_4xvh?p-s6Di@bs;JGfLRTZ9`K~Q1s4h!*9xC>3KaA$i1{LenUZ3%~qzU&w2z!Gx({&(1zuqlUKkk=UAxxTy5jBDxG%$0+>0=BK z5RRm#r=?d-iwbLK@lhz`{^$Mrzc7^7nEDmkX5-}qT%L;-NDT**f+fVH{J&bz2HVAD z)4t1=mW{fcpqM>=6BkGn>IJt2hw@#HW)qUuTu(15QOqKV{ahehvf+-OfFkF3iRR4h zlqswU#3tQXFebC{^jGj}dQF+;SzcP8bAk`N3mD7%HM#*WxZlW5re_$@LJv9*5_XE48Q> zWM!D5BO|IMNV_w!F%O_Zt^}=oUo`AL)mp)c@IOQ)!jcMxX)iE&Am`AMiAUKcg}Dqc zgfcrqQ0JghCsIcHLHoPTlfKx-zY8qURMkg znmSDq<@f+2XqpllS-dQ^`dKw98agC}n!GWufw|X!!6L3Rf>Yg>@ar20P;;%o*Lv~5 ziLXhj+IlLd5JwW3l*6jh+P^h=|7Yx@#IH^QRCl=LG=E(acM$<`sj$l2SZ78$=OONQ z6FZ*TlBhmqNz`~YOW>A;UD zj9rJ_5n#9r3XbOkb|hOW8RBIVc{-<6J9$4bAkzo75{5N!-ARVUGimF&uC%U z%a9ztZ_^jGDnI94vm5A5x1Vh)y*w}#R&>bYN*wY-JREMm(Ylz-FT;(r_)c6H?)C}0 zx6PZ+x)Wm3C){1wArpM9Dlxpx>e0eWjjgUp->4igp~^eNanMM~&69FP%Rl9;tqRYW zh-4mPY7krm#xjrJpQY|Qgl+yB^sKp5g1;k}rKug9EI#oMXNLmD*$1?8$4xCffj-%JX`>ry#C!lg4FCf`w8deVD`)p zXhg|^!-$Ts8<$>#iW%>3D(zs_or|+6=5p1*!lMD~V|UMw<1W2#Q?dUj86-c}`7qH8 zy-?$*Ti}7}Z`)m&rCBuq7~{-f&qB-Eh{r)KQyWbMP}5dwQSxIe=7z;pn=)}{A78Hf zQe?OOX={3JdZ-E0uZb&UO7UEScAyN6>STLo-`Sd{tvL z;+#85GJ<&Fo|c8I@HsJd=a6pEx~#zkq_&r_=UI;w|6c~3kyrjr^#A8eq1g8zX^k_- zUfy2BM9IObvKgtC^+HjXO0rL~hwPkYrxe**QiXpU`@`VCMrmPN*pKrkV93`yo3~#W zChvH!@>u+Mr5K&PNAx1Z0S@#3!=d{k}2wvnDo zG1>ysH0)GqanYtjp{YHri6Stb05x#&3CSVC?95zDdMbh;S`ou*8*)hp7(TH%5Rj`pKV@?AuZ_-a*_=EiVWcdL$?Y&87)yONB05y=h7jAl*f*jc39andKe}L74GV zHjmlWFqfng_?Zj7vbSyiEDVmi zC;G96GHU^Oq$rsDE#E}IFn~O@MR1&4DAu(Pz*EQ#jPKaPcOp|{grp_*+fh(mLpw^{ zNu(wF`hfLJNXU|@wb^!^=;|??xfq!~ApZg-cBjF`A!f7-?-AW|x6??o1ui!1{bc?) z_f~VSYbcpdGmN?a>j3Jm!Xsl+o&X8QXl*QSbCrLc+}t3P$f6VMd&yQjR-z!8XjW3u z-Jn4s;6Y&keR5ZUIV*-EJE$CZH*4MPvwu>QN4OBa^3sf#sU|f8_de)(l;`{=CG}te zdF>W$SddAQ%!cD`C9v5$A+x`wObCgnAQTA~N&`gp+=&s@qD@XC!jy(|fex5rs!Zns zV@Hd~=Zq^a)h9arAuWHMKNe9lx?W;g(@r5Kxx9dscRqG}bf%(~hCl@NUmubfIXji$ zAi~-uboR>2fx+j4(J3w;J`{7p7gQ@F9vAb=E4`Bw>#?Vp@vMBEeh_gqUBN8O%y})s>PkpgUsBVH{+Ftl%2uv^Nuq zpf$vUw``k;`;cDgy5^Wm_apnM#lhv@?Qe`gt*>bnCDDvf)J#h#IisaO#bBe3WqWbB zAPTW<*LTvL3uMsKk04bZA(!$Ri*=ZjtokYRt~u+<{0G7C+_j1}*okt?&6 z=Y;y)DeI_j?kL;s9kg!!dh@b*qY_NqTU1T6*lAneno=i<90ce6)UPk^UiAAJs__T> z$HtDi}emff2F0}&ERmZ(4r37a8Bh)fmIy=%*)Hmk#eLxG8(}qS~#o`MnIU=y; z2(`bzCi?sR`YevvG>_R|r1npIdohl$VNsRevV7e(>YNN#g&O_bF?J_y4A{~UX_;Sy zRPV+KXk@u^Z;&y*Ofi{^CGd$8?zoWoZfxo(PD0*@U$dpTQX)Idd9J3I0`3D9IdZU~ zFJ#Ac^)bSCc`nWb-^~N6QZ0{E^qKmQh!SCgNVoOpFBF(9Vy+60IrEO|`AvtLKDufn z%daV8-LAlyk*Py}=nyk?d7X@>4Cp)2y)kyBhIb^k0}w&e1jvOUa`bO?_iqKx1VN_> zB?{ayW4K{ai12>sM0k(A-H4k+`RuSM6rN=s;t7ksc4^ztBI8X5LL!~&&dR7U`XydL zmnjaX4yE4IYjwkJjLr}c({!55;hiM*OjC@e@i=6o%mrxsMd+12&aAWU3)>K)6paEw zZK#(0X#-mt8mJ+A3T2DmWq7{lsEuL$HD)1Vjxfrsfma2^&u}lA6R2e_#Wlp%r5t`| zGf`uOLu(^i8!uQD`%AB^fa_U008A?3)wKTun=8nagwaaFum?HsCOG-7zF?eyEE>m^ zSi};ymHPneBxylkJ@Hw8WQ>zmS+!?Kb|Bn@NngW z1%RNAbv1uBbSv3H+Xq#49g`}&8Bsgrt5dTo3?sK)KjZH{%M z*660Pa^2w}p%W4{k9PMag%V*eLoi?z-fz&V~w?FvGDh?qR z9-H%GC~wh*uRlFl^Knjfi|;Kx(`2>jsA2@QLDgWW+@@}TRSj*)s#DZ6@$}ELc^(Z2 z{KY1~8z-0ot)AIawl;0td@C}9`{qj@SgfS?H~td!N|QCO_g?K_Q4<)kdT!_<40CUZ zq_4O(t{MEmEbaBB?`#yrb6i@jc-(3ud)P5J0+i#>g~cQ(MmlDstX@FGHG#kwKI9m* z{OWU-zJ4)=Ix<44Q&>Z|db@+|z1*C?ajAq?x*2&h(%KwfLaL5eHV}PhG`Wsah5Y5> z)1;BRWd@)3kon6jy*3cvQG8Kv=f?{Ly%P=#3A|iD)%G9csHtN1=Iqef5woHeE?4tA z!`1M+`F3tbY0fq4&3yTgeY9dqY4dFPkA`q8hSJ*#SsPb#`cveHD?3Le_KM%Y1g^fy zgqciMNBYmU`)^7o3b982CPX}FxjAsIU08K8Y!job!QmMd0)lM&fvnZ(v^ zO84j>hWe%>stU3BcD7uD+oa_EamlkRdSoI>yHw(cLJR)mRTxPc6S>$bhkI#lU4jM) zM2T6+c3h1hx#nTpoT$fc)UM45{ZVTBVkHrN)2JIc-?kIr4rdt)6$b9viV;J@mU@b?RIsC83|W8->ntAS9WjKN91UwmegAa8nq zaO8X+d^WiaI;y^37Hj^VisZ;g<|hhGGzQQCYSFl1Q)1*SVlYwfvYAql*CV}p^<9PW z!vP3MvLSM~6<{#~ZDo_|B}1S;CBf>3_KnOlr#t z8P83(ALd`$QMamn8vGSwrFxAuZ;Z`zcQyLt9M4Ycf8Gx)sh{4Q)qaesy+6LuWCdBq zZuM`!y`itDH)}g>fb8d%QlJ1f1JimXi_>g#e>fg{SyRdE{OAH(lV)|wxhT4ZIyXsx z#Ieb?srO0EblI#nDa|%Te$<@1%_Fv_{hKD7F^0c$@9bS)Dlo_5T1qS1oiI0NyXq#$ z57Z6v$%sIDkHaj0`rg5ga0{f?AHZ-7T}UHK>7k5yPZId2zi(zs9trVud^ZRl6f ziz-aF%LukI{=2lEy;}92-dLbW2y|o3o@e4S5 z@jnfhmL}7WVB|IVxeE9IYlBa+zS^l;{$i!qvgoZ#q&h4aZ=j+X#EmqSBWXiXwQg+# zw<>oaZNL!!)jjmquuY{yp9eOGpmpk6!t)x*D;>(2)bx*)PY($t21X}K zxr~+m%Xs|ilCN!!rqwdPtq*V&r2R-oj|F!A6!E3y8Fu#~TVv>KCd}-^7QDY*8y-wb z-40Lwknn?;)}s$gB&Q}9a3kfXKWHxKK^A+|@-(xTp|_;<^(ddIi}kxpw-I)yY|PmN z4%%ED71vtRslr8>_2Wx1LqHK6A}xI2;igAV3`gwk6FFCgdHUaW8W z(NL z0tH&O8fkxd20c0W?lsi#ZmrI}R%qJ>7_C2F!j!Y`(GyuDbZ&s0Io7rSdIK9ze_CXOBvR^7o zeQ;H^_`xB4xq`;Tuk0XAL%%8}C#xstAcb=#Hb5*y?A0#%OyE5lY8_S(Bl=;$XcC_5 z87hT+10|*2Qnjp&L7=@(k;|``Mk2xIx*h7;SSwMc1l=>`#^vCIiU_~8J$f77e=a%o z{gR91&5z871Wyl>U~-F#2J9-R2WA?LLF>yNTv5eT5kyZ2!arn$DCHF5Ig|aOE%D}#V3h1Fke9&wlP#bPVP%QpKe96<_BtSSo&@y{ zrL5nxC|36kw`a}m2NT_tq%WTLr=h*h(kwJqK%q)YPp*_5!pmIBRCVWJhPre-1V5G{ zp2uF9oDeep4Tqql$Q6YCU`LDz13y~N##3C^^;@#SpZuDz`&IT@q5V4@1wD3y)1#_* zIDS!PqB_I+XdyRX`fyc40BhUM4Bh-(Ix^2T0zcJ!J0v+W$gBNzwayI&t#1lK$jES~Q7z;3n!nc3wmL z5?89GuXx*G7FZ4T_0Bbb+2FL}Di}Ic`rfOIL=(Y*dXJf0x#n0Ws<63nSO(Dxee25aiYA0+*IQc zEJ#kP#$ToovL=0}8b}3YYCfkpzbp+-dN_s8bbpJ~uU89mb>B=%vT(}IUhg`w2aS(+ zgnN%Sm-i!*dk6Nk3_VyqVs?0g%FrM&?3m({7@zTKN>f+4-9c+VZ`*1e>hjm7HtZ6| zqdvj`0aRx8ctG+20bF-t1BJOm5UX#`kbCkW7>YvBz6-4~AD+U^e13z&NS&Z!W!*=&Mlj<|oz*qy6wDj!Ov~oE-lD|H}W5%l{Q+ ap!3cY#wcW6_xXnd{BHbhb`5>S8Tnu43Ges- literal 0 HcmV?d00001 diff --git a/package.v2.json b/package.v2.json index bb3d819..f65a1a1 100644 --- a/package.v2.json +++ b/package.v2.json @@ -435,5 +435,17 @@ "v1.1": "推荐支持IMDB数据源; 优化海报尺寸,减少卡顿", "v1.0": "探索支持IMDb数据源" } + }, + "ClashRuleProvider": { + "name": "Clash Rule Provider", + "description": "随时为Clash添加一些额外的规则。", + "labels": "工具", + "version": "0.1.0", + "icon": "Mihomo_Meta_A.png", + "author": "wumode", + "level": 1, + "history": { + "v0.1.0": "新增ClashRuleProvider" + } } } diff --git a/plugins.v2/clashruleprovider/__init__.py b/plugins.v2/clashruleprovider/__init__.py new file mode 100644 index 0000000..cc1605b --- /dev/null +++ b/plugins.v2/clashruleprovider/__init__.py @@ -0,0 +1,624 @@ +import requests +import re +from typing import Any, Optional, List, Dict, Tuple, Union +import time +import yaml +import hashlib +from fastapi import Body, Response +from datetime import datetime, timedelta +import pytz + +from apscheduler.schedulers.background import BackgroundScheduler +from cachetools import cached, TTLCache +from apscheduler.triggers.cron import CronTrigger + +from app.core.config import settings +from app.core.event import eventmanager, Event +from app.log import logger +from app.plugins import _PluginBase +from app.schemas.types import EventType, NotificationType +from app.utils.http import RequestUtils +from app.plugins.clashruleprovider.clash_rule_parser import ClashRuleParser +from app.plugins.clashruleprovider.clash_rule_parser import Action, RuleType, ClashRule, MatchRule, LogicRule + + +class ClashRuleProvider(_PluginBase): + # 插件名称 + plugin_name = "Clash Rule Provider" + # 插件描述 + plugin_desc = "随时为Clash添加一些额外的规则。" + # 插件图标 + plugin_icon = ("https://raw.githubusercontent.com/wumode/MoviePilot-Plugins/" + "refs/heads/imdbsource_assets/icons/Mihomo_Meta_A.png") + # 插件版本 + plugin_version = "0.1.0" + # 插件作者 + plugin_author = "wumode" + # 作者主页 + author_url = "https://github.com/wumode" + # 插件配置项ID前缀 + plugin_config_prefix = "clashruleprovider_" + # 加载顺序 + plugin_order = 99 + # 可使用的用户级别 + auth_level = 1 + + # 插件配置 + # 启用插件 + _enabled = False + _proxy = False + _notify = False + # 订阅链接 + _sub_links = [] + # Clash 面板 URL + _clash_dashboard_url = None + # Clash 面板密钥 + _clash_dashboard_secret = None + # MoviePilot URL + _movie_pilot_url = None + _cron = '' + _timeout = 10 + _retry_times = 3 + _filter_keywords = [] + _auto_update_subscriptions = True + _ruleset_prefix = '📂<-' + + # 插件数据 + _clash_config = None + _top_rules: List[str] = [] + _ruleset_rules: List[str] = [] + _rule_provider: Dict[str, Any] = {} + _subscription_info = {} + _ruleset_names: Dict[str, str] = {} + + # protected variables + _clash_rule_parser = None + _ruleset_rule_parser = None + _custom_rule_sets = None + _scheduler: Optional[BackgroundScheduler] = None + + def init_plugin(self, config: dict = None): + self._clash_config = self.get_data("clash_config") + self._ruleset_rules = self.get_data("ruleset_rules") + self._top_rules = self.get_data("top_rules") + self._subscription_info = self.get_data("subscription_info") or \ + {"download": 0, "upload": 0, "total": 0, "expire": 0, "last_update": 0} + self._rule_provider = self.get_data("rule_provider") or {} + self._ruleset_names = self.get_data("ruleset_names") or {} + if config: + self._enabled = config.get("enabled") + self._proxy = config.get("proxy") + self._notify = config.get("notify"), + self._sub_links = config.get("sub_links") + self._clash_dashboard_url = config.get("clash_dashboard_url") + self._clash_dashboard_secret = config.get("clash_dashboard_secret") + self._movie_pilot_url = config.get("movie_pilot_url") + if self._movie_pilot_url[-1] == '/': + self._movie_pilot_url = self._movie_pilot_url[:-1] + self._cron = config.get("cron_string") + self._timeout = config.get("timeout") + self._retry_times = config.get("retry_times") + self._filter_keywords = config.get("filter_keywords") + self._ruleset_prefix = config.get("ruleset_prefix", "Custom_") + self._auto_update_subscriptions = config.get("auto_update_subscriptions") + self._clash_rule_parser = ClashRuleParser() + self._ruleset_rule_parser = ClashRuleParser() + if self._enabled: + self.__parse_config() + self._scheduler = BackgroundScheduler(timezone=settings.TZ) + self._scheduler.start() + + def get_state(self) -> bool: + return self._enabled + + @staticmethod + def get_command() -> List[Dict[str, Any]]: + pass + + def get_api(self) -> List[Dict[str, Any]]: + return [ + { + "path": "/connectivity", + "endpoint": self.test_connectivity, + "methods": ["POST"], + "auth": "bear", + "summary": "测试连接", + "description": "测试连接" + }, + { + "path": "/clash_outbound", + "endpoint": self.get_clash_outbound, + "methods": ["GET"], + "auth": "bear", + "summary": "clash outbound", + "description": "clash outbound" + }, + { + "path": "/status", + "endpoint": self.get_status, + "methods": ["GET"], + "auth": "bear", + "summary": "stated", + "description": "state" + }, + { + "path": "/rules", + "endpoint": self.get_rules, + "methods": ["GET"], + "auth": "bear", + "summary": "clash rules", + "description": "clash rules" + }, + { + "path": "/rules", + "endpoint": self.update_rules, + "methods": ["PUT"], + "auth": "bear", + "summary": "clash rules", + "description": "clash rules" + }, + { + "path": "/reorder-rules", + "endpoint": self.reorder_rules, + "methods": ["PUT"], + "auth": "bear", + "summary": "clash rules", + "description": "clash rules" + }, + { + "path": "/rule", + "endpoint": self.update_rule, + "methods": ["PUT"], + "auth": "bear", + "summary": "clash rules", + "description": "clash rules" + }, + { + "path": "/rule", + "endpoint": self.add_rule, + "methods": ["POSt"], + "auth": "bear", + "summary": "clash rules", + "description": "clash rules" + }, + { + "path": "/rule", + "endpoint": self.delete_rule, + "methods": ["DELETE"], + "auth": "bear", + "summary": "clash rules", + "description": "clash rules" + }, + { + "path": "/subscription", + "endpoint": self.get_subscription, + "methods": ["GET"], + "auth": "bear", + "summary": "clash rules", + "description": "clash rules" + }, + { + "path": "/subscription", + "endpoint": self.update_subscription, + "methods": ["PUT"], + "auth": "bear", + "summary": "update clash rules", + "description": "update clash rules" + }, + { + "path": "/rule_providers", + "endpoint": self.get_rule_providers, + "methods": ["GET"], + "auth": "bear", + "summary": "update rule providers", + "description": "update rule providers" + }, + { + "path": "/ruleset", + "endpoint": self.get_ruleset, + "methods": ["GET"], + "summary": "update rule providers", + "description": "update rule providers" + }, + { + "path": "/config", + "endpoint": self.get_clash_config, + "methods": ["GET"], + "summary": "update rule providers", + "description": "update rule providers" + } + ] + + def get_render_mode(self) -> Tuple[str, str]: + """ + 获取插件渲染模式 + :return: 1、渲染模式,支持:vue/vuetify,默认vuetify + :return: 2、组件路径,默认 dist/assets + """ + return "vue", "dist/assets" + + def get_form(self) -> Tuple[List[dict], Dict[str, Any]]: + """ + 拼装插件配置页面,需要返回两块数据:1、页面配置;2、数据结构 + """ + return [], {} + + def get_page(self) -> List[dict]: + return [] + + def stop_service(self): + """ + 退出插件 + """ + pass + + def get_service(self) -> List[Dict[str, Any]]: + if self.get_state() and self._auto_update_subscriptions: + return [{ + "id": "ClashRuleProvider", + "name": "Clash Rule Provider 服务", + "trigger": CronTrigger.from_crontab(self._cron), + "func": self.update_subscription_service, + "kwargs": {} + }] + return [] + + def __update_config(self): + # 保存配置 + self.update_config( + { + "enabled": self._enabled, + "cron": self._cron, + "proxy": self._proxy, + "notify": self._notify, + "sub_links": self._sub_links, + "clash_dashboard_url": self._clash_dashboard_url, + "clash_dashboard_secret": self._clash_dashboard_secret, + "movie_pilot_url": self._movie_pilot_url, + "retry_times": self._retry_times, + "timeout": self._timeout, + }) + + def __save_data(self): + self.__insert_ruleset() + self._top_rules = self._clash_rule_parser.to_string() + self._ruleset_rules = self._ruleset_rule_parser.to_string() + self.save_data('clash_config', self._clash_config) + self.save_data('ruleset_rules', self._ruleset_rules) + self.save_data('top_rules', self._top_rules) + self.save_data('subscription_info', self._subscription_info) + self.save_data('ruleset_names', self._ruleset_names) + self.save_data('rule_provider', self._rule_provider) + + def __parse_config(self): + if not self._top_rules: + return + self._clash_rule_parser.parse_rules_from_list(self._top_rules) + if not self._ruleset_rules: + return + self._ruleset_rule_parser.parse_rules_from_list(self._ruleset_rules) + + def test_connectivity(self, params: Dict[str, Any]) -> Dict[str, Any]: + if not self._enabled: + return {"success": False, "message": ""} + if not params.get('clash_dashboard_url') or not params.get('clash_dashboard_secret')\ + or not params.get('sub_link'): + return {"success": False, "message": "missing params"} + clash_version_url = f"{params.get('clash_dashboard_url')}/version" + ret = RequestUtils(accept_type="application/json", + headers={"authorization": f"Bearer {params.get('clash_dashboard_secret')}"} + ).get(clash_version_url) + if not ret: + return {"success": False, "message": "无法连接到Clash"} + ret = RequestUtils(accept_type="text/html", + proxies=settings.PROXY if self._proxy else None + ).get(params.get('sub_link')) + if not ret: + return {"success": False, "message": f"Unable to get {params.get('sub_link')}"} + return {"success": True, "message": "测试连接成功"} + + def get_ruleset(self, name): + if not self._ruleset_names.get(name): + return None + name = self._ruleset_names.get(name) + rules = self.__get_ruleset(name) + # if rules or ruleset in self._rule_provider: + # self._rule_provider[ruleset] = rules + res = yaml.dump({"payload": rules}, allow_unicode=True) + return Response(content=res, media_type="text/yaml") + + def get_clash_outbound(self): + outbound = self.clash_outbound(self._clash_config) + return {"success": True, "message": None, "data": {"outbound": outbound}} + + def get_status(self): + return {"success": True, "message": "", + "data": {"state": self._enabled, + "ruleset_prefix": self._ruleset_prefix, + "clash": {"rule_size": len(self._clash_config.get("rules", []))}, + "subscription_info": self._subscription_info, + "sub_url": f"{self._movie_pilot_url}/api/v1/plugin/ClashRuleProvider/config?" + f"apikey={settings.API_TOKEN}"}} + + def get_clash_config(self): + config = self.clash_config() + if not config: + return {"success": False, "message": ""} + res = yaml.dump(config, allow_unicode=True) + headers = {'Subscription-Userinfo': f'upload={self._subscription_info["upload"]}; ' + f'download={self._subscription_info["download"]}; ' + f'total={self._subscription_info["total"]}; ' + f'expire={self._subscription_info["expire"]}'} + return Response(headers=headers, content=res, media_type="text/yaml") + + def get_rules(self, rule_type: str) -> Dict[str, Any]: + if rule_type == 'ruleset': + return {"success": True, "message": None, "data": {"rules": self._ruleset_rule_parser.to_dict()}} + return {"success": True, "message": None, "data": {"rules": self._clash_rule_parser.to_dict()}} + + def delete_rule(self, params: dict = Body(...)): + if not self._enabled: + return {"success": False, "message": ""} + if params.get('type') == 'ruleset': + res = self.delete_rule_by_priority(params.get('priority'), self._ruleset_rule_parser) + if res: + self.__add_notification_job(f"{self._ruleset_prefix}{res.action.value if isinstance(res.action, Action) else res.action}") + else: + res = self.delete_rule_by_priority(params.get('priority'), self._clash_rule_parser) + return {"success": res, "message": None} + + def reorder_rules(self, params: Dict[str, Any]): + if not self._enabled: + return {"success": False, "message": ""} + moved_priority = params.get('moved_priority') + target_priority = params.get('target_priority') + try: + if params.get('type') == 'ruleset': + self.__reorder_rules(self._ruleset_rule_parser, moved_priority, target_priority) + self.__add_notification_job(f"{self._ruleset_prefix}{params.get('rule_data').get('action')}") + else: + self.__reorder_rules(self._clash_rule_parser, moved_priority, target_priority) + except Exception as e: + return {"success": False, "message": str(e)} + return {"success": True, "message": None} + + def update_rules(self, params: Dict[str, Any]): + if not self._enabled: + return {"success": False, "message": ""} + if params.get('type') == 'ruleset': + self.__update_rules(params.get('rules'), self._ruleset_rule_parser) + else: + self.__update_rules(params.get('rules'), self._clash_rule_parser) + return {"success": True, "message": None} + + def update_rule(self, params: Dict[str, Any]) -> Dict[str, Any]: + if not self._enabled: + return {"success": False, "message": ""} + if params.get('type') == 'ruleset': + res = self.update_rule_by_priority(params.get('rule_data'), self._ruleset_rule_parser) + if res: + self.__add_notification_job(f"{self._ruleset_prefix}{params.get('rule_data').get('action')}") + else: + res = self.update_rule_by_priority(params.get('rule_data'), self._clash_rule_parser) + return {"success": bool(res), "message": None} + + def add_rule(self, params: Dict[str, Any]) -> Dict[str, Any]: + if not self._enabled: + return {"success": False, "message": ""} + if params.get('type') == 'ruleset': + res = self.add_rule_by_priority(params.get('rule_data'), self._ruleset_rule_parser) + if res: + self.__add_notification_job(f"{self._ruleset_prefix}{params.get('rule_data').get('action')}") + else: + res = self.add_rule_by_priority(params.get('rule_data'), self._clash_rule_parser) + return {"success": bool(res), "message": None} + + def get_subscription(self): + if not self._sub_links: + return None + return {"success": True, "message": None, "data": {"url": self._sub_links[0]}} + + def update_subscription(self, params: Dict[str, Any]): + if not self._enabled: + return {"success": False, "message": ""} + url = params.get('url') + if not url: + return {"success": False, "message": "missing params"} + res = self.update_subscription_service() + if not res: + return {"success": True, "message": f"订阅链接 {self._sub_links[0]} 更新失败"} + return {"success": True, "message": "订阅更新成功"} + + def get_rule_providers(self): + return {"success": True, "message": None, "data": self.rule_providers()} + + @staticmethod + def clash_outbound(clash_config: Dict[str, Any]) -> Optional[List]: + if not clash_config: + return [] + outbound = [{'name': proxy_group.get("name")} for proxy_group in clash_config.get("proxy-groups")] + outbound.extend([{'name': proxy.get("name")} for proxy in clash_config.get("proxies")]) + return outbound + + def rule_providers(self) -> Optional[Dict[str, Any]]: + if not self._clash_config: + return None + rule_providers = {} + for key, value in self._clash_config.get("rule-providers", {}): + if value.get("path", '').startwith("./CRP/"): + continue + rule_providers[key] = value + return rule_providers + + def __update_rules(self, rules: List[Dict[str, Any]], rule_parser: ClashRuleParser): + rule_parser.rules = [] + for rule in rules: + clash_rule = ClashRuleParser.parse_rule_dict(rule) + rule_parser.insert_rule_at_priority(clash_rule, rule.get("priority")) + self.__save_data() + + def __reorder_rules(self, rule_parser: ClashRuleParser, moved_priority, target_priority): + rule_parser.reorder_rules(moved_priority, target_priority) + self.__save_data() + + def __get_ruleset(self, ruleset: str) -> List[str]: + if ruleset.startswith(self._ruleset_prefix): + action = ruleset[len(self._ruleset_prefix):] + else: + return [] + try: + action_enum = Action(action.upper()) + final_action = action_enum + except ValueError: + final_action = action + rules = self._ruleset_rule_parser.filter_rules_by_action(final_action) + res = [] + for rule in rules: + res.append(rule.condition_string()) + return res + + def __insert_ruleset(self): + outbounds = [] + for rule in self._ruleset_rule_parser.rules: + action_str = f"{rule.action.value}" if isinstance(rule.action, Action) else rule.action + if action_str not in outbounds: + outbounds.append(action_str) + self._clash_rule_parser.remove_rules(lambda r: r.rule_type == RuleType.RULE_SET and + r.payload.startswith(self._ruleset_prefix)) + for outbound in outbounds: + clash_rule = ClashRuleParser.parse_rule_line(f"RULE-SET,{self._ruleset_prefix}{outbound},{outbound}") + if not self._clash_rule_parser.has_rule(clash_rule): + self._clash_rule_parser.insert_rule_at_priority(clash_rule, 0) + + def update_rule_by_priority(self, rule: Dict[str, Any], rule_parser: ClashRuleParser) -> bool: + if not isinstance(rule.get("priority"), int): + return False + clash_rule = ClashRuleParser.parse_rule_dict(rule) + if not clash_rule: + return False + res = rule_parser.update_rule_at_priority(clash_rule, rule.get("priority")) + self.__save_data() + return res + + def add_rule_by_priority(self, rule: Dict[str, Any], rule_parser: ClashRuleParser) -> bool: + if not isinstance(rule.get("priority"), int): + return False + try: + clash_rule = self._clash_rule_parser.parse_rule_dict(rule) + except ValueError: + logger.warn(f"无效的输入规则: {rule}") + return False + if not clash_rule: + return False + rule_parser.insert_rule_at_priority(clash_rule, rule.get("priority")) + self.__save_data() + return True + + def delete_rule_by_priority(self, priority: int, rule_parser: ClashRuleParser + ) -> Optional[Union[ClashRule, LogicRule, MatchRule]]: + if not isinstance(priority, int): + return None + res = rule_parser.remove_rule_at_priority(priority) + self.__save_data() + return res + + @eventmanager.register(EventType.PluginAction) + def update_subscription_service(self) -> bool: + if not self._sub_links: + return False + url = self._sub_links[0] + ret = RequestUtils(accept_type="text/html", + proxies=settings.PROXY if self._proxy else None + ).get_res(url) + if not ret: + return False + try: + rs = yaml.load(ret.content, Loader=yaml.FullLoader) + self._clash_config = self.__remove_nodes_by_keywords(rs) + except Exception as e: + logger.error(f"解析配置出错: {e}") + return False + if 'Subscription-Userinfo' in ret.headers: + matches = re.findall(r'(\w+)=(\d+)', ret.headers['Subscription-Userinfo']) + variables = {key: int(value) for key, value in matches} + self._subscription_info['download'] = variables['download'] + self._subscription_info['upload'] = variables['upload'] + self._subscription_info['total'] = variables['total'] + self._subscription_info['expire'] = variables['expire'] + self._subscription_info["last_update"] = int(time.time()) + self.save_data('subscription_info', self._subscription_info) + self.save_data('clash_config', self._clash_config) + return True + + def notify_clash(self, ruleset: str): + url = f'{self._clash_dashboard_url}/providers/rules/{ruleset}' + RequestUtils(content_type="application/json", + headers={"authorization": f"Bearer {self._clash_dashboard_secret}"} + ).put(url) + + def __add_notification_job(self, ruleset: str): + if ruleset in self._rule_provider: + self._scheduler.add_job(self.notify_clash, "date", + run_date=datetime.now(tz=pytz.timezone(settings.TZ)) + timedelta(seconds=30), + args=[ruleset], + id='CRP-notify-clash', + replace_existing=True + ) + + def __remove_nodes_by_keywords(self, clash_config: Dict[str, Any]) -> Dict[str, Any]: + removed_proxies = [] + proxies = [] + for proxy in clash_config.get("proxies", []): + has_keywords = bool(len([x for x in self._filter_keywords if x in proxy.get("name", '')])) + if has_keywords: + removed_proxies.append(proxy.get("name")) + else: + proxies.append(proxy) + if proxies: + clash_config["proxies"] = proxies + else: + logger.warn(f"关键词过滤后无可用节点,跳过过滤") + removed_proxies = [] + for proxy_group in clash_config.get("proxy-groups", []): + proxy_group['proxies'] = [x for x in proxy_group.get('proxies') if x not in removed_proxies] + clash_config["proxy-groups"] = [x for x in clash_config.get("proxy-groups", []) if x.get("proxies")] + return clash_config + + def clash_config(self) -> Optional[Dict[str, Any]]: + if not self._clash_config: + return + self.__insert_ruleset() + self._top_rules = self._clash_rule_parser.to_string() + clash_config = self._clash_config.copy() + top_rules = [] + for rule in self._clash_rule_parser.rules: + if (not isinstance(rule.action, Action) and + not len([x for x in self.clash_outbound(clash_config) if rule.action == x.get("name", '')])): + logger.warn(f"出站 {rule.action} 不存在, 绕过 {rule.raw_rule}") + continue + top_rules.append(rule.raw_rule) + clash_config["rules"] = self._top_rules + clash_config.get("rules", []) + self._rule_provider = {} + for r in self._clash_rule_parser.rules: + if r.rule_type == RuleType.RULE_SET and r.payload.startswith(self._ruleset_prefix): + action_str = f"{r.action.value}" if isinstance(r.action, Action) else r.action + path_name = hashlib.sha256(action_str.encode('utf-8')).hexdigest()[:10] + self._ruleset_names[path_name] = r.payload + sub_url = (f"{self._movie_pilot_url}/api/v1/plugin/ClashRuleProvider/ruleset?" + f"name={path_name}&apikey={settings.API_TOKEN}") + self._rule_provider[r.payload] = {"behavior": "classical", + "format": "yaml", + "interval": 3600, + "path": f"./CRP/{path_name}.yaml", + "type": "http", + "url": sub_url} + if clash_config.get("rule-providers"): + clash_config['rule-providers'].update(self._rule_provider) + else: + clash_config['rule-providers'] = self._rule_provider + for key, item in self._ruleset_names.items(): + if item not in clash_config['rule-providers']: + del self._ruleset_names[key] + self.save_data('ruleset_names', self._ruleset_names) + self.save_data('rule_provider', self._rule_provider) + return clash_config diff --git a/plugins.v2/clashruleprovider/clash_rule_parser.py b/plugins.v2/clashruleprovider/clash_rule_parser.py new file mode 100644 index 0000000..071d427 --- /dev/null +++ b/plugins.v2/clashruleprovider/clash_rule_parser.py @@ -0,0 +1,486 @@ +import re +from typing import List, Dict, Any, Optional, Union, Callable +from dataclasses import dataclass +from enum import Enum + + +class RuleType(Enum): + """Enumeration of all supported Clash rule types""" + DOMAIN = "DOMAIN" + DOMAIN_SUFFIX = "DOMAIN-SUFFIX" + DOMAIN_KEYWORD = "DOMAIN-KEYWORD" + DOMAIN_REGEX = "DOMAIN-REGEX" + GEOSITE = "GEOSITE" + + IP_CIDR = "IP-CIDR" + IP_CIDR6 = "IP-CIDR6" + IP_SUFFIX = "IP-SUFFIX" + IP_ASN = "IP-ASN" + GEOIP = "GEOIP" + + SRC_GEOIP = "SRC-GEOIP" + SRC_IP_ASN = "SRC-IP-ASN" + SRC_IP_CIDR = "SRC-IP-CIDR" + SRC_IP_SUFFIX = "SRC-IP-SUFFIX" + + DST_PORT = "DST-PORT" + SRC_PORT = "SRC-PORT" + + IN_PORT = "IN-PORT" + IN_TYPE = "IN-TYPE" + IN_USER = "IN-USER" + IN_NAME = "IN-NAME" + + PROCESS_PATH = "PROCESS-PATH" + PROCESS_PATH_REGEX = "PROCESS-PATH-REGEX" + PROCESS_NAME = "PROCESS-NAME" + PROCESS_NAME_REGEX = "PROCESS-NAME-REGEX" + + UID = "UID" + NETWORK = "NETWORK" + DSCP = "DSCP" + + RULE_SET = "RULE-SET" + AND = "AND" + OR = "OR" + NOT = "NOT" + SUB_RULE = "SUB-RULE" + + MATCH = "MATCH" + + +class Action(Enum): + """Enumeration of rule actions""" + DIRECT = "DIRECT" + REJECT = "REJECT" + REJECT_DROP = "REJECT-DROP" + PASS = "PASS" + COMPATIBLE = "COMPATIBLE" + + +@dataclass +class ClashRule: + """Represents a parsed Clash routing rule""" + rule_type: RuleType + payload: str + action: Union[Action, str] # Can be Action enum or custom proxy group name + additional_params: Optional[List[str]] = None + raw_rule: str = "" + priority: int = 0 + + def __post_init__(self): + if self.additional_params is None: + self.additional_params = [] + + def condition_string(self) -> str: + return f"{self.rule_type.value},{self.payload}" + + +@dataclass +class LogicRule: + """Represents a logic rule (AND, OR, NOT)""" + logic_type: RuleType + conditions: List[Union[ClashRule, 'LogicRule']] + action: Union[Action, str] + raw_rule: str = "" + priority: int = 0 + + def condition_string(self) -> str: + conditions_str = ','.join([f"({c.condition_string()})" for c in self.conditions]) + return f"{self.logic_type.value},({conditions_str})" + + +@dataclass +class MatchRule: + """Represents a match rule""" + action: Union[Action, str] + raw_rule: str = "" + priority: int = 0 + rule_type: RuleType = RuleType.MATCH + + @staticmethod + def condition_string() -> str: + return "MATCH" + + +class ClashRuleParser: + """Parser for Clash routing rules""" + + def __init__(self): + self.rules: List[Union[ClashRule, LogicRule, MatchRule]] = [] + + @staticmethod + def parse_rule_line(line: str) -> Optional[Union[ClashRule, LogicRule, MatchRule]]: + """Parse a single rule line""" + line = line.strip() + try: + # Handle logic rules (AND, OR, NOT) + + if line.startswith(('AND,', 'OR,', 'NOT,')): + return ClashRuleParser._parse_logic_rule(line) + elif line.startswith('MATCH'): + return ClashRuleParser._parse_match_rule(line) + # Handle regular rules + return ClashRuleParser._parse_regular_rule(line) + + except Exception as e: + print(f"Error parsing rule '{line}': {e}") + return None + + @staticmethod + def parse_rule_dict(clash_rule: Dict[str, Any]) -> Optional[Union[ClashRule, LogicRule, MatchRule]]: + if not clash_rule: + return None + if clash_rule.get("type") in ('AND', 'OR', 'NOT'): + conditions = clash_rule.get("conditions") + if not conditions: + return None + conditions_str = '' + for condition in conditions: + conditions_str += f'({condition.get("type")},{condition.get("payload")})' + conditions_str = f"({conditions_str})" + raw_rule = f"{clash_rule.get('type')},{conditions_str},{clash_rule.get('action')}" + return ClashRuleParser._parse_logic_rule(raw_rule) + elif clash_rule.get("type") == 'MATCH': + raw_rule = f"{clash_rule.get('type')},{clash_rule.get('action')}" + return ClashRuleParser._parse_match_rule(raw_rule) + else: + raw_rule = f"{clash_rule.get('type')},{clash_rule.get('payload')},{clash_rule.get('action')}" + return ClashRuleParser._parse_regular_rule(raw_rule) + + @staticmethod + def _parse_match_rule(line: str) -> MatchRule: + parts = line.split(',') + if len(parts) < 2: + raise ValueError(f"Invalid rule format: {line}") + action = parts[1] + # Validate rule type + try: + action_enum = Action(action.upper()) + final_action = action_enum + except ValueError: + final_action = action + + return MatchRule( + action=final_action, + raw_rule=line + ) + + @staticmethod + def _parse_regular_rule(line: str) -> ClashRule: + """Parse a regular (non-logic) rule""" + parts = line.split(',') + + if len(parts) < 3: + raise ValueError(f"Invalid rule format: {line}") + + rule_type_str = parts[0].upper() + payload = parts[1] + action = parts[2] + + if not payload or not rule_type_str: + raise ValueError(f"Invalid rule format: {line}") + + additional_params = parts[3:] if len(parts) > 3 else [] + + # Validate rule type + try: + rule_type = RuleType(rule_type_str) + except ValueError: + raise ValueError(f"Unknown rule type: {rule_type_str}") + + # Try to convert action to enum, otherwise keep as string (custom proxy group) + try: + action_enum = Action(action.upper()) + final_action = action_enum + except ValueError: + final_action = action + + return ClashRule( + rule_type=rule_type, + payload=payload, + action=final_action, + additional_params=additional_params, + raw_rule=line + ) + + @staticmethod + def _parse_logic_rule(line: str) -> LogicRule: + """Parse a logic rule (AND, OR, NOT)""" + # Extract logic type + logic_rule_match = re.match(r'^(AND|OR|NOT),\((.+)\),([^,]+)$', line) + if not logic_rule_match: + raise ValueError(f"Cannot extract action from logic rule: {line}") + logic_type_str = logic_rule_match.group(1).upper() + logic_type = RuleType(logic_type_str) + action = logic_rule_match.group(3) + # Try to convert action to enum + try: + action_enum = Action(action.upper()) + final_action = action_enum + except ValueError: + final_action = action + conditions_str = logic_rule_match.group(2) + conditions = ClashRuleParser._parse_logic_conditions(conditions_str) + + return LogicRule( + logic_type=logic_type, + conditions=conditions, + action=final_action, + raw_rule=line + ) + + @staticmethod + def _parse_logic_conditions(conditions_str: str) -> List[ClashRule]: + """Parse conditions within logic rules""" + conditions = [] + + # Simple parser for conditions like (DOMAIN,baidu.com),(NETWORK,UDP) + # This is a basic implementation - more complex nested logic would need a proper parser + condition_pattern = r'\(([^,]+),([^)]+)\)' + matches = re.findall(condition_pattern, conditions_str) + + for rule_type_str, payload in matches: + try: + rule_type = RuleType(rule_type_str.upper()) + condition = ClashRule( + rule_type=rule_type, + payload=payload, + action="", # Logic conditions don't have actions + raw_rule=f"{rule_type_str},{payload}" + ) + conditions.append(condition) + except ValueError: + print(f"Unknown rule type in logic condition: {rule_type_str}") + + return conditions + + def parse_rules(self, rules_text: str) -> List[Union[ClashRule, LogicRule, MatchRule]]: + """Parse multiple rules from text, preserving order and priority""" + self.rules = [] + lines = rules_text.strip().split('\n') + priority = 0 + + for line in lines: + rule = self.parse_rule_line(line) + if rule: + rule.priority = priority # Assign priority based on position + self.rules.append(rule) + priority += 1 + + return self.rules + + def parse_rules_from_list(self, rules_list: List[str]) -> List[Union[ClashRule, LogicRule, MatchRule]]: + """Parse rules from a list of rule strings, preserving order and priority""" + self.rules = [] + + for priority, rule_str in enumerate(rules_list): + rule = self.parse_rule_line(rule_str) + if rule: + rule.priority = priority # Assign priority based on list position + self.rules.append(rule) + + return self.rules + + def validate_rule(self, rule: ClashRule) -> bool: + """Validate a parsed rule""" + try: + # Basic validation based on rule type + if rule.rule_type in [RuleType.IP_CIDR, RuleType.IP_CIDR6]: + # Validate CIDR format + return '/' in rule.payload + + elif rule.rule_type == RuleType.DST_PORT or rule.rule_type == RuleType.SRC_PORT: + # Validate port number/range + return rule.payload.isdigit() or '-' in rule.payload + + elif rule.rule_type == RuleType.NETWORK: + # Validate network type + return rule.payload.lower() in ['tcp', 'udp'] + + elif rule.rule_type == RuleType.DOMAIN_REGEX or rule.rule_type == RuleType.PROCESS_PATH_REGEX: + # Try to compile regex + re.compile(rule.payload) + return True + + return True + + except Exception: + return False + + def to_string(self) -> List[str]: + result = [] + for rule in self.rules: + result.append(rule.raw_rule) + return result + + def to_dict(self) -> List[Dict[str, Any]]: + """Convert parsed rules to dictionary format""" + result = [] + + for rule in self.rules: + if isinstance(rule, ClashRule): + rule_dict = { + 'type': rule.rule_type.value, + 'payload': rule.payload, + 'action': rule.action.value if isinstance(rule.action, Action) else rule.action, + 'additional_params': rule.additional_params, + 'priority': rule.priority, + 'raw': rule.raw_rule + } + result.append(rule_dict) + + elif isinstance(rule, LogicRule): + conditions_dict = [] + for condition in rule.conditions: + if isinstance(condition, ClashRule): + conditions_dict.append({ + 'type': condition.rule_type.value, + 'payload': condition.payload + }) + + rule_dict = { + 'type': rule.logic_type.value, + 'conditions': conditions_dict, + 'action': rule.action.value if isinstance(rule.action, Action) else rule.action, + 'priority': rule.priority, + 'raw': rule.raw_rule + } + result.append(rule_dict) + elif isinstance(rule, MatchRule): + rule_dict = { + 'type': 'MATCH', + 'action': rule.action.value if isinstance(rule.action, Action) else rule.action, + 'priority': rule.priority, + 'raw': rule.raw_rule + } + result.append(rule_dict) + return result + + def get_rules_by_priority(self) -> List[Union[ClashRule, LogicRule, MatchRule]]: + """Get rules sorted by priority (highest priority first)""" + return sorted(self.rules, key=lambda rule: rule.priority) + + def append_rule(self, rule: Union[ClashRule, LogicRule, MatchRule]) -> None: + max_priority = max(rule.priority for rule in self.rules) if len(self.rules) else 0 + rule.priority = max_priority + 1 + self.rules.append(rule) + # Re-sort rules to maintain order + self.rules.sort(key=lambda r: r.priority) + + def insert_rule_at_priority(self, rule: Union[ClashRule, LogicRule, MatchRule], priority: int): + """Insert a rule at a specific priority position, adjusting other rules""" + # Adjust priorities of existing rules + for existing_rule in self.rules: + if existing_rule.priority >= priority: + existing_rule.priority += 1 + rule.priority = priority + self.rules.append(rule) + + # Re-sort rules to maintain order + self.rules.sort(key=lambda r: r.priority) + + def update_rule_at_priority(self, clash_rule: Union[ClashRule, LogicRule], priority: int) -> bool: + for index, existing_rule in enumerate(self.rules): + if existing_rule.priority == priority: + self.rules[index] = clash_rule + self.rules[index].priority = priority + return True + return False + + def remove_rule_at_priority(self, priority: int) -> Optional[Union[ClashRule, LogicRule, MatchRule]]: + """Remove rule at specific priority and adjust remaining priorities""" + rule_to_remove = None + for rule in self.rules: + if rule.priority == priority: + rule_to_remove = rule + break + + if rule_to_remove: + self.rules.remove(rule_to_remove) + + # Adjust priorities of remaining rules + for rule in self.rules: + if rule.priority > priority: + rule.priority -= 1 + + return rule_to_remove + return None + + def remove_rules(self, condition: Callable[[Union[ClashRule, LogicRule, MatchRule]], bool]): + """Remove rules by lambda""" + i = 0 + while i < len(self.rules): + if condition(self.rules[i]): + priority = self.rules[i].priority + for rule in self.rules: + if rule.priority > priority: + rule.priority -= 1 + del self.rules[i] + else: + i += 1 + + def move_rule_priority(self, from_priority: int, to_priority: int) -> bool: + """Move a rule from one priority position to another""" + rule_to_move = None + for rule in self.rules: + if rule.priority == from_priority: + rule_to_move = rule + break + + if not rule_to_move: + return False + + # Remove rule temporarily + self.remove_rule_at_priority(from_priority) + + # Insert at new priority + self.insert_rule_at_priority(rule_to_move, to_priority) + + return True + + def filter_rules_by_type(self, rule_type: RuleType) -> List[ClashRule]: + """Filter rules by type""" + return [rule for rule in self.rules + if isinstance(rule, ClashRule) and rule.rule_type == rule_type] + + def filter_rules_by_action(self, action: Union[Action, str]) -> List[Union[ClashRule, LogicRule, MatchRule]]: + """Filter rules by action""" + return [rule for rule in self.rules if rule.action == action] + + def has_rule(self, clash_rule: Union[ClashRule, LogicRule, MatchRule]) -> bool: + for rule in self.rules: + if rule.rule_type == clash_rule.rule_type and rule.action == clash_rule.action \ + and rule.payload == clash_rule.payload: + return True + return False + + def reorder_rules( + self, + moved_rule_priority: int, + target_priority: int, + ): + """ + Reorder rules + + :param moved_rule_priority: 被移动规则的原始优先级 + :param target_priority: 目标位置的优先级 + """ + moved_index = next(i for i, r in enumerate(self.rules) if r.priority == moved_rule_priority) + target_index = next( + (i for i, r in enumerate(self.rules) if r.priority == target_priority), + len(self.rules) + ) + # 直接修改被移动规则的优先级 + moved_rule = self.rules[moved_index] + moved_rule.priority = target_priority + + if moved_index < target_index: + # 向后移动:原位置到目标位置之间的规则优先级 -1 + for i in range(moved_index + 1, target_index + 1): + self.rules[i].priority -= 1 + elif moved_index > target_index: + # 向前移动:目标位置到原位置之间的规则优先级 +1 + for i in range(target_index, moved_index): + self.rules[i].priority += 1 + self.rules.sort(key=lambda x: x.priority) From 1537be08449bffd67c28f7b7b9449dd60962a308 Mon Sep 17 00:00:00 2001 From: wumode Date: Thu, 29 May 2025 18:17:51 +0800 Subject: [PATCH 25/46] =?UTF-8?q?update(ImdbSource):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E6=8E=92=E5=BA=8F=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 3 ++- plugins.v2/imdbsource/__init__.py | 17 ++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.v2.json b/package.v2.json index f65a1a1..ddc2058 100644 --- a/package.v2.json +++ b/package.v2.json @@ -425,11 +425,12 @@ "name": "IMDb源", "description": "让探索支持IMDb数据源。", "labels": "探索", - "version": "1.3", + "version": "1.3.1", "icon": "IMDb_IOS-OSX_App.png", "author": "wumode", "level": 1, "history": { + "v1.3.1": "修复按日期排序错误", "v1.3": "优化网络连接", "v1.2": "推荐热门纪录片", "v1.1": "推荐支持IMDB数据源; 优化海报尺寸,减少卡顿", diff --git a/plugins.v2/imdbsource/__init__.py b/plugins.v2/imdbsource/__init__.py index 817dd45..770a72e 100644 --- a/plugins.v2/imdbsource/__init__.py +++ b/plugins.v2/imdbsource/__init__.py @@ -1,6 +1,7 @@ import re import json from typing import Optional, Any, List, Dict, Tuple +from datetime import datetime from app.core.config import settings from app.core.event import eventmanager, Event @@ -24,7 +25,7 @@ class ImdbSource(_PluginBase): plugin_icon = ("https://raw.githubusercontent.com/jxxghp/" "MoviePilot-Plugins/refs/heads/main/icons/IMDb_IOS-OSX_App.png") # 插件版本 - plugin_version = "1.3" + plugin_version = "1.3.1" # 插件作者 plugin_author = "wumode" # 作者主页 @@ -607,6 +608,8 @@ class ImdbSource(_PluginBase): elif year == "1970s": release_date_start = "1970-01-01" release_date_end = "1979-12-31" + if not release_date_end: + release_date_end = datetime.now().date().strftime("%Y-%m-%d") awards = (award,) if award else None ranked_lists = (ranked_list,) if ranked_list else None first_page = False @@ -644,17 +647,13 @@ class ImdbSource(_PluginBase): if mtype == "movies": for movie in results: movie_info = movie.get('node').get("title") - pub_status = movie_info.get("productionStatus") - if pub_status and pub_status.get("currentProductionStage"): - if pub_status.get("currentProductionStage", {}).get("id") == 'released': - res.append(self.__movie_to_media(movie_info)) + res.append(self.__movie_to_media(movie_info)) + else: for tv in results: tv_info = tv.get('node').get('title') - pub_status = tv_info.get("productionStatus") - if pub_status and pub_status.get("currentProductionStage"): - if pub_status.get("currentProductionStage", {}).get("id") == 'released': - res.append(self.__series_to_media(tv_info)) + res.append(self.__series_to_media(tv_info)) + return res def get_api(self) -> List[Dict[str, Any]]: From 7ef7a73c7c46d492e22f81e332870d5564e26453 Mon Sep 17 00:00:00 2001 From: wumode Date: Thu, 29 May 2025 18:39:17 +0800 Subject: [PATCH 26/46] add: ClashRuleProvider --- .../__federation_expose_Config-C3BpNVeC.js | 828 + .../__federation_expose_Config-DXzIavcD.css | 5 + .../__federation_expose_Dashboard-BkyO-3pr.js | 40514 ++++++++++++++++ .../__federation_expose_Page-Bl7XNZ7k.css | 48 + .../__federation_expose_Page-DlQgf7u6.js | 1118 + .../assets/__federation_fn_import-JrT3xvdd.js | 418 + .../styles-I7amCcZu.css | 17409 +++++++ .../_plugin-vue_export-helper-pcqpp-6-.js | 9 + .../dist/assets/date--mM7W7--.js | 3498 ++ .../dist/assets/index-B8APBpoy.css | 458 + .../dist/assets/index-Bff29tuV.js | 24938 ++++++++++ .../dist/assets/remoteEntry.js | 87 + .../runtime-core.esm-bundler-BQhfUSSX.js | 8546 ++++ plugins.v2/clashruleprovider/dist/index.html | 34 + 14 files changed, 97910 insertions(+) create mode 100644 plugins.v2/clashruleprovider/dist/assets/__federation_expose_Config-C3BpNVeC.js create mode 100644 plugins.v2/clashruleprovider/dist/assets/__federation_expose_Config-DXzIavcD.css create mode 100644 plugins.v2/clashruleprovider/dist/assets/__federation_expose_Dashboard-BkyO-3pr.js create mode 100644 plugins.v2/clashruleprovider/dist/assets/__federation_expose_Page-Bl7XNZ7k.css create mode 100644 plugins.v2/clashruleprovider/dist/assets/__federation_expose_Page-DlQgf7u6.js create mode 100644 plugins.v2/clashruleprovider/dist/assets/__federation_fn_import-JrT3xvdd.js create mode 100644 plugins.v2/clashruleprovider/dist/assets/__federation_shared_vuetify/styles-I7amCcZu.css create mode 100644 plugins.v2/clashruleprovider/dist/assets/_plugin-vue_export-helper-pcqpp-6-.js create mode 100644 plugins.v2/clashruleprovider/dist/assets/date--mM7W7--.js create mode 100644 plugins.v2/clashruleprovider/dist/assets/index-B8APBpoy.css create mode 100644 plugins.v2/clashruleprovider/dist/assets/index-Bff29tuV.js create mode 100644 plugins.v2/clashruleprovider/dist/assets/remoteEntry.js create mode 100644 plugins.v2/clashruleprovider/dist/assets/runtime-core.esm-bundler-BQhfUSSX.js create mode 100644 plugins.v2/clashruleprovider/dist/index.html diff --git a/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Config-C3BpNVeC.js b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Config-C3BpNVeC.js new file mode 100644 index 0000000..786195d --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Config-C3BpNVeC.js @@ -0,0 +1,828 @@ +import { importShared } from './__federation_fn_import-JrT3xvdd.js'; +import { _ as _export_sfc } from './_plugin-vue_export-helper-pcqpp-6-.js'; + +const {createTextVNode:_createTextVNode,resolveComponent:_resolveComponent,withCtx:_withCtx,createVNode:_createVNode,toDisplayString:_toDisplayString,openBlock:_openBlock,createBlock:_createBlock,createCommentVNode:_createCommentVNode,createElementVNode:_createElementVNode,mergeProps:_mergeProps,withModifiers:_withModifiers,createElementBlock:_createElementBlock} = await importShared('vue'); + + +const _hoisted_1 = { class: "plugin-config" }; +const _hoisted_2 = { class: "d-flex align-center" }; +const _hoisted_3 = { class: "font-weight-medium" }; +const _hoisted_4 = { class: "text-body-2" }; + +const {ref,reactive,onMounted,computed} = await importShared('vue'); + + +// Props + +const _sfc_main = { + __name: 'Config', + props: { + initialConfig: { + type: Object, + default: () => ({}), + }, + api: { + type: Object, + default: () => { + }, + }, +}, + emits: ['save', 'close'], + setup(__props, { emit: __emit }) { + +const props = __props; + +// 状态变量 +const form = ref(null); +const isFormValid = ref(true); +const error = ref(null); +const saving = ref(false); +const testing = ref(false); +const showClashSecret = ref(false); +const selectedCronOption = ref('6hours'); + +// Test result state +const testResult = reactive({ + show: false, + success: false, + title: '', + message: '' +}); + +// Cron 选项 +const cronOptions = [ + {text: '每5分钟', value: '5min', cron: '*/5 * * * *'}, + {text: '每15分钟', value: '15min', cron: '*/15 * * * *'}, + {text: '每30分钟', value: '30min', cron: '*/30 * * * *'}, + {text: '每小时', value: '1hour', cron: '0 * * * *'}, + {text: '每2小时', value: '2hours', cron: '0 */2 * * *'}, + {text: '每6小时', value: '6hours', cron: '0 */6 * * *'}, + {text: '每12小时', value: '12hours', cron: '0 */12 * * *'}, + {text: '每天', value: '1day', cron: '0 0 * * *'}, + {text: '自定义', value: 'custom', cron: ''}, +]; + +// 默认配置 +const defaultConfig = { + enabled: false, + sub_links: [], + filter_keywords: ["公益性", "高延迟", "域名", "官网", "重启", "过期时间", "系统代理"], + clash_dashboard_url: '', + clash_dashboard_secret: '', + movie_pilot_url: '', + cron_string: '0 */6 * * *', + timeout: 10, + retry_times: 3, + proxy: false, + notify: false, + auto_update_subscriptions: true, + ruleset_prefix: '📂<-', +}; + +// 响应式配置对象 +const config = reactive({...defaultConfig}); + +// 自定义事件 +const emit = __emit; + +// 初始化 +onMounted(() => { + if (props.initialConfig) { + Object.keys(props.initialConfig).forEach(key => { + if (key in config) { + config[key] = props.initialConfig[key]; + } + }); + + // 设置对应的cron选项 + const cronOption = cronOptions.find(option => option.cron === config.cron_string); + if (cronOption) { + selectedCronOption.value = cronOption.value; + } else { + selectedCronOption.value = 'custom'; + } + } +}); + +// 验证函数 +function isValidUrl(url) { + try { + new URL(url); + return true + } catch { + return false + } +} + +function validateSubLinks(links) { + if (!links || links.length === 0) { + return '至少需要一个订阅链接' + } + + for (const link of links) { + if (!isValidUrl(link)) { + return `无效的订阅链接: ${link}` + } + } + return true +} + +function validateCronExpression(cronStr) { + if (!cronStr) return '请输入Cron表达式' + + // 简单的cron表达式验证 + const parts = cronStr.trim().split(/\s+/); + if (parts.length !== 5) { + return 'Cron表达式应包含5个部分 (分 时 日 月 周)' + } + return true +} + +// 更新cron字符串 +function updateCronString(optionValue) { + const option = cronOptions.find(opt => opt.value === optionValue); + if (option && option.cron) { + config.cron_string = option.cron; + } +} + +// 测试连接 +async function testConnection() { + testing.value = true; + error.value = null; + testResult.show = false; + + try { + // 验证必需的参数 + if (!config.clash_dashboard_url) { + throw new Error('请先配置 Clash 面板 URL') + } + if (!config.clash_dashboard_secret) { + throw new Error('请先配置 Clash 面板密钥') + } + if (!config.sub_links || config.sub_links.length === 0) { + throw new Error('请先配置至少一个订阅链接') + } + if (!config.movie_pilot_url || config.movie_pilot_url.length === 0) { + throw new Error('请先MoviePilot链接') + } + // 准备API请求参数 + const testParams = { + clash_dashboard_url: config.clash_dashboard_url, + clash_dashboard_secret: config.clash_dashboard_secret, + sub_link: config.sub_links[0] // 使用第一个订阅链接进行测试 + }; + + // 调用API进行连接测试 + const result = await props.api.post('/plugin/ClashRuleProvider/connectivity', testParams); + + // 根据返回结果显示相应消息 + if (result.success) { + testResult.success = true; + testResult.title = '连接测试成功!'; + testResult.message = 'Clash面板和订阅链接连接正常,配置验证通过'; + testResult.show = true; + + // Auto hide after 5 seconds + setTimeout(() => { + testResult.show = false; + }, 5000); + } else { + throw new Error(result.message || '连接测试失败,请检查配置') + } + + } catch (err) { + console.error('连接测试失败:', err); + testResult.success = false; + testResult.title = '连接测试失败'; + testResult.message = err.message; + testResult.show = true; + } finally { + testing.value = false; + } +} + +// 保存配置 +async function saveConfig() { + if (!isFormValid.value) { + error.value = '请修正表单中的错误'; + return + } + + saving.value = true; + error.value = null; + + try { + await new Promise(resolve => setTimeout(resolve, 1000)); + emit('save', {...config}); + } catch (err) { + console.error('保存配置失败:', err); + error.value = err.message || '保存配置失败'; + } finally { + saving.value = false; + } +} + +function extractDomain(url) { + try { + const domain = new URL(url).hostname; + return domain.startsWith('www.') ? domain.substring(4) : domain + } catch { + return url // 如果解析失败,返回原始URL + } +} + +// 重置表单 +function resetForm() { + Object.keys(defaultConfig).forEach(key => { + config[key] = defaultConfig[key]; + }); + selectedCronOption.value = '6hours'; + + if (form.value) { + form.value.resetValidation(); + } +} + +// 关闭组件 +function notifyClose() { + emit('close'); +} + +// 通知主应用切换到Page页面 +function notifySwitch() { + emit('switch'); +} + +return (_ctx, _cache) => { + const _component_v_card_title = _resolveComponent("v-card-title"); + const _component_v_icon = _resolveComponent("v-icon"); + const _component_v_btn = _resolveComponent("v-btn"); + const _component_v_card_item = _resolveComponent("v-card-item"); + const _component_v_alert = _resolveComponent("v-alert"); + const _component_v_switch = _resolveComponent("v-switch"); + const _component_v_col = _resolveComponent("v-col"); + const _component_v_row = _resolveComponent("v-row"); + const _component_v_chip = _resolveComponent("v-chip"); + const _component_v_combobox = _resolveComponent("v-combobox"); + const _component_v_text_field = _resolveComponent("v-text-field"); + const _component_v_select = _resolveComponent("v-select"); + const _component_v_expansion_panel_title = _resolveComponent("v-expansion-panel-title"); + const _component_v_expansion_panel_text = _resolveComponent("v-expansion-panel-text"); + const _component_v_expansion_panel = _resolveComponent("v-expansion-panel"); + const _component_v_expansion_panels = _resolveComponent("v-expansion-panels"); + const _component_v_form = _resolveComponent("v-form"); + const _component_v_card_text = _resolveComponent("v-card-text"); + const _component_v_spacer = _resolveComponent("v-spacer"); + const _component_v_card_actions = _resolveComponent("v-card-actions"); + const _component_v_card = _resolveComponent("v-card"); + + return (_openBlock(), _createElementBlock("div", _hoisted_1, [ + _createVNode(_component_v_card, null, { + default: _withCtx(() => [ + _createVNode(_component_v_card_item, null, { + append: _withCtx(() => [ + _createVNode(_component_v_btn, { + icon: "", + color: "primary", + variant: "text", + onClick: notifyClose + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { left: "" }, { + default: _withCtx(() => _cache[18] || (_cache[18] = [ + _createTextVNode("mdi-close") + ])), + _: 1 + }) + ]), + _: 1 + }) + ]), + default: _withCtx(() => [ + _createVNode(_component_v_card_title, null, { + default: _withCtx(() => _cache[17] || (_cache[17] = [ + _createTextVNode("Clash Rule Provider 插件配置") + ])), + _: 1 + }) + ]), + _: 1 + }), + _createVNode(_component_v_card_text, { class: "overflow-y-auto" }, { + default: _withCtx(() => [ + (error.value) + ? (_openBlock(), _createBlock(_component_v_alert, { + key: 0, + type: "error", + class: "mb-4" + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(error.value), 1) + ]), + _: 1 + })) + : _createCommentVNode("", true), + _createVNode(_component_v_form, { + ref_key: "form", + ref: form, + modelValue: isFormValid.value, + "onUpdate:modelValue": _cache[15] || (_cache[15] = $event => ((isFormValid).value = $event)), + onSubmit: _withModifiers(saveConfig, ["prevent"]) + }, { + default: _withCtx(() => [ + _cache[28] || (_cache[28] = _createElementVNode("div", { class: "text-subtitle-1 font-weight-bold mt-4 mb-2" }, "基本设置", -1)), + _createVNode(_component_v_row, null, { + default: _withCtx(() => [ + _createVNode(_component_v_col, { + cols: "12", + md: "4" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_switch, { + modelValue: config.enabled, + "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => ((config.enabled) = $event)), + label: "启用插件", + color: "primary", + inset: "", + hint: "启用后插件将开始监控和同步", + "persistent-hint": "" + }, null, 8, ["modelValue"]) + ]), + _: 1 + }), + _createVNode(_component_v_col, { + cols: "12", + md: "4" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_switch, { + modelValue: config.proxy, + "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => ((config.proxy) = $event)), + label: "启用代理", + color: "primary", + inset: "", + hint: "是否使用系统代理进行网络请求", + "persistent-hint": "" + }, null, 8, ["modelValue"]) + ]), + _: 1 + }), + _createVNode(_component_v_col, { + cols: "12", + md: "4" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_switch, { + modelValue: config.notify, + "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => ((config.notify) = $event)), + label: "启用通知", + color: "primary", + inset: "", + hint: "执行完成后发送通知消息", + "persistent-hint": "" + }, null, 8, ["modelValue"]) + ]), + _: 1 + }) + ]), + _: 1 + }), + _cache[29] || (_cache[29] = _createElementVNode("div", { class: "text-subtitle-1 font-weight-bold mt-4 mb-2" }, "订阅配置", -1)), + _createVNode(_component_v_row, null, { + default: _withCtx(() => [ + _createVNode(_component_v_col, { cols: "12" }, { + default: _withCtx(() => [ + _createVNode(_component_v_combobox, { + modelValue: config.sub_links, + "onUpdate:modelValue": _cache[3] || (_cache[3] = $event => ((config.sub_links) = $event)), + label: "订阅链接", + variant: "outlined", + multiple: "", + chips: "", + "closable-chips": "", + hint: "添加一个Clash订阅链接", + "persistent-hint": "", + rules: [validateSubLinks] + }, { + chip: _withCtx(({ props, item }) => [ + _createVNode(_component_v_chip, _mergeProps(props, { + closable: "", + size: "small" + }), { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(extractDomain(item.value)), 1) + ]), + _: 2 + }, 1040) + ]), + _: 1 + }, 8, ["modelValue", "rules"]) + ]), + _: 1 + }), + _createVNode(_component_v_col, { cols: "12" }, { + default: _withCtx(() => [ + _createVNode(_component_v_combobox, { + modelValue: config.filter_keywords, + "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => ((config.filter_keywords) = $event)), + label: "节点过滤关键词", + variant: "outlined", + multiple: "", + chips: "", + "closable-chips": "", + hint: "添加用于过滤节点的关键词", + "persistent-hint": "" + }, { + chip: _withCtx(({ props, item }) => [ + _createVNode(_component_v_chip, _mergeProps(props, { + closable: "", + size: "small", + color: "info" + }), { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(item.value), 1) + ]), + _: 2 + }, 1040) + ]), + _: 1 + }, 8, ["modelValue"]) + ]), + _: 1 + }) + ]), + _: 1 + }), + _cache[30] || (_cache[30] = _createElementVNode("div", { class: "text-subtitle-1 font-weight-bold mt-4 mb-2" }, "Clash 面板设置", -1)), + _createVNode(_component_v_row, null, { + default: _withCtx(() => [ + _createVNode(_component_v_col, { cols: "12" }, { + default: _withCtx(() => [ + _createVNode(_component_v_text_field, { + modelValue: config.clash_dashboard_url, + "onUpdate:modelValue": _cache[5] || (_cache[5] = $event => ((config.clash_dashboard_url) = $event)), + label: "Clash 面板 URL", + variant: "outlined", + placeholder: "http://localhost:9090", + hint: "Clash 控制面板的访问地址", + "persistent-hint": "", + rules: [v => !v || isValidUrl(v) || '请输入有效的URL地址'] + }, { + "prepend-inner": _withCtx(() => [ + _createVNode(_component_v_icon, { color: "primary" }, { + default: _withCtx(() => _cache[19] || (_cache[19] = [ + _createTextVNode("mdi-web") + ])), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue", "rules"]) + ]), + _: 1 + }), + _createVNode(_component_v_col, { cols: "12" }, { + default: _withCtx(() => [ + _createVNode(_component_v_text_field, { + modelValue: config.clash_dashboard_secret, + "onUpdate:modelValue": _cache[6] || (_cache[6] = $event => ((config.clash_dashboard_secret) = $event)), + label: "Clash 面板密钥", + variant: "outlined", + placeholder: "your-clash-secret", + hint: "用于访问Clash API的密钥", + "persistent-hint": "", + "append-inner-icon": showClashSecret.value ? 'mdi-eye-off' : 'mdi-eye', + type: showClashSecret.value ? 'text' : 'password', + "onClick:appendInner": _cache[7] || (_cache[7] = $event => (showClashSecret.value = !showClashSecret.value)) + }, { + "prepend-inner": _withCtx(() => [ + _createVNode(_component_v_icon, { color: "warning" }, { + default: _withCtx(() => _cache[20] || (_cache[20] = [ + _createTextVNode("mdi-key") + ])), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue", "append-inner-icon", "type"]) + ]), + _: 1 + }) + ]), + _: 1 + }), + _cache[31] || (_cache[31] = _createElementVNode("div", { class: "text-subtitle-1 font-weight-bold mt-4 mb-2" }, "MoviePilot 设置", -1)), + _createVNode(_component_v_row, null, { + default: _withCtx(() => [ + _createVNode(_component_v_col, { cols: "12" }, { + default: _withCtx(() => [ + _createVNode(_component_v_text_field, { + modelValue: config.movie_pilot_url, + "onUpdate:modelValue": _cache[8] || (_cache[8] = $event => ((config.movie_pilot_url) = $event)), + label: "MoviePilot URL", + variant: "outlined", + placeholder: "http://localhost:3001", + hint: "MoviePilot 服务的访问地址", + "persistent-hint": "", + rules: [v => !!v || 'MoviePilot URL不能为空', v => isValidUrl(v) || '请输入有效的URL地址'] + }, { + "prepend-inner": _withCtx(() => [ + _createVNode(_component_v_icon, { color: "success" }, { + default: _withCtx(() => _cache[21] || (_cache[21] = [ + _createTextVNode("mdi-movie") + ])), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue", "rules"]) + ]), + _: 1 + }) + ]), + _: 1 + }), + _cache[32] || (_cache[32] = _createElementVNode("div", { class: "text-subtitle-1 font-weight-bold mt-4 mb-2" }, "执行设置", -1)), + _createVNode(_component_v_row, null, { + default: _withCtx(() => [ + _createVNode(_component_v_col, { cols: "12" }, { + default: _withCtx(() => [ + _createVNode(_component_v_select, { + modelValue: selectedCronOption.value, + "onUpdate:modelValue": [ + _cache[9] || (_cache[9] = $event => ((selectedCronOption).value = $event)), + updateCronString + ], + label: "执行周期", + items: cronOptions, + variant: "outlined", + "item-title": "text", + "item-value": "value", + hint: "选择插件执行的时间间隔", + "persistent-hint": "" + }, null, 8, ["modelValue"]) + ]), + _: 1 + }), + (selectedCronOption.value === 'custom') + ? (_openBlock(), _createBlock(_component_v_col, { + key: 0, + cols: "12" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_text_field, { + modelValue: config.cron_string, + "onUpdate:modelValue": _cache[10] || (_cache[10] = $event => ((config.cron_string) = $event)), + label: "自定义 Cron 表达式", + variant: "outlined", + placeholder: "0 */6 * * *", + hint: "使用标准Cron表达式格式 (分 时 日 月 周)", + "persistent-hint": "", + rules: [validateCronExpression] + }, { + "prepend-inner": _withCtx(() => [ + _createVNode(_component_v_icon, { color: "info" }, { + default: _withCtx(() => _cache[22] || (_cache[22] = [ + _createTextVNode("mdi-clock-outline") + ])), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue", "rules"]) + ]), + _: 1 + })) + : _createCommentVNode("", true), + _createVNode(_component_v_col, { + cols: "12", + md: "6" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_text_field, { + modelValue: config.timeout, + "onUpdate:modelValue": _cache[11] || (_cache[11] = $event => ((config.timeout) = $event)), + modelModifiers: { number: true }, + label: "超时时间 (秒)", + variant: "outlined", + type: "number", + min: "1", + max: "300", + hint: "请求的超时时间", + "persistent-hint": "", + rules: [v => v > 0 || '超时时间必须大于0'] + }, { + "prepend-inner": _withCtx(() => [ + _createVNode(_component_v_icon, { color: "warning" }, { + default: _withCtx(() => _cache[23] || (_cache[23] = [ + _createTextVNode("mdi-timer") + ])), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue", "rules"]) + ]), + _: 1 + }), + _createVNode(_component_v_col, { + cols: "12", + md: "6" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_text_field, { + modelValue: config.retry_times, + "onUpdate:modelValue": _cache[12] || (_cache[12] = $event => ((config.retry_times) = $event)), + modelModifiers: { number: true }, + label: "重试次数", + variant: "outlined", + type: "number", + min: "0", + max: "10", + hint: "失败时的重试次数", + "persistent-hint": "", + rules: [v => v >= 0 || '重试次数不能为负数'] + }, { + "prepend-inner": _withCtx(() => [ + _createVNode(_component_v_icon, { color: "info" }, { + default: _withCtx(() => _cache[24] || (_cache[24] = [ + _createTextVNode("mdi-refresh") + ])), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue", "rules"]) + ]), + _: 1 + }) + ]), + _: 1 + }), + _createVNode(_component_v_expansion_panels, { + variant: "accordion", + class: "mt-4" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_expansion_panel, null, { + default: _withCtx(() => [ + _createVNode(_component_v_expansion_panel_title, null, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { class: "mr-2" }, { + default: _withCtx(() => _cache[25] || (_cache[25] = [ + _createTextVNode("mdi-cog") + ])), + _: 1 + }), + _cache[26] || (_cache[26] = _createTextVNode(" 高级选项 ")) + ]), + _: 1 + }), + _createVNode(_component_v_expansion_panel_text, null, { + default: _withCtx(() => [ + _createVNode(_component_v_row, null, { + default: _withCtx(() => [ + _createVNode(_component_v_col, { cols: "12" }, { + default: _withCtx(() => [ + _createVNode(_component_v_switch, { + modelValue: config.auto_update_subscriptions, + "onUpdate:modelValue": _cache[13] || (_cache[13] = $event => ((config.auto_update_subscriptions) = $event)), + label: "自动更新订阅", + color: "primary", + inset: "", + hint: "定期自动更新Clash订阅配置" + }, null, 8, ["modelValue"]) + ]), + _: 1 + }), + _createVNode(_component_v_col, { cols: "12" }, { + default: _withCtx(() => [ + _createVNode(_component_v_text_field, { + modelValue: config.ruleset_prefix, + "onUpdate:modelValue": _cache[14] || (_cache[14] = $event => ((config.ruleset_prefix) = $event)), + label: "规则集前缀", + variant: "outlined", + placeholder: "📂<-", + hint: "为生成的规则集添加前缀", + "persistent-hint": "" + }, { + "prepend-inner": _withCtx(() => [ + _createVNode(_component_v_icon, { color: "info" }, { + default: _withCtx(() => _cache[27] || (_cache[27] = [ + _createTextVNode("mdi-prefix") + ])), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue"]) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue"]) + ]), + _: 1 + }), + _createVNode(_component_v_card_actions, null, { + default: _withCtx(() => [ + _createVNode(_component_v_btn, { + color: "primary", + onClick: notifySwitch + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { left: "" }, { + default: _withCtx(() => _cache[33] || (_cache[33] = [ + _createTextVNode("mdi-view-dashboard-edit") + ])), + _: 1 + }), + _cache[34] || (_cache[34] = _createTextVNode(" 规则 ")) + ]), + _: 1 + }), + _createVNode(_component_v_btn, { + color: "secondary", + onClick: resetForm + }, { + default: _withCtx(() => _cache[35] || (_cache[35] = [ + _createTextVNode("重置") + ])), + _: 1 + }), + _createVNode(_component_v_btn, { + color: "info", + onClick: testConnection, + loading: testing.value + }, { + default: _withCtx(() => _cache[36] || (_cache[36] = [ + _createTextVNode("测试连接") + ])), + _: 1 + }, 8, ["loading"]), + _createVNode(_component_v_spacer), + _createVNode(_component_v_btn, { + color: "primary", + disabled: !isFormValid.value, + onClick: saveConfig, + loading: saving.value + }, { + default: _withCtx(() => _cache[37] || (_cache[37] = [ + _createTextVNode(" 保存配置 ") + ])), + _: 1 + }, 8, ["disabled", "loading"]) + ]), + _: 1 + }), + (testResult.show) + ? (_openBlock(), _createBlock(_component_v_alert, { + key: 0, + type: testResult.success ? 'success' : 'error', + variant: "tonal", + closable: "", + class: "ma-4 mt-0", + "onClick:close": _cache[16] || (_cache[16] = $event => (testResult.show = false)) + }, { + default: _withCtx(() => [ + _createElementVNode("div", _hoisted_2, [ + _createVNode(_component_v_icon, { class: "mr-2" }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(testResult.success ? 'mdi-check-circle' : 'mdi-alert-circle'), 1) + ]), + _: 1 + }), + _createElementVNode("div", null, [ + _createElementVNode("div", _hoisted_3, _toDisplayString(testResult.title), 1), + _createElementVNode("div", _hoisted_4, _toDisplayString(testResult.message), 1) + ]) + ]) + ]), + _: 1 + }, 8, ["type"])) + : _createCommentVNode("", true) + ]), + _: 1 + }) + ])) +} +} + +}; +const ConfigComponent = /*#__PURE__*/_export_sfc(_sfc_main, [['__scopeId',"data-v-0e64dae0"]]); + +export { ConfigComponent as default }; diff --git a/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Config-DXzIavcD.css b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Config-DXzIavcD.css new file mode 100644 index 0000000..aadcf97 --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Config-DXzIavcD.css @@ -0,0 +1,5 @@ + +.plugin-config[data-v-0e64dae0] { + max-width: 800px; + margin: 0 auto; +} diff --git a/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Dashboard-BkyO-3pr.js b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Dashboard-BkyO-3pr.js new file mode 100644 index 0000000..ef6abb8 --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Dashboard-BkyO-3pr.js @@ -0,0 +1,40514 @@ +import { importShared } from './__federation_fn_import-JrT3xvdd.js'; +import { f as defineComponent, A as h, bC as shallowRef, bF as toRefs, a5 as computed$1, g as getCurrentInstance, w as watch, b6 as watchEffect, j as onMounted$1, aD as onBeforeUnmount, n as nextTick, au as inject, br as isRef, u as unref } from './runtime-core.esm-bundler-BQhfUSSX.js'; + +await importShared('vue'); + +/*! ***************************************************************************** +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 Browser = (function () { + function Browser() { + this.firefox = false; + this.ie = false; + this.edge = false; + this.newEdge = false; + this.weChat = false; + } + return Browser; +}()); +var Env = (function () { + function Env() { + this.browser = new Browser(); + this.node = false; + this.wxa = false; + this.worker = false; + this.svgSupported = false; + this.touchEventsSupported = false; + this.pointerEventsSupported = false; + this.domSupported = false; + this.transformSupported = false; + this.transform3dSupported = false; + this.hasGlobalWindow = typeof window !== 'undefined'; + } + return Env; +}()); +var env = new Env(); +if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') { + env.wxa = true; + env.touchEventsSupported = true; +} +else if (typeof document === 'undefined' && typeof self !== 'undefined') { + env.worker = true; +} +else if (!env.hasGlobalWindow || 'Deno' in window) { + env.node = true; + env.svgSupported = true; +} +else { + detect(navigator.userAgent, env); +} +function detect(ua, env) { + var browser = env.browser; + var firefox = ua.match(/Firefox\/([\d.]+)/); + var ie = ua.match(/MSIE\s([\d.]+)/) + || ua.match(/Trident\/.+?rv:(([\d.]+))/); + var edge = ua.match(/Edge?\/([\d.]+)/); + var weChat = (/micromessenger/i).test(ua); + if (firefox) { + browser.firefox = true; + browser.version = firefox[1]; + } + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + if (edge) { + browser.edge = true; + browser.version = edge[1]; + browser.newEdge = +edge[1].split('.')[0] > 18; + } + if (weChat) { + browser.weChat = true; + } + env.svgSupported = typeof SVGRect !== 'undefined'; + env.touchEventsSupported = 'ontouchstart' in window && !browser.ie && !browser.edge; + env.pointerEventsSupported = 'onpointerdown' in window + && (browser.edge || (browser.ie && +browser.version >= 11)); + env.domSupported = typeof document !== 'undefined'; + var style = document.documentElement.style; + env.transform3dSupported = ((browser.ie && 'transition' in style) + || browser.edge + || (('WebKitCSSMatrix' in window) && ('m11' in new WebKitCSSMatrix())) + || 'MozPerspective' in style) + && !('OTransition' in style); + env.transformSupported = env.transform3dSupported + || (browser.ie && +browser.version >= 9); +} + +var DEFAULT_FONT_SIZE = 12; +var DEFAULT_FONT_FAMILY = 'sans-serif'; +var DEFAULT_FONT = DEFAULT_FONT_SIZE + "px " + DEFAULT_FONT_FAMILY; +var OFFSET = 20; +var SCALE = 100; +var defaultWidthMapStr = "007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N"; +function getTextWidthMap(mapStr) { + var map = {}; + if (typeof JSON === 'undefined') { + return map; + } + for (var i = 0; i < mapStr.length; i++) { + var char = String.fromCharCode(i + 32); + var size = (mapStr.charCodeAt(i) - OFFSET) / SCALE; + map[char] = size; + } + return map; +} +var DEFAULT_TEXT_WIDTH_MAP = getTextWidthMap(defaultWidthMapStr); +var platformApi = { + createCanvas: function () { + return typeof document !== 'undefined' + && document.createElement('canvas'); + }, + measureText: (function () { + var _ctx; + var _cachedFont; + return function (text, font) { + if (!_ctx) { + var canvas = platformApi.createCanvas(); + _ctx = canvas && canvas.getContext('2d'); + } + if (_ctx) { + if (_cachedFont !== font) { + _cachedFont = _ctx.font = font || DEFAULT_FONT; + } + return _ctx.measureText(text); + } + else { + text = text || ''; + font = font || DEFAULT_FONT; + var res = /((?:\d+)?\.?\d*)px/.exec(font); + var fontSize = res && +res[1] || DEFAULT_FONT_SIZE; + var width = 0; + if (font.indexOf('mono') >= 0) { + width = fontSize * text.length; + } + else { + for (var i = 0; i < text.length; i++) { + var preCalcWidth = DEFAULT_TEXT_WIDTH_MAP[text[i]]; + width += preCalcWidth == null ? fontSize : (preCalcWidth * fontSize); + } + } + return { width: width }; + } + }; + })(), + loadImage: function (src, onload, onerror) { + var image = new Image(); + image.onload = onload; + image.onerror = onerror; + image.src = src; + return image; + } +}; + +var BUILTIN_OBJECT = reduce([ + 'Function', + 'RegExp', + 'Date', + 'Error', + 'CanvasGradient', + 'CanvasPattern', + 'Image', + 'Canvas' +], function (obj, val) { + obj['[object ' + val + ']'] = true; + return obj; +}, {}); +var TYPED_ARRAY = reduce([ + 'Int8', + 'Uint8', + 'Uint8Clamped', + 'Int16', + 'Uint16', + 'Int32', + 'Uint32', + 'Float32', + 'Float64' +], function (obj, val) { + obj['[object ' + val + 'Array]'] = true; + return obj; +}, {}); +var objToString = Object.prototype.toString; +var arrayProto = Array.prototype; +var nativeForEach = arrayProto.forEach; +var nativeFilter = arrayProto.filter; +var nativeSlice = arrayProto.slice; +var nativeMap = arrayProto.map; +var ctorFunction = function () { }.constructor; +var protoFunction = ctorFunction ? ctorFunction.prototype : null; +var protoKey = '__proto__'; +var idStart = 0x0907; +function guid() { + return idStart++; +} +function logError() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (typeof console !== 'undefined') { + console.error.apply(console, args); + } +} +function clone$2(source) { + if (source == null || typeof source !== 'object') { + return source; + } + var result = source; + var typeStr = objToString.call(source); + if (typeStr === '[object Array]') { + if (!isPrimitive(source)) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone$2(source[i]); + } + } + } + else if (TYPED_ARRAY[typeStr]) { + if (!isPrimitive(source)) { + var Ctor = source.constructor; + if (Ctor.from) { + result = Ctor.from(source); + } + else { + result = new Ctor(source.length); + for (var i = 0, len = source.length; i < len; i++) { + result[i] = source[i]; + } + } + } + } + else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + result[key] = clone$2(source[key]); + } + } + } + return result; +} +function merge(target, source, overwrite) { + if (!isObject$2(source) || !isObject$2(target)) { + return overwrite ? clone$2(source) : target; + } + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + var targetProp = target[key]; + var sourceProp = source[key]; + if (isObject$2(sourceProp) + && isObject$2(targetProp) + && !isArray(sourceProp) + && !isArray(targetProp) + && !isDom(sourceProp) + && !isDom(targetProp) + && !isBuiltInObject(sourceProp) + && !isBuiltInObject(targetProp) + && !isPrimitive(sourceProp) + && !isPrimitive(targetProp)) { + merge(targetProp, sourceProp, overwrite); + } + else if (overwrite || !(key in target)) { + target[key] = clone$2(source[key]); + } + } + } + return target; +} +function extend(target, source) { + if (Object.assign) { + Object.assign(target, source); + } + else { + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + target[key] = source[key]; + } + } + } + return target; +} +function defaults(target, source, overlay) { + var keysArr = keys(source); + for (var i = 0, len = keysArr.length; i < len; i++) { + var key = keysArr[i]; + if ((target[key] == null)) { + target[key] = source[key]; + } + } + return target; +} +function indexOf(array, value) { + if (array) { + if (array.indexOf) { + return array.indexOf(value); + } + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + } + return -1; +} +function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + function F() { } + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + for (var prop in clazzPrototype) { + if (clazzPrototype.hasOwnProperty(prop)) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + } + clazz.prototype.constructor = clazz; + clazz.superClass = baseClazz; +} +function mixin(target, source, override) { + target = 'prototype' in target ? target.prototype : target; + source = 'prototype' in source ? source.prototype : source; + if (Object.getOwnPropertyNames) { + var keyList = Object.getOwnPropertyNames(source); + for (var i = 0; i < keyList.length; i++) { + var key = keyList[i]; + if (key !== 'constructor') { + if ((target[key] == null)) { + target[key] = source[key]; + } + } + } + } + else { + defaults(target, source); + } +} +function isArrayLike(data) { + if (!data) { + return false; + } + if (typeof data === 'string') { + return false; + } + return typeof data.length === 'number'; +} +function each$4(arr, cb, context) { + if (!(arr && cb)) { + return; + } + if (arr.forEach && arr.forEach === nativeForEach) { + arr.forEach(cb, context); + } + else if (arr.length === +arr.length) { + for (var i = 0, len = arr.length; i < len; i++) { + cb.call(context, arr[i], i, arr); + } + } + else { + for (var key in arr) { + if (arr.hasOwnProperty(key)) { + cb.call(context, arr[key], key, arr); + } + } + } +} +function map$1(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.map && arr.map === nativeMap) { + return arr.map(cb, context); + } + else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + result.push(cb.call(context, arr[i], i, arr)); + } + return result; + } +} +function reduce(arr, cb, memo, context) { + if (!(arr && cb)) { + return; + } + for (var i = 0, len = arr.length; i < len; i++) { + memo = cb.call(context, memo, arr[i], i, arr); + } + return memo; +} +function filter(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.filter && arr.filter === nativeFilter) { + return arr.filter(cb, context); + } + else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + if (cb.call(context, arr[i], i, arr)) { + result.push(arr[i]); + } + } + return result; + } +} +function keys(obj) { + if (!obj) { + return []; + } + if (Object.keys) { + return Object.keys(obj); + } + var keyList = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + keyList.push(key); + } + } + return keyList; +} +function bindPolyfill(func, context) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + return function () { + return func.apply(context, args.concat(nativeSlice.call(arguments))); + }; +} +var bind$1 = (protoFunction && isFunction(protoFunction.bind)) + ? protoFunction.call.bind(protoFunction.bind) + : bindPolyfill; +function curry$1(func) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return function () { + return func.apply(this, args.concat(nativeSlice.call(arguments))); + }; +} +function isArray(value) { + if (Array.isArray) { + return Array.isArray(value); + } + return objToString.call(value) === '[object Array]'; +} +function isFunction(value) { + return typeof value === 'function'; +} +function isString(value) { + return typeof value === 'string'; +} +function isStringSafe(value) { + return objToString.call(value) === '[object String]'; +} +function isNumber(value) { + return typeof value === 'number'; +} +function isObject$2(value) { + var type = typeof value; + return type === 'function' || (!!value && type === 'object'); +} +function isBuiltInObject(value) { + return !!BUILTIN_OBJECT[objToString.call(value)]; +} +function isTypedArray(value) { + return !!TYPED_ARRAY[objToString.call(value)]; +} +function isDom(value) { + return typeof value === 'object' + && typeof value.nodeType === 'number' + && typeof value.ownerDocument === 'object'; +} +function isGradientObject(value) { + return value.colorStops != null; +} +function isImagePatternObject(value) { + return value.image != null; +} +function eqNaN(value) { + return value !== value; +} +function retrieve() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + for (var i = 0, len = args.length; i < len; i++) { + if (args[i] != null) { + return args[i]; + } + } +} +function retrieve2(value0, value1) { + return value0 != null + ? value0 + : value1; +} +function retrieve3(value0, value1, value2) { + return value0 != null + ? value0 + : value1 != null + ? value1 + : value2; +} +function slice(arr) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return nativeSlice.apply(arr, args); +} +function normalizeCssArray$1(val) { + if (typeof (val) === 'number') { + return [val, val, val, val]; + } + var len = val.length; + if (len === 2) { + return [val[0], val[1], val[0], val[1]]; + } + else if (len === 3) { + return [val[0], val[1], val[2], val[1]]; + } + return val; +} +function assert(condition, message) { + if (!condition) { + throw new Error(message); + } +} +function trim(str) { + if (str == null) { + return null; + } + else if (typeof str.trim === 'function') { + return str.trim(); + } + else { + return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } +} +var primitiveKey = '__ec_primitive__'; +function setAsPrimitive(obj) { + obj[primitiveKey] = true; +} +function isPrimitive(obj) { + return obj[primitiveKey]; +} +var MapPolyfill = (function () { + function MapPolyfill() { + this.data = {}; + } + MapPolyfill.prototype["delete"] = function (key) { + var existed = this.has(key); + if (existed) { + delete this.data[key]; + } + return existed; + }; + MapPolyfill.prototype.has = function (key) { + return this.data.hasOwnProperty(key); + }; + MapPolyfill.prototype.get = function (key) { + return this.data[key]; + }; + MapPolyfill.prototype.set = function (key, value) { + this.data[key] = value; + return this; + }; + MapPolyfill.prototype.keys = function () { + return keys(this.data); + }; + MapPolyfill.prototype.forEach = function (callback) { + var data = this.data; + for (var key in data) { + if (data.hasOwnProperty(key)) { + callback(data[key], key); + } + } + }; + return MapPolyfill; +}()); +var isNativeMapSupported = typeof Map === 'function'; +function maybeNativeMap() { + return (isNativeMapSupported ? new Map() : new MapPolyfill()); +} +var HashMap = (function () { + function HashMap(obj) { + var isArr = isArray(obj); + this.data = maybeNativeMap(); + var thisMap = this; + (obj instanceof HashMap) + ? obj.each(visit) + : (obj && each$4(obj, visit)); + function visit(value, key) { + isArr ? thisMap.set(value, key) : thisMap.set(key, value); + } + } + HashMap.prototype.hasKey = function (key) { + return this.data.has(key); + }; + HashMap.prototype.get = function (key) { + return this.data.get(key); + }; + HashMap.prototype.set = function (key, value) { + this.data.set(key, value); + return value; + }; + HashMap.prototype.each = function (cb, context) { + this.data.forEach(function (value, key) { + cb.call(context, value, key); + }); + }; + HashMap.prototype.keys = function () { + var keys = this.data.keys(); + return isNativeMapSupported + ? Array.from(keys) + : keys; + }; + HashMap.prototype.removeKey = function (key) { + this.data["delete"](key); + }; + return HashMap; +}()); +function createHashMap(obj) { + return new HashMap(obj); +} +function concatArray(a, b) { + var newArray = new a.constructor(a.length + b.length); + for (var i = 0; i < a.length; i++) { + newArray[i] = a[i]; + } + var offset = a.length; + for (var i = 0; i < b.length; i++) { + newArray[i + offset] = b[i]; + } + return newArray; +} +function createObject(proto, properties) { + var obj; + if (Object.create) { + obj = Object.create(proto); + } + else { + var StyleCtor = function () { }; + StyleCtor.prototype = proto; + obj = new StyleCtor(); + } + if (properties) { + extend(obj, properties); + } + return obj; +} +function disableUserSelect(dom) { + var domStyle = dom.style; + domStyle.webkitUserSelect = 'none'; + domStyle.userSelect = 'none'; + domStyle.webkitTapHighlightColor = 'rgba(0,0,0,0)'; + domStyle['-webkit-touch-callout'] = 'none'; +} +function hasOwn(own, prop) { + return own.hasOwnProperty(prop); +} +function noop() { } +var RADIAN_TO_DEGREE = 180 / Math.PI; + +function create$1(x, y) { + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + return [x, y]; +} +function clone$1(v) { + return [v[0], v[1]]; +} +function add(out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; +} +function sub(out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; +} +function len(v) { + return Math.sqrt(lenSquare(v)); +} +function lenSquare(v) { + return v[0] * v[0] + v[1] * v[1]; +} +function scale$2(out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; +} +function normalize$1(out, v) { + var d = len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } + else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; +} +function distance(v1, v2) { + return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1])); +} +var dist$1 = distance; +function distanceSquare(v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); +} +var distSquare = distanceSquare; +function lerp$1(out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; +} +function applyTransform$1(out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; +} +function min$1(out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; +} +function max$1(out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; +} + +var Param = (function () { + function Param(target, e) { + this.target = target; + this.topTarget = e && e.topTarget; + } + return Param; +}()); +var Draggable = (function () { + function Draggable(handler) { + this.handler = handler; + handler.on('mousedown', this._dragStart, this); + handler.on('mousemove', this._drag, this); + handler.on('mouseup', this._dragEnd, this); + } + Draggable.prototype._dragStart = function (e) { + var draggingTarget = e.target; + while (draggingTarget && !draggingTarget.draggable) { + draggingTarget = draggingTarget.parent || draggingTarget.__hostTarget; + } + if (draggingTarget) { + this._draggingTarget = draggingTarget; + draggingTarget.dragging = true; + this._x = e.offsetX; + this._y = e.offsetY; + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event); + } + }; + Draggable.prototype._drag = function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + var x = e.offsetX; + var y = e.offsetY; + var dx = x - this._x; + var dy = y - this._y; + this._x = x; + this._y = y; + draggingTarget.drift(dx, dy, e); + this.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event); + var dropTarget = this.handler.findHover(x, y, draggingTarget).target; + var lastDropTarget = this._dropTarget; + this._dropTarget = dropTarget; + if (draggingTarget !== dropTarget) { + if (lastDropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event); + } + if (dropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event); + } + } + } + }; + Draggable.prototype._dragEnd = function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + draggingTarget.dragging = false; + } + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event); + if (this._dropTarget) { + this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event); + } + this._draggingTarget = null; + this._dropTarget = null; + }; + return Draggable; +}()); + +var Eventful = (function () { + function Eventful(eventProcessors) { + if (eventProcessors) { + this._$eventProcessor = eventProcessors; + } + } + Eventful.prototype.on = function (event, query, handler, context) { + if (!this._$handlers) { + this._$handlers = {}; + } + var _h = this._$handlers; + if (typeof query === 'function') { + context = handler; + handler = query; + query = null; + } + if (!handler || !event) { + return this; + } + var eventProcessor = this._$eventProcessor; + if (query != null && eventProcessor && eventProcessor.normalizeQuery) { + query = eventProcessor.normalizeQuery(query); + } + if (!_h[event]) { + _h[event] = []; + } + for (var i = 0; i < _h[event].length; i++) { + if (_h[event][i].h === handler) { + return this; + } + } + var wrap = { + h: handler, + query: query, + ctx: (context || this), + callAtLast: handler.zrEventfulCallAtLast + }; + var lastIndex = _h[event].length - 1; + var lastWrap = _h[event][lastIndex]; + (lastWrap && lastWrap.callAtLast) + ? _h[event].splice(lastIndex, 0, wrap) + : _h[event].push(wrap); + return this; + }; + Eventful.prototype.isSilent = function (eventName) { + var _h = this._$handlers; + return !_h || !_h[eventName] || !_h[eventName].length; + }; + Eventful.prototype.off = function (eventType, handler) { + var _h = this._$handlers; + if (!_h) { + return this; + } + if (!eventType) { + this._$handlers = {}; + return this; + } + if (handler) { + if (_h[eventType]) { + var newList = []; + for (var i = 0, l = _h[eventType].length; i < l; i++) { + if (_h[eventType][i].h !== handler) { + newList.push(_h[eventType][i]); + } + } + _h[eventType] = newList; + } + if (_h[eventType] && _h[eventType].length === 0) { + delete _h[eventType]; + } + } + else { + delete _h[eventType]; + } + return this; + }; + Eventful.prototype.trigger = function (eventType) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[eventType]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var argLen = args.length; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(eventType, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(hItem.ctx); + break; + case 1: + hItem.h.call(hItem.ctx, args[0]); + break; + case 2: + hItem.h.call(hItem.ctx, args[0], args[1]); + break; + default: + hItem.h.apply(hItem.ctx, args); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(eventType); + return this; + }; + Eventful.prototype.triggerWithContext = function (type) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[type]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var argLen = args.length; + var ctx = args[argLen - 1]; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(type, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(ctx); + break; + case 1: + hItem.h.call(ctx, args[0]); + break; + case 2: + hItem.h.call(ctx, args[0], args[1]); + break; + default: + hItem.h.apply(ctx, args.slice(1, argLen - 1)); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(type); + return this; + }; + return Eventful; +}()); + +var LN2 = Math.log(2); +function determinant(rows, rank, rowStart, rowMask, colMask, detCache) { + var cacheKey = rowMask + '-' + colMask; + var fullRank = rows.length; + if (detCache.hasOwnProperty(cacheKey)) { + return detCache[cacheKey]; + } + if (rank === 1) { + var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2); + return rows[rowStart][colStart]; + } + var subRowMask = rowMask | (1 << rowStart); + var subRowStart = rowStart + 1; + while (rowMask & (1 << subRowStart)) { + subRowStart++; + } + var sum = 0; + for (var j = 0, colLocalIdx = 0; j < fullRank; j++) { + var colTag = 1 << j; + if (!(colTag & colMask)) { + sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j] + * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache); + colLocalIdx++; + } + } + detCache[cacheKey] = sum; + return sum; +} +function buildTransformer(src, dest) { + var mA = [ + [src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]], + [0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]], + [src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]], + [0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]], + [src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]], + [0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]], + [src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]], + [0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]] + ]; + var detCache = {}; + var det = determinant(mA, 8, 0, 0, 0, detCache); + if (det === 0) { + return; + } + var vh = []; + for (var i = 0; i < 8; i++) { + for (var j = 0; j < 8; j++) { + vh[j] == null && (vh[j] = 0); + vh[j] += ((i + j) % 2 ? -1 : 1) + * determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache) + / det * dest[i]; + } + } + return function (out, srcPointX, srcPointY) { + var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1; + out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk; + out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk; + }; +} + +var EVENT_SAVED_PROP = '___zrEVENTSAVED'; +var _calcOut$1 = []; +function transformLocalCoord(out, elFrom, elTarget, inX, inY) { + return transformCoordWithViewport(_calcOut$1, elFrom, inX, inY, true) + && transformCoordWithViewport(out, elTarget, _calcOut$1[0], _calcOut$1[1]); +} +function transformCoordWithViewport(out, el, inX, inY, inverse) { + if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) { + var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {}); + var markers = prepareCoordMarkers(el, saved); + var transformer = preparePointerTransformer(markers, saved, inverse); + if (transformer) { + transformer(out, inX, inY); + return true; + } + } + return false; +} +function prepareCoordMarkers(el, saved) { + var markers = saved.markers; + if (markers) { + return markers; + } + markers = saved.markers = []; + var propLR = ['left', 'right']; + var propTB = ['top', 'bottom']; + for (var i = 0; i < 4; i++) { + var marker = document.createElement('div'); + var stl = marker.style; + var idxLR = i % 2; + var idxTB = (i >> 1) % 2; + stl.cssText = [ + 'position: absolute', + 'visibility: hidden', + 'padding: 0', + 'margin: 0', + 'border-width: 0', + 'user-select: none', + 'width:0', + 'height:0', + propLR[idxLR] + ':0', + propTB[idxTB] + ':0', + propLR[1 - idxLR] + ':auto', + propTB[1 - idxTB] + ':auto', + '' + ].join('!important;'); + el.appendChild(marker); + markers.push(marker); + } + return markers; +} +function preparePointerTransformer(markers, saved, inverse) { + var transformerName = inverse ? 'invTrans' : 'trans'; + var transformer = saved[transformerName]; + var oldSrcCoords = saved.srcCoords; + var srcCoords = []; + var destCoords = []; + var oldCoordTheSame = true; + for (var i = 0; i < 4; i++) { + var rect = markers[i].getBoundingClientRect(); + var ii = 2 * i; + var x = rect.left; + var y = rect.top; + srcCoords.push(x, y); + oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1]; + destCoords.push(markers[i].offsetLeft, markers[i].offsetTop); + } + return (oldCoordTheSame && transformer) + ? transformer + : (saved.srcCoords = srcCoords, + saved[transformerName] = inverse + ? buildTransformer(destCoords, srcCoords) + : buildTransformer(srcCoords, destCoords)); +} +function isCanvasEl(el) { + return el.nodeName.toUpperCase() === 'CANVAS'; +} +var replaceReg = /([&<>"'])/g; +var replaceMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''' +}; +function encodeHTML(source) { + return source == null + ? '' + : (source + '').replace(replaceReg, function (str, c) { + return replaceMap[c]; + }); +} + +var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/; +var _calcOut = []; +var firefoxNotSupportOffsetXY = env.browser.firefox + && +env.browser.version.split('.')[0] < 39; +function clientToLocal(el, e, out, calculate) { + out = out || {}; + if (calculate) { + calculateZrXY(el, e, out); + } + else if (firefoxNotSupportOffsetXY + && e.layerX != null + && e.layerX !== e.offsetX) { + out.zrX = e.layerX; + out.zrY = e.layerY; + } + else if (e.offsetX != null) { + out.zrX = e.offsetX; + out.zrY = e.offsetY; + } + else { + calculateZrXY(el, e, out); + } + return out; +} +function calculateZrXY(el, e, out) { + if (env.domSupported && el.getBoundingClientRect) { + var ex = e.clientX; + var ey = e.clientY; + if (isCanvasEl(el)) { + var box = el.getBoundingClientRect(); + out.zrX = ex - box.left; + out.zrY = ey - box.top; + return; + } + else { + if (transformCoordWithViewport(_calcOut, el, ex, ey)) { + out.zrX = _calcOut[0]; + out.zrY = _calcOut[1]; + return; + } + } + } + out.zrX = out.zrY = 0; +} +function getNativeEvent(e) { + return e + || window.event; +} +function normalizeEvent(el, e, calculate) { + e = getNativeEvent(e); + if (e.zrX != null) { + return e; + } + var eventType = e.type; + var isTouch = eventType && eventType.indexOf('touch') >= 0; + if (!isTouch) { + clientToLocal(el, e, e, calculate); + var wheelDelta = getWheelDeltaMayPolyfill(e); + e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3; + } + else { + var touch = eventType !== 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + touch && clientToLocal(el, touch, e, calculate); + } + var button = e.button; + if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) { + e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); + } + return e; +} +function getWheelDeltaMayPolyfill(e) { + var rawWheelDelta = e.wheelDelta; + if (rawWheelDelta) { + return rawWheelDelta; + } + var deltaX = e.deltaX; + var deltaY = e.deltaY; + if (deltaX == null || deltaY == null) { + return rawWheelDelta; + } + var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX); + var sign = deltaY > 0 ? -1 + : deltaY < 0 ? 1 + : deltaX > 0 ? -1 + : 1; + return 3 * delta * sign; +} +function addEventListener(el, name, handler, opt) { + el.addEventListener(name, handler, opt); +} +function removeEventListener(el, name, handler, opt) { + el.removeEventListener(name, handler, opt); +} +var stop = function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; +}; + +var GestureMgr = (function () { + function GestureMgr() { + this._track = []; + } + GestureMgr.prototype.recognize = function (event, target, root) { + this._doTrack(event, target, root); + return this._recognize(event); + }; + GestureMgr.prototype.clear = function () { + this._track.length = 0; + return this; + }; + GestureMgr.prototype._doTrack = function (event, target, root) { + var touches = event.touches; + if (!touches) { + return; + } + var trackItem = { + points: [], + touches: [], + target: target, + event: event + }; + for (var i = 0, len = touches.length; i < len; i++) { + var touch = touches[i]; + var pos = clientToLocal(root, touch, {}); + trackItem.points.push([pos.zrX, pos.zrY]); + trackItem.touches.push(touch); + } + this._track.push(trackItem); + }; + GestureMgr.prototype._recognize = function (event) { + for (var eventName in recognizers) { + if (recognizers.hasOwnProperty(eventName)) { + var gestureInfo = recognizers[eventName](this._track, event); + if (gestureInfo) { + return gestureInfo; + } + } + } + }; + return GestureMgr; +}()); +function dist(pointPair) { + var dx = pointPair[1][0] - pointPair[0][0]; + var dy = pointPair[1][1] - pointPair[0][1]; + return Math.sqrt(dx * dx + dy * dy); +} +function center(pointPair) { + return [ + (pointPair[0][0] + pointPair[1][0]) / 2, + (pointPair[0][1] + pointPair[1][1]) / 2 + ]; +} +var recognizers = { + pinch: function (tracks, event) { + var trackLen = tracks.length; + if (!trackLen) { + return; + } + var pinchEnd = (tracks[trackLen - 1] || {}).points; + var pinchPre = (tracks[trackLen - 2] || {}).points || pinchEnd; + if (pinchPre + && pinchPre.length > 1 + && pinchEnd + && pinchEnd.length > 1) { + var pinchScale = dist(pinchEnd) / dist(pinchPre); + !isFinite(pinchScale) && (pinchScale = 1); + event.pinchScale = pinchScale; + var pinchCenter = center(pinchEnd); + event.pinchX = pinchCenter[0]; + event.pinchY = pinchCenter[1]; + return { + type: 'pinch', + target: tracks[0].target, + event: event + }; + } + } +}; + +function create() { + return [1, 0, 0, 1, 0, 0]; +} +function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; +} +function copy(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; +} +function mul(out, m1, m2) { + var out0 = m1[0] * m2[0] + m1[2] * m2[1]; + var out1 = m1[1] * m2[0] + m1[3] * m2[1]; + var out2 = m1[0] * m2[2] + m1[2] * m2[3]; + var out3 = m1[1] * m2[2] + m1[3] * m2[3]; + var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = out3; + out[4] = out4; + out[5] = out5; + return out; +} +function translate(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; +} +function rotate(out, a, rad, pivot) { + if (pivot === void 0) { pivot = [0, 0]; } + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * (atx - pivot[0]) + st * (aty - pivot[1]) + pivot[0]; + out[5] = ct * (aty - pivot[1]) - st * (atx - pivot[0]) + pivot[1]; + return out; +} +function scale$1(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; +} +function invert(out, a) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var det = aa * ad - ab * ac; + if (!det) { + return null; + } + det = 1.0 / det; + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; +} + +var Point = (function () { + function Point(x, y) { + this.x = x || 0; + this.y = y || 0; + } + Point.prototype.copy = function (other) { + this.x = other.x; + this.y = other.y; + return this; + }; + Point.prototype.clone = function () { + return new Point(this.x, this.y); + }; + Point.prototype.set = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + Point.prototype.equal = function (other) { + return other.x === this.x && other.y === this.y; + }; + Point.prototype.add = function (other) { + this.x += other.x; + this.y += other.y; + return this; + }; + Point.prototype.scale = function (scalar) { + this.x *= scalar; + this.y *= scalar; + }; + Point.prototype.scaleAndAdd = function (other, scalar) { + this.x += other.x * scalar; + this.y += other.y * scalar; + }; + Point.prototype.sub = function (other) { + this.x -= other.x; + this.y -= other.y; + return this; + }; + Point.prototype.dot = function (other) { + return this.x * other.x + this.y * other.y; + }; + Point.prototype.len = function () { + return Math.sqrt(this.x * this.x + this.y * this.y); + }; + Point.prototype.lenSquare = function () { + return this.x * this.x + this.y * this.y; + }; + Point.prototype.normalize = function () { + var len = this.len(); + this.x /= len; + this.y /= len; + return this; + }; + Point.prototype.distance = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return Math.sqrt(dx * dx + dy * dy); + }; + Point.prototype.distanceSquare = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return dx * dx + dy * dy; + }; + Point.prototype.negate = function () { + this.x = -this.x; + this.y = -this.y; + return this; + }; + Point.prototype.transform = function (m) { + if (!m) { + return; + } + var x = this.x; + var y = this.y; + this.x = m[0] * x + m[2] * y + m[4]; + this.y = m[1] * x + m[3] * y + m[5]; + return this; + }; + Point.prototype.toArray = function (out) { + out[0] = this.x; + out[1] = this.y; + return out; + }; + Point.prototype.fromArray = function (input) { + this.x = input[0]; + this.y = input[1]; + }; + Point.set = function (p, x, y) { + p.x = x; + p.y = y; + }; + Point.copy = function (p, p2) { + p.x = p2.x; + p.y = p2.y; + }; + Point.len = function (p) { + return Math.sqrt(p.x * p.x + p.y * p.y); + }; + Point.lenSquare = function (p) { + return p.x * p.x + p.y * p.y; + }; + Point.dot = function (p0, p1) { + return p0.x * p1.x + p0.y * p1.y; + }; + Point.add = function (out, p0, p1) { + out.x = p0.x + p1.x; + out.y = p0.y + p1.y; + }; + Point.sub = function (out, p0, p1) { + out.x = p0.x - p1.x; + out.y = p0.y - p1.y; + }; + Point.scale = function (out, p0, scalar) { + out.x = p0.x * scalar; + out.y = p0.y * scalar; + }; + Point.scaleAndAdd = function (out, p0, p1, scalar) { + out.x = p0.x + p1.x * scalar; + out.y = p0.y + p1.y * scalar; + }; + Point.lerp = function (out, p0, p1, t) { + var onet = 1 - t; + out.x = onet * p0.x + t * p1.x; + out.y = onet * p0.y + t * p1.y; + }; + return Point; +}()); + +var mathMin$5 = Math.min; +var mathMax$5 = Math.max; +var lt = new Point(); +var rb = new Point(); +var lb = new Point(); +var rt = new Point(); +var minTv$1 = new Point(); +var maxTv$1 = new Point(); +var BoundingRect = (function () { + function BoundingRect(x, y, width, height) { + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + BoundingRect.prototype.union = function (other) { + var x = mathMin$5(other.x, this.x); + var y = mathMin$5(other.y, this.y); + if (isFinite(this.x) && isFinite(this.width)) { + this.width = mathMax$5(other.x + other.width, this.x + this.width) - x; + } + else { + this.width = other.width; + } + if (isFinite(this.y) && isFinite(this.height)) { + this.height = mathMax$5(other.y + other.height, this.y + this.height) - y; + } + else { + this.height = other.height; + } + this.x = x; + this.y = y; + }; + BoundingRect.prototype.applyTransform = function (m) { + BoundingRect.applyTransform(this, this, m); + }; + BoundingRect.prototype.calculateTransform = function (b) { + var a = this; + var sx = b.width / a.width; + var sy = b.height / a.height; + var m = create(); + translate(m, m, [-a.x, -a.y]); + scale$1(m, m, [sx, sy]); + translate(m, m, [b.x, b.y]); + return m; + }; + BoundingRect.prototype.intersect = function (b, mtv) { + if (!b) { + return false; + } + if (!(b instanceof BoundingRect)) { + b = BoundingRect.create(b); + } + var a = this; + var ax0 = a.x; + var ax1 = a.x + a.width; + var ay0 = a.y; + var ay1 = a.y + a.height; + var bx0 = b.x; + var bx1 = b.x + b.width; + var by0 = b.y; + var by1 = b.y + b.height; + var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); + if (mtv) { + var dMin = Infinity; + var dMax = 0; + var d0 = Math.abs(ax1 - bx0); + var d1 = Math.abs(bx1 - ax0); + var d2 = Math.abs(ay1 - by0); + var d3 = Math.abs(by1 - ay0); + var dx = Math.min(d0, d1); + var dy = Math.min(d2, d3); + if (ax1 < bx0 || bx1 < ax0) { + if (dx > dMax) { + dMax = dx; + if (d0 < d1) { + Point.set(maxTv$1, -d0, 0); + } + else { + Point.set(maxTv$1, d1, 0); + } + } + } + else { + if (dx < dMin) { + dMin = dx; + if (d0 < d1) { + Point.set(minTv$1, d0, 0); + } + else { + Point.set(minTv$1, -d1, 0); + } + } + } + if (ay1 < by0 || by1 < ay0) { + if (dy > dMax) { + dMax = dy; + if (d2 < d3) { + Point.set(maxTv$1, 0, -d2); + } + else { + Point.set(maxTv$1, 0, d3); + } + } + } + else { + if (dx < dMin) { + dMin = dx; + if (d2 < d3) { + Point.set(minTv$1, 0, d2); + } + else { + Point.set(minTv$1, 0, -d3); + } + } + } + } + if (mtv) { + Point.copy(mtv, overlap ? minTv$1 : maxTv$1); + } + return overlap; + }; + BoundingRect.prototype.contain = function (x, y) { + var rect = this; + return x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height); + }; + BoundingRect.prototype.clone = function () { + return new BoundingRect(this.x, this.y, this.width, this.height); + }; + BoundingRect.prototype.copy = function (other) { + BoundingRect.copy(this, other); + }; + BoundingRect.prototype.plain = function () { + return { + x: this.x, + y: this.y, + width: this.width, + height: this.height + }; + }; + BoundingRect.prototype.isFinite = function () { + return isFinite(this.x) + && isFinite(this.y) + && isFinite(this.width) + && isFinite(this.height); + }; + BoundingRect.prototype.isZero = function () { + return this.width === 0 || this.height === 0; + }; + BoundingRect.create = function (rect) { + return new BoundingRect(rect.x, rect.y, rect.width, rect.height); + }; + BoundingRect.copy = function (target, source) { + target.x = source.x; + target.y = source.y; + target.width = source.width; + target.height = source.height; + }; + BoundingRect.applyTransform = function (target, source, m) { + if (!m) { + if (target !== source) { + BoundingRect.copy(target, source); + } + return; + } + if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) { + var sx = m[0]; + var sy = m[3]; + var tx = m[4]; + var ty = m[5]; + target.x = source.x * sx + tx; + target.y = source.y * sy + ty; + target.width = source.width * sx; + target.height = source.height * sy; + if (target.width < 0) { + target.x += target.width; + target.width = -target.width; + } + if (target.height < 0) { + target.y += target.height; + target.height = -target.height; + } + return; + } + lt.x = lb.x = source.x; + lt.y = rt.y = source.y; + rb.x = rt.x = source.x + source.width; + rb.y = lb.y = source.y + source.height; + lt.transform(m); + rt.transform(m); + rb.transform(m); + lb.transform(m); + target.x = mathMin$5(lt.x, rb.x, lb.x, rt.x); + target.y = mathMin$5(lt.y, rb.y, lb.y, rt.y); + var maxX = mathMax$5(lt.x, rb.x, lb.x, rt.x); + var maxY = mathMax$5(lt.y, rb.y, lb.y, rt.y); + target.width = maxX - target.x; + target.height = maxY - target.y; + }; + return BoundingRect; +}()); + +var SILENT = 'silent'; +function makeEventPacket(eveType, targetInfo, event) { + return { + type: eveType, + event: event, + target: targetInfo.target, + topTarget: targetInfo.topTarget, + cancelBubble: false, + offsetX: event.zrX, + offsetY: event.zrY, + gestureEvent: event.gestureEvent, + pinchX: event.pinchX, + pinchY: event.pinchY, + pinchScale: event.pinchScale, + wheelDelta: event.zrDelta, + zrByTouch: event.zrByTouch, + which: event.which, + stop: stopEvent + }; +} +function stopEvent() { + stop(this.event); +} +var EmptyProxy = (function (_super) { + __extends(EmptyProxy, _super); + function EmptyProxy() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.handler = null; + return _this; + } + EmptyProxy.prototype.dispose = function () { }; + EmptyProxy.prototype.setCursor = function () { }; + return EmptyProxy; +}(Eventful)); +var HoveredResult = (function () { + function HoveredResult(x, y) { + this.x = x; + this.y = y; + } + return HoveredResult; +}()); +var handlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' +]; +var tmpRect$1 = new BoundingRect(0, 0, 0, 0); +var Handler = (function (_super) { + __extends(Handler, _super); + function Handler(storage, painter, proxy, painterRoot, pointerSize) { + var _this = _super.call(this) || this; + _this._hovered = new HoveredResult(0, 0); + _this.storage = storage; + _this.painter = painter; + _this.painterRoot = painterRoot; + _this._pointerSize = pointerSize; + proxy = proxy || new EmptyProxy(); + _this.proxy = null; + _this.setHandlerProxy(proxy); + _this._draggingMgr = new Draggable(_this); + return _this; + } + Handler.prototype.setHandlerProxy = function (proxy) { + if (this.proxy) { + this.proxy.dispose(); + } + if (proxy) { + each$4(handlerNames, function (name) { + proxy.on && proxy.on(name, this[name], this); + }, this); + proxy.handler = this; + } + this.proxy = proxy; + }; + Handler.prototype.mousemove = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var lastHovered = this._hovered; + var lastHoveredTarget = lastHovered.target; + if (lastHoveredTarget && !lastHoveredTarget.__zr) { + lastHovered = this.findHover(lastHovered.x, lastHovered.y); + lastHoveredTarget = lastHovered.target; + } + var hovered = this._hovered = isOutside ? new HoveredResult(x, y) : this.findHover(x, y); + var hoveredTarget = hovered.target; + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default'); + if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(lastHovered, 'mouseout', event); + } + this.dispatchToElement(hovered, 'mousemove', event); + if (hoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(hovered, 'mouseover', event); + } + }; + Handler.prototype.mouseout = function (event) { + var eventControl = event.zrEventControl; + if (eventControl !== 'only_globalout') { + this.dispatchToElement(this._hovered, 'mouseout', event); + } + if (eventControl !== 'no_globalout') { + this.trigger('globalout', { type: 'globalout', event: event }); + } + }; + Handler.prototype.resize = function () { + this._hovered = new HoveredResult(0, 0); + }; + Handler.prototype.dispatch = function (eventName, eventArgs) { + var handler = this[eventName]; + handler && handler.call(this, eventArgs); + }; + Handler.prototype.dispose = function () { + this.proxy.dispose(); + this.storage = null; + this.proxy = null; + this.painter = null; + }; + Handler.prototype.setCursorStyle = function (cursorStyle) { + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(cursorStyle); + }; + Handler.prototype.dispatchToElement = function (targetInfo, eventName, event) { + targetInfo = targetInfo || {}; + var el = targetInfo.target; + if (el && el.silent) { + return; + } + var eventKey = ('on' + eventName); + var eventPacket = makeEventPacket(eventName, targetInfo, event); + while (el) { + el[eventKey] + && (eventPacket.cancelBubble = !!el[eventKey].call(el, eventPacket)); + el.trigger(eventName, eventPacket); + el = el.__hostTarget ? el.__hostTarget : el.parent; + if (eventPacket.cancelBubble) { + break; + } + } + if (!eventPacket.cancelBubble) { + this.trigger(eventName, eventPacket); + if (this.painter && this.painter.eachOtherLayer) { + this.painter.eachOtherLayer(function (layer) { + if (typeof (layer[eventKey]) === 'function') { + layer[eventKey].call(layer, eventPacket); + } + if (layer.trigger) { + layer.trigger(eventName, eventPacket); + } + }); + } + } + }; + Handler.prototype.findHover = function (x, y, exclude) { + var list = this.storage.getDisplayList(); + var out = new HoveredResult(x, y); + setHoverTarget(list, out, x, y, exclude); + if (this._pointerSize && !out.target) { + var candidates = []; + var pointerSize = this._pointerSize; + var targetSizeHalf = pointerSize / 2; + var pointerRect = new BoundingRect(x - targetSizeHalf, y - targetSizeHalf, pointerSize, pointerSize); + for (var i = list.length - 1; i >= 0; i--) { + var el = list[i]; + if (el !== exclude + && !el.ignore + && !el.ignoreCoarsePointer + && (!el.parent || !el.parent.ignoreCoarsePointer)) { + tmpRect$1.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect$1.applyTransform(el.transform); + } + if (tmpRect$1.intersect(pointerRect)) { + candidates.push(el); + } + } + } + if (candidates.length) { + var rStep = 4; + var thetaStep = Math.PI / 12; + var PI2 = Math.PI * 2; + for (var r = 0; r < targetSizeHalf; r += rStep) { + for (var theta = 0; theta < PI2; theta += thetaStep) { + var x1 = x + r * Math.cos(theta); + var y1 = y + r * Math.sin(theta); + setHoverTarget(candidates, out, x1, y1, exclude); + if (out.target) { + return out; + } + } + } + } + } + return out; + }; + Handler.prototype.processGesture = function (event, stage) { + if (!this._gestureMgr) { + this._gestureMgr = new GestureMgr(); + } + var gestureMgr = this._gestureMgr; + stage === 'start' && gestureMgr.clear(); + var gestureInfo = gestureMgr.recognize(event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom); + stage === 'end' && gestureMgr.clear(); + if (gestureInfo) { + var type = gestureInfo.type; + event.gestureEvent = type; + var res = new HoveredResult(); + res.target = gestureInfo.target; + this.dispatchToElement(res, type, gestureInfo.event); + } + }; + return Handler; +}(Eventful)); +each$4(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) { + Handler.prototype[name] = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var hovered; + var hoveredTarget; + if (name !== 'mouseup' || !isOutside) { + hovered = this.findHover(x, y); + hoveredTarget = hovered.target; + } + if (name === 'mousedown') { + this._downEl = hoveredTarget; + this._downPoint = [event.zrX, event.zrY]; + this._upEl = hoveredTarget; + } + else if (name === 'mouseup') { + this._upEl = hoveredTarget; + } + else if (name === 'click') { + if (this._downEl !== this._upEl + || !this._downPoint + || dist$1(this._downPoint, [event.zrX, event.zrY]) > 4) { + return; + } + this._downPoint = null; + } + this.dispatchToElement(hovered, name, event); + }; +}); +function isHover(displayable, x, y) { + if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { + var el = displayable; + var isSilent = void 0; + var ignoreClip = false; + while (el) { + if (el.ignoreClip) { + ignoreClip = true; + } + if (!ignoreClip) { + var clipPath = el.getClipPath(); + if (clipPath && !clipPath.contain(x, y)) { + return false; + } + } + if (el.silent) { + isSilent = true; + } + var hostEl = el.__hostTarget; + el = hostEl ? hostEl : el.parent; + } + return isSilent ? SILENT : true; + } + return false; +} +function setHoverTarget(list, out, x, y, exclude) { + for (var i = list.length - 1; i >= 0; i--) { + var el = list[i]; + var hoverCheckResult = void 0; + if (el !== exclude + && !el.ignore + && (hoverCheckResult = isHover(el, x, y))) { + !out.topTarget && (out.topTarget = el); + if (hoverCheckResult !== SILENT) { + out.target = el; + break; + } + } + } +} +function isOutsideBoundary(handlerInstance, x, y) { + var painter = handlerInstance.painter; + return x < 0 || x > painter.getWidth() || y < 0 || y > painter.getHeight(); +} + +var DEFAULT_MIN_MERGE = 32; +var DEFAULT_MIN_GALLOPING = 7; +function minRunLength(n) { + var r = 0; + while (n >= DEFAULT_MIN_MERGE) { + r |= n & 1; + n >>= 1; + } + return n + r; +} +function makeAscendingRun(array, lo, hi, compare) { + var runHi = lo + 1; + if (runHi === hi) { + return 1; + } + if (compare(array[runHi++], array[lo]) < 0) { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) { + runHi++; + } + reverseRun(array, lo, runHi); + } + else { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) { + runHi++; + } + } + return runHi - lo; +} +function reverseRun(array, lo, hi) { + hi--; + while (lo < hi) { + var t = array[lo]; + array[lo++] = array[hi]; + array[hi--] = t; + } +} +function binaryInsertionSort(array, lo, hi, start, compare) { + if (start === lo) { + start++; + } + for (; start < hi; start++) { + var pivot = array[start]; + var left = lo; + var right = start; + var mid; + while (left < right) { + mid = left + right >>> 1; + if (compare(pivot, array[mid]) < 0) { + right = mid; + } + else { + left = mid + 1; + } + } + var n = start - left; + switch (n) { + case 3: + array[left + 3] = array[left + 2]; + case 2: + array[left + 2] = array[left + 1]; + case 1: + array[left + 1] = array[left]; + break; + default: + while (n > 0) { + array[left + n] = array[left + n - 1]; + n--; + } + } + array[left] = pivot; + } +} +function gallopLeft(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) > 0) { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } + else { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) > 0) { + lastOffset = m + 1; + } + else { + offset = m; + } + } + return offset; +} +function gallopRight(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) < 0) { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + else { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) < 0) { + offset = m; + } + else { + lastOffset = m + 1; + } + } + return offset; +} +function TimSort(array, compare) { + var minGallop = DEFAULT_MIN_GALLOPING; + var runStart; + var runLength; + var stackSize = 0; + var tmp = []; + runStart = []; + runLength = []; + function pushRun(_runStart, _runLength) { + runStart[stackSize] = _runStart; + runLength[stackSize] = _runLength; + stackSize += 1; + } + function mergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if ((n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1]) + || (n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1])) { + if (runLength[n - 1] < runLength[n + 1]) { + n--; + } + } + else if (runLength[n] > runLength[n + 1]) { + break; + } + mergeAt(n); + } + } + function forceMergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if (n > 0 && runLength[n - 1] < runLength[n + 1]) { + n--; + } + mergeAt(n); + } + } + function mergeAt(i) { + var start1 = runStart[i]; + var length1 = runLength[i]; + var start2 = runStart[i + 1]; + var length2 = runLength[i + 1]; + runLength[i] = length1 + length2; + if (i === stackSize - 3) { + runStart[i + 1] = runStart[i + 2]; + runLength[i + 1] = runLength[i + 2]; + } + stackSize--; + var k = gallopRight(array[start2], array, start1, length1, 0, compare); + start1 += k; + length1 -= k; + if (length1 === 0) { + return; + } + length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare); + if (length2 === 0) { + return; + } + if (length1 <= length2) { + mergeLow(start1, length1, start2, length2); + } + else { + mergeHigh(start1, length1, start2, length2); + } + } + function mergeLow(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length1; i++) { + tmp[i] = array[start1 + i]; + } + var cursor1 = 0; + var cursor2 = start2; + var dest = start1; + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + return; + } + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + return; + } + var _minGallop = minGallop; + var count1; + var count2; + var exit; + while (1) { + count1 = 0; + count2 = 0; + exit = false; + do { + if (compare(array[cursor2], tmp[cursor1]) < 0) { + array[dest++] = array[cursor2++]; + count2++; + count1 = 0; + if (--length2 === 0) { + exit = true; + break; + } + } + else { + array[dest++] = tmp[cursor1++]; + count1++; + count2 = 0; + if (--length1 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare); + if (count1 !== 0) { + for (i = 0; i < count1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + dest += count1; + cursor1 += count1; + length1 -= count1; + if (length1 <= 1) { + exit = true; + break; + } + } + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + exit = true; + break; + } + count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare); + if (count2 !== 0) { + for (i = 0; i < count2; i++) { + array[dest + i] = array[cursor2 + i]; + } + dest += count2; + cursor2 += count2; + length2 -= count2; + if (length2 === 0) { + exit = true; + break; + } + } + array[dest++] = tmp[cursor1++]; + if (--length1 === 1) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + minGallop < 1 && (minGallop = 1); + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + } + else if (length1 === 0) { + throw new Error(); + } + else { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + } + } + function mergeHigh(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length2; i++) { + tmp[i] = array[start2 + i]; + } + var cursor1 = start1 + length1 - 1; + var cursor2 = length2 - 1; + var dest = start2 + length2 - 1; + var customCursor = 0; + var customDest = 0; + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + return; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + return; + } + var _minGallop = minGallop; + while (true) { + var count1 = 0; + var count2 = 0; + var exit = false; + do { + if (compare(tmp[cursor2], array[cursor1]) < 0) { + array[dest--] = array[cursor1--]; + count1++; + count2 = 0; + if (--length1 === 0) { + exit = true; + break; + } + } + else { + array[dest--] = tmp[cursor2--]; + count2++; + count1 = 0; + if (--length2 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare); + if (count1 !== 0) { + dest -= count1; + cursor1 -= count1; + length1 -= count1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = count1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + if (length1 === 0) { + exit = true; + break; + } + } + array[dest--] = tmp[cursor2--]; + if (--length2 === 1) { + exit = true; + break; + } + count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare); + if (count2 !== 0) { + dest -= count2; + cursor2 -= count2; + length2 -= count2; + customDest = dest + 1; + customCursor = cursor2 + 1; + for (i = 0; i < count2; i++) { + array[customDest + i] = tmp[customCursor + i]; + } + if (length2 <= 1) { + exit = true; + break; + } + } + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + if (minGallop < 1) { + minGallop = 1; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + } + else if (length2 === 0) { + throw new Error(); + } + else { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + } + } + return { + mergeRuns: mergeRuns, + forceMergeRuns: forceMergeRuns, + pushRun: pushRun + }; +} +function sort(array, compare, lo, hi) { + if (!lo) { + lo = 0; + } + if (!hi) { + hi = array.length; + } + var remaining = hi - lo; + if (remaining < 2) { + return; + } + var runLength = 0; + if (remaining < DEFAULT_MIN_MERGE) { + runLength = makeAscendingRun(array, lo, hi, compare); + binaryInsertionSort(array, lo, hi, lo + runLength, compare); + return; + } + var ts = TimSort(array, compare); + var minRun = minRunLength(remaining); + do { + runLength = makeAscendingRun(array, lo, hi, compare); + if (runLength < minRun) { + var force = remaining; + if (force > minRun) { + force = minRun; + } + binaryInsertionSort(array, lo, lo + force, lo + runLength, compare); + runLength = force; + } + ts.pushRun(lo, runLength); + ts.mergeRuns(); + remaining -= runLength; + lo += runLength; + } while (remaining !== 0); + ts.forceMergeRuns(); +} + +var REDRAW_BIT = 1; +var STYLE_CHANGED_BIT = 2; +var SHAPE_CHANGED_BIT = 4; + +var invalidZErrorLogged = false; +function logInvalidZError() { + if (invalidZErrorLogged) { + return; + } + invalidZErrorLogged = true; + console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors'); +} +function shapeCompareFunc(a, b) { + if (a.zlevel === b.zlevel) { + if (a.z === b.z) { + return a.z2 - b.z2; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; +} +var Storage = (function () { + function Storage() { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + this.displayableSortFunc = shapeCompareFunc; + } + Storage.prototype.traverse = function (cb, context) { + for (var i = 0; i < this._roots.length; i++) { + this._roots[i].traverse(cb, context); + } + }; + Storage.prototype.getDisplayList = function (update, includeIgnore) { + includeIgnore = includeIgnore || false; + var displayList = this._displayList; + if (update || !displayList.length) { + this.updateDisplayList(includeIgnore); + } + return displayList; + }; + Storage.prototype.updateDisplayList = function (includeIgnore) { + this._displayListLen = 0; + var roots = this._roots; + var displayList = this._displayList; + for (var i = 0, len = roots.length; i < len; i++) { + this._updateAndAddDisplayable(roots[i], null, includeIgnore); + } + displayList.length = this._displayListLen; + sort(displayList, shapeCompareFunc); + }; + Storage.prototype._updateAndAddDisplayable = function (el, clipPaths, includeIgnore) { + if (el.ignore && !includeIgnore) { + return; + } + el.beforeUpdate(); + el.update(); + el.afterUpdate(); + var userSetClipPath = el.getClipPath(); + if (el.ignoreClip) { + clipPaths = null; + } + else if (userSetClipPath) { + if (clipPaths) { + clipPaths = clipPaths.slice(); + } + else { + clipPaths = []; + } + var currentClipPath = userSetClipPath; + var parentClipPath = el; + while (currentClipPath) { + currentClipPath.parent = parentClipPath; + currentClipPath.updateTransform(); + clipPaths.push(currentClipPath); + parentClipPath = currentClipPath; + currentClipPath = currentClipPath.getClipPath(); + } + } + if (el.childrenRef) { + var children = el.childrenRef(); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (el.__dirty) { + child.__dirty |= REDRAW_BIT; + } + this._updateAndAddDisplayable(child, clipPaths, includeIgnore); + } + el.__dirty = 0; + } + else { + var disp = el; + if (clipPaths && clipPaths.length) { + disp.__clipPaths = clipPaths; + } + else if (disp.__clipPaths && disp.__clipPaths.length > 0) { + disp.__clipPaths = []; + } + if (isNaN(disp.z)) { + logInvalidZError(); + disp.z = 0; + } + if (isNaN(disp.z2)) { + logInvalidZError(); + disp.z2 = 0; + } + if (isNaN(disp.zlevel)) { + logInvalidZError(); + disp.zlevel = 0; + } + this._displayList[this._displayListLen++] = disp; + } + var decalEl = el.getDecalElement && el.getDecalElement(); + if (decalEl) { + this._updateAndAddDisplayable(decalEl, clipPaths, includeIgnore); + } + var textGuide = el.getTextGuideLine(); + if (textGuide) { + this._updateAndAddDisplayable(textGuide, clipPaths, includeIgnore); + } + var textEl = el.getTextContent(); + if (textEl) { + this._updateAndAddDisplayable(textEl, clipPaths, includeIgnore); + } + }; + Storage.prototype.addRoot = function (el) { + if (el.__zr && el.__zr.storage === this) { + return; + } + this._roots.push(el); + }; + Storage.prototype.delRoot = function (el) { + if (el instanceof Array) { + for (var i = 0, l = el.length; i < l; i++) { + this.delRoot(el[i]); + } + return; + } + var idx = indexOf(this._roots, el); + if (idx >= 0) { + this._roots.splice(idx, 1); + } + }; + Storage.prototype.delAllRoots = function () { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + return; + }; + Storage.prototype.getRoots = function () { + return this._roots; + }; + Storage.prototype.dispose = function () { + this._displayList = null; + this._roots = null; + }; + return Storage; +}()); + +var requestAnimationFrame$1; +requestAnimationFrame$1 = (env.hasGlobalWindow + && ((window.requestAnimationFrame && window.requestAnimationFrame.bind(window)) + || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window)) + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame)) || function (func) { + return setTimeout(func, 16); +}; + +var easingFuncs = { + linear: function (k) { + return k; + }, + quadraticIn: function (k) { + return k * k; + }, + quadraticOut: function (k) { + return k * (2 - k); + }, + quadraticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }, + cubicIn: function (k) { + return k * k * k; + }, + cubicOut: function (k) { + return --k * k * k + 1; + }, + cubicInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }, + quarticIn: function (k) { + return k * k * k * k; + }, + quarticOut: function (k) { + return 1 - (--k * k * k * k); + }, + quarticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }, + quinticIn: function (k) { + return k * k * k * k * k; + }, + quinticOut: function (k) { + return --k * k * k * k * k + 1; + }, + quinticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }, + sinusoidalIn: function (k) { + return 1 - Math.cos(k * Math.PI / 2); + }, + sinusoidalOut: function (k) { + return Math.sin(k * Math.PI / 2); + }, + sinusoidalInOut: function (k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }, + exponentialIn: function (k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }, + exponentialOut: function (k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }, + exponentialInOut: function (k) { + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }, + circularIn: function (k) { + return 1 - Math.sqrt(1 - k * k); + }, + circularOut: function (k) { + return Math.sqrt(1 - (--k * k)); + }, + circularInOut: function (k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }, + elasticIn: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + }, + elasticOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) + * Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }, + elasticInOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + backIn: function (k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + }, + backOut: function (k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }, + backInOut: function (k) { + var s = 1.70158 * 1.525; + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }, + bounceIn: function (k) { + return 1 - easingFuncs.bounceOut(1 - k); + }, + bounceOut: function (k) { + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } + else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } + else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } + else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }, + bounceInOut: function (k) { + if (k < 0.5) { + return easingFuncs.bounceIn(k * 2) * 0.5; + } + return easingFuncs.bounceOut(k * 2 - 1) * 0.5 + 0.5; + } +}; + +var mathPow$1 = Math.pow; +var mathSqrt$3 = Math.sqrt; +var EPSILON$2 = 1e-8; +var EPSILON_NUMERIC = 1e-4; +var THREE_SQRT = mathSqrt$3(3); +var ONE_THIRD = 1 / 3; +var _v0 = create$1(); +var _v1 = create$1(); +var _v2 = create$1(); +function isAroundZero(val) { + return val > -1e-8 && val < EPSILON$2; +} +function isNotAroundZero$1(val) { + return val > EPSILON$2 || val < -1e-8; +} +function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + + t * t * (t * p3 + 3 * onet * p2); +} +function cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + + (p3 - p2) * t * t); +} +function cubicRootAt(p0, p1, p2, p3, val, roots) { + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + var n = 0; + if (isAroundZero(A) && isAroundZero(B)) { + if (isAroundZero(b)) { + roots[0] = 0; + } + else { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = B * B - 4 * A * C; + if (isAroundZero(disc)) { + var K = B / A; + var t1 = -b / a + K; + var t2 = -K / 2; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt$3(disc); + var Y1 = A * b + 1.5 * a * (-B + discSqrt); + var Y2 = A * b + 1.5 * a * (-B - discSqrt); + if (Y1 < 0) { + Y1 = -mathPow$1(-Y1, ONE_THIRD); + } + else { + Y1 = mathPow$1(Y1, ONE_THIRD); + } + if (Y2 < 0) { + Y2 = -mathPow$1(-Y2, ONE_THIRD); + } + else { + Y2 = mathPow$1(Y2, ONE_THIRD); + } + var t1 = (-b - (Y1 + Y2)) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else { + var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt$3(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = mathSqrt$3(A); + var tmp = Math.cos(theta); + var t1 = (-b - 2 * ASqrt * tmp) / (3 * a); + var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a); + var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + return n; +} +function cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero$1(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } + else if (disc > 0) { + var discSqrt = mathSqrt$3(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + return n; +} +function cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + var p0123 = (p123 - p012) * t + p012; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; +} +function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + var prev; + var next; + var d1; + var d2; + _v0[0] = x; + _v0[1] = y; + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = cubicAt(x0, x1, x2, x3, _t); + _v1[1] = cubicAt(y0, y1, y2, y3, _t); + d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + prev = t - interval; + next = t + interval; + _v1[0] = cubicAt(x0, x1, x2, x3, prev); + _v1[1] = cubicAt(y0, y1, y2, y3, prev); + d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + _v2[0] = cubicAt(x0, x1, x2, x3, next); + _v2[1] = cubicAt(y0, y1, y2, y3, next); + d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + return mathSqrt$3(d); +} +function cubicLength(x0, y0, x1, y1, x2, y2, x3, y3, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = cubicAt(x0, x1, x2, x3, t); + var y = cubicAt(y0, y1, y2, y3, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; +} +function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; +} +function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); +} +function quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero$1(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + var t1 = -b / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt$3(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + return n; +} +function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + return 0.5; + } + else { + return (p0 - p1) / divider; + } +} +function quadraticSubdivide(p0, p1, p2, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p012 = (p12 - p01) * t + p01; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p012; + out[4] = p12; + out[5] = p2; +} +function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + _v0[0] = x; + _v0[1] = y; + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = quadraticAt(x0, x1, x2, _t); + _v1[1] = quadraticAt(y0, y1, y2, _t); + var d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + var prev = t - interval; + var next = t + interval; + _v1[0] = quadraticAt(x0, x1, x2, prev); + _v1[1] = quadraticAt(y0, y1, y2, prev); + var d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + _v2[0] = quadraticAt(x0, x1, x2, next); + _v2[1] = quadraticAt(y0, y1, y2, next); + var d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + return mathSqrt$3(d); +} +function quadraticLength(x0, y0, x1, y1, x2, y2, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = quadraticAt(x0, x1, x2, t); + var y = quadraticAt(y0, y1, y2, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; +} + +var regexp = /cubic-bezier\(([0-9,\.e ]+)\)/; +function createCubicEasingFunc(cubicEasingStr) { + var cubic = cubicEasingStr && regexp.exec(cubicEasingStr); + if (cubic) { + var points = cubic[1].split(','); + var a_1 = +trim(points[0]); + var b_1 = +trim(points[1]); + var c_1 = +trim(points[2]); + var d_1 = +trim(points[3]); + if (isNaN(a_1 + b_1 + c_1 + d_1)) { + return; + } + var roots_1 = []; + return function (p) { + return p <= 0 + ? 0 : p >= 1 + ? 1 + : cubicRootAt(0, a_1, c_1, 1, p, roots_1) && cubicAt(0, b_1, d_1, 1, roots_1[0]); + }; + } +} + +var Clip = (function () { + function Clip(opts) { + this._inited = false; + this._startTime = 0; + this._pausedTime = 0; + this._paused = false; + this._life = opts.life || 1000; + this._delay = opts.delay || 0; + this.loop = opts.loop || false; + this.onframe = opts.onframe || noop; + this.ondestroy = opts.ondestroy || noop; + this.onrestart = opts.onrestart || noop; + opts.easing && this.setEasing(opts.easing); + } + Clip.prototype.step = function (globalTime, deltaTime) { + if (!this._inited) { + this._startTime = globalTime + this._delay; + this._inited = true; + } + if (this._paused) { + this._pausedTime += deltaTime; + return; + } + var life = this._life; + var elapsedTime = globalTime - this._startTime - this._pausedTime; + var percent = elapsedTime / life; + if (percent < 0) { + percent = 0; + } + percent = Math.min(percent, 1); + var easingFunc = this.easingFunc; + var schedule = easingFunc ? easingFunc(percent) : percent; + this.onframe(schedule); + if (percent === 1) { + if (this.loop) { + var remainder = elapsedTime % life; + this._startTime = globalTime - remainder; + this._pausedTime = 0; + this.onrestart(); + } + else { + return true; + } + } + return false; + }; + Clip.prototype.pause = function () { + this._paused = true; + }; + Clip.prototype.resume = function () { + this._paused = false; + }; + Clip.prototype.setEasing = function (easing) { + this.easing = easing; + this.easingFunc = isFunction(easing) + ? easing + : easingFuncs[easing] || createCubicEasingFunc(easing); + }; + return Clip; +}()); + +var Entry = (function () { + function Entry(val) { + this.value = val; + } + return Entry; +}()); +var LinkedList = (function () { + function LinkedList() { + this._len = 0; + } + LinkedList.prototype.insert = function (val) { + var entry = new Entry(val); + this.insertEntry(entry); + return entry; + }; + LinkedList.prototype.insertEntry = function (entry) { + if (!this.head) { + this.head = this.tail = entry; + } + else { + this.tail.next = entry; + entry.prev = this.tail; + entry.next = null; + this.tail = entry; + } + this._len++; + }; + LinkedList.prototype.remove = function (entry) { + var prev = entry.prev; + var next = entry.next; + if (prev) { + prev.next = next; + } + else { + this.head = next; + } + if (next) { + next.prev = prev; + } + else { + this.tail = prev; + } + entry.next = entry.prev = null; + this._len--; + }; + LinkedList.prototype.len = function () { + return this._len; + }; + LinkedList.prototype.clear = function () { + this.head = this.tail = null; + this._len = 0; + }; + return LinkedList; +}()); +var LRU = (function () { + function LRU(maxSize) { + this._list = new LinkedList(); + this._maxSize = 10; + this._map = {}; + this._maxSize = maxSize; + } + LRU.prototype.put = function (key, value) { + var list = this._list; + var map = this._map; + var removed = null; + if (map[key] == null) { + var len = list.len(); + var entry = this._lastRemovedEntry; + if (len >= this._maxSize && len > 0) { + var leastUsedEntry = list.head; + list.remove(leastUsedEntry); + delete map[leastUsedEntry.key]; + removed = leastUsedEntry.value; + this._lastRemovedEntry = leastUsedEntry; + } + if (entry) { + entry.value = value; + } + else { + entry = new Entry(value); + } + entry.key = key; + list.insertEntry(entry); + map[key] = entry; + } + return removed; + }; + LRU.prototype.get = function (key) { + var entry = this._map[key]; + var list = this._list; + if (entry != null) { + if (entry !== list.tail) { + list.remove(entry); + list.insertEntry(entry); + } + return entry.value; + } + }; + LRU.prototype.clear = function () { + this._list.clear(); + this._map = {}; + }; + LRU.prototype.len = function () { + return this._list.len(); + }; + return LRU; +}()); + +var kCSSColorTable = { + '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] +}; +function clampCssByte(i) { + i = Math.round(i); + return i < 0 ? 0 : i > 255 ? 255 : i; +} +function clampCssFloat(f) { + return f < 0 ? 0 : f > 1 ? 1 : f; +} +function parseCssInt(val) { + var str = val; + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssByte(parseFloat(str) / 100 * 255); + } + return clampCssByte(parseInt(str, 10)); +} +function parseCssFloat(val) { + var str = val; + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssFloat(parseFloat(str) / 100); + } + return clampCssFloat(parseFloat(str)); +} +function cssHueToRgb(m1, m2, h) { + if (h < 0) { + h += 1; + } + else if (h > 1) { + h -= 1; + } + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } + if (h * 2 < 1) { + return m2; + } + if (h * 3 < 2) { + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + } + return m1; +} +function lerpNumber(a, b, p) { + return a + (b - a) * p; +} +function setRgba(out, r, g, b, a) { + out[0] = r; + out[1] = g; + out[2] = b; + out[3] = a; + return out; +} +function copyRgba(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +} +var colorCache = new LRU(20); +var lastRemovedArr = null; +function putToCache(colorStr, rgbaArr) { + if (lastRemovedArr) { + copyRgba(lastRemovedArr, rgbaArr); + } + lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice())); +} +function parse(colorStr, rgbaArr) { + if (!colorStr) { + return; + } + rgbaArr = rgbaArr || []; + var cached = colorCache.get(colorStr); + if (cached) { + return copyRgba(rgbaArr, cached); + } + colorStr = colorStr + ''; + var str = colorStr.replace(/ /g, '').toLowerCase(); + if (str in kCSSColorTable) { + copyRgba(rgbaArr, kCSSColorTable[str]); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + var strLen = str.length; + if (str.charAt(0) === '#') { + if (strLen === 4 || strLen === 5) { + var iv = parseInt(str.slice(1, 4), 16); + if (!(iv >= 0 && iv <= 0xfff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), strLen === 5 ? parseInt(str.slice(4), 16) / 0xf : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + else if (strLen === 7 || strLen === 9) { + var iv = parseInt(str.slice(1, 7), 16); + if (!(iv >= 0 && iv <= 0xffffff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, strLen === 9 ? parseInt(str.slice(7), 16) / 0xff : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + return; + } + var op = str.indexOf('('); + var ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === strLen) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; + switch (fname) { + case 'rgba': + if (params.length !== 4) { + return params.length === 3 + ? setRgba(rgbaArr, +params[0], +params[1], +params[2], 1) + : setRgba(rgbaArr, 0, 0, 0, 1); + } + alpha = parseCssFloat(params.pop()); + case 'rgb': + if (params.length >= 3) { + setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), params.length === 3 ? alpha : parseCssFloat(params[3])); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + else { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + case 'hsla': + if (params.length !== 4) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + params[3] = parseCssFloat(params[3]); + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsl': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + default: + return; + } + } + setRgba(rgbaArr, 0, 0, 0, 1); + return; +} +function hsla2rgba(hsla, rgba) { + var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360; + var s = parseCssFloat(hsla[1]); + var l = parseCssFloat(hsla[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + rgba = rgba || []; + setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1); + if (hsla.length === 4) { + rgba[3] = hsla[3]; + } + return rgba; +} +function lift(color, level) { + var colorArr = parse(color); + if (colorArr) { + for (var i = 0; i < 3; i++) { + { + colorArr[i] = colorArr[i] * (1 - level) | 0; + } + if (colorArr[i] > 255) { + colorArr[i] = 255; + } + else if (colorArr[i] < 0) { + colorArr[i] = 0; + } + } + return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb'); + } +} +function lerp(normalizedValue, colors, fullOutput) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1)) { + return; + } + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = parse(colors[leftIndex]); + var rightColor = parse(colors[rightIndex]); + var dv = value - leftIndex; + var color = stringify([ + clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)), + clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)), + clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)), + clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)) + ], 'rgba'); + return fullOutput + ? { + color: color, + leftIndex: leftIndex, + rightIndex: rightIndex, + value: value + } + : color; +} +function stringify(arrColor, type) { + if (!arrColor || !arrColor.length) { + return; + } + var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2]; + if (type === 'rgba' || type === 'hsva' || type === 'hsla') { + colorStr += ',' + arrColor[3]; + } + return type + '(' + colorStr + ')'; +} +function lum(color, backgroundLum) { + var arr = parse(color); + return arr + ? (0.299 * arr[0] + 0.587 * arr[1] + 0.114 * arr[2]) * arr[3] / 255 + + (1 - arr[3]) * backgroundLum + : 0; +} +var liftedColorCache = new LRU(100); +function liftColor(color) { + if (isString(color)) { + var liftedColor = liftedColorCache.get(color); + if (!liftedColor) { + liftedColor = lift(color, -0.1); + liftedColorCache.put(color, liftedColor); + } + return liftedColor; + } + else if (isGradientObject(color)) { + var ret = extend({}, color); + ret.colorStops = map$1(color.colorStops, function (stop) { return ({ + offset: stop.offset, + color: lift(stop.color, -0.1) + }); }); + return ret; + } + return color; +} + +function isLinearGradient(val) { + return val.type === "linear"; +} +function isRadialGradient(val) { + return val.type === "radial"; +} +(function() { + if (env.hasGlobalWindow && isFunction(window.btoa)) { + return function(str) { + return window.btoa(unescape(encodeURIComponent(str))); + }; + } + if (typeof Buffer !== "undefined") { + return function(str) { + return Buffer.from(str).toString("base64"); + }; + } + return function(str) { + return null; + }; +})(); + +var arraySlice = Array.prototype.slice; +function interpolateNumber$1(p0, p1, percent) { + return (p1 - p0) * percent + p0; +} +function interpolate1DArray(out, p0, p1, percent) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = interpolateNumber$1(p0[i], p1[i], percent); + } + return out; +} +function interpolate2DArray(out, p0, p1, percent) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = interpolateNumber$1(p0[i][j], p1[i][j], percent); + } + } + return out; +} +function add1DArray(out, p0, p1, sign) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = p0[i] + p1[i] * sign; + } + return out; +} +function add2DArray(out, p0, p1, sign) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = p0[i][j] + p1[i][j] * sign; + } + } + return out; +} +function fillColorStops(val0, val1) { + var len0 = val0.length; + var len1 = val1.length; + var shorterArr = len0 > len1 ? val1 : val0; + var shorterLen = Math.min(len0, len1); + var last = shorterArr[shorterLen - 1] || { color: [0, 0, 0, 0], offset: 0 }; + for (var i = shorterLen; i < Math.max(len0, len1); i++) { + shorterArr.push({ + offset: last.offset, + color: last.color.slice() + }); + } +} +function fillArray(val0, val1, arrDim) { + var arr0 = val0; + var arr1 = val1; + if (!arr0.push || !arr1.push) { + return; + } + var arr0Len = arr0.length; + var arr1Len = arr1.length; + if (arr0Len !== arr1Len) { + var isPreviousLarger = arr0Len > arr1Len; + if (isPreviousLarger) { + arr0.length = arr1Len; + } + else { + for (var i = arr0Len; i < arr1Len; i++) { + arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i])); + } + } + } + var len2 = arr0[0] && arr0[0].length; + for (var i = 0; i < arr0.length; i++) { + if (arrDim === 1) { + if (isNaN(arr0[i])) { + arr0[i] = arr1[i]; + } + } + else { + for (var j = 0; j < len2; j++) { + if (isNaN(arr0[i][j])) { + arr0[i][j] = arr1[i][j]; + } + } + } + } +} +function cloneValue(value) { + if (isArrayLike(value)) { + var len = value.length; + if (isArrayLike(value[0])) { + var ret = []; + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + return ret; + } + return arraySlice.call(value); + } + return value; +} +function rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]) || 0; + rgba[1] = Math.floor(rgba[1]) || 0; + rgba[2] = Math.floor(rgba[2]) || 0; + rgba[3] = rgba[3] == null ? 1 : rgba[3]; + return 'rgba(' + rgba.join(',') + ')'; +} +function guessArrayDim(value) { + return isArrayLike(value && value[0]) ? 2 : 1; +} +var VALUE_TYPE_NUMBER = 0; +var VALUE_TYPE_1D_ARRAY = 1; +var VALUE_TYPE_2D_ARRAY = 2; +var VALUE_TYPE_COLOR = 3; +var VALUE_TYPE_LINEAR_GRADIENT = 4; +var VALUE_TYPE_RADIAL_GRADIENT = 5; +var VALUE_TYPE_UNKOWN = 6; +function isGradientValueType(valType) { + return valType === VALUE_TYPE_LINEAR_GRADIENT || valType === VALUE_TYPE_RADIAL_GRADIENT; +} +function isArrayValueType(valType) { + return valType === VALUE_TYPE_1D_ARRAY || valType === VALUE_TYPE_2D_ARRAY; +} +var tmpRgba = [0, 0, 0, 0]; +var Track = (function () { + function Track(propName) { + this.keyframes = []; + this.discrete = false; + this._invalid = false; + this._needsSort = false; + this._lastFr = 0; + this._lastFrP = 0; + this.propName = propName; + } + Track.prototype.isFinished = function () { + return this._finished; + }; + Track.prototype.setFinished = function () { + this._finished = true; + if (this._additiveTrack) { + this._additiveTrack.setFinished(); + } + }; + Track.prototype.needsAnimate = function () { + return this.keyframes.length >= 1; + }; + Track.prototype.getAdditiveTrack = function () { + return this._additiveTrack; + }; + Track.prototype.addKeyframe = function (time, rawValue, easing) { + this._needsSort = true; + var keyframes = this.keyframes; + var len = keyframes.length; + var discrete = false; + var valType = VALUE_TYPE_UNKOWN; + var value = rawValue; + if (isArrayLike(rawValue)) { + var arrayDim = guessArrayDim(rawValue); + valType = arrayDim; + if (arrayDim === 1 && !isNumber(rawValue[0]) + || arrayDim === 2 && !isNumber(rawValue[0][0])) { + discrete = true; + } + } + else { + if (isNumber(rawValue) && !eqNaN(rawValue)) { + valType = VALUE_TYPE_NUMBER; + } + else if (isString(rawValue)) { + if (!isNaN(+rawValue)) { + valType = VALUE_TYPE_NUMBER; + } + else { + var colorArray = parse(rawValue); + if (colorArray) { + value = colorArray; + valType = VALUE_TYPE_COLOR; + } + } + } + else if (isGradientObject(rawValue)) { + var parsedGradient = extend({}, value); + parsedGradient.colorStops = map$1(rawValue.colorStops, function (colorStop) { return ({ + offset: colorStop.offset, + color: parse(colorStop.color) + }); }); + if (isLinearGradient(rawValue)) { + valType = VALUE_TYPE_LINEAR_GRADIENT; + } + else if (isRadialGradient(rawValue)) { + valType = VALUE_TYPE_RADIAL_GRADIENT; + } + value = parsedGradient; + } + } + if (len === 0) { + this.valType = valType; + } + else if (valType !== this.valType || valType === VALUE_TYPE_UNKOWN) { + discrete = true; + } + this.discrete = this.discrete || discrete; + var kf = { + time: time, + value: value, + rawValue: rawValue, + percent: 0 + }; + if (easing) { + kf.easing = easing; + kf.easingFunc = isFunction(easing) + ? easing + : easingFuncs[easing] || createCubicEasingFunc(easing); + } + keyframes.push(kf); + return kf; + }; + Track.prototype.prepare = function (maxTime, additiveTrack) { + var kfs = this.keyframes; + if (this._needsSort) { + kfs.sort(function (a, b) { + return a.time - b.time; + }); + } + var valType = this.valType; + var kfsLen = kfs.length; + var lastKf = kfs[kfsLen - 1]; + var isDiscrete = this.discrete; + var isArr = isArrayValueType(valType); + var isGradient = isGradientValueType(valType); + for (var i = 0; i < kfsLen; i++) { + var kf = kfs[i]; + var value = kf.value; + var lastValue = lastKf.value; + kf.percent = kf.time / maxTime; + if (!isDiscrete) { + if (isArr && i !== kfsLen - 1) { + fillArray(value, lastValue, valType); + } + else if (isGradient) { + fillColorStops(value.colorStops, lastValue.colorStops); + } + } + } + if (!isDiscrete + && valType !== VALUE_TYPE_RADIAL_GRADIENT + && additiveTrack + && this.needsAnimate() + && additiveTrack.needsAnimate() + && valType === additiveTrack.valType + && !additiveTrack._finished) { + this._additiveTrack = additiveTrack; + var startValue = kfs[0].value; + for (var i = 0; i < kfsLen; i++) { + if (valType === VALUE_TYPE_NUMBER) { + kfs[i].additiveValue = kfs[i].value - startValue; + } + else if (valType === VALUE_TYPE_COLOR) { + kfs[i].additiveValue = + add1DArray([], kfs[i].value, startValue, -1); + } + else if (isArrayValueType(valType)) { + kfs[i].additiveValue = valType === VALUE_TYPE_1D_ARRAY + ? add1DArray([], kfs[i].value, startValue, -1) + : add2DArray([], kfs[i].value, startValue, -1); + } + } + } + }; + Track.prototype.step = function (target, percent) { + if (this._finished) { + return; + } + if (this._additiveTrack && this._additiveTrack._finished) { + this._additiveTrack = null; + } + var isAdditive = this._additiveTrack != null; + var valueKey = isAdditive ? 'additiveValue' : 'value'; + var valType = this.valType; + var keyframes = this.keyframes; + var kfsNum = keyframes.length; + var propName = this.propName; + var isValueColor = valType === VALUE_TYPE_COLOR; + var frameIdx; + var lastFrame = this._lastFr; + var mathMin = Math.min; + var frame; + var nextFrame; + if (kfsNum === 1) { + frame = nextFrame = keyframes[0]; + } + else { + if (percent < 0) { + frameIdx = 0; + } + else if (percent < this._lastFrP) { + var start = mathMin(lastFrame + 1, kfsNum - 1); + for (frameIdx = start; frameIdx >= 0; frameIdx--) { + if (keyframes[frameIdx].percent <= percent) { + break; + } + } + frameIdx = mathMin(frameIdx, kfsNum - 2); + } + else { + for (frameIdx = lastFrame; frameIdx < kfsNum; frameIdx++) { + if (keyframes[frameIdx].percent > percent) { + break; + } + } + frameIdx = mathMin(frameIdx - 1, kfsNum - 2); + } + nextFrame = keyframes[frameIdx + 1]; + frame = keyframes[frameIdx]; + } + if (!(frame && nextFrame)) { + return; + } + this._lastFr = frameIdx; + this._lastFrP = percent; + var interval = (nextFrame.percent - frame.percent); + var w = interval === 0 ? 1 : mathMin((percent - frame.percent) / interval, 1); + if (nextFrame.easingFunc) { + w = nextFrame.easingFunc(w); + } + var targetArr = isAdditive ? this._additiveValue + : (isValueColor ? tmpRgba : target[propName]); + if ((isArrayValueType(valType) || isValueColor) && !targetArr) { + targetArr = this._additiveValue = []; + } + if (this.discrete) { + target[propName] = w < 1 ? frame.rawValue : nextFrame.rawValue; + } + else if (isArrayValueType(valType)) { + valType === VALUE_TYPE_1D_ARRAY + ? interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w) + : interpolate2DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + } + else if (isGradientValueType(valType)) { + var val = frame[valueKey]; + var nextVal_1 = nextFrame[valueKey]; + var isLinearGradient_1 = valType === VALUE_TYPE_LINEAR_GRADIENT; + target[propName] = { + type: isLinearGradient_1 ? 'linear' : 'radial', + x: interpolateNumber$1(val.x, nextVal_1.x, w), + y: interpolateNumber$1(val.y, nextVal_1.y, w), + colorStops: map$1(val.colorStops, function (colorStop, idx) { + var nextColorStop = nextVal_1.colorStops[idx]; + return { + offset: interpolateNumber$1(colorStop.offset, nextColorStop.offset, w), + color: rgba2String(interpolate1DArray([], colorStop.color, nextColorStop.color, w)) + }; + }), + global: nextVal_1.global + }; + if (isLinearGradient_1) { + target[propName].x2 = interpolateNumber$1(val.x2, nextVal_1.x2, w); + target[propName].y2 = interpolateNumber$1(val.y2, nextVal_1.y2, w); + } + else { + target[propName].r = interpolateNumber$1(val.r, nextVal_1.r, w); + } + } + else if (isValueColor) { + interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + if (!isAdditive) { + target[propName] = rgba2String(targetArr); + } + } + else { + var value = interpolateNumber$1(frame[valueKey], nextFrame[valueKey], w); + if (isAdditive) { + this._additiveValue = value; + } + else { + target[propName] = value; + } + } + if (isAdditive) { + this._addToTarget(target); + } + }; + Track.prototype._addToTarget = function (target) { + var valType = this.valType; + var propName = this.propName; + var additiveValue = this._additiveValue; + if (valType === VALUE_TYPE_NUMBER) { + target[propName] = target[propName] + additiveValue; + } + else if (valType === VALUE_TYPE_COLOR) { + parse(target[propName], tmpRgba); + add1DArray(tmpRgba, tmpRgba, additiveValue, 1); + target[propName] = rgba2String(tmpRgba); + } + else if (valType === VALUE_TYPE_1D_ARRAY) { + add1DArray(target[propName], target[propName], additiveValue, 1); + } + else if (valType === VALUE_TYPE_2D_ARRAY) { + add2DArray(target[propName], target[propName], additiveValue, 1); + } + }; + return Track; +}()); +var Animator = (function () { + function Animator(target, loop, allowDiscreteAnimation, additiveTo) { + this._tracks = {}; + this._trackKeys = []; + this._maxTime = 0; + this._started = 0; + this._clip = null; + this._target = target; + this._loop = loop; + if (loop && additiveTo) { + logError('Can\' use additive animation on looped animation.'); + return; + } + this._additiveAnimators = additiveTo; + this._allowDiscrete = allowDiscreteAnimation; + } + Animator.prototype.getMaxTime = function () { + return this._maxTime; + }; + Animator.prototype.getDelay = function () { + return this._delay; + }; + Animator.prototype.getLoop = function () { + return this._loop; + }; + Animator.prototype.getTarget = function () { + return this._target; + }; + Animator.prototype.changeTarget = function (target) { + this._target = target; + }; + Animator.prototype.when = function (time, props, easing) { + return this.whenWithKeys(time, props, keys(props), easing); + }; + Animator.prototype.whenWithKeys = function (time, props, propNames, easing) { + var tracks = this._tracks; + for (var i = 0; i < propNames.length; i++) { + var propName = propNames[i]; + var track = tracks[propName]; + if (!track) { + track = tracks[propName] = new Track(propName); + var initialValue = void 0; + var additiveTrack = this._getAdditiveTrack(propName); + if (additiveTrack) { + var addtiveTrackKfs = additiveTrack.keyframes; + var lastFinalKf = addtiveTrackKfs[addtiveTrackKfs.length - 1]; + initialValue = lastFinalKf && lastFinalKf.value; + if (additiveTrack.valType === VALUE_TYPE_COLOR && initialValue) { + initialValue = rgba2String(initialValue); + } + } + else { + initialValue = this._target[propName]; + } + if (initialValue == null) { + continue; + } + if (time > 0) { + track.addKeyframe(0, cloneValue(initialValue), easing); + } + this._trackKeys.push(propName); + } + track.addKeyframe(time, cloneValue(props[propName]), easing); + } + this._maxTime = Math.max(this._maxTime, time); + return this; + }; + Animator.prototype.pause = function () { + this._clip.pause(); + this._paused = true; + }; + Animator.prototype.resume = function () { + this._clip.resume(); + this._paused = false; + }; + Animator.prototype.isPaused = function () { + return !!this._paused; + }; + Animator.prototype.duration = function (duration) { + this._maxTime = duration; + this._force = true; + return this; + }; + Animator.prototype._doneCallback = function () { + this._setTracksFinished(); + this._clip = null; + var doneList = this._doneCbs; + if (doneList) { + var len = doneList.length; + for (var i = 0; i < len; i++) { + doneList[i].call(this); + } + } + }; + Animator.prototype._abortedCallback = function () { + this._setTracksFinished(); + var animation = this.animation; + var abortedList = this._abortedCbs; + if (animation) { + animation.removeClip(this._clip); + } + this._clip = null; + if (abortedList) { + for (var i = 0; i < abortedList.length; i++) { + abortedList[i].call(this); + } + } + }; + Animator.prototype._setTracksFinished = function () { + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < tracksKeys.length; i++) { + tracks[tracksKeys[i]].setFinished(); + } + }; + Animator.prototype._getAdditiveTrack = function (trackName) { + var additiveTrack; + var additiveAnimators = this._additiveAnimators; + if (additiveAnimators) { + for (var i = 0; i < additiveAnimators.length; i++) { + var track = additiveAnimators[i].getTrack(trackName); + if (track) { + additiveTrack = track; + } + } + } + return additiveTrack; + }; + Animator.prototype.start = function (easing) { + if (this._started > 0) { + return; + } + this._started = 1; + var self = this; + var tracks = []; + var maxTime = this._maxTime || 0; + for (var i = 0; i < this._trackKeys.length; i++) { + var propName = this._trackKeys[i]; + var track = this._tracks[propName]; + var additiveTrack = this._getAdditiveTrack(propName); + var kfs = track.keyframes; + var kfsNum = kfs.length; + track.prepare(maxTime, additiveTrack); + if (track.needsAnimate()) { + if (!this._allowDiscrete && track.discrete) { + var lastKf = kfs[kfsNum - 1]; + if (lastKf) { + self._target[track.propName] = lastKf.rawValue; + } + track.setFinished(); + } + else { + tracks.push(track); + } + } + } + if (tracks.length || this._force) { + var clip = new Clip({ + life: maxTime, + loop: this._loop, + delay: this._delay || 0, + onframe: function (percent) { + self._started = 2; + var additiveAnimators = self._additiveAnimators; + if (additiveAnimators) { + var stillHasAdditiveAnimator = false; + for (var i = 0; i < additiveAnimators.length; i++) { + if (additiveAnimators[i]._clip) { + stillHasAdditiveAnimator = true; + break; + } + } + if (!stillHasAdditiveAnimator) { + self._additiveAnimators = null; + } + } + for (var i = 0; i < tracks.length; i++) { + tracks[i].step(self._target, percent); + } + var onframeList = self._onframeCbs; + if (onframeList) { + for (var i = 0; i < onframeList.length; i++) { + onframeList[i](self._target, percent); + } + } + }, + ondestroy: function () { + self._doneCallback(); + } + }); + this._clip = clip; + if (this.animation) { + this.animation.addClip(clip); + } + if (easing) { + clip.setEasing(easing); + } + } + else { + this._doneCallback(); + } + return this; + }; + Animator.prototype.stop = function (forwardToLast) { + if (!this._clip) { + return; + } + var clip = this._clip; + if (forwardToLast) { + clip.onframe(1); + } + this._abortedCallback(); + }; + Animator.prototype.delay = function (time) { + this._delay = time; + return this; + }; + Animator.prototype.during = function (cb) { + if (cb) { + if (!this._onframeCbs) { + this._onframeCbs = []; + } + this._onframeCbs.push(cb); + } + return this; + }; + Animator.prototype.done = function (cb) { + if (cb) { + if (!this._doneCbs) { + this._doneCbs = []; + } + this._doneCbs.push(cb); + } + return this; + }; + Animator.prototype.aborted = function (cb) { + if (cb) { + if (!this._abortedCbs) { + this._abortedCbs = []; + } + this._abortedCbs.push(cb); + } + return this; + }; + Animator.prototype.getClip = function () { + return this._clip; + }; + Animator.prototype.getTrack = function (propName) { + return this._tracks[propName]; + }; + Animator.prototype.getTracks = function () { + var _this = this; + return map$1(this._trackKeys, function (key) { return _this._tracks[key]; }); + }; + Animator.prototype.stopTracks = function (propNames, forwardToLast) { + if (!propNames.length || !this._clip) { + return true; + } + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < propNames.length; i++) { + var track = tracks[propNames[i]]; + if (track && !track.isFinished()) { + if (forwardToLast) { + track.step(this._target, 1); + } + else if (this._started === 1) { + track.step(this._target, 0); + } + track.setFinished(); + } + } + var allAborted = true; + for (var i = 0; i < tracksKeys.length; i++) { + if (!tracks[tracksKeys[i]].isFinished()) { + allAborted = false; + break; + } + } + if (allAborted) { + this._abortedCallback(); + } + return allAborted; + }; + Animator.prototype.saveTo = function (target, trackKeys, firstOrLast) { + if (!target) { + return; + } + trackKeys = trackKeys || this._trackKeys; + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track || track.isFinished()) { + continue; + } + var kfs = track.keyframes; + var kf = kfs[firstOrLast ? 0 : kfs.length - 1]; + if (kf) { + target[propName] = cloneValue(kf.rawValue); + } + } + }; + Animator.prototype.__changeFinalValue = function (finalProps, trackKeys) { + trackKeys = trackKeys || keys(finalProps); + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track) { + continue; + } + var kfs = track.keyframes; + if (kfs.length > 1) { + var lastKf = kfs.pop(); + track.addKeyframe(lastKf.time, finalProps[propName]); + track.prepare(this._maxTime, track.getAdditiveTrack()); + } + } + }; + return Animator; +}()); + +function getTime() { + return new Date().getTime(); +} +var Animation = (function (_super) { + __extends(Animation, _super); + function Animation(opts) { + var _this = _super.call(this) || this; + _this._running = false; + _this._time = 0; + _this._pausedTime = 0; + _this._pauseStart = 0; + _this._paused = false; + opts = opts || {}; + _this.stage = opts.stage || {}; + return _this; + } + Animation.prototype.addClip = function (clip) { + if (clip.animation) { + this.removeClip(clip); + } + if (!this._head) { + this._head = this._tail = clip; + } + else { + this._tail.next = clip; + clip.prev = this._tail; + clip.next = null; + this._tail = clip; + } + clip.animation = this; + }; + Animation.prototype.addAnimator = function (animator) { + animator.animation = this; + var clip = animator.getClip(); + if (clip) { + this.addClip(clip); + } + }; + Animation.prototype.removeClip = function (clip) { + if (!clip.animation) { + return; + } + var prev = clip.prev; + var next = clip.next; + if (prev) { + prev.next = next; + } + else { + this._head = next; + } + if (next) { + next.prev = prev; + } + else { + this._tail = prev; + } + clip.next = clip.prev = clip.animation = null; + }; + Animation.prototype.removeAnimator = function (animator) { + var clip = animator.getClip(); + if (clip) { + this.removeClip(clip); + } + animator.animation = null; + }; + Animation.prototype.update = function (notTriggerFrameAndStageUpdate) { + var time = getTime() - this._pausedTime; + var delta = time - this._time; + var clip = this._head; + while (clip) { + var nextClip = clip.next; + var finished = clip.step(time, delta); + if (finished) { + clip.ondestroy(); + this.removeClip(clip); + clip = nextClip; + } + else { + clip = nextClip; + } + } + this._time = time; + if (!notTriggerFrameAndStageUpdate) { + this.trigger('frame', delta); + this.stage.update && this.stage.update(); + } + }; + Animation.prototype._startLoop = function () { + var self = this; + this._running = true; + function step() { + if (self._running) { + requestAnimationFrame$1(step); + !self._paused && self.update(); + } + } + requestAnimationFrame$1(step); + }; + Animation.prototype.start = function () { + if (this._running) { + return; + } + this._time = getTime(); + this._pausedTime = 0; + this._startLoop(); + }; + Animation.prototype.stop = function () { + this._running = false; + }; + Animation.prototype.pause = function () { + if (!this._paused) { + this._pauseStart = getTime(); + this._paused = true; + } + }; + Animation.prototype.resume = function () { + if (this._paused) { + this._pausedTime += getTime() - this._pauseStart; + this._paused = false; + } + }; + Animation.prototype.clear = function () { + var clip = this._head; + while (clip) { + var nextClip = clip.next; + clip.prev = clip.next = clip.animation = null; + clip = nextClip; + } + this._head = this._tail = null; + }; + Animation.prototype.isFinished = function () { + return this._head == null; + }; + Animation.prototype.animate = function (target, options) { + options = options || {}; + this.start(); + var animator = new Animator(target, options.loop); + this.addAnimator(animator); + return animator; + }; + return Animation; +}(Eventful)); + +var TOUCH_CLICK_DELAY = 300; +var globalEventSupported = env.domSupported; +var localNativeListenerNames = (function () { + var mouseHandlerNames = [ + 'click', 'dblclick', 'mousewheel', 'wheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' + ]; + var touchHandlerNames = [ + 'touchstart', 'touchend', 'touchmove' + ]; + var pointerEventNameMap = { + pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1 + }; + var pointerHandlerNames = map$1(mouseHandlerNames, function (name) { + var nm = name.replace('mouse', 'pointer'); + return pointerEventNameMap.hasOwnProperty(nm) ? nm : name; + }); + return { + mouse: mouseHandlerNames, + touch: touchHandlerNames, + pointer: pointerHandlerNames + }; +})(); +var globalNativeListenerNames = { + mouse: ['mousemove', 'mouseup'], + pointer: ['pointermove', 'pointerup'] +}; +var wheelEventSupported = false; +function isPointerFromTouch(event) { + var pointerType = event.pointerType; + return pointerType === 'pen' || pointerType === 'touch'; +} +function setTouchTimer(scope) { + scope.touching = true; + if (scope.touchTimer != null) { + clearTimeout(scope.touchTimer); + scope.touchTimer = null; + } + scope.touchTimer = setTimeout(function () { + scope.touching = false; + scope.touchTimer = null; + }, 700); +} +function markTouch(event) { + event && (event.zrByTouch = true); +} +function normalizeGlobalEvent(instance, event) { + return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true); +} +function isLocalEl(instance, el) { + var elTmp = el; + var isLocal = false; + while (elTmp && elTmp.nodeType !== 9 + && !(isLocal = elTmp.domBelongToZr + || (elTmp !== el && elTmp === instance.painterRoot))) { + elTmp = elTmp.parentNode; + } + return isLocal; +} +var FakeGlobalEvent = (function () { + function FakeGlobalEvent(instance, event) { + this.stopPropagation = noop; + this.stopImmediatePropagation = noop; + this.preventDefault = noop; + this.type = event.type; + this.target = this.currentTarget = instance.dom; + this.pointerType = event.pointerType; + this.clientX = event.clientX; + this.clientY = event.clientY; + } + return FakeGlobalEvent; +}()); +var localDOMHandlers = { + mousedown: function (event) { + event = normalizeEvent(this.dom, event); + this.__mayPointerCapture = [event.zrX, event.zrY]; + this.trigger('mousedown', event); + }, + mousemove: function (event) { + event = normalizeEvent(this.dom, event); + var downPoint = this.__mayPointerCapture; + if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) { + this.__togglePointerCapture(true); + } + this.trigger('mousemove', event); + }, + mouseup: function (event) { + event = normalizeEvent(this.dom, event); + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + }, + mouseout: function (event) { + event = normalizeEvent(this.dom, event); + var element = event.toElement || event.relatedTarget; + if (!isLocalEl(this, element)) { + if (this.__pointerCapturing) { + event.zrEventControl = 'no_globalout'; + } + this.trigger('mouseout', event); + } + }, + wheel: function (event) { + wheelEventSupported = true; + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + mousewheel: function (event) { + if (wheelEventSupported) { + return; + } + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + touchstart: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.__lastTouchMoment = new Date(); + this.handler.processGesture(event, 'start'); + localDOMHandlers.mousemove.call(this, event); + localDOMHandlers.mousedown.call(this, event); + }, + touchmove: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'change'); + localDOMHandlers.mousemove.call(this, event); + }, + touchend: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'end'); + localDOMHandlers.mouseup.call(this, event); + if (+new Date() - (+this.__lastTouchMoment) < TOUCH_CLICK_DELAY) { + localDOMHandlers.click.call(this, event); + } + }, + pointerdown: function (event) { + localDOMHandlers.mousedown.call(this, event); + }, + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + localDOMHandlers.mouseup.call(this, event); + }, + pointerout: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mouseout.call(this, event); + } + } +}; +each$4(['click', 'dblclick', 'contextmenu'], function (name) { + localDOMHandlers[name] = function (event) { + event = normalizeEvent(this.dom, event); + this.trigger(name, event); + }; +}); +var globalDOMHandlers = { + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + globalDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + globalDOMHandlers.mouseup.call(this, event); + }, + mousemove: function (event) { + this.trigger('mousemove', event); + }, + mouseup: function (event) { + var pointerCaptureReleasing = this.__pointerCapturing; + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + if (pointerCaptureReleasing) { + event.zrEventControl = 'only_globalout'; + this.trigger('mouseout', event); + } + } +}; +function mountLocalDOMEventListeners(instance, scope) { + var domHandlers = scope.domHandlers; + if (env.pointerEventsSupported) { + each$4(localNativeListenerNames.pointer, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + }); + }); + } + else { + if (env.touchEventsSupported) { + each$4(localNativeListenerNames.touch, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + setTouchTimer(scope); + }); + }); + } + each$4(localNativeListenerNames.mouse, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + event = getNativeEvent(event); + if (!scope.touching) { + domHandlers[nativeEventName].call(instance, event); + } + }); + }); + } +} +function mountGlobalDOMEventListeners(instance, scope) { + if (env.pointerEventsSupported) { + each$4(globalNativeListenerNames.pointer, mount); + } + else if (!env.touchEventsSupported) { + each$4(globalNativeListenerNames.mouse, mount); + } + function mount(nativeEventName) { + function nativeEventListener(event) { + event = getNativeEvent(event); + if (!isLocalEl(instance, event.target)) { + event = normalizeGlobalEvent(instance, event); + scope.domHandlers[nativeEventName].call(instance, event); + } + } + mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, { capture: true }); + } +} +function mountSingleDOMEventListener(scope, nativeEventName, listener, opt) { + scope.mounted[nativeEventName] = listener; + scope.listenerOpts[nativeEventName] = opt; + addEventListener(scope.domTarget, nativeEventName, listener, opt); +} +function unmountDOMEventListeners(scope) { + var mounted = scope.mounted; + for (var nativeEventName in mounted) { + if (mounted.hasOwnProperty(nativeEventName)) { + removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]); + } + } + scope.mounted = {}; +} +var DOMHandlerScope = (function () { + function DOMHandlerScope(domTarget, domHandlers) { + this.mounted = {}; + this.listenerOpts = {}; + this.touching = false; + this.domTarget = domTarget; + this.domHandlers = domHandlers; + } + return DOMHandlerScope; +}()); +var HandlerDomProxy = (function (_super) { + __extends(HandlerDomProxy, _super); + function HandlerDomProxy(dom, painterRoot) { + var _this = _super.call(this) || this; + _this.__pointerCapturing = false; + _this.dom = dom; + _this.painterRoot = painterRoot; + _this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers); + if (globalEventSupported) { + _this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers); + } + mountLocalDOMEventListeners(_this, _this._localHandlerScope); + return _this; + } + HandlerDomProxy.prototype.dispose = function () { + unmountDOMEventListeners(this._localHandlerScope); + if (globalEventSupported) { + unmountDOMEventListeners(this._globalHandlerScope); + } + }; + HandlerDomProxy.prototype.setCursor = function (cursorStyle) { + this.dom.style && (this.dom.style.cursor = cursorStyle || 'default'); + }; + HandlerDomProxy.prototype.__togglePointerCapture = function (isPointerCapturing) { + this.__mayPointerCapture = null; + if (globalEventSupported + && ((+this.__pointerCapturing) ^ (+isPointerCapturing))) { + this.__pointerCapturing = isPointerCapturing; + var globalHandlerScope = this._globalHandlerScope; + isPointerCapturing + ? mountGlobalDOMEventListeners(this, globalHandlerScope) + : unmountDOMEventListeners(globalHandlerScope); + } + }; + return HandlerDomProxy; +}(Eventful)); + +var dpr = 1; +if (env.hasGlobalWindow) { + dpr = Math.max(window.devicePixelRatio + || (window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI) + || 1, 1); +} +var devicePixelRatio = dpr; +var DARK_MODE_THRESHOLD = 0.4; +var DARK_LABEL_COLOR = '#333'; +var LIGHT_LABEL_COLOR = '#ccc'; +var LIGHTER_LABEL_COLOR = '#eee'; + +var mIdentity = identity; +var EPSILON$1 = 5e-5; +function isNotAroundZero(val) { + return val > EPSILON$1 || val < -5e-5; +} +var scaleTmp = []; +var tmpTransform = []; +var originTransform = create(); +var abs = Math.abs; +var Transformable = (function () { + function Transformable() { + } + Transformable.prototype.getLocalTransform = function (m) { + return Transformable.getLocalTransform(this, m); + }; + Transformable.prototype.setPosition = function (arr) { + this.x = arr[0]; + this.y = arr[1]; + }; + Transformable.prototype.setScale = function (arr) { + this.scaleX = arr[0]; + this.scaleY = arr[1]; + }; + Transformable.prototype.setSkew = function (arr) { + this.skewX = arr[0]; + this.skewY = arr[1]; + }; + Transformable.prototype.setOrigin = function (arr) { + this.originX = arr[0]; + this.originY = arr[1]; + }; + Transformable.prototype.needLocalTransform = function () { + return isNotAroundZero(this.rotation) + || isNotAroundZero(this.x) + || isNotAroundZero(this.y) + || isNotAroundZero(this.scaleX - 1) + || isNotAroundZero(this.scaleY - 1) + || isNotAroundZero(this.skewX) + || isNotAroundZero(this.skewY); + }; + Transformable.prototype.updateTransform = function () { + var parentTransform = this.parent && this.parent.transform; + var needLocalTransform = this.needLocalTransform(); + var m = this.transform; + if (!(needLocalTransform || parentTransform)) { + if (m) { + mIdentity(m); + this.invTransform = null; + } + return; + } + m = m || create(); + if (needLocalTransform) { + this.getLocalTransform(m); + } + else { + mIdentity(m); + } + if (parentTransform) { + if (needLocalTransform) { + mul(m, parentTransform, m); + } + else { + copy(m, parentTransform); + } + } + this.transform = m; + this._resolveGlobalScaleRatio(m); + }; + Transformable.prototype._resolveGlobalScaleRatio = function (m) { + var globalScaleRatio = this.globalScaleRatio; + if (globalScaleRatio != null && globalScaleRatio !== 1) { + this.getGlobalScale(scaleTmp); + var relX = scaleTmp[0] < 0 ? -1 : 1; + var relY = scaleTmp[1] < 0 ? -1 : 1; + var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0; + var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0; + m[0] *= sx; + m[1] *= sx; + m[2] *= sy; + m[3] *= sy; + } + this.invTransform = this.invTransform || create(); + invert(this.invTransform, m); + }; + Transformable.prototype.getComputedTransform = function () { + var transformNode = this; + var ancestors = []; + while (transformNode) { + ancestors.push(transformNode); + transformNode = transformNode.parent; + } + while (transformNode = ancestors.pop()) { + transformNode.updateTransform(); + } + return this.transform; + }; + Transformable.prototype.setLocalTransform = function (m) { + if (!m) { + return; + } + var sx = m[0] * m[0] + m[1] * m[1]; + var sy = m[2] * m[2] + m[3] * m[3]; + var rotation = Math.atan2(m[1], m[0]); + var shearX = Math.PI / 2 + rotation - Math.atan2(m[3], m[2]); + sy = Math.sqrt(sy) * Math.cos(shearX); + sx = Math.sqrt(sx); + this.skewX = shearX; + this.skewY = 0; + this.rotation = -rotation; + this.x = +m[4]; + this.y = +m[5]; + this.scaleX = sx; + this.scaleY = sy; + this.originX = 0; + this.originY = 0; + }; + Transformable.prototype.decomposeTransform = function () { + if (!this.transform) { + return; + } + var parent = this.parent; + var m = this.transform; + if (parent && parent.transform) { + parent.invTransform = parent.invTransform || create(); + mul(tmpTransform, parent.invTransform, m); + m = tmpTransform; + } + var ox = this.originX; + var oy = this.originY; + if (ox || oy) { + originTransform[4] = ox; + originTransform[5] = oy; + mul(tmpTransform, m, originTransform); + tmpTransform[4] -= ox; + tmpTransform[5] -= oy; + m = tmpTransform; + } + this.setLocalTransform(m); + }; + Transformable.prototype.getGlobalScale = function (out) { + var m = this.transform; + out = out || []; + if (!m) { + out[0] = 1; + out[1] = 1; + return out; + } + out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]); + out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]); + if (m[0] < 0) { + out[0] = -out[0]; + } + if (m[3] < 0) { + out[1] = -out[1]; + } + return out; + }; + Transformable.prototype.transformCoordToLocal = function (x, y) { + var v2 = [x, y]; + var invTransform = this.invTransform; + if (invTransform) { + applyTransform$1(v2, v2, invTransform); + } + return v2; + }; + Transformable.prototype.transformCoordToGlobal = function (x, y) { + var v2 = [x, y]; + var transform = this.transform; + if (transform) { + applyTransform$1(v2, v2, transform); + } + return v2; + }; + Transformable.prototype.getLineScale = function () { + var m = this.transform; + return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 + ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) + : 1; + }; + Transformable.prototype.copyTransform = function (source) { + copyTransform(this, source); + }; + Transformable.getLocalTransform = function (target, m) { + m = m || []; + var ox = target.originX || 0; + var oy = target.originY || 0; + var sx = target.scaleX; + var sy = target.scaleY; + var ax = target.anchorX; + var ay = target.anchorY; + var rotation = target.rotation || 0; + var x = target.x; + var y = target.y; + var skewX = target.skewX ? Math.tan(target.skewX) : 0; + var skewY = target.skewY ? Math.tan(-target.skewY) : 0; + if (ox || oy || ax || ay) { + var dx = ox + ax; + var dy = oy + ay; + m[4] = -dx * sx - skewX * dy * sy; + m[5] = -dy * sy - skewY * dx * sx; + } + else { + m[4] = m[5] = 0; + } + m[0] = sx; + m[3] = sy; + m[1] = skewY * sx; + m[2] = skewX * sy; + rotation && rotate(m, m, rotation); + m[4] += ox + x; + m[5] += oy + y; + return m; + }; + Transformable.initDefaultProps = (function () { + var proto = Transformable.prototype; + proto.scaleX = + proto.scaleY = + proto.globalScaleRatio = 1; + proto.x = + proto.y = + proto.originX = + proto.originY = + proto.skewX = + proto.skewY = + proto.rotation = + proto.anchorX = + proto.anchorY = 0; + })(); + return Transformable; +}()); +var TRANSFORMABLE_PROPS = [ + 'x', 'y', 'originX', 'originY', 'anchorX', 'anchorY', 'rotation', 'scaleX', 'scaleY', 'skewX', 'skewY' +]; +function copyTransform(target, source) { + for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) { + var propName = TRANSFORMABLE_PROPS[i]; + target[propName] = source[propName]; + } +} + +var textWidthCache = {}; +function getWidth(text, font) { + font = font || DEFAULT_FONT; + var cacheOfFont = textWidthCache[font]; + if (!cacheOfFont) { + cacheOfFont = textWidthCache[font] = new LRU(500); + } + var width = cacheOfFont.get(text); + if (width == null) { + width = platformApi.measureText(text, font).width; + cacheOfFont.put(text, width); + } + return width; +} +function innerGetBoundingRect(text, font, textAlign, textBaseline) { + var width = getWidth(text, font); + var height = getLineHeight(font); + var x = adjustTextX(0, width, textAlign); + var y = adjustTextY(0, height, textBaseline); + var rect = new BoundingRect(x, y, width, height); + return rect; +} +function getBoundingRect(text, font, textAlign, textBaseline) { + var textLines = ((text || '') + '').split('\n'); + var len = textLines.length; + if (len === 1) { + return innerGetBoundingRect(textLines[0], font, textAlign, textBaseline); + } + else { + var uniondRect = new BoundingRect(0, 0, 0, 0); + for (var i = 0; i < textLines.length; i++) { + var rect = innerGetBoundingRect(textLines[i], font, textAlign, textBaseline); + i === 0 ? uniondRect.copy(rect) : uniondRect.union(rect); + } + return uniondRect; + } +} +function adjustTextX(x, width, textAlign) { + if (textAlign === 'right') { + x -= width; + } + else if (textAlign === 'center') { + x -= width / 2; + } + return x; +} +function adjustTextY(y, height, verticalAlign) { + if (verticalAlign === 'middle') { + y -= height / 2; + } + else if (verticalAlign === 'bottom') { + y -= height; + } + return y; +} +function getLineHeight(font) { + return getWidth('国', font); +} +function parsePercent$1(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; +} +function calculateTextPosition(out, opts, rect) { + var textPosition = opts.position || 'inside'; + var distance = opts.distance != null ? opts.distance : 5; + var height = rect.height; + var width = rect.width; + var halfHeight = height / 2; + var x = rect.x; + var y = rect.y; + var textAlign = 'left'; + var textVerticalAlign = 'top'; + if (textPosition instanceof Array) { + x += parsePercent$1(textPosition[0], rect.width); + y += parsePercent$1(textPosition[1], rect.height); + textAlign = null; + textVerticalAlign = null; + } + else { + switch (textPosition) { + case 'left': + x -= distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'right': + x += distance + width; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'top': + x += width / 2; + y -= distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'bottom': + x += width / 2; + y += height + distance; + textAlign = 'center'; + break; + case 'inside': + x += width / 2; + y += halfHeight; + textAlign = 'center'; + textVerticalAlign = 'middle'; + break; + case 'insideLeft': + x += distance; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'insideRight': + x += width - distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'insideTop': + x += width / 2; + y += distance; + textAlign = 'center'; + break; + case 'insideBottom': + x += width / 2; + y += height - distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'insideTopLeft': + x += distance; + y += distance; + break; + case 'insideTopRight': + x += width - distance; + y += distance; + textAlign = 'right'; + break; + case 'insideBottomLeft': + x += distance; + y += height - distance; + textVerticalAlign = 'bottom'; + break; + case 'insideBottomRight': + x += width - distance; + y += height - distance; + textAlign = 'right'; + textVerticalAlign = 'bottom'; + break; + } + } + out = out || {}; + out.x = x; + out.y = y; + out.align = textAlign; + out.verticalAlign = textVerticalAlign; + return out; +} + +var PRESERVED_NORMAL_STATE = "__zr_normal__"; +var PRIMARY_STATES_KEYS$1 = TRANSFORMABLE_PROPS.concat(["ignore"]); +var DEFAULT_ANIMATABLE_MAP = reduce(TRANSFORMABLE_PROPS, function(obj, key) { + obj[key] = true; + return obj; +}, { ignore: false }); +var tmpTextPosCalcRes = {}; +var tmpBoundingRect = new BoundingRect(0, 0, 0, 0); +var Element = function() { + function Element2(props) { + this.id = guid(); + this.animators = []; + this.currentStates = []; + this.states = {}; + this._init(props); + } + Element2.prototype._init = function(props) { + this.attr(props); + }; + Element2.prototype.drift = function(dx, dy, e) { + switch (this.draggable) { + case "horizontal": + dy = 0; + break; + case "vertical": + dx = 0; + break; + } + var m = this.transform; + if (!m) { + m = this.transform = [1, 0, 0, 1, 0, 0]; + } + m[4] += dx; + m[5] += dy; + this.decomposeTransform(); + this.markRedraw(); + }; + Element2.prototype.beforeUpdate = function() { + }; + Element2.prototype.afterUpdate = function() { + }; + Element2.prototype.update = function() { + this.updateTransform(); + if (this.__dirty) { + this.updateInnerText(); + } + }; + Element2.prototype.updateInnerText = function(forceUpdate) { + var textEl = this._textContent; + if (textEl && (!textEl.ignore || forceUpdate)) { + if (!this.textConfig) { + this.textConfig = {}; + } + var textConfig = this.textConfig; + var isLocal = textConfig.local; + var innerTransformable = textEl.innerTransformable; + var textAlign = void 0; + var textVerticalAlign = void 0; + var textStyleChanged = false; + innerTransformable.parent = isLocal ? this : null; + var innerOrigin = false; + innerTransformable.copyTransform(textEl); + if (textConfig.position != null) { + var layoutRect = tmpBoundingRect; + if (textConfig.layoutRect) { + layoutRect.copy(textConfig.layoutRect); + } else { + layoutRect.copy(this.getBoundingRect()); + } + if (!isLocal) { + layoutRect.applyTransform(this.transform); + } + if (this.calculateTextPosition) { + this.calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } else { + calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } + innerTransformable.x = tmpTextPosCalcRes.x; + innerTransformable.y = tmpTextPosCalcRes.y; + textAlign = tmpTextPosCalcRes.align; + textVerticalAlign = tmpTextPosCalcRes.verticalAlign; + var textOrigin = textConfig.origin; + if (textOrigin && textConfig.rotation != null) { + var relOriginX = void 0; + var relOriginY = void 0; + if (textOrigin === "center") { + relOriginX = layoutRect.width * 0.5; + relOriginY = layoutRect.height * 0.5; + } else { + relOriginX = parsePercent$1(textOrigin[0], layoutRect.width); + relOriginY = parsePercent$1(textOrigin[1], layoutRect.height); + } + innerOrigin = true; + innerTransformable.originX = -innerTransformable.x + relOriginX + (isLocal ? 0 : layoutRect.x); + innerTransformable.originY = -innerTransformable.y + relOriginY + (isLocal ? 0 : layoutRect.y); + } + } + if (textConfig.rotation != null) { + innerTransformable.rotation = textConfig.rotation; + } + var textOffset = textConfig.offset; + if (textOffset) { + innerTransformable.x += textOffset[0]; + innerTransformable.y += textOffset[1]; + if (!innerOrigin) { + innerTransformable.originX = -textOffset[0]; + innerTransformable.originY = -textOffset[1]; + } + } + var isInside = textConfig.inside == null ? typeof textConfig.position === "string" && textConfig.position.indexOf("inside") >= 0 : textConfig.inside; + var innerTextDefaultStyle = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {}); + var textFill = void 0; + var textStroke = void 0; + var autoStroke = void 0; + if (isInside && this.canBeInsideText()) { + textFill = textConfig.insideFill; + textStroke = textConfig.insideStroke; + if (textFill == null || textFill === "auto") { + textFill = this.getInsideTextFill(); + } + if (textStroke == null || textStroke === "auto") { + textStroke = this.getInsideTextStroke(textFill); + autoStroke = true; + } + } else { + textFill = textConfig.outsideFill; + textStroke = textConfig.outsideStroke; + if (textFill == null || textFill === "auto") { + textFill = this.getOutsideFill(); + } + if (textStroke == null || textStroke === "auto") { + textStroke = this.getOutsideStroke(textFill); + autoStroke = true; + } + } + textFill = textFill || "#000"; + if (textFill !== innerTextDefaultStyle.fill || textStroke !== innerTextDefaultStyle.stroke || autoStroke !== innerTextDefaultStyle.autoStroke || textAlign !== innerTextDefaultStyle.align || textVerticalAlign !== innerTextDefaultStyle.verticalAlign) { + textStyleChanged = true; + innerTextDefaultStyle.fill = textFill; + innerTextDefaultStyle.stroke = textStroke; + innerTextDefaultStyle.autoStroke = autoStroke; + innerTextDefaultStyle.align = textAlign; + innerTextDefaultStyle.verticalAlign = textVerticalAlign; + textEl.setDefaultTextStyle(innerTextDefaultStyle); + } + textEl.__dirty |= REDRAW_BIT; + if (textStyleChanged) { + textEl.dirtyStyle(true); + } + } + }; + Element2.prototype.canBeInsideText = function() { + return true; + }; + Element2.prototype.getInsideTextFill = function() { + return "#fff"; + }; + Element2.prototype.getInsideTextStroke = function(textFill) { + return "#000"; + }; + Element2.prototype.getOutsideFill = function() { + return this.__zr && this.__zr.isDarkMode() ? LIGHT_LABEL_COLOR : DARK_LABEL_COLOR; + }; + Element2.prototype.getOutsideStroke = function(textFill) { + var backgroundColor = this.__zr && this.__zr.getBackgroundColor(); + var colorArr = typeof backgroundColor === "string" && parse(backgroundColor); + if (!colorArr) { + colorArr = [255, 255, 255, 1]; + } + var alpha = colorArr[3]; + var isDark = this.__zr.isDarkMode(); + for (var i = 0; i < 3; i++) { + colorArr[i] = colorArr[i] * alpha + (isDark ? 0 : 255) * (1 - alpha); + } + colorArr[3] = 1; + return stringify(colorArr, "rgba"); + }; + Element2.prototype.traverse = function(cb, context) { + }; + Element2.prototype.attrKV = function(key, value) { + if (key === "textConfig") { + this.setTextConfig(value); + } else if (key === "textContent") { + this.setTextContent(value); + } else if (key === "clipPath") { + this.setClipPath(value); + } else if (key === "extra") { + this.extra = this.extra || {}; + extend(this.extra, value); + } else { + this[key] = value; + } + }; + Element2.prototype.hide = function() { + this.ignore = true; + this.markRedraw(); + }; + Element2.prototype.show = function() { + this.ignore = false; + this.markRedraw(); + }; + Element2.prototype.attr = function(keyOrObj, value) { + if (typeof keyOrObj === "string") { + this.attrKV(keyOrObj, value); + } else if (isObject$2(keyOrObj)) { + var obj = keyOrObj; + var keysArr = keys(obj); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + this.attrKV(key, keyOrObj[key]); + } + } + this.markRedraw(); + return this; + }; + Element2.prototype.saveCurrentToNormalState = function(toState) { + this._innerSaveToNormal(toState); + var normalState = this._normalState; + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var fromStateTransition = animator.__fromStateTransition; + if (animator.getLoop() || fromStateTransition && fromStateTransition !== PRESERVED_NORMAL_STATE) { + continue; + } + var targetName = animator.targetName; + var target = targetName ? normalState[targetName] : normalState; + animator.saveTo(target); + } + }; + Element2.prototype._innerSaveToNormal = function(toState) { + var normalState = this._normalState; + if (!normalState) { + normalState = this._normalState = {}; + } + if (toState.textConfig && !normalState.textConfig) { + normalState.textConfig = this.textConfig; + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS$1); + }; + Element2.prototype._savePrimaryToNormal = function(toState, normalState, primaryKeys) { + for (var i = 0; i < primaryKeys.length; i++) { + var key = primaryKeys[i]; + if (toState[key] != null && !(key in normalState)) { + normalState[key] = this[key]; + } + } + }; + Element2.prototype.hasState = function() { + return this.currentStates.length > 0; + }; + Element2.prototype.getState = function(name) { + return this.states[name]; + }; + Element2.prototype.ensureState = function(name) { + var states = this.states; + if (!states[name]) { + states[name] = {}; + } + return states[name]; + }; + Element2.prototype.clearStates = function(noAnimation) { + this.useState(PRESERVED_NORMAL_STATE, false, noAnimation); + }; + Element2.prototype.useState = function(stateName, keepCurrentStates, noAnimation, forceUseHoverLayer) { + var toNormalState = stateName === PRESERVED_NORMAL_STATE; + var hasStates = this.hasState(); + if (!hasStates && toNormalState) { + return; + } + var currentStates = this.currentStates; + var animationCfg = this.stateTransition; + if (indexOf(currentStates, stateName) >= 0 && (keepCurrentStates || currentStates.length === 1)) { + return; + } + var state; + if (this.stateProxy && !toNormalState) { + state = this.stateProxy(stateName); + } + if (!state) { + state = this.states && this.states[stateName]; + } + if (!state && !toNormalState) { + logError("State " + stateName + " not exists."); + return; + } + if (!toNormalState) { + this.saveCurrentToNormalState(state); + } + var useHoverLayer = !!(state && state.hoverLayer || forceUseHoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + this._applyStateObj(stateName, state, this._normalState, keepCurrentStates, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); + } + if (textGuide) { + textGuide.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); + } + if (toNormalState) { + this.currentStates = []; + this._normalState = {}; + } else { + if (!keepCurrentStates) { + this.currentStates = [stateName]; + } else { + this.currentStates.push(stateName); + } + } + this._updateAnimationTargets(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= -2; + } + return state; + }; + Element2.prototype.useStates = function(states, noAnimation, forceUseHoverLayer) { + if (!states.length) { + this.clearStates(); + } else { + var stateObjects = []; + var currentStates = this.currentStates; + var len = states.length; + var notChange = len === currentStates.length; + if (notChange) { + for (var i = 0; i < len; i++) { + if (states[i] !== currentStates[i]) { + notChange = false; + break; + } + } + } + if (notChange) { + return; + } + for (var i = 0; i < len; i++) { + var stateName = states[i]; + var stateObj = void 0; + if (this.stateProxy) { + stateObj = this.stateProxy(stateName, states); + } + if (!stateObj) { + stateObj = this.states[stateName]; + } + if (stateObj) { + stateObjects.push(stateObj); + } + } + var lastStateObj = stateObjects[len - 1]; + var useHoverLayer = !!(lastStateObj && lastStateObj.hoverLayer || forceUseHoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + var mergedState = this._mergeStates(stateObjects); + var animationCfg = this.stateTransition; + this.saveCurrentToNormalState(mergedState); + this._applyStateObj(states.join(","), mergedState, this._normalState, false, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.useStates(states, noAnimation, useHoverLayer); + } + if (textGuide) { + textGuide.useStates(states, noAnimation, useHoverLayer); + } + this._updateAnimationTargets(); + this.currentStates = states.slice(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= -2; + } + } + }; + Element2.prototype.isSilent = function() { + var isSilent = this.silent; + var ancestor = this.parent; + while (!isSilent && ancestor) { + if (ancestor.silent) { + isSilent = true; + break; + } + ancestor = ancestor.parent; + } + return isSilent; + }; + Element2.prototype._updateAnimationTargets = function() { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + if (animator.targetName) { + animator.changeTarget(this[animator.targetName]); + } + } + }; + Element2.prototype.removeState = function(state) { + var idx = indexOf(this.currentStates, state); + if (idx >= 0) { + var currentStates = this.currentStates.slice(); + currentStates.splice(idx, 1); + this.useStates(currentStates); + } + }; + Element2.prototype.replaceState = function(oldState, newState, forceAdd) { + var currentStates = this.currentStates.slice(); + var idx = indexOf(currentStates, oldState); + var newStateExists = indexOf(currentStates, newState) >= 0; + if (idx >= 0) { + if (!newStateExists) { + currentStates[idx] = newState; + } else { + currentStates.splice(idx, 1); + } + } else if (forceAdd && !newStateExists) { + currentStates.push(newState); + } + this.useStates(currentStates); + }; + Element2.prototype.toggleState = function(state, enable) { + if (enable) { + this.useState(state, true); + } else { + this.removeState(state); + } + }; + Element2.prototype._mergeStates = function(states) { + var mergedState = {}; + var mergedTextConfig; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + extend(mergedState, state); + if (state.textConfig) { + mergedTextConfig = mergedTextConfig || {}; + extend(mergedTextConfig, state.textConfig); + } + } + if (mergedTextConfig) { + mergedState.textConfig = mergedTextConfig; + } + return mergedState; + }; + Element2.prototype._applyStateObj = function(stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + var needsRestoreToNormal = !(state && keepCurrentStates); + if (state && state.textConfig) { + this.textConfig = extend({}, keepCurrentStates ? this.textConfig : normalState.textConfig); + extend(this.textConfig, state.textConfig); + } else if (needsRestoreToNormal) { + if (normalState.textConfig) { + this.textConfig = normalState.textConfig; + } + } + var transitionTarget = {}; + var hasTransition = false; + for (var i = 0; i < PRIMARY_STATES_KEYS$1.length; i++) { + var key = PRIMARY_STATES_KEYS$1[i]; + var propNeedsTransition = transition && DEFAULT_ANIMATABLE_MAP[key]; + if (state && state[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = state[key]; + } else { + this[key] = state[key]; + } + } else if (needsRestoreToNormal) { + if (normalState[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = normalState[key]; + } else { + this[key] = normalState[key]; + } + } + } + } + if (!transition) { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var targetName = animator.targetName; + if (!animator.getLoop()) { + animator.__changeFinalValue(targetName ? (state || normalState)[targetName] : state || normalState); + } + } + } + if (hasTransition) { + this._transitionState(stateName, transitionTarget, animationCfg); + } + }; + Element2.prototype._attachComponent = function(componentEl) { + if (componentEl.__zr && !componentEl.__hostTarget) { + return; + } + if (componentEl === this) { + return; + } + var zr = this.__zr; + if (zr) { + componentEl.addSelfToZr(zr); + } + componentEl.__zr = zr; + componentEl.__hostTarget = this; + }; + Element2.prototype._detachComponent = function(componentEl) { + if (componentEl.__zr) { + componentEl.removeSelfFromZr(componentEl.__zr); + } + componentEl.__zr = null; + componentEl.__hostTarget = null; + }; + Element2.prototype.getClipPath = function() { + return this._clipPath; + }; + Element2.prototype.setClipPath = function(clipPath) { + if (this._clipPath && this._clipPath !== clipPath) { + this.removeClipPath(); + } + this._attachComponent(clipPath); + this._clipPath = clipPath; + this.markRedraw(); + }; + Element2.prototype.removeClipPath = function() { + var clipPath = this._clipPath; + if (clipPath) { + this._detachComponent(clipPath); + this._clipPath = null; + this.markRedraw(); + } + }; + Element2.prototype.getTextContent = function() { + return this._textContent; + }; + Element2.prototype.setTextContent = function(textEl) { + var previousTextContent = this._textContent; + if (previousTextContent === textEl) { + return; + } + if (previousTextContent && previousTextContent !== textEl) { + this.removeTextContent(); + } + textEl.innerTransformable = new Transformable(); + this._attachComponent(textEl); + this._textContent = textEl; + this.markRedraw(); + }; + Element2.prototype.setTextConfig = function(cfg) { + if (!this.textConfig) { + this.textConfig = {}; + } + extend(this.textConfig, cfg); + this.markRedraw(); + }; + Element2.prototype.removeTextConfig = function() { + this.textConfig = null; + this.markRedraw(); + }; + Element2.prototype.removeTextContent = function() { + var textEl = this._textContent; + if (textEl) { + textEl.innerTransformable = null; + this._detachComponent(textEl); + this._textContent = null; + this._innerTextDefaultStyle = null; + this.markRedraw(); + } + }; + Element2.prototype.getTextGuideLine = function() { + return this._textGuide; + }; + Element2.prototype.setTextGuideLine = function(guideLine) { + if (this._textGuide && this._textGuide !== guideLine) { + this.removeTextGuideLine(); + } + this._attachComponent(guideLine); + this._textGuide = guideLine; + this.markRedraw(); + }; + Element2.prototype.removeTextGuideLine = function() { + var textGuide = this._textGuide; + if (textGuide) { + this._detachComponent(textGuide); + this._textGuide = null; + this.markRedraw(); + } + }; + Element2.prototype.markRedraw = function() { + this.__dirty |= REDRAW_BIT; + var zr = this.__zr; + if (zr) { + if (this.__inHover) { + zr.refreshHover(); + } else { + zr.refresh(); + } + } + if (this.__hostTarget) { + this.__hostTarget.markRedraw(); + } + }; + Element2.prototype.dirty = function() { + this.markRedraw(); + }; + Element2.prototype._toggleHoverLayerFlag = function(inHover) { + this.__inHover = inHover; + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.__inHover = inHover; + } + if (textGuide) { + textGuide.__inHover = inHover; + } + }; + Element2.prototype.addSelfToZr = function(zr) { + if (this.__zr === zr) { + return; + } + this.__zr = zr; + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.addAnimator(animators[i]); + } + } + if (this._clipPath) { + this._clipPath.addSelfToZr(zr); + } + if (this._textContent) { + this._textContent.addSelfToZr(zr); + } + if (this._textGuide) { + this._textGuide.addSelfToZr(zr); + } + }; + Element2.prototype.removeSelfFromZr = function(zr) { + if (!this.__zr) { + return; + } + this.__zr = null; + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.removeAnimator(animators[i]); + } + } + if (this._clipPath) { + this._clipPath.removeSelfFromZr(zr); + } + if (this._textContent) { + this._textContent.removeSelfFromZr(zr); + } + if (this._textGuide) { + this._textGuide.removeSelfFromZr(zr); + } + }; + Element2.prototype.animate = function(key, loop, allowDiscreteAnimation) { + var target = key ? this[key] : this; + var animator = new Animator(target, loop, allowDiscreteAnimation); + key && (animator.targetName = key); + this.addAnimator(animator, key); + return animator; + }; + Element2.prototype.addAnimator = function(animator, key) { + var zr = this.__zr; + var el = this; + animator.during(function() { + el.updateDuringAnimation(key); + }).done(function() { + var animators = el.animators; + var idx = indexOf(animators, animator); + if (idx >= 0) { + animators.splice(idx, 1); + } + }); + this.animators.push(animator); + if (zr) { + zr.animation.addAnimator(animator); + } + zr && zr.wakeUp(); + }; + Element2.prototype.updateDuringAnimation = function(key) { + this.markRedraw(); + }; + Element2.prototype.stopAnimation = function(scope, forwardToLast) { + var animators = this.animators; + var len = animators.length; + var leftAnimators = []; + for (var i = 0; i < len; i++) { + var animator = animators[i]; + if (!scope || scope === animator.scope) { + animator.stop(forwardToLast); + } else { + leftAnimators.push(animator); + } + } + this.animators = leftAnimators; + return this; + }; + Element2.prototype.animateTo = function(target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps); + }; + Element2.prototype.animateFrom = function(target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps, true); + }; + Element2.prototype._transitionState = function(stateName, target, cfg, animationProps) { + var animators = animateTo(this, target, cfg, animationProps); + for (var i = 0; i < animators.length; i++) { + animators[i].__fromStateTransition = stateName; + } + }; + Element2.prototype.getBoundingRect = function() { + return null; + }; + Element2.prototype.getPaintRect = function() { + return null; + }; + Element2.initDefaultProps = function() { + var elProto = Element2.prototype; + elProto.type = "element"; + elProto.name = ""; + elProto.ignore = elProto.silent = elProto.isGroup = elProto.draggable = elProto.dragging = elProto.ignoreClip = elProto.__inHover = false; + elProto.__dirty = REDRAW_BIT; + function createLegacyProperty(key, privateKey, xKey, yKey) { + Object.defineProperty(elProto, key, { + get: function() { + if (!this[privateKey]) { + var pos = this[privateKey] = []; + enhanceArray(this, pos); + } + return this[privateKey]; + }, + set: function(pos) { + this[xKey] = pos[0]; + this[yKey] = pos[1]; + this[privateKey] = pos; + enhanceArray(this, pos); + } + }); + function enhanceArray(self, pos) { + Object.defineProperty(pos, 0, { + get: function() { + return self[xKey]; + }, + set: function(val) { + self[xKey] = val; + } + }); + Object.defineProperty(pos, 1, { + get: function() { + return self[yKey]; + }, + set: function(val) { + self[yKey] = val; + } + }); + } + } + if (Object.defineProperty) { + createLegacyProperty("position", "_legacyPos", "x", "y"); + createLegacyProperty("scale", "_legacyScale", "scaleX", "scaleY"); + createLegacyProperty("origin", "_legacyOrigin", "originX", "originY"); + } + }(); + return Element2; +}(); +mixin(Element, Eventful); +mixin(Element, Transformable); +function animateTo(animatable, target, cfg, animationProps, reverse) { + cfg = cfg || {}; + var animators = []; + animateToShallow(animatable, "", animatable, target, cfg, animationProps, animators, reverse); + var finishCount = animators.length; + var doneHappened = false; + var cfgDone = cfg.done; + var cfgAborted = cfg.aborted; + var doneCb = function() { + doneHappened = true; + finishCount--; + if (finishCount <= 0) { + doneHappened ? cfgDone && cfgDone() : cfgAborted && cfgAborted(); + } + }; + var abortedCb = function() { + finishCount--; + if (finishCount <= 0) { + doneHappened ? cfgDone && cfgDone() : cfgAborted && cfgAborted(); + } + }; + if (!finishCount) { + cfgDone && cfgDone(); + } + if (animators.length > 0 && cfg.during) { + animators[0].during(function(target2, percent) { + cfg.during(percent); + }); + } + for (var i = 0; i < animators.length; i++) { + var animator = animators[i]; + if (doneCb) { + animator.done(doneCb); + } + if (abortedCb) { + animator.aborted(abortedCb); + } + if (cfg.force) { + animator.duration(cfg.duration); + } + animator.start(cfg.easing); + } + return animators; +} +function copyArrShallow(source, target, len) { + for (var i = 0; i < len; i++) { + source[i] = target[i]; + } +} +function is2DArray(value) { + return isArrayLike(value[0]); +} +function copyValue(target, source, key) { + if (isArrayLike(source[key])) { + if (!isArrayLike(target[key])) { + target[key] = []; + } + if (isTypedArray(source[key])) { + var len = source[key].length; + if (target[key].length !== len) { + target[key] = new source[key].constructor(len); + copyArrShallow(target[key], source[key], len); + } + } else { + var sourceArr = source[key]; + var targetArr = target[key]; + var len0 = sourceArr.length; + if (is2DArray(sourceArr)) { + var len1 = sourceArr[0].length; + for (var i = 0; i < len0; i++) { + if (!targetArr[i]) { + targetArr[i] = Array.prototype.slice.call(sourceArr[i]); + } else { + copyArrShallow(targetArr[i], sourceArr[i], len1); + } + } + } else { + copyArrShallow(targetArr, sourceArr, len0); + } + targetArr.length = sourceArr.length; + } + } else { + target[key] = source[key]; + } +} +function isValueSame(val1, val2) { + return val1 === val2 || isArrayLike(val1) && isArrayLike(val2) && is1DArraySame(val1, val2); +} +function is1DArraySame(arr0, arr1) { + var len = arr0.length; + if (len !== arr1.length) { + return false; + } + for (var i = 0; i < len; i++) { + if (arr0[i] !== arr1[i]) { + return false; + } + } + return true; +} +function animateToShallow(animatable, topKey, animateObj, target, cfg, animationProps, animators, reverse) { + var targetKeys = keys(target); + var duration = cfg.duration; + var delay = cfg.delay; + var additive = cfg.additive; + var setToFinal = cfg.setToFinal; + var animateAll = !isObject$2(animationProps); + var existsAnimators = animatable.animators; + var animationKeys = []; + for (var k = 0; k < targetKeys.length; k++) { + var innerKey = targetKeys[k]; + var targetVal = target[innerKey]; + if (targetVal != null && animateObj[innerKey] != null && (animateAll || animationProps[innerKey])) { + if (isObject$2(targetVal) && !isArrayLike(targetVal) && !isGradientObject(targetVal)) { + if (topKey) { + if (!reverse) { + animateObj[innerKey] = targetVal; + animatable.updateDuringAnimation(topKey); + } + continue; + } + animateToShallow(animatable, innerKey, animateObj[innerKey], targetVal, cfg, animationProps && animationProps[innerKey], animators, reverse); + } else { + animationKeys.push(innerKey); + } + } else if (!reverse) { + animateObj[innerKey] = targetVal; + animatable.updateDuringAnimation(topKey); + animationKeys.push(innerKey); + } + } + var keyLen = animationKeys.length; + if (!additive && keyLen) { + for (var i = 0; i < existsAnimators.length; i++) { + var animator = existsAnimators[i]; + if (animator.targetName === topKey) { + var allAborted = animator.stopTracks(animationKeys); + if (allAborted) { + var idx = indexOf(existsAnimators, animator); + existsAnimators.splice(idx, 1); + } + } + } + } + if (!cfg.force) { + animationKeys = filter(animationKeys, function(key) { + return !isValueSame(target[key], animateObj[key]); + }); + keyLen = animationKeys.length; + } + if (keyLen > 0 || cfg.force && !animators.length) { + var revertedSource = void 0; + var reversedTarget = void 0; + var sourceClone = void 0; + if (reverse) { + reversedTarget = {}; + if (setToFinal) { + revertedSource = {}; + } + for (var i = 0; i < keyLen; i++) { + var innerKey = animationKeys[i]; + reversedTarget[innerKey] = animateObj[innerKey]; + if (setToFinal) { + revertedSource[innerKey] = target[innerKey]; + } else { + animateObj[innerKey] = target[innerKey]; + } + } + } else if (setToFinal) { + sourceClone = {}; + for (var i = 0; i < keyLen; i++) { + var innerKey = animationKeys[i]; + sourceClone[innerKey] = cloneValue(animateObj[innerKey]); + copyValue(animateObj, target, innerKey); + } + } + var animator = new Animator(animateObj, false, false, additive ? filter(existsAnimators, function(animator2) { + return animator2.targetName === topKey; + }) : null); + animator.targetName = topKey; + if (cfg.scope) { + animator.scope = cfg.scope; + } + if (setToFinal && revertedSource) { + animator.whenWithKeys(0, revertedSource, animationKeys); + } + if (sourceClone) { + animator.whenWithKeys(0, sourceClone, animationKeys); + } + animator.whenWithKeys(duration == null ? 500 : duration, reverse ? reversedTarget : target, animationKeys).delay(delay || 0); + animatable.addAnimator(animator, topKey); + animators.push(animator); + } +} + +var Group$2 = function(_super) { + __extends(Group2, _super); + function Group2(opts) { + var _this = _super.call(this) || this; + _this.isGroup = true; + _this._children = []; + _this.attr(opts); + return _this; + } + Group2.prototype.childrenRef = function() { + return this._children; + }; + Group2.prototype.children = function() { + return this._children.slice(); + }; + Group2.prototype.childAt = function(idx) { + return this._children[idx]; + }; + Group2.prototype.childOfName = function(name) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + if (children[i].name === name) { + return children[i]; + } + } + }; + Group2.prototype.childCount = function() { + return this._children.length; + }; + Group2.prototype.add = function(child) { + if (child) { + if (child !== this && child.parent !== this) { + this._children.push(child); + this._doAdd(child); + } + } + return this; + }; + Group2.prototype.addBefore = function(child, nextSibling) { + if (child && child !== this && child.parent !== this && nextSibling && nextSibling.parent === this) { + var children = this._children; + var idx = children.indexOf(nextSibling); + if (idx >= 0) { + children.splice(idx, 0, child); + this._doAdd(child); + } + } + return this; + }; + Group2.prototype.replace = function(oldChild, newChild) { + var idx = indexOf(this._children, oldChild); + if (idx >= 0) { + this.replaceAt(newChild, idx); + } + return this; + }; + Group2.prototype.replaceAt = function(child, index) { + var children = this._children; + var old = children[index]; + if (child && child !== this && child.parent !== this && child !== old) { + children[index] = child; + old.parent = null; + var zr = this.__zr; + if (zr) { + old.removeSelfFromZr(zr); + } + this._doAdd(child); + } + return this; + }; + Group2.prototype._doAdd = function(child) { + if (child.parent) { + child.parent.remove(child); + } + child.parent = this; + var zr = this.__zr; + if (zr && zr !== child.__zr) { + child.addSelfToZr(zr); + } + zr && zr.refresh(); + }; + Group2.prototype.remove = function(child) { + var zr = this.__zr; + var children = this._children; + var idx = indexOf(children, child); + if (idx < 0) { + return this; + } + children.splice(idx, 1); + child.parent = null; + if (zr) { + child.removeSelfFromZr(zr); + } + zr && zr.refresh(); + return this; + }; + Group2.prototype.removeAll = function() { + var children = this._children; + var zr = this.__zr; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (zr) { + child.removeSelfFromZr(zr); + } + child.parent = null; + } + children.length = 0; + return this; + }; + Group2.prototype.eachChild = function(cb, context) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + cb.call(context, child, i); + } + return this; + }; + Group2.prototype.traverse = function(cb, context) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + var stopped = cb.call(context, child); + if (child.isGroup && !stopped) { + child.traverse(cb, context); + } + } + return this; + }; + Group2.prototype.addSelfToZr = function(zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.addSelfToZr(zr); + } + }; + Group2.prototype.removeSelfFromZr = function(zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.removeSelfFromZr(zr); + } + }; + Group2.prototype.getBoundingRect = function(includeChildren) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = includeChildren || this._children; + var tmpMat = []; + var rect = null; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.ignore || child.invisible) { + continue; + } + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + BoundingRect.applyTransform(tmpRect, childRect, transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + return rect || tmpRect; + }; + return Group2; +}(Element); +Group$2.prototype.type = "group"; + +/*! +* ZRender, a high performance 2d drawing library. +* +* Copyright (c) 2013, Baidu Inc. +* All rights reserved. +* +* LICENSE +* https://github.com/ecomfe/zrender/blob/master/LICENSE.txt +*/ +var painterCtors = {}; +var instances$1 = {}; +function delInstance(id) { + delete instances$1[id]; +} +function isDarkMode(backgroundColor) { + if (!backgroundColor) { + return false; + } + if (typeof backgroundColor === "string") { + return lum(backgroundColor, 1) < DARK_MODE_THRESHOLD; + } else if (backgroundColor.colorStops) { + var colorStops = backgroundColor.colorStops; + var totalLum = 0; + var len = colorStops.length; + for (var i = 0; i < len; i++) { + totalLum += lum(colorStops[i].color, 1); + } + totalLum /= len; + return totalLum < DARK_MODE_THRESHOLD; + } + return false; +} +var ZRender = function() { + function ZRender2(id, dom, opts) { + var _this = this; + this._sleepAfterStill = 10; + this._stillFrameAccum = 0; + this._needsRefresh = true; + this._needsRefreshHover = true; + this._darkMode = false; + opts = opts || {}; + this.dom = dom; + this.id = id; + var storage = new Storage(); + var rendererType = opts.renderer || "canvas"; + if (!painterCtors[rendererType]) { + rendererType = keys(painterCtors)[0]; + } + opts.useDirtyRect = opts.useDirtyRect == null ? false : opts.useDirtyRect; + var painter = new painterCtors[rendererType](dom, storage, opts, id); + var ssrMode = opts.ssr || painter.ssrOnly; + this.storage = storage; + this.painter = painter; + var handlerProxy = !env.node && !env.worker && !ssrMode ? new HandlerDomProxy(painter.getViewportRoot(), painter.root) : null; + var useCoarsePointer = opts.useCoarsePointer; + var usePointerSize = useCoarsePointer == null || useCoarsePointer === "auto" ? env.touchEventsSupported : !!useCoarsePointer; + var defaultPointerSize = 44; + var pointerSize; + if (usePointerSize) { + pointerSize = retrieve2(opts.pointerSize, defaultPointerSize); + } + this.handler = new Handler(storage, painter, handlerProxy, painter.root, pointerSize); + this.animation = new Animation({ + stage: { + update: ssrMode ? null : function() { + return _this._flush(true); + } + } + }); + if (!ssrMode) { + this.animation.start(); + } + } + ZRender2.prototype.add = function(el) { + if (this._disposed || !el) { + return; + } + this.storage.addRoot(el); + el.addSelfToZr(this); + this.refresh(); + }; + ZRender2.prototype.remove = function(el) { + if (this._disposed || !el) { + return; + } + this.storage.delRoot(el); + el.removeSelfFromZr(this); + this.refresh(); + }; + ZRender2.prototype.configLayer = function(zLevel, config) { + if (this._disposed) { + return; + } + if (this.painter.configLayer) { + this.painter.configLayer(zLevel, config); + } + this.refresh(); + }; + ZRender2.prototype.setBackgroundColor = function(backgroundColor) { + if (this._disposed) { + return; + } + if (this.painter.setBackgroundColor) { + this.painter.setBackgroundColor(backgroundColor); + } + this.refresh(); + this._backgroundColor = backgroundColor; + this._darkMode = isDarkMode(backgroundColor); + }; + ZRender2.prototype.getBackgroundColor = function() { + return this._backgroundColor; + }; + ZRender2.prototype.setDarkMode = function(darkMode) { + this._darkMode = darkMode; + }; + ZRender2.prototype.isDarkMode = function() { + return this._darkMode; + }; + ZRender2.prototype.refreshImmediately = function(fromInside) { + if (this._disposed) { + return; + } + if (!fromInside) { + this.animation.update(true); + } + this._needsRefresh = false; + this.painter.refresh(); + this._needsRefresh = false; + }; + ZRender2.prototype.refresh = function() { + if (this._disposed) { + return; + } + this._needsRefresh = true; + this.animation.start(); + }; + ZRender2.prototype.flush = function() { + if (this._disposed) { + return; + } + this._flush(false); + }; + ZRender2.prototype._flush = function(fromInside) { + var triggerRendered; + var start = getTime(); + if (this._needsRefresh) { + triggerRendered = true; + this.refreshImmediately(fromInside); + } + if (this._needsRefreshHover) { + triggerRendered = true; + this.refreshHoverImmediately(); + } + var end = getTime(); + if (triggerRendered) { + this._stillFrameAccum = 0; + this.trigger("rendered", { + elapsedTime: end - start + }); + } else if (this._sleepAfterStill > 0) { + this._stillFrameAccum++; + if (this._stillFrameAccum > this._sleepAfterStill) { + this.animation.stop(); + } + } + }; + ZRender2.prototype.setSleepAfterStill = function(stillFramesCount) { + this._sleepAfterStill = stillFramesCount; + }; + ZRender2.prototype.wakeUp = function() { + if (this._disposed) { + return; + } + this.animation.start(); + this._stillFrameAccum = 0; + }; + ZRender2.prototype.refreshHover = function() { + this._needsRefreshHover = true; + }; + ZRender2.prototype.refreshHoverImmediately = function() { + if (this._disposed) { + return; + } + this._needsRefreshHover = false; + if (this.painter.refreshHover && this.painter.getType() === "canvas") { + this.painter.refreshHover(); + } + }; + ZRender2.prototype.resize = function(opts) { + if (this._disposed) { + return; + } + opts = opts || {}; + this.painter.resize(opts.width, opts.height); + this.handler.resize(); + }; + ZRender2.prototype.clearAnimation = function() { + if (this._disposed) { + return; + } + this.animation.clear(); + }; + ZRender2.prototype.getWidth = function() { + if (this._disposed) { + return; + } + return this.painter.getWidth(); + }; + ZRender2.prototype.getHeight = function() { + if (this._disposed) { + return; + } + return this.painter.getHeight(); + }; + ZRender2.prototype.setCursorStyle = function(cursorStyle) { + if (this._disposed) { + return; + } + this.handler.setCursorStyle(cursorStyle); + }; + ZRender2.prototype.findHover = function(x, y) { + if (this._disposed) { + return; + } + return this.handler.findHover(x, y); + }; + ZRender2.prototype.on = function(eventName, eventHandler, context) { + if (!this._disposed) { + this.handler.on(eventName, eventHandler, context); + } + return this; + }; + ZRender2.prototype.off = function(eventName, eventHandler) { + if (this._disposed) { + return; + } + this.handler.off(eventName, eventHandler); + }; + ZRender2.prototype.trigger = function(eventName, event) { + if (this._disposed) { + return; + } + this.handler.trigger(eventName, event); + }; + ZRender2.prototype.clear = function() { + if (this._disposed) { + return; + } + var roots = this.storage.getRoots(); + for (var i = 0; i < roots.length; i++) { + if (roots[i] instanceof Group$2) { + roots[i].removeSelfFromZr(this); + } + } + this.storage.delAllRoots(); + this.painter.clear(); + }; + ZRender2.prototype.dispose = function() { + if (this._disposed) { + return; + } + this.animation.stop(); + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler.dispose(); + this.animation = this.storage = this.painter = this.handler = null; + this._disposed = true; + delInstance(this.id); + }; + return ZRender2; +}(); +function init$1(dom, opts) { + var zr = new ZRender(guid(), dom, opts); + instances$1[zr.id] = zr; + return zr; +} +function registerPainter(name, Ctor) { + painterCtors[name] = Ctor; +} + +var RADIAN_EPSILON = 1e-4; +// Although chrome already enlarge this number to 100 for `toFixed`, but +// we sill follow the spec for compatibility. +var ROUND_SUPPORTED_PRECISION_MAX = 20; +function _trim(str) { + return str.replace(/^\s+|\s+$/g, ''); +} +/** + * Linear mapping a value from domain to range + * @param val + * @param domain Domain extent domain[0] can be bigger than domain[1] + * @param range Range extent range[0] can be bigger than range[1] + * @param clamp Default to be false + */ +function linearMap(val, domain, range, clamp) { + var d0 = domain[0]; + var d1 = domain[1]; + var r0 = range[0]; + var r1 = range[1]; + var subDomain = d1 - d0; + var subRange = r1 - r0; + if (subDomain === 0) { + return subRange === 0 ? r0 : (r0 + r1) / 2; + } + // Avoid accuracy problem in edge, such as + // 146.39 - 62.83 === 83.55999999999999. + // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError + // It is a little verbose for efficiency considering this method + // is a hotspot. + if (clamp) { + if (subDomain > 0) { + if (val <= d0) { + return r0; + } else if (val >= d1) { + return r1; + } + } else { + if (val >= d0) { + return r0; + } else if (val <= d1) { + return r1; + } + } + } else { + if (val === d0) { + return r0; + } + if (val === d1) { + return r1; + } + } + return (val - d0) / subDomain * subRange + r0; +} +/** + * Convert a percent string to absolute number. + * Returns NaN if percent is not a valid string or number + */ +function parsePercent(percent, all) { + switch (percent) { + case 'center': + case 'middle': + percent = '50%'; + break; + case 'left': + case 'top': + percent = '0%'; + break; + case 'right': + case 'bottom': + percent = '100%'; + break; + } + if (isString(percent)) { + if (_trim(percent).match(/%$/)) { + return parseFloat(percent) / 100 * all; + } + return parseFloat(percent); + } + return percent == null ? NaN : +percent; +} +function round$1(x, precision, returnStr) { + if (precision == null) { + precision = 10; + } + // Avoid range error + precision = Math.min(Math.max(0, precision), ROUND_SUPPORTED_PRECISION_MAX); + // PENDING: 1.005.toFixed(2) is '1.00' rather than '1.01' + x = (+x).toFixed(precision); + return returnStr ? x : +x; +} +/** + * Get precision. + */ +function getPrecision(val) { + val = +val; + if (isNaN(val)) { + return 0; + } + // It is much faster than methods converting number to string as follows + // let tmp = val.toString(); + // return tmp.length - 1 - tmp.indexOf('.'); + // especially when precision is low + // Notice: + // (1) If the loop count is over about 20, it is slower than `getPrecisionSafe`. + // (see https://jsbench.me/2vkpcekkvw/1) + // (2) If the val is less than for example 1e-15, the result may be incorrect. + // (see test/ut/spec/util/number.test.ts `getPrecision_equal_random`) + if (val > 1e-14) { + var e = 1; + for (var i = 0; i < 15; i++, e *= 10) { + if (Math.round(val * e) / e === val) { + return i; + } + } + } + return getPrecisionSafe(val); +} +/** + * Get precision with slow but safe method + */ +function getPrecisionSafe(val) { + // toLowerCase for: '3.4E-12' + var str = val.toString().toLowerCase(); + // Consider scientific notation: '3.4e-12' '3.4e+12' + var eIndex = str.indexOf('e'); + var exp = eIndex > 0 ? +str.slice(eIndex + 1) : 0; + var significandPartLen = eIndex > 0 ? eIndex : str.length; + var dotIndex = str.indexOf('.'); + var decimalPartLen = dotIndex < 0 ? 0 : significandPartLen - 1 - dotIndex; + return Math.max(0, decimalPartLen - exp); +} +/** + * Minimal dicernible data precisioin according to a single pixel. + */ +function getPixelPrecision(dataExtent, pixelExtent) { + var log = Math.log; + var LN10 = Math.LN10; + var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); + var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); + // toFixed() digits argument must be between 0 and 20. + var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20); + return !isFinite(precision) ? 20 : precision; +} +/** + * Get a data of given precision, assuring the sum of percentages + * in valueList is 1. + * The largest remainder method is used. + * https://en.wikipedia.org/wiki/Largest_remainder_method + * + * @param valueList a list of all data + * @param precision integer number showing digits of precision + * @return {Array} + */ +function getPercentSeats(valueList, precision) { + var sum = reduce(valueList, function (acc, val) { + return acc + (isNaN(val) ? 0 : val); + }, 0); + if (sum === 0) { + return []; + } + var digits = Math.pow(10, precision); + var votesPerQuota = map$1(valueList, function (val) { + return (isNaN(val) ? 0 : val) / sum * digits * 100; + }); + var targetSeats = digits * 100; + var seats = map$1(votesPerQuota, function (votes) { + // Assign automatic seats. + return Math.floor(votes); + }); + var currentSum = reduce(seats, function (acc, val) { + return acc + val; + }, 0); + var remainder = map$1(votesPerQuota, function (votes, idx) { + return votes - seats[idx]; + }); + // Has remainding votes. + while (currentSum < targetSeats) { + // Find next largest remainder. + var max = Number.NEGATIVE_INFINITY; + var maxId = null; + for (var i = 0, len = remainder.length; i < len; ++i) { + if (remainder[i] > max) { + max = remainder[i]; + maxId = i; + } + } + // Add a vote to max remainder. + ++seats[maxId]; + remainder[maxId] = 0; + ++currentSum; + } + return map$1(seats, function (seat) { + return seat / digits; + }); +} +/** + * Solve the floating point adding problem like 0.1 + 0.2 === 0.30000000000000004 + * See + */ +function addSafe(val0, val1) { + var maxPrecision = Math.max(getPrecision(val0), getPrecision(val1)); + // const multiplier = Math.pow(10, maxPrecision); + // return (Math.round(val0 * multiplier) + Math.round(val1 * multiplier)) / multiplier; + var sum = val0 + val1; + // // PENDING: support more? + return maxPrecision > ROUND_SUPPORTED_PRECISION_MAX ? sum : round$1(sum, maxPrecision); +} +/** + * To 0 - 2 * PI, considering negative radian. + */ +function remRadian(radian) { + var pi2 = Math.PI * 2; + return (radian % pi2 + pi2) % pi2; +} +/** + * @param {type} radian + * @return {boolean} + */ +function isRadianAroundZero(val) { + return val > -1e-4 && val < RADIAN_EPSILON; +} +// eslint-disable-next-line +var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line +/** + * @param value valid type: number | string | Date, otherwise return `new Date(NaN)` + * These values can be accepted: + * + An instance of Date, represent a time in its own time zone. + * + Or string in a subset of ISO 8601, only including: + * + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06', + * + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123', + * + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00', + * all of which will be treated as local time if time zone is not specified + * (see ). + * + Or other string format, including (all of which will be treated as local time): + * '2012', '2012-3-1', '2012/3/1', '2012/03/01', + * '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123' + * + a timestamp, which represent a time in UTC. + * @return date Never be null/undefined. If invalid, return `new Date(NaN)`. + */ +function parseDate(value) { + if (value instanceof Date) { + return value; + } else if (isString(value)) { + // Different browsers parse date in different way, so we parse it manually. + // Some other issues: + // new Date('1970-01-01') is UTC, + // new Date('1970/01/01') and new Date('1970-1-01') is local. + // See issue #3623 + var match = TIME_REG.exec(value); + if (!match) { + // return Invalid Date. + return new Date(NaN); + } + // Use local time when no timezone offset is specified. + if (!match[8]) { + // match[n] can only be string or undefined. + // But take care of '12' + 1 => '121'. + return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0); + } + // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time, + // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment). + // For example, system timezone is set as "Time Zone: America/Toronto", + // then these code will get different result: + // `new Date(1478411999999).getTimezoneOffset(); // get 240` + // `new Date(1478412000000).getTimezoneOffset(); // get 300` + // So we should not use `new Date`, but use `Date.UTC`. + else { + var hour = +match[4] || 0; + if (match[8].toUpperCase() !== 'Z') { + hour -= +match[8].slice(0, 3); + } + return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0)); + } + } else if (value == null) { + return new Date(NaN); + } + return new Date(Math.round(value)); +} +/** + * Quantity of a number. e.g. 0.1, 1, 10, 100 + * + * @param val + * @return + */ +function quantity(val) { + return Math.pow(10, quantityExponent(val)); +} +/** + * Exponent of the quantity of a number + * e.g., 1234 equals to 1.234*10^3, so quantityExponent(1234) is 3 + * + * @param val non-negative value + * @return + */ +function quantityExponent(val) { + if (val === 0) { + return 0; + } + var exp = Math.floor(Math.log(val) / Math.LN10); + /** + * exp is expected to be the rounded-down result of the base-10 log of val. + * But due to the precision loss with Math.log(val), we need to restore it + * using 10^exp to make sure we can get val back from exp. #11249 + */ + if (val / Math.pow(10, exp) >= 10) { + exp++; + } + return exp; +} +/** + * find a “nice” number approximately equal to x. Round the number if round = true, + * take ceiling if round = false. The primary observation is that the “nicest” + * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers. + * + * See "Nice Numbers for Graph Labels" of Graphic Gems. + * + * @param val Non-negative value. + * @param round + * @return Niced number + */ +function nice(val, round) { + var exponent = quantityExponent(val); + var exp10 = Math.pow(10, exponent); + var f = val / exp10; // 1 <= f < 10 + var nf; + { + if (f < 1.5) { + nf = 1; + } else if (f < 2.5) { + nf = 2; + } else if (f < 4) { + nf = 3; + } else if (f < 7) { + nf = 5; + } else { + nf = 10; + } + } + val = nf * exp10; + // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754). + // 20 is the uppper bound of toFixed. + return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val; +} +/** + * [Numeric is defined as]: + * `parseFloat(val) == val` + * For example: + * numeric: + * typeof number except NaN, '-123', '123', '2e3', '-2e3', '011', 'Infinity', Infinity, + * and they rounded by white-spaces or line-terminal like ' -123 \n ' (see es spec) + * not-numeric: + * null, undefined, [], {}, true, false, 'NaN', NaN, '123ab', + * empty string, string with only white-spaces or line-terminal (see es spec), + * 0x12, '0x12', '-0x12', 012, '012', '-012', + * non-string, ... + * + * @test See full test cases in `test/ut/spec/util/number.js`. + * @return Must be a typeof number. If not numeric, return NaN. + */ +function numericToNumber(val) { + var valFloat = parseFloat(val); + return valFloat == val // eslint-disable-line eqeqeq + && (valFloat !== 0 || !isString(val) || val.indexOf('x') <= 0) // For case ' 0x0 '. + ? valFloat : NaN; +} +/** + * Definition of "numeric": see `numericToNumber`. + */ +function isNumeric(val) { + return !isNaN(numericToNumber(val)); +} +/** + * Use random base to prevent users hard code depending on + * this auto generated marker id. + * @return An positive integer. + */ +function getRandomIdBase() { + return Math.round(Math.random() * 9); +} +/** + * Get the greatest common divisor. + * + * @param {number} a one number + * @param {number} b the other number + */ +function getGreatestCommonDividor(a, b) { + if (b === 0) { + return a; + } + return getGreatestCommonDividor(b, a % b); +} +/** + * Get the least common multiple. + * + * @param {number} a one number + * @param {number} b the other number + */ +function getLeastCommonMultiple(a, b) { + if (a == null) { + return b; + } + if (b == null) { + return a; + } + return a * b / getGreatestCommonDividor(a, b); +} + +function throwError(msg) { + throw new Error(msg); +} + +function interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; +} +var DUMMY_COMPONENT_NAME_PREFIX = "series\0"; +var INTERNAL_COMPONENT_ID_PREFIX = "\0_ec_\0"; +function normalizeToArray(value) { + return value instanceof Array ? value : value == null ? [] : [value]; +} +function defaultEmphasis(opt, key, subOpts) { + if (opt) { + opt[key] = opt[key] || {}; + opt.emphasis = opt.emphasis || {}; + opt.emphasis[key] = opt.emphasis[key] || {}; + for (var i = 0, len = subOpts.length; i < len; i++) { + var subOptName = subOpts[i]; + if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) { + opt.emphasis[key][subOptName] = opt[key][subOptName]; + } + } + } +} +var TEXT_STYLE_OPTIONS = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "rich", "tag", "color", "textBorderColor", "textBorderWidth", "width", "height", "lineHeight", "align", "verticalAlign", "baseline", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY", "textShadowColor", "textShadowBlur", "textShadowOffsetX", "textShadowOffsetY", "backgroundColor", "borderColor", "borderWidth", "borderRadius", "padding"]; +function getDataItemValue(dataItem) { + return isObject$2(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem; +} +function isDataItemOption(dataItem) { + return isObject$2(dataItem) && !(dataItem instanceof Array); +} +function mappingToExists(existings, newCmptOptions, mode) { + var isNormalMergeMode = mode === "normalMerge"; + var isReplaceMergeMode = mode === "replaceMerge"; + var isReplaceAllMode = mode === "replaceAll"; + existings = existings || []; + newCmptOptions = (newCmptOptions || []).slice(); + var existingIdIdxMap = createHashMap(); + each$4(newCmptOptions, function(cmptOption, index) { + if (!isObject$2(cmptOption)) { + newCmptOptions[index] = null; + return; + } + }); + var result = prepareResult(existings, existingIdIdxMap, mode); + if (isNormalMergeMode || isReplaceMergeMode) { + mappingById(result, existings, existingIdIdxMap, newCmptOptions); + } + if (isNormalMergeMode) { + mappingByName(result, newCmptOptions); + } + if (isNormalMergeMode || isReplaceMergeMode) { + mappingByIndex(result, newCmptOptions, isReplaceMergeMode); + } else if (isReplaceAllMode) { + mappingInReplaceAllMode(result, newCmptOptions); + } + makeIdAndName(result); + return result; +} +function prepareResult(existings, existingIdIdxMap, mode) { + var result = []; + if (mode === "replaceAll") { + return result; + } + for (var index = 0; index < existings.length; index++) { + var existing = existings[index]; + if (existing && existing.id != null) { + existingIdIdxMap.set(existing.id, index); + } + result.push({ + existing: mode === "replaceMerge" || isComponentIdInternal(existing) ? null : existing, + newOption: null, + keyInfo: null, + brandNew: null + }); + } + return result; +} +function mappingById(result, existings, existingIdIdxMap, newCmptOptions) { + each$4(newCmptOptions, function(cmptOption, index) { + if (!cmptOption || cmptOption.id == null) { + return; + } + var optionId = makeComparableKey(cmptOption.id); + var existingIdx = existingIdIdxMap.get(optionId); + if (existingIdx != null) { + var resultItem = result[existingIdx]; + assert(!resultItem.newOption, 'Duplicated option on id "' + optionId + '".'); + resultItem.newOption = cmptOption; + resultItem.existing = existings[existingIdx]; + newCmptOptions[index] = null; + } + }); +} +function mappingByName(result, newCmptOptions) { + each$4(newCmptOptions, function(cmptOption, index) { + if (!cmptOption || cmptOption.name == null) { + return; + } + for (var i = 0; i < result.length; i++) { + var existing = result[i].existing; + if (!result[i].newOption && existing && (existing.id == null || cmptOption.id == null) && !isComponentIdInternal(cmptOption) && !isComponentIdInternal(existing) && keyExistAndEqual("name", existing, cmptOption)) { + result[i].newOption = cmptOption; + newCmptOptions[index] = null; + return; + } + } + }); +} +function mappingByIndex(result, newCmptOptions, brandNew) { + each$4(newCmptOptions, function(cmptOption) { + if (!cmptOption) { + return; + } + var resultItem; + var nextIdx = 0; + while ( + // Be `!resultItem` only when `nextIdx >= result.length`. + (resultItem = result[nextIdx]) && (resultItem.newOption || isComponentIdInternal(resultItem.existing) || // In mode "replaceMerge", here no not-mapped-non-internal-existing. + resultItem.existing && cmptOption.id != null && !keyExistAndEqual("id", cmptOption, resultItem.existing)) + ) { + nextIdx++; + } + if (resultItem) { + resultItem.newOption = cmptOption; + resultItem.brandNew = brandNew; + } else { + result.push({ + newOption: cmptOption, + brandNew, + existing: null, + keyInfo: null + }); + } + nextIdx++; + }); +} +function mappingInReplaceAllMode(result, newCmptOptions) { + each$4(newCmptOptions, function(cmptOption) { + result.push({ + newOption: cmptOption, + brandNew: true, + existing: null, + keyInfo: null + }); + }); +} +function makeIdAndName(mapResult) { + var idMap = createHashMap(); + each$4(mapResult, function(item) { + var existing = item.existing; + existing && idMap.set(existing.id, item); + }); + each$4(mapResult, function(item) { + var opt = item.newOption; + assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, "id duplicates: " + (opt && opt.id)); + opt && opt.id != null && idMap.set(opt.id, item); + !item.keyInfo && (item.keyInfo = {}); + }); + each$4(mapResult, function(item, index) { + var existing = item.existing; + var opt = item.newOption; + var keyInfo = item.keyInfo; + if (!isObject$2(opt)) { + return; + } + keyInfo.name = opt.name != null ? makeComparableKey(opt.name) : existing ? existing.name : DUMMY_COMPONENT_NAME_PREFIX + index; + if (existing) { + keyInfo.id = makeComparableKey(existing.id); + } else if (opt.id != null) { + keyInfo.id = makeComparableKey(opt.id); + } else { + var idNum = 0; + do { + keyInfo.id = "\0" + keyInfo.name + "\0" + idNum++; + } while (idMap.get(keyInfo.id)); + } + idMap.set(keyInfo.id, item); + }); +} +function keyExistAndEqual(attr, obj1, obj2) { + var key1 = convertOptionIdName(obj1[attr], null); + var key2 = convertOptionIdName(obj2[attr], null); + return key1 != null && key2 != null && key1 === key2; +} +function makeComparableKey(val) { + return convertOptionIdName(val, ""); +} +function convertOptionIdName(idOrName, defaultValue) { + if (idOrName == null) { + return defaultValue; + } + return isString(idOrName) ? idOrName : isNumber(idOrName) || isStringSafe(idOrName) ? idOrName + "" : defaultValue; +} +function isNameSpecified(componentModel) { + var name = componentModel.name; + return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX)); +} +function isComponentIdInternal(cmptOption) { + return cmptOption && cmptOption.id != null && makeComparableKey(cmptOption.id).indexOf(INTERNAL_COMPONENT_ID_PREFIX) === 0; +} +function setComponentTypeToKeyInfo(mappingResult, mainType, componentModelCtor) { + each$4(mappingResult, function(item) { + var newOption = item.newOption; + if (isObject$2(newOption)) { + item.keyInfo.mainType = mainType; + item.keyInfo.subType = determineSubType(mainType, newOption, item.existing, componentModelCtor); + } + }); +} +function determineSubType(mainType, newCmptOption, existComponent, componentModelCtor) { + var subType = newCmptOption.type ? newCmptOption.type : existComponent ? existComponent.subType : componentModelCtor.determineSubType(mainType, newCmptOption); + return subType; +} +function queryDataIndex(data, payload) { + if (payload.dataIndexInside != null) { + return payload.dataIndexInside; + } else if (payload.dataIndex != null) { + return isArray(payload.dataIndex) ? map$1(payload.dataIndex, function(value) { + return data.indexOfRawIndex(value); + }) : data.indexOfRawIndex(payload.dataIndex); + } else if (payload.name != null) { + return isArray(payload.name) ? map$1(payload.name, function(value) { + return data.indexOfName(value); + }) : data.indexOfName(payload.name); + } +} +function makeInner() { + var key = "__ec_inner_" + innerUniqueIndex++; + return function(hostObj) { + return hostObj[key] || (hostObj[key] = {}); + }; +} +var innerUniqueIndex = getRandomIdBase(); +function parseFinder(ecModel, finderInput, opt) { + var _a = preParseFinder(finderInput, opt), mainTypeSpecified = _a.mainTypeSpecified, queryOptionMap = _a.queryOptionMap, others = _a.others; + var result = others; + var defaultMainType = opt ? opt.defaultMainType : null; + if (!mainTypeSpecified && defaultMainType) { + queryOptionMap.set(defaultMainType, {}); + } + queryOptionMap.each(function(queryOption, mainType) { + var queryResult = queryReferringComponents(ecModel, mainType, queryOption, { + useDefault: defaultMainType === mainType, + enableAll: opt && opt.enableAll != null ? opt.enableAll : true, + enableNone: opt && opt.enableNone != null ? opt.enableNone : true + }); + result[mainType + "Models"] = queryResult.models; + result[mainType + "Model"] = queryResult.models[0]; + }); + return result; +} +function preParseFinder(finderInput, opt) { + var finder; + if (isString(finderInput)) { + var obj = {}; + obj[finderInput + "Index"] = 0; + finder = obj; + } else { + finder = finderInput; + } + var queryOptionMap = createHashMap(); + var others = {}; + var mainTypeSpecified = false; + each$4(finder, function(value, key) { + if (key === "dataIndex" || key === "dataIndexInside") { + others[key] = value; + return; + } + var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || []; + var mainType = parsedKey[1]; + var queryType = (parsedKey[2] || "").toLowerCase(); + if (!mainType || !queryType || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) { + return; + } + mainTypeSpecified = mainTypeSpecified || !!mainType; + var queryOption = queryOptionMap.get(mainType) || queryOptionMap.set(mainType, {}); + queryOption[queryType] = value; + }); + return { + mainTypeSpecified, + queryOptionMap, + others + }; +} +var SINGLE_REFERRING = { + useDefault: true, + enableAll: false, + enableNone: false +}; +function queryReferringComponents(ecModel, mainType, userOption, opt) { + opt = opt || SINGLE_REFERRING; + var indexOption = userOption.index; + var idOption = userOption.id; + var nameOption = userOption.name; + var result = { + models: null, + specified: indexOption != null || idOption != null || nameOption != null + }; + if (!result.specified) { + var firstCmpt = void 0; + result.models = opt.useDefault && (firstCmpt = ecModel.getComponent(mainType)) ? [firstCmpt] : []; + return result; + } + if (indexOption === "none" || indexOption === false) { + assert(opt.enableNone, '`"none"` or `false` is not a valid value on index option.'); + result.models = []; + return result; + } + if (indexOption === "all") { + assert(opt.enableAll, '`"all"` is not a valid value on index option.'); + indexOption = idOption = nameOption = null; + } + result.models = ecModel.queryComponents({ + mainType, + index: indexOption, + id: idOption, + name: nameOption + }); + return result; +} +function setAttribute(dom, key, value) { + dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value; +} +function getAttribute(dom, key) { + return dom.getAttribute ? dom.getAttribute(key) : dom[key]; +} +function getTooltipRenderMode(renderModeOption) { + if (renderModeOption === "auto") { + return env.domSupported ? "html" : "richText"; + } else { + return renderModeOption || "html"; + } +} +function interpolateRawValues(data, precision, sourceValue, targetValue, percent) { + var isAutoPrecision = precision == null || precision === "auto"; + if (targetValue == null) { + return targetValue; + } + if (isNumber(targetValue)) { + var value = interpolateNumber(sourceValue || 0, targetValue, percent); + return round$1(value, isAutoPrecision ? Math.max(getPrecision(sourceValue || 0), getPrecision(targetValue)) : precision); + } else if (isString(targetValue)) { + return percent < 1 ? sourceValue : targetValue; + } else { + var interpolated = []; + var leftArr = sourceValue; + var rightArr = targetValue; + var length_1 = Math.max(leftArr ? leftArr.length : 0, rightArr.length); + for (var i = 0; i < length_1; ++i) { + var info = data.getDimensionInfo(i); + if (info && info.type === "ordinal") { + interpolated[i] = (percent < 1 && leftArr ? leftArr : rightArr)[i]; + } else { + var leftVal = leftArr && leftArr[i] ? leftArr[i] : 0; + var rightVal = rightArr[i]; + var value = interpolateNumber(leftVal, rightVal, percent); + interpolated[i] = round$1(value, isAutoPrecision ? Math.max(getPrecision(leftVal), getPrecision(rightVal)) : precision); + } + } + return interpolated; + } +} + +var TYPE_DELIMITER = "."; +var IS_CONTAINER = "___EC__COMPONENT__CONTAINER___"; +var IS_EXTENDED_CLASS = "___EC__EXTENDED_CLASS___"; +function parseClassType(componentType) { + var ret = { + main: "", + sub: "" + }; + if (componentType) { + var typeArr = componentType.split(TYPE_DELIMITER); + ret.main = typeArr[0] || ""; + ret.sub = typeArr[1] || ""; + } + return ret; +} +function checkClassType(componentType) { + assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType "' + componentType + '" illegal'); +} +function isExtendedClass(clz) { + return !!(clz && clz[IS_EXTENDED_CLASS]); +} +function enableClassExtend(rootClz, mandatoryMethods) { + rootClz.$constructor = rootClz; + rootClz.extend = function(proto) { + var superClass = this; + var ExtendedClass; + if (isESClass(superClass)) { + ExtendedClass = /** @class */ + function(_super) { + __extends(class_1, _super); + function class_1() { + return _super.apply(this, arguments) || this; + } + return class_1; + }(superClass); + } else { + ExtendedClass = function() { + (proto.$constructor || superClass).apply(this, arguments); + }; + inherits(ExtendedClass, this); + } + extend(ExtendedClass.prototype, proto); + ExtendedClass[IS_EXTENDED_CLASS] = true; + ExtendedClass.extend = this.extend; + ExtendedClass.superCall = superCall; + ExtendedClass.superApply = superApply; + ExtendedClass.superClass = superClass; + return ExtendedClass; + }; +} +function isESClass(fn) { + return isFunction(fn) && /^class\s/.test(Function.prototype.toString.call(fn)); +} +function mountExtend(SubClz, SupperClz) { + SubClz.extend = SupperClz.extend; +} +var classBase = Math.round(Math.random() * 10); +function enableClassCheck(target) { + var classAttr = ["__\0is_clz", classBase++].join("_"); + target.prototype[classAttr] = true; + target.isInstance = function(obj) { + return !!(obj && obj[classAttr]); + }; +} +function superCall(context, methodName) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + return this.superClass.prototype[methodName].apply(context, args); +} +function superApply(context, methodName, args) { + return this.superClass.prototype[methodName].apply(context, args); +} +function enableClassManagement(target) { + var storage = {}; + target.registerClass = function(clz) { + var componentFullType = clz.type || clz.prototype.type; + if (componentFullType) { + checkClassType(componentFullType); + clz.prototype.type = componentFullType; + var componentTypeInfo = parseClassType(componentFullType); + if (!componentTypeInfo.sub) { + storage[componentTypeInfo.main] = clz; + } else if (componentTypeInfo.sub !== IS_CONTAINER) { + var container = makeContainer(componentTypeInfo); + container[componentTypeInfo.sub] = clz; + } + } + return clz; + }; + target.getClass = function(mainType, subType, throwWhenNotFound) { + var clz = storage[mainType]; + if (clz && clz[IS_CONTAINER]) { + clz = subType ? clz[subType] : null; + } + if (throwWhenNotFound && !clz) { + throw new Error(!subType ? mainType + ".type should be specified." : "Component " + mainType + "." + (subType || "") + " is used but not imported."); + } + return clz; + }; + target.getClassesByMainType = function(componentType) { + var componentTypeInfo = parseClassType(componentType); + var result = []; + var obj = storage[componentTypeInfo.main]; + if (obj && obj[IS_CONTAINER]) { + each$4(obj, function(o, type) { + type !== IS_CONTAINER && result.push(o); + }); + } else { + result.push(obj); + } + return result; + }; + target.hasClass = function(componentType) { + var componentTypeInfo = parseClassType(componentType); + return !!storage[componentTypeInfo.main]; + }; + target.getAllClassMainTypes = function() { + var types = []; + each$4(storage, function(obj, type) { + types.push(type); + }); + return types; + }; + target.hasSubTypes = function(componentType) { + var componentTypeInfo = parseClassType(componentType); + var obj = storage[componentTypeInfo.main]; + return obj && obj[IS_CONTAINER]; + }; + function makeContainer(componentTypeInfo) { + var container = storage[componentTypeInfo.main]; + if (!container || !container[IS_CONTAINER]) { + container = storage[componentTypeInfo.main] = {}; + container[IS_CONTAINER] = true; + } + return container; + } +} + +function makeStyleMapper(properties, ignoreParent) { + // Normalize + for (var i = 0; i < properties.length; i++) { + if (!properties[i][1]) { + properties[i][1] = properties[i][0]; + } + } + ignoreParent = ignoreParent || false; + return function (model, excludes, includes) { + var style = {}; + for (var i = 0; i < properties.length; i++) { + var propName = properties[i][1]; + if (excludes && indexOf(excludes, propName) >= 0 || includes && indexOf(includes, propName) < 0) { + continue; + } + var val = model.getShallow(propName, ignoreParent); + if (val != null) { + style[properties[i][0]] = val; + } + } + // TODO Text or image? + return style; + }; +} + +var AREA_STYLE_KEY_MAP = [['fill', 'color'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['opacity'], ['shadowColor'] +// Option decal is in `DecalObject` but style.decal is in `PatternObject`. +// So do not transfer decal directly. +]; +var getAreaStyle = makeStyleMapper(AREA_STYLE_KEY_MAP); +var AreaStyleMixin = /** @class */function () { + function AreaStyleMixin() {} + AreaStyleMixin.prototype.getAreaStyle = function (excludes, includes) { + return getAreaStyle(this, excludes, includes); + }; + return AreaStyleMixin; +}(); + +var globalImageCache = new LRU(50); +function findExistImage(newImageOrSrc) { + if (typeof newImageOrSrc === 'string') { + var cachedImgObj = globalImageCache.get(newImageOrSrc); + return cachedImgObj && cachedImgObj.image; + } + else { + return newImageOrSrc; + } +} +function createOrUpdateImage(newImageOrSrc, image, hostEl, onload, cbPayload) { + if (!newImageOrSrc) { + return image; + } + else if (typeof newImageOrSrc === 'string') { + if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) { + return image; + } + var cachedImgObj = globalImageCache.get(newImageOrSrc); + var pendingWrap = { hostEl: hostEl, cb: onload, cbPayload: cbPayload }; + if (cachedImgObj) { + image = cachedImgObj.image; + !isImageReady(image) && cachedImgObj.pending.push(pendingWrap); + } + else { + image = platformApi.loadImage(newImageOrSrc, imageOnLoad, imageOnLoad); + image.__zrImageSrc = newImageOrSrc; + globalImageCache.put(newImageOrSrc, image.__cachedImgObj = { + image: image, + pending: [pendingWrap] + }); + } + return image; + } + else { + return newImageOrSrc; + } +} +function imageOnLoad() { + var cachedImgObj = this.__cachedImgObj; + this.onload = this.onerror = this.__cachedImgObj = null; + for (var i = 0; i < cachedImgObj.pending.length; i++) { + var pendingWrap = cachedImgObj.pending[i]; + var cb = pendingWrap.cb; + cb && cb(this, pendingWrap.cbPayload); + pendingWrap.hostEl.dirty(); + } + cachedImgObj.pending.length = 0; +} +function isImageReady(image) { + return image && image.width && image.height; +} + +var STYLE_REG = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g; +function truncateText2(out, text, containerWidth, font, ellipsis, options) { + if (!containerWidth) { + out.text = ''; + out.isTruncated = false; + return; + } + var textLines = (text + '').split('\n'); + options = prepareTruncateOptions(containerWidth, font, ellipsis, options); + var isTruncated = false; + var truncateOut = {}; + for (var i = 0, len = textLines.length; i < len; i++) { + truncateSingleLine(truncateOut, textLines[i], options); + textLines[i] = truncateOut.textLine; + isTruncated = isTruncated || truncateOut.isTruncated; + } + out.text = textLines.join('\n'); + out.isTruncated = isTruncated; +} +function prepareTruncateOptions(containerWidth, font, ellipsis, options) { + options = options || {}; + var preparedOpts = extend({}, options); + preparedOpts.font = font; + ellipsis = retrieve2(ellipsis, '...'); + preparedOpts.maxIterations = retrieve2(options.maxIterations, 2); + var minChar = preparedOpts.minChar = retrieve2(options.minChar, 0); + preparedOpts.cnCharWidth = getWidth('国', font); + var ascCharWidth = preparedOpts.ascCharWidth = getWidth('a', font); + preparedOpts.placeholder = retrieve2(options.placeholder, ''); + var contentWidth = containerWidth = Math.max(0, containerWidth - 1); + for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) { + contentWidth -= ascCharWidth; + } + var ellipsisWidth = getWidth(ellipsis, font); + if (ellipsisWidth > contentWidth) { + ellipsis = ''; + ellipsisWidth = 0; + } + contentWidth = containerWidth - ellipsisWidth; + preparedOpts.ellipsis = ellipsis; + preparedOpts.ellipsisWidth = ellipsisWidth; + preparedOpts.contentWidth = contentWidth; + preparedOpts.containerWidth = containerWidth; + return preparedOpts; +} +function truncateSingleLine(out, textLine, options) { + var containerWidth = options.containerWidth; + var font = options.font; + var contentWidth = options.contentWidth; + if (!containerWidth) { + out.textLine = ''; + out.isTruncated = false; + return; + } + var lineWidth = getWidth(textLine, font); + if (lineWidth <= containerWidth) { + out.textLine = textLine; + out.isTruncated = false; + return; + } + for (var j = 0;; j++) { + if (lineWidth <= contentWidth || j >= options.maxIterations) { + textLine += options.ellipsis; + break; + } + var subLength = j === 0 + ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth) + : lineWidth > 0 + ? Math.floor(textLine.length * contentWidth / lineWidth) + : 0; + textLine = textLine.substr(0, subLength); + lineWidth = getWidth(textLine, font); + } + if (textLine === '') { + textLine = options.placeholder; + } + out.textLine = textLine; + out.isTruncated = true; +} +function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) { + var width = 0; + var i = 0; + for (var len = text.length; i < len && width < contentWidth; i++) { + var charCode = text.charCodeAt(i); + width += (0 <= charCode && charCode <= 127) ? ascCharWidth : cnCharWidth; + } + return i; +} +function parsePlainText(text, style) { + text != null && (text += ''); + var overflow = style.overflow; + var padding = style.padding; + var font = style.font; + var truncate = overflow === 'truncate'; + var calculatedLineHeight = getLineHeight(font); + var lineHeight = retrieve2(style.lineHeight, calculatedLineHeight); + var bgColorDrawn = !!(style.backgroundColor); + var truncateLineOverflow = style.lineOverflow === 'truncate'; + var isTruncated = false; + var width = style.width; + var lines; + if (width != null && (overflow === 'break' || overflow === 'breakAll')) { + lines = text ? wrapText(text, style.font, width, overflow === 'breakAll', 0).lines : []; + } + else { + lines = text ? text.split('\n') : []; + } + var contentHeight = lines.length * lineHeight; + var height = retrieve2(style.height, contentHeight); + if (contentHeight > height && truncateLineOverflow) { + var lineCount = Math.floor(height / lineHeight); + isTruncated = isTruncated || (lines.length > lineCount); + lines = lines.slice(0, lineCount); + } + if (text && truncate && width != null) { + var options = prepareTruncateOptions(width, font, style.ellipsis, { + minChar: style.truncateMinChar, + placeholder: style.placeholder + }); + var singleOut = {}; + for (var i = 0; i < lines.length; i++) { + truncateSingleLine(singleOut, lines[i], options); + lines[i] = singleOut.textLine; + isTruncated = isTruncated || singleOut.isTruncated; + } + } + var outerHeight = height; + var contentWidth = 0; + for (var i = 0; i < lines.length; i++) { + contentWidth = Math.max(getWidth(lines[i], font), contentWidth); + } + if (width == null) { + width = contentWidth; + } + var outerWidth = contentWidth; + if (padding) { + outerHeight += padding[0] + padding[2]; + outerWidth += padding[1] + padding[3]; + width += padding[1] + padding[3]; + } + if (bgColorDrawn) { + outerWidth = width; + } + return { + lines: lines, + height: height, + outerWidth: outerWidth, + outerHeight: outerHeight, + lineHeight: lineHeight, + calculatedLineHeight: calculatedLineHeight, + contentWidth: contentWidth, + contentHeight: contentHeight, + width: width, + isTruncated: isTruncated + }; +} +var RichTextToken = (function () { + function RichTextToken() { + } + return RichTextToken; +}()); +var RichTextLine = (function () { + function RichTextLine(tokens) { + this.tokens = []; + if (tokens) { + this.tokens = tokens; + } + } + return RichTextLine; +}()); +var RichTextContentBlock = (function () { + function RichTextContentBlock() { + this.width = 0; + this.height = 0; + this.contentWidth = 0; + this.contentHeight = 0; + this.outerWidth = 0; + this.outerHeight = 0; + this.lines = []; + this.isTruncated = false; + } + return RichTextContentBlock; +}()); +function parseRichText(text, style) { + var contentBlock = new RichTextContentBlock(); + text != null && (text += ''); + if (!text) { + return contentBlock; + } + var topWidth = style.width; + var topHeight = style.height; + var overflow = style.overflow; + var wrapInfo = (overflow === 'break' || overflow === 'breakAll') && topWidth != null + ? { width: topWidth, accumWidth: 0, breakAll: overflow === 'breakAll' } + : null; + var lastIndex = STYLE_REG.lastIndex = 0; + var result; + while ((result = STYLE_REG.exec(text)) != null) { + var matchedIndex = result.index; + if (matchedIndex > lastIndex) { + pushTokens(contentBlock, text.substring(lastIndex, matchedIndex), style, wrapInfo); + } + pushTokens(contentBlock, result[2], style, wrapInfo, result[1]); + lastIndex = STYLE_REG.lastIndex; + } + if (lastIndex < text.length) { + pushTokens(contentBlock, text.substring(lastIndex, text.length), style, wrapInfo); + } + var pendingList = []; + var calculatedHeight = 0; + var calculatedWidth = 0; + var stlPadding = style.padding; + var truncate = overflow === 'truncate'; + var truncateLine = style.lineOverflow === 'truncate'; + var tmpTruncateOut = {}; + function finishLine(line, lineWidth, lineHeight) { + line.width = lineWidth; + line.lineHeight = lineHeight; + calculatedHeight += lineHeight; + calculatedWidth = Math.max(calculatedWidth, lineWidth); + } + outer: for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var lineHeight = 0; + var lineWidth = 0; + for (var j = 0; j < line.tokens.length; j++) { + var token = line.tokens[j]; + var tokenStyle = token.styleName && style.rich[token.styleName] || {}; + var textPadding = token.textPadding = tokenStyle.padding; + var paddingH = textPadding ? textPadding[1] + textPadding[3] : 0; + var font = token.font = tokenStyle.font || style.font; + token.contentHeight = getLineHeight(font); + var tokenHeight = retrieve2(tokenStyle.height, token.contentHeight); + token.innerHeight = tokenHeight; + textPadding && (tokenHeight += textPadding[0] + textPadding[2]); + token.height = tokenHeight; + token.lineHeight = retrieve3(tokenStyle.lineHeight, style.lineHeight, tokenHeight); + token.align = tokenStyle && tokenStyle.align || style.align; + token.verticalAlign = tokenStyle && tokenStyle.verticalAlign || 'middle'; + if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) { + var originalLength = contentBlock.lines.length; + if (j > 0) { + line.tokens = line.tokens.slice(0, j); + finishLine(line, lineWidth, lineHeight); + contentBlock.lines = contentBlock.lines.slice(0, i + 1); + } + else { + contentBlock.lines = contentBlock.lines.slice(0, i); + } + contentBlock.isTruncated = contentBlock.isTruncated || (contentBlock.lines.length < originalLength); + break outer; + } + var styleTokenWidth = tokenStyle.width; + var tokenWidthNotSpecified = styleTokenWidth == null || styleTokenWidth === 'auto'; + if (typeof styleTokenWidth === 'string' && styleTokenWidth.charAt(styleTokenWidth.length - 1) === '%') { + token.percentWidth = styleTokenWidth; + pendingList.push(token); + token.contentWidth = getWidth(token.text, font); + } + else { + if (tokenWidthNotSpecified) { + var textBackgroundColor = tokenStyle.backgroundColor; + var bgImg = textBackgroundColor && textBackgroundColor.image; + if (bgImg) { + bgImg = findExistImage(bgImg); + if (isImageReady(bgImg)) { + token.width = Math.max(token.width, bgImg.width * tokenHeight / bgImg.height); + } + } + } + var remainTruncWidth = truncate && topWidth != null + ? topWidth - lineWidth : null; + if (remainTruncWidth != null && remainTruncWidth < token.width) { + if (!tokenWidthNotSpecified || remainTruncWidth < paddingH) { + token.text = ''; + token.width = token.contentWidth = 0; + } + else { + truncateText2(tmpTruncateOut, token.text, remainTruncWidth - paddingH, font, style.ellipsis, { minChar: style.truncateMinChar }); + token.text = tmpTruncateOut.text; + contentBlock.isTruncated = contentBlock.isTruncated || tmpTruncateOut.isTruncated; + token.width = token.contentWidth = getWidth(token.text, font); + } + } + else { + token.contentWidth = getWidth(token.text, font); + } + } + token.width += paddingH; + lineWidth += token.width; + tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight)); + } + finishLine(line, lineWidth, lineHeight); + } + contentBlock.outerWidth = contentBlock.width = retrieve2(topWidth, calculatedWidth); + contentBlock.outerHeight = contentBlock.height = retrieve2(topHeight, calculatedHeight); + contentBlock.contentHeight = calculatedHeight; + contentBlock.contentWidth = calculatedWidth; + if (stlPadding) { + contentBlock.outerWidth += stlPadding[1] + stlPadding[3]; + contentBlock.outerHeight += stlPadding[0] + stlPadding[2]; + } + for (var i = 0; i < pendingList.length; i++) { + var token = pendingList[i]; + var percentWidth = token.percentWidth; + token.width = parseInt(percentWidth, 10) / 100 * contentBlock.width; + } + return contentBlock; +} +function pushTokens(block, str, style, wrapInfo, styleName) { + var isEmptyStr = str === ''; + var tokenStyle = styleName && style.rich[styleName] || {}; + var lines = block.lines; + var font = tokenStyle.font || style.font; + var newLine = false; + var strLines; + var linesWidths; + if (wrapInfo) { + var tokenPadding = tokenStyle.padding; + var tokenPaddingH = tokenPadding ? tokenPadding[1] + tokenPadding[3] : 0; + if (tokenStyle.width != null && tokenStyle.width !== 'auto') { + var outerWidth_1 = parsePercent$1(tokenStyle.width, wrapInfo.width) + tokenPaddingH; + if (lines.length > 0) { + if (outerWidth_1 + wrapInfo.accumWidth > wrapInfo.width) { + strLines = str.split('\n'); + newLine = true; + } + } + wrapInfo.accumWidth = outerWidth_1; + } + else { + var res = wrapText(str, font, wrapInfo.width, wrapInfo.breakAll, wrapInfo.accumWidth); + wrapInfo.accumWidth = res.accumWidth + tokenPaddingH; + linesWidths = res.linesWidths; + strLines = res.lines; + } + } + else { + strLines = str.split('\n'); + } + for (var i = 0; i < strLines.length; i++) { + var text = strLines[i]; + var token = new RichTextToken(); + token.styleName = styleName; + token.text = text; + token.isLineHolder = !text && !isEmptyStr; + if (typeof tokenStyle.width === 'number') { + token.width = tokenStyle.width; + } + else { + token.width = linesWidths + ? linesWidths[i] + : getWidth(text, font); + } + if (!i && !newLine) { + var tokens = (lines[lines.length - 1] || (lines[0] = new RichTextLine())).tokens; + var tokensLen = tokens.length; + (tokensLen === 1 && tokens[0].isLineHolder) + ? (tokens[0] = token) + : ((text || !tokensLen || isEmptyStr) && tokens.push(token)); + } + else { + lines.push(new RichTextLine([token])); + } + } +} +function isAlphabeticLetter(ch) { + var code = ch.charCodeAt(0); + return code >= 0x20 && code <= 0x24F + || code >= 0x370 && code <= 0x10FF + || code >= 0x1200 && code <= 0x13FF + || code >= 0x1E00 && code <= 0x206F; +} +var breakCharMap = reduce(',&?/;] '.split(''), function (obj, ch) { + obj[ch] = true; + return obj; +}, {}); +function isWordBreakChar(ch) { + if (isAlphabeticLetter(ch)) { + if (breakCharMap[ch]) { + return true; + } + return false; + } + return true; +} +function wrapText(text, font, lineWidth, isBreakAll, lastAccumWidth) { + var lines = []; + var linesWidths = []; + var line = ''; + var currentWord = ''; + var currentWordWidth = 0; + var accumWidth = 0; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch === '\n') { + if (currentWord) { + line += currentWord; + accumWidth += currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ''; + currentWord = ''; + currentWordWidth = 0; + accumWidth = 0; + continue; + } + var chWidth = getWidth(ch, font); + var inWord = isBreakAll ? false : !isWordBreakChar(ch); + if (!lines.length + ? lastAccumWidth + accumWidth + chWidth > lineWidth + : accumWidth + chWidth > lineWidth) { + if (!accumWidth) { + if (inWord) { + lines.push(currentWord); + linesWidths.push(currentWordWidth); + currentWord = ch; + currentWordWidth = chWidth; + } + else { + lines.push(ch); + linesWidths.push(chWidth); + } + } + else if (line || currentWord) { + if (inWord) { + if (!line) { + line = currentWord; + currentWord = ''; + currentWordWidth = 0; + accumWidth = currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth - currentWordWidth); + currentWord += ch; + currentWordWidth += chWidth; + line = ''; + accumWidth = currentWordWidth; + } + else { + if (currentWord) { + line += currentWord; + currentWord = ''; + currentWordWidth = 0; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ch; + accumWidth = chWidth; + } + } + continue; + } + accumWidth += chWidth; + if (inWord) { + currentWord += ch; + currentWordWidth += chWidth; + } + else { + if (currentWord) { + line += currentWord; + currentWord = ''; + currentWordWidth = 0; + } + line += ch; + } + } + if (!lines.length && !line) { + line = text; + currentWord = ''; + currentWordWidth = 0; + } + if (currentWord) { + line += currentWord; + } + if (line) { + lines.push(line); + linesWidths.push(accumWidth); + } + if (lines.length === 1) { + accumWidth += lastAccumWidth; + } + return { + accumWidth: accumWidth, + lines: lines, + linesWidths: linesWidths + }; +} + +var STYLE_MAGIC_KEY = '__zr_style_' + Math.round((Math.random() * 10)); +var DEFAULT_COMMON_STYLE = { + shadowBlur: 0, + shadowOffsetX: 0, + shadowOffsetY: 0, + shadowColor: '#000', + opacity: 1, + blend: 'source-over' +}; +var DEFAULT_COMMON_ANIMATION_PROPS = { + style: { + shadowBlur: true, + shadowOffsetX: true, + shadowOffsetY: true, + shadowColor: true, + opacity: true + } +}; +DEFAULT_COMMON_STYLE[STYLE_MAGIC_KEY] = true; +var PRIMARY_STATES_KEYS = ['z', 'z2', 'invisible']; +var PRIMARY_STATES_KEYS_IN_HOVER_LAYER = ['invisible']; +var Displayable = (function (_super) { + __extends(Displayable, _super); + function Displayable(props) { + return _super.call(this, props) || this; + } + Displayable.prototype._init = function (props) { + var keysArr = keys(props); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + if (key === 'style') { + this.useStyle(props[key]); + } + else { + _super.prototype.attrKV.call(this, key, props[key]); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Displayable.prototype.beforeBrush = function () { }; + Displayable.prototype.afterBrush = function () { }; + Displayable.prototype.innerBeforeBrush = function () { }; + Displayable.prototype.innerAfterBrush = function () { }; + Displayable.prototype.shouldBePainted = function (viewWidth, viewHeight, considerClipPath, considerAncestors) { + var m = this.transform; + if (this.ignore + || this.invisible + || this.style.opacity === 0 + || (this.culling + && isDisplayableCulled(this, viewWidth, viewHeight)) + || (m && !m[0] && !m[3])) { + return false; + } + if (considerClipPath && this.__clipPaths) { + for (var i = 0; i < this.__clipPaths.length; ++i) { + if (this.__clipPaths[i].isZeroArea()) { + return false; + } + } + } + if (considerAncestors && this.parent) { + var parent_1 = this.parent; + while (parent_1) { + if (parent_1.ignore) { + return false; + } + parent_1 = parent_1.parent; + } + } + return true; + }; + Displayable.prototype.contain = function (x, y) { + return this.rectContain(x, y); + }; + Displayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + Displayable.prototype.rectContain = function (x, y) { + var coord = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + return rect.contain(coord[0], coord[1]); + }; + Displayable.prototype.getPaintRect = function () { + var rect = this._paintRect; + if (!this._paintRect || this.__dirty) { + var transform = this.transform; + var elRect = this.getBoundingRect(); + var style = this.style; + var shadowSize = style.shadowBlur || 0; + var shadowOffsetX = style.shadowOffsetX || 0; + var shadowOffsetY = style.shadowOffsetY || 0; + rect = this._paintRect || (this._paintRect = new BoundingRect(0, 0, 0, 0)); + if (transform) { + BoundingRect.applyTransform(rect, elRect, transform); + } + else { + rect.copy(elRect); + } + if (shadowSize || shadowOffsetX || shadowOffsetY) { + rect.width += shadowSize * 2 + Math.abs(shadowOffsetX); + rect.height += shadowSize * 2 + Math.abs(shadowOffsetY); + rect.x = Math.min(rect.x, rect.x + shadowOffsetX - shadowSize); + rect.y = Math.min(rect.y, rect.y + shadowOffsetY - shadowSize); + } + var tolerance = this.dirtyRectTolerance; + if (!rect.isZero()) { + rect.x = Math.floor(rect.x - tolerance); + rect.y = Math.floor(rect.y - tolerance); + rect.width = Math.ceil(rect.width + 1 + tolerance * 2); + rect.height = Math.ceil(rect.height + 1 + tolerance * 2); + } + } + return rect; + }; + Displayable.prototype.setPrevPaintRect = function (paintRect) { + if (paintRect) { + this._prevPaintRect = this._prevPaintRect || new BoundingRect(0, 0, 0, 0); + this._prevPaintRect.copy(paintRect); + } + else { + this._prevPaintRect = null; + } + }; + Displayable.prototype.getPrevPaintRect = function () { + return this._prevPaintRect; + }; + Displayable.prototype.animateStyle = function (loop) { + return this.animate('style', loop); + }; + Displayable.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } + else { + this.markRedraw(); + } + }; + Displayable.prototype.attrKV = function (key, value) { + if (key !== 'style') { + _super.prototype.attrKV.call(this, key, value); + } + else { + if (!this.style) { + this.useStyle(value); + } + else { + this.setStyle(value); + } + } + }; + Displayable.prototype.setStyle = function (keyOrObj, value) { + if (typeof keyOrObj === 'string') { + this.style[keyOrObj] = value; + } + else { + extend(this.style, keyOrObj); + } + this.dirtyStyle(); + return this; + }; + Displayable.prototype.dirtyStyle = function (notRedraw) { + if (!notRedraw) { + this.markRedraw(); + } + this.__dirty |= STYLE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + }; + Displayable.prototype.dirty = function () { + this.dirtyStyle(); + }; + Displayable.prototype.styleChanged = function () { + return !!(this.__dirty & STYLE_CHANGED_BIT); + }; + Displayable.prototype.styleUpdated = function () { + this.__dirty &= -3; + }; + Displayable.prototype.createStyle = function (obj) { + return createObject(DEFAULT_COMMON_STYLE, obj); + }; + Displayable.prototype.useStyle = function (obj) { + if (!obj[STYLE_MAGIC_KEY]) { + obj = this.createStyle(obj); + } + if (this.__inHover) { + this.__hoverStyle = obj; + } + else { + this.style = obj; + } + this.dirtyStyle(); + }; + Displayable.prototype.isStyleObject = function (obj) { + return obj[STYLE_MAGIC_KEY]; + }; + Displayable.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.style && !normalState.style) { + normalState.style = this._mergeStyle(this.createStyle(), this.style); + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS); + }; + Displayable.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetStyle; + if (state && state.style) { + if (transition) { + if (keepCurrentStates) { + targetStyle = state.style; + } + else { + targetStyle = this._mergeStyle(this.createStyle(), normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } + else { + targetStyle = this._mergeStyle(this.createStyle(), keepCurrentStates ? this.style : normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } + else if (needsRestoreToNormal) { + targetStyle = normalState.style; + } + if (targetStyle) { + if (transition) { + var sourceStyle = this.style; + this.style = this.createStyle(needsRestoreToNormal ? {} : sourceStyle); + if (needsRestoreToNormal) { + var changedKeys = keys(sourceStyle); + for (var i = 0; i < changedKeys.length; i++) { + var key = changedKeys[i]; + if (key in targetStyle) { + targetStyle[key] = targetStyle[key]; + this.style[key] = sourceStyle[key]; + } + } + } + var targetKeys = keys(targetStyle); + for (var i = 0; i < targetKeys.length; i++) { + var key = targetKeys[i]; + this.style[key] = this.style[key]; + } + this._transitionState(stateName, { + style: targetStyle + }, animationCfg, this.getAnimationStyleProps()); + } + else { + this.useStyle(targetStyle); + } + } + var statesKeys = this.__inHover ? PRIMARY_STATES_KEYS_IN_HOVER_LAYER : PRIMARY_STATES_KEYS; + for (var i = 0; i < statesKeys.length; i++) { + var key = statesKeys[i]; + if (state && state[key] != null) { + this[key] = state[key]; + } + else if (needsRestoreToNormal) { + if (normalState[key] != null) { + this[key] = normalState[key]; + } + } + } + }; + Displayable.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedStyle; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.style) { + mergedStyle = mergedStyle || {}; + this._mergeStyle(mergedStyle, state.style); + } + } + if (mergedStyle) { + mergedState.style = mergedStyle; + } + return mergedState; + }; + Displayable.prototype._mergeStyle = function (targetStyle, sourceStyle) { + extend(targetStyle, sourceStyle); + return targetStyle; + }; + Displayable.prototype.getAnimationStyleProps = function () { + return DEFAULT_COMMON_ANIMATION_PROPS; + }; + Displayable.initDefaultProps = (function () { + var dispProto = Displayable.prototype; + dispProto.type = 'displayable'; + dispProto.invisible = false; + dispProto.z = 0; + dispProto.z2 = 0; + dispProto.zlevel = 0; + dispProto.culling = false; + dispProto.cursor = 'pointer'; + dispProto.rectHover = false; + dispProto.incremental = false; + dispProto._rect = null; + dispProto.dirtyRectTolerance = 0; + dispProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT; + })(); + return Displayable; +}(Element)); +var tmpRect = new BoundingRect(0, 0, 0, 0); +var viewRect = new BoundingRect(0, 0, 0, 0); +function isDisplayableCulled(el, width, height) { + tmpRect.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect.applyTransform(el.transform); + } + viewRect.width = width; + viewRect.height = height; + return !tmpRect.intersect(viewRect); +} + +var mathMin$4 = Math.min; +var mathMax$4 = Math.max; +var mathSin$3 = Math.sin; +var mathCos$3 = Math.cos; +var PI2$6 = Math.PI * 2; +var start = create$1(); +var end = create$1(); +var extremity = create$1(); +function fromLine(x0, y0, x1, y1, min, max) { + min[0] = mathMin$4(x0, x1); + min[1] = mathMin$4(y0, y1); + max[0] = mathMax$4(x0, x1); + max[1] = mathMax$4(y0, y1); +} +var xDim = []; +var yDim = []; +function fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) { + var cubicExtrema$1 = cubicExtrema; + var cubicAt$1 = cubicAt; + var n = cubicExtrema$1(x0, x1, x2, x3, xDim); + min[0] = Infinity; + min[1] = Infinity; + max[0] = -Infinity; + max[1] = -Infinity; + for (var i = 0; i < n; i++) { + var x = cubicAt$1(x0, x1, x2, x3, xDim[i]); + min[0] = mathMin$4(x, min[0]); + max[0] = mathMax$4(x, max[0]); + } + n = cubicExtrema$1(y0, y1, y2, y3, yDim); + for (var i = 0; i < n; i++) { + var y = cubicAt$1(y0, y1, y2, y3, yDim[i]); + min[1] = mathMin$4(y, min[1]); + max[1] = mathMax$4(y, max[1]); + } + min[0] = mathMin$4(x0, min[0]); + max[0] = mathMax$4(x0, max[0]); + min[0] = mathMin$4(x3, min[0]); + max[0] = mathMax$4(x3, max[0]); + min[1] = mathMin$4(y0, min[1]); + max[1] = mathMax$4(y0, max[1]); + min[1] = mathMin$4(y3, min[1]); + max[1] = mathMax$4(y3, max[1]); +} +function fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) { + var quadraticExtremum$1 = quadraticExtremum; + var quadraticAt$1 = quadraticAt; + var tx = mathMax$4(mathMin$4(quadraticExtremum$1(x0, x1, x2), 1), 0); + var ty = mathMax$4(mathMin$4(quadraticExtremum$1(y0, y1, y2), 1), 0); + var x = quadraticAt$1(x0, x1, x2, tx); + var y = quadraticAt$1(y0, y1, y2, ty); + min[0] = mathMin$4(x0, x2, x); + min[1] = mathMin$4(y0, y2, y); + max[0] = mathMax$4(x0, x2, x); + max[1] = mathMax$4(y0, y2, y); +} +function fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min, max) { + var vec2Min = min$1; + var vec2Max = max$1; + var diff = Math.abs(startAngle - endAngle); + if (diff % PI2$6 < 1e-4 && diff > 1e-4) { + min[0] = x - rx; + min[1] = y - ry; + max[0] = x + rx; + max[1] = y + ry; + return; + } + start[0] = mathCos$3(startAngle) * rx + x; + start[1] = mathSin$3(startAngle) * ry + y; + end[0] = mathCos$3(endAngle) * rx + x; + end[1] = mathSin$3(endAngle) * ry + y; + vec2Min(min, start, end); + vec2Max(max, start, end); + startAngle = startAngle % (PI2$6); + if (startAngle < 0) { + startAngle = startAngle + PI2$6; + } + endAngle = endAngle % (PI2$6); + if (endAngle < 0) { + endAngle = endAngle + PI2$6; + } + if (startAngle > endAngle && !anticlockwise) { + endAngle += PI2$6; + } + else if (startAngle < endAngle && anticlockwise) { + startAngle += PI2$6; + } + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = mathCos$3(angle) * rx + x; + extremity[1] = mathSin$3(angle) * ry + y; + vec2Min(min, extremity, min); + vec2Max(max, extremity, max); + } + } +} + +var CMD$2 = { + M: 1, + L: 2, + C: 3, + Q: 4, + A: 5, + Z: 6, + R: 7 +}; +var tmpOutX = []; +var tmpOutY = []; +var min = []; +var max = []; +var min2 = []; +var max2 = []; +var mathMin$3 = Math.min; +var mathMax$3 = Math.max; +var mathCos$2 = Math.cos; +var mathSin$2 = Math.sin; +var mathAbs$1 = Math.abs; +var PI$4 = Math.PI; +var PI2$5 = PI$4 * 2; +var hasTypedArray = typeof Float32Array !== 'undefined'; +var tmpAngles = []; +function modPI2(radian) { + var n = Math.round(radian / PI$4 * 1e8) / 1e8; + return (n % 2) * PI$4; +} +function normalizeArcAngles(angles, anticlockwise) { + var newStartAngle = modPI2(angles[0]); + if (newStartAngle < 0) { + newStartAngle += PI2$5; + } + var delta = newStartAngle - angles[0]; + var newEndAngle = angles[1]; + newEndAngle += delta; + if (!anticlockwise && newEndAngle - newStartAngle >= PI2$5) { + newEndAngle = newStartAngle + PI2$5; + } + else if (anticlockwise && newStartAngle - newEndAngle >= PI2$5) { + newEndAngle = newStartAngle - PI2$5; + } + else if (!anticlockwise && newStartAngle > newEndAngle) { + newEndAngle = newStartAngle + (PI2$5 - modPI2(newStartAngle - newEndAngle)); + } + else if (anticlockwise && newStartAngle < newEndAngle) { + newEndAngle = newStartAngle - (PI2$5 - modPI2(newEndAngle - newStartAngle)); + } + angles[0] = newStartAngle; + angles[1] = newEndAngle; +} +var PathProxy = (function () { + function PathProxy(notSaveData) { + this.dpr = 1; + this._xi = 0; + this._yi = 0; + this._x0 = 0; + this._y0 = 0; + this._len = 0; + if (notSaveData) { + this._saveData = false; + } + if (this._saveData) { + this.data = []; + } + } + PathProxy.prototype.increaseVersion = function () { + this._version++; + }; + PathProxy.prototype.getVersion = function () { + return this._version; + }; + PathProxy.prototype.setScale = function (sx, sy, segmentIgnoreThreshold) { + segmentIgnoreThreshold = segmentIgnoreThreshold || 0; + if (segmentIgnoreThreshold > 0) { + this._ux = mathAbs$1(segmentIgnoreThreshold / devicePixelRatio / sx) || 0; + this._uy = mathAbs$1(segmentIgnoreThreshold / devicePixelRatio / sy) || 0; + } + }; + PathProxy.prototype.setDPR = function (dpr) { + this.dpr = dpr; + }; + PathProxy.prototype.setContext = function (ctx) { + this._ctx = ctx; + }; + PathProxy.prototype.getContext = function () { + return this._ctx; + }; + PathProxy.prototype.beginPath = function () { + this._ctx && this._ctx.beginPath(); + this.reset(); + return this; + }; + PathProxy.prototype.reset = function () { + if (this._saveData) { + this._len = 0; + } + if (this._pathSegLen) { + this._pathSegLen = null; + this._pathLen = 0; + } + this._version++; + }; + PathProxy.prototype.moveTo = function (x, y) { + this._drawPendingPt(); + this.addData(CMD$2.M, x, y); + this._ctx && this._ctx.moveTo(x, y); + this._x0 = x; + this._y0 = y; + this._xi = x; + this._yi = y; + return this; + }; + PathProxy.prototype.lineTo = function (x, y) { + var dx = mathAbs$1(x - this._xi); + var dy = mathAbs$1(y - this._yi); + var exceedUnit = dx > this._ux || dy > this._uy; + this.addData(CMD$2.L, x, y); + if (this._ctx && exceedUnit) { + this._ctx.lineTo(x, y); + } + if (exceedUnit) { + this._xi = x; + this._yi = y; + this._pendingPtDist = 0; + } + else { + var d2 = dx * dx + dy * dy; + if (d2 > this._pendingPtDist) { + this._pendingPtX = x; + this._pendingPtY = y; + this._pendingPtDist = d2; + } + } + return this; + }; + PathProxy.prototype.bezierCurveTo = function (x1, y1, x2, y2, x3, y3) { + this._drawPendingPt(); + this.addData(CMD$2.C, x1, y1, x2, y2, x3, y3); + if (this._ctx) { + this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + this._xi = x3; + this._yi = y3; + return this; + }; + PathProxy.prototype.quadraticCurveTo = function (x1, y1, x2, y2) { + this._drawPendingPt(); + this.addData(CMD$2.Q, x1, y1, x2, y2); + if (this._ctx) { + this._ctx.quadraticCurveTo(x1, y1, x2, y2); + } + this._xi = x2; + this._yi = y2; + return this; + }; + PathProxy.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this._drawPendingPt(); + tmpAngles[0] = startAngle; + tmpAngles[1] = endAngle; + normalizeArcAngles(tmpAngles, anticlockwise); + startAngle = tmpAngles[0]; + endAngle = tmpAngles[1]; + var delta = endAngle - startAngle; + this.addData(CMD$2.A, cx, cy, r, r, startAngle, delta, 0, anticlockwise ? 0 : 1); + this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + this._xi = mathCos$2(endAngle) * r + cx; + this._yi = mathSin$2(endAngle) * r + cy; + return this; + }; + PathProxy.prototype.arcTo = function (x1, y1, x2, y2, radius) { + this._drawPendingPt(); + if (this._ctx) { + this._ctx.arcTo(x1, y1, x2, y2, radius); + } + return this; + }; + PathProxy.prototype.rect = function (x, y, w, h) { + this._drawPendingPt(); + this._ctx && this._ctx.rect(x, y, w, h); + this.addData(CMD$2.R, x, y, w, h); + return this; + }; + PathProxy.prototype.closePath = function () { + this._drawPendingPt(); + this.addData(CMD$2.Z); + var ctx = this._ctx; + var x0 = this._x0; + var y0 = this._y0; + if (ctx) { + ctx.closePath(); + } + this._xi = x0; + this._yi = y0; + return this; + }; + PathProxy.prototype.fill = function (ctx) { + ctx && ctx.fill(); + this.toStatic(); + }; + PathProxy.prototype.stroke = function (ctx) { + ctx && ctx.stroke(); + this.toStatic(); + }; + PathProxy.prototype.len = function () { + return this._len; + }; + PathProxy.prototype.setData = function (data) { + var len = data.length; + if (!(this.data && this.data.length === len) && hasTypedArray) { + this.data = new Float32Array(len); + } + for (var i = 0; i < len; i++) { + this.data[i] = data[i]; + } + this._len = len; + }; + PathProxy.prototype.appendPath = function (path) { + if (!(path instanceof Array)) { + path = [path]; + } + var len = path.length; + var appendSize = 0; + var offset = this._len; + for (var i = 0; i < len; i++) { + appendSize += path[i].len(); + } + if (hasTypedArray && (this.data instanceof Float32Array)) { + this.data = new Float32Array(offset + appendSize); + } + for (var i = 0; i < len; i++) { + var appendPathData = path[i].data; + for (var k = 0; k < appendPathData.length; k++) { + this.data[offset++] = appendPathData[k]; + } + } + this._len = offset; + }; + PathProxy.prototype.addData = function (cmd, a, b, c, d, e, f, g, h) { + if (!this._saveData) { + return; + } + var data = this.data; + if (this._len + arguments.length > data.length) { + this._expandData(); + data = this.data; + } + for (var i = 0; i < arguments.length; i++) { + data[this._len++] = arguments[i]; + } + }; + PathProxy.prototype._drawPendingPt = function () { + if (this._pendingPtDist > 0) { + this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY); + this._pendingPtDist = 0; + } + }; + PathProxy.prototype._expandData = function () { + if (!(this.data instanceof Array)) { + var newData = []; + for (var i = 0; i < this._len; i++) { + newData[i] = this.data[i]; + } + this.data = newData; + } + }; + PathProxy.prototype.toStatic = function () { + if (!this._saveData) { + return; + } + this._drawPendingPt(); + var data = this.data; + if (data instanceof Array) { + data.length = this._len; + if (hasTypedArray && this._len > 11) { + this.data = new Float32Array(data); + } + } + }; + PathProxy.prototype.getBoundingRect = function () { + min[0] = min[1] = min2[0] = min2[1] = Number.MAX_VALUE; + max[0] = max[1] = max2[0] = max2[1] = -Number.MAX_VALUE; + var data = this.data; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var i; + for (i = 0; i < this._len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD$2.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + min2[0] = x0; + min2[1] = y0; + max2[0] = x0; + max2[1] = y0; + break; + case CMD$2.L: + fromLine(xi, yi, data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD$2.C: + fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD$2.Q: + fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD$2.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + i += 1; + var anticlockwise = !data[i++]; + if (isFirst) { + x0 = mathCos$2(startAngle) * rx + cx; + y0 = mathSin$2(startAngle) * ry + cy; + } + fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2); + xi = mathCos$2(endAngle) * rx + cx; + yi = mathSin$2(endAngle) * ry + cy; + break; + case CMD$2.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + fromLine(x0, y0, x0 + width, y0 + height, min2, max2); + break; + case CMD$2.Z: + xi = x0; + yi = y0; + break; + } + min$1(min, min, min2); + max$1(max, max, max2); + } + if (i === 0) { + min[0] = min[1] = max[0] = max[1] = 0; + } + return new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + }; + PathProxy.prototype._calculateLength = function () { + var data = this.data; + var len = this._len; + var ux = this._ux; + var uy = this._uy; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + if (!this._pathSegLen) { + this._pathSegLen = []; + } + var pathSegLen = this._pathSegLen; + var pathTotalLen = 0; + var segCount = 0; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + var l = -1; + switch (cmd) { + case CMD$2.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + break; + case CMD$2.L: { + var x2 = data[i++]; + var y2 = data[i++]; + var dx = x2 - xi; + var dy = y2 - yi; + if (mathAbs$1(dx) > ux || mathAbs$1(dy) > uy || i === len - 1) { + l = Math.sqrt(dx * dx + dy * dy); + xi = x2; + yi = y2; + } + break; + } + case CMD$2.C: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + var x3 = data[i++]; + var y3 = data[i++]; + l = cubicLength(xi, yi, x1, y1, x2, y2, x3, y3, 10); + xi = x3; + yi = y3; + break; + } + case CMD$2.Q: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + l = quadraticLength(xi, yi, x1, y1, x2, y2, 10); + xi = x2; + yi = y2; + break; + } + case CMD$2.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var delta = data[i++]; + var endAngle = delta + startAngle; + i += 1; + if (isFirst) { + x0 = mathCos$2(startAngle) * rx + cx; + y0 = mathSin$2(startAngle) * ry + cy; + } + l = mathMax$3(rx, ry) * mathMin$3(PI2$5, Math.abs(delta)); + xi = mathCos$2(endAngle) * rx + cx; + yi = mathSin$2(endAngle) * ry + cy; + break; + case CMD$2.R: { + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + l = width * 2 + height * 2; + break; + } + case CMD$2.Z: { + var dx = x0 - xi; + var dy = y0 - yi; + l = Math.sqrt(dx * dx + dy * dy); + xi = x0; + yi = y0; + break; + } + } + if (l >= 0) { + pathSegLen[segCount++] = l; + pathTotalLen += l; + } + } + this._pathLen = pathTotalLen; + return pathTotalLen; + }; + PathProxy.prototype.rebuildPath = function (ctx, percent) { + var d = this.data; + var ux = this._ux; + var uy = this._uy; + var len = this._len; + var x0; + var y0; + var xi; + var yi; + var x; + var y; + var drawPart = percent < 1; + var pathSegLen; + var pathTotalLen; + var accumLength = 0; + var segCount = 0; + var displayedLength; + var pendingPtDist = 0; + var pendingPtX; + var pendingPtY; + if (drawPart) { + if (!this._pathSegLen) { + this._calculateLength(); + } + pathSegLen = this._pathSegLen; + pathTotalLen = this._pathLen; + displayedLength = percent * pathTotalLen; + if (!displayedLength) { + return; + } + } + lo: for (var i = 0; i < len;) { + var cmd = d[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = d[i]; + yi = d[i + 1]; + x0 = xi; + y0 = yi; + } + if (cmd !== CMD$2.L && pendingPtDist > 0) { + ctx.lineTo(pendingPtX, pendingPtY); + pendingPtDist = 0; + } + switch (cmd) { + case CMD$2.M: + x0 = xi = d[i++]; + y0 = yi = d[i++]; + ctx.moveTo(xi, yi); + break; + case CMD$2.L: { + x = d[i++]; + y = d[i++]; + var dx = mathAbs$1(x - xi); + var dy = mathAbs$1(y - yi); + if (dx > ux || dy > uy) { + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x * t, yi * (1 - t) + y * t); + break lo; + } + accumLength += l; + } + ctx.lineTo(x, y); + xi = x; + yi = y; + pendingPtDist = 0; + } + else { + var d2 = dx * dx + dy * dy; + if (d2 > pendingPtDist) { + pendingPtX = x; + pendingPtY = y; + pendingPtDist = d2; + } + } + break; + } + case CMD$2.C: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + var x3 = d[i++]; + var y3 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + cubicSubdivide(xi, x1, x2, x3, t, tmpOutX); + cubicSubdivide(yi, y1, y2, y3, t, tmpOutY); + ctx.bezierCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2], tmpOutX[3], tmpOutY[3]); + break lo; + } + accumLength += l; + } + ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + xi = x3; + yi = y3; + break; + } + case CMD$2.Q: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + quadraticSubdivide(xi, x1, x2, t, tmpOutX); + quadraticSubdivide(yi, y1, y2, t, tmpOutY); + ctx.quadraticCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2]); + break lo; + } + accumLength += l; + } + ctx.quadraticCurveTo(x1, y1, x2, y2); + xi = x2; + yi = y2; + break; + } + case CMD$2.A: + var cx = d[i++]; + var cy = d[i++]; + var rx = d[i++]; + var ry = d[i++]; + var startAngle = d[i++]; + var delta = d[i++]; + var psi = d[i++]; + var anticlockwise = !d[i++]; + var r = (rx > ry) ? rx : ry; + var isEllipse = mathAbs$1(rx - ry) > 1e-3; + var endAngle = startAngle + delta; + var breakBuild = false; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + endAngle = startAngle + delta * (displayedLength - accumLength) / l; + breakBuild = true; + } + accumLength += l; + } + if (isEllipse && ctx.ellipse) { + ctx.ellipse(cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise); + } + else { + ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + } + if (breakBuild) { + break lo; + } + if (isFirst) { + x0 = mathCos$2(startAngle) * rx + cx; + y0 = mathSin$2(startAngle) * ry + cy; + } + xi = mathCos$2(endAngle) * rx + cx; + yi = mathSin$2(endAngle) * ry + cy; + break; + case CMD$2.R: + x0 = xi = d[i]; + y0 = yi = d[i + 1]; + x = d[i++]; + y = d[i++]; + var width = d[i++]; + var height = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var d_1 = displayedLength - accumLength; + ctx.moveTo(x, y); + ctx.lineTo(x + mathMin$3(d_1, width), y); + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x + width, y + mathMin$3(d_1, height)); + } + d_1 -= height; + if (d_1 > 0) { + ctx.lineTo(x + mathMax$3(width - d_1, 0), y + height); + } + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x, y + mathMax$3(height - d_1, 0)); + } + break lo; + } + accumLength += l; + } + ctx.rect(x, y, width, height); + break; + case CMD$2.Z: + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x0 * t, yi * (1 - t) + y0 * t); + break lo; + } + accumLength += l; + } + ctx.closePath(); + xi = x0; + yi = y0; + } + } + }; + PathProxy.prototype.clone = function () { + var newProxy = new PathProxy(); + var data = this.data; + newProxy.data = data.slice ? data.slice() + : Array.prototype.slice.call(data); + newProxy._len = this._len; + return newProxy; + }; + PathProxy.CMD = CMD$2; + PathProxy.initDefaultProps = (function () { + var proto = PathProxy.prototype; + proto._saveData = true; + proto._ux = 0; + proto._uy = 0; + proto._pendingPtDist = 0; + proto._version = 0; + })(); + return PathProxy; +}()); + +function containStroke$4(x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + var _a = 0; + var _b = x0; + if ((y > y0 + _l && y > y1 + _l) + || (y < y0 - _l && y < y1 - _l) + || (x > x0 + _l && x > x1 + _l) + || (x < x0 - _l && x < x1 - _l)) { + return false; + } + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1); + } + else { + return Math.abs(x - x0) <= _l / 2; + } + var tmp = _a * x - y + _b; + var _s = tmp * tmp / (_a * _a + 1); + return _s <= _l / 2 * _l / 2; +} + +function containStroke$3(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + if ((y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l)) { + return false; + } + var d = cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y); + return d <= _l / 2; +} + +function containStroke$2(x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + if ((y > y0 + _l && y > y1 + _l && y > y2 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l)) { + return false; + } + var d = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y); + return d <= _l / 2; +} + +var PI2$4 = Math.PI * 2; +function normalizeRadian(angle) { + angle %= PI2$4; + if (angle < 0) { + angle += PI2$4; + } + return angle; +} + +var PI2$3 = Math.PI * 2; +function containStroke$1(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + if ((d - _l > r) || (d + _l < r)) { + return false; + } + if (Math.abs(startAngle - endAngle) % PI2$3 < 1e-4) { + return true; + } + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } + else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2$3; + } + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2$3; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2$3 >= startAngle && angle + PI2$3 <= endAngle); +} + +function windingLine(x0, y0, x1, y1, x, y) { + if ((y > y0 && y > y1) || (y < y0 && y < y1)) { + return 0; + } + if (y1 === y0) { + return 0; + } + var t = (y - y0) / (y1 - y0); + var dir = y1 < y0 ? 1 : -1; + if (t === 1 || t === 0) { + dir = y1 < y0 ? 0.5 : -0.5; + } + var x_ = t * (x1 - x0) + x0; + return x_ === x ? Infinity : x_ > x ? dir : 0; +} + +var CMD$1 = PathProxy.CMD; +var PI2$2 = Math.PI * 2; +var EPSILON = 1e-4; +function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON; +} +var roots = [-1, -1, -1]; +var extrema = [-1, -1]; +function swapExtrema() { + var tmp = extrema[0]; + extrema[0] = extrema[1]; + extrema[1] = tmp; +} +function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + if ((y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3)) { + return 0; + } + var nRoots = cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var w = 0; + var nExtrema = -1; + var y0_ = void 0; + var y1_ = void 0; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var unit = (t === 0 || t === 1) ? 0.5 : 1; + var x_ = cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { + continue; + } + if (nExtrema < 0) { + nExtrema = cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + swapExtrema(); + } + y0_ = cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema === 2) { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else if (t < extrema[1]) { + w += y1_ < y0_ ? unit : -unit; + } + else { + w += y3 < y1_ ? unit : -unit; + } + } + else { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else { + w += y3 < y0_ ? unit : -unit; + } + } + } + return w; + } +} +function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + if ((y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2)) { + return 0; + } + var nRoots = quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var t = quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = quadraticAt(y0, y1, y2, t); + for (var i = 0; i < nRoots; i++) { + var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[i]); + if (x_ < x) { + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? unit : -unit; + } + else { + w += y2 < y_ ? unit : -unit; + } + } + return w; + } + else { + var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[0]); + if (x_ < x) { + return 0; + } + return y2 < y0 ? unit : -unit; + } + } +} +function windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) { + y -= cy; + if (y > r || y < -r) { + return 0; + } + var tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + var dTheta = Math.abs(startAngle - endAngle); + if (dTheta < 1e-4) { + return 0; + } + if (dTheta >= PI2$2 - 1e-4) { + startAngle = 0; + endAngle = PI2$2; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } + else { + return 0; + } + } + if (startAngle > endAngle) { + var tmp_1 = startAngle; + startAngle = endAngle; + endAngle = tmp_1; + } + if (startAngle < 0) { + startAngle += PI2$2; + endAngle += PI2$2; + } + var w = 0; + for (var i = 0; i < 2; i++) { + var x_ = roots[i]; + if (x_ + cx > x) { + var angle = Math.atan2(y, x_); + var dir = anticlockwise ? 1 : -1; + if (angle < 0) { + angle = PI2$2 + angle; + } + if ((angle >= startAngle && angle <= endAngle) + || (angle + PI2$2 >= startAngle && angle + PI2$2 <= endAngle)) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; +} +function containPath(path, lineWidth, isStroke, x, y) { + var data = path.data; + var len = path.len(); + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var x1; + var y1; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (cmd === CMD$1.M && i > 1) { + if (!isStroke) { + w += windingLine(xi, yi, x0, y0, x, y); + } + } + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD$1.M: + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + case CMD$1.L: + if (isStroke) { + if (containStroke$4(xi, yi, data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.C: + if (isStroke) { + if (containStroke$3(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.Q: + if (isStroke) { + if (containStroke$2(xi, yi, data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + w += windingQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + i += 1; + var anticlockwise = !!(1 - data[i++]); + x1 = Math.cos(theta) * rx + cx; + y1 = Math.sin(theta) * ry + cy; + if (!isFirst) { + w += windingLine(xi, yi, x1, y1, x, y); + } + else { + x0 = x1; + y0 = y1; + } + var _x = (x - cx) * ry / rx + cx; + if (isStroke) { + if (containStroke$1(cx, cy, ry, theta, theta + dTheta, anticlockwise, lineWidth, _x, y)) { + return true; + } + } + else { + w += windingArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y); + } + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + case CMD$1.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + x1 = x0 + width; + y1 = y0 + height; + if (isStroke) { + if (containStroke$4(x0, y0, x1, y0, lineWidth, x, y) + || containStroke$4(x1, y0, x1, y1, lineWidth, x, y) + || containStroke$4(x1, y1, x0, y1, lineWidth, x, y) + || containStroke$4(x0, y1, x0, y0, lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(x1, y0, x1, y1, x, y); + w += windingLine(x0, y1, x0, y0, x, y); + } + break; + case CMD$1.Z: + if (isStroke) { + if (containStroke$4(xi, yi, x0, y0, lineWidth, x, y)) { + return true; + } + } + else { + w += windingLine(xi, yi, x0, y0, x, y); + } + xi = x0; + yi = y0; + break; + } + } + if (!isStroke && !isAroundEqual(yi, y0)) { + w += windingLine(xi, yi, x0, y0, x, y) || 0; + } + return w !== 0; +} +function contain$1(pathProxy, x, y) { + return containPath(pathProxy, 0, false, x, y); +} +function containStroke(pathProxy, lineWidth, x, y) { + return containPath(pathProxy, lineWidth, true, x, y); +} + +var DEFAULT_PATH_STYLE = defaults({ + fill: '#000', + stroke: null, + strokePercent: 1, + fillOpacity: 1, + strokeOpacity: 1, + lineDashOffset: 0, + lineWidth: 1, + lineCap: 'butt', + miterLimit: 10, + strokeNoScale: false, + strokeFirst: false +}, DEFAULT_COMMON_STYLE); +var DEFAULT_PATH_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + strokePercent: true, + fillOpacity: true, + strokeOpacity: true, + lineDashOffset: true, + lineWidth: true, + miterLimit: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) +}; +var pathCopyParams = TRANSFORMABLE_PROPS.concat(['invisible', + 'culling', 'z', 'z2', 'zlevel', 'parent' +]); +var Path = (function (_super) { + __extends(Path, _super); + function Path(opts) { + return _super.call(this, opts) || this; + } + Path.prototype.update = function () { + var _this = this; + _super.prototype.update.call(this); + var style = this.style; + if (style.decal) { + var decalEl = this._decalEl = this._decalEl || new Path(); + if (decalEl.buildPath === Path.prototype.buildPath) { + decalEl.buildPath = function (ctx) { + _this.buildPath(ctx, _this.shape); + }; + } + decalEl.silent = true; + var decalElStyle = decalEl.style; + for (var key in style) { + if (decalElStyle[key] !== style[key]) { + decalElStyle[key] = style[key]; + } + } + decalElStyle.fill = style.fill ? style.decal : null; + decalElStyle.decal = null; + decalElStyle.shadowColor = null; + style.strokeFirst && (decalElStyle.stroke = null); + for (var i = 0; i < pathCopyParams.length; ++i) { + decalEl[pathCopyParams[i]] = this[pathCopyParams[i]]; + } + decalEl.__dirty |= REDRAW_BIT; + } + else if (this._decalEl) { + this._decalEl = null; + } + }; + Path.prototype.getDecalElement = function () { + return this._decalEl; + }; + Path.prototype._init = function (props) { + var keysArr = keys(props); + this.shape = this.getDefaultShape(); + var defaultStyle = this.getDefaultStyle(); + if (defaultStyle) { + this.useStyle(defaultStyle); + } + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + var value = props[key]; + if (key === 'style') { + if (!this.style) { + this.useStyle(value); + } + else { + extend(this.style, value); + } + } + else if (key === 'shape') { + extend(this.shape, value); + } + else { + _super.prototype.attrKV.call(this, key, value); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Path.prototype.getDefaultStyle = function () { + return null; + }; + Path.prototype.getDefaultShape = function () { + return {}; + }; + Path.prototype.canBeInsideText = function () { + return this.hasFill(); + }; + Path.prototype.getInsideTextFill = function () { + var pathFill = this.style.fill; + if (pathFill !== 'none') { + if (isString(pathFill)) { + var fillLum = lum(pathFill, 0); + if (fillLum > 0.5) { + return DARK_LABEL_COLOR; + } + else if (fillLum > 0.2) { + return LIGHTER_LABEL_COLOR; + } + return LIGHT_LABEL_COLOR; + } + else if (pathFill) { + return LIGHT_LABEL_COLOR; + } + } + return DARK_LABEL_COLOR; + }; + Path.prototype.getInsideTextStroke = function (textFill) { + var pathFill = this.style.fill; + if (isString(pathFill)) { + var zr = this.__zr; + var isDarkMode = !!(zr && zr.isDarkMode()); + var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD; + if (isDarkMode === isDarkLabel) { + return pathFill; + } + } + }; + Path.prototype.buildPath = function (ctx, shapeCfg, inBatch) { }; + Path.prototype.pathUpdated = function () { + this.__dirty &= -5; + }; + Path.prototype.getUpdatedPathProxy = function (inBatch) { + !this.path && this.createPathProxy(); + this.path.beginPath(); + this.buildPath(this.path, this.shape, inBatch); + return this.path; + }; + Path.prototype.createPathProxy = function () { + this.path = new PathProxy(false); + }; + Path.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); + }; + Path.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + Path.prototype.getBoundingRect = function () { + var rect = this._rect; + var style = this.style; + var needsUpdateRect = !rect; + if (needsUpdateRect) { + var firstInvoke = false; + if (!this.path) { + firstInvoke = true; + this.createPathProxy(); + } + var path = this.path; + if (firstInvoke || (this.__dirty & SHAPE_CHANGED_BIT)) { + path.beginPath(); + this.buildPath(path, this.shape, false); + this.pathUpdated(); + } + rect = path.getBoundingRect(); + } + this._rect = rect; + if (this.hasStroke() && this.path && this.path.len() > 0) { + var rectStroke = this._rectStroke || (this._rectStroke = rect.clone()); + if (this.__dirty || needsUpdateRect) { + rectStroke.copy(rect); + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + var w = style.lineWidth; + if (!this.hasFill()) { + var strokeContainThreshold = this.strokeContainThreshold; + w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold); + } + if (lineScale > 1e-10) { + rectStroke.width += w / lineScale; + rectStroke.height += w / lineScale; + rectStroke.x -= w / lineScale / 2; + rectStroke.y -= w / lineScale / 2; + } + } + return rectStroke; + } + return rect; + }; + Path.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + var style = this.style; + x = localPos[0]; + y = localPos[1]; + if (rect.contain(x, y)) { + var pathProxy = this.path; + if (this.hasStroke()) { + var lineWidth = style.lineWidth; + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + if (lineScale > 1e-10) { + if (!this.hasFill()) { + lineWidth = Math.max(lineWidth, this.strokeContainThreshold); + } + if (containStroke(pathProxy, lineWidth / lineScale, x, y)) { + return true; + } + } + } + if (this.hasFill()) { + return contain$1(pathProxy, x, y); + } + } + return false; + }; + Path.prototype.dirtyShape = function () { + this.__dirty |= SHAPE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + if (this._decalEl) { + this._decalEl.dirtyShape(); + } + this.markRedraw(); + }; + Path.prototype.dirty = function () { + this.dirtyStyle(); + this.dirtyShape(); + }; + Path.prototype.animateShape = function (loop) { + return this.animate('shape', loop); + }; + Path.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } + else if (targetKey === 'shape') { + this.dirtyShape(); + } + else { + this.markRedraw(); + } + }; + Path.prototype.attrKV = function (key, value) { + if (key === 'shape') { + this.setShape(value); + } + else { + _super.prototype.attrKV.call(this, key, value); + } + }; + Path.prototype.setShape = function (keyOrObj, value) { + var shape = this.shape; + if (!shape) { + shape = this.shape = {}; + } + if (typeof keyOrObj === 'string') { + shape[keyOrObj] = value; + } + else { + extend(shape, keyOrObj); + } + this.dirtyShape(); + return this; + }; + Path.prototype.shapeChanged = function () { + return !!(this.__dirty & SHAPE_CHANGED_BIT); + }; + Path.prototype.createStyle = function (obj) { + return createObject(DEFAULT_PATH_STYLE, obj); + }; + Path.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.shape && !normalState.shape) { + normalState.shape = extend({}, this.shape); + } + }; + Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetShape; + if (state && state.shape) { + if (transition) { + if (keepCurrentStates) { + targetShape = state.shape; + } + else { + targetShape = extend({}, normalState.shape); + extend(targetShape, state.shape); + } + } + else { + targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape); + extend(targetShape, state.shape); + } + } + else if (needsRestoreToNormal) { + targetShape = normalState.shape; + } + if (targetShape) { + if (transition) { + this.shape = extend({}, this.shape); + var targetShapePrimaryProps = {}; + var shapeKeys = keys(targetShape); + for (var i = 0; i < shapeKeys.length; i++) { + var key = shapeKeys[i]; + if (typeof targetShape[key] === 'object') { + this.shape[key] = targetShape[key]; + } + else { + targetShapePrimaryProps[key] = targetShape[key]; + } + } + this._transitionState(stateName, { + shape: targetShapePrimaryProps + }, animationCfg); + } + else { + this.shape = targetShape; + this.dirtyShape(); + } + } + }; + Path.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedShape; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.shape) { + mergedShape = mergedShape || {}; + this._mergeStyle(mergedShape, state.shape); + } + } + if (mergedShape) { + mergedState.shape = mergedShape; + } + return mergedState; + }; + Path.prototype.getAnimationStyleProps = function () { + return DEFAULT_PATH_ANIMATION_PROPS; + }; + Path.prototype.isZeroArea = function () { + return false; + }; + Path.extend = function (defaultProps) { + var Sub = (function (_super) { + __extends(Sub, _super); + function Sub(opts) { + var _this = _super.call(this, opts) || this; + defaultProps.init && defaultProps.init.call(_this, opts); + return _this; + } + Sub.prototype.getDefaultStyle = function () { + return clone$2(defaultProps.style); + }; + Sub.prototype.getDefaultShape = function () { + return clone$2(defaultProps.shape); + }; + return Sub; + }(Path)); + for (var key in defaultProps) { + if (typeof defaultProps[key] === 'function') { + Sub.prototype[key] = defaultProps[key]; + } + } + return Sub; + }; + Path.initDefaultProps = (function () { + var pathProto = Path.prototype; + pathProto.type = 'path'; + pathProto.strokeContainThreshold = 5; + pathProto.segmentIgnoreThreshold = 0; + pathProto.subPixelOptimize = false; + pathProto.autoBatch = false; + pathProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT | SHAPE_CHANGED_BIT; + })(); + return Path; +}(Displayable)); + +var DEFAULT_TSPAN_STYLE = defaults({ + strokeFirst: true, + font: DEFAULT_FONT, + x: 0, + y: 0, + textAlign: 'left', + textBaseline: 'top', + miterLimit: 2 +}, DEFAULT_PATH_STYLE); +var TSpan = (function (_super) { + __extends(TSpan, _super); + function TSpan() { + return _super !== null && _super.apply(this, arguments) || this; + } + TSpan.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return stroke != null && stroke !== 'none' && style.lineWidth > 0; + }; + TSpan.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + TSpan.prototype.createStyle = function (obj) { + return createObject(DEFAULT_TSPAN_STYLE, obj); + }; + TSpan.prototype.setBoundingRect = function (rect) { + this._rect = rect; + }; + TSpan.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + var text = style.text; + text != null ? (text += '') : (text = ''); + var rect = getBoundingRect(text, style.font, style.textAlign, style.textBaseline); + rect.x += style.x || 0; + rect.y += style.y || 0; + if (this.hasStroke()) { + var w = style.lineWidth; + rect.x -= w / 2; + rect.y -= w / 2; + rect.width += w; + rect.height += w; + } + this._rect = rect; + } + return this._rect; + }; + TSpan.initDefaultProps = (function () { + var tspanProto = TSpan.prototype; + tspanProto.dirtyRectTolerance = 10; + })(); + return TSpan; +}(Displayable)); +TSpan.prototype.type = 'tspan'; + +var DEFAULT_IMAGE_STYLE = defaults({ + x: 0, + y: 0 +}, DEFAULT_COMMON_STYLE); +var DEFAULT_IMAGE_ANIMATION_PROPS = { + style: defaults({ + x: true, + y: true, + width: true, + height: true, + sx: true, + sy: true, + sWidth: true, + sHeight: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) +}; +function isImageLike(source) { + return !!(source + && typeof source !== 'string' + && source.width && source.height); +} +var ZRImage = (function (_super) { + __extends(ZRImage, _super); + function ZRImage() { + return _super !== null && _super.apply(this, arguments) || this; + } + ZRImage.prototype.createStyle = function (obj) { + return createObject(DEFAULT_IMAGE_STYLE, obj); + }; + ZRImage.prototype._getSize = function (dim) { + var style = this.style; + var size = style[dim]; + if (size != null) { + return size; + } + var imageSource = isImageLike(style.image) + ? style.image : this.__image; + if (!imageSource) { + return 0; + } + var otherDim = dim === 'width' ? 'height' : 'width'; + var otherDimSize = style[otherDim]; + if (otherDimSize == null) { + return imageSource[dim]; + } + else { + return imageSource[dim] / imageSource[otherDim] * otherDimSize; + } + }; + ZRImage.prototype.getWidth = function () { + return this._getSize('width'); + }; + ZRImage.prototype.getHeight = function () { + return this._getSize('height'); + }; + ZRImage.prototype.getAnimationStyleProps = function () { + return DEFAULT_IMAGE_ANIMATION_PROPS; + }; + ZRImage.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + this._rect = new BoundingRect(style.x || 0, style.y || 0, this.getWidth(), this.getHeight()); + } + return this._rect; + }; + return ZRImage; +}(Displayable)); +ZRImage.prototype.type = 'image'; + +function buildPath$2(ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + var r = shape.r; + var r1; + var r2; + var r3; + var r4; + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } + else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } + else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } + else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } + else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } + else { + r1 = r2 = r3 = r4 = 0; + } + var total; + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5); +} + +var round = Math.round; +function subPixelOptimizeLine$1(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var x1 = inputShape.x1; + var x2 = inputShape.x2; + var y1 = inputShape.y1; + var y2 = inputShape.y2; + outputShape.x1 = x1; + outputShape.x2 = x2; + outputShape.y1 = y1; + outputShape.y2 = y2; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + if (round(x1 * 2) === round(x2 * 2)) { + outputShape.x1 = outputShape.x2 = subPixelOptimize$1(x1, lineWidth, true); + } + if (round(y1 * 2) === round(y2 * 2)) { + outputShape.y1 = outputShape.y2 = subPixelOptimize$1(y1, lineWidth, true); + } + return outputShape; +} +function subPixelOptimizeRect$1(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var originX = inputShape.x; + var originY = inputShape.y; + var originWidth = inputShape.width; + var originHeight = inputShape.height; + outputShape.x = originX; + outputShape.y = originY; + outputShape.width = originWidth; + outputShape.height = originHeight; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + outputShape.x = subPixelOptimize$1(originX, lineWidth, true); + outputShape.y = subPixelOptimize$1(originY, lineWidth, true); + outputShape.width = Math.max(subPixelOptimize$1(originX + originWidth, lineWidth, false) - outputShape.x, originWidth === 0 ? 0 : 1); + outputShape.height = Math.max(subPixelOptimize$1(originY + originHeight, lineWidth, false) - outputShape.y, originHeight === 0 ? 0 : 1); + return outputShape; +} +function subPixelOptimize$1(position, lineWidth, positiveOrNegative) { + if (!lineWidth) { + return position; + } + var doubledPosition = round(position * 2); + return (doubledPosition + round(lineWidth)) % 2 === 0 + ? doubledPosition / 2 + : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; +} + +var RectShape = (function () { + function RectShape() { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + } + return RectShape; +}()); +var subPixelOptimizeOutputShape$1 = {}; +var Rect = (function (_super) { + __extends(Rect, _super); + function Rect(opts) { + return _super.call(this, opts) || this; + } + Rect.prototype.getDefaultShape = function () { + return new RectShape(); + }; + Rect.prototype.buildPath = function (ctx, shape) { + var x; + var y; + var width; + var height; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeRect$1(subPixelOptimizeOutputShape$1, shape, this.style); + x = optimizedShape.x; + y = optimizedShape.y; + width = optimizedShape.width; + height = optimizedShape.height; + optimizedShape.r = shape.r; + shape = optimizedShape; + } + else { + x = shape.x; + y = shape.y; + width = shape.width; + height = shape.height; + } + if (!shape.r) { + ctx.rect(x, y, width, height); + } + else { + buildPath$2(ctx, shape); + } + }; + Rect.prototype.isZeroArea = function () { + return !this.shape.width || !this.shape.height; + }; + return Rect; +}(Path)); +Rect.prototype.type = 'rect'; + +var DEFAULT_RICH_TEXT_COLOR = { + fill: "#000" +}; +var DEFAULT_STROKE_LINE_WIDTH = 2; +var DEFAULT_TEXT_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + fillOpacity: true, + strokeOpacity: true, + lineWidth: true, + fontSize: true, + lineHeight: true, + width: true, + height: true, + textShadowColor: true, + textShadowBlur: true, + textShadowOffsetX: true, + textShadowOffsetY: true, + backgroundColor: true, + padding: true, + borderColor: true, + borderWidth: true, + borderRadius: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) +}; +var ZRText = function(_super) { + __extends(ZRText2, _super); + function ZRText2(opts) { + var _this = _super.call(this) || this; + _this.type = "text"; + _this._children = []; + _this._defaultStyle = DEFAULT_RICH_TEXT_COLOR; + _this.attr(opts); + return _this; + } + ZRText2.prototype.childrenRef = function() { + return this._children; + }; + ZRText2.prototype.update = function() { + _super.prototype.update.call(this); + if (this.styleChanged()) { + this._updateSubTexts(); + } + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.zlevel = this.zlevel; + child.z = this.z; + child.z2 = this.z2; + child.culling = this.culling; + child.cursor = this.cursor; + child.invisible = this.invisible; + } + }; + ZRText2.prototype.updateTransform = function() { + var innerTransformable = this.innerTransformable; + if (innerTransformable) { + innerTransformable.updateTransform(); + if (innerTransformable.transform) { + this.transform = innerTransformable.transform; + } + } else { + _super.prototype.updateTransform.call(this); + } + }; + ZRText2.prototype.getLocalTransform = function(m) { + var innerTransformable = this.innerTransformable; + return innerTransformable ? innerTransformable.getLocalTransform(m) : _super.prototype.getLocalTransform.call(this, m); + }; + ZRText2.prototype.getComputedTransform = function() { + if (this.__hostTarget) { + this.__hostTarget.getComputedTransform(); + this.__hostTarget.updateInnerText(true); + } + return _super.prototype.getComputedTransform.call(this); + }; + ZRText2.prototype._updateSubTexts = function() { + this._childCursor = 0; + normalizeTextStyle(this.style); + this.style.rich ? this._updateRichTexts() : this._updatePlainTexts(); + this._children.length = this._childCursor; + this.styleUpdated(); + }; + ZRText2.prototype.addSelfToZr = function(zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = zr; + } + }; + ZRText2.prototype.removeSelfFromZr = function(zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = null; + } + }; + ZRText2.prototype.getBoundingRect = function() { + if (this.styleChanged()) { + this._updateSubTexts(); + } + if (!this._rect) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = this._children; + var tmpMat = []; + var rect = null; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + tmpRect.copy(childRect); + tmpRect.applyTransform(transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + this._rect = rect || tmpRect; + } + return this._rect; + }; + ZRText2.prototype.setDefaultTextStyle = function(defaultTextStyle) { + this._defaultStyle = defaultTextStyle || DEFAULT_RICH_TEXT_COLOR; + }; + ZRText2.prototype.setTextContent = function(textContent) { + }; + ZRText2.prototype._mergeStyle = function(targetStyle, sourceStyle) { + if (!sourceStyle) { + return targetStyle; + } + var sourceRich = sourceStyle.rich; + var targetRich = targetStyle.rich || sourceRich && {}; + extend(targetStyle, sourceStyle); + if (sourceRich && targetRich) { + this._mergeRich(targetRich, sourceRich); + targetStyle.rich = targetRich; + } else if (targetRich) { + targetStyle.rich = targetRich; + } + return targetStyle; + }; + ZRText2.prototype._mergeRich = function(targetRich, sourceRich) { + var richNames = keys(sourceRich); + for (var i = 0; i < richNames.length; i++) { + var richName = richNames[i]; + targetRich[richName] = targetRich[richName] || {}; + extend(targetRich[richName], sourceRich[richName]); + } + }; + ZRText2.prototype.getAnimationStyleProps = function() { + return DEFAULT_TEXT_ANIMATION_PROPS; + }; + ZRText2.prototype._getOrCreateChild = function(Ctor) { + var child = this._children[this._childCursor]; + if (!child || !(child instanceof Ctor)) { + child = new Ctor(); + } + this._children[this._childCursor++] = child; + child.__zr = this.__zr; + child.parent = this; + return child; + }; + ZRText2.prototype._updatePlainTexts = function() { + var style = this.style; + var textFont = style.font || DEFAULT_FONT; + var textPadding = style.padding; + var text = getStyleText(style); + var contentBlock = parsePlainText(text, style); + var needDrawBg = needDrawBackground(style); + var bgColorDrawn = !!style.backgroundColor; + var outerHeight = contentBlock.outerHeight; + var outerWidth = contentBlock.outerWidth; + var contentWidth = contentBlock.contentWidth; + var textLines = contentBlock.lines; + var lineHeight = contentBlock.lineHeight; + var defaultStyle = this._defaultStyle; + this.isTruncated = !!contentBlock.isTruncated; + var baseX = style.x || 0; + var baseY = style.y || 0; + var textAlign = style.align || defaultStyle.align || "left"; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign || "top"; + var textX = baseX; + var textY = adjustTextY(baseY, contentBlock.contentHeight, verticalAlign); + if (needDrawBg || textPadding) { + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY(baseY, outerHeight, verticalAlign); + needDrawBg && this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight); + } + textY += lineHeight / 2; + if (textPadding) { + textX = getTextXForPadding(baseX, textAlign, textPadding); + if (verticalAlign === "top") { + textY += textPadding[0]; + } else if (verticalAlign === "bottom") { + textY -= textPadding[2]; + } + } + var defaultLineWidth = 0; + var useDefaultFill = false; + var textFill = getFill("fill" in style ? style.fill : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke("stroke" in style ? style.stroke : !bgColorDrawn && (!defaultStyle.autoStroke || useDefaultFill) ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) : null); + var hasShadow = style.textShadowBlur > 0; + var fixedBoundingRect = style.width != null && (style.overflow === "truncate" || style.overflow === "break" || style.overflow === "breakAll"); + var calculatedLineHeight = contentBlock.calculatedLineHeight; + for (var i = 0; i < textLines.length; i++) { + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + subElStyle.text = textLines[i]; + subElStyle.x = textX; + subElStyle.y = textY; + { + subElStyle.textAlign = textAlign; + } + subElStyle.textBaseline = "middle"; + subElStyle.opacity = style.opacity; + subElStyle.strokeFirst = true; + if (hasShadow) { + subElStyle.shadowBlur = style.textShadowBlur || 0; + subElStyle.shadowColor = style.textShadowColor || "transparent"; + subElStyle.shadowOffsetX = style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = style.textShadowOffsetY || 0; + } + subElStyle.stroke = textStroke; + subElStyle.fill = textFill; + if (textStroke) { + subElStyle.lineWidth = style.lineWidth || defaultLineWidth; + subElStyle.lineDash = style.lineDash; + subElStyle.lineDashOffset = style.lineDashOffset || 0; + } + subElStyle.font = textFont; + setSeparateFont(subElStyle, style); + textY += lineHeight; + if (fixedBoundingRect) { + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, contentWidth, subElStyle.textAlign), adjustTextY(subElStyle.y, calculatedLineHeight, subElStyle.textBaseline), contentWidth, calculatedLineHeight)); + } + } + }; + ZRText2.prototype._updateRichTexts = function() { + var style = this.style; + var text = getStyleText(style); + var contentBlock = parseRichText(text, style); + var contentWidth = contentBlock.width; + var outerWidth = contentBlock.outerWidth; + var outerHeight = contentBlock.outerHeight; + var textPadding = style.padding; + var baseX = style.x || 0; + var baseY = style.y || 0; + var defaultStyle = this._defaultStyle; + var textAlign = style.align || defaultStyle.align; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign; + this.isTruncated = !!contentBlock.isTruncated; + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY(baseY, outerHeight, verticalAlign); + var xLeft = boxX; + var lineTop = boxY; + if (textPadding) { + xLeft += textPadding[3]; + lineTop += textPadding[0]; + } + var xRight = xLeft + contentWidth; + if (needDrawBackground(style)) { + this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight); + } + var bgColorDrawn = !!style.backgroundColor; + for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var tokens = line.tokens; + var tokenCount = tokens.length; + var lineHeight = line.lineHeight; + var remainedWidth = line.width; + var leftIndex = 0; + var lineXLeft = xLeft; + var lineXRight = xRight; + var rightIndex = tokenCount - 1; + var token = void 0; + while (leftIndex < tokenCount && (token = tokens[leftIndex], !token.align || token.align === "left")) { + this._placeToken(token, style, lineHeight, lineTop, lineXLeft, "left", bgColorDrawn); + remainedWidth -= token.width; + lineXLeft += token.width; + leftIndex++; + } + while (rightIndex >= 0 && (token = tokens[rightIndex], token.align === "right")) { + this._placeToken(token, style, lineHeight, lineTop, lineXRight, "right", bgColorDrawn); + remainedWidth -= token.width; + lineXRight -= token.width; + rightIndex--; + } + lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - remainedWidth) / 2; + while (leftIndex <= rightIndex) { + token = tokens[leftIndex]; + this._placeToken(token, style, lineHeight, lineTop, lineXLeft + token.width / 2, "center", bgColorDrawn); + lineXLeft += token.width; + leftIndex++; + } + lineTop += lineHeight; + } + }; + ZRText2.prototype._placeToken = function(token, style, lineHeight, lineTop, x, textAlign, parentBgColorDrawn) { + var tokenStyle = style.rich[token.styleName] || {}; + tokenStyle.text = token.text; + var verticalAlign = token.verticalAlign; + var y = lineTop + lineHeight / 2; + if (verticalAlign === "top") { + y = lineTop + token.height / 2; + } else if (verticalAlign === "bottom") { + y = lineTop + lineHeight - token.height / 2; + } + var needDrawBg = !token.isLineHolder && needDrawBackground(tokenStyle); + needDrawBg && this._renderBackground(tokenStyle, style, textAlign === "right" ? x - token.width : textAlign === "center" ? x - token.width / 2 : x, y - token.height / 2, token.width, token.height); + var bgColorDrawn = !!tokenStyle.backgroundColor; + var textPadding = token.textPadding; + if (textPadding) { + x = getTextXForPadding(x, textAlign, textPadding); + y -= token.height / 2 - textPadding[0] - token.innerHeight / 2; + } + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + var defaultStyle = this._defaultStyle; + var useDefaultFill = false; + var defaultLineWidth = 0; + var textFill = getFill("fill" in tokenStyle ? tokenStyle.fill : "fill" in style ? style.fill : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke("stroke" in tokenStyle ? tokenStyle.stroke : "stroke" in style ? style.stroke : !bgColorDrawn && !parentBgColorDrawn && (!defaultStyle.autoStroke || useDefaultFill) ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) : null); + var hasShadow = tokenStyle.textShadowBlur > 0 || style.textShadowBlur > 0; + subElStyle.text = token.text; + subElStyle.x = x; + subElStyle.y = y; + if (hasShadow) { + subElStyle.shadowBlur = tokenStyle.textShadowBlur || style.textShadowBlur || 0; + subElStyle.shadowColor = tokenStyle.textShadowColor || style.textShadowColor || "transparent"; + subElStyle.shadowOffsetX = tokenStyle.textShadowOffsetX || style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = tokenStyle.textShadowOffsetY || style.textShadowOffsetY || 0; + } + subElStyle.textAlign = textAlign; + subElStyle.textBaseline = "middle"; + subElStyle.font = token.font || DEFAULT_FONT; + subElStyle.opacity = retrieve3(tokenStyle.opacity, style.opacity, 1); + setSeparateFont(subElStyle, tokenStyle); + if (textStroke) { + subElStyle.lineWidth = retrieve3(tokenStyle.lineWidth, style.lineWidth, defaultLineWidth); + subElStyle.lineDash = retrieve2(tokenStyle.lineDash, style.lineDash); + subElStyle.lineDashOffset = style.lineDashOffset || 0; + subElStyle.stroke = textStroke; + } + if (textFill) { + subElStyle.fill = textFill; + } + var textWidth = token.contentWidth; + var textHeight = token.contentHeight; + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, textWidth, subElStyle.textAlign), adjustTextY(subElStyle.y, textHeight, subElStyle.textBaseline), textWidth, textHeight)); + }; + ZRText2.prototype._renderBackground = function(style, topStyle, x, y, width, height) { + var textBackgroundColor = style.backgroundColor; + var textBorderWidth = style.borderWidth; + var textBorderColor = style.borderColor; + var isImageBg = textBackgroundColor && textBackgroundColor.image; + var isPlainOrGradientBg = textBackgroundColor && !isImageBg; + var textBorderRadius = style.borderRadius; + var self = this; + var rectEl; + var imgEl; + if (isPlainOrGradientBg || style.lineHeight || textBorderWidth && textBorderColor) { + rectEl = this._getOrCreateChild(Rect); + rectEl.useStyle(rectEl.createStyle()); + rectEl.style.fill = null; + var rectShape = rectEl.shape; + rectShape.x = x; + rectShape.y = y; + rectShape.width = width; + rectShape.height = height; + rectShape.r = textBorderRadius; + rectEl.dirtyShape(); + } + if (isPlainOrGradientBg) { + var rectStyle = rectEl.style; + rectStyle.fill = textBackgroundColor || null; + rectStyle.fillOpacity = retrieve2(style.fillOpacity, 1); + } else if (isImageBg) { + imgEl = this._getOrCreateChild(ZRImage); + imgEl.onload = function() { + self.dirtyStyle(); + }; + var imgStyle = imgEl.style; + imgStyle.image = textBackgroundColor.image; + imgStyle.x = x; + imgStyle.y = y; + imgStyle.width = width; + imgStyle.height = height; + } + if (textBorderWidth && textBorderColor) { + var rectStyle = rectEl.style; + rectStyle.lineWidth = textBorderWidth; + rectStyle.stroke = textBorderColor; + rectStyle.strokeOpacity = retrieve2(style.strokeOpacity, 1); + rectStyle.lineDash = style.borderDash; + rectStyle.lineDashOffset = style.borderDashOffset || 0; + rectEl.strokeContainThreshold = 0; + if (rectEl.hasFill() && rectEl.hasStroke()) { + rectStyle.strokeFirst = true; + rectStyle.lineWidth *= 2; + } + } + var commonStyle = (rectEl || imgEl).style; + commonStyle.shadowBlur = style.shadowBlur || 0; + commonStyle.shadowColor = style.shadowColor || "transparent"; + commonStyle.shadowOffsetX = style.shadowOffsetX || 0; + commonStyle.shadowOffsetY = style.shadowOffsetY || 0; + commonStyle.opacity = retrieve3(style.opacity, topStyle.opacity, 1); + }; + ZRText2.makeFont = function(style) { + var font = ""; + if (hasSeparateFont(style)) { + font = [ + style.fontStyle, + style.fontWeight, + parseFontSize(style.fontSize), + style.fontFamily || "sans-serif" + ].join(" "); + } + return font && trim(font) || style.textFont || style.font; + }; + return ZRText2; +}(Displayable); +var VALID_TEXT_ALIGN = { left: true, right: 1, center: 1 }; +var VALID_TEXT_VERTICAL_ALIGN = { top: 1, bottom: 1, middle: 1 }; +var FONT_PARTS = ["fontStyle", "fontWeight", "fontSize", "fontFamily"]; +function parseFontSize(fontSize) { + if (typeof fontSize === "string" && (fontSize.indexOf("px") !== -1 || fontSize.indexOf("rem") !== -1 || fontSize.indexOf("em") !== -1)) { + return fontSize; + } else if (!isNaN(+fontSize)) { + return fontSize + "px"; + } else { + return DEFAULT_FONT_SIZE + "px"; + } +} +function setSeparateFont(targetStyle, sourceStyle) { + for (var i = 0; i < FONT_PARTS.length; i++) { + var fontProp = FONT_PARTS[i]; + var val = sourceStyle[fontProp]; + if (val != null) { + targetStyle[fontProp] = val; + } + } +} +function hasSeparateFont(style) { + return style.fontSize != null || style.fontFamily || style.fontWeight; +} +function normalizeTextStyle(style) { + normalizeStyle(style); + each$4(style.rich, normalizeStyle); + return style; +} +function normalizeStyle(style) { + if (style) { + style.font = ZRText.makeFont(style); + var textAlign = style.align; + textAlign === "middle" && (textAlign = "center"); + style.align = textAlign == null || VALID_TEXT_ALIGN[textAlign] ? textAlign : "left"; + var verticalAlign = style.verticalAlign; + verticalAlign === "center" && (verticalAlign = "middle"); + style.verticalAlign = verticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[verticalAlign] ? verticalAlign : "top"; + var textPadding = style.padding; + if (textPadding) { + style.padding = normalizeCssArray$1(style.padding); + } + } +} +function getStroke(stroke, lineWidth) { + return stroke == null || lineWidth <= 0 || stroke === "transparent" || stroke === "none" ? null : stroke.image || stroke.colorStops ? "#000" : stroke; +} +function getFill(fill) { + return fill == null || fill === "none" ? null : fill.image || fill.colorStops ? "#000" : fill; +} +function getTextXForPadding(x, textAlign, textPadding) { + return textAlign === "right" ? x - textPadding[1] : textAlign === "center" ? x + textPadding[3] / 2 - textPadding[1] / 2 : x + textPadding[3]; +} +function getStyleText(style) { + var text = style.text; + text != null && (text += ""); + return text; +} +function needDrawBackground(style) { + return !!(style.backgroundColor || style.lineHeight || style.borderWidth && style.borderColor); +} + +var getECData = makeInner(); +var setCommonECData = function (seriesIndex, dataType, dataIdx, el) { + if (el) { + var ecData = getECData(el); + // Add data index and series index for indexing the data by element + // Useful in tooltip + ecData.dataIndex = dataIdx; + ecData.dataType = dataType; + ecData.seriesIndex = seriesIndex; + ecData.ssrType = 'chart'; + // TODO: not store dataIndex on children. + if (el.type === 'group') { + el.traverse(function (child) { + var childECData = getECData(child); + childECData.seriesIndex = seriesIndex; + childECData.dataIndex = dataIdx; + childECData.dataType = dataType; + childECData.ssrType = 'chart'; + }); + } + } +}; + +var _highlightNextDigit = 1; +var _highlightKeyMap = {}; +var getSavedStates = makeInner(); +var getComponentStates = makeInner(); +var HOVER_STATE_NORMAL = 0; +var HOVER_STATE_BLUR = 1; +var HOVER_STATE_EMPHASIS = 2; +var SPECIAL_STATES = ["emphasis", "blur", "select"]; +var DISPLAY_STATES = ["normal", "emphasis", "blur", "select"]; +var Z2_EMPHASIS_LIFT = 10; +var Z2_SELECT_LIFT = 9; +var HIGHLIGHT_ACTION_TYPE = "highlight"; +var DOWNPLAY_ACTION_TYPE = "downplay"; +var SELECT_ACTION_TYPE = "select"; +var UNSELECT_ACTION_TYPE = "unselect"; +var TOGGLE_SELECT_ACTION_TYPE = "toggleSelect"; +function hasFillOrStroke(fillOrStroke) { + return fillOrStroke != null && fillOrStroke !== "none"; +} +function doChangeHoverState(el, stateName, hoverStateEnum) { + if (el.onHoverStateChange && (el.hoverState || 0) !== hoverStateEnum) { + el.onHoverStateChange(stateName); + } + el.hoverState = hoverStateEnum; +} +function singleEnterEmphasis(el) { + doChangeHoverState(el, "emphasis", HOVER_STATE_EMPHASIS); +} +function singleLeaveEmphasis(el) { + if (el.hoverState === HOVER_STATE_EMPHASIS) { + doChangeHoverState(el, "normal", HOVER_STATE_NORMAL); + } +} +function singleEnterBlur(el) { + doChangeHoverState(el, "blur", HOVER_STATE_BLUR); +} +function singleLeaveBlur(el) { + if (el.hoverState === HOVER_STATE_BLUR) { + doChangeHoverState(el, "normal", HOVER_STATE_NORMAL); + } +} +function singleEnterSelect(el) { + el.selected = true; +} +function singleLeaveSelect(el) { + el.selected = false; +} +function updateElementState(el, updater, commonParam) { + updater(el, commonParam); +} +function traverseUpdateState(el, updater, commonParam) { + updateElementState(el, updater, commonParam); + el.isGroup && el.traverse(function(child) { + updateElementState(child, updater, commonParam); + }); +} +function setStatesFlag(el, stateName) { + switch (stateName) { + case "emphasis": + el.hoverState = HOVER_STATE_EMPHASIS; + break; + case "normal": + el.hoverState = HOVER_STATE_NORMAL; + break; + case "blur": + el.hoverState = HOVER_STATE_BLUR; + break; + case "select": + el.selected = true; + } +} +function getFromStateStyle(el, props, toStateName, defaultValue) { + var style = el.style; + var fromState = {}; + for (var i = 0; i < props.length; i++) { + var propName = props[i]; + var val = style[propName]; + fromState[propName] = val == null ? defaultValue && defaultValue[propName] : val; + } + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + if (animator.__fromStateTransition && animator.__fromStateTransition.indexOf(toStateName) < 0 && animator.targetName === "style") { + animator.saveTo(fromState, props); + } + } + return fromState; +} +function createEmphasisDefaultState(el, stateName, targetStates, state) { + var hasSelect = targetStates && indexOf(targetStates, "select") >= 0; + var cloned = false; + if (el instanceof Path) { + var store = getSavedStates(el); + var fromFill = hasSelect ? store.selectFill || store.normalFill : store.normalFill; + var fromStroke = hasSelect ? store.selectStroke || store.normalStroke : store.normalStroke; + if (hasFillOrStroke(fromFill) || hasFillOrStroke(fromStroke)) { + state = state || {}; + var emphasisStyle = state.style || {}; + if (emphasisStyle.fill === "inherit") { + cloned = true; + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + emphasisStyle.fill = fromFill; + } else if (!hasFillOrStroke(emphasisStyle.fill) && hasFillOrStroke(fromFill)) { + cloned = true; + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + emphasisStyle.fill = liftColor(fromFill); + } else if (!hasFillOrStroke(emphasisStyle.stroke) && hasFillOrStroke(fromStroke)) { + if (!cloned) { + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + } + emphasisStyle.stroke = liftColor(fromStroke); + } + state.style = emphasisStyle; + } + } + if (state) { + if (state.z2 == null) { + if (!cloned) { + state = extend({}, state); + } + var z2EmphasisLift = el.z2EmphasisLift; + state.z2 = el.z2 + (z2EmphasisLift != null ? z2EmphasisLift : Z2_EMPHASIS_LIFT); + } + } + return state; +} +function createSelectDefaultState(el, stateName, state) { + if (state) { + if (state.z2 == null) { + state = extend({}, state); + var z2SelectLift = el.z2SelectLift; + state.z2 = el.z2 + (z2SelectLift != null ? z2SelectLift : Z2_SELECT_LIFT); + } + } + return state; +} +function createBlurDefaultState(el, stateName, state) { + var hasBlur = indexOf(el.currentStates, stateName) >= 0; + var currentOpacity = el.style.opacity; + var fromState = !hasBlur ? getFromStateStyle(el, ["opacity"], stateName, { + opacity: 1 + }) : null; + state = state || {}; + var blurStyle = state.style || {}; + if (blurStyle.opacity == null) { + state = extend({}, state); + blurStyle = extend({ + // Already being applied 'emphasis'. DON'T mul opacity multiple times. + opacity: hasBlur ? currentOpacity : fromState.opacity * 0.1 + }, blurStyle); + state.style = blurStyle; + } + return state; +} +function elementStateProxy(stateName, targetStates) { + var state = this.states[stateName]; + if (this.style) { + if (stateName === "emphasis") { + return createEmphasisDefaultState(this, stateName, targetStates, state); + } else if (stateName === "blur") { + return createBlurDefaultState(this, stateName, state); + } else if (stateName === "select") { + return createSelectDefaultState(this, stateName, state); + } + } + return state; +} +function setDefaultStateProxy(el) { + el.stateProxy = elementStateProxy; + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + if (textContent) { + textContent.stateProxy = elementStateProxy; + } + if (textGuide) { + textGuide.stateProxy = elementStateProxy; + } +} +function enterEmphasisWhenMouseOver(el, e) { + !shouldSilent(el, e) && !el.__highByOuter && traverseUpdateState(el, singleEnterEmphasis); +} +function leaveEmphasisWhenMouseOut(el, e) { + !shouldSilent(el, e) && !el.__highByOuter && traverseUpdateState(el, singleLeaveEmphasis); +} +function enterEmphasis(el, highlightDigit) { + el.__highByOuter |= 1 << (highlightDigit || 0); + traverseUpdateState(el, singleEnterEmphasis); +} +function leaveEmphasis(el, highlightDigit) { + !(el.__highByOuter &= ~(1 << (highlightDigit || 0))) && traverseUpdateState(el, singleLeaveEmphasis); +} +function enterBlur(el) { + traverseUpdateState(el, singleEnterBlur); +} +function leaveBlur(el) { + traverseUpdateState(el, singleLeaveBlur); +} +function enterSelect(el) { + traverseUpdateState(el, singleEnterSelect); +} +function leaveSelect(el) { + traverseUpdateState(el, singleLeaveSelect); +} +function shouldSilent(el, e) { + return el.__highDownSilentOnTouch && e.zrByTouch; +} +function allLeaveBlur(api) { + var model = api.getModel(); + var leaveBlurredSeries = []; + var allComponentViews = []; + model.eachComponent(function(componentType, componentModel) { + var componentStates = getComponentStates(componentModel); + var isSeries = componentType === "series"; + var view = isSeries ? api.getViewOfSeriesModel(componentModel) : api.getViewOfComponentModel(componentModel); + !isSeries && allComponentViews.push(view); + if (componentStates.isBlured) { + view.group.traverse(function(child) { + singleLeaveBlur(child); + }); + isSeries && leaveBlurredSeries.push(componentModel); + } + componentStates.isBlured = false; + }); + each$4(allComponentViews, function(view) { + if (view && view.toggleBlurSeries) { + view.toggleBlurSeries(leaveBlurredSeries, false, model); + } + }); +} +function blurSeries(targetSeriesIndex, focus, blurScope, api) { + var ecModel = api.getModel(); + blurScope = blurScope || "coordinateSystem"; + function leaveBlurOfIndices(data, dataIndices) { + for (var i = 0; i < dataIndices.length; i++) { + var itemEl = data.getItemGraphicEl(dataIndices[i]); + itemEl && leaveBlur(itemEl); + } + } + if (targetSeriesIndex == null) { + return; + } + if (!focus || focus === "none") { + return; + } + var targetSeriesModel = ecModel.getSeriesByIndex(targetSeriesIndex); + var targetCoordSys = targetSeriesModel.coordinateSystem; + if (targetCoordSys && targetCoordSys.master) { + targetCoordSys = targetCoordSys.master; + } + var blurredSeries = []; + ecModel.eachSeries(function(seriesModel) { + var sameSeries = targetSeriesModel === seriesModel; + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.master) { + coordSys = coordSys.master; + } + var sameCoordSys = coordSys && targetCoordSys ? coordSys === targetCoordSys : sameSeries; + if (!// Not blur other series if blurScope series + (blurScope === "series" && !sameSeries || blurScope === "coordinateSystem" && !sameCoordSys || focus === "series" && sameSeries)) { + var view = api.getViewOfSeriesModel(seriesModel); + view.group.traverse(function(child) { + if (child.__highByOuter && sameSeries && focus === "self") { + return; + } + singleEnterBlur(child); + }); + if (isArrayLike(focus)) { + leaveBlurOfIndices(seriesModel.getData(), focus); + } else if (isObject$2(focus)) { + var dataTypes = keys(focus); + for (var d = 0; d < dataTypes.length; d++) { + leaveBlurOfIndices(seriesModel.getData(dataTypes[d]), focus[dataTypes[d]]); + } + } + blurredSeries.push(seriesModel); + getComponentStates(seriesModel).isBlured = true; + } + }); + ecModel.eachComponent(function(componentType, componentModel) { + if (componentType === "series") { + return; + } + var view = api.getViewOfComponentModel(componentModel); + if (view && view.toggleBlurSeries) { + view.toggleBlurSeries(blurredSeries, true, ecModel); + } + }); +} +function blurComponent(componentMainType, componentIndex, api) { + if (componentMainType == null || componentIndex == null) { + return; + } + var componentModel = api.getModel().getComponent(componentMainType, componentIndex); + if (!componentModel) { + return; + } + getComponentStates(componentModel).isBlured = true; + var view = api.getViewOfComponentModel(componentModel); + if (!view || !view.focusBlurEnabled) { + return; + } + view.group.traverse(function(child) { + singleEnterBlur(child); + }); +} +function blurSeriesFromHighlightPayload(seriesModel, payload, api) { + var seriesIndex = seriesModel.seriesIndex; + var data = seriesModel.getData(payload.dataType); + if (!data) { + return; + } + var dataIndex = queryDataIndex(data, payload); + dataIndex = (isArray(dataIndex) ? dataIndex[0] : dataIndex) || 0; + var el = data.getItemGraphicEl(dataIndex); + if (!el) { + var count = data.count(); + var current = 0; + while (!el && current < count) { + el = data.getItemGraphicEl(current++); + } + } + if (el) { + var ecData = getECData(el); + blurSeries(seriesIndex, ecData.focus, ecData.blurScope, api); + } else { + var focus_1 = seriesModel.get(["emphasis", "focus"]); + var blurScope = seriesModel.get(["emphasis", "blurScope"]); + if (focus_1 != null) { + blurSeries(seriesIndex, focus_1, blurScope, api); + } + } +} +function findComponentHighDownDispatchers(componentMainType, componentIndex, name, api) { + var ret = { + focusSelf: false, + dispatchers: null + }; + if (componentMainType == null || componentMainType === "series" || componentIndex == null || name == null) { + return ret; + } + var componentModel = api.getModel().getComponent(componentMainType, componentIndex); + if (!componentModel) { + return ret; + } + var view = api.getViewOfComponentModel(componentModel); + if (!view || !view.findHighDownDispatchers) { + return ret; + } + var dispatchers = view.findHighDownDispatchers(name); + var focusSelf; + for (var i = 0; i < dispatchers.length; i++) { + if (getECData(dispatchers[i]).focus === "self") { + focusSelf = true; + break; + } + } + return { + focusSelf, + dispatchers + }; +} +function handleGlobalMouseOverForHighDown(dispatcher, e, api) { + var ecData = getECData(dispatcher); + var _a = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api), dispatchers = _a.dispatchers, focusSelf = _a.focusSelf; + if (dispatchers) { + if (focusSelf) { + blurComponent(ecData.componentMainType, ecData.componentIndex, api); + } + each$4(dispatchers, function(dispatcher2) { + return enterEmphasisWhenMouseOver(dispatcher2, e); + }); + } else { + blurSeries(ecData.seriesIndex, ecData.focus, ecData.blurScope, api); + if (ecData.focus === "self") { + blurComponent(ecData.componentMainType, ecData.componentIndex, api); + } + enterEmphasisWhenMouseOver(dispatcher, e); + } +} +function handleGlobalMouseOutForHighDown(dispatcher, e, api) { + allLeaveBlur(api); + var ecData = getECData(dispatcher); + var dispatchers = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api).dispatchers; + if (dispatchers) { + each$4(dispatchers, function(dispatcher2) { + return leaveEmphasisWhenMouseOut(dispatcher2, e); + }); + } else { + leaveEmphasisWhenMouseOut(dispatcher, e); + } +} +function toggleSelectionFromPayload(seriesModel, payload, api) { + if (!isSelectChangePayload(payload)) { + return; + } + var dataType = payload.dataType; + var data = seriesModel.getData(dataType); + var dataIndex = queryDataIndex(data, payload); + if (!isArray(dataIndex)) { + dataIndex = [dataIndex]; + } + seriesModel[payload.type === TOGGLE_SELECT_ACTION_TYPE ? "toggleSelect" : payload.type === SELECT_ACTION_TYPE ? "select" : "unselect"](dataIndex, dataType); +} +function updateSeriesElementSelection(seriesModel) { + var allData = seriesModel.getAllData(); + each$4(allData, function(_a) { + var data = _a.data, type = _a.type; + data.eachItemGraphicEl(function(el, idx) { + seriesModel.isSelected(idx, type) ? enterSelect(el) : leaveSelect(el); + }); + }); +} +function getAllSelectedIndices(ecModel) { + var ret = []; + ecModel.eachSeries(function(seriesModel) { + var allData = seriesModel.getAllData(); + each$4(allData, function(_a) { + _a.data; var type = _a.type; + var dataIndices = seriesModel.getSelectedDataIndices(); + if (dataIndices.length > 0) { + var item = { + dataIndex: dataIndices, + seriesIndex: seriesModel.seriesIndex + }; + if (type != null) { + item.dataType = type; + } + ret.push(item); + } + }); + }); + return ret; +} +function enableHoverEmphasis(el, focus, blurScope) { + setAsHighDownDispatcher(el, true); + traverseUpdateState(el, setDefaultStateProxy); + enableHoverFocus(el, focus, blurScope); +} +function disableHoverEmphasis(el) { + setAsHighDownDispatcher(el, false); +} +function toggleHoverEmphasis(el, focus, blurScope, isDisabled) { + isDisabled ? disableHoverEmphasis(el) : enableHoverEmphasis(el, focus, blurScope); +} +function enableHoverFocus(el, focus, blurScope) { + var ecData = getECData(el); + if (focus != null) { + ecData.focus = focus; + ecData.blurScope = blurScope; + } else if (ecData.focus) { + ecData.focus = null; + } +} +var OTHER_STATES = ["emphasis", "blur", "select"]; +var defaultStyleGetterMap = { + itemStyle: "getItemStyle", + lineStyle: "getLineStyle", + areaStyle: "getAreaStyle" +}; +function setStatesStylesFromModel(el, itemModel, styleType, getter) { + styleType = styleType || "itemStyle"; + for (var i = 0; i < OTHER_STATES.length; i++) { + var stateName = OTHER_STATES[i]; + var model = itemModel.getModel([stateName, styleType]); + var state = el.ensureState(stateName); + state.style = model[defaultStyleGetterMap[styleType]](); + } +} +function setAsHighDownDispatcher(el, asDispatcher) { + var disable = asDispatcher === false; + var extendedEl = el; + if (el.highDownSilentOnTouch) { + extendedEl.__highDownSilentOnTouch = el.highDownSilentOnTouch; + } + if (!disable || extendedEl.__highDownDispatcher) { + extendedEl.__highByOuter = extendedEl.__highByOuter || 0; + extendedEl.__highDownDispatcher = !disable; + } +} +function isHighDownDispatcher(el) { + return !!(el && el.__highDownDispatcher); +} +function getHighlightDigit(highlightKey) { + var highlightDigit = _highlightKeyMap[highlightKey]; + if (highlightDigit == null && _highlightNextDigit <= 32) { + highlightDigit = _highlightKeyMap[highlightKey] = _highlightNextDigit++; + } + return highlightDigit; +} +function isSelectChangePayload(payload) { + var payloadType = payload.type; + return payloadType === SELECT_ACTION_TYPE || payloadType === UNSELECT_ACTION_TYPE || payloadType === TOGGLE_SELECT_ACTION_TYPE; +} +function isHighDownPayload(payload) { + var payloadType = payload.type; + return payloadType === HIGHLIGHT_ACTION_TYPE || payloadType === DOWNPLAY_ACTION_TYPE; +} +function savePathStates(el) { + var store = getSavedStates(el); + store.normalFill = el.style.fill; + store.normalStroke = el.style.stroke; + var selectState = el.states.select || {}; + store.selectFill = selectState.style && selectState.style.fill || null; + store.selectStroke = selectState.style && selectState.style.stroke || null; +} + +var CMD = PathProxy.CMD; +var points = [[], [], []]; +var mathSqrt$2 = Math.sqrt; +var mathAtan2 = Math.atan2; +function transformPath(path, m) { + if (!m) { + return; + } + var data = path.data; + var len = path.len(); + var cmd; + var nPoint; + var i; + var j; + var k; + var p; + var M = CMD.M; + var C = CMD.C; + var L = CMD.L; + var R = CMD.R; + var A = CMD.A; + var Q = CMD.Q; + for (i = 0, j = 0; i < len;) { + cmd = data[i++]; + j = i; + nPoint = 0; + switch (cmd) { + case M: + nPoint = 1; + break; + case L: + nPoint = 1; + break; + case C: + nPoint = 3; + break; + case Q: + nPoint = 2; + break; + case A: + var x = m[4]; + var y = m[5]; + var sx = mathSqrt$2(m[0] * m[0] + m[1] * m[1]); + var sy = mathSqrt$2(m[2] * m[2] + m[3] * m[3]); + var angle = mathAtan2(-m[1] / sy, m[0] / sx); + data[i] *= sx; + data[i++] += x; + data[i] *= sy; + data[i++] += y; + data[i++] *= sx; + data[i++] *= sy; + data[i++] += angle; + data[i++] += angle; + i += 2; + j = i; + break; + case R: + p[0] = data[i++]; + p[1] = data[i++]; + applyTransform$1(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + p[0] += data[i++]; + p[1] += data[i++]; + applyTransform$1(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + } + for (k = 0; k < nPoint; k++) { + var p_1 = points[k]; + p_1[0] = data[i++]; + p_1[1] = data[i++]; + applyTransform$1(p_1, p_1, m); + data[j++] = p_1[0]; + data[j++] = p_1[1]; + } + } + path.increaseVersion(); +} + +var mathSqrt$1 = Math.sqrt; +var mathSin$1 = Math.sin; +var mathCos$1 = Math.cos; +var PI$3 = Math.PI; +function vMag(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); +} +function vRatio(u, v) { + return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); +} +function vAngle(u, v) { + return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) + * Math.acos(vRatio(u, v)); +} +function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) { + var psi = psiDeg * (PI$3 / 180.0); + var xp = mathCos$1(psi) * (x1 - x2) / 2.0 + + mathSin$1(psi) * (y1 - y2) / 2.0; + var yp = -1 * mathSin$1(psi) * (x1 - x2) / 2.0 + + mathCos$1(psi) * (y1 - y2) / 2.0; + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + if (lambda > 1) { + rx *= mathSqrt$1(lambda); + ry *= mathSqrt$1(lambda); + } + var f = (fa === fs ? -1 : 1) + * mathSqrt$1((((rx * rx) * (ry * ry)) + - ((rx * rx) * (yp * yp)) + - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + + (ry * ry) * (xp * xp))) || 0; + var cxp = f * rx * yp / ry; + var cyp = f * -ry * xp / rx; + var cx = (x1 + x2) / 2.0 + + mathCos$1(psi) * cxp + - mathSin$1(psi) * cyp; + var cy = (y1 + y2) / 2.0 + + mathSin$1(psi) * cxp + + mathCos$1(psi) * cyp; + var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]); + var u = [(xp - cxp) / rx, (yp - cyp) / ry]; + var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry]; + var dTheta = vAngle(u, v); + if (vRatio(u, v) <= -1) { + dTheta = PI$3; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (dTheta < 0) { + var n = Math.round(dTheta / PI$3 * 1e6) / 1e6; + dTheta = PI$3 * 2 + (n % 2) * PI$3; + } + path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); +} +var commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig; +var numberReg = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; +function createPathProxyFromString(data) { + var path = new PathProxy(); + if (!data) { + return path; + } + var cpx = 0; + var cpy = 0; + var subpathX = cpx; + var subpathY = cpy; + var prevCmd; + var CMD = PathProxy.CMD; + var cmdList = data.match(commandReg); + if (!cmdList) { + return path; + } + for (var l = 0; l < cmdList.length; l++) { + var cmdText = cmdList[l]; + var cmdStr = cmdText.charAt(0); + var cmd = void 0; + var p = cmdText.match(numberReg) || []; + var pLen = p.length; + for (var i = 0; i < pLen; i++) { + p[i] = parseFloat(p[i]); + } + var off = 0; + while (off < pLen) { + var ctlPtx = void 0; + var ctlPty = void 0; + var rx = void 0; + var ry = void 0; + var psi = void 0; + var fa = void 0; + var fs = void 0; + var x1 = cpx; + var y1 = cpy; + var len = void 0; + var pathData = void 0; + switch (cmdStr) { + case 'l': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'L': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'm': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + subpathX = cpx; + subpathY = cpy; + cmdStr = 'l'; + break; + case 'M': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + subpathX = cpx; + subpathY = cpy; + cmdStr = 'L'; + break; + case 'h': + cpx += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'H': + cpx = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'v': + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'V': + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'C': + cmd = CMD.C; + path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]); + cpx = p[off - 2]; + cpy = p[off - 1]; + break; + case 'c': + cmd = CMD.C; + path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy); + cpx += p[off - 2]; + cpy += p[off - 1]; + break; + case 'S': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 's': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = cpx + p[off++]; + y1 = cpy + p[off++]; + cpx += p[off++]; + cpy += p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 'Q': + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'q': + x1 = p[off++] + cpx; + y1 = p[off++] + cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'T': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 't': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 'A': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + x1 = cpx, y1 = cpy; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.A; + processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); + break; + case 'a': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + x1 = cpx, y1 = cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.A; + processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); + break; + } + } + if (cmdStr === 'z' || cmdStr === 'Z') { + cmd = CMD.Z; + path.addData(cmd); + cpx = subpathX; + cpy = subpathY; + } + prevCmd = cmd; + } + path.toStatic(); + return path; +} +var SVGPath = (function (_super) { + __extends(SVGPath, _super); + function SVGPath() { + return _super !== null && _super.apply(this, arguments) || this; + } + SVGPath.prototype.applyTransform = function (m) { }; + return SVGPath; +}(Path)); +function isPathProxy(path) { + return path.setData != null; +} +function createPathOptions(str, opts) { + var pathProxy = createPathProxyFromString(str); + var innerOpts = extend({}, opts); + innerOpts.buildPath = function (path) { + if (isPathProxy(path)) { + path.setData(pathProxy.data); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } + else { + var ctx = path; + pathProxy.rebuildPath(ctx, 1); + } + }; + innerOpts.applyTransform = function (m) { + transformPath(pathProxy, m); + this.dirtyShape(); + }; + return innerOpts; +} +function createFromString(str, opts) { + return new SVGPath(createPathOptions(str, opts)); +} +function extendFromString(str, defaultOpts) { + var innerOpts = createPathOptions(str, defaultOpts); + var Sub = (function (_super) { + __extends(Sub, _super); + function Sub(opts) { + var _this = _super.call(this, opts) || this; + _this.applyTransform = innerOpts.applyTransform; + _this.buildPath = innerOpts.buildPath; + return _this; + } + return Sub; + }(SVGPath)); + return Sub; +} +function mergePath$1(pathEls, opts) { + var pathList = []; + var len = pathEls.length; + for (var i = 0; i < len; i++) { + var pathEl = pathEls[i]; + pathList.push(pathEl.getUpdatedPathProxy(true)); + } + var pathBundle = new Path(opts); + pathBundle.createPathProxy(); + pathBundle.buildPath = function (path) { + if (isPathProxy(path)) { + path.appendPath(pathList); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } + }; + return pathBundle; +} + +var CircleShape = (function () { + function CircleShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + } + return CircleShape; +}()); +var Circle = (function (_super) { + __extends(Circle, _super); + function Circle(opts) { + return _super.call(this, opts) || this; + } + Circle.prototype.getDefaultShape = function () { + return new CircleShape(); + }; + Circle.prototype.buildPath = function (ctx, shape) { + ctx.moveTo(shape.cx + shape.r, shape.cy); + ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2); + }; + return Circle; +}(Path)); +Circle.prototype.type = 'circle'; + +var EllipseShape = (function () { + function EllipseShape() { + this.cx = 0; + this.cy = 0; + this.rx = 0; + this.ry = 0; + } + return EllipseShape; +}()); +var Ellipse = (function (_super) { + __extends(Ellipse, _super); + function Ellipse(opts) { + return _super.call(this, opts) || this; + } + Ellipse.prototype.getDefaultShape = function () { + return new EllipseShape(); + }; + Ellipse.prototype.buildPath = function (ctx, shape) { + var k = 0.5522848; + var x = shape.cx; + var y = shape.cy; + var a = shape.rx; + var b = shape.ry; + var ox = a * k; + var oy = b * k; + ctx.moveTo(x - a, y); + ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b); + ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y); + ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b); + ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y); + ctx.closePath(); + }; + return Ellipse; +}(Path)); +Ellipse.prototype.type = 'ellipse'; + +var PI$2 = Math.PI; +var PI2$1 = PI$2 * 2; +var mathSin = Math.sin; +var mathCos = Math.cos; +var mathACos = Math.acos; +var mathATan2 = Math.atan2; +var mathAbs = Math.abs; +var mathSqrt = Math.sqrt; +var mathMax$2 = Math.max; +var mathMin$2 = Math.min; +var e = 1e-4; +function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var dx10 = x1 - x0; + var dy10 = y1 - y0; + var dx32 = x3 - x2; + var dy32 = y3 - y2; + var t = dy32 * dx10 - dx32 * dy10; + if (t * t < e) { + return; + } + t = (dx32 * (y0 - y2) - dy32 * (x0 - x2)) / t; + return [x0 + t * dx10, y0 + t * dy10]; +} +function computeCornerTangents(x0, y0, x1, y1, radius, cr, clockwise) { + var x01 = x0 - x1; + var y01 = y0 - y1; + var lo = (clockwise ? cr : -cr) / mathSqrt(x01 * x01 + y01 * y01); + var ox = lo * y01; + var oy = -lo * x01; + var x11 = x0 + ox; + var y11 = y0 + oy; + var x10 = x1 + ox; + var y10 = y1 + oy; + var x00 = (x11 + x10) / 2; + var y00 = (y11 + y10) / 2; + var dx = x10 - x11; + var dy = y10 - y11; + var d2 = dx * dx + dy * dy; + var r = radius - cr; + var s = x11 * y10 - x10 * y11; + var d = (dy < 0 ? -1 : 1) * mathSqrt(mathMax$2(0, r * r * d2 - s * s)); + var cx0 = (s * dy - dx * d) / d2; + var cy0 = (-s * dx - dy * d) / d2; + var cx1 = (s * dy + dx * d) / d2; + var cy1 = (-s * dx + dy * d) / d2; + var dx0 = cx0 - x00; + var dy0 = cy0 - y00; + var dx1 = cx1 - x00; + var dy1 = cy1 - y00; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) { + cx0 = cx1; + cy0 = cy1; + } + return { + cx: cx0, + cy: cy0, + x0: -ox, + y0: -oy, + x1: cx0 * (radius / r - 1), + y1: cy0 * (radius / r - 1) + }; +} +function normalizeCornerRadius(cr) { + var arr; + if (isArray(cr)) { + var len = cr.length; + if (!len) { + return cr; + } + if (len === 1) { + arr = [cr[0], cr[0], 0, 0]; + } + else if (len === 2) { + arr = [cr[0], cr[0], cr[1], cr[1]]; + } + else if (len === 3) { + arr = cr.concat(cr[2]); + } + else { + arr = cr; + } + } + else { + arr = [cr, cr, cr, cr]; + } + return arr; +} +function buildPath$1(ctx, shape) { + var _a; + var radius = mathMax$2(shape.r, 0); + var innerRadius = mathMax$2(shape.r0 || 0, 0); + var hasRadius = radius > 0; + var hasInnerRadius = innerRadius > 0; + if (!hasRadius && !hasInnerRadius) { + return; + } + if (!hasRadius) { + radius = innerRadius; + innerRadius = 0; + } + if (innerRadius > radius) { + var tmp = radius; + radius = innerRadius; + innerRadius = tmp; + } + var startAngle = shape.startAngle, endAngle = shape.endAngle; + if (isNaN(startAngle) || isNaN(endAngle)) { + return; + } + var cx = shape.cx, cy = shape.cy; + var clockwise = !!shape.clockwise; + var arc = mathAbs(endAngle - startAngle); + var mod = arc > PI2$1 && arc % PI2$1; + mod > e && (arc = mod); + if (!(radius > e)) { + ctx.moveTo(cx, cy); + } + else if (arc > PI2$1 - e) { + ctx.moveTo(cx + radius * mathCos(startAngle), cy + radius * mathSin(startAngle)); + ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise); + if (innerRadius > e) { + ctx.moveTo(cx + innerRadius * mathCos(endAngle), cy + innerRadius * mathSin(endAngle)); + ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise); + } + } + else { + var icrStart = void 0; + var icrEnd = void 0; + var ocrStart = void 0; + var ocrEnd = void 0; + var ocrs = void 0; + var ocre = void 0; + var icrs = void 0; + var icre = void 0; + var ocrMax = void 0; + var icrMax = void 0; + var limitedOcrMax = void 0; + var limitedIcrMax = void 0; + var xre = void 0; + var yre = void 0; + var xirs = void 0; + var yirs = void 0; + var xrs = radius * mathCos(startAngle); + var yrs = radius * mathSin(startAngle); + var xire = innerRadius * mathCos(endAngle); + var yire = innerRadius * mathSin(endAngle); + var hasArc = arc > e; + if (hasArc) { + var cornerRadius = shape.cornerRadius; + if (cornerRadius) { + _a = normalizeCornerRadius(cornerRadius), icrStart = _a[0], icrEnd = _a[1], ocrStart = _a[2], ocrEnd = _a[3]; + } + var halfRd = mathAbs(radius - innerRadius) / 2; + ocrs = mathMin$2(halfRd, ocrStart); + ocre = mathMin$2(halfRd, ocrEnd); + icrs = mathMin$2(halfRd, icrStart); + icre = mathMin$2(halfRd, icrEnd); + limitedOcrMax = ocrMax = mathMax$2(ocrs, ocre); + limitedIcrMax = icrMax = mathMax$2(icrs, icre); + if (ocrMax > e || icrMax > e) { + xre = radius * mathCos(endAngle); + yre = radius * mathSin(endAngle); + xirs = innerRadius * mathCos(startAngle); + yirs = innerRadius * mathSin(startAngle); + if (arc < PI$2) { + var it_1 = intersect(xrs, yrs, xirs, yirs, xre, yre, xire, yire); + if (it_1) { + var x0 = xrs - it_1[0]; + var y0 = yrs - it_1[1]; + var x1 = xre - it_1[0]; + var y1 = yre - it_1[1]; + var a = 1 / mathSin(mathACos((x0 * x1 + y0 * y1) / (mathSqrt(x0 * x0 + y0 * y0) * mathSqrt(x1 * x1 + y1 * y1))) / 2); + var b = mathSqrt(it_1[0] * it_1[0] + it_1[1] * it_1[1]); + limitedOcrMax = mathMin$2(ocrMax, (radius - b) / (a + 1)); + limitedIcrMax = mathMin$2(icrMax, (innerRadius - b) / (a - 1)); + } + } + } + } + if (!hasArc) { + ctx.moveTo(cx + xrs, cy + yrs); + } + else if (limitedOcrMax > e) { + var crStart = mathMin$2(ocrStart, limitedOcrMax); + var crEnd = mathMin$2(ocrEnd, limitedOcrMax); + var ct0 = computeCornerTangents(xirs, yirs, xrs, yrs, radius, crStart, clockwise); + var ct1 = computeCornerTangents(xre, yre, xire, yire, radius, crEnd, clockwise); + ctx.moveTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0); + if (limitedOcrMax < ocrMax && crStart === crEnd) { + ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedOcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + else { + crStart > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crStart, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise); + ctx.arc(cx, cy, radius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), !clockwise); + crEnd > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crEnd, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + } + else { + ctx.moveTo(cx + xrs, cy + yrs); + ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise); + } + if (!(innerRadius > e) || !hasArc) { + ctx.lineTo(cx + xire, cy + yire); + } + else if (limitedIcrMax > e) { + var crStart = mathMin$2(icrStart, limitedIcrMax); + var crEnd = mathMin$2(icrEnd, limitedIcrMax); + var ct0 = computeCornerTangents(xire, yire, xre, yre, innerRadius, -crEnd, clockwise); + var ct1 = computeCornerTangents(xrs, yrs, xirs, yirs, innerRadius, -crStart, clockwise); + ctx.lineTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0); + if (limitedIcrMax < icrMax && crStart === crEnd) { + ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedIcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + else { + crEnd > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crEnd, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise); + ctx.arc(cx, cy, innerRadius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), clockwise); + crStart > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crStart, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + } + else { + ctx.lineTo(cx + xire, cy + yire); + ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise); + } + } + ctx.closePath(); +} + +var SectorShape = (function () { + function SectorShape() { + this.cx = 0; + this.cy = 0; + this.r0 = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + this.cornerRadius = 0; + } + return SectorShape; +}()); +var Sector = (function (_super) { + __extends(Sector, _super); + function Sector(opts) { + return _super.call(this, opts) || this; + } + Sector.prototype.getDefaultShape = function () { + return new SectorShape(); + }; + Sector.prototype.buildPath = function (ctx, shape) { + buildPath$1(ctx, shape); + }; + Sector.prototype.isZeroArea = function () { + return this.shape.startAngle === this.shape.endAngle + || this.shape.r === this.shape.r0; + }; + return Sector; +}(Path)); +Sector.prototype.type = 'sector'; + +var RingShape = (function () { + function RingShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.r0 = 0; + } + return RingShape; +}()); +var Ring = (function (_super) { + __extends(Ring, _super); + function Ring(opts) { + return _super.call(this, opts) || this; + } + Ring.prototype.getDefaultShape = function () { + return new RingShape(); + }; + Ring.prototype.buildPath = function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var PI2 = Math.PI * 2; + ctx.moveTo(x + shape.r, y); + ctx.arc(x, y, shape.r, 0, PI2, false); + ctx.moveTo(x + shape.r0, y); + ctx.arc(x, y, shape.r0, 0, PI2, true); + }; + return Ring; +}(Path)); +Ring.prototype.type = 'ring'; + +function smoothBezier(points, smooth, isLoop, constraint) { + var cps = []; + var v = []; + var v1 = []; + var v2 = []; + var prevPoint; + var nextPoint; + var min; + var max; + if (constraint) { + min = [Infinity, Infinity]; + max = [-Infinity, -Infinity]; + for (var i = 0, len = points.length; i < len; i++) { + min$1(min, min, points[i]); + max$1(max, max, points[i]); + } + min$1(min, min, constraint[0]); + max$1(max, max, constraint[1]); + } + for (var i = 0, len = points.length; i < len; i++) { + var point = points[i]; + if (isLoop) { + prevPoint = points[i ? i - 1 : len - 1]; + nextPoint = points[(i + 1) % len]; + } + else { + if (i === 0 || i === len - 1) { + cps.push(clone$1(points[i])); + continue; + } + else { + prevPoint = points[i - 1]; + nextPoint = points[i + 1]; + } + } + sub(v, nextPoint, prevPoint); + scale$2(v, v, smooth); + var d0 = distance(point, prevPoint); + var d1 = distance(point, nextPoint); + var sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + scale$2(v1, v, -d0); + scale$2(v2, v, d1); + var cp0 = add([], point, v1); + var cp1 = add([], point, v2); + if (constraint) { + max$1(cp0, cp0, min); + min$1(cp0, cp0, max); + max$1(cp1, cp1, min); + min$1(cp1, cp1, max); + } + cps.push(cp0); + cps.push(cp1); + } + if (isLoop) { + cps.push(cps.shift()); + } + return cps; +} + +function buildPath(ctx, shape, closePath) { + var smooth = shape.smooth; + var points = shape.points; + if (points && points.length >= 2) { + if (smooth) { + var controlPoints = smoothBezier(points, smooth, closePath, shape.smoothConstraint); + ctx.moveTo(points[0][0], points[0][1]); + var len = points.length; + for (var i = 0; i < (closePath ? len : len - 1); i++) { + var cp1 = controlPoints[i * 2]; + var cp2 = controlPoints[i * 2 + 1]; + var p = points[(i + 1) % len]; + ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]); + } + } + else { + ctx.moveTo(points[0][0], points[0][1]); + for (var i = 1, l = points.length; i < l; i++) { + ctx.lineTo(points[i][0], points[i][1]); + } + } + closePath && ctx.closePath(); + } +} + +var PolygonShape = (function () { + function PolygonShape() { + this.points = null; + this.smooth = 0; + this.smoothConstraint = null; + } + return PolygonShape; +}()); +var Polygon = (function (_super) { + __extends(Polygon, _super); + function Polygon(opts) { + return _super.call(this, opts) || this; + } + Polygon.prototype.getDefaultShape = function () { + return new PolygonShape(); + }; + Polygon.prototype.buildPath = function (ctx, shape) { + buildPath(ctx, shape, true); + }; + return Polygon; +}(Path)); +Polygon.prototype.type = 'polygon'; + +var PolylineShape = (function () { + function PolylineShape() { + this.points = null; + this.percent = 1; + this.smooth = 0; + this.smoothConstraint = null; + } + return PolylineShape; +}()); +var Polyline = (function (_super) { + __extends(Polyline, _super); + function Polyline(opts) { + return _super.call(this, opts) || this; + } + Polyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Polyline.prototype.getDefaultShape = function () { + return new PolylineShape(); + }; + Polyline.prototype.buildPath = function (ctx, shape) { + buildPath(ctx, shape, false); + }; + return Polyline; +}(Path)); +Polyline.prototype.type = 'polyline'; + +var subPixelOptimizeOutputShape = {}; +var LineShape = (function () { + function LineShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.percent = 1; + } + return LineShape; +}()); +var Line = (function (_super) { + __extends(Line, _super); + function Line(opts) { + return _super.call(this, opts) || this; + } + Line.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Line.prototype.getDefaultShape = function () { + return new LineShape(); + }; + Line.prototype.buildPath = function (ctx, shape) { + var x1; + var y1; + var x2; + var y2; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeLine$1(subPixelOptimizeOutputShape, shape, this.style); + x1 = optimizedShape.x1; + y1 = optimizedShape.y1; + x2 = optimizedShape.x2; + y2 = optimizedShape.y2; + } + else { + x1 = shape.x1; + y1 = shape.y1; + x2 = shape.x2; + y2 = shape.y2; + } + var percent = shape.percent; + if (percent === 0) { + return; + } + ctx.moveTo(x1, y1); + if (percent < 1) { + x2 = x1 * (1 - percent) + x2 * percent; + y2 = y1 * (1 - percent) + y2 * percent; + } + ctx.lineTo(x2, y2); + }; + Line.prototype.pointAt = function (p) { + var shape = this.shape; + return [ + shape.x1 * (1 - p) + shape.x2 * p, + shape.y1 * (1 - p) + shape.y2 * p + ]; + }; + return Line; +}(Path)); +Line.prototype.type = 'line'; + +var out = []; +var BezierCurveShape = (function () { + function BezierCurveShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.cpx1 = 0; + this.cpy1 = 0; + this.percent = 1; + } + return BezierCurveShape; +}()); +function someVectorAt(shape, t, isTangent) { + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + if (cpx2 != null || cpy2 != null) { + return [ + (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t), + (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t) + ]; + } + else { + return [ + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t), + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t) + ]; + } +} +var BezierCurve = (function (_super) { + __extends(BezierCurve, _super); + function BezierCurve(opts) { + return _super.call(this, opts) || this; + } + BezierCurve.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + BezierCurve.prototype.getDefaultShape = function () { + return new BezierCurveShape(); + }; + BezierCurve.prototype.buildPath = function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var cpx1 = shape.cpx1; + var cpy1 = shape.cpy1; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + var percent = shape.percent; + if (percent === 0) { + return; + } + ctx.moveTo(x1, y1); + if (cpx2 == null || cpy2 == null) { + if (percent < 1) { + quadraticSubdivide(x1, cpx1, x2, percent, out); + cpx1 = out[1]; + x2 = out[2]; + quadraticSubdivide(y1, cpy1, y2, percent, out); + cpy1 = out[1]; + y2 = out[2]; + } + ctx.quadraticCurveTo(cpx1, cpy1, x2, y2); + } + else { + if (percent < 1) { + cubicSubdivide(x1, cpx1, cpx2, x2, percent, out); + cpx1 = out[1]; + cpx2 = out[2]; + x2 = out[3]; + cubicSubdivide(y1, cpy1, cpy2, y2, percent, out); + cpy1 = out[1]; + cpy2 = out[2]; + y2 = out[3]; + } + ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2); + } + }; + BezierCurve.prototype.pointAt = function (t) { + return someVectorAt(this.shape, t, false); + }; + BezierCurve.prototype.tangentAt = function (t) { + var p = someVectorAt(this.shape, t, true); + return normalize$1(p, p); + }; + return BezierCurve; +}(Path)); +BezierCurve.prototype.type = 'bezier-curve'; + +var ArcShape = (function () { + function ArcShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + } + return ArcShape; +}()); +var Arc = (function (_super) { + __extends(Arc, _super); + function Arc(opts) { + return _super.call(this, opts) || this; + } + Arc.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Arc.prototype.getDefaultShape = function () { + return new ArcShape(); + }; + Arc.prototype.buildPath = function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + ctx.moveTo(unitX * r + x, unitY * r + y); + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + }; + return Arc; +}(Path)); +Arc.prototype.type = 'arc'; + +var CompoundPath = (function (_super) { + __extends(CompoundPath, _super); + function CompoundPath() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = 'compound'; + return _this; + } + CompoundPath.prototype._updatePathDirty = function () { + var paths = this.shape.paths; + var dirtyPath = this.shapeChanged(); + for (var i = 0; i < paths.length; i++) { + dirtyPath = dirtyPath || paths[i].shapeChanged(); + } + if (dirtyPath) { + this.dirtyShape(); + } + }; + CompoundPath.prototype.beforeBrush = function () { + this._updatePathDirty(); + var paths = this.shape.paths || []; + var scale = this.getGlobalScale(); + for (var i = 0; i < paths.length; i++) { + if (!paths[i].path) { + paths[i].createPathProxy(); + } + paths[i].path.setScale(scale[0], scale[1], paths[i].segmentIgnoreThreshold); + } + }; + CompoundPath.prototype.buildPath = function (ctx, shape) { + var paths = shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].buildPath(ctx, paths[i].shape, true); + } + }; + CompoundPath.prototype.afterBrush = function () { + var paths = this.shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].pathUpdated(); + } + }; + CompoundPath.prototype.getBoundingRect = function () { + this._updatePathDirty.call(this); + return Path.prototype.getBoundingRect.call(this); + }; + return CompoundPath; +}(Path)); + +var Gradient = (function () { + function Gradient(colorStops) { + this.colorStops = colorStops || []; + } + Gradient.prototype.addColorStop = function (offset, color) { + this.colorStops.push({ + offset: offset, + color: color + }); + }; + return Gradient; +}()); + +var LinearGradient = (function (_super) { + __extends(LinearGradient, _super); + function LinearGradient(x, y, x2, y2, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0 : x; + _this.y = y == null ? 0 : y; + _this.x2 = x2 == null ? 1 : x2; + _this.y2 = y2 == null ? 0 : y2; + _this.type = 'linear'; + _this.global = globalCoord || false; + return _this; + } + return LinearGradient; +}(Gradient)); + +var RadialGradient = (function (_super) { + __extends(RadialGradient, _super); + function RadialGradient(x, y, r, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0.5 : x; + _this.y = y == null ? 0.5 : y; + _this.r = r == null ? 0.5 : r; + _this.type = 'radial'; + _this.global = globalCoord || false; + return _this; + } + return RadialGradient; +}(Gradient)); + +var extent = [0, 0]; +var extent2 = [0, 0]; +var minTv = new Point(); +var maxTv = new Point(); +var OrientedBoundingRect = (function () { + function OrientedBoundingRect(rect, transform) { + this._corners = []; + this._axes = []; + this._origin = [0, 0]; + for (var i = 0; i < 4; i++) { + this._corners[i] = new Point(); + } + for (var i = 0; i < 2; i++) { + this._axes[i] = new Point(); + } + if (rect) { + this.fromBoundingRect(rect, transform); + } + } + OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) { + var corners = this._corners; + var axes = this._axes; + var x = rect.x; + var y = rect.y; + var x2 = x + rect.width; + var y2 = y + rect.height; + corners[0].set(x, y); + corners[1].set(x2, y); + corners[2].set(x2, y2); + corners[3].set(x, y2); + if (transform) { + for (var i = 0; i < 4; i++) { + corners[i].transform(transform); + } + } + Point.sub(axes[0], corners[1], corners[0]); + Point.sub(axes[1], corners[3], corners[0]); + axes[0].normalize(); + axes[1].normalize(); + for (var i = 0; i < 2; i++) { + this._origin[i] = axes[i].dot(corners[0]); + } + }; + OrientedBoundingRect.prototype.intersect = function (other, mtv) { + var overlapped = true; + var noMtv = !mtv; + minTv.set(Infinity, Infinity); + maxTv.set(0, 0); + if (!this._intersectCheckOneSide(this, other, minTv, maxTv, noMtv, 1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!this._intersectCheckOneSide(other, this, minTv, maxTv, noMtv, -1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!noMtv) { + Point.copy(mtv, overlapped ? minTv : maxTv); + } + return overlapped; + }; + OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, minTv, maxTv, noMtv, inverse) { + var overlapped = true; + for (var i = 0; i < 2; i++) { + var axis = this._axes[i]; + this._getProjMinMaxOnAxis(i, self._corners, extent); + this._getProjMinMaxOnAxis(i, other._corners, extent2); + if (extent[1] < extent2[0] || extent[0] > extent2[1]) { + overlapped = false; + if (noMtv) { + return overlapped; + } + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) > maxTv.len()) { + if (dist0 < dist1) { + Point.scale(maxTv, axis, -dist0 * inverse); + } + else { + Point.scale(maxTv, axis, dist1 * inverse); + } + } + } + else if (minTv) { + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) < minTv.len()) { + if (dist0 < dist1) { + Point.scale(minTv, axis, dist0 * inverse); + } + else { + Point.scale(minTv, axis, -dist1 * inverse); + } + } + } + } + return overlapped; + }; + OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) { + var axis = this._axes[dim]; + var origin = this._origin; + var proj = corners[0].dot(axis) + origin[dim]; + var min = proj; + var max = proj; + for (var i = 1; i < corners.length; i++) { + var proj_1 = corners[i].dot(axis) + origin[dim]; + min = Math.min(proj_1, min); + max = Math.max(proj_1, max); + } + out[0] = min; + out[1] = max; + }; + return OrientedBoundingRect; +}()); + +var m = []; +var IncrementalDisplayable = (function (_super) { + __extends(IncrementalDisplayable, _super); + function IncrementalDisplayable() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.notClear = true; + _this.incremental = true; + _this._displayables = []; + _this._temporaryDisplayables = []; + _this._cursor = 0; + return _this; + } + IncrementalDisplayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + IncrementalDisplayable.prototype.useStyle = function () { + this.style = {}; + }; + IncrementalDisplayable.prototype.getCursor = function () { + return this._cursor; + }; + IncrementalDisplayable.prototype.innerAfterBrush = function () { + this._cursor = this._displayables.length; + }; + IncrementalDisplayable.prototype.clearDisplaybles = function () { + this._displayables = []; + this._temporaryDisplayables = []; + this._cursor = 0; + this.markRedraw(); + this.notClear = false; + }; + IncrementalDisplayable.prototype.clearTemporalDisplayables = function () { + this._temporaryDisplayables = []; + }; + IncrementalDisplayable.prototype.addDisplayable = function (displayable, notPersistent) { + if (notPersistent) { + this._temporaryDisplayables.push(displayable); + } + else { + this._displayables.push(displayable); + } + this.markRedraw(); + }; + IncrementalDisplayable.prototype.addDisplayables = function (displayables, notPersistent) { + notPersistent = notPersistent || false; + for (var i = 0; i < displayables.length; i++) { + this.addDisplayable(displayables[i], notPersistent); + } + }; + IncrementalDisplayable.prototype.getDisplayables = function () { + return this._displayables; + }; + IncrementalDisplayable.prototype.getTemporalDisplayables = function () { + return this._temporaryDisplayables; + }; + IncrementalDisplayable.prototype.eachPendingDisplayable = function (cb) { + for (var i = this._cursor; i < this._displayables.length; i++) { + cb && cb(this._displayables[i]); + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + cb && cb(this._temporaryDisplayables[i]); + } + }; + IncrementalDisplayable.prototype.update = function () { + this.updateTransform(); + for (var i = this._cursor; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + var displayable = this._temporaryDisplayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + }; + IncrementalDisplayable.prototype.getBoundingRect = function () { + if (!this._rect) { + var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity); + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + var childRect = displayable.getBoundingRect().clone(); + if (displayable.needLocalTransform()) { + childRect.applyTransform(displayable.getLocalTransform(m)); + } + rect.union(childRect); + } + this._rect = rect; + } + return this._rect; + }; + IncrementalDisplayable.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + if (rect.contain(localPos[0], localPos[1])) { + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + if (displayable.contain(x, y)) { + return true; + } + } + } + return false; + }; + return IncrementalDisplayable; +}(Displayable)); + +// Stored properties for further transition. +var transitionStore = makeInner(); +/** + * Return null if animation is disabled. + */ +function getAnimationConfig(animationType, animatableModel, dataIndex, +// Extra opts can override the option in animatable model. +extraOpts, +// TODO It's only for pictorial bar now. +extraDelayParams) { + var animationPayload; + // Check if there is global animation configuration from dataZoom/resize can override the config in option. + // If animation is enabled. Will use this animation config in payload. + // If animation is disabled. Just ignore it. + if (animatableModel && animatableModel.ecModel) { + var updatePayload = animatableModel.ecModel.getUpdatePayload(); + animationPayload = updatePayload && updatePayload.animation; + } + var animationEnabled = animatableModel && animatableModel.isAnimationEnabled(); + var isUpdate = animationType === 'update'; + if (animationEnabled) { + var duration = void 0; + var easing = void 0; + var delay = void 0; + if (extraOpts) { + duration = retrieve2(extraOpts.duration, 200); + easing = retrieve2(extraOpts.easing, 'cubicOut'); + delay = 0; + } else { + duration = animatableModel.getShallow(isUpdate ? 'animationDurationUpdate' : 'animationDuration'); + easing = animatableModel.getShallow(isUpdate ? 'animationEasingUpdate' : 'animationEasing'); + delay = animatableModel.getShallow(isUpdate ? 'animationDelayUpdate' : 'animationDelay'); + } + // animation from payload has highest priority. + if (animationPayload) { + animationPayload.duration != null && (duration = animationPayload.duration); + animationPayload.easing != null && (easing = animationPayload.easing); + animationPayload.delay != null && (delay = animationPayload.delay); + } + if (isFunction(delay)) { + delay = delay(dataIndex, extraDelayParams); + } + if (isFunction(duration)) { + duration = duration(dataIndex); + } + var config = { + duration: duration || 0, + delay: delay, + easing: easing + }; + return config; + } else { + return null; + } +} +function animateOrSetProps(animationType, el, props, animatableModel, dataIndex, cb, during) { + var isFrom = false; + var removeOpt; + if (isFunction(dataIndex)) { + during = cb; + cb = dataIndex; + dataIndex = null; + } else if (isObject$2(dataIndex)) { + cb = dataIndex.cb; + during = dataIndex.during; + isFrom = dataIndex.isFrom; + removeOpt = dataIndex.removeOpt; + dataIndex = dataIndex.dataIndex; + } + var isRemove = animationType === 'leave'; + if (!isRemove) { + // Must stop the remove animation. + el.stopAnimation('leave'); + } + var animationConfig = getAnimationConfig(animationType, animatableModel, dataIndex, isRemove ? removeOpt || {} : null, animatableModel && animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null); + if (animationConfig && animationConfig.duration > 0) { + var duration = animationConfig.duration; + var animationDelay = animationConfig.delay; + var animationEasing = animationConfig.easing; + var animateConfig = { + duration: duration, + delay: animationDelay || 0, + easing: animationEasing, + done: cb, + force: !!cb || !!during, + // Set to final state in update/init animation. + // So the post processing based on the path shape can be done correctly. + setToFinal: !isRemove, + scope: animationType, + during: during + }; + isFrom ? el.animateFrom(props, animateConfig) : el.animateTo(props, animateConfig); + } else { + el.stopAnimation(); + // If `isFrom`, the props is the "from" props. + !isFrom && el.attr(props); + // Call during at least once. + during && during(1); + cb && cb(); + } +} +/** + * Update graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + * @example + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, dataIndex, function () { console.log('Animation done!'); }); + * // Or + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, function () { console.log('Animation done!'); }); + */ +function updateProps$1(el, props, +// TODO: TYPE AnimatableModel +animatableModel, dataIndex, cb, during) { + animateOrSetProps('update', el, props, animatableModel, dataIndex, cb, during); +} +/** + * Init graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + */ +function initProps(el, props, animatableModel, dataIndex, cb, during) { + animateOrSetProps('enter', el, props, animatableModel, dataIndex, cb, during); +} +/** + * If element is removed. + * It can determine if element is having remove animation. + */ +function isElementRemoved(el) { + if (!el.__zr) { + return true; + } + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + if (animator.scope === 'leave') { + return true; + } + } + return false; +} +/** + * Remove graphic element + */ +function removeElement(el, props, animatableModel, dataIndex, cb, during) { + // Don't do remove animation twice. + if (isElementRemoved(el)) { + return; + } + animateOrSetProps('leave', el, props, animatableModel, dataIndex, cb, during); +} +function fadeOutDisplayable(el, animatableModel, dataIndex, done) { + el.removeTextContent(); + el.removeTextGuideLine(); + removeElement(el, { + style: { + opacity: 0 + } + }, animatableModel, dataIndex, done); +} +function removeElementWithFadeOut(el, animatableModel, dataIndex) { + function doRemove() { + el.parent && el.parent.remove(el); + } + // Hide label and labelLine first + // TODO Also use fade out animation? + if (!el.isGroup) { + fadeOutDisplayable(el, animatableModel, dataIndex, doRemove); + } else { + el.traverse(function (disp) { + if (!disp.isGroup) { + // Can invoke doRemove multiple times. + fadeOutDisplayable(disp, animatableModel, dataIndex, doRemove); + } + }); + } +} +/** + * Save old style for style transition in universalTransition module. + * It's used when element will be reused in each render. + * For chart like map, heatmap, which will always create new element. + * We don't need to save this because universalTransition can get old style from the old element + */ +function saveOldStyle(el) { + transitionStore(el).oldStyle = el.style; +} + +var mathMax$1 = Math.max; +var mathMin$1 = Math.min; +var _customShapeMap = {}; +/** + * Extend shape with parameters + */ +function extendShape(opts) { + return Path.extend(opts); +} +var extendPathFromString = extendFromString; +/** + * Extend path + */ +function extendPath(pathData, opts) { + return extendPathFromString(pathData, opts); +} +/** + * Register a user defined shape. + * The shape class can be fetched by `getShapeClass` + * This method will overwrite the registered shapes, including + * the registered built-in shapes, if using the same `name`. + * The shape can be used in `custom series` and + * `graphic component` by declaring `{type: name}`. + * + * @param name + * @param ShapeClass Can be generated by `extendShape`. + */ +function registerShape(name, ShapeClass) { + _customShapeMap[name] = ShapeClass; +} +/** + * Find shape class registered by `registerShape`. Usually used in + * fetching user defined shape. + * + * [Caution]: + * (1) This method **MUST NOT be used inside echarts !!!**, unless it is prepared + * to use user registered shapes. + * Because the built-in shape (see `getBuiltInShape`) will be registered by + * `registerShape` by default. That enables users to get both built-in + * shapes as well as the shapes belonging to themsleves. But users can overwrite + * the built-in shapes by using names like 'circle', 'rect' via calling + * `registerShape`. So the echarts inner featrues should not fetch shapes from here + * in case that it is overwritten by users, except that some features, like + * `custom series`, `graphic component`, do it deliberately. + * + * (2) In the features like `custom series`, `graphic component`, the user input + * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic + * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names + * are reserved names, that is, if some user registers a shape named `'image'`, + * the shape will not be used. If we intending to add some more reserved names + * in feature, that might bring break changes (disable some existing user shape + * names). But that case probably rarely happens. So we don't make more mechanism + * to resolve this issue here. + * + * @param name + * @return The shape class. If not found, return nothing. + */ +function getShapeClass(name) { + if (_customShapeMap.hasOwnProperty(name)) { + return _customShapeMap[name]; + } +} +/** + * Create a path element from path data string + * @param pathData + * @param opts + * @param rect + * @param layout 'center' or 'cover' default to be cover + */ +function makePath(pathData, opts, rect, layout) { + var path = createFromString(pathData, opts); + if (rect) { + if (layout === 'center') { + rect = centerGraphic(rect, path.getBoundingRect()); + } + resizePath(path, rect); + } + return path; +} +/** + * Create a image element from image url + * @param imageUrl image url + * @param opts options + * @param rect constrain rect + * @param layout 'center' or 'cover'. Default to be 'cover' + */ +function makeImage(imageUrl, rect, layout) { + var zrImg = new ZRImage({ + style: { + image: imageUrl, + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + onload: function (img) { + if (layout === 'center') { + var boundingRect = { + width: img.width, + height: img.height + }; + zrImg.setStyle(centerGraphic(rect, boundingRect)); + } + } + }); + return zrImg; +} +/** + * Get position of centered element in bounding box. + * + * @param rect element local bounding box + * @param boundingRect constraint bounding box + * @return element position containing x, y, width, and height + */ +function centerGraphic(rect, boundingRect) { + // Set rect to center, keep width / height ratio. + var aspect = boundingRect.width / boundingRect.height; + var width = rect.height * aspect; + var height; + if (width <= rect.width) { + height = rect.height; + } else { + width = rect.width; + height = width / aspect; + } + var cx = rect.x + rect.width / 2; + var cy = rect.y + rect.height / 2; + return { + x: cx - width / 2, + y: cy - height / 2, + width: width, + height: height + }; +} +var mergePath = mergePath$1; +/** + * Resize a path to fit the rect + * @param path + * @param rect + */ +function resizePath(path, rect) { + if (!path.applyTransform) { + return; + } + var pathRect = path.getBoundingRect(); + var m = pathRect.calculateTransform(rect); + path.applyTransform(m); +} +/** + * Sub pixel optimize line for canvas + */ +function subPixelOptimizeLine(shape, lineWidth) { + subPixelOptimizeLine$1(shape, shape, { + lineWidth: lineWidth + }); + return shape; +} +/** + * Sub pixel optimize rect for canvas + */ +function subPixelOptimizeRect(param) { + subPixelOptimizeRect$1(param.shape, param.shape, param.style); + return param; +} +/** + * Sub pixel optimize for canvas + * + * @param position Coordinate, such as x, y + * @param lineWidth Should be nonnegative integer. + * @param positiveOrNegative Default false (negative). + * @return Optimized position. + */ +var subPixelOptimize = subPixelOptimize$1; +/** + * Get transform matrix of target (param target), + * in coordinate of its ancestor (param ancestor) + * + * @param target + * @param [ancestor] + */ +function getTransform(target, ancestor) { + var mat = identity([]); + while (target && target !== ancestor) { + mul(mat, target.getLocalTransform(), mat); + target = target.parent; + } + return mat; +} +/** + * Apply transform to an vertex. + * @param target [x, y] + * @param transform Can be: + * + Transform matrix: like [1, 0, 0, 1, 0, 0] + * + {position, rotation, scale}, the same as `zrender/Transformable`. + * @param invert Whether use invert matrix. + * @return [x, y] + */ +function applyTransform(target, transform, invert$1) { + if (transform && !isArrayLike(transform)) { + transform = Transformable.getLocalTransform(transform); + } + if (invert$1) { + transform = invert([], transform); + } + return applyTransform$1([], target, transform); +} +/** + * @param direction 'left' 'right' 'top' 'bottom' + * @param transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param invert Whether use invert matrix. + * @return Transformed direction. 'left' 'right' 'top' 'bottom' + */ +function transformDirection(direction, transform, invert) { + // Pick a base, ensure that transform result will not be (0, 0). + var hBase = transform[4] === 0 || transform[5] === 0 || transform[0] === 0 ? 1 : Math.abs(2 * transform[4] / transform[0]); + var vBase = transform[4] === 0 || transform[5] === 0 || transform[2] === 0 ? 1 : Math.abs(2 * transform[4] / transform[2]); + var vertex = [direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0]; + vertex = applyTransform(vertex, transform, invert); + return Math.abs(vertex[0]) > Math.abs(vertex[1]) ? vertex[0] > 0 ? 'right' : 'left' : vertex[1] > 0 ? 'bottom' : 'top'; +} +function isNotGroup(el) { + return !el.isGroup; +} +function isPath(el) { + return el.shape != null; +} +/** + * Apply group transition animation from g1 to g2. + * If no animatableModel, no animation. + */ +function groupTransition(g1, g2, animatableModel) { + if (!g1 || !g2) { + return; + } + function getElMap(g) { + var elMap = {}; + g.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + elMap[el.anid] = el; + } + }); + return elMap; + } + function getAnimatableProps(el) { + var obj = { + x: el.x, + y: el.y, + rotation: el.rotation + }; + if (isPath(el)) { + obj.shape = extend({}, el.shape); + } + return obj; + } + var elMap1 = getElMap(g1); + g2.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + var oldEl = elMap1[el.anid]; + if (oldEl) { + var newProp = getAnimatableProps(el); + el.attr(getAnimatableProps(oldEl)); + updateProps$1(el, newProp, animatableModel, getECData(el).dataIndex); + } + } + }); +} +function clipPointsByRect(points, rect) { + // FIXME: This way might be incorrect when graphic clipped by a corner + // and when element has a border. + return map$1(points, function (point) { + var x = point[0]; + x = mathMax$1(x, rect.x); + x = mathMin$1(x, rect.x + rect.width); + var y = point[1]; + y = mathMax$1(y, rect.y); + y = mathMin$1(y, rect.y + rect.height); + return [x, y]; + }); +} +/** + * Return a new clipped rect. If rect size are negative, return undefined. + */ +function clipRectByRect(targetRect, rect) { + var x = mathMax$1(targetRect.x, rect.x); + var x2 = mathMin$1(targetRect.x + targetRect.width, rect.x + rect.width); + var y = mathMax$1(targetRect.y, rect.y); + var y2 = mathMin$1(targetRect.y + targetRect.height, rect.y + rect.height); + // If the total rect is cliped, nothing, including the border, + // should be painted. So return undefined. + if (x2 >= x && y2 >= y) { + return { + x: x, + y: y, + width: x2 - x, + height: y2 - y + }; + } +} +function createIcon(iconStr, +// Support 'image://' or 'path://' or direct svg path. +opt, rect) { + var innerOpts = extend({ + rectHover: true + }, opt); + var style = innerOpts.style = { + strokeNoScale: true + }; + rect = rect || { + x: -1, + y: -1, + width: 2, + height: 2 + }; + if (iconStr) { + return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZRImage(innerOpts)) : makePath(iconStr.replace('path://', ''), innerOpts, rect, 'center'); + } +} +/** + * Return `true` if the given line (line `a`) and the given polygon + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ +function linePolygonIntersect(a1x, a1y, a2x, a2y, points) { + for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) { + var p = points[i]; + if (lineLineIntersect(a1x, a1y, a2x, a2y, p[0], p[1], p2[0], p2[1])) { + return true; + } + p2 = p; + } +} +/** + * Return `true` if the given two lines (line `a` and line `b`) + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ +function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { + // let `vec_m` to be `vec_a2 - vec_a1` and `vec_n` to be `vec_b2 - vec_b1`. + var mx = a2x - a1x; + var my = a2y - a1y; + var nx = b2x - b1x; + var ny = b2y - b1y; + // `vec_m` and `vec_n` are parallel iff + // existing `k` such that `vec_m = k · vec_n`, equivalent to `vec_m X vec_n = 0`. + var nmCrossProduct = crossProduct2d(nx, ny, mx, my); + if (nearZero(nmCrossProduct)) { + return false; + } + // `vec_m` and `vec_n` are intersect iff + // existing `p` and `q` in [0, 1] such that `vec_a1 + p * vec_m = vec_b1 + q * vec_n`, + // such that `q = ((vec_a1 - vec_b1) X vec_m) / (vec_n X vec_m)` + // and `p = ((vec_a1 - vec_b1) X vec_n) / (vec_n X vec_m)`. + var b1a1x = a1x - b1x; + var b1a1y = a1y - b1y; + var q = crossProduct2d(b1a1x, b1a1y, mx, my) / nmCrossProduct; + if (q < 0 || q > 1) { + return false; + } + var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct; + if (p < 0 || p > 1) { + return false; + } + return true; +} +/** + * Cross product of 2-dimension vector. + */ +function crossProduct2d(x1, y1, x2, y2) { + return x1 * y2 - x2 * y1; +} +function nearZero(val) { + return val <= 1e-6 && val >= -1e-6; +} +function setTooltipConfig(opt) { + var itemTooltipOption = opt.itemTooltipOption; + var componentModel = opt.componentModel; + var itemName = opt.itemName; + var itemTooltipOptionObj = isString(itemTooltipOption) ? { + formatter: itemTooltipOption + } : itemTooltipOption; + var mainType = componentModel.mainType; + var componentIndex = componentModel.componentIndex; + var formatterParams = { + componentType: mainType, + name: itemName, + $vars: ['name'] + }; + formatterParams[mainType + 'Index'] = componentIndex; + var formatterParamsExtra = opt.formatterParamsExtra; + if (formatterParamsExtra) { + each$4(keys(formatterParamsExtra), function (key) { + if (!hasOwn(formatterParams, key)) { + formatterParams[key] = formatterParamsExtra[key]; + formatterParams.$vars.push(key); + } + }); + } + var ecData = getECData(opt.el); + ecData.componentMainType = mainType; + ecData.componentIndex = componentIndex; + ecData.tooltipConfig = { + name: itemName, + option: defaults({ + content: itemName, + encodeHTMLContent: true, + formatterParams: formatterParams + }, itemTooltipOptionObj) + }; +} +function traverseElement(el, cb) { + var stopped; + // TODO + // Polyfill for fixing zrender group traverse don't visit it's root issue. + if (el.isGroup) { + stopped = cb(el); + } + if (!stopped) { + el.traverse(cb); + } +} +function traverseElements(els, cb) { + if (els) { + if (isArray(els)) { + for (var i = 0; i < els.length; i++) { + traverseElement(els[i], cb); + } + } else { + traverseElement(els, cb); + } + } +} +// Register built-in shapes. These shapes might be overwritten +// by users, although we do not recommend that. +registerShape('circle', Circle); +registerShape('ellipse', Ellipse); +registerShape('sector', Sector); +registerShape('ring', Ring); +registerShape('polygon', Polygon); +registerShape('polyline', Polyline); +registerShape('rect', Rect); +registerShape('line', Line); +registerShape('bezierCurve', BezierCurve); +registerShape('arc', Arc); + +const graphic = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ + __proto__: null, + Arc, + BezierCurve, + BoundingRect, + Circle, + CompoundPath, + Ellipse, + Group: Group$2, + Image: ZRImage, + IncrementalDisplayable, + Line, + LinearGradient, + OrientedBoundingRect, + Path, + Point, + Polygon, + Polyline, + RadialGradient, + Rect, + Ring, + Sector, + Text: ZRText, + applyTransform, + clipPointsByRect, + clipRectByRect, + createIcon, + extendPath, + extendShape, + getShapeClass, + getTransform, + groupTransition, + initProps, + isElementRemoved, + lineLineIntersect, + linePolygonIntersect, + makeImage, + makePath, + mergePath, + registerShape, + removeElement, + removeElementWithFadeOut, + resizePath, + setTooltipConfig, + subPixelOptimize, + subPixelOptimizeLine, + subPixelOptimizeRect, + transformDirection, + traverseElements, + updateProps: updateProps$1 +}, Symbol.toStringTag, { value: 'Module' })); + +var EMPTY_OBJ = {}; +function setLabelText(label, labelTexts) { + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var text = labelTexts[stateName]; + var state = label.ensureState(stateName); + state.style = state.style || {}; + state.style.text = text; + } + var oldStates = label.currentStates.slice(); + label.clearStates(true); + label.setStyle({ + text: labelTexts.normal + }); + label.useStates(oldStates, true); +} +function getLabelText(opt, stateModels, interpolatedValue) { + var labelFetcher = opt.labelFetcher; + var labelDataIndex = opt.labelDataIndex; + var labelDimIndex = opt.labelDimIndex; + var normalModel = stateModels.normal; + var baseText; + if (labelFetcher) { + baseText = labelFetcher.getFormattedLabel(labelDataIndex, "normal", null, labelDimIndex, normalModel && normalModel.get("formatter"), interpolatedValue != null ? { + interpolatedValue + } : null); + } + if (baseText == null) { + baseText = isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt, interpolatedValue) : opt.defaultText; + } + var statesText = { + normal: baseText + }; + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = stateModels[stateName]; + statesText[stateName] = retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, stateName, null, labelDimIndex, stateModel && stateModel.get("formatter")) : null, baseText); + } + return statesText; +} +function setLabelStyle(targetEl, labelStatesModels, opt, stateSpecified) { + opt = opt || EMPTY_OBJ; + var isSetOnText = targetEl instanceof ZRText; + var needsCreateText = false; + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateModel = labelStatesModels[DISPLAY_STATES[i]]; + if (stateModel && stateModel.getShallow("show")) { + needsCreateText = true; + break; + } + } + var textContent = isSetOnText ? targetEl : targetEl.getTextContent(); + if (needsCreateText) { + if (!isSetOnText) { + if (!textContent) { + textContent = new ZRText(); + targetEl.setTextContent(textContent); + } + if (targetEl.stateProxy) { + textContent.stateProxy = targetEl.stateProxy; + } + } + var labelStatesTexts = getLabelText(opt, labelStatesModels); + var normalModel = labelStatesModels.normal; + var showNormal = !!normalModel.getShallow("show"); + var normalStyle = createTextStyle(normalModel, stateSpecified && stateSpecified.normal, opt, false, !isSetOnText); + normalStyle.text = labelStatesTexts.normal; + if (!isSetOnText) { + targetEl.setTextConfig(createTextConfig(normalModel, opt, false)); + } + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = labelStatesModels[stateName]; + if (stateModel) { + var stateObj = textContent.ensureState(stateName); + var stateShow = !!retrieve2(stateModel.getShallow("show"), showNormal); + if (stateShow !== showNormal) { + stateObj.ignore = !stateShow; + } + stateObj.style = createTextStyle(stateModel, stateSpecified && stateSpecified[stateName], opt, true, !isSetOnText); + stateObj.style.text = labelStatesTexts[stateName]; + if (!isSetOnText) { + var targetElEmphasisState = targetEl.ensureState(stateName); + targetElEmphasisState.textConfig = createTextConfig(stateModel, opt, true); + } + } + } + textContent.silent = !!normalModel.getShallow("silent"); + if (textContent.style.x != null) { + normalStyle.x = textContent.style.x; + } + if (textContent.style.y != null) { + normalStyle.y = textContent.style.y; + } + textContent.ignore = !showNormal; + textContent.useStyle(normalStyle); + textContent.dirty(); + if (opt.enableTextSetter) { + labelInner(textContent).setLabelText = function(interpolatedValue) { + var labelStatesTexts2 = getLabelText(opt, labelStatesModels, interpolatedValue); + setLabelText(textContent, labelStatesTexts2); + }; + } + } else if (textContent) { + textContent.ignore = true; + } + targetEl.dirty(); +} +function getLabelStatesModels(itemModel, labelName) { + labelName = labelName || "label"; + var statesModels = { + normal: itemModel.getModel(labelName) + }; + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelName]); + } + return statesModels; +} +function createTextStyle(textStyleModel, specifiedTextStyle, opt, isNotNormal, isAttached) { + var textStyle = {}; + setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached); + specifiedTextStyle && extend(textStyle, specifiedTextStyle); + return textStyle; +} +function createTextConfig(textStyleModel, opt, isNotNormal) { + opt = opt || {}; + var textConfig = {}; + var labelPosition; + var labelRotate = textStyleModel.getShallow("rotate"); + var labelDistance = retrieve2(textStyleModel.getShallow("distance"), isNotNormal ? null : 5); + var labelOffset = textStyleModel.getShallow("offset"); + labelPosition = textStyleModel.getShallow("position") || (isNotNormal ? null : "inside"); + labelPosition === "outside" && (labelPosition = opt.defaultOutsidePosition || "top"); + if (labelPosition != null) { + textConfig.position = labelPosition; + } + if (labelOffset != null) { + textConfig.offset = labelOffset; + } + if (labelRotate != null) { + labelRotate *= Math.PI / 180; + textConfig.rotation = labelRotate; + } + if (labelDistance != null) { + textConfig.distance = labelDistance; + } + textConfig.outsideFill = textStyleModel.get("color") === "inherit" ? opt.inheritColor || null : "auto"; + return textConfig; +} +function setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached) { + opt = opt || EMPTY_OBJ; + var ecModel = textStyleModel.ecModel; + var globalTextStyle = ecModel && ecModel.option.textStyle; + var richItemNames = getRichItemNames(textStyleModel); + var richResult; + if (richItemNames) { + richResult = {}; + for (var name_1 in richItemNames) { + if (richItemNames.hasOwnProperty(name_1)) { + var richTextStyle = textStyleModel.getModel(["rich", name_1]); + setTokenTextStyle(richResult[name_1] = {}, richTextStyle, globalTextStyle, opt, isNotNormal, isAttached, false, true); + } + } + } + if (richResult) { + textStyle.rich = richResult; + } + var overflow = textStyleModel.get("overflow"); + if (overflow) { + textStyle.overflow = overflow; + } + var margin = textStyleModel.get("minMargin"); + if (margin != null) { + textStyle.margin = margin; + } + setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, true, false); +} +function getRichItemNames(textStyleModel) { + var richItemNameMap; + while (textStyleModel && textStyleModel !== textStyleModel.ecModel) { + var rich = (textStyleModel.option || EMPTY_OBJ).rich; + if (rich) { + richItemNameMap = richItemNameMap || {}; + var richKeys = keys(rich); + for (var i = 0; i < richKeys.length; i++) { + var richKey = richKeys[i]; + richItemNameMap[richKey] = 1; + } + } + textStyleModel = textStyleModel.parentModel; + } + return richItemNameMap; +} +var TEXT_PROPS_WITH_GLOBAL = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "textShadowColor", "textShadowBlur", "textShadowOffsetX", "textShadowOffsetY"]; +var TEXT_PROPS_SELF = ["align", "lineHeight", "width", "height", "tag", "verticalAlign", "ellipsis"]; +var TEXT_PROPS_BOX = ["padding", "borderWidth", "borderRadius", "borderDashOffset", "backgroundColor", "borderColor", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"]; +function setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, isBlock, inRich) { + globalTextStyle = !isNotNormal && globalTextStyle || EMPTY_OBJ; + var inheritColor = opt && opt.inheritColor; + var fillColor = textStyleModel.getShallow("color"); + var strokeColor = textStyleModel.getShallow("textBorderColor"); + var opacity = retrieve2(textStyleModel.getShallow("opacity"), globalTextStyle.opacity); + if (fillColor === "inherit" || fillColor === "auto") { + if (inheritColor) { + fillColor = inheritColor; + } else { + fillColor = null; + } + } + if (strokeColor === "inherit" || strokeColor === "auto") { + if (inheritColor) { + strokeColor = inheritColor; + } else { + strokeColor = null; + } + } + if (!isAttached) { + fillColor = fillColor || globalTextStyle.color; + strokeColor = strokeColor || globalTextStyle.textBorderColor; + } + if (fillColor != null) { + textStyle.fill = fillColor; + } + if (strokeColor != null) { + textStyle.stroke = strokeColor; + } + var textBorderWidth = retrieve2(textStyleModel.getShallow("textBorderWidth"), globalTextStyle.textBorderWidth); + if (textBorderWidth != null) { + textStyle.lineWidth = textBorderWidth; + } + var textBorderType = retrieve2(textStyleModel.getShallow("textBorderType"), globalTextStyle.textBorderType); + if (textBorderType != null) { + textStyle.lineDash = textBorderType; + } + var textBorderDashOffset = retrieve2(textStyleModel.getShallow("textBorderDashOffset"), globalTextStyle.textBorderDashOffset); + if (textBorderDashOffset != null) { + textStyle.lineDashOffset = textBorderDashOffset; + } + if (!isNotNormal && opacity == null && !inRich) { + opacity = opt && opt.defaultOpacity; + } + if (opacity != null) { + textStyle.opacity = opacity; + } + if (!isNotNormal && !isAttached) { + if (textStyle.fill == null && opt.inheritColor) { + textStyle.fill = opt.inheritColor; + } + } + for (var i = 0; i < TEXT_PROPS_WITH_GLOBAL.length; i++) { + var key = TEXT_PROPS_WITH_GLOBAL[i]; + var val = retrieve2(textStyleModel.getShallow(key), globalTextStyle[key]); + if (val != null) { + textStyle[key] = val; + } + } + for (var i = 0; i < TEXT_PROPS_SELF.length; i++) { + var key = TEXT_PROPS_SELF[i]; + var val = textStyleModel.getShallow(key); + if (val != null) { + textStyle[key] = val; + } + } + if (textStyle.verticalAlign == null) { + var baseline = textStyleModel.getShallow("baseline"); + if (baseline != null) { + textStyle.verticalAlign = baseline; + } + } + if (!isBlock || !opt.disableBox) { + for (var i = 0; i < TEXT_PROPS_BOX.length; i++) { + var key = TEXT_PROPS_BOX[i]; + var val = textStyleModel.getShallow(key); + if (val != null) { + textStyle[key] = val; + } + } + var borderType = textStyleModel.getShallow("borderType"); + if (borderType != null) { + textStyle.borderDash = borderType; + } + if ((textStyle.backgroundColor === "auto" || textStyle.backgroundColor === "inherit") && inheritColor) { + textStyle.backgroundColor = inheritColor; + } + if ((textStyle.borderColor === "auto" || textStyle.borderColor === "inherit") && inheritColor) { + textStyle.borderColor = inheritColor; + } + } +} +function getFont(opt, ecModel) { + var gTextStyleModel = ecModel && ecModel.getModel("textStyle"); + return trim([ + // FIXME in node-canvas fontWeight is before fontStyle + opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow("fontStyle") || "", + opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow("fontWeight") || "", + (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow("fontSize") || 12) + "px", + opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow("fontFamily") || "sans-serif" + ].join(" ")); +} +var labelInner = makeInner(); + +var PATH_COLOR = ['textStyle', 'color']; +var textStyleParams = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'padding', 'lineHeight', 'rich', 'width', 'height', 'overflow']; +// TODO Performance improvement? +var tmpText = new ZRText(); +var TextStyleMixin = /** @class */function () { + function TextStyleMixin() {} + /** + * Get color property or get color from option.textStyle.color + */ + // TODO Callback + TextStyleMixin.prototype.getTextColor = function (isEmphasis) { + var ecModel = this.ecModel; + return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null); + }; + /** + * Create font string from fontStyle, fontWeight, fontSize, fontFamily + * @return {string} + */ + TextStyleMixin.prototype.getFont = function () { + return getFont({ + fontStyle: this.getShallow('fontStyle'), + fontWeight: this.getShallow('fontWeight'), + fontSize: this.getShallow('fontSize'), + fontFamily: this.getShallow('fontFamily') + }, this.ecModel); + }; + TextStyleMixin.prototype.getTextRect = function (text) { + var style = { + text: text, + verticalAlign: this.getShallow('verticalAlign') || this.getShallow('baseline') + }; + for (var i = 0; i < textStyleParams.length; i++) { + style[textStyleParams[i]] = this.getShallow(textStyleParams[i]); + } + tmpText.useStyle(style); + tmpText.update(); + return tmpText.getBoundingRect(); + }; + return TextStyleMixin; +}(); + +var LINE_STYLE_KEY_MAP = [['lineWidth', 'width'], ['stroke', 'color'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'type'], ['lineDashOffset', 'dashOffset'], ['lineCap', 'cap'], ['lineJoin', 'join'], ['miterLimit'] +// Option decal is in `DecalObject` but style.decal is in `PatternObject`. +// So do not transfer decal directly. +]; +var getLineStyle = makeStyleMapper(LINE_STYLE_KEY_MAP); +var LineStyleMixin = /** @class */function () { + function LineStyleMixin() {} + LineStyleMixin.prototype.getLineStyle = function (excludes) { + return getLineStyle(this, excludes); + }; + return LineStyleMixin; +}(); + +var ITEM_STYLE_KEY_MAP = [['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'borderType'], ['lineDashOffset', 'borderDashOffset'], ['lineCap', 'borderCap'], ['lineJoin', 'borderJoin'], ['miterLimit', 'borderMiterLimit'] +// Option decal is in `DecalObject` but style.decal is in `PatternObject`. +// So do not transfer decal directly. +]; +var getItemStyle = makeStyleMapper(ITEM_STYLE_KEY_MAP); +var ItemStyleMixin = /** @class */function () { + function ItemStyleMixin() {} + ItemStyleMixin.prototype.getItemStyle = function (excludes, includes) { + return getItemStyle(this, excludes, includes); + }; + return ItemStyleMixin; +}(); + +var Model = /** @class */function () { + function Model(option, parentModel, ecModel) { + this.parentModel = parentModel; + this.ecModel = ecModel; + this.option = option; + // Simple optimization + // if (this.init) { + // if (arguments.length <= 4) { + // this.init(option, parentModel, ecModel, extraOpt); + // } + // else { + // this.init.apply(this, arguments); + // } + // } + } + Model.prototype.init = function (option, parentModel, ecModel) { + }; + /** + * Merge the input option to me. + */ + Model.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + }; + // `path` can be 'a.b.c', so the return value type have to be `ModelOption` + // TODO: TYPE strict key check? + // get(path: string | string[], ignoreParent?: boolean): ModelOption; + Model.prototype.get = function (path, ignoreParent) { + if (path == null) { + return this.option; + } + return this._doGet(this.parsePath(path), !ignoreParent && this.parentModel); + }; + Model.prototype.getShallow = function (key, ignoreParent) { + var option = this.option; + var val = option == null ? option : option[key]; + if (val == null && !ignoreParent) { + var parentModel = this.parentModel; + if (parentModel) { + // FIXME:TS do not know how to make it works + val = parentModel.getShallow(key); + } + } + return val; + }; + // `path` can be 'a.b.c', so the return value type have to be `Model` + // getModel(path: string | string[], parentModel?: Model): Model; + // TODO 'a.b.c' is deprecated + Model.prototype.getModel = function (path, parentModel) { + var hasPath = path != null; + var pathFinal = hasPath ? this.parsePath(path) : null; + var obj = hasPath ? this._doGet(pathFinal) : this.option; + parentModel = parentModel || this.parentModel && this.parentModel.getModel(this.resolveParentPath(pathFinal)); + return new Model(obj, parentModel, this.ecModel); + }; + /** + * If model has option + */ + Model.prototype.isEmpty = function () { + return this.option == null; + }; + Model.prototype.restoreData = function () {}; + // Pending + Model.prototype.clone = function () { + var Ctor = this.constructor; + return new Ctor(clone$2(this.option)); + }; + // setReadOnly(properties): void { + // clazzUtil.setReadOnly(this, properties); + // } + // If path is null/undefined, return null/undefined. + Model.prototype.parsePath = function (path) { + if (typeof path === 'string') { + return path.split('.'); + } + return path; + }; + // Resolve path for parent. Perhaps useful when parent use a different property. + // Default to be a identity resolver. + // Can be modified to a different resolver. + Model.prototype.resolveParentPath = function (path) { + return path; + }; + // FIXME:TS check whether put this method here + Model.prototype.isAnimationEnabled = function () { + if (!env.node && this.option) { + if (this.option.animation != null) { + return !!this.option.animation; + } else if (this.parentModel) { + return this.parentModel.isAnimationEnabled(); + } + } + }; + Model.prototype._doGet = function (pathArr, parentModel) { + var obj = this.option; + if (!pathArr) { + return obj; + } + for (var i = 0; i < pathArr.length; i++) { + // Ignore empty + if (!pathArr[i]) { + continue; + } + // obj could be number/string/... (like 0) + obj = obj && typeof obj === 'object' ? obj[pathArr[i]] : null; + if (obj == null) { + break; + } + } + if (obj == null && parentModel) { + obj = parentModel._doGet(this.resolveParentPath(pathArr), parentModel.parentModel); + } + return obj; + }; + return Model; +}(); +// Enable Model.extend. +enableClassExtend(Model); +enableClassCheck(Model); +mixin(Model, LineStyleMixin); +mixin(Model, ItemStyleMixin); +mixin(Model, AreaStyleMixin); +mixin(Model, TextStyleMixin); + +var base = Math.round(Math.random() * 10); +function getUID(type) { + return [type || "", base++].join("_"); +} +function enableSubTypeDefaulter(target) { + var subTypeDefaulters = {}; + target.registerSubTypeDefaulter = function(componentType, defaulter) { + var componentTypeInfo = parseClassType(componentType); + subTypeDefaulters[componentTypeInfo.main] = defaulter; + }; + target.determineSubType = function(componentType, option) { + var type = option.type; + if (!type) { + var componentTypeMain = parseClassType(componentType).main; + if (target.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { + type = subTypeDefaulters[componentTypeMain](option); + } + } + return type; + }; +} +function enableTopologicalTravel(entity, dependencyGetter) { + entity.topologicalTravel = function(targetNameList, fullNameList, callback, context) { + if (!targetNameList.length) { + return; + } + var result = makeDepndencyGraph(fullNameList); + var graph = result.graph; + var noEntryList = result.noEntryList; + var targetNameSet = {}; + each$4(targetNameList, function(name) { + targetNameSet[name] = true; + }); + while (noEntryList.length) { + var currComponentType = noEntryList.pop(); + var currVertex = graph[currComponentType]; + var isInTargetNameSet = !!targetNameSet[currComponentType]; + if (isInTargetNameSet) { + callback.call(context, currComponentType, currVertex.originalDeps.slice()); + delete targetNameSet[currComponentType]; + } + each$4(currVertex.successor, isInTargetNameSet ? removeEdgeAndAdd : removeEdge); + } + each$4(targetNameSet, function() { + var errMsg = ""; + throw new Error(errMsg); + }); + function removeEdge(succComponentType) { + graph[succComponentType].entryCount--; + if (graph[succComponentType].entryCount === 0) { + noEntryList.push(succComponentType); + } + } + function removeEdgeAndAdd(succComponentType) { + targetNameSet[succComponentType] = true; + removeEdge(succComponentType); + } + }; + function makeDepndencyGraph(fullNameList) { + var graph = {}; + var noEntryList = []; + each$4(fullNameList, function(name) { + var thisItem = createDependencyGraphItem(graph, name); + var originalDeps = thisItem.originalDeps = dependencyGetter(name); + var availableDeps = getAvailableDependencies(originalDeps, fullNameList); + thisItem.entryCount = availableDeps.length; + if (thisItem.entryCount === 0) { + noEntryList.push(name); + } + each$4(availableDeps, function(dependentName) { + if (indexOf(thisItem.predecessor, dependentName) < 0) { + thisItem.predecessor.push(dependentName); + } + var thatItem = createDependencyGraphItem(graph, dependentName); + if (indexOf(thatItem.successor, dependentName) < 0) { + thatItem.successor.push(name); + } + }); + }); + return { + graph, + noEntryList + }; + } + function createDependencyGraphItem(graph, name) { + if (!graph[name]) { + graph[name] = { + predecessor: [], + successor: [] + }; + } + return graph[name]; + } + function getAvailableDependencies(originalDeps, fullNameList) { + var availableDeps = []; + each$4(originalDeps, function(dep) { + indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); + }); + return availableDeps; + } +} +function inheritDefaultOption(superOption, subOption) { + return merge(merge({}, superOption, true), subOption, true); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/** + * Language: English. + */ +const langEN = { + time: { + month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + monthAbbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayOfWeek: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayOfWeekAbbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] + }, + legend: { + selector: { + all: 'All', + inverse: 'Inv' + } + }, + toolbox: { + brush: { + title: { + rect: 'Box Select', + polygon: 'Lasso Select', + lineX: 'Horizontally Select', + lineY: 'Vertically Select', + keep: 'Keep Selections', + clear: 'Clear Selections' + } + }, + dataView: { + title: 'Data View', + lang: ['Data View', 'Close', 'Refresh'] + }, + dataZoom: { + title: { + zoom: 'Zoom', + back: 'Zoom Reset' + } + }, + magicType: { + title: { + line: 'Switch to Line Chart', + bar: 'Switch to Bar Chart', + stack: 'Stack', + tiled: 'Tile' + } + }, + restore: { + title: 'Restore' + }, + saveAsImage: { + title: 'Save as Image', + lang: ['Right Click to Save Image'] + } + }, + series: { + typeNames: { + pie: 'Pie chart', + bar: 'Bar chart', + line: 'Line chart', + scatter: 'Scatter plot', + effectScatter: 'Ripple scatter plot', + radar: 'Radar chart', + tree: 'Tree', + treemap: 'Treemap', + boxplot: 'Boxplot', + candlestick: 'Candlestick', + k: 'K line chart', + heatmap: 'Heat map', + map: 'Map', + parallel: 'Parallel coordinate map', + lines: 'Line graph', + graph: 'Relationship graph', + sankey: 'Sankey diagram', + funnel: 'Funnel chart', + gauge: 'Gauge', + pictorialBar: 'Pictorial bar', + themeRiver: 'Theme River Map', + sunburst: 'Sunburst', + custom: 'Custom chart', + chart: 'Chart' + } + }, + aria: { + general: { + withTitle: 'This is a chart about "{title}"', + withoutTitle: 'This is a chart' + }, + series: { + single: { + prefix: '', + withName: ' with type {seriesType} named {seriesName}.', + withoutName: ' with type {seriesType}.' + }, + multiple: { + prefix: '. It consists of {seriesCount} series count.', + withName: ' The {seriesId} series is a {seriesType} representing {seriesName}.', + withoutName: ' The {seriesId} series is a {seriesType}.', + separator: { + middle: '', + end: '' + } + } + }, + data: { + allData: 'The data is as follows: ', + partialData: 'The first {displayCnt} items are: ', + withName: 'the data for {name} is {value}', + withoutName: '{value}', + separator: { + middle: ', ', + end: '. ' + } + } + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +const langZH = { + time: { + month: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + monthAbbr: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + dayOfWeek: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + dayOfWeekAbbr: ['日', '一', '二', '三', '四', '五', '六'] + }, + legend: { + selector: { + all: '全选', + inverse: '反选' + } + }, + toolbox: { + brush: { + title: { + rect: '矩形选择', + polygon: '圈选', + lineX: '横向选择', + lineY: '纵向选择', + keep: '保持选择', + clear: '清除选择' + } + }, + dataView: { + title: '数据视图', + lang: ['数据视图', '关闭', '刷新'] + }, + dataZoom: { + title: { + zoom: '区域缩放', + back: '区域缩放还原' + } + }, + magicType: { + title: { + line: '切换为折线图', + bar: '切换为柱状图', + stack: '切换为堆叠', + tiled: '切换为平铺' + } + }, + restore: { + title: '还原' + }, + saveAsImage: { + title: '保存为图片', + lang: ['右键另存为图片'] + } + }, + series: { + typeNames: { + pie: '饼图', + bar: '柱状图', + line: '折线图', + scatter: '散点图', + effectScatter: '涟漪散点图', + radar: '雷达图', + tree: '树图', + treemap: '矩形树图', + boxplot: '箱型图', + candlestick: 'K线图', + k: 'K线图', + heatmap: '热力图', + map: '地图', + parallel: '平行坐标图', + lines: '线图', + graph: '关系图', + sankey: '桑基图', + funnel: '漏斗图', + gauge: '仪表盘图', + pictorialBar: '象形柱图', + themeRiver: '主题河流图', + sunburst: '旭日图', + custom: '自定义图表', + chart: '图表' + } + }, + aria: { + general: { + withTitle: '这是一个关于“{title}”的图表。', + withoutTitle: '这是一个图表,' + }, + series: { + single: { + prefix: '', + withName: '图表类型是{seriesType},表示{seriesName}。', + withoutName: '图表类型是{seriesType}。' + }, + multiple: { + prefix: '它由{seriesCount}个图表系列组成。', + withName: '第{seriesId}个系列是一个表示{seriesName}的{seriesType},', + withoutName: '第{seriesId}个系列是一个{seriesType},', + separator: { + middle: ';', + end: '。' + } + } + }, + data: { + allData: '其数据是——', + partialData: '其中,前{displayCnt}项是——', + withName: '{name}的数据是{value}', + withoutName: '{value}', + separator: { + middle: ',', + end: '' + } + } + } +}; + +var LOCALE_ZH = 'ZH'; +var LOCALE_EN = 'EN'; +var DEFAULT_LOCALE = LOCALE_EN; +var localeStorage = {}; +var localeModels = {}; +var SYSTEM_LANG = !env.domSupported ? DEFAULT_LOCALE : function () { + var langStr = (/* eslint-disable-next-line */ + document.documentElement.lang || navigator.language || navigator.browserLanguage || DEFAULT_LOCALE).toUpperCase(); + return langStr.indexOf(LOCALE_ZH) > -1 ? LOCALE_ZH : DEFAULT_LOCALE; +}(); +function registerLocale(locale, localeObj) { + locale = locale.toUpperCase(); + localeModels[locale] = new Model(localeObj); + localeStorage[locale] = localeObj; +} +// export function getLocale(locale: string) { +// return localeStorage[locale]; +// } +function createLocaleObject(locale) { + if (isString(locale)) { + var localeObj = localeStorage[locale.toUpperCase()] || {}; + if (locale === LOCALE_ZH || locale === LOCALE_EN) { + return clone$2(localeObj); + } else { + return merge(clone$2(localeObj), clone$2(localeStorage[DEFAULT_LOCALE]), false); + } + } else { + return merge(clone$2(locale), clone$2(localeStorage[DEFAULT_LOCALE]), false); + } +} +function getLocaleModel(lang) { + return localeModels[lang]; +} +function getDefaultLocaleModel() { + return localeModels[DEFAULT_LOCALE]; +} +// Default locale +registerLocale(LOCALE_EN, langEN); +registerLocale(LOCALE_ZH, langZH); + +var ONE_SECOND = 1000; +var ONE_MINUTE = ONE_SECOND * 60; +var ONE_HOUR = ONE_MINUTE * 60; +var ONE_DAY = ONE_HOUR * 24; +var ONE_YEAR = ONE_DAY * 365; +var defaultLeveledFormatter = { + year: '{yyyy}', + month: '{MMM}', + day: '{d}', + hour: '{HH}:{mm}', + minute: '{HH}:{mm}', + second: '{HH}:{mm}:{ss}', + millisecond: '{HH}:{mm}:{ss} {SSS}', + none: '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}' +}; +var fullDayFormatter = '{yyyy}-{MM}-{dd}'; +var fullLeveledFormatter = { + year: '{yyyy}', + month: '{yyyy}-{MM}', + day: fullDayFormatter, + hour: fullDayFormatter + ' ' + defaultLeveledFormatter.hour, + minute: fullDayFormatter + ' ' + defaultLeveledFormatter.minute, + second: fullDayFormatter + ' ' + defaultLeveledFormatter.second, + millisecond: defaultLeveledFormatter.none +}; +var primaryTimeUnits = ['year', 'month', 'day', 'hour', 'minute', 'second', 'millisecond']; +var timeUnits = ['year', 'half-year', 'quarter', 'month', 'week', 'half-week', 'day', 'half-day', 'quarter-day', 'hour', 'minute', 'second', 'millisecond']; +function pad(str, len) { + str += ''; + return '0000'.substr(0, len - str.length) + str; +} +function getPrimaryTimeUnit(timeUnit) { + switch (timeUnit) { + case 'half-year': + case 'quarter': + return 'month'; + case 'week': + case 'half-week': + return 'day'; + case 'half-day': + case 'quarter-day': + return 'hour'; + default: + // year, minutes, second, milliseconds + return timeUnit; + } +} +function isPrimaryTimeUnit(timeUnit) { + return timeUnit === getPrimaryTimeUnit(timeUnit); +} +function getDefaultFormatPrecisionOfInterval(timeUnit) { + switch (timeUnit) { + case 'year': + case 'month': + return 'day'; + case 'millisecond': + return 'millisecond'; + default: + // Also for day, hour, minute, second + return 'second'; + } +} +function format( +// Note: The result based on `isUTC` are totally different, which can not be just simply +// substituted by the result without `isUTC`. So we make the param `isUTC` mandatory. +time, template, isUTC, lang) { + var date = parseDate(time); + var y = date[fullYearGetterName(isUTC)](); + var M = date[monthGetterName(isUTC)]() + 1; + var q = Math.floor((M - 1) / 3) + 1; + var d = date[dateGetterName(isUTC)](); + var e = date['get' + (isUTC ? 'UTC' : '') + 'Day'](); + var H = date[hoursGetterName(isUTC)](); + var h = (H - 1) % 12 + 1; + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var a = H >= 12 ? 'pm' : 'am'; + var A = a.toUpperCase(); + var localeModel = lang instanceof Model ? lang : getLocaleModel(lang || SYSTEM_LANG) || getDefaultLocaleModel(); + var timeModel = localeModel.getModel('time'); + var month = timeModel.get('month'); + var monthAbbr = timeModel.get('monthAbbr'); + var dayOfWeek = timeModel.get('dayOfWeek'); + var dayOfWeekAbbr = timeModel.get('dayOfWeekAbbr'); + return (template || '').replace(/{a}/g, a + '').replace(/{A}/g, A + '').replace(/{yyyy}/g, y + '').replace(/{yy}/g, pad(y % 100 + '', 2)).replace(/{Q}/g, q + '').replace(/{MMMM}/g, month[M - 1]).replace(/{MMM}/g, monthAbbr[M - 1]).replace(/{MM}/g, pad(M, 2)).replace(/{M}/g, M + '').replace(/{dd}/g, pad(d, 2)).replace(/{d}/g, d + '').replace(/{eeee}/g, dayOfWeek[e]).replace(/{ee}/g, dayOfWeekAbbr[e]).replace(/{e}/g, e + '').replace(/{HH}/g, pad(H, 2)).replace(/{H}/g, H + '').replace(/{hh}/g, pad(h + '', 2)).replace(/{h}/g, h + '').replace(/{mm}/g, pad(m, 2)).replace(/{m}/g, m + '').replace(/{ss}/g, pad(s, 2)).replace(/{s}/g, s + '').replace(/{SSS}/g, pad(S, 3)).replace(/{S}/g, S + ''); +} +function leveledFormat(tick, idx, formatter, lang, isUTC) { + var template = null; + if (isString(formatter)) { + // Single formatter for all units at all levels + template = formatter; + } else if (isFunction(formatter)) { + // Callback formatter + template = formatter(tick.value, idx, { + level: tick.level + }); + } else { + var defaults$1 = extend({}, defaultLeveledFormatter); + if (tick.level > 0) { + for (var i = 0; i < primaryTimeUnits.length; ++i) { + defaults$1[primaryTimeUnits[i]] = "{primary|" + defaults$1[primaryTimeUnits[i]] + "}"; + } + } + var mergedFormatter = formatter ? formatter.inherit === false ? formatter // Use formatter with bigger units + : defaults(formatter, defaults$1) : defaults$1; + var unit = getUnitFromValue(tick.value, isUTC); + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + } else if (mergedFormatter.inherit) { + // Unit formatter is not defined and should inherit from bigger units + var targetId = timeUnits.indexOf(unit); + for (var i = targetId - 1; i >= 0; --i) { + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + break; + } + } + template = template || defaults$1.none; + } + if (isArray(template)) { + var levelId = tick.level == null ? 0 : tick.level >= 0 ? tick.level : template.length + tick.level; + levelId = Math.min(levelId, template.length - 1); + template = template[levelId]; + } + } + return format(new Date(tick.value), template, isUTC, lang); +} +function getUnitFromValue(value, isUTC) { + var date = parseDate(value); + var M = date[monthGetterName(isUTC)]() + 1; + var d = date[dateGetterName(isUTC)](); + var h = date[hoursGetterName(isUTC)](); + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var isSecond = S === 0; + var isMinute = isSecond && s === 0; + var isHour = isMinute && m === 0; + var isDay = isHour && h === 0; + var isMonth = isDay && d === 1; + var isYear = isMonth && M === 1; + if (isYear) { + return 'year'; + } else if (isMonth) { + return 'month'; + } else if (isDay) { + return 'day'; + } else if (isHour) { + return 'hour'; + } else if (isMinute) { + return 'minute'; + } else if (isSecond) { + return 'second'; + } else { + return 'millisecond'; + } +} +function getUnitValue(value, unit, isUTC) { + var date = isNumber(value) ? parseDate(value) : value; + unit = unit || getUnitFromValue(value, isUTC); + switch (unit) { + case 'year': + return date[fullYearGetterName(isUTC)](); + case 'half-year': + return date[monthGetterName(isUTC)]() >= 6 ? 1 : 0; + case 'quarter': + return Math.floor((date[monthGetterName(isUTC)]() + 1) / 4); + case 'month': + return date[monthGetterName(isUTC)](); + case 'day': + return date[dateGetterName(isUTC)](); + case 'half-day': + return date[hoursGetterName(isUTC)]() / 24; + case 'hour': + return date[hoursGetterName(isUTC)](); + case 'minute': + return date[minutesGetterName(isUTC)](); + case 'second': + return date[secondsGetterName(isUTC)](); + case 'millisecond': + return date[millisecondsGetterName(isUTC)](); + } +} +function fullYearGetterName(isUTC) { + return isUTC ? 'getUTCFullYear' : 'getFullYear'; +} +function monthGetterName(isUTC) { + return isUTC ? 'getUTCMonth' : 'getMonth'; +} +function dateGetterName(isUTC) { + return isUTC ? 'getUTCDate' : 'getDate'; +} +function hoursGetterName(isUTC) { + return isUTC ? 'getUTCHours' : 'getHours'; +} +function minutesGetterName(isUTC) { + return isUTC ? 'getUTCMinutes' : 'getMinutes'; +} +function secondsGetterName(isUTC) { + return isUTC ? 'getUTCSeconds' : 'getSeconds'; +} +function millisecondsGetterName(isUTC) { + return isUTC ? 'getUTCMilliseconds' : 'getMilliseconds'; +} +function fullYearSetterName(isUTC) { + return isUTC ? 'setUTCFullYear' : 'setFullYear'; +} +function monthSetterName(isUTC) { + return isUTC ? 'setUTCMonth' : 'setMonth'; +} +function dateSetterName(isUTC) { + return isUTC ? 'setUTCDate' : 'setDate'; +} +function hoursSetterName(isUTC) { + return isUTC ? 'setUTCHours' : 'setHours'; +} +function minutesSetterName(isUTC) { + return isUTC ? 'setUTCMinutes' : 'setMinutes'; +} +function secondsSetterName(isUTC) { + return isUTC ? 'setUTCSeconds' : 'setSeconds'; +} +function millisecondsSetterName(isUTC) { + return isUTC ? 'setUTCMilliseconds' : 'setMilliseconds'; +} + +function addCommas(x) { + if (!isNumeric(x)) { + return isString(x) ? x : "-"; + } + var parts = (x + "").split("."); + return parts[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, "$1,") + (parts.length > 1 ? "." + parts[1] : ""); +} +function toCamelCase(str, upperCaseFirst) { + str = (str || "").toLowerCase().replace(/-(.)/g, function(match, group1) { + return group1.toUpperCase(); + }); + if (upperCaseFirst && str) { + str = str.charAt(0).toUpperCase() + str.slice(1); + } + return str; +} +var normalizeCssArray = normalizeCssArray$1; +function makeValueReadable(value, valueType, useUTC) { + var USER_READABLE_DEFUALT_TIME_PATTERN = "{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}"; + function stringToUserReadable(str) { + return str && trim(str) ? str : "-"; + } + function isNumberUserReadable(num) { + return !!(num != null && !isNaN(num) && isFinite(num)); + } + var isTypeTime = valueType === "time"; + var isValueDate = value instanceof Date; + if (isTypeTime || isValueDate) { + var date = isTypeTime ? parseDate(value) : value; + if (!isNaN(+date)) { + return format(date, USER_READABLE_DEFUALT_TIME_PATTERN, useUTC); + } else if (isValueDate) { + return "-"; + } + } + if (valueType === "ordinal") { + return isStringSafe(value) ? stringToUserReadable(value) : isNumber(value) ? isNumberUserReadable(value) ? value + "" : "-" : "-"; + } + var numericResult = numericToNumber(value); + return isNumberUserReadable(numericResult) ? addCommas(numericResult) : isStringSafe(value) ? stringToUserReadable(value) : typeof value === "boolean" ? value + "" : "-"; +} +var TPL_VAR_ALIAS = ["a", "b", "c", "d", "e", "f", "g"]; +var wrapVar = function(varName, seriesIdx) { + return "{" + varName + (seriesIdx == null ? "" : seriesIdx) + "}"; +}; +function formatTpl(tpl, paramsList, encode) { + if (!isArray(paramsList)) { + paramsList = [paramsList]; + } + var seriesLen = paramsList.length; + if (!seriesLen) { + return ""; + } + var $vars = paramsList[0].$vars || []; + for (var i = 0; i < $vars.length; i++) { + var alias = TPL_VAR_ALIAS[i]; + tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0)); + } + for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) { + for (var k = 0; k < $vars.length; k++) { + var val = paramsList[seriesIdx][$vars[k]]; + tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val); + } + } + return tpl; +} +function getTooltipMarker(inOpt, extraCssText) { + var opt = isString(inOpt) ? { + color: inOpt, + extraCssText + } : inOpt || {}; + var color = opt.color; + var type = opt.type; + extraCssText = opt.extraCssText; + var renderMode = opt.renderMode || "html"; + if (!color) { + return ""; + } + if (renderMode === "html") { + return type === "subItem" ? '' : ''; + } else { + var markerId = opt.markerId || "markerX"; + return { + renderMode, + content: "{" + markerId + "|} ", + style: type === "subItem" ? { + width: 4, + height: 4, + borderRadius: 2, + backgroundColor: color + } : { + width: 10, + height: 10, + borderRadius: 5, + backgroundColor: color + } + }; + } +} +function convertToColorString(color, defaultColor) { + defaultColor = defaultColor || "transparent"; + return isString(color) ? color : isObject$2(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor; +} +function windowOpen(link, target) { + if (target === "_blank" || target === "blank") { + var blank = window.open(); + blank.opener = null; + blank.location.href = link; + } else { + window.open(link, target); + } +} + +var each$3 = each$4; +/** + * @public + */ +var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height']; +/** + * @public + */ +var HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']]; +function boxLayout(orient, group, gap, maxWidth, maxHeight) { + var x = 0; + var y = 0; + if (maxWidth == null) { + maxWidth = Infinity; + } + if (maxHeight == null) { + maxHeight = Infinity; + } + var currentLineMaxSize = 0; + group.eachChild(function (child, idx) { + var rect = child.getBoundingRect(); + var nextChild = group.childAt(idx + 1); + var nextChildRect = nextChild && nextChild.getBoundingRect(); + var nextX; + var nextY; + if (orient === 'horizontal') { + var moveX = rect.width + (nextChildRect ? -nextChildRect.x + rect.x : 0); + nextX = x + moveX; + // Wrap when width exceeds maxWidth or meet a `newline` group + // FIXME compare before adding gap? + if (nextX > maxWidth || child.newline) { + x = 0; + nextX = moveX; + y += currentLineMaxSize + gap; + currentLineMaxSize = rect.height; + } else { + // FIXME: consider rect.y is not `0`? + currentLineMaxSize = Math.max(currentLineMaxSize, rect.height); + } + } else { + var moveY = rect.height + (nextChildRect ? -nextChildRect.y + rect.y : 0); + nextY = y + moveY; + // Wrap when width exceeds maxHeight or meet a `newline` group + if (nextY > maxHeight || child.newline) { + x += currentLineMaxSize + gap; + y = 0; + nextY = moveY; + currentLineMaxSize = rect.width; + } else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.width); + } + } + if (child.newline) { + return; + } + child.x = x; + child.y = y; + child.markRedraw(); + orient === 'horizontal' ? x = nextX + gap : y = nextY + gap; + }); +} +/** + * VBox or HBox layouting + * @param {string} orient + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ +var box = boxLayout; +/** + * VBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ +curry$1(boxLayout, 'vertical'); +/** + * HBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ +curry$1(boxLayout, 'horizontal'); +/** + * Parse position info. + */ +function getLayoutRect(positionInfo, containerRect, margin) { + margin = normalizeCssArray(margin || 0); + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + var left = parsePercent(positionInfo.left, containerWidth); + var top = parsePercent(positionInfo.top, containerHeight); + var right = parsePercent(positionInfo.right, containerWidth); + var bottom = parsePercent(positionInfo.bottom, containerHeight); + var width = parsePercent(positionInfo.width, containerWidth); + var height = parsePercent(positionInfo.height, containerHeight); + var verticalMargin = margin[2] + margin[0]; + var horizontalMargin = margin[1] + margin[3]; + var aspect = positionInfo.aspect; + // If width is not specified, calculate width from left and right + if (isNaN(width)) { + width = containerWidth - right - horizontalMargin - left; + } + if (isNaN(height)) { + height = containerHeight - bottom - verticalMargin - top; + } + if (aspect != null) { + // If width and height are not given + // 1. Graph should not exceeds the container + // 2. Aspect must be keeped + // 3. Graph should take the space as more as possible + // FIXME + // Margin is not considered, because there is no case that both + // using margin and aspect so far. + if (isNaN(width) && isNaN(height)) { + if (aspect > containerWidth / containerHeight) { + width = containerWidth * 0.8; + } else { + height = containerHeight * 0.8; + } + } + // Calculate width or height with given aspect + if (isNaN(width)) { + width = aspect * height; + } + if (isNaN(height)) { + height = width / aspect; + } + } + // If left is not specified, calculate left from right and width + if (isNaN(left)) { + left = containerWidth - right - width - horizontalMargin; + } + if (isNaN(top)) { + top = containerHeight - bottom - height - verticalMargin; + } + // Align left and top + switch (positionInfo.left || positionInfo.right) { + case 'center': + left = containerWidth / 2 - width / 2 - margin[3]; + break; + case 'right': + left = containerWidth - width - horizontalMargin; + break; + } + switch (positionInfo.top || positionInfo.bottom) { + case 'middle': + case 'center': + top = containerHeight / 2 - height / 2 - margin[0]; + break; + case 'bottom': + top = containerHeight - height - verticalMargin; + break; + } + // If something is wrong and left, top, width, height are calculated as NaN + left = left || 0; + top = top || 0; + if (isNaN(width)) { + // Width may be NaN if only one value is given except width + width = containerWidth - horizontalMargin - left - (right || 0); + } + if (isNaN(height)) { + // Height may be NaN if only one value is given except height + height = containerHeight - verticalMargin - top - (bottom || 0); + } + var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); + rect.margin = margin; + return rect; +} +function fetchLayoutMode(ins) { + var layoutMode = ins.layoutMode || ins.constructor.layoutMode; + return isObject$2(layoutMode) ? layoutMode : layoutMode ? { + type: layoutMode + } : null; +} +/** + * Consider Case: + * When default option has {left: 0, width: 100}, and we set {right: 0} + * through setOption or media query, using normal zrUtil.merge will cause + * {right: 0} does not take effect. + * + * @example + * ComponentModel.extend({ + * init: function () { + * ... + * let inputPositionParams = layout.getLayoutParams(option); + * this.mergeOption(inputPositionParams); + * }, + * mergeOption: function (newOption) { + * newOption && zrUtil.merge(thisOption, newOption, true); + * layout.mergeLayoutParam(thisOption, newOption); + * } + * }); + * + * @param targetOption + * @param newOption + * @param opt + */ +function mergeLayoutParam(targetOption, newOption, opt) { + var ignoreSize = opt && opt.ignoreSize; + !isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]); + var hResult = merge(HV_NAMES[0], 0); + var vResult = merge(HV_NAMES[1], 1); + copy(HV_NAMES[0], targetOption, hResult); + copy(HV_NAMES[1], targetOption, vResult); + function merge(names, hvIdx) { + var newParams = {}; + var newValueCount = 0; + var merged = {}; + var mergedValueCount = 0; + var enoughParamNumber = 2; + each$3(names, function (name) { + merged[name] = targetOption[name]; + }); + each$3(names, function (name) { + // Consider case: newOption.width is null, which is + // set by user for removing width setting. + hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]); + hasValue(newParams, name) && newValueCount++; + hasValue(merged, name) && mergedValueCount++; + }); + if (ignoreSize[hvIdx]) { + // Only one of left/right is premitted to exist. + if (hasValue(newOption, names[1])) { + merged[names[2]] = null; + } else if (hasValue(newOption, names[2])) { + merged[names[1]] = null; + } + return merged; + } + // Case: newOption: {width: ..., right: ...}, + // or targetOption: {right: ...} and newOption: {width: ...}, + // There is no conflict when merged only has params count + // little than enoughParamNumber. + if (mergedValueCount === enoughParamNumber || !newValueCount) { + return merged; + } + // Case: newOption: {width: ..., right: ...}, + // Than we can make sure user only want those two, and ignore + // all origin params in targetOption. + else if (newValueCount >= enoughParamNumber) { + return newParams; + } else { + // Chose another param from targetOption by priority. + for (var i = 0; i < names.length; i++) { + var name_1 = names[i]; + if (!hasProp(newParams, name_1) && hasProp(targetOption, name_1)) { + newParams[name_1] = targetOption[name_1]; + break; + } + } + return newParams; + } + } + function hasProp(obj, name) { + return obj.hasOwnProperty(name); + } + function hasValue(obj, name) { + return obj[name] != null && obj[name] !== 'auto'; + } + function copy(names, target, source) { + each$3(names, function (name) { + target[name] = source[name]; + }); + } +} +/** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + */ +function getLayoutParams(source) { + return copyLayoutParams({}, source); +} +/** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ +function copyLayoutParams(target, source) { + source && target && each$3(LOCATION_PARAMS, function (name) { + source.hasOwnProperty(name) && (target[name] = source[name]); + }); + return target; +} + +var inner$9 = makeInner(); +var ComponentModel = /** @class */function (_super) { + __extends(ComponentModel, _super); + function ComponentModel(option, parentModel, ecModel) { + var _this = _super.call(this, option, parentModel, ecModel) || this; + _this.uid = getUID('ec_cpt_model'); + return _this; + } + ComponentModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + }; + ComponentModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(this.mainType)); + merge(option, this.getDefaultOption()); + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + ComponentModel.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + var layoutMode = fetchLayoutMode(this); + if (layoutMode) { + mergeLayoutParam(this.option, option, layoutMode); + } + }; + /** + * Called immediately after `init` or `mergeOption` of this instance called. + */ + ComponentModel.prototype.optionUpdated = function (newCptOption, isInit) {}; + /** + * [How to declare defaultOption]: + * + * (A) If using class declaration in typescript (since echarts 5): + * ```ts + * import {ComponentOption} from '../model/option.js'; + * export interface XxxOption extends ComponentOption { + * aaa: number + * } + * export class XxxModel extends Component { + * static type = 'xxx'; + * static defaultOption: XxxOption = { + * aaa: 123 + * } + * } + * Component.registerClass(XxxModel); + * ``` + * ```ts + * import {inheritDefaultOption} from '../util/component.js'; + * import {XxxModel, XxxOption} from './XxxModel.js'; + * export interface XxxSubOption extends XxxOption { + * bbb: number + * } + * class XxxSubModel extends XxxModel { + * static defaultOption: XxxSubOption = inheritDefaultOption(XxxModel.defaultOption, { + * bbb: 456 + * }) + * fn() { + * let opt = this.getDefaultOption(); + * // opt is {aaa: 123, bbb: 456} + * } + * } + * ``` + * + * (B) If using class extend (previous approach in echarts 3 & 4): + * ```js + * let XxxComponent = Component.extend({ + * defaultOption: { + * xx: 123 + * } + * }) + * ``` + * ```js + * let XxxSubComponent = XxxComponent.extend({ + * defaultOption: { + * yy: 456 + * }, + * fn: function () { + * let opt = this.getDefaultOption(); + * // opt is {xx: 123, yy: 456} + * } + * }) + * ``` + */ + ComponentModel.prototype.getDefaultOption = function () { + var ctor = this.constructor; + // If using class declaration, it is different to travel super class + // in legacy env and auto merge defaultOption. So if using class + // declaration, defaultOption should be merged manually. + if (!isExtendedClass(ctor)) { + // When using ts class, defaultOption must be declared as static. + return ctor.defaultOption; + } + // FIXME: remove this approach? + var fields = inner$9(this); + if (!fields.defaultOption) { + var optList = []; + var clz = ctor; + while (clz) { + var opt = clz.prototype.defaultOption; + opt && optList.push(opt); + clz = clz.superClass; + } + var defaultOption = {}; + for (var i = optList.length - 1; i >= 0; i--) { + defaultOption = merge(defaultOption, optList[i], true); + } + fields.defaultOption = defaultOption; + } + return fields.defaultOption; + }; + /** + * Notice: always force to input param `useDefault` in case that forget to consider it. + * The same behavior as `modelUtil.parseFinder`. + * + * @param useDefault In many cases like series refer axis and axis refer grid, + * If axis index / axis id not specified, use the first target as default. + * In other cases like dataZoom refer axis, if not specified, measn no refer. + */ + ComponentModel.prototype.getReferringComponents = function (mainType, opt) { + var indexKey = mainType + 'Index'; + var idKey = mainType + 'Id'; + return queryReferringComponents(this.ecModel, mainType, { + index: this.get(indexKey, true), + id: this.get(idKey, true) + }, opt); + }; + ComponentModel.prototype.getBoxLayoutParams = function () { + // Consider itself having box layout configs. + var boxLayoutModel = this; + return { + left: boxLayoutModel.get('left'), + top: boxLayoutModel.get('top'), + right: boxLayoutModel.get('right'), + bottom: boxLayoutModel.get('bottom'), + width: boxLayoutModel.get('width'), + height: boxLayoutModel.get('height') + }; + }; + /** + * Get key for zlevel. + * If developers don't configure zlevel. We will assign zlevel to series based on the key. + * For example, lines with trail effect and progressive series will in an individual zlevel. + */ + ComponentModel.prototype.getZLevelKey = function () { + return ''; + }; + ComponentModel.prototype.setZLevel = function (zlevel) { + this.option.zlevel = zlevel; + }; + ComponentModel.protoInitialize = function () { + var proto = ComponentModel.prototype; + proto.type = 'component'; + proto.id = ''; + proto.name = ''; + proto.mainType = ''; + proto.subType = ''; + proto.componentIndex = 0; + }(); + return ComponentModel; +}(Model); +mountExtend(ComponentModel, Model); +enableClassManagement(ComponentModel); +enableSubTypeDefaulter(ComponentModel); +enableTopologicalTravel(ComponentModel, getDependencies); +function getDependencies(componentType) { + var deps = []; + each$4(ComponentModel.getClassesByMainType(componentType), function (clz) { + deps = deps.concat(clz.dependencies || clz.prototype.dependencies || []); + }); + // Ensure main type. + deps = map$1(deps, function (type) { + return parseClassType(type).main; + }); + // Hack dataset for convenience. + if (componentType !== 'dataset' && indexOf(deps, 'dataset') <= 0) { + deps.unshift('dataset'); + } + return deps; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +var platform = ''; +// Navigator not exists in node +if (typeof navigator !== 'undefined') { + /* global navigator */ + platform = navigator.platform || ''; +} +var decalColor = 'rgba(0, 0, 0, 0.2)'; +const globalDefault = { + darkMode: 'auto', + // backgroundColor: 'rgba(0,0,0,0)', + colorBy: 'series', + color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'], + gradientColor: ['#f6efa6', '#d88273', '#bf444c'], + aria: { + decal: { + decals: [{ + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [2, 5], + symbolSize: 1, + rotation: Math.PI / 6 + }, { + color: decalColor, + symbol: 'circle', + dashArrayX: [[8, 8], [0, 8, 8, 0]], + dashArrayY: [6, 0], + symbolSize: 0.8 + }, { + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [4, 3], + rotation: -Math.PI / 4 + }, { + color: decalColor, + dashArrayX: [[6, 6], [0, 6, 6, 0]], + dashArrayY: [6, 0] + }, { + color: decalColor, + dashArrayX: [[1, 0], [1, 6]], + dashArrayY: [1, 0, 6, 0], + rotation: Math.PI / 4 + }, { + color: decalColor, + symbol: 'triangle', + dashArrayX: [[9, 9], [0, 9, 9, 0]], + dashArrayY: [7, 2], + symbolSize: 0.75 + }] + } + }, + // If xAxis and yAxis declared, grid is created by default. + // grid: {}, + textStyle: { + // color: '#000', + // decoration: 'none', + // PENDING + fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif', + // fontFamily: 'Arial, Verdana, sans-serif', + fontSize: 12, + fontStyle: 'normal', + fontWeight: 'normal' + }, + // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/ + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation + // Default is source-over + blendMode: null, + stateAnimation: { + duration: 300, + easing: 'cubicOut' + }, + animation: 'auto', + animationDuration: 1000, + animationDurationUpdate: 500, + animationEasing: 'cubicInOut', + animationEasingUpdate: 'cubicInOut', + animationThreshold: 2000, + // Configuration for progressive/incremental rendering + progressiveThreshold: 3000, + progressive: 400, + // Threshold of if use single hover layer to optimize. + // It is recommended that `hoverLayerThreshold` is equivalent to or less than + // `progressiveThreshold`, otherwise hover will cause restart of progressive, + // which is unexpected. + // see example . + hoverLayerThreshold: 3000, + // See: module:echarts/scale/Time + useUTC: false +}; + +var VISUAL_DIMENSIONS = createHashMap(['tooltip', 'label', 'itemName', 'itemId', 'itemGroupId', 'itemChildGroupId', 'seriesName']); +var SOURCE_FORMAT_ORIGINAL = 'original'; +var SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows'; +var SOURCE_FORMAT_OBJECT_ROWS = 'objectRows'; +var SOURCE_FORMAT_KEYED_COLUMNS = 'keyedColumns'; +var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray'; +var SOURCE_FORMAT_UNKNOWN = 'unknown'; +var SERIES_LAYOUT_BY_COLUMN = 'column'; +var SERIES_LAYOUT_BY_ROW = 'row'; + +// The result of `guessOrdinal`. +var BE_ORDINAL = { + Must: 1, + Might: 2, + Not: 3 // Other cases +}; +var innerGlobalModel = makeInner(); +/** + * MUST be called before mergeOption of all series. + */ +function resetSourceDefaulter(ecModel) { + // `datasetMap` is used to make default encode. + innerGlobalModel(ecModel).datasetMap = createHashMap(); +} +/** + * [The strategy of the arrengment of data dimensions for dataset]: + * "value way": all axes are non-category axes. So series one by one take + * several (the number is coordSysDims.length) dimensions from dataset. + * The result of data arrengment of data dimensions like: + * | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y | + * "category way": at least one axis is category axis. So the the first data + * dimension is always mapped to the first category axis and shared by + * all of the series. The other data dimensions are taken by series like + * "value way" does. + * The result of data arrengment of data dimensions like: + * | ser_shared_x | ser0_y | ser1_y | ser2_y | + * + * @return encode Never be `null/undefined`. + */ +function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); + // Currently only make default when using dataset, util more reqirements occur. + if (!datasetModel || !coordDimensions) { + return encode; + } + var encodeItemName = []; + var encodeSeriesName = []; + var ecModel = seriesModel.ecModel; + var datasetMap = innerGlobalModel(ecModel).datasetMap; + var key = datasetModel.uid + '_' + source.seriesLayoutBy; + var baseCategoryDimIndex; + var categoryWayValueDimStart; + coordDimensions = coordDimensions.slice(); + each$4(coordDimensions, function (coordDimInfoLoose, coordDimIdx) { + var coordDimInfo = isObject$2(coordDimInfoLoose) ? coordDimInfoLoose : coordDimensions[coordDimIdx] = { + name: coordDimInfoLoose + }; + if (coordDimInfo.type === 'ordinal' && baseCategoryDimIndex == null) { + baseCategoryDimIndex = coordDimIdx; + categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimInfo); + } + encode[coordDimInfo.name] = []; + }); + var datasetRecord = datasetMap.get(key) || datasetMap.set(key, { + categoryWayDim: categoryWayValueDimStart, + valueWayDim: 0 + }); + // TODO + // Auto detect first time axis and do arrangement. + each$4(coordDimensions, function (coordDimInfo, coordDimIdx) { + var coordDimName = coordDimInfo.name; + var count = getDataDimCountOnCoordDim(coordDimInfo); + // In value way. + if (baseCategoryDimIndex == null) { + var start = datasetRecord.valueWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.valueWayDim += count; + // ??? TODO give a better default series name rule? + // especially when encode x y specified. + // consider: when multiple series share one dimension + // category axis, series name should better use + // the other dimension name. On the other hand, use + // both dimensions name. + } + // In category way, the first category axis. + else if (baseCategoryDimIndex === coordDimIdx) { + pushDim(encode[coordDimName], 0, count); + pushDim(encodeItemName, 0, count); + } + // In category way, the other axis. + else { + var start = datasetRecord.categoryWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.categoryWayDim += count; + } + }); + function pushDim(dimIdxArr, idxFrom, idxCount) { + for (var i = 0; i < idxCount; i++) { + dimIdxArr.push(idxFrom + i); + } + } + function getDataDimCountOnCoordDim(coordDimInfo) { + var dimsDef = coordDimInfo.dimsDef; + return dimsDef ? dimsDef.length : 1; + } + encodeItemName.length && (encode.itemName = encodeItemName); + encodeSeriesName.length && (encode.seriesName = encodeSeriesName); + return encode; +} +/** + * Work for data like [{name: ..., value: ...}, ...]. + * + * @return encode Never be `null/undefined`. + */ +function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); + // Currently only make default when using dataset, util more reqirements occur. + if (!datasetModel) { + return encode; + } + var sourceFormat = source.sourceFormat; + var dimensionsDefine = source.dimensionsDefine; + var potentialNameDimIndex; + if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + each$4(dimensionsDefine, function (dim, idx) { + if ((isObject$2(dim) ? dim.name : dim) === 'name') { + potentialNameDimIndex = idx; + } + }); + } + var idxResult = function () { + var idxRes0 = {}; + var idxRes1 = {}; + var guessRecords = []; + // 5 is an experience value. + for (var i = 0, len = Math.min(5, dimCount); i < len; i++) { + var guessResult = doGuessOrdinal(source.data, sourceFormat, source.seriesLayoutBy, dimensionsDefine, source.startIndex, i); + guessRecords.push(guessResult); + var isPureNumber = guessResult === BE_ORDINAL.Not; + // [Strategy of idxRes0]: find the first BE_ORDINAL.Not as the value dim, + // and then find a name dim with the priority: + // "BE_ORDINAL.Might|BE_ORDINAL.Must" > "other dim" > "the value dim itself". + if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) { + idxRes0.v = i; + } + if (idxRes0.n == null || idxRes0.n === idxRes0.v || !isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not) { + idxRes0.n = i; + } + if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) { + return idxRes0; + } + // [Strategy of idxRes1]: if idxRes0 not satisfied (that is, no BE_ORDINAL.Not), + // find the first BE_ORDINAL.Might as the value dim, + // and then find a name dim with the priority: + // "other dim" > "the value dim itself". + // That is for backward compat: number-like (e.g., `'3'`, `'55'`) can be + // treated as number. + if (!isPureNumber) { + if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) { + idxRes1.v = i; + } + if (idxRes1.n == null || idxRes1.n === idxRes1.v) { + idxRes1.n = i; + } + } + } + function fulfilled(idxResult) { + return idxResult.v != null && idxResult.n != null; + } + return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null; + }(); + if (idxResult) { + encode.value = [idxResult.v]; + // `potentialNameDimIndex` has highest priority. + var nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n; + // By default, label uses itemName in charts. + // So we don't set encodeLabel here. + encode.itemName = [nameDimIndex]; + encode.seriesName = [nameDimIndex]; + } + return encode; +} +/** + * @return If return null/undefined, indicate that should not use datasetModel. + */ +function querySeriesUpstreamDatasetModel(seriesModel) { + // Caution: consider the scenario: + // A dataset is declared and a series is not expected to use the dataset, + // and at the beginning `setOption({series: { noData })` (just prepare other + // option but no data), then `setOption({series: {data: [...]}); In this case, + // the user should set an empty array to avoid that dataset is used by default. + var thisData = seriesModel.get('data', true); + if (!thisData) { + return queryReferringComponents(seriesModel.ecModel, 'dataset', { + index: seriesModel.get('datasetIndex', true), + id: seriesModel.get('datasetId', true) + }, SINGLE_REFERRING).models[0]; + } +} +/** + * @return Always return an array event empty. + */ +function queryDatasetUpstreamDatasetModels(datasetModel) { + // Only these attributes declared, we by default reference to `datasetIndex: 0`. + // Otherwise, no reference. + if (!datasetModel.get('transform', true) && !datasetModel.get('fromTransformResult', true)) { + return []; + } + return queryReferringComponents(datasetModel.ecModel, 'dataset', { + index: datasetModel.get('fromDatasetIndex', true), + id: datasetModel.get('fromDatasetId', true) + }, SINGLE_REFERRING).models; +} +/** + * The rule should not be complex, otherwise user might not + * be able to known where the data is wrong. + * The code is ugly, but how to make it neat? + */ +function guessOrdinal(source, dimIndex) { + return doGuessOrdinal(source.data, source.sourceFormat, source.seriesLayoutBy, source.dimensionsDefine, source.startIndex, dimIndex); +} +// dimIndex may be overflow source data. +// return {BE_ORDINAL} +function doGuessOrdinal(data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex) { + var result; + // Experience value. + var maxLoop = 5; + if (isTypedArray(data)) { + return BE_ORDINAL.Not; + } + // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine + // always exists in source. + var dimName; + var dimType; + if (dimensionsDefine) { + var dimDefItem = dimensionsDefine[dimIndex]; + if (isObject$2(dimDefItem)) { + dimName = dimDefItem.name; + dimType = dimDefItem.type; + } else if (isString(dimDefItem)) { + dimName = dimDefItem; + } + } + if (dimType != null) { + return dimType === 'ordinal' ? BE_ORDINAL.Must : BE_ORDINAL.Not; + } + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + var sample = dataArrayRows[dimIndex]; + for (var i = 0; i < (sample || []).length && i < maxLoop; i++) { + if ((result = detectValue(sample[startIndex + i])) != null) { + return result; + } + } + } else { + for (var i = 0; i < dataArrayRows.length && i < maxLoop; i++) { + var row = dataArrayRows[startIndex + i]; + if (row && (result = detectValue(row[dimIndex])) != null) { + return result; + } + } + } + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var dataObjectRows = data; + if (!dimName) { + return BE_ORDINAL.Not; + } + for (var i = 0; i < dataObjectRows.length && i < maxLoop; i++) { + var item = dataObjectRows[i]; + if (item && (result = detectValue(item[dimName])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + var dataKeyedColumns = data; + if (!dimName) { + return BE_ORDINAL.Not; + } + var sample = dataKeyedColumns[dimName]; + if (!sample || isTypedArray(sample)) { + return BE_ORDINAL.Not; + } + for (var i = 0; i < sample.length && i < maxLoop; i++) { + if ((result = detectValue(sample[i])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var dataOriginal = data; + for (var i = 0; i < dataOriginal.length && i < maxLoop; i++) { + var item = dataOriginal[i]; + var val = getDataItemValue(item); + if (!isArray(val)) { + return BE_ORDINAL.Not; + } + if ((result = detectValue(val[dimIndex])) != null) { + return result; + } + } + } + function detectValue(val) { + var beStr = isString(val); + // Consider usage convenience, '1', '2' will be treated as "number". + // `Number('')` (or any whitespace) is `0`. + if (val != null && Number.isFinite(Number(val)) && val !== '') { + return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not; + } else if (beStr && val !== '-') { + return BE_ORDINAL.Must; + } + } + return BE_ORDINAL.Not; +} + +var internalOptionCreatorMap = createHashMap(); +function concatInternalOptions(ecModel, mainType, newCmptOptionList) { + var internalOptionCreator = internalOptionCreatorMap.get(mainType); + if (!internalOptionCreator) { + return newCmptOptionList; + } + var internalOptions = internalOptionCreator(ecModel); + if (!internalOptions) { + return newCmptOptionList; + } + return newCmptOptionList.concat(internalOptions); +} + +var innerColor = makeInner(); +makeInner(); +var PaletteMixin = /** @class */function () { + function PaletteMixin() {} + PaletteMixin.prototype.getColorFromPalette = function (name, scope, requestNum) { + var defaultPalette = normalizeToArray(this.get('color', true)); + var layeredPalette = this.get('colorLayer', true); + return getFromPalette(this, innerColor, defaultPalette, layeredPalette, name, scope, requestNum); + }; + PaletteMixin.prototype.clearColorPalette = function () { + clearPalette(this, innerColor); + }; + return PaletteMixin; +}(); +function getNearestPalette(palettes, requestColorNum) { + var paletteNum = palettes.length; + // TODO palettes must be in order + for (var i = 0; i < paletteNum; i++) { + if (palettes[i].length > requestColorNum) { + return palettes[i]; + } + } + return palettes[paletteNum - 1]; +} +/** + * @param name MUST NOT be null/undefined. Otherwise call this function + * twise with the same parameters will get different result. + * @param scope default this. + * @return Can be null/undefined + */ +function getFromPalette(that, inner, defaultPalette, layeredPalette, name, scope, requestNum) { + scope = scope || that; + var scopeFields = inner(scope); + var paletteIdx = scopeFields.paletteIdx || 0; + var paletteNameMap = scopeFields.paletteNameMap = scopeFields.paletteNameMap || {}; + // Use `hasOwnProperty` to avoid conflict with Object.prototype. + if (paletteNameMap.hasOwnProperty(name)) { + return paletteNameMap[name]; + } + var palette = requestNum == null || !layeredPalette ? defaultPalette : getNearestPalette(layeredPalette, requestNum); + // In case can't find in layered color palette. + palette = palette || defaultPalette; + if (!palette || !palette.length) { + return; + } + var pickedPaletteItem = palette[paletteIdx]; + if (name) { + paletteNameMap[name] = pickedPaletteItem; + } + scopeFields.paletteIdx = (paletteIdx + 1) % palette.length; + return pickedPaletteItem; +} +function clearPalette(that, inner) { + inner(that).paletteIdx = 0; + inner(that).paletteNameMap = {}; +} + +var reCreateSeriesIndices; +var assertSeriesInitialized; +var initBase; +var OPTION_INNER_KEY = "\0_ec_inner"; +var OPTION_INNER_VALUE = 1; +var GlobalModel = ( + /** @class */ + function(_super) { + __extends(GlobalModel2, _super); + function GlobalModel2() { + return _super !== null && _super.apply(this, arguments) || this; + } + GlobalModel2.prototype.init = function(option, parentModel, ecModel, theme, locale, optionManager) { + theme = theme || {}; + this.option = null; + this._theme = new Model(theme); + this._locale = new Model(locale); + this._optionManager = optionManager; + }; + GlobalModel2.prototype.setOption = function(option, opts, optionPreprocessorFuncs) { + var innerOpt = normalizeSetOptionInput(opts); + this._optionManager.setOption(option, optionPreprocessorFuncs, innerOpt); + this._resetOption(null, innerOpt); + }; + GlobalModel2.prototype.resetOption = function(type, opt) { + return this._resetOption(type, normalizeSetOptionInput(opt)); + }; + GlobalModel2.prototype._resetOption = function(type, opt) { + var optionChanged = false; + var optionManager = this._optionManager; + if (!type || type === "recreate") { + var baseOption = optionManager.mountOption(type === "recreate"); + if (!this.option || type === "recreate") { + initBase(this, baseOption); + } else { + this.restoreData(); + this._mergeOption(baseOption, opt); + } + optionChanged = true; + } + if (type === "timeline" || type === "media") { + this.restoreData(); + } + if (!type || type === "recreate" || type === "timeline") { + var timelineOption = optionManager.getTimelineOption(this); + if (timelineOption) { + optionChanged = true; + this._mergeOption(timelineOption, opt); + } + } + if (!type || type === "recreate" || type === "media") { + var mediaOptions = optionManager.getMediaOption(this); + if (mediaOptions.length) { + each$4(mediaOptions, function(mediaOption) { + optionChanged = true; + this._mergeOption(mediaOption, opt); + }, this); + } + } + return optionChanged; + }; + GlobalModel2.prototype.mergeOption = function(option) { + this._mergeOption(option, null); + }; + GlobalModel2.prototype._mergeOption = function(newOption, opt) { + var option = this.option; + var componentsMap = this._componentsMap; + var componentsCount = this._componentsCount; + var newCmptTypes = []; + var newCmptTypeMap = createHashMap(); + var replaceMergeMainTypeMap = opt && opt.replaceMergeMainTypeMap; + resetSourceDefaulter(this); + each$4(newOption, function(componentOption, mainType) { + if (componentOption == null) { + return; + } + if (!ComponentModel.hasClass(mainType)) { + option[mainType] = option[mainType] == null ? clone$2(componentOption) : merge(option[mainType], componentOption, true); + } else if (mainType) { + newCmptTypes.push(mainType); + newCmptTypeMap.set(mainType, true); + } + }); + if (replaceMergeMainTypeMap) { + replaceMergeMainTypeMap.each(function(val, mainTypeInReplaceMerge) { + if (ComponentModel.hasClass(mainTypeInReplaceMerge) && !newCmptTypeMap.get(mainTypeInReplaceMerge)) { + newCmptTypes.push(mainTypeInReplaceMerge); + newCmptTypeMap.set(mainTypeInReplaceMerge, true); + } + }); + } + ComponentModel.topologicalTravel(newCmptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this); + function visitComponent(mainType) { + var newCmptOptionList = concatInternalOptions(this, mainType, normalizeToArray(newOption[mainType])); + var oldCmptList = componentsMap.get(mainType); + var mergeMode = ( + // `!oldCmptList` means init. See the comment in `mappingToExists` + !oldCmptList ? "replaceAll" : replaceMergeMainTypeMap && replaceMergeMainTypeMap.get(mainType) ? "replaceMerge" : "normalMerge" + ); + var mappingResult = mappingToExists(oldCmptList, newCmptOptionList, mergeMode); + setComponentTypeToKeyInfo(mappingResult, mainType, ComponentModel); + option[mainType] = null; + componentsMap.set(mainType, null); + componentsCount.set(mainType, 0); + var optionsByMainType = []; + var cmptsByMainType = []; + var cmptsCountByMainType = 0; + var tooltipExists; + each$4(mappingResult, function(resultItem, index) { + var componentModel = resultItem.existing; + var newCmptOption = resultItem.newOption; + if (!newCmptOption) { + if (componentModel) { + componentModel.mergeOption({}, this); + componentModel.optionUpdated({}, false); + } + } else { + var isSeriesType = mainType === "series"; + var ComponentModelClass = ComponentModel.getClass( + mainType, + resultItem.keyInfo.subType, + !isSeriesType + // Give a more detailed warn later if series don't exists + ); + if (!ComponentModelClass) { + return; + } + if (mainType === "tooltip") { + if (tooltipExists) { + return; + } + tooltipExists = true; + } + if (componentModel && componentModel.constructor === ComponentModelClass) { + componentModel.name = resultItem.keyInfo.name; + componentModel.mergeOption(newCmptOption, this); + componentModel.optionUpdated(newCmptOption, false); + } else { + var extraOpt = extend({ + componentIndex: index + }, resultItem.keyInfo); + componentModel = new ComponentModelClass(newCmptOption, this, this, extraOpt); + extend(componentModel, extraOpt); + if (resultItem.brandNew) { + componentModel.__requireNewView = true; + } + componentModel.init(newCmptOption, this, this); + componentModel.optionUpdated(null, true); + } + } + if (componentModel) { + optionsByMainType.push(componentModel.option); + cmptsByMainType.push(componentModel); + cmptsCountByMainType++; + } else { + optionsByMainType.push(void 0); + cmptsByMainType.push(void 0); + } + }, this); + option[mainType] = optionsByMainType; + componentsMap.set(mainType, cmptsByMainType); + componentsCount.set(mainType, cmptsCountByMainType); + if (mainType === "series") { + reCreateSeriesIndices(this); + } + } + if (!this._seriesIndices) { + reCreateSeriesIndices(this); + } + }; + GlobalModel2.prototype.getOption = function() { + var option = clone$2(this.option); + each$4(option, function(optInMainType, mainType) { + if (ComponentModel.hasClass(mainType)) { + var opts = normalizeToArray(optInMainType); + var realLen = opts.length; + var metNonInner = false; + for (var i = realLen - 1; i >= 0; i--) { + if (opts[i] && !isComponentIdInternal(opts[i])) { + metNonInner = true; + } else { + opts[i] = null; + !metNonInner && realLen--; + } + } + opts.length = realLen; + option[mainType] = opts; + } + }); + delete option[OPTION_INNER_KEY]; + return option; + }; + GlobalModel2.prototype.getTheme = function() { + return this._theme; + }; + GlobalModel2.prototype.getLocaleModel = function() { + return this._locale; + }; + GlobalModel2.prototype.setUpdatePayload = function(payload) { + this._payload = payload; + }; + GlobalModel2.prototype.getUpdatePayload = function() { + return this._payload; + }; + GlobalModel2.prototype.getComponent = function(mainType, idx) { + var list = this._componentsMap.get(mainType); + if (list) { + var cmpt = list[idx || 0]; + if (cmpt) { + return cmpt; + } else if (idx == null) { + for (var i = 0; i < list.length; i++) { + if (list[i]) { + return list[i]; + } + } + } + } + }; + GlobalModel2.prototype.queryComponents = function(condition) { + var mainType = condition.mainType; + if (!mainType) { + return []; + } + var index = condition.index; + var id = condition.id; + var name = condition.name; + var cmpts = this._componentsMap.get(mainType); + if (!cmpts || !cmpts.length) { + return []; + } + var result; + if (index != null) { + result = []; + each$4(normalizeToArray(index), function(idx) { + cmpts[idx] && result.push(cmpts[idx]); + }); + } else if (id != null) { + result = queryByIdOrName("id", id, cmpts); + } else if (name != null) { + result = queryByIdOrName("name", name, cmpts); + } else { + result = filter(cmpts, function(cmpt) { + return !!cmpt; + }); + } + return filterBySubType(result, condition); + }; + GlobalModel2.prototype.findComponents = function(condition) { + var query = condition.query; + var mainType = condition.mainType; + var queryCond = getQueryCond(query); + var result = queryCond ? this.queryComponents(queryCond) : filter(this._componentsMap.get(mainType), function(cmpt) { + return !!cmpt; + }); + return doFilter(filterBySubType(result, condition)); + function getQueryCond(q) { + var indexAttr = mainType + "Index"; + var idAttr = mainType + "Id"; + var nameAttr = mainType + "Name"; + return q && (q[indexAttr] != null || q[idAttr] != null || q[nameAttr] != null) ? { + mainType, + // subType will be filtered finally. + index: q[indexAttr], + id: q[idAttr], + name: q[nameAttr] + } : null; + } + function doFilter(res) { + return condition.filter ? filter(res, condition.filter) : res; + } + }; + GlobalModel2.prototype.eachComponent = function(mainType, cb, context) { + var componentsMap = this._componentsMap; + if (isFunction(mainType)) { + var ctxForAll_1 = cb; + var cbForAll_1 = mainType; + componentsMap.each(function(cmpts2, componentType) { + for (var i2 = 0; cmpts2 && i2 < cmpts2.length; i2++) { + var cmpt2 = cmpts2[i2]; + cmpt2 && cbForAll_1.call(ctxForAll_1, componentType, cmpt2, cmpt2.componentIndex); + } + }); + } else { + var cmpts = isString(mainType) ? componentsMap.get(mainType) : isObject$2(mainType) ? this.findComponents(mainType) : null; + for (var i = 0; cmpts && i < cmpts.length; i++) { + var cmpt = cmpts[i]; + cmpt && cb.call(context, cmpt, cmpt.componentIndex); + } + } + }; + GlobalModel2.prototype.getSeriesByName = function(name) { + var nameStr = convertOptionIdName(name, null); + return filter(this._componentsMap.get("series"), function(oneSeries) { + return !!oneSeries && nameStr != null && oneSeries.name === nameStr; + }); + }; + GlobalModel2.prototype.getSeriesByIndex = function(seriesIndex) { + return this._componentsMap.get("series")[seriesIndex]; + }; + GlobalModel2.prototype.getSeriesByType = function(subType) { + return filter(this._componentsMap.get("series"), function(oneSeries) { + return !!oneSeries && oneSeries.subType === subType; + }); + }; + GlobalModel2.prototype.getSeries = function() { + return filter(this._componentsMap.get("series"), function(oneSeries) { + return !!oneSeries; + }); + }; + GlobalModel2.prototype.getSeriesCount = function() { + return this._componentsCount.get("series"); + }; + GlobalModel2.prototype.eachSeries = function(cb, context) { + assertSeriesInitialized(this); + each$4(this._seriesIndices, function(rawSeriesIndex) { + var series = this._componentsMap.get("series")[rawSeriesIndex]; + cb.call(context, series, rawSeriesIndex); + }, this); + }; + GlobalModel2.prototype.eachRawSeries = function(cb, context) { + each$4(this._componentsMap.get("series"), function(series) { + series && cb.call(context, series, series.componentIndex); + }); + }; + GlobalModel2.prototype.eachSeriesByType = function(subType, cb, context) { + assertSeriesInitialized(this); + each$4(this._seriesIndices, function(rawSeriesIndex) { + var series = this._componentsMap.get("series")[rawSeriesIndex]; + if (series.subType === subType) { + cb.call(context, series, rawSeriesIndex); + } + }, this); + }; + GlobalModel2.prototype.eachRawSeriesByType = function(subType, cb, context) { + return each$4(this.getSeriesByType(subType), cb, context); + }; + GlobalModel2.prototype.isSeriesFiltered = function(seriesModel) { + assertSeriesInitialized(this); + return this._seriesIndicesMap.get(seriesModel.componentIndex) == null; + }; + GlobalModel2.prototype.getCurrentSeriesIndices = function() { + return (this._seriesIndices || []).slice(); + }; + GlobalModel2.prototype.filterSeries = function(cb, context) { + assertSeriesInitialized(this); + var newSeriesIndices = []; + each$4(this._seriesIndices, function(seriesRawIdx) { + var series = this._componentsMap.get("series")[seriesRawIdx]; + cb.call(context, series, seriesRawIdx) && newSeriesIndices.push(seriesRawIdx); + }, this); + this._seriesIndices = newSeriesIndices; + this._seriesIndicesMap = createHashMap(newSeriesIndices); + }; + GlobalModel2.prototype.restoreData = function(payload) { + reCreateSeriesIndices(this); + var componentsMap = this._componentsMap; + var componentTypes = []; + componentsMap.each(function(components, componentType) { + if (ComponentModel.hasClass(componentType)) { + componentTypes.push(componentType); + } + }); + ComponentModel.topologicalTravel(componentTypes, ComponentModel.getAllClassMainTypes(), function(componentType) { + each$4(componentsMap.get(componentType), function(component) { + if (component && (componentType !== "series" || !isNotTargetSeries(component, payload))) { + component.restoreData(); + } + }); + }); + }; + GlobalModel2.internalField = function() { + reCreateSeriesIndices = function(ecModel) { + var seriesIndices = ecModel._seriesIndices = []; + each$4(ecModel._componentsMap.get("series"), function(series) { + series && seriesIndices.push(series.componentIndex); + }); + ecModel._seriesIndicesMap = createHashMap(seriesIndices); + }; + assertSeriesInitialized = function(ecModel) { + }; + initBase = function(ecModel, baseOption) { + ecModel.option = {}; + ecModel.option[OPTION_INNER_KEY] = OPTION_INNER_VALUE; + ecModel._componentsMap = createHashMap({ + series: [] + }); + ecModel._componentsCount = createHashMap(); + var airaOption = baseOption.aria; + if (isObject$2(airaOption) && airaOption.enabled == null) { + airaOption.enabled = true; + } + mergeTheme(baseOption, ecModel._theme.option); + merge(baseOption, globalDefault, false); + ecModel._mergeOption(baseOption, null); + }; + }(); + return GlobalModel2; + }(Model) +); +function isNotTargetSeries(seriesModel, payload) { + if (payload) { + var index = payload.seriesIndex; + var id = payload.seriesId; + var name_1 = payload.seriesName; + return index != null && seriesModel.componentIndex !== index || id != null && seriesModel.id !== id || name_1 != null && seriesModel.name !== name_1; + } +} +function mergeTheme(option, theme) { + var notMergeColorLayer = option.color && !option.colorLayer; + each$4(theme, function(themeItem, name) { + if (name === "colorLayer" && notMergeColorLayer) { + return; + } + if (!ComponentModel.hasClass(name)) { + if (typeof themeItem === "object") { + option[name] = !option[name] ? clone$2(themeItem) : merge(option[name], themeItem, false); + } else { + if (option[name] == null) { + option[name] = themeItem; + } + } + } + }); +} +function queryByIdOrName(attr, idOrName, cmpts) { + if (isArray(idOrName)) { + var keyMap_1 = createHashMap(); + each$4(idOrName, function(idOrNameItem) { + if (idOrNameItem != null) { + var idName = convertOptionIdName(idOrNameItem, null); + idName != null && keyMap_1.set(idOrNameItem, true); + } + }); + return filter(cmpts, function(cmpt) { + return cmpt && keyMap_1.get(cmpt[attr]); + }); + } else { + var idName_1 = convertOptionIdName(idOrName, null); + return filter(cmpts, function(cmpt) { + return cmpt && idName_1 != null && cmpt[attr] === idName_1; + }); + } +} +function filterBySubType(components, condition) { + return condition.hasOwnProperty("subType") ? filter(components, function(cmpt) { + return cmpt && cmpt.subType === condition.subType; + }) : components; +} +function normalizeSetOptionInput(opts) { + var replaceMergeMainTypeMap = createHashMap(); + opts && each$4(normalizeToArray(opts.replaceMerge), function(mainType) { + replaceMergeMainTypeMap.set(mainType, true); + }); + return { + replaceMergeMainTypeMap + }; +} +mixin(GlobalModel, PaletteMixin); + +var availableMethods = ['getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isSSR', 'isDisposed', 'on', 'off', 'getDataURL', 'getConnectedDataURL', +// 'getModel', +'getOption', +// 'getViewOfComponentModel', +// 'getViewOfSeriesModel', +'getId', 'updateLabelLayout']; +var ExtensionAPI = /** @class */function () { + function ExtensionAPI(ecInstance) { + each$4(availableMethods, function (methodName) { + this[methodName] = bind$1(ecInstance[methodName], ecInstance); + }, this); + } + return ExtensionAPI; +}(); + +var coordinateSystemCreators = {}; +var CoordinateSystemManager = /** @class */function () { + function CoordinateSystemManager() { + this._coordinateSystems = []; + } + CoordinateSystemManager.prototype.create = function (ecModel, api) { + var coordinateSystems = []; + each$4(coordinateSystemCreators, function (creator, type) { + var list = creator.create(ecModel, api); + coordinateSystems = coordinateSystems.concat(list || []); + }); + this._coordinateSystems = coordinateSystems; + }; + CoordinateSystemManager.prototype.update = function (ecModel, api) { + each$4(this._coordinateSystems, function (coordSys) { + coordSys.update && coordSys.update(ecModel, api); + }); + }; + CoordinateSystemManager.prototype.getCoordinateSystems = function () { + return this._coordinateSystems.slice(); + }; + CoordinateSystemManager.register = function (type, creator) { + coordinateSystemCreators[type] = creator; + }; + CoordinateSystemManager.get = function (type) { + return coordinateSystemCreators[type]; + }; + return CoordinateSystemManager; +}(); + +var QUERY_REG = /^(min|max)?(.+)$/; +var OptionManager = ( + /** @class */ + function() { + function OptionManager2(api) { + this._timelineOptions = []; + this._mediaList = []; + this._currentMediaIndices = []; + this._api = api; + } + OptionManager2.prototype.setOption = function(rawOption, optionPreprocessorFuncs, opt) { + if (rawOption) { + each$4(normalizeToArray(rawOption.series), function(series) { + series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data); + }); + each$4(normalizeToArray(rawOption.dataset), function(dataset) { + dataset && dataset.source && isTypedArray(dataset.source) && setAsPrimitive(dataset.source); + }); + } + rawOption = clone$2(rawOption); + var optionBackup = this._optionBackup; + var newParsedOption = parseRawOption(rawOption, optionPreprocessorFuncs, !optionBackup); + this._newBaseOption = newParsedOption.baseOption; + if (optionBackup) { + if (newParsedOption.timelineOptions.length) { + optionBackup.timelineOptions = newParsedOption.timelineOptions; + } + if (newParsedOption.mediaList.length) { + optionBackup.mediaList = newParsedOption.mediaList; + } + if (newParsedOption.mediaDefault) { + optionBackup.mediaDefault = newParsedOption.mediaDefault; + } + } else { + this._optionBackup = newParsedOption; + } + }; + OptionManager2.prototype.mountOption = function(isRecreate) { + var optionBackup = this._optionBackup; + this._timelineOptions = optionBackup.timelineOptions; + this._mediaList = optionBackup.mediaList; + this._mediaDefault = optionBackup.mediaDefault; + this._currentMediaIndices = []; + return clone$2(isRecreate ? optionBackup.baseOption : this._newBaseOption); + }; + OptionManager2.prototype.getTimelineOption = function(ecModel) { + var option; + var timelineOptions = this._timelineOptions; + if (timelineOptions.length) { + var timelineModel = ecModel.getComponent("timeline"); + if (timelineModel) { + option = clone$2( + // FIXME:TS as TimelineModel or quivlant interface + timelineOptions[timelineModel.getCurrentIndex()] + ); + } + } + return option; + }; + OptionManager2.prototype.getMediaOption = function(ecModel) { + var ecWidth = this._api.getWidth(); + var ecHeight = this._api.getHeight(); + var mediaList = this._mediaList; + var mediaDefault = this._mediaDefault; + var indices = []; + var result = []; + if (!mediaList.length && !mediaDefault) { + return result; + } + for (var i = 0, len = mediaList.length; i < len; i++) { + if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) { + indices.push(i); + } + } + if (!indices.length && mediaDefault) { + indices = [-1]; + } + if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) { + result = map$1(indices, function(index) { + return clone$2(index === -1 ? mediaDefault.option : mediaList[index].option); + }); + } + this._currentMediaIndices = indices; + return result; + }; + return OptionManager2; + }() +); +function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) { + var mediaList = []; + var mediaDefault; + var baseOption; + var declaredBaseOption = rawOption.baseOption; + var timelineOnRoot = rawOption.timeline; + var timelineOptionsOnRoot = rawOption.options; + var mediaOnRoot = rawOption.media; + var hasMedia = !!rawOption.media; + var hasTimeline = !!(timelineOptionsOnRoot || timelineOnRoot || declaredBaseOption && declaredBaseOption.timeline); + if (declaredBaseOption) { + baseOption = declaredBaseOption; + if (!baseOption.timeline) { + baseOption.timeline = timelineOnRoot; + } + } else { + if (hasTimeline || hasMedia) { + rawOption.options = rawOption.media = null; + } + baseOption = rawOption; + } + if (hasMedia) { + if (isArray(mediaOnRoot)) { + each$4(mediaOnRoot, function(singleMedia) { + if (singleMedia && singleMedia.option) { + if (singleMedia.query) { + mediaList.push(singleMedia); + } else if (!mediaDefault) { + mediaDefault = singleMedia; + } + } + }); + } + } + doPreprocess(baseOption); + each$4(timelineOptionsOnRoot, function(option) { + return doPreprocess(option); + }); + each$4(mediaList, function(media) { + return doPreprocess(media.option); + }); + function doPreprocess(option) { + each$4(optionPreprocessorFuncs, function(preProcess) { + preProcess(option, isNew); + }); + } + return { + baseOption, + timelineOptions: timelineOptionsOnRoot || [], + mediaDefault, + mediaList + }; +} +function applyMediaQuery(query, ecWidth, ecHeight) { + var realMap = { + width: ecWidth, + height: ecHeight, + aspectratio: ecWidth / ecHeight + // lower case for convenience. + }; + var applicable = true; + each$4(query, function(value, attr) { + var matched = attr.match(QUERY_REG); + if (!matched || !matched[1] || !matched[2]) { + return; + } + var operator = matched[1]; + var realAttr = matched[2].toLowerCase(); + if (!compare(realMap[realAttr], value, operator)) { + applicable = false; + } + }); + return applicable; +} +function compare(real, expect, operator) { + if (operator === "min") { + return real >= expect; + } else if (operator === "max") { + return real <= expect; + } else { + return real === expect; + } +} +function indicesEquals(indices1, indices2) { + return indices1.join(",") === indices2.join(","); +} + +var each$2 = each$4; +var isObject$1 = isObject$2; +var POSSIBLE_STYLES = ["areaStyle", "lineStyle", "nodeStyle", "linkStyle", "chordStyle", "label", "labelLine"]; +function compatEC2ItemStyle(opt) { + var itemStyleOpt = opt && opt.itemStyle; + if (!itemStyleOpt) { + return; + } + for (var i = 0, len = POSSIBLE_STYLES.length; i < len; i++) { + var styleName = POSSIBLE_STYLES[i]; + var normalItemStyleOpt = itemStyleOpt.normal; + var emphasisItemStyleOpt = itemStyleOpt.emphasis; + if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].normal) { + opt[styleName].normal = normalItemStyleOpt[styleName]; + } else { + merge(opt[styleName].normal, normalItemStyleOpt[styleName]); + } + normalItemStyleOpt[styleName] = null; + } + if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].emphasis) { + opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; + } else { + merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); + } + emphasisItemStyleOpt[styleName] = null; + } + } +} +function convertNormalEmphasis(opt, optType, useExtend) { + if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) { + var normalOpt = opt[optType].normal; + var emphasisOpt = opt[optType].emphasis; + if (normalOpt) { + if (useExtend) { + opt[optType].normal = opt[optType].emphasis = null; + defaults(opt[optType], normalOpt); + } else { + opt[optType] = normalOpt; + } + } + if (emphasisOpt) { + opt.emphasis = opt.emphasis || {}; + opt.emphasis[optType] = emphasisOpt; + if (emphasisOpt.focus) { + opt.emphasis.focus = emphasisOpt.focus; + } + if (emphasisOpt.blurScope) { + opt.emphasis.blurScope = emphasisOpt.blurScope; + } + } + } +} +function removeEC3NormalStatus(opt) { + convertNormalEmphasis(opt, "itemStyle"); + convertNormalEmphasis(opt, "lineStyle"); + convertNormalEmphasis(opt, "areaStyle"); + convertNormalEmphasis(opt, "label"); + convertNormalEmphasis(opt, "labelLine"); + convertNormalEmphasis(opt, "upperLabel"); + convertNormalEmphasis(opt, "edgeLabel"); +} +function compatTextStyle(opt, propName) { + var labelOptSingle = isObject$1(opt) && opt[propName]; + var textStyle = isObject$1(labelOptSingle) && labelOptSingle.textStyle; + if (textStyle) { + for (var i = 0, len = TEXT_STYLE_OPTIONS.length; i < len; i++) { + var textPropName = TEXT_STYLE_OPTIONS[i]; + if (textStyle.hasOwnProperty(textPropName)) { + labelOptSingle[textPropName] = textStyle[textPropName]; + } + } + } +} +function compatEC3CommonStyles(opt) { + if (opt) { + removeEC3NormalStatus(opt); + compatTextStyle(opt, "label"); + opt.emphasis && compatTextStyle(opt.emphasis, "label"); + } +} +function processSeries(seriesOpt) { + if (!isObject$1(seriesOpt)) { + return; + } + compatEC2ItemStyle(seriesOpt); + removeEC3NormalStatus(seriesOpt); + compatTextStyle(seriesOpt, "label"); + compatTextStyle(seriesOpt, "upperLabel"); + compatTextStyle(seriesOpt, "edgeLabel"); + if (seriesOpt.emphasis) { + compatTextStyle(seriesOpt.emphasis, "label"); + compatTextStyle(seriesOpt.emphasis, "upperLabel"); + compatTextStyle(seriesOpt.emphasis, "edgeLabel"); + } + var markPoint = seriesOpt.markPoint; + if (markPoint) { + compatEC2ItemStyle(markPoint); + compatEC3CommonStyles(markPoint); + } + var markLine = seriesOpt.markLine; + if (markLine) { + compatEC2ItemStyle(markLine); + compatEC3CommonStyles(markLine); + } + var markArea = seriesOpt.markArea; + if (markArea) { + compatEC3CommonStyles(markArea); + } + var data = seriesOpt.data; + if (seriesOpt.type === "graph") { + data = data || seriesOpt.nodes; + var edgeData = seriesOpt.links || seriesOpt.edges; + if (edgeData && !isTypedArray(edgeData)) { + for (var i = 0; i < edgeData.length; i++) { + compatEC3CommonStyles(edgeData[i]); + } + } + each$4(seriesOpt.categories, function(opt) { + removeEC3NormalStatus(opt); + }); + } + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatEC3CommonStyles(data[i]); + } + } + markPoint = seriesOpt.markPoint; + if (markPoint && markPoint.data) { + var mpData = markPoint.data; + for (var i = 0; i < mpData.length; i++) { + compatEC3CommonStyles(mpData[i]); + } + } + markLine = seriesOpt.markLine; + if (markLine && markLine.data) { + var mlData = markLine.data; + for (var i = 0; i < mlData.length; i++) { + if (isArray(mlData[i])) { + compatEC3CommonStyles(mlData[i][0]); + compatEC3CommonStyles(mlData[i][1]); + } else { + compatEC3CommonStyles(mlData[i]); + } + } + } + if (seriesOpt.type === "gauge") { + compatTextStyle(seriesOpt, "axisLabel"); + compatTextStyle(seriesOpt, "title"); + compatTextStyle(seriesOpt, "detail"); + } else if (seriesOpt.type === "treemap") { + convertNormalEmphasis(seriesOpt.breadcrumb, "itemStyle"); + each$4(seriesOpt.levels, function(opt) { + removeEC3NormalStatus(opt); + }); + } else if (seriesOpt.type === "tree") { + removeEC3NormalStatus(seriesOpt.leaves); + } +} +function toArr(o) { + return isArray(o) ? o : o ? [o] : []; +} +function toObj(o) { + return (isArray(o) ? o[0] : o) || {}; +} +function globalCompatStyle(option, isTheme) { + each$2(toArr(option.series), function(seriesOpt) { + isObject$1(seriesOpt) && processSeries(seriesOpt); + }); + var axes = ["xAxis", "yAxis", "radiusAxis", "angleAxis", "singleAxis", "parallelAxis", "radar"]; + isTheme && axes.push("valueAxis", "categoryAxis", "logAxis", "timeAxis"); + each$2(axes, function(axisName) { + each$2(toArr(option[axisName]), function(axisOpt) { + if (axisOpt) { + compatTextStyle(axisOpt, "axisLabel"); + compatTextStyle(axisOpt.axisPointer, "label"); + } + }); + }); + each$2(toArr(option.parallel), function(parallelOpt) { + var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault; + compatTextStyle(parallelAxisDefault, "axisLabel"); + compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, "label"); + }); + each$2(toArr(option.calendar), function(calendarOpt) { + convertNormalEmphasis(calendarOpt, "itemStyle"); + compatTextStyle(calendarOpt, "dayLabel"); + compatTextStyle(calendarOpt, "monthLabel"); + compatTextStyle(calendarOpt, "yearLabel"); + }); + each$2(toArr(option.radar), function(radarOpt) { + compatTextStyle(radarOpt, "name"); + if (radarOpt.name && radarOpt.axisName == null) { + radarOpt.axisName = radarOpt.name; + delete radarOpt.name; + } + if (radarOpt.nameGap != null && radarOpt.axisNameGap == null) { + radarOpt.axisNameGap = radarOpt.nameGap; + delete radarOpt.nameGap; + } + }); + each$2(toArr(option.geo), function(geoOpt) { + if (isObject$1(geoOpt)) { + compatEC3CommonStyles(geoOpt); + each$2(toArr(geoOpt.regions), function(regionObj) { + compatEC3CommonStyles(regionObj); + }); + } + }); + each$2(toArr(option.timeline), function(timelineOpt) { + compatEC3CommonStyles(timelineOpt); + convertNormalEmphasis(timelineOpt, "label"); + convertNormalEmphasis(timelineOpt, "itemStyle"); + convertNormalEmphasis(timelineOpt, "controlStyle", true); + var data = timelineOpt.data; + isArray(data) && each$4(data, function(item) { + if (isObject$2(item)) { + convertNormalEmphasis(item, "label"); + convertNormalEmphasis(item, "itemStyle"); + } + }); + }); + each$2(toArr(option.toolbox), function(toolboxOpt) { + convertNormalEmphasis(toolboxOpt, "iconStyle"); + each$2(toolboxOpt.feature, function(featureOpt) { + convertNormalEmphasis(featureOpt, "iconStyle"); + }); + }); + compatTextStyle(toObj(option.axisPointer), "label"); + compatTextStyle(toObj(option.tooltip).axisPointer, "label"); +} + +function get(opt, path) { + var pathArr = path.split(","); + var obj = opt; + for (var i = 0; i < pathArr.length; i++) { + obj = obj && obj[pathArr[i]]; + if (obj == null) { + break; + } + } + return obj; +} +function set(opt, path, val, overwrite) { + var pathArr = path.split(","); + var obj = opt; + var key; + var i = 0; + for (; i < pathArr.length - 1; i++) { + key = pathArr[i]; + if (obj[key] == null) { + obj[key] = {}; + } + obj = obj[key]; + } + if (obj[pathArr[i]] == null) { + obj[pathArr[i]] = val; + } +} +function compatLayoutProperties(option) { + option && each$4(LAYOUT_PROPERTIES, function(prop) { + if (prop[0] in option && !(prop[1] in option)) { + option[prop[1]] = option[prop[0]]; + } + }); +} +var LAYOUT_PROPERTIES = [["x", "left"], ["y", "top"], ["x2", "right"], ["y2", "bottom"]]; +var COMPATITABLE_COMPONENTS = ["grid", "geo", "parallel", "legend", "toolbox", "title", "visualMap", "dataZoom", "timeline"]; +var BAR_ITEM_STYLE_MAP = [["borderRadius", "barBorderRadius"], ["borderColor", "barBorderColor"], ["borderWidth", "barBorderWidth"]]; +function compatBarItemStyle(option) { + var itemStyle = option && option.itemStyle; + if (itemStyle) { + for (var i = 0; i < BAR_ITEM_STYLE_MAP.length; i++) { + var oldName = BAR_ITEM_STYLE_MAP[i][1]; + var newName = BAR_ITEM_STYLE_MAP[i][0]; + if (itemStyle[oldName] != null) { + itemStyle[newName] = itemStyle[oldName]; + } + } + } +} +function compatPieLabel(option) { + if (!option) { + return; + } + if (option.alignTo === "edge" && option.margin != null && option.edgeDistance == null) { + option.edgeDistance = option.margin; + } +} +function compatSunburstState(option) { + if (!option) { + return; + } + if (option.downplay && !option.blur) { + option.blur = option.downplay; + } +} +function compatGraphFocus(option) { + if (!option) { + return; + } + if (option.focusNodeAdjacency != null) { + option.emphasis = option.emphasis || {}; + if (option.emphasis.focus == null) { + option.emphasis.focus = "adjacency"; + } + } +} +function traverseTree(data, cb) { + if (data) { + for (var i = 0; i < data.length; i++) { + cb(data[i]); + data[i] && traverseTree(data[i].children, cb); + } + } +} +function globalBackwardCompat(option, isTheme) { + globalCompatStyle(option, isTheme); + option.series = normalizeToArray(option.series); + each$4(option.series, function(seriesOpt) { + if (!isObject$2(seriesOpt)) { + return; + } + var seriesType = seriesOpt.type; + if (seriesType === "line") { + if (seriesOpt.clipOverflow != null) { + seriesOpt.clip = seriesOpt.clipOverflow; + } + } else if (seriesType === "pie" || seriesType === "gauge") { + if (seriesOpt.clockWise != null) { + seriesOpt.clockwise = seriesOpt.clockWise; + } + compatPieLabel(seriesOpt.label); + var data = seriesOpt.data; + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatPieLabel(data[i]); + } + } + if (seriesOpt.hoverOffset != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + if (seriesOpt.emphasis.scaleSize = null) { + seriesOpt.emphasis.scaleSize = seriesOpt.hoverOffset; + } + } + } else if (seriesType === "gauge") { + var pointerColor = get(seriesOpt, "pointer.color"); + pointerColor != null && set(seriesOpt, "itemStyle.color", pointerColor); + } else if (seriesType === "bar") { + compatBarItemStyle(seriesOpt); + compatBarItemStyle(seriesOpt.backgroundStyle); + compatBarItemStyle(seriesOpt.emphasis); + var data = seriesOpt.data; + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + if (typeof data[i] === "object") { + compatBarItemStyle(data[i]); + compatBarItemStyle(data[i] && data[i].emphasis); + } + } + } + } else if (seriesType === "sunburst") { + var highlightPolicy = seriesOpt.highlightPolicy; + if (highlightPolicy) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + if (!seriesOpt.emphasis.focus) { + seriesOpt.emphasis.focus = highlightPolicy; + } + } + compatSunburstState(seriesOpt); + traverseTree(seriesOpt.data, compatSunburstState); + } else if (seriesType === "graph" || seriesType === "sankey") { + compatGraphFocus(seriesOpt); + } else if (seriesType === "map") { + if (seriesOpt.mapType && !seriesOpt.map) { + seriesOpt.map = seriesOpt.mapType; + } + if (seriesOpt.mapLocation) { + defaults(seriesOpt, seriesOpt.mapLocation); + } + } + if (seriesOpt.hoverAnimation != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + if (seriesOpt.emphasis && seriesOpt.emphasis.scale == null) { + seriesOpt.emphasis.scale = seriesOpt.hoverAnimation; + } + } + compatLayoutProperties(seriesOpt); + }); + if (option.dataRange) { + option.visualMap = option.dataRange; + } + each$4(COMPATITABLE_COMPONENTS, function(componentName) { + var options = option[componentName]; + if (options) { + if (!isArray(options)) { + options = [options]; + } + each$4(options, function(option2) { + compatLayoutProperties(option2); + }); + } + }); +} + +// (1) [Caution]: the logic is correct based on the premises: +// data processing stage is blocked in stream. +// See +// (2) Only register once when import repeatedly. +// Should be executed after series is filtered and before stack calculation. +function dataStack(ecModel) { + var stackInfoMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var stack = seriesModel.get('stack'); + // Compatible: when `stack` is set as '', do not stack. + if (stack) { + var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []); + var data = seriesModel.getData(); + var stackInfo = { + // Used for calculate axis extent automatically. + // TODO: Type getCalculationInfo return more specific type? + stackResultDimension: data.getCalculationInfo('stackResultDimension'), + stackedOverDimension: data.getCalculationInfo('stackedOverDimension'), + stackedDimension: data.getCalculationInfo('stackedDimension'), + stackedByDimension: data.getCalculationInfo('stackedByDimension'), + isStackedByIndex: data.getCalculationInfo('isStackedByIndex'), + data: data, + seriesModel: seriesModel + }; + // If stacked on axis that do not support data stack. + if (!stackInfo.stackedDimension || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)) { + return; + } + stackInfoList.length && data.setCalculationInfo('stackedOnSeries', stackInfoList[stackInfoList.length - 1].seriesModel); + stackInfoList.push(stackInfo); + } + }); + stackInfoMap.each(calculateStack); +} +function calculateStack(stackInfoList) { + each$4(stackInfoList, function (targetStackInfo, idxInStack) { + var resultVal = []; + var resultNaN = [NaN, NaN]; + var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension]; + var targetData = targetStackInfo.data; + var isStackedByIndex = targetStackInfo.isStackedByIndex; + var stackStrategy = targetStackInfo.seriesModel.get('stackStrategy') || 'samesign'; + // Should not write on raw data, because stack series model list changes + // depending on legend selection. + targetData.modify(dims, function (v0, v1, dataIndex) { + var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex); + // Consider `connectNulls` of line area, if value is NaN, stackedOver + // should also be NaN, to draw a appropriate belt area. + if (isNaN(sum)) { + return resultNaN; + } + var byValue; + var stackedDataRawIndex; + if (isStackedByIndex) { + stackedDataRawIndex = targetData.getRawIndex(dataIndex); + } else { + byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex); + } + // If stackOver is NaN, chart view will render point on value start. + var stackedOver = NaN; + for (var j = idxInStack - 1; j >= 0; j--) { + var stackInfo = stackInfoList[j]; + // Has been optimized by inverted indices on `stackedByDimension`. + if (!isStackedByIndex) { + stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue); + } + if (stackedDataRawIndex >= 0) { + var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex); + // Considering positive stack, negative stack and empty data + if (stackStrategy === 'all' // single stack group + || stackStrategy === 'positive' && val > 0 || stackStrategy === 'negative' && val < 0 || stackStrategy === 'samesign' && sum >= 0 && val > 0 // All positive stack + || stackStrategy === 'samesign' && sum <= 0 && val < 0 // All negative stack + ) { + // The sum has to be very small to be affected by the + // floating arithmetic problem. An incorrect result will probably + // cause axis min/max to be filtered incorrectly. + sum = addSafe(sum, val); + stackedOver = val; + break; + } + } + } + resultVal[0] = sum; + resultVal[1] = stackedOver; + return resultVal; + }); + }); +} + +var SourceImpl = ( + /** @class */ + /* @__PURE__ */ function() { + function SourceImpl2(fields) { + this.data = fields.data || (fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []); + this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN; + this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN; + this.startIndex = fields.startIndex || 0; + this.dimensionsDetectedCount = fields.dimensionsDetectedCount; + this.metaRawOption = fields.metaRawOption; + var dimensionsDefine = this.dimensionsDefine = fields.dimensionsDefine; + if (dimensionsDefine) { + for (var i = 0; i < dimensionsDefine.length; i++) { + var dim = dimensionsDefine[i]; + if (dim.type == null) { + if (guessOrdinal(this, i) === BE_ORDINAL.Must) { + dim.type = "ordinal"; + } + } + } + } + } + return SourceImpl2; + }() +); +function isSourceInstance(val) { + return val instanceof SourceImpl; +} +function createSource(sourceData, thisMetaRawOption, sourceFormat) { + sourceFormat = sourceFormat || detectSourceFormat(sourceData); + var seriesLayoutBy = thisMetaRawOption.seriesLayoutBy; + var determined = determineSourceDimensions(sourceData, sourceFormat, seriesLayoutBy, thisMetaRawOption.sourceHeader, thisMetaRawOption.dimensions); + var source = new SourceImpl({ + data: sourceData, + sourceFormat, + seriesLayoutBy, + dimensionsDefine: determined.dimensionsDefine, + startIndex: determined.startIndex, + dimensionsDetectedCount: determined.dimensionsDetectedCount, + metaRawOption: clone$2(thisMetaRawOption) + }); + return source; +} +function createSourceFromSeriesDataOption(data) { + return new SourceImpl({ + data, + sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL + }); +} +function cloneSourceShallow(source) { + return new SourceImpl({ + data: source.data, + sourceFormat: source.sourceFormat, + seriesLayoutBy: source.seriesLayoutBy, + dimensionsDefine: clone$2(source.dimensionsDefine), + startIndex: source.startIndex, + dimensionsDetectedCount: source.dimensionsDetectedCount + }); +} +function detectSourceFormat(data) { + var sourceFormat = SOURCE_FORMAT_UNKNOWN; + if (isTypedArray(data)) { + sourceFormat = SOURCE_FORMAT_TYPED_ARRAY; + } else if (isArray(data)) { + if (data.length === 0) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + } + for (var i = 0, len = data.length; i < len; i++) { + var item = data[i]; + if (item == null) { + continue; + } else if (isArray(item) || isTypedArray(item)) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + break; + } else if (isObject$2(item)) { + sourceFormat = SOURCE_FORMAT_OBJECT_ROWS; + break; + } + } + } else if (isObject$2(data)) { + for (var key in data) { + if (hasOwn(data, key) && isArrayLike(data[key])) { + sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS; + break; + } + } + } + return sourceFormat; +} +function determineSourceDimensions(data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine) { + var dimensionsDetectedCount; + var startIndex; + if (!data) { + return { + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + startIndex, + dimensionsDetectedCount + }; + } + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; + if (sourceHeader === "auto" || sourceHeader == null) { + arrayRowsTravelFirst(function(val) { + if (val != null && val !== "-") { + if (isString(val)) { + startIndex == null && (startIndex = 1); + } else { + startIndex = 0; + } + } + }, seriesLayoutBy, dataArrayRows, 10); + } else { + startIndex = isNumber(sourceHeader) ? sourceHeader : sourceHeader ? 1 : 0; + } + if (!dimensionsDefine && startIndex === 1) { + dimensionsDefine = []; + arrayRowsTravelFirst(function(val, index) { + dimensionsDefine[index] = val != null ? val + "" : ""; + }, seriesLayoutBy, dataArrayRows, Infinity); + } + dimensionsDetectedCount = dimensionsDefine ? dimensionsDefine.length : seriesLayoutBy === SERIES_LAYOUT_BY_ROW ? dataArrayRows.length : dataArrayRows[0] ? dataArrayRows[0].length : null; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + if (!dimensionsDefine) { + dimensionsDefine = objectRowsCollectDimensions(data); + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + if (!dimensionsDefine) { + dimensionsDefine = []; + each$4(data, function(colArr, key) { + dimensionsDefine.push(key); + }); + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var value0 = getDataItemValue(data[0]); + dimensionsDetectedCount = isArray(value0) && value0.length || 1; + } else ; + return { + startIndex, + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + dimensionsDetectedCount + }; +} +function objectRowsCollectDimensions(data) { + var firstIndex = 0; + var obj; + while (firstIndex < data.length && !(obj = data[firstIndex++])) { + } + if (obj) { + return keys(obj); + } +} +function normalizeDimensionsOption(dimensionsDefine) { + if (!dimensionsDefine) { + return; + } + var nameMap = createHashMap(); + return map$1(dimensionsDefine, function(rawItem, index) { + rawItem = isObject$2(rawItem) ? rawItem : { + name: rawItem + }; + var item = { + name: rawItem.name, + displayName: rawItem.displayName, + type: rawItem.type + }; + if (item.name == null) { + return item; + } + item.name += ""; + if (item.displayName == null) { + item.displayName = item.name; + } + var exist = nameMap.get(item.name); + if (!exist) { + nameMap.set(item.name, { + count: 1 + }); + } else { + item.name += "-" + exist.count++; + } + return item; + }); +} +function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) { + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + for (var i = 0; i < data.length && i < maxLoop; i++) { + cb(data[i] ? data[i][0] : null, i); + } + } else { + var value0 = data[0] || []; + for (var i = 0; i < value0.length && i < maxLoop; i++) { + cb(value0[i], i); + } + } +} +function shouldRetrieveDataByName(source) { + var sourceFormat = source.sourceFormat; + return sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS; +} + +var _a, _b, _c; +var providerMethods; +var mountMethods; +var DefaultDataProvider = ( + /** @class */ + function() { + function DefaultDataProvider2(sourceParam, dimSize) { + var source = !isSourceInstance(sourceParam) ? createSourceFromSeriesDataOption(sourceParam) : sourceParam; + this._source = source; + var data = this._data = source.data; + if (source.sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + this._offset = 0; + this._dimSize = dimSize; + this._data = data; + } + mountMethods(this, data, source); + } + DefaultDataProvider2.prototype.getSource = function() { + return this._source; + }; + DefaultDataProvider2.prototype.count = function() { + return 0; + }; + DefaultDataProvider2.prototype.getItem = function(idx, out) { + return; + }; + DefaultDataProvider2.prototype.appendData = function(newData) { + }; + DefaultDataProvider2.prototype.clean = function() { + }; + DefaultDataProvider2.protoInitialize = function() { + var proto = DefaultDataProvider2.prototype; + proto.pure = false; + proto.persistent = true; + }(); + DefaultDataProvider2.internalField = function() { + var _a2; + mountMethods = function(provider, data, source) { + var sourceFormat = source.sourceFormat; + var seriesLayoutBy = source.seriesLayoutBy; + var startIndex = source.startIndex; + var dimsDef = source.dimensionsDefine; + var methods = providerMethods[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + extend(provider, methods); + if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + provider.getItem = getItemForTypedArray; + provider.count = countForTypedArray; + provider.fillStorage = fillStorageForTypedArray; + } else { + var rawItemGetter = getRawSourceItemGetter(sourceFormat, seriesLayoutBy); + provider.getItem = bind$1(rawItemGetter, null, data, startIndex, dimsDef); + var rawCounter = getRawSourceDataCounter(sourceFormat, seriesLayoutBy); + provider.count = bind$1(rawCounter, null, data, startIndex, dimsDef); + } + }; + var getItemForTypedArray = function(idx, out) { + idx = idx - this._offset; + out = out || []; + var data = this._data; + var dimSize = this._dimSize; + var offset = dimSize * idx; + for (var i = 0; i < dimSize; i++) { + out[i] = data[offset + i]; + } + return out; + }; + var fillStorageForTypedArray = function(start, end, storage, extent) { + var data = this._data; + var dimSize = this._dimSize; + for (var dim = 0; dim < dimSize; dim++) { + var dimExtent = extent[dim]; + var min = dimExtent[0] == null ? Infinity : dimExtent[0]; + var max = dimExtent[1] == null ? -Infinity : dimExtent[1]; + var count = end - start; + var arr = storage[dim]; + for (var i = 0; i < count; i++) { + var val = data[i * dimSize + dim]; + arr[start + i] = val; + val < min && (min = val); + val > max && (max = val); + } + dimExtent[0] = min; + dimExtent[1] = max; + } + }; + var countForTypedArray = function() { + return this._data ? this._data.length / this._dimSize : 0; + }; + providerMethods = (_a2 = {}, _a2[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_COLUMN] = { + pure: true, + appendData: appendDataSimply + }, _a2[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_ROW] = { + pure: true, + appendData: function() { + throw new Error('Do not support appendData when set seriesLayoutBy: "row".'); + } + }, _a2[SOURCE_FORMAT_OBJECT_ROWS] = { + pure: true, + appendData: appendDataSimply + }, _a2[SOURCE_FORMAT_KEYED_COLUMNS] = { + pure: true, + appendData: function(newData) { + var data = this._data; + each$4(newData, function(newCol, key) { + var oldCol = data[key] || (data[key] = []); + for (var i = 0; i < (newCol || []).length; i++) { + oldCol.push(newCol[i]); + } + }); + } + }, _a2[SOURCE_FORMAT_ORIGINAL] = { + appendData: appendDataSimply + }, _a2[SOURCE_FORMAT_TYPED_ARRAY] = { + persistent: false, + pure: true, + appendData: function(newData) { + this._data = newData; + }, + // Clean self if data is already used. + clean: function() { + this._offset += this.count(); + this._data = null; + } + }, _a2); + function appendDataSimply(newData) { + for (var i = 0; i < newData.length; i++) { + this._data.push(newData[i]); + } + } + }(); + return DefaultDataProvider2; + }() +); +var getItemSimply = function(rawData, startIndex, dimsDef, idx) { + return rawData[idx]; +}; +var rawSourceItemGetterMap = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_COLUMN] = function(rawData, startIndex, dimsDef, idx) { + return rawData[idx + startIndex]; +}, _a[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_ROW] = function(rawData, startIndex, dimsDef, idx, out) { + idx += startIndex; + var item = out || []; + var data = rawData; + for (var i = 0; i < data.length; i++) { + var row = data[i]; + item[i] = row ? row[idx] : null; + } + return item; +}, _a[SOURCE_FORMAT_OBJECT_ROWS] = getItemSimply, _a[SOURCE_FORMAT_KEYED_COLUMNS] = function(rawData, startIndex, dimsDef, idx, out) { + var item = out || []; + for (var i = 0; i < dimsDef.length; i++) { + var dimName = dimsDef[i].name; + var col = rawData[dimName]; + item[i] = col ? col[idx] : null; + } + return item; +}, _a[SOURCE_FORMAT_ORIGINAL] = getItemSimply, _a); +function getRawSourceItemGetter(sourceFormat, seriesLayoutBy) { + var method = rawSourceItemGetterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + return method; +} +var countSimply = function(rawData, startIndex, dimsDef) { + return rawData.length; +}; +var rawSourceDataCounterMap = (_b = {}, _b[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_COLUMN] = function(rawData, startIndex, dimsDef) { + return Math.max(0, rawData.length - startIndex); +}, _b[SOURCE_FORMAT_ARRAY_ROWS + "_" + SERIES_LAYOUT_BY_ROW] = function(rawData, startIndex, dimsDef) { + var row = rawData[0]; + return row ? Math.max(0, row.length - startIndex) : 0; +}, _b[SOURCE_FORMAT_OBJECT_ROWS] = countSimply, _b[SOURCE_FORMAT_KEYED_COLUMNS] = function(rawData, startIndex, dimsDef) { + var dimName = dimsDef[0].name; + var col = rawData[dimName]; + return col ? col.length : 0; +}, _b[SOURCE_FORMAT_ORIGINAL] = countSimply, _b); +function getRawSourceDataCounter(sourceFormat, seriesLayoutBy) { + var method = rawSourceDataCounterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + return method; +} +var getRawValueSimply = function(dataItem, dimIndex, property) { + return dataItem[dimIndex]; +}; +var rawSourceValueGetterMap = (_c = {}, _c[SOURCE_FORMAT_ARRAY_ROWS] = getRawValueSimply, _c[SOURCE_FORMAT_OBJECT_ROWS] = function(dataItem, dimIndex, property) { + return dataItem[property]; +}, _c[SOURCE_FORMAT_KEYED_COLUMNS] = getRawValueSimply, _c[SOURCE_FORMAT_ORIGINAL] = function(dataItem, dimIndex, property) { + var value = getDataItemValue(dataItem); + return !(value instanceof Array) ? value : value[dimIndex]; +}, _c[SOURCE_FORMAT_TYPED_ARRAY] = getRawValueSimply, _c); +function getRawSourceValueGetter(sourceFormat) { + var method = rawSourceValueGetterMap[sourceFormat]; + return method; +} +function getMethodMapKey(sourceFormat, seriesLayoutBy) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS ? sourceFormat + "_" + seriesLayoutBy : sourceFormat; +} +function retrieveRawValue(data, dataIndex, dim) { + if (!data) { + return; + } + var dataItem = data.getRawDataItem(dataIndex); + if (dataItem == null) { + return; + } + var store = data.getStore(); + var sourceFormat = store.getSource().sourceFormat; + if (dim != null) { + var dimIndex = data.getDimensionIndex(dim); + var property = store.getDimensionProperty(dimIndex); + return getRawSourceValueGetter(sourceFormat)(dataItem, dimIndex, property); + } else { + var result = dataItem; + if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + result = getDataItemValue(dataItem); + } + return result; + } +} + +var DIMENSION_LABEL_REG = /\{@(.+?)\}/g; +var DataFormatMixin = ( + /** @class */ + function() { + function DataFormatMixin2() { + } + DataFormatMixin2.prototype.getDataParams = function(dataIndex, dataType) { + var data = this.getData(dataType); + var rawValue = this.getRawValue(dataIndex, dataType); + var rawDataIndex = data.getRawIndex(dataIndex); + var name = data.getName(dataIndex); + var itemOpt = data.getRawDataItem(dataIndex); + var style = data.getItemVisual(dataIndex, "style"); + var color = style && style[data.getItemVisual(dataIndex, "drawType") || "fill"]; + var borderColor = style && style.stroke; + var mainType = this.mainType; + var isSeries = mainType === "series"; + var userOutput = data.userOutput && data.userOutput.get(); + return { + componentType: mainType, + componentSubType: this.subType, + componentIndex: this.componentIndex, + seriesType: isSeries ? this.subType : null, + seriesIndex: this.seriesIndex, + seriesId: isSeries ? this.id : null, + seriesName: isSeries ? this.name : null, + name, + dataIndex: rawDataIndex, + data: itemOpt, + dataType, + value: rawValue, + color, + borderColor, + dimensionNames: userOutput ? userOutput.fullDimensions : null, + encode: userOutput ? userOutput.encode : null, + // Param name list for mapping `a`, `b`, `c`, `d`, `e` + $vars: ["seriesName", "name", "value"] + }; + }; + DataFormatMixin2.prototype.getFormattedLabel = function(dataIndex, status, dataType, labelDimIndex, formatter, extendParams) { + status = status || "normal"; + var data = this.getData(dataType); + var params = this.getDataParams(dataIndex, dataType); + if (extendParams) { + params.value = extendParams.interpolatedValue; + } + if (labelDimIndex != null && isArray(params.value)) { + params.value = params.value[labelDimIndex]; + } + if (!formatter) { + var itemModel = data.getItemModel(dataIndex); + formatter = itemModel.get(status === "normal" ? ["label", "formatter"] : [status, "label", "formatter"]); + } + if (isFunction(formatter)) { + params.status = status; + params.dimensionIndex = labelDimIndex; + return formatter(params); + } else if (isString(formatter)) { + var str = formatTpl(formatter, params); + return str.replace(DIMENSION_LABEL_REG, function(origin, dimStr) { + var len = dimStr.length; + var dimLoose = dimStr; + if (dimLoose.charAt(0) === "[" && dimLoose.charAt(len - 1) === "]") { + dimLoose = +dimLoose.slice(1, len - 1); + } + var val = retrieveRawValue(data, dataIndex, dimLoose); + if (extendParams && isArray(extendParams.interpolatedValue)) { + var dimIndex = data.getDimensionIndex(dimLoose); + if (dimIndex >= 0) { + val = extendParams.interpolatedValue[dimIndex]; + } + } + return val != null ? val + "" : ""; + }); + } + }; + DataFormatMixin2.prototype.getRawValue = function(idx, dataType) { + return retrieveRawValue(this.getData(dataType), idx); + }; + DataFormatMixin2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { + return; + }; + return DataFormatMixin2; + }() +); +function normalizeTooltipFormatResult(result) { + var markupText; + var markupFragment; + if (isObject$2(result)) { + if (result.type) { + markupFragment = result; + } + } else { + markupText = result; + } + return { + text: markupText, + // markers: markers || markersExisting, + frag: markupFragment + }; +} + +function createTask(define) { + return new Task(define); +} +var Task = ( + /** @class */ + function() { + function Task2(define) { + define = define || {}; + this._reset = define.reset; + this._plan = define.plan; + this._count = define.count; + this._onDirty = define.onDirty; + this._dirty = true; + } + Task2.prototype.perform = function(performArgs) { + var upTask = this._upstream; + var skip = performArgs && performArgs.skip; + if (this._dirty && upTask) { + var context = this.context; + context.data = context.outputData = upTask.context.outputData; + } + if (this.__pipeline) { + this.__pipeline.currentTask = this; + } + var planResult; + if (this._plan && !skip) { + planResult = this._plan(this.context); + } + var lastModBy = normalizeModBy(this._modBy); + var lastModDataCount = this._modDataCount || 0; + var modBy = normalizeModBy(performArgs && performArgs.modBy); + var modDataCount = performArgs && performArgs.modDataCount || 0; + if (lastModBy !== modBy || lastModDataCount !== modDataCount) { + planResult = "reset"; + } + function normalizeModBy(val) { + !(val >= 1) && (val = 1); + return val; + } + var forceFirstProgress; + if (this._dirty || planResult === "reset") { + this._dirty = false; + forceFirstProgress = this._doReset(skip); + } + this._modBy = modBy; + this._modDataCount = modDataCount; + var step = performArgs && performArgs.step; + if (upTask) { + this._dueEnd = upTask._outputDueEnd; + } else { + this._dueEnd = this._count ? this._count(this.context) : Infinity; + } + if (this._progress) { + var start = this._dueIndex; + var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd); + if (!skip && (forceFirstProgress || start < end)) { + var progress = this._progress; + if (isArray(progress)) { + for (var i = 0; i < progress.length; i++) { + this._doProgress(progress[i], start, end, modBy, modDataCount); + } + } else { + this._doProgress(progress, start, end, modBy, modDataCount); + } + } + this._dueIndex = end; + var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end; + this._outputDueEnd = outputDueEnd; + } else { + this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd; + } + return this.unfinished(); + }; + Task2.prototype.dirty = function() { + this._dirty = true; + this._onDirty && this._onDirty(this.context); + }; + Task2.prototype._doProgress = function(progress, start, end, modBy, modDataCount) { + iterator.reset(start, end, modBy, modDataCount); + this._callingProgress = progress; + this._callingProgress({ + start, + end, + count: end - start, + next: iterator.next + }, this.context); + }; + Task2.prototype._doReset = function(skip) { + this._dueIndex = this._outputDueEnd = this._dueEnd = 0; + this._settedOutputEnd = null; + var progress; + var forceFirstProgress; + if (!skip && this._reset) { + progress = this._reset(this.context); + if (progress && progress.progress) { + forceFirstProgress = progress.forceFirstProgress; + progress = progress.progress; + } + if (isArray(progress) && !progress.length) { + progress = null; + } + } + this._progress = progress; + this._modBy = this._modDataCount = null; + var downstream = this._downstream; + downstream && downstream.dirty(); + return forceFirstProgress; + }; + Task2.prototype.unfinished = function() { + return this._progress && this._dueIndex < this._dueEnd; + }; + Task2.prototype.pipe = function(downTask) { + if (this._downstream !== downTask || this._dirty) { + this._downstream = downTask; + downTask._upstream = this; + downTask.dirty(); + } + }; + Task2.prototype.dispose = function() { + if (this._disposed) { + return; + } + this._upstream && (this._upstream._downstream = null); + this._downstream && (this._downstream._upstream = null); + this._dirty = false; + this._disposed = true; + }; + Task2.prototype.getUpstream = function() { + return this._upstream; + }; + Task2.prototype.getDownstream = function() { + return this._downstream; + }; + Task2.prototype.setOutputEnd = function(end) { + this._outputDueEnd = this._settedOutputEnd = end; + }; + return Task2; + }() +); +var iterator = /* @__PURE__ */ function() { + var end; + var current; + var modBy; + var modDataCount; + var winCount; + var it = { + reset: function(s, e, sStep, sCount) { + current = s; + end = e; + modBy = sStep; + modDataCount = sCount; + winCount = Math.ceil(modDataCount / modBy); + it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext; + } + }; + return it; + function sequentialNext() { + return current < end ? current++ : null; + } + function modNext() { + var dataIndex = current % winCount * modBy + Math.ceil(current / winCount); + var result = current >= end ? null : dataIndex < modDataCount ? dataIndex : current; + current++; + return result; + } +}(); + +function parseDataValue(value, opt) { + var dimType = opt && opt.type; + if (dimType === "ordinal") { + return value; + } + if (dimType === "time" && !isNumber(value) && value != null && value !== "-") { + value = +parseDate(value); + } + return value == null || value === "" ? NaN : Number(value); +} +createHashMap({ + "number": function(val) { + return parseFloat(val); + }, + "time": function(val) { + return +parseDate(val); + }, + "trim": function(val) { + return isString(val) ? trim(val) : val; + } +}); +var SortOrderComparator = ( + /** @class */ + function() { + function SortOrderComparator2(order, incomparable) { + var isDesc = order === "desc"; + this._resultLT = isDesc ? 1 : -1; + if (incomparable == null) { + incomparable = isDesc ? "min" : "max"; + } + this._incomparable = incomparable === "min" ? -Infinity : Infinity; + } + SortOrderComparator2.prototype.evaluate = function(lval, rval) { + var lvalFloat = isNumber(lval) ? lval : numericToNumber(lval); + var rvalFloat = isNumber(rval) ? rval : numericToNumber(rval); + var lvalNotNumeric = isNaN(lvalFloat); + var rvalNotNumeric = isNaN(rvalFloat); + if (lvalNotNumeric) { + lvalFloat = this._incomparable; + } + if (rvalNotNumeric) { + rvalFloat = this._incomparable; + } + if (lvalNotNumeric && rvalNotNumeric) { + var lvalIsStr = isString(lval); + var rvalIsStr = isString(rval); + if (lvalIsStr) { + lvalFloat = rvalIsStr ? lval : 0; + } + if (rvalIsStr) { + rvalFloat = lvalIsStr ? rval : 0; + } + } + return lvalFloat < rvalFloat ? this._resultLT : lvalFloat > rvalFloat ? -this._resultLT : 0; + }; + return SortOrderComparator2; + }() +); + +var ExternalSource = ( + /** @class */ + function() { + function ExternalSource2() { + } + ExternalSource2.prototype.getRawData = function() { + throw new Error("not supported"); + }; + ExternalSource2.prototype.getRawDataItem = function(dataIndex) { + throw new Error("not supported"); + }; + ExternalSource2.prototype.cloneRawData = function() { + return; + }; + ExternalSource2.prototype.getDimensionInfo = function(dim) { + return; + }; + ExternalSource2.prototype.cloneAllDimensionInfo = function() { + return; + }; + ExternalSource2.prototype.count = function() { + return; + }; + ExternalSource2.prototype.retrieveValue = function(dataIndex, dimIndex) { + return; + }; + ExternalSource2.prototype.retrieveValueFromItem = function(dataItem, dimIndex) { + return; + }; + ExternalSource2.prototype.convertValue = function(rawVal, dimInfo) { + return parseDataValue(rawVal, dimInfo); + }; + return ExternalSource2; + }() +); +function createExternalSource(internalSource, externalTransform) { + var extSource = new ExternalSource(); + var data = internalSource.data; + var sourceFormat = extSource.sourceFormat = internalSource.sourceFormat; + var sourceHeaderCount = internalSource.startIndex; + var errMsg = ""; + if (internalSource.seriesLayoutBy !== SERIES_LAYOUT_BY_COLUMN) { + throwError(errMsg); + } + var dimensions = []; + var dimsByName = {}; + var dimsDef = internalSource.dimensionsDefine; + if (dimsDef) { + each$4(dimsDef, function(dimDef, idx) { + var name = dimDef.name; + var dimDefExt = { + index: idx, + name, + displayName: dimDef.displayName + }; + dimensions.push(dimDefExt); + if (name != null) { + var errMsg_1 = ""; + if (hasOwn(dimsByName, name)) { + throwError(errMsg_1); + } + dimsByName[name] = dimDefExt; + } + }); + } else { + for (var i = 0; i < internalSource.dimensionsDetectedCount || 0; i++) { + dimensions.push({ + index: i + }); + } + } + var rawItemGetter = getRawSourceItemGetter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + if (externalTransform.__isBuiltIn) { + extSource.getRawDataItem = function(dataIndex) { + return rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + }; + extSource.getRawData = bind$1(getRawData, null, internalSource); + } + extSource.cloneRawData = bind$1(cloneRawData, null, internalSource); + var rawCounter = getRawSourceDataCounter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + extSource.count = bind$1(rawCounter, null, data, sourceHeaderCount, dimensions); + var rawValueGetter = getRawSourceValueGetter(sourceFormat); + extSource.retrieveValue = function(dataIndex, dimIndex) { + var rawItem = rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + return retrieveValueFromItem(rawItem, dimIndex); + }; + var retrieveValueFromItem = extSource.retrieveValueFromItem = function(dataItem, dimIndex) { + if (dataItem == null) { + return; + } + var dimDef = dimensions[dimIndex]; + if (dimDef) { + return rawValueGetter(dataItem, dimIndex, dimDef.name); + } + }; + extSource.getDimensionInfo = bind$1(getDimensionInfo, null, dimensions, dimsByName); + extSource.cloneAllDimensionInfo = bind$1(cloneAllDimensionInfo, null, dimensions); + return extSource; +} +function getRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ""; + throwError(errMsg); + } + return upstream.data; +} +function cloneRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + var data = upstream.data; + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ""; + throwError(errMsg); + } + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var result = []; + for (var i = 0, len = data.length; i < len; i++) { + result.push(data[i].slice()); + } + return result; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var result = []; + for (var i = 0, len = data.length; i < len; i++) { + result.push(extend({}, data[i])); + } + return result; + } +} +function getDimensionInfo(dimensions, dimsByName, dim) { + if (dim == null) { + return; + } + if (isNumber(dim) || !isNaN(dim) && !hasOwn(dimsByName, dim)) { + return dimensions[dim]; + } else if (hasOwn(dimsByName, dim)) { + return dimsByName[dim]; + } +} +function cloneAllDimensionInfo(dimensions) { + return clone$2(dimensions); +} +var externalTransformMap = createHashMap(); +function registerExternalTransform(externalTransform) { + externalTransform = clone$2(externalTransform); + var type = externalTransform.type; + var errMsg = ""; + if (!type) { + throwError(errMsg); + } + var typeParsed = type.split(":"); + if (typeParsed.length !== 2) { + throwError(errMsg); + } + var isBuiltIn = false; + if (typeParsed[0] === "echarts") { + type = typeParsed[1]; + isBuiltIn = true; + } + externalTransform.__isBuiltIn = isBuiltIn; + externalTransformMap.set(type, externalTransform); +} +function applyDataTransform(rawTransOption, sourceList, infoForPrint) { + var pipedTransOption = normalizeToArray(rawTransOption); + var pipeLen = pipedTransOption.length; + var errMsg = ""; + if (!pipeLen) { + throwError(errMsg); + } + for (var i = 0, len = pipeLen; i < len; i++) { + var transOption = pipedTransOption[i]; + sourceList = applySingleDataTransform(transOption, sourceList); + if (i !== len - 1) { + sourceList.length = Math.max(sourceList.length, 1); + } + } + return sourceList; +} +function applySingleDataTransform(transOption, upSourceList, infoForPrint, pipeIndex) { + var errMsg = ""; + if (!upSourceList.length) { + throwError(errMsg); + } + if (!isObject$2(transOption)) { + throwError(errMsg); + } + var transType = transOption.type; + var externalTransform = externalTransformMap.get(transType); + if (!externalTransform) { + throwError(errMsg); + } + var extUpSourceList = map$1(upSourceList, function(upSource) { + return createExternalSource(upSource, externalTransform); + }); + var resultList = normalizeToArray(externalTransform.transform({ + upstream: extUpSourceList[0], + upstreamList: extUpSourceList, + config: clone$2(transOption.config) + })); + return map$1(resultList, function(result, resultIndex) { + var errMsg2 = ""; + if (!isObject$2(result)) { + throwError(errMsg2); + } + if (!result.data) { + throwError(errMsg2); + } + var sourceFormat = detectSourceFormat(result.data); + if (!isSupportedSourceFormat(sourceFormat)) { + throwError(errMsg2); + } + var resultMetaRawOption; + var firstUpSource = upSourceList[0]; + if (firstUpSource && resultIndex === 0 && !result.dimensions) { + var startIndex = firstUpSource.startIndex; + if (startIndex) { + result.data = firstUpSource.data.slice(0, startIndex).concat(result.data); + } + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: startIndex, + dimensions: firstUpSource.metaRawOption.dimensions + }; + } else { + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: 0, + dimensions: result.dimensions + }; + } + return createSource(result.data, resultMetaRawOption, null); + }); +} +function isSupportedSourceFormat(sourceFormat) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS || sourceFormat === SOURCE_FORMAT_OBJECT_ROWS; +} + +var UNDEFINED = "undefined"; +var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array; +var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array; +var CtorInt32Array$1 = typeof Int32Array === UNDEFINED ? Array : Int32Array; +var CtorFloat64Array = typeof Float64Array === UNDEFINED ? Array : Float64Array; +var dataCtors = { + "float": CtorFloat64Array, + "int": CtorInt32Array$1, + // Ordinal data type can be string or int + "ordinal": Array, + "number": Array, + "time": CtorFloat64Array +}; +var defaultDimValueGetters; +function getIndicesCtor(rawCount) { + return rawCount > 65535 ? CtorUint32Array : CtorUint16Array; +} +function getInitialExtent() { + return [Infinity, -Infinity]; +} +function cloneChunk(originalChunk) { + var Ctor = originalChunk.constructor; + return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk); +} +function prepareStore(store, dimIdx, dimType, end, append) { + var DataCtor = dataCtors[dimType || "float"]; + if (append) { + var oldStore = store[dimIdx]; + var oldLen = oldStore && oldStore.length; + if (!(oldLen === end)) { + var newStore = new DataCtor(end); + for (var j = 0; j < oldLen; j++) { + newStore[j] = oldStore[j]; + } + store[dimIdx] = newStore; + } + } else { + store[dimIdx] = new DataCtor(end); + } +} +var DataStore = ( + /** @class */ + function() { + function DataStore2() { + this._chunks = []; + this._rawExtent = []; + this._extent = []; + this._count = 0; + this._rawCount = 0; + this._calcDimNameToIdx = createHashMap(); + } + DataStore2.prototype.initData = function(provider, inputDimensions, dimValueGetter) { + this._provider = provider; + this._chunks = []; + this._indices = null; + this.getRawIndex = this._getRawIdxIdentity; + var source = provider.getSource(); + var defaultGetter = this.defaultDimValueGetter = defaultDimValueGetters[source.sourceFormat]; + this._dimValueGetter = dimValueGetter || defaultGetter; + this._rawExtent = []; + shouldRetrieveDataByName(source); + this._dimensions = map$1(inputDimensions, function(dim) { + return { + // Only pick these two props. Not leak other properties like orderMeta. + type: dim.type, + property: dim.property + }; + }); + this._initDataFromProvider(0, provider.count()); + }; + DataStore2.prototype.getProvider = function() { + return this._provider; + }; + DataStore2.prototype.getSource = function() { + return this._provider.getSource(); + }; + DataStore2.prototype.ensureCalculationDimension = function(dimName, type) { + var calcDimNameToIdx = this._calcDimNameToIdx; + var dimensions = this._dimensions; + var calcDimIdx = calcDimNameToIdx.get(dimName); + if (calcDimIdx != null) { + if (dimensions[calcDimIdx].type === type) { + return calcDimIdx; + } + } else { + calcDimIdx = dimensions.length; + } + dimensions[calcDimIdx] = { + type + }; + calcDimNameToIdx.set(dimName, calcDimIdx); + this._chunks[calcDimIdx] = new dataCtors[type || "float"](this._rawCount); + this._rawExtent[calcDimIdx] = getInitialExtent(); + return calcDimIdx; + }; + DataStore2.prototype.collectOrdinalMeta = function(dimIdx, ordinalMeta) { + var chunk = this._chunks[dimIdx]; + var dim = this._dimensions[dimIdx]; + var rawExtents = this._rawExtent; + var offset = dim.ordinalOffset || 0; + var len = chunk.length; + if (offset === 0) { + rawExtents[dimIdx] = getInitialExtent(); + } + var dimRawExtent = rawExtents[dimIdx]; + for (var i = offset; i < len; i++) { + var val = chunk[i] = ordinalMeta.parseAndCollect(chunk[i]); + if (!isNaN(val)) { + dimRawExtent[0] = Math.min(val, dimRawExtent[0]); + dimRawExtent[1] = Math.max(val, dimRawExtent[1]); + } + } + dim.ordinalMeta = ordinalMeta; + dim.ordinalOffset = len; + dim.type = "ordinal"; + }; + DataStore2.prototype.getOrdinalMeta = function(dimIdx) { + var dimInfo = this._dimensions[dimIdx]; + var ordinalMeta = dimInfo.ordinalMeta; + return ordinalMeta; + }; + DataStore2.prototype.getDimensionProperty = function(dimIndex) { + var item = this._dimensions[dimIndex]; + return item && item.property; + }; + DataStore2.prototype.appendData = function(data) { + var provider = this._provider; + var start = this.count(); + provider.appendData(data); + var end = provider.count(); + if (!provider.persistent) { + end += start; + } + if (start < end) { + this._initDataFromProvider(start, end, true); + } + return [start, end]; + }; + DataStore2.prototype.appendValues = function(values, minFillLen) { + var chunks = this._chunks; + var dimensions = this._dimensions; + var dimLen = dimensions.length; + var rawExtent = this._rawExtent; + var start = this.count(); + var end = start + Math.max(values.length, minFillLen || 0); + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + prepareStore(chunks, i, dim.type, end, true); + } + var emptyDataItem = []; + for (var idx = start; idx < end; idx++) { + var sourceIdx = idx - start; + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dim = dimensions[dimIdx]; + var val = defaultDimValueGetters.arrayRows.call(this, values[sourceIdx] || emptyDataItem, dim.property, sourceIdx, dimIdx); + chunks[dimIdx][idx] = val; + var dimRawExtent = rawExtent[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } + } + this._rawCount = this._count = end; + return { + start, + end + }; + }; + DataStore2.prototype._initDataFromProvider = function(start, end, append) { + var provider = this._provider; + var chunks = this._chunks; + var dimensions = this._dimensions; + var dimLen = dimensions.length; + var rawExtent = this._rawExtent; + var dimNames = map$1(dimensions, function(dim2) { + return dim2.property; + }); + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + if (!rawExtent[i]) { + rawExtent[i] = getInitialExtent(); + } + prepareStore(chunks, i, dim.type, end, append); + } + if (provider.fillStorage) { + provider.fillStorage(start, end, chunks, rawExtent); + } else { + var dataItem = []; + for (var idx = start; idx < end; idx++) { + dataItem = provider.getItem(idx, dataItem); + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dimStorage = chunks[dimIdx]; + var val = this._dimValueGetter(dataItem, dimNames[dimIdx], idx, dimIdx); + dimStorage[idx] = val; + var dimRawExtent = rawExtent[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } + } + } + if (!provider.persistent && provider.clean) { + provider.clean(); + } + this._rawCount = this._count = end; + this._extent = []; + }; + DataStore2.prototype.count = function() { + return this._count; + }; + DataStore2.prototype.get = function(dim, idx) { + if (!(idx >= 0 && idx < this._count)) { + return NaN; + } + var dimStore = this._chunks[dim]; + return dimStore ? dimStore[this.getRawIndex(idx)] : NaN; + }; + DataStore2.prototype.getValues = function(dimensions, idx) { + var values = []; + var dimArr = []; + if (idx == null) { + idx = dimensions; + dimensions = []; + for (var i = 0; i < this._dimensions.length; i++) { + dimArr.push(i); + } + } else { + dimArr = dimensions; + } + for (var i = 0, len = dimArr.length; i < len; i++) { + values.push(this.get(dimArr[i], idx)); + } + return values; + }; + DataStore2.prototype.getByRawIndex = function(dim, rawIdx) { + if (!(rawIdx >= 0 && rawIdx < this._rawCount)) { + return NaN; + } + var dimStore = this._chunks[dim]; + return dimStore ? dimStore[rawIdx] : NaN; + }; + DataStore2.prototype.getSum = function(dim) { + var dimData = this._chunks[dim]; + var sum = 0; + if (dimData) { + for (var i = 0, len = this.count(); i < len; i++) { + var value = this.get(dim, i); + if (!isNaN(value)) { + sum += value; + } + } + } + return sum; + }; + DataStore2.prototype.getMedian = function(dim) { + var dimDataArray = []; + this.each([dim], function(val) { + if (!isNaN(val)) { + dimDataArray.push(val); + } + }); + var sortedDimDataArray = dimDataArray.sort(function(a, b) { + return a - b; + }); + var len = this.count(); + return len === 0 ? 0 : len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2; + }; + DataStore2.prototype.indexOfRawIndex = function(rawIndex) { + if (rawIndex >= this._rawCount || rawIndex < 0) { + return -1; + } + if (!this._indices) { + return rawIndex; + } + var indices = this._indices; + var rawDataIndex = indices[rawIndex]; + if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) { + return rawIndex; + } + var left = 0; + var right = this._count - 1; + while (left <= right) { + var mid = (left + right) / 2 | 0; + if (indices[mid] < rawIndex) { + left = mid + 1; + } else if (indices[mid] > rawIndex) { + right = mid - 1; + } else { + return mid; + } + } + return -1; + }; + DataStore2.prototype.indicesOfNearest = function(dim, value, maxDistance) { + var chunks = this._chunks; + var dimData = chunks[dim]; + var nearestIndices = []; + if (!dimData) { + return nearestIndices; + } + if (maxDistance == null) { + maxDistance = Infinity; + } + var minDist = Infinity; + var minDiff = -1; + var nearestIndicesLen = 0; + for (var i = 0, len = this.count(); i < len; i++) { + var dataIndex = this.getRawIndex(i); + var diff = value - dimData[dataIndex]; + var dist = Math.abs(diff); + if (dist <= maxDistance) { + if (dist < minDist || dist === minDist && diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + nearestIndicesLen = 0; + } + if (diff === minDiff) { + nearestIndices[nearestIndicesLen++] = i; + } + } + } + nearestIndices.length = nearestIndicesLen; + return nearestIndices; + }; + DataStore2.prototype.getIndices = function() { + var newIndices; + var indices = this._indices; + if (indices) { + var Ctor = indices.constructor; + var thisCount = this._count; + if (Ctor === Array) { + newIndices = new Ctor(thisCount); + for (var i = 0; i < thisCount; i++) { + newIndices[i] = indices[i]; + } + } else { + newIndices = new Ctor(indices.buffer, 0, thisCount); + } + } else { + var Ctor = getIndicesCtor(this._rawCount); + newIndices = new Ctor(this.count()); + for (var i = 0; i < newIndices.length; i++) { + newIndices[i] = i; + } + } + return newIndices; + }; + DataStore2.prototype.filter = function(dims, cb) { + if (!this._count) { + return this; + } + var newStore = this.clone(); + var count = newStore.count(); + var Ctor = getIndicesCtor(newStore._rawCount); + var newIndices = new Ctor(count); + var value = []; + var dimSize = dims.length; + var offset = 0; + var dim0 = dims[0]; + var chunks = newStore._chunks; + for (var i = 0; i < count; i++) { + var keep = void 0; + var rawIdx = newStore.getRawIndex(i); + if (dimSize === 0) { + keep = cb(i); + } else if (dimSize === 1) { + var val = chunks[dim0][rawIdx]; + keep = cb(val, i); + } else { + var k = 0; + for (; k < dimSize; k++) { + value[k] = chunks[dims[k]][rawIdx]; + } + value[k] = i; + keep = cb.apply(null, value); + } + if (keep) { + newIndices[offset++] = rawIdx; + } + } + if (offset < count) { + newStore._indices = newIndices; + } + newStore._count = offset; + newStore._extent = []; + newStore._updateGetRawIdx(); + return newStore; + }; + DataStore2.prototype.selectRange = function(range) { + var newStore = this.clone(); + var len = newStore._count; + if (!len) { + return this; + } + var dims = keys(range); + var dimSize = dims.length; + if (!dimSize) { + return this; + } + var originalCount = newStore.count(); + var Ctor = getIndicesCtor(newStore._rawCount); + var newIndices = new Ctor(originalCount); + var offset = 0; + var dim0 = dims[0]; + var min = range[dim0][0]; + var max = range[dim0][1]; + var storeArr = newStore._chunks; + var quickFinished = false; + if (!newStore._indices) { + var idx = 0; + if (dimSize === 1) { + var dimStorage = storeArr[dims[0]]; + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = idx; + } + idx++; + } + quickFinished = true; + } else if (dimSize === 2) { + var dimStorage = storeArr[dims[0]]; + var dimStorage2 = storeArr[dims[1]]; + var min2 = range[dims[1]][0]; + var max2 = range[dims[1]][1]; + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; + var val2 = dimStorage2[i]; + if ((val >= min && val <= max || isNaN(val)) && (val2 >= min2 && val2 <= max2 || isNaN(val2))) { + newIndices[offset++] = idx; + } + idx++; + } + quickFinished = true; + } + } + if (!quickFinished) { + if (dimSize === 1) { + for (var i = 0; i < originalCount; i++) { + var rawIndex = newStore.getRawIndex(i); + var val = storeArr[dims[0]][rawIndex]; + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = rawIndex; + } + } + } else { + for (var i = 0; i < originalCount; i++) { + var keep = true; + var rawIndex = newStore.getRawIndex(i); + for (var k = 0; k < dimSize; k++) { + var dimk = dims[k]; + var val = storeArr[dimk][rawIndex]; + if (val < range[dimk][0] || val > range[dimk][1]) { + keep = false; + } + } + if (keep) { + newIndices[offset++] = newStore.getRawIndex(i); + } + } + } + } + if (offset < originalCount) { + newStore._indices = newIndices; + } + newStore._count = offset; + newStore._extent = []; + newStore._updateGetRawIdx(); + return newStore; + }; + DataStore2.prototype.map = function(dims, cb) { + var target = this.clone(dims); + this._updateDims(target, dims, cb); + return target; + }; + DataStore2.prototype.modify = function(dims, cb) { + this._updateDims(this, dims, cb); + }; + DataStore2.prototype._updateDims = function(target, dims, cb) { + var targetChunks = target._chunks; + var tmpRetValue = []; + var dimSize = dims.length; + var dataCount = target.count(); + var values = []; + var rawExtent = target._rawExtent; + for (var i = 0; i < dims.length; i++) { + rawExtent[dims[i]] = getInitialExtent(); + } + for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) { + var rawIndex = target.getRawIndex(dataIndex); + for (var k = 0; k < dimSize; k++) { + values[k] = targetChunks[dims[k]][rawIndex]; + } + values[dimSize] = dataIndex; + var retValue = cb && cb.apply(null, values); + if (retValue != null) { + if (typeof retValue !== "object") { + tmpRetValue[0] = retValue; + retValue = tmpRetValue; + } + for (var i = 0; i < retValue.length; i++) { + var dim = dims[i]; + var val = retValue[i]; + var rawExtentOnDim = rawExtent[dim]; + var dimStore = targetChunks[dim]; + if (dimStore) { + dimStore[rawIndex] = val; + } + if (val < rawExtentOnDim[0]) { + rawExtentOnDim[0] = val; + } + if (val > rawExtentOnDim[1]) { + rawExtentOnDim[1] = val; + } + } + } + } + }; + DataStore2.prototype.lttbDownSample = function(valueDimension, rate) { + var target = this.clone([valueDimension], true); + var targetStorage = target._chunks; + var dimStore = targetStorage[valueDimension]; + var len = this.count(); + var sampledIndex = 0; + var frameSize = Math.floor(1 / rate); + var currentRawIndex = this.getRawIndex(0); + var maxArea; + var area; + var nextRawIndex; + var newIndices = new (getIndicesCtor(this._rawCount))(Math.min((Math.ceil(len / frameSize) + 2) * 2, len)); + newIndices[sampledIndex++] = currentRawIndex; + for (var i = 1; i < len - 1; i += frameSize) { + var nextFrameStart = Math.min(i + frameSize, len - 1); + var nextFrameEnd = Math.min(i + frameSize * 2, len); + var avgX = (nextFrameEnd + nextFrameStart) / 2; + var avgY = 0; + for (var idx = nextFrameStart; idx < nextFrameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + if (isNaN(y)) { + continue; + } + avgY += y; + } + avgY /= nextFrameEnd - nextFrameStart; + var frameStart = i; + var frameEnd = Math.min(i + frameSize, len); + var pointAX = i - 1; + var pointAY = dimStore[currentRawIndex]; + maxArea = -1; + nextRawIndex = frameStart; + var firstNaNIndex = -1; + var countNaN = 0; + for (var idx = frameStart; idx < frameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + if (isNaN(y)) { + countNaN++; + if (firstNaNIndex < 0) { + firstNaNIndex = rawIndex; + } + continue; + } + area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY)); + if (area > maxArea) { + maxArea = area; + nextRawIndex = rawIndex; + } + } + if (countNaN > 0 && countNaN < frameEnd - frameStart) { + newIndices[sampledIndex++] = Math.min(firstNaNIndex, nextRawIndex); + nextRawIndex = Math.max(firstNaNIndex, nextRawIndex); + } + newIndices[sampledIndex++] = nextRawIndex; + currentRawIndex = nextRawIndex; + } + newIndices[sampledIndex++] = this.getRawIndex(len - 1); + target._count = sampledIndex; + target._indices = newIndices; + target.getRawIndex = this._getRawIdx; + return target; + }; + DataStore2.prototype.minmaxDownSample = function(valueDimension, rate) { + var target = this.clone([valueDimension], true); + var targetStorage = target._chunks; + var frameSize = Math.floor(1 / rate); + var dimStore = targetStorage[valueDimension]; + var len = this.count(); + var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len / frameSize) * 2); + var offset = 0; + for (var i = 0; i < len; i += frameSize) { + var minIndex = i; + var minValue = dimStore[this.getRawIndex(minIndex)]; + var maxIndex = i; + var maxValue = dimStore[this.getRawIndex(maxIndex)]; + var thisFrameSize = frameSize; + if (i + frameSize > len) { + thisFrameSize = len - i; + } + for (var k = 0; k < thisFrameSize; k++) { + var rawIndex = this.getRawIndex(i + k); + var value = dimStore[rawIndex]; + if (value < minValue) { + minValue = value; + minIndex = i + k; + } + if (value > maxValue) { + maxValue = value; + maxIndex = i + k; + } + } + var rawMinIndex = this.getRawIndex(minIndex); + var rawMaxIndex = this.getRawIndex(maxIndex); + if (minIndex < maxIndex) { + newIndices[offset++] = rawMinIndex; + newIndices[offset++] = rawMaxIndex; + } else { + newIndices[offset++] = rawMaxIndex; + newIndices[offset++] = rawMinIndex; + } + } + target._count = offset; + target._indices = newIndices; + target._updateGetRawIdx(); + return target; + }; + DataStore2.prototype.downSample = function(dimension, rate, sampleValue, sampleIndex) { + var target = this.clone([dimension], true); + var targetStorage = target._chunks; + var frameValues = []; + var frameSize = Math.floor(1 / rate); + var dimStore = targetStorage[dimension]; + var len = this.count(); + var rawExtentOnDim = target._rawExtent[dimension] = getInitialExtent(); + var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len / frameSize)); + var offset = 0; + for (var i = 0; i < len; i += frameSize) { + if (frameSize > len - i) { + frameSize = len - i; + frameValues.length = frameSize; + } + for (var k = 0; k < frameSize; k++) { + var dataIdx = this.getRawIndex(i + k); + frameValues[k] = dimStore[dataIdx]; + } + var value = sampleValue(frameValues); + var sampleFrameIdx = this.getRawIndex(Math.min(i + sampleIndex(frameValues, value) || 0, len - 1)); + dimStore[sampleFrameIdx] = value; + if (value < rawExtentOnDim[0]) { + rawExtentOnDim[0] = value; + } + if (value > rawExtentOnDim[1]) { + rawExtentOnDim[1] = value; + } + newIndices[offset++] = sampleFrameIdx; + } + target._count = offset; + target._indices = newIndices; + target._updateGetRawIdx(); + return target; + }; + DataStore2.prototype.each = function(dims, cb) { + if (!this._count) { + return; + } + var dimSize = dims.length; + var chunks = this._chunks; + for (var i = 0, len = this.count(); i < len; i++) { + var rawIdx = this.getRawIndex(i); + switch (dimSize) { + case 0: + cb(i); + break; + case 1: + cb(chunks[dims[0]][rawIdx], i); + break; + case 2: + cb(chunks[dims[0]][rawIdx], chunks[dims[1]][rawIdx], i); + break; + default: + var k = 0; + var value = []; + for (; k < dimSize; k++) { + value[k] = chunks[dims[k]][rawIdx]; + } + value[k] = i; + cb.apply(null, value); + } + } + }; + DataStore2.prototype.getDataExtent = function(dim) { + var dimData = this._chunks[dim]; + var initialExtent = getInitialExtent(); + if (!dimData) { + return initialExtent; + } + var currEnd = this.count(); + var useRaw = !this._indices; + var dimExtent; + if (useRaw) { + return this._rawExtent[dim].slice(); + } + dimExtent = this._extent[dim]; + if (dimExtent) { + return dimExtent.slice(); + } + dimExtent = initialExtent; + var min = dimExtent[0]; + var max = dimExtent[1]; + for (var i = 0; i < currEnd; i++) { + var rawIdx = this.getRawIndex(i); + var value = dimData[rawIdx]; + value < min && (min = value); + value > max && (max = value); + } + dimExtent = [min, max]; + this._extent[dim] = dimExtent; + return dimExtent; + }; + DataStore2.prototype.getRawDataItem = function(idx) { + var rawIdx = this.getRawIndex(idx); + if (!this._provider.persistent) { + var val = []; + var chunks = this._chunks; + for (var i = 0; i < chunks.length; i++) { + val.push(chunks[i][rawIdx]); + } + return val; + } else { + return this._provider.getItem(rawIdx); + } + }; + DataStore2.prototype.clone = function(clonedDims, ignoreIndices) { + var target = new DataStore2(); + var chunks = this._chunks; + var clonedDimsMap = clonedDims && reduce(clonedDims, function(obj, dimIdx) { + obj[dimIdx] = true; + return obj; + }, {}); + if (clonedDimsMap) { + for (var i = 0; i < chunks.length; i++) { + target._chunks[i] = !clonedDimsMap[i] ? chunks[i] : cloneChunk(chunks[i]); + } + } else { + target._chunks = chunks; + } + this._copyCommonProps(target); + if (!ignoreIndices) { + target._indices = this._cloneIndices(); + } + target._updateGetRawIdx(); + return target; + }; + DataStore2.prototype._copyCommonProps = function(target) { + target._count = this._count; + target._rawCount = this._rawCount; + target._provider = this._provider; + target._dimensions = this._dimensions; + target._extent = clone$2(this._extent); + target._rawExtent = clone$2(this._rawExtent); + }; + DataStore2.prototype._cloneIndices = function() { + if (this._indices) { + var Ctor = this._indices.constructor; + var indices = void 0; + if (Ctor === Array) { + var thisCount = this._indices.length; + indices = new Ctor(thisCount); + for (var i = 0; i < thisCount; i++) { + indices[i] = this._indices[i]; + } + } else { + indices = new Ctor(this._indices); + } + return indices; + } + return null; + }; + DataStore2.prototype._getRawIdxIdentity = function(idx) { + return idx; + }; + DataStore2.prototype._getRawIdx = function(idx) { + if (idx < this._count && idx >= 0) { + return this._indices[idx]; + } + return -1; + }; + DataStore2.prototype._updateGetRawIdx = function() { + this.getRawIndex = this._indices ? this._getRawIdx : this._getRawIdxIdentity; + }; + DataStore2.internalField = function() { + function getDimValueSimply(dataItem, property, dataIndex, dimIndex) { + return parseDataValue(dataItem[dimIndex], this._dimensions[dimIndex]); + } + defaultDimValueGetters = { + arrayRows: getDimValueSimply, + objectRows: function(dataItem, property, dataIndex, dimIndex) { + return parseDataValue(dataItem[property], this._dimensions[dimIndex]); + }, + keyedColumns: getDimValueSimply, + original: function(dataItem, property, dataIndex, dimIndex) { + var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value); + return parseDataValue(value instanceof Array ? value[dimIndex] : value, this._dimensions[dimIndex]); + }, + typedArray: function(dataItem, property, dataIndex, dimIndex) { + return dataItem[dimIndex]; + } + }; + }(); + return DataStore2; + }() +); + +var SourceManager = ( + /** @class */ + function() { + function SourceManager2(sourceHost) { + this._sourceList = []; + this._storeList = []; + this._upstreamSignList = []; + this._versionSignBase = 0; + this._dirty = true; + this._sourceHost = sourceHost; + } + SourceManager2.prototype.dirty = function() { + this._setLocalSource([], []); + this._storeList = []; + this._dirty = true; + }; + SourceManager2.prototype._setLocalSource = function(sourceList, upstreamSignList) { + this._sourceList = sourceList; + this._upstreamSignList = upstreamSignList; + this._versionSignBase++; + if (this._versionSignBase > 9e10) { + this._versionSignBase = 0; + } + }; + SourceManager2.prototype._getVersionSign = function() { + return this._sourceHost.uid + "_" + this._versionSignBase; + }; + SourceManager2.prototype.prepareSource = function() { + if (this._isDirty()) { + this._createSource(); + this._dirty = false; + } + }; + SourceManager2.prototype._createSource = function() { + this._setLocalSource([], []); + var sourceHost = this._sourceHost; + var upSourceMgrList = this._getUpstreamSourceManagers(); + var hasUpstream = !!upSourceMgrList.length; + var resultSourceList; + var upstreamSignList; + if (isSeries(sourceHost)) { + var seriesModel = sourceHost; + var data = void 0; + var sourceFormat = void 0; + var upSource = void 0; + if (hasUpstream) { + var upSourceMgr = upSourceMgrList[0]; + upSourceMgr.prepareSource(); + upSource = upSourceMgr.getSource(); + data = upSource.data; + sourceFormat = upSource.sourceFormat; + upstreamSignList = [upSourceMgr._getVersionSign()]; + } else { + data = seriesModel.get("data", true); + sourceFormat = isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL; + upstreamSignList = []; + } + var newMetaRawOption = this._getSourceMetaRawOption() || {}; + var upMetaRawOption = upSource && upSource.metaRawOption || {}; + var seriesLayoutBy = retrieve2(newMetaRawOption.seriesLayoutBy, upMetaRawOption.seriesLayoutBy) || null; + var sourceHeader = retrieve2(newMetaRawOption.sourceHeader, upMetaRawOption.sourceHeader); + var dimensions = retrieve2(newMetaRawOption.dimensions, upMetaRawOption.dimensions); + var needsCreateSource = seriesLayoutBy !== upMetaRawOption.seriesLayoutBy || !!sourceHeader !== !!upMetaRawOption.sourceHeader || dimensions; + resultSourceList = needsCreateSource ? [createSource(data, { + seriesLayoutBy, + sourceHeader, + dimensions + }, sourceFormat)] : []; + } else { + var datasetModel = sourceHost; + if (hasUpstream) { + var result = this._applyTransform(upSourceMgrList); + resultSourceList = result.sourceList; + upstreamSignList = result.upstreamSignList; + } else { + var sourceData = datasetModel.get("source", true); + resultSourceList = [createSource(sourceData, this._getSourceMetaRawOption(), null)]; + upstreamSignList = []; + } + } + this._setLocalSource(resultSourceList, upstreamSignList); + }; + SourceManager2.prototype._applyTransform = function(upMgrList) { + var datasetModel = this._sourceHost; + var transformOption = datasetModel.get("transform", true); + var fromTransformResult = datasetModel.get("fromTransformResult", true); + if (fromTransformResult != null) { + var errMsg = ""; + if (upMgrList.length !== 1) { + doThrow(errMsg); + } + } + var sourceList; + var upSourceList = []; + var upstreamSignList = []; + each$4(upMgrList, function(upMgr) { + upMgr.prepareSource(); + var upSource = upMgr.getSource(fromTransformResult || 0); + var errMsg2 = ""; + if (fromTransformResult != null && !upSource) { + doThrow(errMsg2); + } + upSourceList.push(upSource); + upstreamSignList.push(upMgr._getVersionSign()); + }); + if (transformOption) { + sourceList = applyDataTransform(transformOption, upSourceList, { + datasetIndex: datasetModel.componentIndex + }); + } else if (fromTransformResult != null) { + sourceList = [cloneSourceShallow(upSourceList[0])]; + } + return { + sourceList, + upstreamSignList + }; + }; + SourceManager2.prototype._isDirty = function() { + if (this._dirty) { + return true; + } + var upSourceMgrList = this._getUpstreamSourceManagers(); + for (var i = 0; i < upSourceMgrList.length; i++) { + var upSrcMgr = upSourceMgrList[i]; + if ( + // Consider the case that there is ancestor diry, call it recursively. + // The performance is probably not an issue because usually the chain is not long. + upSrcMgr._isDirty() || this._upstreamSignList[i] !== upSrcMgr._getVersionSign() + ) { + return true; + } + } + }; + SourceManager2.prototype.getSource = function(sourceIndex) { + sourceIndex = sourceIndex || 0; + var source = this._sourceList[sourceIndex]; + if (!source) { + var upSourceMgrList = this._getUpstreamSourceManagers(); + return upSourceMgrList[0] && upSourceMgrList[0].getSource(sourceIndex); + } + return source; + }; + SourceManager2.prototype.getSharedDataStore = function(seriesDimRequest) { + var schema = seriesDimRequest.makeStoreSchema(); + return this._innerGetDataStore(schema.dimensions, seriesDimRequest.source, schema.hash); + }; + SourceManager2.prototype._innerGetDataStore = function(storeDims, seriesSource, sourceReadKey) { + var sourceIndex = 0; + var storeList = this._storeList; + var cachedStoreMap = storeList[sourceIndex]; + if (!cachedStoreMap) { + cachedStoreMap = storeList[sourceIndex] = {}; + } + var cachedStore = cachedStoreMap[sourceReadKey]; + if (!cachedStore) { + var upSourceMgr = this._getUpstreamSourceManagers()[0]; + if (isSeries(this._sourceHost) && upSourceMgr) { + cachedStore = upSourceMgr._innerGetDataStore(storeDims, seriesSource, sourceReadKey); + } else { + cachedStore = new DataStore(); + cachedStore.initData(new DefaultDataProvider(seriesSource, storeDims.length), storeDims); + } + cachedStoreMap[sourceReadKey] = cachedStore; + } + return cachedStore; + }; + SourceManager2.prototype._getUpstreamSourceManagers = function() { + var sourceHost = this._sourceHost; + if (isSeries(sourceHost)) { + var datasetModel = querySeriesUpstreamDatasetModel(sourceHost); + return !datasetModel ? [] : [datasetModel.getSourceManager()]; + } else { + return map$1(queryDatasetUpstreamDatasetModels(sourceHost), function(datasetModel2) { + return datasetModel2.getSourceManager(); + }); + } + }; + SourceManager2.prototype._getSourceMetaRawOption = function() { + var sourceHost = this._sourceHost; + var seriesLayoutBy; + var sourceHeader; + var dimensions; + if (isSeries(sourceHost)) { + seriesLayoutBy = sourceHost.get("seriesLayoutBy", true); + sourceHeader = sourceHost.get("sourceHeader", true); + dimensions = sourceHost.get("dimensions", true); + } else if (!this._getUpstreamSourceManagers().length) { + var model = sourceHost; + seriesLayoutBy = model.get("seriesLayoutBy", true); + sourceHeader = model.get("sourceHeader", true); + dimensions = model.get("dimensions", true); + } + return { + seriesLayoutBy, + sourceHeader, + dimensions + }; + }; + return SourceManager2; + }() +); +function isSeries(sourceHost) { + return sourceHost.mainType === "series"; +} +function doThrow(errMsg) { + throw new Error(errMsg); +} + +var TOOLTIP_LINE_HEIGHT_CSS = "line-height:1"; +function getTooltipLineHeight(textStyle) { + var lineHeight = textStyle.lineHeight; + if (lineHeight == null) { + return TOOLTIP_LINE_HEIGHT_CSS; + } else { + return "line-height:" + encodeHTML(lineHeight + "") + "px"; + } +} +function getTooltipTextStyle(textStyle, renderMode) { + var nameFontColor = textStyle.color || "#6e7079"; + var nameFontSize = textStyle.fontSize || 12; + var nameFontWeight = textStyle.fontWeight || "400"; + var valueFontColor = textStyle.color || "#464646"; + var valueFontSize = textStyle.fontSize || 14; + var valueFontWeight = textStyle.fontWeight || "900"; + if (renderMode === "html") { + return { + // eslint-disable-next-line max-len + nameStyle: "font-size:" + encodeHTML(nameFontSize + "") + "px;color:" + encodeHTML(nameFontColor) + ";font-weight:" + encodeHTML(nameFontWeight + ""), + // eslint-disable-next-line max-len + valueStyle: "font-size:" + encodeHTML(valueFontSize + "") + "px;color:" + encodeHTML(valueFontColor) + ";font-weight:" + encodeHTML(valueFontWeight + "") + }; + } else { + return { + nameStyle: { + fontSize: nameFontSize, + fill: nameFontColor, + fontWeight: nameFontWeight + }, + valueStyle: { + fontSize: valueFontSize, + fill: valueFontColor, + fontWeight: valueFontWeight + } + }; + } +} +var HTML_GAPS = [0, 10, 20, 30]; +var RICH_TEXT_GAPS = ["", "\n", "\n\n", "\n\n\n"]; +function createTooltipMarkup(type, option) { + option.type = type; + return option; +} +function isSectionFragment(frag) { + return frag.type === "section"; +} +function getBuilder(frag) { + return isSectionFragment(frag) ? buildSection : buildNameValue; +} +function getBlockGapLevel(frag) { + if (isSectionFragment(frag)) { + var gapLevel_1 = 0; + var subBlockLen = frag.blocks.length; + var hasInnerGap_1 = subBlockLen > 1 || subBlockLen > 0 && !frag.noHeader; + each$4(frag.blocks, function(subBlock) { + var subGapLevel = getBlockGapLevel(subBlock); + if (subGapLevel >= gapLevel_1) { + gapLevel_1 = subGapLevel + +(hasInnerGap_1 && // 0 always can not be readable gap level. + (!subGapLevel || isSectionFragment(subBlock) && !subBlock.noHeader)); + } + }); + return gapLevel_1; + } + return 0; +} +function buildSection(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var noHeader = fragment.noHeader; + var gaps = getGap(getBlockGapLevel(fragment)); + var subMarkupTextList = []; + var subBlocks = fragment.blocks || []; + assert(!subBlocks || isArray(subBlocks)); + subBlocks = subBlocks || []; + var orderMode = ctx.orderMode; + if (fragment.sortBlocks && orderMode) { + subBlocks = subBlocks.slice(); + var orderMap = { + valueAsc: "asc", + valueDesc: "desc" + }; + if (hasOwn(orderMap, orderMode)) { + var comparator_1 = new SortOrderComparator(orderMap[orderMode], null); + subBlocks.sort(function(a, b) { + return comparator_1.evaluate(a.sortParam, b.sortParam); + }); + } else if (orderMode === "seriesDesc") { + subBlocks.reverse(); + } + } + each$4(subBlocks, function(subBlock, idx) { + var valueFormatter = fragment.valueFormatter; + var subMarkupText2 = getBuilder(subBlock)( + // Inherit valueFormatter + valueFormatter ? extend(extend({}, ctx), { + valueFormatter + }) : ctx, + subBlock, + idx > 0 ? gaps.html : 0, + toolTipTextStyle + ); + subMarkupText2 != null && subMarkupTextList.push(subMarkupText2); + }); + var subMarkupText = ctx.renderMode === "richText" ? subMarkupTextList.join(gaps.richText) : wrapBlockHTML(toolTipTextStyle, subMarkupTextList.join(""), noHeader ? topMarginForOuterGap : gaps.html); + if (noHeader) { + return subMarkupText; + } + var displayableHeader = makeValueReadable(fragment.header, "ordinal", ctx.useUTC); + var nameStyle = getTooltipTextStyle(toolTipTextStyle, ctx.renderMode).nameStyle; + var tooltipLineHeight = getTooltipLineHeight(toolTipTextStyle); + if (ctx.renderMode === "richText") { + return wrapInlineNameRichText(ctx, displayableHeader, nameStyle) + gaps.richText + subMarkupText; + } else { + return wrapBlockHTML(toolTipTextStyle, '
' + encodeHTML(displayableHeader) + "
" + subMarkupText, topMarginForOuterGap); + } +} +function buildNameValue(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var renderMode = ctx.renderMode; + var noName = fragment.noName; + var noValue = fragment.noValue; + var noMarker = !fragment.markerType; + var name = fragment.name; + var useUTC = ctx.useUTC; + var valueFormatter = fragment.valueFormatter || ctx.valueFormatter || function(value) { + value = isArray(value) ? value : [value]; + return map$1(value, function(val, idx) { + return makeValueReadable(val, isArray(valueTypeOption) ? valueTypeOption[idx] : valueTypeOption, useUTC); + }); + }; + if (noName && noValue) { + return; + } + var markerStr = noMarker ? "" : ctx.markupStyleCreator.makeTooltipMarker(fragment.markerType, fragment.markerColor || "#333", renderMode); + var readableName = noName ? "" : makeValueReadable(name, "ordinal", useUTC); + var valueTypeOption = fragment.valueType; + var readableValueList = noValue ? [] : valueFormatter(fragment.value, fragment.dataIndex); + var valueAlignRight = !noMarker || !noName; + var valueCloseToMarker = !noMarker && noName; + var _a = getTooltipTextStyle(toolTipTextStyle, renderMode), nameStyle = _a.nameStyle, valueStyle = _a.valueStyle; + return renderMode === "richText" ? (noMarker ? "" : markerStr) + (noName ? "" : wrapInlineNameRichText(ctx, readableName, nameStyle)) + (noValue ? "" : wrapInlineValueRichText(ctx, readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)) : wrapBlockHTML(toolTipTextStyle, (noMarker ? "" : markerStr) + (noName ? "" : wrapInlineNameHTML(readableName, !noMarker, nameStyle)) + (noValue ? "" : wrapInlineValueHTML(readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)), topMarginForOuterGap); +} +function buildTooltipMarkup(fragment, markupStyleCreator, renderMode, orderMode, useUTC, toolTipTextStyle) { + if (!fragment) { + return; + } + var builder = getBuilder(fragment); + var ctx = { + useUTC, + renderMode, + orderMode, + markupStyleCreator, + valueFormatter: fragment.valueFormatter + }; + return builder(ctx, fragment, 0, toolTipTextStyle); +} +function getGap(gapLevel) { + return { + html: HTML_GAPS[gapLevel], + richText: RICH_TEXT_GAPS[gapLevel] + }; +} +function wrapBlockHTML(textStyle, encodedContent, topGap) { + var clearfix = '
'; + var marginCSS = "margin: " + topGap + "px 0 0"; + var tooltipLineHeight = getTooltipLineHeight(textStyle); + return '
' + encodedContent + clearfix + "
"; +} +function wrapInlineNameHTML(name, leftHasMarker, style) { + var marginCss = leftHasMarker ? "margin-left:2px" : ""; + return '' + encodeHTML(name) + ""; +} +function wrapInlineValueHTML(valueList, alignRight, valueCloseToMarker, style) { + var paddingStr = valueCloseToMarker ? "10px" : "20px"; + var alignCSS = alignRight ? "float:right;margin-left:" + paddingStr : ""; + valueList = isArray(valueList) ? valueList : [valueList]; + return '' + map$1(valueList, function(value) { + return encodeHTML(value); + }).join("  ") + ""; +} +function wrapInlineNameRichText(ctx, name, style) { + return ctx.markupStyleCreator.wrapRichTextStyle(name, style); +} +function wrapInlineValueRichText(ctx, values, alignRight, valueCloseToMarker, style) { + var styles = [style]; + var paddingLeft = valueCloseToMarker ? 10 : 20; + alignRight && styles.push({ + padding: [0, 0, 0, paddingLeft], + align: "right" + }); + return ctx.markupStyleCreator.wrapRichTextStyle(isArray(values) ? values.join(" ") : values, styles); +} +function retrieveVisualColorForTooltipMarker(series, dataIndex) { + var style = series.getData().getItemVisual(dataIndex, "style"); + var color = style[series.visualDrawType]; + return convertToColorString(color); +} +function getPaddingFromTooltipModel(model, renderMode) { + var padding = model.get("padding"); + return padding != null ? padding : renderMode === "richText" ? [8, 10] : 10; +} +var TooltipMarkupStyleCreator = ( + /** @class */ + function() { + function TooltipMarkupStyleCreator2() { + this.richTextStyles = {}; + this._nextStyleNameId = getRandomIdBase(); + } + TooltipMarkupStyleCreator2.prototype._generateStyleName = function() { + return "__EC_aUTo_" + this._nextStyleNameId++; + }; + TooltipMarkupStyleCreator2.prototype.makeTooltipMarker = function(markerType, colorStr, renderMode) { + var markerId = renderMode === "richText" ? this._generateStyleName() : null; + var marker = getTooltipMarker({ + color: colorStr, + type: markerType, + renderMode, + markerId + }); + if (isString(marker)) { + return marker; + } else { + this.richTextStyles[markerId] = marker.style; + return marker.content; + } + }; + TooltipMarkupStyleCreator2.prototype.wrapRichTextStyle = function(text, styles) { + var finalStl = {}; + if (isArray(styles)) { + each$4(styles, function(stl) { + return extend(finalStl, stl); + }); + } else { + extend(finalStl, styles); + } + var styleName = this._generateStyleName(); + this.richTextStyles[styleName] = finalStl; + return "{" + styleName + "|" + text + "}"; + }; + return TooltipMarkupStyleCreator2; + }() +); + +function defaultSeriesFormatTooltip(opt) { + var series = opt.series; + var dataIndex = opt.dataIndex; + var multipleSeries = opt.multipleSeries; + var data = series.getData(); + var tooltipDims = data.mapDimensionsAll('defaultedTooltip'); + var tooltipDimLen = tooltipDims.length; + var value = series.getRawValue(dataIndex); + var isValueArr = isArray(value); + var markerColor = retrieveVisualColorForTooltipMarker(series, dataIndex); + // Complicated rule for pretty tooltip. + var inlineValue; + var inlineValueType; + var subBlocks; + var sortParam; + if (tooltipDimLen > 1 || isValueArr && !tooltipDimLen) { + var formatArrResult = formatTooltipArrayValue(value, series, dataIndex, tooltipDims, markerColor); + inlineValue = formatArrResult.inlineValues; + inlineValueType = formatArrResult.inlineValueTypes; + subBlocks = formatArrResult.blocks; + // Only support tooltip sort by the first inline value. It's enough in most cases. + sortParam = formatArrResult.inlineValues[0]; + } else if (tooltipDimLen) { + var dimInfo = data.getDimensionInfo(tooltipDims[0]); + sortParam = inlineValue = retrieveRawValue(data, dataIndex, tooltipDims[0]); + inlineValueType = dimInfo.type; + } else { + sortParam = inlineValue = isValueArr ? value[0] : value; + } + // Do not show generated series name. It might not be readable. + var seriesNameSpecified = isNameSpecified(series); + var seriesName = seriesNameSpecified && series.name || ''; + var itemName = data.getName(dataIndex); + var inlineName = multipleSeries ? seriesName : itemName; + return createTooltipMarkup('section', { + header: seriesName, + // When series name is not specified, do not show a header line with only '-'. + // This case always happens in tooltip.trigger: 'item'. + noHeader: multipleSeries || !seriesNameSpecified, + sortParam: sortParam, + blocks: [createTooltipMarkup('nameValue', { + markerType: 'item', + markerColor: markerColor, + // Do not mix display seriesName and itemName in one tooltip, + // which might confuses users. + name: inlineName, + // name dimension might be auto assigned, where the name might + // be not readable. So we check trim here. + noName: !trim(inlineName), + value: inlineValue, + valueType: inlineValueType, + dataIndex: dataIndex + })].concat(subBlocks || []) + }); +} +function formatTooltipArrayValue(value, series, dataIndex, tooltipDims, colorStr) { + // check: category-no-encode-has-axis-data in dataset.html + var data = series.getData(); + var isValueMultipleLine = reduce(value, function (isValueMultipleLine, val, idx) { + var dimItem = data.getDimensionInfo(idx); + return isValueMultipleLine = isValueMultipleLine || dimItem && dimItem.tooltip !== false && dimItem.displayName != null; + }, false); + var inlineValues = []; + var inlineValueTypes = []; + var blocks = []; + tooltipDims.length ? each$4(tooltipDims, function (dim) { + setEachItem(retrieveRawValue(data, dataIndex, dim), dim); + }) + // By default, all dims is used on tooltip. + : each$4(value, setEachItem); + function setEachItem(val, dim) { + var dimInfo = data.getDimensionInfo(dim); + // If `dimInfo.tooltip` is not set, show tooltip. + if (!dimInfo || dimInfo.otherDims.tooltip === false) { + return; + } + if (isValueMultipleLine) { + blocks.push(createTooltipMarkup('nameValue', { + markerType: 'subItem', + markerColor: colorStr, + name: dimInfo.displayName, + value: val, + valueType: dimInfo.type + })); + } else { + inlineValues.push(val); + inlineValueTypes.push(dimInfo.type); + } + } + return { + inlineValues: inlineValues, + inlineValueTypes: inlineValueTypes, + blocks: blocks + }; +} + +var inner$8 = makeInner(); +function getSelectionKey(data, dataIndex) { + return data.getName(dataIndex) || data.getId(dataIndex); +} +var SERIES_UNIVERSAL_TRANSITION_PROP = "__universalTransitionEnabled"; +var SeriesModel = ( + /** @class */ + function(_super) { + __extends(SeriesModel2, _super); + function SeriesModel2() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._selectedDataIndicesMap = {}; + return _this; + } + SeriesModel2.prototype.init = function(option, parentModel, ecModel) { + this.seriesIndex = this.componentIndex; + this.dataTask = createTask({ + count: dataTaskCount, + reset: dataTaskReset + }); + this.dataTask.context = { + model: this + }; + this.mergeDefaultAndTheme(option, ecModel); + var sourceManager = inner$8(this).sourceManager = new SourceManager(this); + sourceManager.prepareSource(); + var data = this.getInitialData(option, ecModel); + wrapData(data, this); + this.dataTask.context.data = data; + inner$8(this).dataBeforeProcessed = data; + autoSeriesName(this); + this._initSelectedMapFromData(data); + }; + SeriesModel2.prototype.mergeDefaultAndTheme = function(option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeSubType = this.subType; + if (ComponentModel.hasClass(themeSubType)) { + themeSubType += "Series"; + } + merge(option, ecModel.getTheme().get(this.subType)); + merge(option, this.getDefaultOption()); + defaultEmphasis(option, "label", ["show"]); + this.fillDataTextStyle(option.data); + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + SeriesModel2.prototype.mergeOption = function(newSeriesOption, ecModel) { + newSeriesOption = merge(this.option, newSeriesOption, true); + this.fillDataTextStyle(newSeriesOption.data); + var layoutMode = fetchLayoutMode(this); + if (layoutMode) { + mergeLayoutParam(this.option, newSeriesOption, layoutMode); + } + var sourceManager = inner$8(this).sourceManager; + sourceManager.dirty(); + sourceManager.prepareSource(); + var data = this.getInitialData(newSeriesOption, ecModel); + wrapData(data, this); + this.dataTask.dirty(); + this.dataTask.context.data = data; + inner$8(this).dataBeforeProcessed = data; + autoSeriesName(this); + this._initSelectedMapFromData(data); + }; + SeriesModel2.prototype.fillDataTextStyle = function(data) { + if (data && !isTypedArray(data)) { + var props = ["show"]; + for (var i = 0; i < data.length; i++) { + if (data[i] && data[i].label) { + defaultEmphasis(data[i], "label", props); + } + } + } + }; + SeriesModel2.prototype.getInitialData = function(option, ecModel) { + return; + }; + SeriesModel2.prototype.appendData = function(params) { + var data = this.getRawData(); + data.appendData(params.data); + }; + SeriesModel2.prototype.getData = function(dataType) { + var task = getCurrentTask(this); + if (task) { + var data = task.context.data; + return dataType == null || !data.getLinkedData ? data : data.getLinkedData(dataType); + } else { + return inner$8(this).data; + } + }; + SeriesModel2.prototype.getAllData = function() { + var mainData = this.getData(); + return mainData && mainData.getLinkedDataAll ? mainData.getLinkedDataAll() : [{ + data: mainData + }]; + }; + SeriesModel2.prototype.setData = function(data) { + var task = getCurrentTask(this); + if (task) { + var context = task.context; + context.outputData = data; + if (task !== this.dataTask) { + context.data = data; + } + } + inner$8(this).data = data; + }; + SeriesModel2.prototype.getEncode = function() { + var encode = this.get("encode", true); + if (encode) { + return createHashMap(encode); + } + }; + SeriesModel2.prototype.getSourceManager = function() { + return inner$8(this).sourceManager; + }; + SeriesModel2.prototype.getSource = function() { + return this.getSourceManager().getSource(); + }; + SeriesModel2.prototype.getRawData = function() { + return inner$8(this).dataBeforeProcessed; + }; + SeriesModel2.prototype.getColorBy = function() { + var colorBy = this.get("colorBy"); + return colorBy || "series"; + }; + SeriesModel2.prototype.isColorBySeries = function() { + return this.getColorBy() === "series"; + }; + SeriesModel2.prototype.getBaseAxis = function() { + var coordSys = this.coordinateSystem; + return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); + }; + SeriesModel2.prototype.formatTooltip = function(dataIndex, multipleSeries, dataType) { + return defaultSeriesFormatTooltip({ + series: this, + dataIndex, + multipleSeries + }); + }; + SeriesModel2.prototype.isAnimationEnabled = function() { + var ecModel = this.ecModel; + if (env.node && !(ecModel && ecModel.ssr)) { + return false; + } + var animationEnabled = this.getShallow("animation"); + if (animationEnabled) { + if (this.getData().count() > this.getShallow("animationThreshold")) { + animationEnabled = false; + } + } + return !!animationEnabled; + }; + SeriesModel2.prototype.restoreData = function() { + this.dataTask.dirty(); + }; + SeriesModel2.prototype.getColorFromPalette = function(name, scope, requestColorNum) { + var ecModel = this.ecModel; + var color = PaletteMixin.prototype.getColorFromPalette.call(this, name, scope, requestColorNum); + if (!color) { + color = ecModel.getColorFromPalette(name, scope, requestColorNum); + } + return color; + }; + SeriesModel2.prototype.coordDimToDataDim = function(coordDim) { + return this.getRawData().mapDimensionsAll(coordDim); + }; + SeriesModel2.prototype.getProgressive = function() { + return this.get("progressive"); + }; + SeriesModel2.prototype.getProgressiveThreshold = function() { + return this.get("progressiveThreshold"); + }; + SeriesModel2.prototype.select = function(innerDataIndices, dataType) { + this._innerSelect(this.getData(dataType), innerDataIndices); + }; + SeriesModel2.prototype.unselect = function(innerDataIndices, dataType) { + var selectedMap = this.option.selectedMap; + if (!selectedMap) { + return; + } + var selectedMode = this.option.selectedMode; + var data = this.getData(dataType); + if (selectedMode === "series" || selectedMap === "all") { + this.option.selectedMap = {}; + this._selectedDataIndicesMap = {}; + return; + } + for (var i = 0; i < innerDataIndices.length; i++) { + var dataIndex = innerDataIndices[i]; + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = false; + this._selectedDataIndicesMap[nameOrId] = -1; + } + }; + SeriesModel2.prototype.toggleSelect = function(innerDataIndices, dataType) { + var tmpArr = []; + for (var i = 0; i < innerDataIndices.length; i++) { + tmpArr[0] = innerDataIndices[i]; + this.isSelected(innerDataIndices[i], dataType) ? this.unselect(tmpArr, dataType) : this.select(tmpArr, dataType); + } + }; + SeriesModel2.prototype.getSelectedDataIndices = function() { + if (this.option.selectedMap === "all") { + return [].slice.call(this.getData().getIndices()); + } + var selectedDataIndicesMap = this._selectedDataIndicesMap; + var nameOrIds = keys(selectedDataIndicesMap); + var dataIndices = []; + for (var i = 0; i < nameOrIds.length; i++) { + var dataIndex = selectedDataIndicesMap[nameOrIds[i]]; + if (dataIndex >= 0) { + dataIndices.push(dataIndex); + } + } + return dataIndices; + }; + SeriesModel2.prototype.isSelected = function(dataIndex, dataType) { + var selectedMap = this.option.selectedMap; + if (!selectedMap) { + return false; + } + var data = this.getData(dataType); + return (selectedMap === "all" || selectedMap[getSelectionKey(data, dataIndex)]) && !data.getItemModel(dataIndex).get(["select", "disabled"]); + }; + SeriesModel2.prototype.isUniversalTransitionEnabled = function() { + if (this[SERIES_UNIVERSAL_TRANSITION_PROP]) { + return true; + } + var universalTransitionOpt = this.option.universalTransition; + if (!universalTransitionOpt) { + return false; + } + if (universalTransitionOpt === true) { + return true; + } + return universalTransitionOpt && universalTransitionOpt.enabled; + }; + SeriesModel2.prototype._innerSelect = function(data, innerDataIndices) { + var _a, _b; + var option = this.option; + var selectedMode = option.selectedMode; + var len = innerDataIndices.length; + if (!selectedMode || !len) { + return; + } + if (selectedMode === "series") { + option.selectedMap = "all"; + } else if (selectedMode === "multiple") { + if (!isObject$2(option.selectedMap)) { + option.selectedMap = {}; + } + var selectedMap = option.selectedMap; + for (var i = 0; i < len; i++) { + var dataIndex = innerDataIndices[i]; + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = true; + this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex); + } + } else if (selectedMode === "single" || selectedMode === true) { + var lastDataIndex = innerDataIndices[len - 1]; + var nameOrId = getSelectionKey(data, lastDataIndex); + option.selectedMap = (_a = {}, _a[nameOrId] = true, _a); + this._selectedDataIndicesMap = (_b = {}, _b[nameOrId] = data.getRawIndex(lastDataIndex), _b); + } + }; + SeriesModel2.prototype._initSelectedMapFromData = function(data) { + if (this.option.selectedMap) { + return; + } + var dataIndices = []; + if (data.hasItemOption) { + data.each(function(idx) { + var rawItem = data.getRawDataItem(idx); + if (rawItem && rawItem.selected) { + dataIndices.push(idx); + } + }); + } + if (dataIndices.length > 0) { + this._innerSelect(data, dataIndices); + } + }; + SeriesModel2.registerClass = function(clz) { + return ComponentModel.registerClass(clz); + }; + SeriesModel2.protoInitialize = function() { + var proto = SeriesModel2.prototype; + proto.type = "series.__base__"; + proto.seriesIndex = 0; + proto.ignoreStyleOnData = false; + proto.hasSymbolVisual = false; + proto.defaultSymbol = "circle"; + proto.visualStyleAccessPath = "itemStyle"; + proto.visualDrawType = "fill"; + }(); + return SeriesModel2; + }(ComponentModel) +); +mixin(SeriesModel, DataFormatMixin); +mixin(SeriesModel, PaletteMixin); +mountExtend(SeriesModel, ComponentModel); +function autoSeriesName(seriesModel) { + var name = seriesModel.name; + if (!isNameSpecified(seriesModel)) { + seriesModel.name = getSeriesAutoName(seriesModel) || name; + } +} +function getSeriesAutoName(seriesModel) { + var data = seriesModel.getRawData(); + var dataDims = data.mapDimensionsAll("seriesName"); + var nameArr = []; + each$4(dataDims, function(dataDim) { + var dimInfo = data.getDimensionInfo(dataDim); + dimInfo.displayName && nameArr.push(dimInfo.displayName); + }); + return nameArr.join(" "); +} +function dataTaskCount(context) { + return context.model.getRawData().count(); +} +function dataTaskReset(context) { + var seriesModel = context.model; + seriesModel.setData(seriesModel.getRawData().cloneShallow()); + return dataTaskProgress; +} +function dataTaskProgress(param, context) { + if (context.outputData && param.end > context.outputData.count()) { + context.model.getRawData().cloneShallow(context.outputData); + } +} +function wrapData(data, seriesModel) { + each$4(concatArray(data.CHANGABLE_METHODS, data.DOWNSAMPLE_METHODS), function(methodName) { + data.wrapMethod(methodName, curry$1(onDataChange, seriesModel)); + }); +} +function onDataChange(seriesModel, newList) { + var task = getCurrentTask(seriesModel); + if (task) { + task.setOutputEnd((newList || this).count()); + } + return newList; +} +function getCurrentTask(seriesModel) { + var scheduler = (seriesModel.ecModel || {}).scheduler; + var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid); + if (pipeline) { + var task = pipeline.currentTask; + if (task) { + var agentStubMap = task.agentStubMap; + if (agentStubMap) { + task = agentStubMap.get(seriesModel.uid); + } + } + return task; + } +} + +var ComponentView = /** @class */function () { + function ComponentView() { + this.group = new Group$2(); + this.uid = getUID('viewComponent'); + } + ComponentView.prototype.init = function (ecModel, api) {}; + ComponentView.prototype.render = function (model, ecModel, api, payload) {}; + ComponentView.prototype.dispose = function (ecModel, api) {}; + ComponentView.prototype.updateView = function (model, ecModel, api, payload) { + // Do nothing; + }; + ComponentView.prototype.updateLayout = function (model, ecModel, api, payload) { + // Do nothing; + }; + ComponentView.prototype.updateVisual = function (model, ecModel, api, payload) { + // Do nothing; + }; + /** + * Hook for toggle blur target series. + * Can be used in marker for blur or leave blur the markers + */ + ComponentView.prototype.toggleBlurSeries = function (seriesModels, isBlur, ecModel) { + // Do nothing; + }; + /** + * Traverse the new rendered elements. + * + * It will traverse the new added element in progressive rendering. + * And traverse all in normal rendering. + */ + ComponentView.prototype.eachRendered = function (cb) { + var group = this.group; + if (group) { + group.traverse(cb); + } + }; + return ComponentView; +}(); +enableClassExtend(ComponentView); +enableClassManagement(ComponentView); + +/** + * @return {string} If large mode changed, return string 'reset'; + */ +function createRenderPlanner() { + var inner = makeInner(); + return function (seriesModel) { + var fields = inner(seriesModel); + var pipelineContext = seriesModel.pipelineContext; + var originalLarge = !!fields.large; + var originalProgressive = !!fields.progressiveRender; + // FIXME: if the planner works on a filtered series, `pipelineContext` does not + // exists. See #11611 . Probably we need to modify this structure, see the comment + // on `performRawSeries` in `Schedular.js`. + var large = fields.large = !!(pipelineContext && pipelineContext.large); + var progressive = fields.progressiveRender = !!(pipelineContext && pipelineContext.progressiveRender); + return !!(originalLarge !== large || originalProgressive !== progressive) && 'reset'; + }; +} + +var inner$7 = makeInner(); +var renderPlanner = createRenderPlanner(); +var ChartView = ( + /** @class */ + function() { + function ChartView2() { + this.group = new Group$2(); + this.uid = getUID("viewChart"); + this.renderTask = createTask({ + plan: renderTaskPlan, + reset: renderTaskReset + }); + this.renderTask.context = { + view: this + }; + } + ChartView2.prototype.init = function(ecModel, api) { + }; + ChartView2.prototype.render = function(seriesModel, ecModel, api, payload) { + }; + ChartView2.prototype.highlight = function(seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(payload && payload.dataType); + if (!data) { + return; + } + toggleHighlight(data, payload, "emphasis"); + }; + ChartView2.prototype.downplay = function(seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(payload && payload.dataType); + if (!data) { + return; + } + toggleHighlight(data, payload, "normal"); + }; + ChartView2.prototype.remove = function(ecModel, api) { + this.group.removeAll(); + }; + ChartView2.prototype.dispose = function(ecModel, api) { + }; + ChartView2.prototype.updateView = function(seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + ChartView2.prototype.updateLayout = function(seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + ChartView2.prototype.updateVisual = function(seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + ChartView2.prototype.eachRendered = function(cb) { + traverseElements(this.group, cb); + }; + ChartView2.markUpdateMethod = function(payload, methodName) { + inner$7(payload).updateMethod = methodName; + }; + ChartView2.protoInitialize = function() { + var proto = ChartView2.prototype; + proto.type = "chart"; + }(); + return ChartView2; + }() +); +function elSetState(el, state, highlightDigit) { + if (el && isHighDownDispatcher(el)) { + (state === "emphasis" ? enterEmphasis : leaveEmphasis)(el, highlightDigit); + } +} +function toggleHighlight(data, payload, state) { + var dataIndex = queryDataIndex(data, payload); + var highlightDigit = payload && payload.highlightKey != null ? getHighlightDigit(payload.highlightKey) : null; + if (dataIndex != null) { + each$4(normalizeToArray(dataIndex), function(dataIdx) { + elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit); + }); + } else { + data.eachItemGraphicEl(function(el) { + elSetState(el, state, highlightDigit); + }); + } +} +enableClassExtend(ChartView); +enableClassManagement(ChartView); +function renderTaskPlan(context) { + return renderPlanner(context.model); +} +function renderTaskReset(context) { + var seriesModel = context.model; + var ecModel = context.ecModel; + var api = context.api; + var payload = context.payload; + var progressiveRender = seriesModel.pipelineContext.progressiveRender; + var view = context.view; + var updateMethod = payload && inner$7(payload).updateMethod; + var methodName = progressiveRender ? "incrementalPrepareRender" : updateMethod && view[updateMethod] ? updateMethod : "render"; + if (methodName !== "render") { + view[methodName](seriesModel, ecModel, api, payload); + } + return progressMethodMap[methodName]; +} +var progressMethodMap = { + incrementalPrepareRender: { + progress: function(params, context) { + context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload); + } + }, + render: { + // Put view.render in `progress` to support appendData. But in this case + // view.render should not be called in reset, otherwise it will be called + // twise. Use `forceFirstProgress` to make sure that view.render is called + // in any cases. + forceFirstProgress: true, + progress: function(params, context) { + context.view.render(context.model, context.ecModel, context.api, context.payload); + } + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +var ORIGIN_METHOD = '\0__throttleOriginMethod'; +var RATE = '\0__throttleRate'; +var THROTTLE_TYPE = '\0__throttleType'; +/** + * @public + * @param {(Function)} fn + * @param {number} [delay=0] Unit: ms. + * @param {boolean} [debounce=false] + * true: If call interval less than `delay`, only the last call works. + * false: If call interval less than `delay, call works on fixed rate. + * @return {(Function)} throttled fn. + */ +function throttle(fn, delay, debounce) { + var currCall; + var lastCall = 0; + var lastExec = 0; + var timer = null; + var diff; + var scope; + var args; + var debounceNextCall; + delay = delay || 0; + function exec() { + lastExec = new Date().getTime(); + timer = null; + fn.apply(scope, args || []); + } + var cb = function () { + var cbArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + cbArgs[_i] = arguments[_i]; + } + currCall = new Date().getTime(); + scope = this; + args = cbArgs; + var thisDelay = debounceNextCall || delay; + var thisDebounce = debounceNextCall || debounce; + debounceNextCall = null; + diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay; + clearTimeout(timer); + // Here we should make sure that: the `exec` SHOULD NOT be called later + // than a new call of `cb`, that is, preserving the command order. Consider + // calculating "scale rate" when roaming as an example. When a call of `cb` + // happens, either the `exec` is called dierectly, or the call is delayed. + // But the delayed call should never be later than next call of `cb`. Under + // this assurance, we can simply update view state each time `dispatchAction` + // triggered by user roaming, but not need to add extra code to avoid the + // state being "rolled-back". + if (thisDebounce) { + timer = setTimeout(exec, thisDelay); + } else { + if (diff >= 0) { + exec(); + } else { + timer = setTimeout(exec, -diff); + } + } + lastCall = currCall; + }; + /** + * Clear throttle. + * @public + */ + cb.clear = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + }; + /** + * Enable debounce once. + */ + cb.debounceNextCall = function (debounceDelay) { + debounceNextCall = debounceDelay; + }; + return cb; +} +/** + * Create throttle method or update throttle rate. + * + * @example + * ComponentView.prototype.render = function () { + * ... + * throttle.createOrUpdate( + * this, + * '_dispatchAction', + * this.model.get('throttle'), + * 'fixRate' + * ); + * }; + * ComponentView.prototype.remove = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * ComponentView.prototype.dispose = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * + */ +function createOrUpdate(obj, fnAttr, rate, throttleType) { + var fn = obj[fnAttr]; + if (!fn) { + return; + } + var originFn = fn[ORIGIN_METHOD] || fn; + var lastThrottleType = fn[THROTTLE_TYPE]; + var lastRate = fn[RATE]; + if (lastRate !== rate || lastThrottleType !== throttleType) { + if (rate == null || false) { + return obj[fnAttr] = originFn; + } + fn = obj[fnAttr] = throttle(originFn, rate, throttleType === 'debounce'); + fn[ORIGIN_METHOD] = originFn; + fn[THROTTLE_TYPE] = throttleType; + fn[RATE] = rate; + } + return fn; +} +/** + * Clear throttle. Example see throttle.createOrUpdate. + */ +function clear(obj, fnAttr) { + var fn = obj[fnAttr]; + if (fn && fn[ORIGIN_METHOD]) { + // Clear throttle + fn.clear && fn.clear(); + obj[fnAttr] = fn[ORIGIN_METHOD]; + } +} + +var inner$6 = makeInner(); +var defaultStyleMappers = { + itemStyle: makeStyleMapper(ITEM_STYLE_KEY_MAP, true), + lineStyle: makeStyleMapper(LINE_STYLE_KEY_MAP, true) +}; +var defaultColorKey = { + lineStyle: 'stroke', + itemStyle: 'fill' +}; +function getStyleMapper(seriesModel, stylePath) { + var styleMapper = seriesModel.visualStyleMapper || defaultStyleMappers[stylePath]; + if (!styleMapper) { + console.warn("Unknown style type '" + stylePath + "'."); + return defaultStyleMappers.itemStyle; + } + return styleMapper; +} +function getDefaultColorKey(seriesModel, stylePath) { + // return defaultColorKey[stylePath] || + var colorKey = seriesModel.visualDrawType || defaultColorKey[stylePath]; + if (!colorKey) { + console.warn("Unknown style type '" + stylePath + "'."); + return 'fill'; + } + return colorKey; +} +var seriesStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; + // Set in itemStyle + var styleModel = seriesModel.getModel(stylePath); + var getStyle = getStyleMapper(seriesModel, stylePath); + var globalStyle = getStyle(styleModel); + var decalOption = styleModel.getShallow('decal'); + if (decalOption) { + data.setVisual('decal', decalOption); + decalOption.dirty = true; + } + // TODO + var colorKey = getDefaultColorKey(seriesModel, stylePath); + var color = globalStyle[colorKey]; + // TODO style callback + var colorCallback = isFunction(color) ? color : null; + var hasAutoColor = globalStyle.fill === 'auto' || globalStyle.stroke === 'auto'; + // Get from color palette by default. + if (!globalStyle[colorKey] || colorCallback || hasAutoColor) { + // Note: If some series has color specified (e.g., by itemStyle.color), we DO NOT + // make it effect palette. Because some scenarios users need to make some series + // transparent or as background, which should better not effect the palette. + var colorPalette = seriesModel.getColorFromPalette( + // TODO series count changed. + seriesModel.name, null, ecModel.getSeriesCount()); + if (!globalStyle[colorKey]) { + globalStyle[colorKey] = colorPalette; + data.setVisual('colorFromPalette', true); + } + globalStyle.fill = globalStyle.fill === 'auto' || isFunction(globalStyle.fill) ? colorPalette : globalStyle.fill; + globalStyle.stroke = globalStyle.stroke === 'auto' || isFunction(globalStyle.stroke) ? colorPalette : globalStyle.stroke; + } + data.setVisual('style', globalStyle); + data.setVisual('drawType', colorKey); + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel) && colorCallback) { + data.setVisual('colorFromPalette', false); + return { + dataEach: function (data, idx) { + var dataParams = seriesModel.getDataParams(idx); + var itemStyle = extend({}, globalStyle); + itemStyle[colorKey] = colorCallback(dataParams); + data.setItemVisual(idx, 'style', itemStyle); + } + }; + } + } +}; +var sharedModel = new Model(); +var dataStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (seriesModel.ignoreStyleOnData || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; + // Set in itemStyle + var getStyle = getStyleMapper(seriesModel, stylePath); + var colorKey = data.getVisual('drawType'); + return { + dataEach: data.hasItemOption ? function (data, idx) { + // Not use getItemModel for performance considuration + var rawItem = data.getRawDataItem(idx); + if (rawItem && rawItem[stylePath]) { + sharedModel.option = rawItem[stylePath]; + var style = getStyle(sharedModel); + var existsStyle = data.ensureUniqueItemVisual(idx, 'style'); + extend(existsStyle, style); + if (sharedModel.option.decal) { + data.setItemVisual(idx, 'decal', sharedModel.option.decal); + sharedModel.option.decal.dirty = true; + } + if (colorKey in style) { + data.setItemVisual(idx, 'colorFromPalette', false); + } + } + } : null + }; + } +}; +// Pick color from palette for the data which has not been set with color yet. +// Note: do not support stream rendering. No such cases yet. +var dataColorPaletteTask = { + performRawSeries: true, + overallReset: function (ecModel) { + // Each type of series uses one scope. + // Pie and funnel are using different scopes. + var paletteScopeGroupByType = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var colorBy = seriesModel.getColorBy(); + if (seriesModel.isColorBySeries()) { + return; + } + var key = seriesModel.type + '-' + colorBy; + var colorScope = paletteScopeGroupByType.get(key); + if (!colorScope) { + colorScope = {}; + paletteScopeGroupByType.set(key, colorScope); + } + inner$6(seriesModel).scope = colorScope; + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.isColorBySeries() || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + var dataAll = seriesModel.getRawData(); + var idxMap = {}; + var data = seriesModel.getData(); + var colorScope = inner$6(seriesModel).scope; + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; + var colorKey = getDefaultColorKey(seriesModel, stylePath); + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap[rawIdx] = idx; + }); + // Iterate on data before filtered. To make sure color from palette can be + // Consistent when toggling legend. + dataAll.each(function (rawIdx) { + var idx = idxMap[rawIdx]; + var fromPalette = data.getItemVisual(idx, 'colorFromPalette'); + // Get color from palette for each data only when the color is inherited from series color, which is + // also picked from color palette. So following situation is not in the case: + // 1. series.itemStyle.color is set + // 2. color is encoded by visualMap + if (fromPalette) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + var name_1 = dataAll.getName(rawIdx) || rawIdx + ''; + var dataCount = dataAll.count(); + itemStyle[colorKey] = seriesModel.getColorFromPalette(name_1, colorScope, dataCount); + } + }); + }); + } +}; + +var PI$1 = Math.PI; +/** + * @param {module:echarts/ExtensionAPI} api + * @param {Object} [opts] + * @param {string} [opts.text] + * @param {string} [opts.color] + * @param {string} [opts.textColor] + * @return {module:zrender/Element} + */ +function defaultLoading(api, opts) { + opts = opts || {}; + defaults(opts, { + text: 'loading', + textColor: '#000', + fontSize: 12, + fontWeight: 'normal', + fontStyle: 'normal', + fontFamily: 'sans-serif', + maskColor: 'rgba(255, 255, 255, 0.8)', + showSpinner: true, + color: '#5470c6', + spinnerRadius: 10, + lineWidth: 5, + zlevel: 0 + }); + var group = new Group$2(); + var mask = new Rect({ + style: { + fill: opts.maskColor + }, + zlevel: opts.zlevel, + z: 10000 + }); + group.add(mask); + var textContent = new ZRText({ + style: { + text: opts.text, + fill: opts.textColor, + fontSize: opts.fontSize, + fontWeight: opts.fontWeight, + fontStyle: opts.fontStyle, + fontFamily: opts.fontFamily + }, + zlevel: opts.zlevel, + z: 10001 + }); + var labelRect = new Rect({ + style: { + fill: 'none' + }, + textContent: textContent, + textConfig: { + position: 'right', + distance: 10 + }, + zlevel: opts.zlevel, + z: 10001 + }); + group.add(labelRect); + var arc; + if (opts.showSpinner) { + arc = new Arc({ + shape: { + startAngle: -PI$1 / 2, + endAngle: -PI$1 / 2 + 0.1, + r: opts.spinnerRadius + }, + style: { + stroke: opts.color, + lineCap: 'round', + lineWidth: opts.lineWidth + }, + zlevel: opts.zlevel, + z: 10001 + }); + arc.animateShape(true).when(1000, { + endAngle: PI$1 * 3 / 2 + }).start('circularInOut'); + arc.animateShape(true).when(1000, { + startAngle: PI$1 * 3 / 2 + }).delay(300).start('circularInOut'); + group.add(arc); + } + // Inject resize + group.resize = function () { + var textWidth = textContent.getBoundingRect().width; + var r = opts.showSpinner ? opts.spinnerRadius : 0; + // cx = (containerWidth - arcDiameter - textDistance - textWidth) / 2 + // textDistance needs to be calculated when both animation and text exist + var cx = (api.getWidth() - r * 2 - (opts.showSpinner && textWidth ? 10 : 0) - textWidth) / 2 - (opts.showSpinner && textWidth ? 0 : 5 + textWidth / 2) + // only show the text + + (opts.showSpinner ? 0 : textWidth / 2) + // only show the spinner + + (textWidth ? 0 : r); + var cy = api.getHeight() / 2; + opts.showSpinner && arc.setShape({ + cx: cx, + cy: cy + }); + labelRect.setShape({ + x: cx - r, + y: cy - r, + width: r * 2, + height: r * 2 + }); + mask.setShape({ + x: 0, + y: 0, + width: api.getWidth(), + height: api.getHeight() + }); + }; + group.resize(); + return group; +} + +var Scheduler = ( + /** @class */ + function() { + function Scheduler2(ecInstance, api, dataProcessorHandlers, visualHandlers) { + this._stageTaskMap = createHashMap(); + this.ecInstance = ecInstance; + this.api = api; + dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice(); + visualHandlers = this._visualHandlers = visualHandlers.slice(); + this._allHandlers = dataProcessorHandlers.concat(visualHandlers); + } + Scheduler2.prototype.restoreData = function(ecModel, payload) { + ecModel.restoreData(payload); + this._stageTaskMap.each(function(taskRecord) { + var overallTask = taskRecord.overallTask; + overallTask && overallTask.dirty(); + }); + }; + Scheduler2.prototype.getPerformArgs = function(task, isBlock) { + if (!task.__pipeline) { + return; + } + var pipeline = this._pipelineMap.get(task.__pipeline.id); + var pCtx = pipeline.context; + var incremental = !isBlock && pipeline.progressiveEnabled && (!pCtx || pCtx.progressiveRender) && task.__idxInPipeline > pipeline.blockIndex; + var step = incremental ? pipeline.step : null; + var modDataCount = pCtx && pCtx.modDataCount; + var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null; + return { + step, + modBy, + modDataCount + }; + }; + Scheduler2.prototype.getPipeline = function(pipelineId) { + return this._pipelineMap.get(pipelineId); + }; + Scheduler2.prototype.updateStreamModes = function(seriesModel, view) { + var pipeline = this._pipelineMap.get(seriesModel.uid); + var data = seriesModel.getData(); + var dataLen = data.count(); + var progressiveRender = pipeline.progressiveEnabled && view.incrementalPrepareRender && dataLen >= pipeline.threshold; + var large = seriesModel.get("large") && dataLen >= seriesModel.get("largeThreshold"); + var modDataCount = seriesModel.get("progressiveChunkMode") === "mod" ? dataLen : null; + seriesModel.pipelineContext = pipeline.context = { + progressiveRender, + modDataCount, + large + }; + }; + Scheduler2.prototype.restorePipelines = function(ecModel) { + var scheduler = this; + var pipelineMap = scheduler._pipelineMap = createHashMap(); + ecModel.eachSeries(function(seriesModel) { + var progressive = seriesModel.getProgressive(); + var pipelineId = seriesModel.uid; + pipelineMap.set(pipelineId, { + id: pipelineId, + head: null, + tail: null, + threshold: seriesModel.getProgressiveThreshold(), + progressiveEnabled: progressive && !(seriesModel.preventIncremental && seriesModel.preventIncremental()), + blockIndex: -1, + step: Math.round(progressive || 700), + count: 0 + }); + scheduler._pipe(seriesModel, seriesModel.dataTask); + }); + }; + Scheduler2.prototype.prepareStageTasks = function() { + var stageTaskMap = this._stageTaskMap; + var ecModel = this.api.getModel(); + var api = this.api; + each$4(this._allHandlers, function(handler) { + var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, {}); + var errMsg = ""; + assert(!(handler.reset && handler.overallReset), errMsg); + handler.reset && this._createSeriesStageTask(handler, record, ecModel, api); + handler.overallReset && this._createOverallStageTask(handler, record, ecModel, api); + }, this); + }; + Scheduler2.prototype.prepareView = function(view, model, ecModel, api) { + var renderTask = view.renderTask; + var context = renderTask.context; + context.model = model; + context.ecModel = ecModel; + context.api = api; + renderTask.__block = !view.incrementalPrepareRender; + this._pipe(model, renderTask); + }; + Scheduler2.prototype.performDataProcessorTasks = function(ecModel, payload) { + this._performStageTasks(this._dataProcessorHandlers, ecModel, payload, { + block: true + }); + }; + Scheduler2.prototype.performVisualTasks = function(ecModel, payload, opt) { + this._performStageTasks(this._visualHandlers, ecModel, payload, opt); + }; + Scheduler2.prototype._performStageTasks = function(stageHandlers, ecModel, payload, opt) { + opt = opt || {}; + var unfinished = false; + var scheduler = this; + each$4(stageHandlers, function(stageHandler, idx) { + if (opt.visualType && opt.visualType !== stageHandler.visualType) { + return; + } + var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid); + var seriesTaskMap = stageHandlerRecord.seriesTaskMap; + var overallTask = stageHandlerRecord.overallTask; + if (overallTask) { + var overallNeedDirty_1; + var agentStubMap = overallTask.agentStubMap; + agentStubMap.each(function(stub) { + if (needSetDirty(opt, stub)) { + stub.dirty(); + overallNeedDirty_1 = true; + } + }); + overallNeedDirty_1 && overallTask.dirty(); + scheduler.updatePayload(overallTask, payload); + var performArgs_1 = scheduler.getPerformArgs(overallTask, opt.block); + agentStubMap.each(function(stub) { + stub.perform(performArgs_1); + }); + if (overallTask.perform(performArgs_1)) { + unfinished = true; + } + } else if (seriesTaskMap) { + seriesTaskMap.each(function(task, pipelineId) { + if (needSetDirty(opt, task)) { + task.dirty(); + } + var performArgs = scheduler.getPerformArgs(task, opt.block); + performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model); + scheduler.updatePayload(task, payload); + if (task.perform(performArgs)) { + unfinished = true; + } + }); + } + }); + function needSetDirty(opt2, task) { + return opt2.setDirty && (!opt2.dirtyMap || opt2.dirtyMap.get(task.__pipeline.id)); + } + this.unfinished = unfinished || this.unfinished; + }; + Scheduler2.prototype.performSeriesTasks = function(ecModel) { + var unfinished; + ecModel.eachSeries(function(seriesModel) { + unfinished = seriesModel.dataTask.perform() || unfinished; + }); + this.unfinished = unfinished || this.unfinished; + }; + Scheduler2.prototype.plan = function() { + this._pipelineMap.each(function(pipeline) { + var task = pipeline.tail; + do { + if (task.__block) { + pipeline.blockIndex = task.__idxInPipeline; + break; + } + task = task.getUpstream(); + } while (task); + }); + }; + Scheduler2.prototype.updatePayload = function(task, payload) { + payload !== "remain" && (task.context.payload = payload); + }; + Scheduler2.prototype._createSeriesStageTask = function(stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var oldSeriesTaskMap = stageHandlerRecord.seriesTaskMap; + var newSeriesTaskMap = stageHandlerRecord.seriesTaskMap = createHashMap(); + var seriesType2 = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; + if (stageHandler.createOnAllSeries) { + ecModel.eachRawSeries(create); + } else if (seriesType2) { + ecModel.eachRawSeriesByType(seriesType2, create); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(create); + } + function create(seriesModel) { + var pipelineId = seriesModel.uid; + var task = newSeriesTaskMap.set(pipelineId, oldSeriesTaskMap && oldSeriesTaskMap.get(pipelineId) || createTask({ + plan: seriesTaskPlan, + reset: seriesTaskReset, + count: seriesTaskCount + })); + task.context = { + model: seriesModel, + ecModel, + api, + // PENDING: `useClearVisual` not used? + useClearVisual: stageHandler.isVisual && !stageHandler.isLayout, + plan: stageHandler.plan, + reset: stageHandler.reset, + scheduler + }; + scheduler._pipe(seriesModel, task); + } + }; + Scheduler2.prototype._createOverallStageTask = function(stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask || createTask({ + reset: overallTaskReset + }); + overallTask.context = { + ecModel, + api, + overallReset: stageHandler.overallReset, + scheduler + }; + var oldAgentStubMap = overallTask.agentStubMap; + var newAgentStubMap = overallTask.agentStubMap = createHashMap(); + var seriesType2 = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; + var overallProgress = true; + var shouldOverallTaskDirty = false; + var errMsg = ""; + assert(!stageHandler.createOnAllSeries, errMsg); + if (seriesType2) { + ecModel.eachRawSeriesByType(seriesType2, createStub); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(createStub); + } else { + overallProgress = false; + each$4(ecModel.getSeries(), createStub); + } + function createStub(seriesModel) { + var pipelineId = seriesModel.uid; + var stub = newAgentStubMap.set(pipelineId, oldAgentStubMap && oldAgentStubMap.get(pipelineId) || // When the result of `getTargetSeries` changed, the overallTask + // should be set as dirty and re-performed. + (shouldOverallTaskDirty = true, createTask({ + reset: stubReset, + onDirty: stubOnDirty + }))); + stub.context = { + model: seriesModel, + overallProgress + // FIXME:TS never used, so comment it + // modifyOutputEnd: modifyOutputEnd + }; + stub.agent = overallTask; + stub.__block = overallProgress; + scheduler._pipe(seriesModel, stub); + } + if (shouldOverallTaskDirty) { + overallTask.dirty(); + } + }; + Scheduler2.prototype._pipe = function(seriesModel, task) { + var pipelineId = seriesModel.uid; + var pipeline = this._pipelineMap.get(pipelineId); + !pipeline.head && (pipeline.head = task); + pipeline.tail && pipeline.tail.pipe(task); + pipeline.tail = task; + task.__idxInPipeline = pipeline.count++; + task.__pipeline = pipeline; + }; + Scheduler2.wrapStageHandler = function(stageHandler, visualType) { + if (isFunction(stageHandler)) { + stageHandler = { + overallReset: stageHandler, + seriesType: detectSeriseType(stageHandler) + }; + } + stageHandler.uid = getUID("stageHandler"); + visualType && (stageHandler.visualType = visualType); + return stageHandler; + }; + return Scheduler2; + }() +); +function overallTaskReset(context) { + context.overallReset(context.ecModel, context.api, context.payload); +} +function stubReset(context) { + return context.overallProgress && stubProgress; +} +function stubProgress() { + this.agent.dirty(); + this.getDownstream().dirty(); +} +function stubOnDirty() { + this.agent && this.agent.dirty(); +} +function seriesTaskPlan(context) { + return context.plan ? context.plan(context.model, context.ecModel, context.api, context.payload) : null; +} +function seriesTaskReset(context) { + if (context.useClearVisual) { + context.data.clearAllVisual(); + } + var resetDefines = context.resetDefines = normalizeToArray(context.reset(context.model, context.ecModel, context.api, context.payload)); + return resetDefines.length > 1 ? map$1(resetDefines, function(v, idx) { + return makeSeriesTaskProgress(idx); + }) : singleSeriesTaskProgress; +} +var singleSeriesTaskProgress = makeSeriesTaskProgress(0); +function makeSeriesTaskProgress(resetDefineIdx) { + return function(params, context) { + var data = context.data; + var resetDefine = context.resetDefines[resetDefineIdx]; + if (resetDefine && resetDefine.dataEach) { + for (var i = params.start; i < params.end; i++) { + resetDefine.dataEach(data, i); + } + } else if (resetDefine && resetDefine.progress) { + resetDefine.progress(params, data); + } + }; +} +function seriesTaskCount(context) { + return context.data.count(); +} +function detectSeriseType(legacyFunc) { + seriesType = null; + try { + legacyFunc(ecModelMock, apiMock); + } catch (e) { + } + return seriesType; +} +var ecModelMock = {}; +var apiMock = {}; +var seriesType; +mockMethods(ecModelMock, GlobalModel); +mockMethods(apiMock, ExtensionAPI); +ecModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function(type) { + seriesType = type; +}; +ecModelMock.eachComponent = function(cond) { + if (cond.mainType === "series" && cond.subType) { + seriesType = cond.subType; + } +}; +function mockMethods(target, Clz) { + for (var name_1 in Clz.prototype) { + target[name_1] = noop; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +var colorAll = ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF']; +const lightTheme = { + color: colorAll, + colorLayer: [['#37A2DA', '#ffd85c', '#fd7b5f'], ['#37A2DA', '#67E0E3', '#FFDB5C', '#ff9f7f', '#E062AE', '#9d96f5'], ['#37A2DA', '#32C5E9', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378EA', '#96BFFF'], colorAll] +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +var contrastColor = '#B9B8CE'; +var backgroundColor = '#100C2A'; +var axisCommon = function () { + return { + axisLine: { + lineStyle: { + color: contrastColor + } + }, + splitLine: { + lineStyle: { + color: '#484753' + } + }, + splitArea: { + areaStyle: { + color: ['rgba(255,255,255,0.02)', 'rgba(255,255,255,0.05)'] + } + }, + minorSplitLine: { + lineStyle: { + color: '#20203B' + } + } + }; +}; +var colorPalette = ['#4992ff', '#7cffb2', '#fddd60', '#ff6e76', '#58d9f9', '#05c091', '#ff8a45', '#8d48e3', '#dd79ff']; +var theme = { + darkMode: true, + color: colorPalette, + backgroundColor: backgroundColor, + axisPointer: { + lineStyle: { + color: '#817f91' + }, + crossStyle: { + color: '#817f91' + }, + label: { + // TODO Contrast of label backgorundColor + color: '#fff' + } + }, + legend: { + textStyle: { + color: contrastColor + }, + pageTextStyle: { + color: contrastColor + } + }, + textStyle: { + color: contrastColor + }, + title: { + textStyle: { + color: '#EEF1FA' + }, + subtextStyle: { + color: '#B9B8CE' + } + }, + toolbox: { + iconStyle: { + borderColor: contrastColor + } + }, + dataZoom: { + borderColor: '#71708A', + textStyle: { + color: contrastColor + }, + brushStyle: { + color: 'rgba(135,163,206,0.3)' + }, + handleStyle: { + color: '#353450', + borderColor: '#C5CBE3' + }, + moveHandleStyle: { + color: '#B0B6C3', + opacity: 0.3 + }, + fillerColor: 'rgba(135,163,206,0.2)', + emphasis: { + handleStyle: { + borderColor: '#91B7F2', + color: '#4D587D' + }, + moveHandleStyle: { + color: '#636D9A', + opacity: 0.7 + } + }, + dataBackground: { + lineStyle: { + color: '#71708A', + width: 1 + }, + areaStyle: { + color: '#71708A' + } + }, + selectedDataBackground: { + lineStyle: { + color: '#87A3CE' + }, + areaStyle: { + color: '#87A3CE' + } + } + }, + visualMap: { + textStyle: { + color: contrastColor + } + }, + timeline: { + lineStyle: { + color: contrastColor + }, + label: { + color: contrastColor + }, + controlStyle: { + color: contrastColor, + borderColor: contrastColor + } + }, + calendar: { + itemStyle: { + color: backgroundColor + }, + dayLabel: { + color: contrastColor + }, + monthLabel: { + color: contrastColor + }, + yearLabel: { + color: contrastColor + } + }, + timeAxis: axisCommon(), + logAxis: axisCommon(), + valueAxis: axisCommon(), + categoryAxis: axisCommon(), + line: { + symbol: 'circle' + }, + graph: { + color: colorPalette + }, + gauge: { + title: { + color: contrastColor + }, + axisLine: { + lineStyle: { + color: [[1, 'rgba(207,212,219,0.2)']] + } + }, + axisLabel: { + color: contrastColor + }, + detail: { + color: '#EEF1FA' + } + }, + candlestick: { + itemStyle: { + color: '#f64e56', + color0: '#54ea92', + borderColor: '#f64e56', + borderColor0: '#54ea92' + // borderColor: '#ca2824', + // borderColor0: '#09a443' + } + } +}; +theme.categoryAxis.splitLine.show = false; + +/** + * Usage of query: + * `chart.on('click', query, handler);` + * The `query` can be: + * + The component type query string, only `mainType` or `mainType.subType`, + * like: 'xAxis', 'series', 'xAxis.category' or 'series.line'. + * + The component query object, like: + * `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`, + * `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`. + * + The data query object, like: + * `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`. + * + The other query object (cmponent customized query), like: + * `{element: 'some'}` (only available in custom series). + * + * Caveat: If a prop in the `query` object is `null/undefined`, it is the + * same as there is no such prop in the `query` object. + */ +var ECEventProcessor = /** @class */function () { + function ECEventProcessor() {} + ECEventProcessor.prototype.normalizeQuery = function (query) { + var cptQuery = {}; + var dataQuery = {}; + var otherQuery = {}; + // `query` is `mainType` or `mainType.subType` of component. + if (isString(query)) { + var condCptType = parseClassType(query); + // `.main` and `.sub` may be ''. + cptQuery.mainType = condCptType.main || null; + cptQuery.subType = condCptType.sub || null; + } + // `query` is an object, convert to {mainType, index, name, id}. + else { + // `xxxIndex`, `xxxName`, `xxxId`, `name`, `dataIndex`, `dataType` is reserved, + // can not be used in `compomentModel.filterForExposedEvent`. + var suffixes_1 = ['Index', 'Name', 'Id']; + var dataKeys_1 = { + name: 1, + dataIndex: 1, + dataType: 1 + }; + each$4(query, function (val, key) { + var reserved = false; + for (var i = 0; i < suffixes_1.length; i++) { + var propSuffix = suffixes_1[i]; + var suffixPos = key.lastIndexOf(propSuffix); + if (suffixPos > 0 && suffixPos === key.length - propSuffix.length) { + var mainType = key.slice(0, suffixPos); + // Consider `dataIndex`. + if (mainType !== 'data') { + cptQuery.mainType = mainType; + cptQuery[propSuffix.toLowerCase()] = val; + reserved = true; + } + } + } + if (dataKeys_1.hasOwnProperty(key)) { + dataQuery[key] = val; + reserved = true; + } + if (!reserved) { + otherQuery[key] = val; + } + }); + } + return { + cptQuery: cptQuery, + dataQuery: dataQuery, + otherQuery: otherQuery + }; + }; + ECEventProcessor.prototype.filter = function (eventType, query) { + // They should be assigned before each trigger call. + var eventInfo = this.eventInfo; + if (!eventInfo) { + return true; + } + var targetEl = eventInfo.targetEl; + var packedEvent = eventInfo.packedEvent; + var model = eventInfo.model; + var view = eventInfo.view; + // For event like 'globalout'. + if (!model || !view) { + return true; + } + var cptQuery = query.cptQuery; + var dataQuery = query.dataQuery; + return check(cptQuery, model, 'mainType') && check(cptQuery, model, 'subType') && check(cptQuery, model, 'index', 'componentIndex') && check(cptQuery, model, 'name') && check(cptQuery, model, 'id') && check(dataQuery, packedEvent, 'name') && check(dataQuery, packedEvent, 'dataIndex') && check(dataQuery, packedEvent, 'dataType') && (!view.filterForExposedEvent || view.filterForExposedEvent(eventType, query.otherQuery, targetEl, packedEvent)); + function check(query, host, prop, propOnHost) { + return query[prop] == null || host[propOnHost || prop] === query[prop]; + } + }; + ECEventProcessor.prototype.afterTrigger = function () { + // Make sure the eventInfo won't be used in next trigger. + this.eventInfo = null; + }; + return ECEventProcessor; +}(); + +var SYMBOL_PROPS_WITH_CB = ['symbol', 'symbolSize', 'symbolRotate', 'symbolOffset']; +var SYMBOL_PROPS = SYMBOL_PROPS_WITH_CB.concat(['symbolKeepAspect']); +// Encoding visual for all series include which is filtered for legend drawing +var seriesSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + if (seriesModel.legendIcon) { + data.setVisual('legendIcon', seriesModel.legendIcon); + } + if (!seriesModel.hasSymbolVisual) { + return; + } + var symbolOptions = {}; + var symbolOptionsCb = {}; + var hasCallback = false; + for (var i = 0; i < SYMBOL_PROPS_WITH_CB.length; i++) { + var symbolPropName = SYMBOL_PROPS_WITH_CB[i]; + var val = seriesModel.get(symbolPropName); + if (isFunction(val)) { + hasCallback = true; + symbolOptionsCb[symbolPropName] = val; + } else { + symbolOptions[symbolPropName] = val; + } + } + symbolOptions.symbol = symbolOptions.symbol || seriesModel.defaultSymbol; + data.setVisual(extend({ + legendIcon: seriesModel.legendIcon || symbolOptions.symbol, + symbolKeepAspect: seriesModel.get('symbolKeepAspect') + }, symbolOptions)); + // Only visible series has each data be visual encoded + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + var symbolPropsCb = keys(symbolOptionsCb); + function dataEach(data, idx) { + var rawValue = seriesModel.getRawValue(idx); + var params = seriesModel.getDataParams(idx); + for (var i = 0; i < symbolPropsCb.length; i++) { + var symbolPropName = symbolPropsCb[i]; + data.setItemVisual(idx, symbolPropName, symbolOptionsCb[symbolPropName](rawValue, params)); + } + } + return { + dataEach: hasCallback ? dataEach : null + }; + } +}; +var dataSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (!seriesModel.hasSymbolVisual) { + return; + } + // Only visible series has each data be visual encoded + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + var data = seriesModel.getData(); + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + for (var i = 0; i < SYMBOL_PROPS.length; i++) { + var symbolPropName = SYMBOL_PROPS[i]; + var val = itemModel.getShallow(symbolPropName, true); + if (val != null) { + data.setItemVisual(idx, symbolPropName, val); + } + } + } + return { + dataEach: data.hasItemOption ? dataEach : null + }; + } +}; + +function getItemVisualFromData(data, dataIndex, key) { + switch (key) { + case "color": + var style = data.getItemVisual(dataIndex, "style"); + return style[data.getVisual("drawType")]; + case "opacity": + return data.getItemVisual(dataIndex, "style").opacity; + case "symbol": + case "symbolSize": + case "liftZ": + return data.getItemVisual(dataIndex, key); + } +} +function getVisualFromData(data, key) { + switch (key) { + case "color": + var style = data.getVisual("style"); + return style[data.getVisual("drawType")]; + case "opacity": + return data.getVisual("style").opacity; + case "symbol": + case "symbolSize": + case "liftZ": + return data.getVisual(key); + } +} + +function createLegacyDataSelectAction(seriesType, ecRegisterAction) { + function getSeriesIndices(ecModel, payload) { + var seriesIndices = []; + ecModel.eachComponent({ + mainType: "series", + subType: seriesType, + query: payload + }, function(seriesModel) { + seriesIndices.push(seriesModel.seriesIndex); + }); + return seriesIndices; + } + each$4([[seriesType + "ToggleSelect", "toggleSelect"], [seriesType + "Select", "select"], [seriesType + "UnSelect", "unselect"]], function(eventsMap) { + ecRegisterAction(eventsMap[0], function(payload, ecModel, api) { + payload = extend({}, payload); + api.dispatchAction(extend(payload, { + type: eventsMap[1], + seriesIndex: getSeriesIndices(ecModel, payload) + })); + }); + }); +} +function handleSeriesLegacySelectEvents(type, eventPostfix, ecIns, ecModel, payload) { + var legacyEventName = type + eventPostfix; + if (!ecIns.isSilent(legacyEventName)) { + ecModel.eachComponent({ + mainType: "series", + subType: "pie" + }, function(seriesModel) { + var seriesIndex = seriesModel.seriesIndex; + var selectedMap = seriesModel.option.selectedMap; + var selected = payload.selected; + for (var i = 0; i < selected.length; i++) { + if (selected[i].seriesIndex === seriesIndex) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload.fromActionPayload); + ecIns.trigger(legacyEventName, { + type: legacyEventName, + seriesId: seriesModel.id, + name: isArray(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex), + selected: isString(selectedMap) ? selectedMap : extend({}, selectedMap) + }); + } + } + }); + } +} +function handleLegacySelectEvents(messageCenter, ecIns, api) { + messageCenter.on("selectchanged", function(params) { + var ecModel = api.getModel(); + if (params.isFromClick) { + handleSeriesLegacySelectEvents("map", "selectchanged", ecIns, ecModel, params); + handleSeriesLegacySelectEvents("pie", "selectchanged", ecIns, ecModel, params); + } else if (params.fromAction === "select") { + handleSeriesLegacySelectEvents("map", "selected", ecIns, ecModel, params); + handleSeriesLegacySelectEvents("pie", "selected", ecIns, ecModel, params); + } else if (params.fromAction === "unselect") { + handleSeriesLegacySelectEvents("map", "unselected", ecIns, ecModel, params); + handleSeriesLegacySelectEvents("pie", "unselected", ecIns, ecModel, params); + } + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +function findEventDispatcher(target, det, returnFirstMatch) { + var found; + while (target) { + if (det(target)) { + found = target; + if (returnFirstMatch) { + break; + } + } + target = target.__hostTarget || target.parent; + } + return found; +} + +var wmUniqueIndex = Math.round(Math.random() * 9); +var supportDefineProperty = typeof Object.defineProperty === 'function'; +var WeakMap = (function () { + function WeakMap() { + this._id = '__ec_inner_' + wmUniqueIndex++; + } + WeakMap.prototype.get = function (key) { + return this._guard(key)[this._id]; + }; + WeakMap.prototype.set = function (key, value) { + var target = this._guard(key); + if (supportDefineProperty) { + Object.defineProperty(target, this._id, { + value: value, + enumerable: false, + configurable: true + }); + } + else { + target[this._id] = value; + } + return this; + }; + WeakMap.prototype["delete"] = function (key) { + if (this.has(key)) { + delete this._guard(key)[this._id]; + return true; + } + return false; + }; + WeakMap.prototype.has = function (key) { + return !!this._guard(key)[this._id]; + }; + WeakMap.prototype._guard = function (key) { + if (key !== Object(key)) { + throw TypeError('Value of WeakMap is not a non-null object.'); + } + return key; + }; + return WeakMap; +}()); + +/** + * Triangle shape + * @inner + */ +var Triangle = Path.extend({ + type: 'triangle', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy + height); + path.lineTo(cx - width, cy + height); + path.closePath(); + } +}); +/** + * Diamond shape + * @inner + */ +var Diamond = Path.extend({ + type: 'diamond', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy); + path.lineTo(cx, cy + height); + path.lineTo(cx - width, cy); + path.closePath(); + } +}); +/** + * Pin shape + * @inner + */ +var Pin = Path.extend({ + type: 'pin', + shape: { + // x, y on the cusp + x: 0, + y: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var x = shape.x; + var y = shape.y; + var w = shape.width / 5 * 3; + // Height must be larger than width + var h = Math.max(w, shape.height); + var r = w / 2; + // Dist on y with tangent point and circle center + var dy = r * r / (h - r); + var cy = y - h + r + dy; + var angle = Math.asin(dy / r); + // Dist on x with tangent point and circle center + var dx = Math.cos(angle) * r; + var tanX = Math.sin(angle); + var tanY = Math.cos(angle); + var cpLen = r * 0.6; + var cpLen2 = r * 0.7; + path.moveTo(x - dx, cy + dy); + path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle); + path.bezierCurveTo(x + dx - tanX * cpLen, cy + dy + tanY * cpLen, x, y - cpLen2, x, y); + path.bezierCurveTo(x, y - cpLen2, x - dx + tanX * cpLen, cy + dy + tanY * cpLen, x - dx, cy + dy); + path.closePath(); + } +}); +/** + * Arrow shape + * @inner + */ +var Arrow = Path.extend({ + type: 'arrow', + shape: { + x: 0, + y: 0, + width: 0, + height: 0 + }, + buildPath: function (ctx, shape) { + var height = shape.height; + var width = shape.width; + var x = shape.x; + var y = shape.y; + var dx = width / 3 * 2; + ctx.moveTo(x, y); + ctx.lineTo(x + dx, y + height); + ctx.lineTo(x, y + height / 4 * 3); + ctx.lineTo(x - dx, y + height); + ctx.lineTo(x, y); + ctx.closePath(); + } +}); +/** + * Map of path constructors + */ +// TODO Use function to build symbol path. +var symbolCtors = { + line: Line, + rect: Rect, + roundRect: Rect, + square: Rect, + circle: Circle, + diamond: Diamond, + pin: Pin, + arrow: Arrow, + triangle: Triangle +}; +var symbolShapeMakers = { + line: function (x, y, w, h, shape) { + shape.x1 = x; + shape.y1 = y + h / 2; + shape.x2 = x + w; + shape.y2 = y + h / 2; + }, + rect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + }, + roundRect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + shape.r = Math.min(w, h) / 4; + }, + square: function (x, y, w, h, shape) { + var size = Math.min(w, h); + shape.x = x; + shape.y = y; + shape.width = size; + shape.height = size; + }, + circle: function (x, y, w, h, shape) { + // Put circle in the center of square + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.r = Math.min(w, h) / 2; + }, + diamond: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + }, + pin: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + arrow: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + triangle: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + } +}; +var symbolBuildProxies = {}; +each$4(symbolCtors, function (Ctor, name) { + symbolBuildProxies[name] = new Ctor(); +}); +var SymbolClz = Path.extend({ + type: 'symbol', + shape: { + symbolType: '', + x: 0, + y: 0, + width: 0, + height: 0 + }, + calculateTextPosition: function (out, config, rect) { + var res = calculateTextPosition(out, config, rect); + var shape = this.shape; + if (shape && shape.symbolType === 'pin' && config.position === 'inside') { + res.y = rect.y + rect.height * 0.4; + } + return res; + }, + buildPath: function (ctx, shape, inBundle) { + var symbolType = shape.symbolType; + if (symbolType !== 'none') { + var proxySymbol = symbolBuildProxies[symbolType]; + if (!proxySymbol) { + // Default rect + symbolType = 'rect'; + proxySymbol = symbolBuildProxies[symbolType]; + } + symbolShapeMakers[symbolType](shape.x, shape.y, shape.width, shape.height, proxySymbol.shape); + proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle); + } + } +}); +// Provide setColor helper method to avoid determine if set the fill or stroke outside +function symbolPathSetColor(color, innerColor) { + if (this.type !== 'image') { + var symbolStyle = this.style; + if (this.__isEmptyBrush) { + symbolStyle.stroke = color; + symbolStyle.fill = innerColor || '#fff'; + // TODO Same width with lineStyle in LineView + symbolStyle.lineWidth = 2; + } else if (this.shape.symbolType === 'line') { + symbolStyle.stroke = color; + } else { + symbolStyle.fill = color; + } + this.markRedraw(); + } +} +/** + * Create a symbol element with given symbol configuration: shape, x, y, width, height, color + */ +function createSymbol(symbolType, x, y, w, h, color, +// whether to keep the ratio of w/h, +keepAspect) { + // TODO Support image object, DynamicImage. + var isEmpty = symbolType.indexOf('empty') === 0; + if (isEmpty) { + symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); + } + var symbolPath; + if (symbolType.indexOf('image://') === 0) { + symbolPath = makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else if (symbolType.indexOf('path://') === 0) { + symbolPath = makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else { + symbolPath = new SymbolClz({ + shape: { + symbolType: symbolType, + x: x, + y: y, + width: w, + height: h + } + }); + } + symbolPath.__isEmptyBrush = isEmpty; + // TODO Should deprecate setColor + symbolPath.setColor = symbolPathSetColor; + if (color) { + symbolPath.setColor(color); + } + return symbolPath; +} +function normalizeSymbolSize(symbolSize) { + if (!isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + return [symbolSize[0] || 0, symbolSize[1] || 0]; +} +function normalizeSymbolOffset(symbolOffset, symbolSize) { + if (symbolOffset == null) { + return; + } + if (!isArray(symbolOffset)) { + symbolOffset = [symbolOffset, symbolOffset]; + } + return [parsePercent(symbolOffset[0], symbolSize[0]) || 0, parsePercent(retrieve2(symbolOffset[1], symbolOffset[0]), symbolSize[1]) || 0]; +} + +function isSafeNum(num) { + return isFinite(num); +} +function createLinearGradient(ctx, obj, rect) { + var x = obj.x == null ? 0 : obj.x; + var x2 = obj.x2 == null ? 1 : obj.x2; + var y = obj.y == null ? 0 : obj.y; + var y2 = obj.y2 == null ? 0 : obj.y2; + if (!obj.global) { + x = x * rect.width + rect.x; + x2 = x2 * rect.width + rect.x; + y = y * rect.height + rect.y; + y2 = y2 * rect.height + rect.y; + } + x = isSafeNum(x) ? x : 0; + x2 = isSafeNum(x2) ? x2 : 1; + y = isSafeNum(y) ? y : 0; + y2 = isSafeNum(y2) ? y2 : 0; + var canvasGradient = ctx.createLinearGradient(x, y, x2, y2); + return canvasGradient; +} +function createRadialGradient(ctx, obj, rect) { + var width = rect.width; + var height = rect.height; + var min = Math.min(width, height); + var x = obj.x == null ? 0.5 : obj.x; + var y = obj.y == null ? 0.5 : obj.y; + var r = obj.r == null ? 0.5 : obj.r; + if (!obj.global) { + x = x * width + rect.x; + y = y * height + rect.y; + r = r * min; + } + x = isSafeNum(x) ? x : 0.5; + y = isSafeNum(y) ? y : 0.5; + r = r >= 0 && isSafeNum(r) ? r : 0.5; + var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r); + return canvasGradient; +} +function getCanvasGradient(ctx, obj, rect) { + var canvasGradient = obj.type === 'radial' + ? createRadialGradient(ctx, obj, rect) + : createLinearGradient(ctx, obj, rect); + var colorStops = obj.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color); + } + return canvasGradient; +} +function isClipPathChanged(clipPaths, prevClipPaths) { + if (clipPaths === prevClipPaths || (!clipPaths && !prevClipPaths)) { + return false; + } + if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) { + return true; + } + for (var i = 0; i < clipPaths.length; i++) { + if (clipPaths[i] !== prevClipPaths[i]) { + return true; + } + } + return false; +} +function parseInt10(val) { + return parseInt(val, 10); +} +function getSize(root, whIdx, opts) { + var wh = ['width', 'height'][whIdx]; + var cwh = ['clientWidth', 'clientHeight'][whIdx]; + var plt = ['paddingLeft', 'paddingTop'][whIdx]; + var prb = ['paddingRight', 'paddingBottom'][whIdx]; + if (opts[wh] != null && opts[wh] !== 'auto') { + return parseFloat(opts[wh]); + } + var stl = document.defaultView.getComputedStyle(root); + return ((root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh])) + - (parseInt10(stl[plt]) || 0) + - (parseInt10(stl[prb]) || 0)) | 0; +} + +function normalizeLineDash(lineType, lineWidth) { + if (!lineType || lineType === 'solid' || !(lineWidth > 0)) { + return null; + } + return lineType === 'dashed' + ? [4 * lineWidth, 2 * lineWidth] + : lineType === 'dotted' + ? [lineWidth] + : isNumber(lineType) + ? [lineType] : isArray(lineType) ? lineType : null; +} +function getLineDash(el) { + var style = el.style; + var lineDash = style.lineDash && style.lineWidth > 0 && normalizeLineDash(style.lineDash, style.lineWidth); + var lineDashOffset = style.lineDashOffset; + if (lineDash) { + var lineScale_1 = (style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1; + if (lineScale_1 && lineScale_1 !== 1) { + lineDash = map$1(lineDash, function (rawVal) { + return rawVal / lineScale_1; + }); + lineDashOffset /= lineScale_1; + } + } + return [lineDash, lineDashOffset]; +} + +var pathProxyForDraw = new PathProxy(true); +function styleHasStroke(style) { + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); +} +function isValidStrokeFillStyle(strokeOrFill) { + return typeof strokeOrFill === 'string' && strokeOrFill !== 'none'; +} +function styleHasFill(style) { + var fill = style.fill; + return fill != null && fill !== 'none'; +} +function doFillPath(ctx, style) { + if (style.fillOpacity != null && style.fillOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.fillOpacity * style.opacity; + ctx.fill(); + ctx.globalAlpha = originalGlobalAlpha; + } + else { + ctx.fill(); + } +} +function doStrokePath(ctx, style) { + if (style.strokeOpacity != null && style.strokeOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.strokeOpacity * style.opacity; + ctx.stroke(); + ctx.globalAlpha = originalGlobalAlpha; + } + else { + ctx.stroke(); + } +} +function createCanvasPattern(ctx, pattern, el) { + var image = createOrUpdateImage(pattern.image, pattern.__image, el); + if (isImageReady(image)) { + var canvasPattern = ctx.createPattern(image, pattern.repeat || 'repeat'); + if (typeof DOMMatrix === 'function' + && canvasPattern + && canvasPattern.setTransform) { + var matrix = new DOMMatrix(); + matrix.translateSelf((pattern.x || 0), (pattern.y || 0)); + matrix.rotateSelf(0, 0, (pattern.rotation || 0) * RADIAN_TO_DEGREE); + matrix.scaleSelf((pattern.scaleX || 1), (pattern.scaleY || 1)); + canvasPattern.setTransform(matrix); + } + return canvasPattern; + } +} +function brushPath(ctx, el, style, inBatch) { + var _a; + var hasStroke = styleHasStroke(style); + var hasFill = styleHasFill(style); + var strokePercent = style.strokePercent; + var strokePart = strokePercent < 1; + var firstDraw = !el.path; + if ((!el.silent || strokePart) && firstDraw) { + el.createPathProxy(); + } + var path = el.path || pathProxyForDraw; + var dirtyFlag = el.__dirty; + if (!inBatch) { + var fill = style.fill; + var stroke = style.stroke; + var hasFillGradient = hasFill && !!fill.colorStops; + var hasStrokeGradient = hasStroke && !!stroke.colorStops; + var hasFillPattern = hasFill && !!fill.image; + var hasStrokePattern = hasStroke && !!stroke.image; + var fillGradient = void 0; + var strokeGradient = void 0; + var fillPattern = void 0; + var strokePattern = void 0; + var rect = void 0; + if (hasFillGradient || hasStrokeGradient) { + rect = el.getBoundingRect(); + } + if (hasFillGradient) { + fillGradient = dirtyFlag + ? getCanvasGradient(ctx, fill, rect) + : el.__canvasFillGradient; + el.__canvasFillGradient = fillGradient; + } + if (hasStrokeGradient) { + strokeGradient = dirtyFlag + ? getCanvasGradient(ctx, stroke, rect) + : el.__canvasStrokeGradient; + el.__canvasStrokeGradient = strokeGradient; + } + if (hasFillPattern) { + fillPattern = (dirtyFlag || !el.__canvasFillPattern) + ? createCanvasPattern(ctx, fill, el) + : el.__canvasFillPattern; + el.__canvasFillPattern = fillPattern; + } + if (hasStrokePattern) { + strokePattern = (dirtyFlag || !el.__canvasStrokePattern) + ? createCanvasPattern(ctx, stroke, el) + : el.__canvasStrokePattern; + el.__canvasStrokePattern = fillPattern; + } + if (hasFillGradient) { + ctx.fillStyle = fillGradient; + } + else if (hasFillPattern) { + if (fillPattern) { + ctx.fillStyle = fillPattern; + } + else { + hasFill = false; + } + } + if (hasStrokeGradient) { + ctx.strokeStyle = strokeGradient; + } + else if (hasStrokePattern) { + if (strokePattern) { + ctx.strokeStyle = strokePattern; + } + else { + hasStroke = false; + } + } + } + var scale = el.getGlobalScale(); + path.setScale(scale[0], scale[1], el.segmentIgnoreThreshold); + var lineDash; + var lineDashOffset; + if (ctx.setLineDash && style.lineDash) { + _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + } + var needsRebuild = true; + if (firstDraw || (dirtyFlag & SHAPE_CHANGED_BIT)) { + path.setDPR(ctx.dpr); + if (strokePart) { + path.setContext(null); + } + else { + path.setContext(ctx); + needsRebuild = false; + } + path.reset(); + el.buildPath(path, el.shape, inBatch); + path.toStatic(); + el.pathUpdated(); + } + if (needsRebuild) { + path.rebuildPath(ctx, strokePart ? strokePercent : 1); + } + if (lineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + if (!inBatch) { + if (style.strokeFirst) { + if (hasStroke) { + doStrokePath(ctx, style); + } + if (hasFill) { + doFillPath(ctx, style); + } + } + else { + if (hasFill) { + doFillPath(ctx, style); + } + if (hasStroke) { + doStrokePath(ctx, style); + } + } + } + if (lineDash) { + ctx.setLineDash([]); + } +} +function brushImage(ctx, el, style) { + var image = el.__image = createOrUpdateImage(style.image, el.__image, el, el.onload); + if (!image || !isImageReady(image)) { + return; + } + var x = style.x || 0; + var y = style.y || 0; + var width = el.getWidth(); + var height = el.getHeight(); + var aspect = image.width / image.height; + if (width == null && height != null) { + width = height * aspect; + } + else if (height == null && width != null) { + height = width / aspect; + } + else if (width == null && height == null) { + width = image.width; + height = image.height; + } + if (style.sWidth && style.sHeight) { + var sx = style.sx || 0; + var sy = style.sy || 0; + ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height); + } + else if (style.sx && style.sy) { + var sx = style.sx; + var sy = style.sy; + var sWidth = width - sx; + var sHeight = height - sy; + ctx.drawImage(image, sx, sy, sWidth, sHeight, x, y, width, height); + } + else { + ctx.drawImage(image, x, y, width, height); + } +} +function brushText(ctx, el, style) { + var _a; + var text = style.text; + text != null && (text += ''); + if (text) { + ctx.font = style.font || DEFAULT_FONT; + ctx.textAlign = style.textAlign; + ctx.textBaseline = style.textBaseline; + var lineDash = void 0; + var lineDashOffset = void 0; + if (ctx.setLineDash && style.lineDash) { + _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + } + if (lineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + if (style.strokeFirst) { + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + } + else { + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + } + if (lineDash) { + ctx.setLineDash([]); + } + } +} +var SHADOW_NUMBER_PROPS = ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; +var STROKE_PROPS = [ + ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10] +]; +function bindCommonProps(ctx, style, prevStyle, forceSetAll, scope) { + var styleChanged = false; + if (!forceSetAll) { + prevStyle = prevStyle || {}; + if (style === prevStyle) { + return false; + } + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + flushPathDrawn(ctx, scope); + styleChanged = true; + var opacity = Math.max(Math.min(style.opacity, 1), 0); + ctx.globalAlpha = isNaN(opacity) ? DEFAULT_COMMON_STYLE.opacity : opacity; + } + if (forceSetAll || style.blend !== prevStyle.blend) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalCompositeOperation = style.blend || DEFAULT_COMMON_STYLE.blend; + } + for (var i = 0; i < SHADOW_NUMBER_PROPS.length; i++) { + var propName = SHADOW_NUMBER_PROPS[i]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = ctx.dpr * (style[propName] || 0); + } + } + if (forceSetAll || style.shadowColor !== prevStyle.shadowColor) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.shadowColor = style.shadowColor || DEFAULT_COMMON_STYLE.shadowColor; + } + return styleChanged; +} +function bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetAll, scope) { + var style = getStyle(el, scope.inHover); + var prevStyle = forceSetAll + ? null + : (prevEl && getStyle(prevEl, scope.inHover) || {}); + if (style === prevStyle) { + return false; + } + var styleChanged = bindCommonProps(ctx, style, prevStyle, forceSetAll, scope); + if (forceSetAll || style.fill !== prevStyle.fill) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + isValidStrokeFillStyle(style.fill) && (ctx.fillStyle = style.fill); + } + if (forceSetAll || style.stroke !== prevStyle.stroke) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + isValidStrokeFillStyle(style.stroke) && (ctx.strokeStyle = style.stroke); + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalAlpha = style.opacity == null ? 1 : style.opacity; + } + if (el.hasStroke()) { + var lineWidth = style.lineWidth; + var newLineWidth = lineWidth / ((style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1); + if (ctx.lineWidth !== newLineWidth) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.lineWidth = newLineWidth; + } + } + for (var i = 0; i < STROKE_PROPS.length; i++) { + var prop = STROKE_PROPS[i]; + var propName = prop[0]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = style[propName] || prop[1]; + } + } + return styleChanged; +} +function bindImageStyle(ctx, el, prevEl, forceSetAll, scope) { + return bindCommonProps(ctx, getStyle(el, scope.inHover), prevEl && getStyle(prevEl, scope.inHover), forceSetAll, scope); +} +function setContextTransform(ctx, el) { + var m = el.transform; + var dpr = ctx.dpr || 1; + if (m) { + ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]); + } + else { + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + } +} +function updateClipStatus(clipPaths, ctx, scope) { + var allClipped = false; + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + allClipped = allClipped || clipPath.isZeroArea(); + setContextTransform(ctx, clipPath); + ctx.beginPath(); + clipPath.buildPath(ctx, clipPath.shape); + ctx.clip(); + } + scope.allClipped = allClipped; +} +function isTransformChanged(m0, m1) { + if (m0 && m1) { + return m0[0] !== m1[0] + || m0[1] !== m1[1] + || m0[2] !== m1[2] + || m0[3] !== m1[3] + || m0[4] !== m1[4] + || m0[5] !== m1[5]; + } + else if (!m0 && !m1) { + return false; + } + return true; +} +var DRAW_TYPE_PATH = 1; +var DRAW_TYPE_IMAGE = 2; +var DRAW_TYPE_TEXT = 3; +var DRAW_TYPE_INCREMENTAL = 4; +function canPathBatch(style) { + var hasFill = styleHasFill(style); + var hasStroke = styleHasStroke(style); + return !(style.lineDash + || !(+hasFill ^ +hasStroke) + || (hasFill && typeof style.fill !== 'string') + || (hasStroke && typeof style.stroke !== 'string') + || style.strokePercent < 1 + || style.strokeOpacity < 1 + || style.fillOpacity < 1); +} +function flushPathDrawn(ctx, scope) { + scope.batchFill && ctx.fill(); + scope.batchStroke && ctx.stroke(); + scope.batchFill = ''; + scope.batchStroke = ''; +} +function getStyle(el, inHover) { + return inHover ? (el.__hoverStyle || el.style) : el.style; +} +function brushSingle(ctx, el) { + brush(ctx, el, { inHover: false, viewWidth: 0, viewHeight: 0 }, true); +} +function brush(ctx, el, scope, isLast) { + var m = el.transform; + if (!el.shouldBePainted(scope.viewWidth, scope.viewHeight, false, false)) { + el.__dirty &= -2; + el.__isRendered = false; + return; + } + var clipPaths = el.__clipPaths; + var prevElClipPaths = scope.prevElClipPaths; + var forceSetTransform = false; + var forceSetStyle = false; + if (!prevElClipPaths || isClipPathChanged(clipPaths, prevElClipPaths)) { + if (prevElClipPaths && prevElClipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.restore(); + forceSetStyle = forceSetTransform = true; + scope.prevElClipPaths = null; + scope.allClipped = false; + scope.prevEl = null; + } + if (clipPaths && clipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.save(); + updateClipStatus(clipPaths, ctx, scope); + forceSetTransform = true; + } + scope.prevElClipPaths = clipPaths; + } + if (scope.allClipped) { + el.__isRendered = false; + return; + } + el.beforeBrush && el.beforeBrush(); + el.innerBeforeBrush(); + var prevEl = scope.prevEl; + if (!prevEl) { + forceSetStyle = forceSetTransform = true; + } + var canBatchPath = el instanceof Path + && el.autoBatch + && canPathBatch(el.style); + if (forceSetTransform || isTransformChanged(m, prevEl.transform)) { + flushPathDrawn(ctx, scope); + setContextTransform(ctx, el); + } + else if (!canBatchPath) { + flushPathDrawn(ctx, scope); + } + var style = getStyle(el, scope.inHover); + if (el instanceof Path) { + if (scope.lastDrawType !== DRAW_TYPE_PATH) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_PATH; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + if (!canBatchPath || (!scope.batchFill && !scope.batchStroke)) { + ctx.beginPath(); + } + brushPath(ctx, el, style, canBatchPath); + if (canBatchPath) { + scope.batchFill = style.fill || ''; + scope.batchStroke = style.stroke || ''; + } + } + else { + if (el instanceof TSpan) { + if (scope.lastDrawType !== DRAW_TYPE_TEXT) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_TEXT; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + brushText(ctx, el, style); + } + else if (el instanceof ZRImage) { + if (scope.lastDrawType !== DRAW_TYPE_IMAGE) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_IMAGE; + } + bindImageStyle(ctx, el, prevEl, forceSetStyle, scope); + brushImage(ctx, el, style); + } + else if (el.getTemporalDisplayables) { + if (scope.lastDrawType !== DRAW_TYPE_INCREMENTAL) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_INCREMENTAL; + } + brushIncremental(ctx, el, scope); + } + } + if (canBatchPath && isLast) { + flushPathDrawn(ctx, scope); + } + el.innerAfterBrush(); + el.afterBrush && el.afterBrush(); + scope.prevEl = el; + el.__dirty = 0; + el.__isRendered = true; +} +function brushIncremental(ctx, el, scope) { + var displayables = el.getDisplayables(); + var temporalDisplayables = el.getTemporalDisplayables(); + ctx.save(); + var innerScope = { + prevElClipPaths: null, + prevEl: null, + allClipped: false, + viewWidth: scope.viewWidth, + viewHeight: scope.viewHeight, + inHover: scope.inHover + }; + var i; + var len; + for (i = el.getCursor(), len = displayables.length; i < len; i++) { + var displayable = displayables[i]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i === len - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + for (var i_1 = 0, len_1 = temporalDisplayables.length; i_1 < len_1; i_1++) { + var displayable = temporalDisplayables[i_1]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i_1 === len_1 - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + el.clearTemporalDisplayables(); + el.notClear = true; + ctx.restore(); +} + +var decalMap = new WeakMap(); +var decalCache = new LRU(100); +var decalKeys = ["symbol", "symbolSize", "symbolKeepAspect", "color", "backgroundColor", "dashArrayX", "dashArrayY", "maxTileWidth", "maxTileHeight"]; +function createOrUpdatePatternFromDecal(decalObject, api) { + if (decalObject === "none") { + return null; + } + var dpr = api.getDevicePixelRatio(); + var zr = api.getZr(); + var isSVG = zr.painter.type === "svg"; + if (decalObject.dirty) { + decalMap["delete"](decalObject); + } + var oldPattern = decalMap.get(decalObject); + if (oldPattern) { + return oldPattern; + } + var decalOpt = defaults(decalObject, { + symbol: "rect", + symbolSize: 1, + symbolKeepAspect: true, + color: "rgba(0, 0, 0, 0.2)", + backgroundColor: null, + dashArrayX: 5, + dashArrayY: 5, + rotation: 0, + maxTileWidth: 512, + maxTileHeight: 512 + }); + if (decalOpt.backgroundColor === "none") { + decalOpt.backgroundColor = null; + } + var pattern = { + repeat: "repeat" + }; + setPatternnSource(pattern); + pattern.rotation = decalOpt.rotation; + pattern.scaleX = pattern.scaleY = isSVG ? 1 : 1 / dpr; + decalMap.set(decalObject, pattern); + decalObject.dirty = false; + return pattern; + function setPatternnSource(pattern2) { + var keys = [dpr]; + var isValidKey = true; + for (var i = 0; i < decalKeys.length; ++i) { + var value = decalOpt[decalKeys[i]]; + if (value != null && !isArray(value) && !isString(value) && !isNumber(value) && typeof value !== "boolean") { + isValidKey = false; + break; + } + keys.push(value); + } + var cacheKey; + if (isValidKey) { + cacheKey = keys.join(",") + (isSVG ? "-svg" : ""); + var cache = decalCache.get(cacheKey); + if (cache) { + isSVG ? pattern2.svgElement = cache : pattern2.image = cache; + } + } + var dashArrayX = normalizeDashArrayX(decalOpt.dashArrayX); + var dashArrayY = normalizeDashArrayY(decalOpt.dashArrayY); + var symbolArray = normalizeSymbolArray(decalOpt.symbol); + var lineBlockLengthsX = getLineBlockLengthX(dashArrayX); + var lineBlockLengthY = getLineBlockLengthY(dashArrayY); + var canvas = !isSVG && platformApi.createCanvas(); + var svgRoot = isSVG && { + tag: "g", + attrs: {}, + key: "dcl", + children: [] + }; + var pSize = getPatternSize(); + var ctx; + if (canvas) { + canvas.width = pSize.width * dpr; + canvas.height = pSize.height * dpr; + ctx = canvas.getContext("2d"); + } + brushDecal(); + if (isValidKey) { + decalCache.put(cacheKey, canvas || svgRoot); + } + pattern2.image = canvas; + pattern2.svgElement = svgRoot; + pattern2.svgWidth = pSize.width; + pattern2.svgHeight = pSize.height; + function getPatternSize() { + var width = 1; + for (var i2 = 0, xlen = lineBlockLengthsX.length; i2 < xlen; ++i2) { + width = getLeastCommonMultiple(width, lineBlockLengthsX[i2]); + } + var symbolRepeats = 1; + for (var i2 = 0, xlen = symbolArray.length; i2 < xlen; ++i2) { + symbolRepeats = getLeastCommonMultiple(symbolRepeats, symbolArray[i2].length); + } + width *= symbolRepeats; + var height = lineBlockLengthY * lineBlockLengthsX.length * symbolArray.length; + return { + width: Math.max(1, Math.min(width, decalOpt.maxTileWidth)), + height: Math.max(1, Math.min(height, decalOpt.maxTileHeight)) + }; + } + function brushDecal() { + if (ctx) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + if (decalOpt.backgroundColor) { + ctx.fillStyle = decalOpt.backgroundColor; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + } + var ySum = 0; + for (var i2 = 0; i2 < dashArrayY.length; ++i2) { + ySum += dashArrayY[i2]; + } + if (ySum <= 0) { + return; + } + var y = -lineBlockLengthY; + var yId = 0; + var yIdTotal = 0; + var xId0 = 0; + while (y < pSize.height) { + if (yId % 2 === 0) { + var symbolYId = yIdTotal / 2 % symbolArray.length; + var x = 0; + var xId1 = 0; + var xId1Total = 0; + while (x < pSize.width * 2) { + var xSum = 0; + for (var i2 = 0; i2 < dashArrayX[xId0].length; ++i2) { + xSum += dashArrayX[xId0][i2]; + } + if (xSum <= 0) { + break; + } + if (xId1 % 2 === 0) { + var size = (1 - decalOpt.symbolSize) * 0.5; + var left = x + dashArrayX[xId0][xId1] * size; + var top_1 = y + dashArrayY[yId] * size; + var width = dashArrayX[xId0][xId1] * decalOpt.symbolSize; + var height = dashArrayY[yId] * decalOpt.symbolSize; + var symbolXId = xId1Total / 2 % symbolArray[symbolYId].length; + brushSymbol(left, top_1, width, height, symbolArray[symbolYId][symbolXId]); + } + x += dashArrayX[xId0][xId1]; + ++xId1Total; + ++xId1; + if (xId1 === dashArrayX[xId0].length) { + xId1 = 0; + } + } + ++xId0; + if (xId0 === dashArrayX.length) { + xId0 = 0; + } + } + y += dashArrayY[yId]; + ++yIdTotal; + ++yId; + if (yId === dashArrayY.length) { + yId = 0; + } + } + function brushSymbol(x2, y2, width2, height2, symbolType) { + var scale = isSVG ? 1 : dpr; + var symbol = createSymbol(symbolType, x2 * scale, y2 * scale, width2 * scale, height2 * scale, decalOpt.color, decalOpt.symbolKeepAspect); + if (isSVG) { + var symbolVNode = zr.painter.renderOneToVNode(symbol); + if (symbolVNode) { + svgRoot.children.push(symbolVNode); + } + } else { + brushSingle(ctx, symbol); + } + } + } + } +} +function normalizeSymbolArray(symbol) { + if (!symbol || symbol.length === 0) { + return [["rect"]]; + } + if (isString(symbol)) { + return [[symbol]]; + } + var isAllString = true; + for (var i = 0; i < symbol.length; ++i) { + if (!isString(symbol[i])) { + isAllString = false; + break; + } + } + if (isAllString) { + return normalizeSymbolArray([symbol]); + } + var result = []; + for (var i = 0; i < symbol.length; ++i) { + if (isString(symbol[i])) { + result.push([symbol[i]]); + } else { + result.push(symbol[i]); + } + } + return result; +} +function normalizeDashArrayX(dash) { + if (!dash || dash.length === 0) { + return [[0, 0]]; + } + if (isNumber(dash)) { + var dashValue = Math.ceil(dash); + return [[dashValue, dashValue]]; + } + var isAllNumber = true; + for (var i = 0; i < dash.length; ++i) { + if (!isNumber(dash[i])) { + isAllNumber = false; + break; + } + } + if (isAllNumber) { + return normalizeDashArrayX([dash]); + } + var result = []; + for (var i = 0; i < dash.length; ++i) { + if (isNumber(dash[i])) { + var dashValue = Math.ceil(dash[i]); + result.push([dashValue, dashValue]); + } else { + var dashValue = map$1(dash[i], function(n) { + return Math.ceil(n); + }); + if (dashValue.length % 2 === 1) { + result.push(dashValue.concat(dashValue)); + } else { + result.push(dashValue); + } + } + } + return result; +} +function normalizeDashArrayY(dash) { + if (!dash || typeof dash === "object" && dash.length === 0) { + return [0, 0]; + } + if (isNumber(dash)) { + var dashValue_1 = Math.ceil(dash); + return [dashValue_1, dashValue_1]; + } + var dashValue = map$1(dash, function(n) { + return Math.ceil(n); + }); + return dash.length % 2 ? dashValue.concat(dashValue) : dashValue; +} +function getLineBlockLengthX(dash) { + return map$1(dash, function(line) { + return getLineBlockLengthY(line); + }); +} +function getLineBlockLengthY(dash) { + var blockLength = 0; + for (var i = 0; i < dash.length; ++i) { + blockLength += dash[i]; + } + if (dash.length % 2 === 1) { + return blockLength * 2; + } + return blockLength; +} + +function decalVisual(ecModel, api) { + ecModel.eachRawSeries(function (seriesModel) { + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + var data = seriesModel.getData(); + if (data.hasItemVisual()) { + data.each(function (idx) { + var decal = data.getItemVisual(idx, 'decal'); + if (decal) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + itemStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); + } + var decal = data.getVisual('decal'); + if (decal) { + var style = data.getVisual('style'); + style.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); +} + +var lifecycle = new Eventful(); + +var implsStore = {}; +function registerImpl(name, impl) { + implsStore[name] = impl; +} +function getImpl(name) { + return implsStore[name]; +} + +var TEST_FRAME_REMAIN_TIME = 1; +var PRIORITY_PROCESSOR_SERIES_FILTER = 800; +var PRIORITY_PROCESSOR_DATASTACK = 900; +var PRIORITY_PROCESSOR_FILTER = 1e3; +var PRIORITY_PROCESSOR_DEFAULT = 2e3; +var PRIORITY_PROCESSOR_STATISTIC = 5e3; +var PRIORITY_VISUAL_LAYOUT = 1e3; +var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100; +var PRIORITY_VISUAL_GLOBAL = 2e3; +var PRIORITY_VISUAL_CHART = 3e3; +var PRIORITY_VISUAL_COMPONENT = 4e3; +var PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500; +var PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600; +var PRIORITY_VISUAL_BRUSH = 5e3; +var PRIORITY_VISUAL_ARIA = 6e3; +var PRIORITY_VISUAL_DECAL = 7e3; +var PRIORITY = { + PROCESSOR: { + FILTER: PRIORITY_PROCESSOR_FILTER, + SERIES_FILTER: PRIORITY_PROCESSOR_SERIES_FILTER, + STATISTIC: PRIORITY_PROCESSOR_STATISTIC + }, + VISUAL: { + LAYOUT: PRIORITY_VISUAL_LAYOUT, + PROGRESSIVE_LAYOUT: PRIORITY_VISUAL_PROGRESSIVE_LAYOUT, + GLOBAL: PRIORITY_VISUAL_GLOBAL, + CHART: PRIORITY_VISUAL_CHART, + POST_CHART_LAYOUT: PRIORITY_VISUAL_POST_CHART_LAYOUT, + COMPONENT: PRIORITY_VISUAL_COMPONENT, + BRUSH: PRIORITY_VISUAL_BRUSH, + CHART_ITEM: PRIORITY_VISUAL_CHART_DATA_CUSTOM, + ARIA: PRIORITY_VISUAL_ARIA, + DECAL: PRIORITY_VISUAL_DECAL + } +}; +var IN_MAIN_PROCESS_KEY = "__flagInMainProcess"; +var PENDING_UPDATE = "__pendingUpdate"; +var STATUS_NEEDS_UPDATE_KEY = "__needsUpdateStatus"; +var ACTION_REG = /^[a-zA-Z0-9_]+$/; +var CONNECT_STATUS_KEY = "__connectUpdateStatus"; +var CONNECT_STATUS_PENDING = 0; +var CONNECT_STATUS_UPDATING = 1; +var CONNECT_STATUS_UPDATED = 2; +function createRegisterEventWithLowercaseECharts(method) { + return function() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (this.isDisposed()) { + disposedWarning(this.id); + return; + } + return toLowercaseNameAndCallEventful(this, method, args); + }; +} +function createRegisterEventWithLowercaseMessageCenter(method) { + return function() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return toLowercaseNameAndCallEventful(this, method, args); + }; +} +function toLowercaseNameAndCallEventful(host, method, args) { + args[0] = args[0] && args[0].toLowerCase(); + return Eventful.prototype[method].apply(host, args); +} +var MessageCenter = ( + /** @class */ + function(_super) { + __extends(MessageCenter2, _super); + function MessageCenter2() { + return _super !== null && _super.apply(this, arguments) || this; + } + return MessageCenter2; + }(Eventful) +); +var messageCenterProto = MessageCenter.prototype; +messageCenterProto.on = createRegisterEventWithLowercaseMessageCenter("on"); +messageCenterProto.off = createRegisterEventWithLowercaseMessageCenter("off"); +var prepare; +var prepareView; +var updateDirectly; +var updateMethods; +var doConvertPixel; +var updateStreamModes; +var doDispatchAction; +var flushPendingActions; +var triggerUpdatedEvent; +var bindRenderedEvent; +var bindMouseEvent; +var render; +var renderComponents; +var renderSeries; +var createExtensionAPI; +var enableConnect; +var markStatusToUpdate; +var applyChangedStates; +var ECharts = ( + /** @class */ + function(_super) { + __extends(ECharts2, _super); + function ECharts2(dom, theme, opts) { + var _this = _super.call(this, new ECEventProcessor()) || this; + _this._chartsViews = []; + _this._chartsMap = {}; + _this._componentsViews = []; + _this._componentsMap = {}; + _this._pendingActions = []; + opts = opts || {}; + if (isString(theme)) { + theme = themeStorage[theme]; + } + _this._dom = dom; + var defaultRenderer = "canvas"; + var defaultCoarsePointer = "auto"; + var defaultUseDirtyRect = false; + if (opts.ssr) ; + var zr = _this._zr = init$1(dom, { + renderer: opts.renderer || defaultRenderer, + devicePixelRatio: opts.devicePixelRatio, + width: opts.width, + height: opts.height, + ssr: opts.ssr, + useDirtyRect: retrieve2(opts.useDirtyRect, defaultUseDirtyRect), + useCoarsePointer: retrieve2(opts.useCoarsePointer, defaultCoarsePointer), + pointerSize: opts.pointerSize + }); + _this._ssr = opts.ssr; + _this._throttledZrFlush = throttle(bind$1(zr.flush, zr), 17); + theme = clone$2(theme); + theme && globalBackwardCompat(theme, true); + _this._theme = theme; + _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG); + _this._coordSysMgr = new CoordinateSystemManager(); + var api = _this._api = createExtensionAPI(_this); + function prioritySortFunc(a, b) { + return a.__prio - b.__prio; + } + sort(visualFuncs, prioritySortFunc); + sort(dataProcessorFuncs, prioritySortFunc); + _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs); + _this._messageCenter = new MessageCenter(); + _this._initEvents(); + _this.resize = bind$1(_this.resize, _this); + zr.animation.on("frame", _this._onframe, _this); + bindRenderedEvent(zr, _this); + bindMouseEvent(zr, _this); + setAsPrimitive(_this); + return _this; + } + ECharts2.prototype._onframe = function() { + if (this._disposed) { + return; + } + applyChangedStates(this); + var scheduler = this._scheduler; + if (this[PENDING_UPDATE]) { + var silent = this[PENDING_UPDATE].silent; + this[IN_MAIN_PROCESS_KEY] = true; + try { + prepare(this); + updateMethods.update.call(this, null, this[PENDING_UPDATE].updateParams); + } catch (e) { + this[IN_MAIN_PROCESS_KEY] = false; + this[PENDING_UPDATE] = null; + throw e; + } + this._zr.flush(); + this[IN_MAIN_PROCESS_KEY] = false; + this[PENDING_UPDATE] = null; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + } else if (scheduler.unfinished) { + var remainTime = TEST_FRAME_REMAIN_TIME; + var ecModel = this._model; + var api = this._api; + scheduler.unfinished = false; + do { + var startTime = +/* @__PURE__ */ new Date(); + scheduler.performSeriesTasks(ecModel); + scheduler.performDataProcessorTasks(ecModel); + updateStreamModes(this, ecModel); + scheduler.performVisualTasks(ecModel); + renderSeries(this, this._model, api, "remain", {}); + remainTime -= +/* @__PURE__ */ new Date() - startTime; + } while (remainTime > 0 && scheduler.unfinished); + if (!scheduler.unfinished) { + this._zr.flush(); + } + } + }; + ECharts2.prototype.getDom = function() { + return this._dom; + }; + ECharts2.prototype.getId = function() { + return this.id; + }; + ECharts2.prototype.getZr = function() { + return this._zr; + }; + ECharts2.prototype.isSSR = function() { + return this._ssr; + }; + ECharts2.prototype.setOption = function(option, notMerge, lazyUpdate) { + if (this[IN_MAIN_PROCESS_KEY]) { + return; + } + if (this._disposed) { + disposedWarning(this.id); + return; + } + var silent; + var replaceMerge; + var transitionOpt; + if (isObject$2(notMerge)) { + lazyUpdate = notMerge.lazyUpdate; + silent = notMerge.silent; + replaceMerge = notMerge.replaceMerge; + transitionOpt = notMerge.transition; + notMerge = notMerge.notMerge; + } + this[IN_MAIN_PROCESS_KEY] = true; + if (!this._model || notMerge) { + var optionManager = new OptionManager(this._api); + var theme = this._theme; + var ecModel = this._model = new GlobalModel(); + ecModel.scheduler = this._scheduler; + ecModel.ssr = this._ssr; + ecModel.init(null, null, null, theme, this._locale, optionManager); + } + this._model.setOption(option, { + replaceMerge + }, optionPreprocessorFuncs); + var updateParams = { + seriesTransition: transitionOpt, + optionChanged: true + }; + if (lazyUpdate) { + this[PENDING_UPDATE] = { + silent, + updateParams + }; + this[IN_MAIN_PROCESS_KEY] = false; + this.getZr().wakeUp(); + } else { + try { + prepare(this); + updateMethods.update.call(this, null, updateParams); + } catch (e) { + this[PENDING_UPDATE] = null; + this[IN_MAIN_PROCESS_KEY] = false; + throw e; + } + if (!this._ssr) { + this._zr.flush(); + } + this[PENDING_UPDATE] = null; + this[IN_MAIN_PROCESS_KEY] = false; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + } + }; + ECharts2.prototype.setTheme = function() { + }; + ECharts2.prototype.getModel = function() { + return this._model; + }; + ECharts2.prototype.getOption = function() { + return this._model && this._model.getOption(); + }; + ECharts2.prototype.getWidth = function() { + return this._zr.getWidth(); + }; + ECharts2.prototype.getHeight = function() { + return this._zr.getHeight(); + }; + ECharts2.prototype.getDevicePixelRatio = function() { + return this._zr.painter.dpr || env.hasGlobalWindow && window.devicePixelRatio || 1; + }; + ECharts2.prototype.getRenderedCanvas = function(opts) { + return this.renderToCanvas(opts); + }; + ECharts2.prototype.renderToCanvas = function(opts) { + opts = opts || {}; + var painter = this._zr.painter; + return painter.getRenderedCanvas({ + backgroundColor: opts.backgroundColor || this._model.get("backgroundColor"), + pixelRatio: opts.pixelRatio || this.getDevicePixelRatio() + }); + }; + ECharts2.prototype.renderToSVGString = function(opts) { + opts = opts || {}; + var painter = this._zr.painter; + return painter.renderToString({ + useViewBox: opts.useViewBox + }); + }; + ECharts2.prototype.getSvgDataURL = function() { + if (!env.svgSupported) { + return; + } + var zr = this._zr; + var list = zr.storage.getDisplayList(); + each$4(list, function(el) { + el.stopAnimation(null, true); + }); + return zr.painter.toDataURL(); + }; + ECharts2.prototype.getDataURL = function(opts) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + opts = opts || {}; + var excludeComponents = opts.excludeComponents; + var ecModel = this._model; + var excludesComponentViews = []; + var self = this; + each$4(excludeComponents, function(componentType) { + ecModel.eachComponent({ + mainType: componentType + }, function(component) { + var view = self._componentsMap[component.__viewId]; + if (!view.group.ignore) { + excludesComponentViews.push(view); + view.group.ignore = true; + } + }); + }); + var url = this._zr.painter.getType() === "svg" ? this.getSvgDataURL() : this.renderToCanvas(opts).toDataURL("image/" + (opts && opts.type || "png")); + each$4(excludesComponentViews, function(view) { + view.group.ignore = false; + }); + return url; + }; + ECharts2.prototype.getConnectedDataURL = function(opts) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + var isSvg = opts.type === "svg"; + var groupId = this.group; + var mathMin = Math.min; + var mathMax = Math.max; + var MAX_NUMBER = Infinity; + if (connectedGroups[groupId]) { + var left_1 = MAX_NUMBER; + var top_1 = MAX_NUMBER; + var right_1 = -MAX_NUMBER; + var bottom_1 = -MAX_NUMBER; + var canvasList_1 = []; + var dpr_1 = opts && opts.pixelRatio || this.getDevicePixelRatio(); + each$4(instances, function(chart, id) { + if (chart.group === groupId) { + var canvas = isSvg ? chart.getZr().painter.getSvgDom().innerHTML : chart.renderToCanvas(clone$2(opts)); + var boundingRect = chart.getDom().getBoundingClientRect(); + left_1 = mathMin(boundingRect.left, left_1); + top_1 = mathMin(boundingRect.top, top_1); + right_1 = mathMax(boundingRect.right, right_1); + bottom_1 = mathMax(boundingRect.bottom, bottom_1); + canvasList_1.push({ + dom: canvas, + left: boundingRect.left, + top: boundingRect.top + }); + } + }); + left_1 *= dpr_1; + top_1 *= dpr_1; + right_1 *= dpr_1; + bottom_1 *= dpr_1; + var width = right_1 - left_1; + var height = bottom_1 - top_1; + var targetCanvas = platformApi.createCanvas(); + var zr_1 = init$1(targetCanvas, { + renderer: isSvg ? "svg" : "canvas" + }); + zr_1.resize({ + width, + height + }); + if (isSvg) { + var content_1 = ""; + each$4(canvasList_1, function(item) { + var x = item.left - left_1; + var y = item.top - top_1; + content_1 += '' + item.dom + ""; + }); + zr_1.painter.getSvgRoot().innerHTML = content_1; + if (opts.connectedBackgroundColor) { + zr_1.painter.setBackgroundColor(opts.connectedBackgroundColor); + } + zr_1.refreshImmediately(); + return zr_1.painter.toDataURL(); + } else { + if (opts.connectedBackgroundColor) { + zr_1.add(new Rect({ + shape: { + x: 0, + y: 0, + width, + height + }, + style: { + fill: opts.connectedBackgroundColor + } + })); + } + each$4(canvasList_1, function(item) { + var img = new ZRImage({ + style: { + x: item.left * dpr_1 - left_1, + y: item.top * dpr_1 - top_1, + image: item.dom + } + }); + zr_1.add(img); + }); + zr_1.refreshImmediately(); + return targetCanvas.toDataURL("image/" + (opts && opts.type || "png")); + } + } else { + return this.getDataURL(opts); + } + }; + ECharts2.prototype.convertToPixel = function(finder, value) { + return doConvertPixel(this, "convertToPixel", finder, value); + }; + ECharts2.prototype.convertFromPixel = function(finder, value) { + return doConvertPixel(this, "convertFromPixel", finder, value); + }; + ECharts2.prototype.containPixel = function(finder, value) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + var ecModel = this._model; + var result; + var findResult = parseFinder(ecModel, finder); + each$4(findResult, function(models, key) { + key.indexOf("Models") >= 0 && each$4(models, function(model) { + var coordSys = model.coordinateSystem; + if (coordSys && coordSys.containPoint) { + result = result || !!coordSys.containPoint(value); + } else if (key === "seriesModels") { + var view = this._chartsMap[model.__viewId]; + if (view && view.containPoint) { + result = result || view.containPoint(value, model); + } + } else ; + }, this); + }, this); + return !!result; + }; + ECharts2.prototype.getVisual = function(finder, visualType) { + var ecModel = this._model; + var parsedFinder = parseFinder(ecModel, finder, { + defaultMainType: "series" + }); + var seriesModel = parsedFinder.seriesModel; + var data = seriesModel.getData(); + var dataIndexInside = parsedFinder.hasOwnProperty("dataIndexInside") ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty("dataIndex") ? data.indexOfRawIndex(parsedFinder.dataIndex) : null; + return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType); + }; + ECharts2.prototype.getViewOfComponentModel = function(componentModel) { + return this._componentsMap[componentModel.__viewId]; + }; + ECharts2.prototype.getViewOfSeriesModel = function(seriesModel) { + return this._chartsMap[seriesModel.__viewId]; + }; + ECharts2.prototype._initEvents = function() { + var _this = this; + each$4(MOUSE_EVENT_NAMES, function(eveName) { + var handler = function(e) { + var ecModel = _this.getModel(); + var el = e.target; + var params; + var isGlobalOut = eveName === "globalout"; + if (isGlobalOut) { + params = {}; + } else { + el && findEventDispatcher(el, function(parent) { + var ecData = getECData(parent); + if (ecData && ecData.dataIndex != null) { + var dataModel = ecData.dataModel || ecModel.getSeriesByIndex(ecData.seriesIndex); + params = dataModel && dataModel.getDataParams(ecData.dataIndex, ecData.dataType, el) || {}; + return true; + } else if (ecData.eventData) { + params = extend({}, ecData.eventData); + return true; + } + }, true); + } + if (params) { + var componentType = params.componentType; + var componentIndex = params.componentIndex; + if (componentType === "markLine" || componentType === "markPoint" || componentType === "markArea") { + componentType = "series"; + componentIndex = params.seriesIndex; + } + var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex); + var view = model && _this[model.mainType === "series" ? "_chartsMap" : "_componentsMap"][model.__viewId]; + params.event = e; + params.type = eveName; + _this._$eventProcessor.eventInfo = { + targetEl: el, + packedEvent: params, + model, + view + }; + _this.trigger(eveName, params); + } + }; + handler.zrEventfulCallAtLast = true; + _this._zr.on(eveName, handler, _this); + }); + each$4(eventActionMap, function(actionType, eventType) { + _this._messageCenter.on(eventType, function(event) { + this.trigger(eventType, event); + }, _this); + }); + each$4(["selectchanged"], function(eventType) { + _this._messageCenter.on(eventType, function(event) { + this.trigger(eventType, event); + }, _this); + }); + handleLegacySelectEvents(this._messageCenter, this, this._api); + }; + ECharts2.prototype.isDisposed = function() { + return this._disposed; + }; + ECharts2.prototype.clear = function() { + if (this._disposed) { + disposedWarning(this.id); + return; + } + this.setOption({ + series: [] + }, true); + }; + ECharts2.prototype.dispose = function() { + if (this._disposed) { + disposedWarning(this.id); + return; + } + this._disposed = true; + var dom = this.getDom(); + if (dom) { + setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, ""); + } + var chart = this; + var api = chart._api; + var ecModel = chart._model; + each$4(chart._componentsViews, function(component) { + component.dispose(ecModel, api); + }); + each$4(chart._chartsViews, function(chart2) { + chart2.dispose(ecModel, api); + }); + chart._zr.dispose(); + chart._dom = chart._model = chart._chartsMap = chart._componentsMap = chart._chartsViews = chart._componentsViews = chart._scheduler = chart._api = chart._zr = chart._throttledZrFlush = chart._theme = chart._coordSysMgr = chart._messageCenter = null; + delete instances[chart.id]; + }; + ECharts2.prototype.resize = function(opts) { + if (this[IN_MAIN_PROCESS_KEY]) { + return; + } + if (this._disposed) { + disposedWarning(this.id); + return; + } + this._zr.resize(opts); + var ecModel = this._model; + this._loadingFX && this._loadingFX.resize(); + if (!ecModel) { + return; + } + var needPrepare = ecModel.resetOption("media"); + var silent = opts && opts.silent; + if (this[PENDING_UPDATE]) { + if (silent == null) { + silent = this[PENDING_UPDATE].silent; + } + needPrepare = true; + this[PENDING_UPDATE] = null; + } + this[IN_MAIN_PROCESS_KEY] = true; + try { + needPrepare && prepare(this); + updateMethods.update.call(this, { + type: "resize", + animation: extend({ + // Disable animation + duration: 0 + }, opts && opts.animation) + }); + } catch (e) { + this[IN_MAIN_PROCESS_KEY] = false; + throw e; + } + this[IN_MAIN_PROCESS_KEY] = false; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + }; + ECharts2.prototype.showLoading = function(name, cfg) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + if (isObject$2(name)) { + cfg = name; + name = ""; + } + name = name || "default"; + this.hideLoading(); + if (!loadingEffects[name]) { + return; + } + var el = loadingEffects[name](this._api, cfg); + var zr = this._zr; + this._loadingFX = el; + zr.add(el); + }; + ECharts2.prototype.hideLoading = function() { + if (this._disposed) { + disposedWarning(this.id); + return; + } + this._loadingFX && this._zr.remove(this._loadingFX); + this._loadingFX = null; + }; + ECharts2.prototype.makeActionFromEvent = function(eventObj) { + var payload = extend({}, eventObj); + payload.type = eventActionMap[eventObj.type]; + return payload; + }; + ECharts2.prototype.dispatchAction = function(payload, opt) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + if (!isObject$2(opt)) { + opt = { + silent: !!opt + }; + } + if (!actions[payload.type]) { + return; + } + if (!this._model) { + return; + } + if (this[IN_MAIN_PROCESS_KEY]) { + this._pendingActions.push(payload); + return; + } + var silent = opt.silent; + doDispatchAction.call(this, payload, silent); + var flush = opt.flush; + if (flush) { + this._zr.flush(); + } else if (flush !== false && env.browser.weChat) { + this._throttledZrFlush(); + } + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + }; + ECharts2.prototype.updateLabelLayout = function() { + lifecycle.trigger("series:layoutlabels", this._model, this._api, { + // Not adding series labels. + // TODO + updatedSeries: [] + }); + }; + ECharts2.prototype.appendData = function(params) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + var seriesIndex = params.seriesIndex; + var ecModel = this.getModel(); + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + seriesModel.appendData(params); + this._scheduler.unfinished = true; + this.getZr().wakeUp(); + }; + ECharts2.internalField = function() { + prepare = function(ecIns) { + var scheduler = ecIns._scheduler; + scheduler.restorePipelines(ecIns._model); + scheduler.prepareStageTasks(); + prepareView(ecIns, true); + prepareView(ecIns, false); + scheduler.plan(); + }; + prepareView = function(ecIns, isComponent) { + var ecModel = ecIns._model; + var scheduler = ecIns._scheduler; + var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews; + var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap; + var zr = ecIns._zr; + var api = ecIns._api; + for (var i = 0; i < viewList.length; i++) { + viewList[i].__alive = false; + } + isComponent ? ecModel.eachComponent(function(componentType, model) { + componentType !== "series" && doPrepare(model); + }) : ecModel.eachSeries(doPrepare); + function doPrepare(model) { + var requireNewView = model.__requireNewView; + model.__requireNewView = false; + var viewId = "_ec_" + model.id + "_" + model.type; + var view2 = !requireNewView && viewMap[viewId]; + if (!view2) { + var classType = parseClassType(model.type); + var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) : ( + // FIXME:TS + // (ChartView as ChartViewConstructor).getClass('series', classType.sub) + // For backward compat, still support a chart type declared as only subType + // like "liquidfill", but recommend "series.liquidfill" + // But need a base class to make a type series. + ChartView.getClass(classType.sub) + ); + view2 = new Clazz(); + view2.init(ecModel, api); + viewMap[viewId] = view2; + viewList.push(view2); + zr.add(view2.group); + } + model.__viewId = view2.__id = viewId; + view2.__alive = true; + view2.__model = model; + view2.group.__ecComponentInfo = { + mainType: model.mainType, + index: model.componentIndex + }; + !isComponent && scheduler.prepareView(view2, model, ecModel, api); + } + for (var i = 0; i < viewList.length; ) { + var view = viewList[i]; + if (!view.__alive) { + !isComponent && view.renderTask.dispose(); + zr.remove(view.group); + view.dispose(ecModel, api); + viewList.splice(i, 1); + if (viewMap[view.__id] === view) { + delete viewMap[view.__id]; + } + view.__id = view.group.__ecComponentInfo = null; + } else { + i++; + } + } + }; + updateDirectly = function(ecIns, method, payload, mainType, subType) { + var ecModel = ecIns._model; + ecModel.setUpdatePayload(payload); + if (!mainType) { + each$4([].concat(ecIns._componentsViews).concat(ecIns._chartsViews), callView); + return; + } + var query = {}; + query[mainType + "Id"] = payload[mainType + "Id"]; + query[mainType + "Index"] = payload[mainType + "Index"]; + query[mainType + "Name"] = payload[mainType + "Name"]; + var condition = { + mainType, + query + }; + subType && (condition.subType = subType); + var excludeSeriesId = payload.excludeSeriesId; + var excludeSeriesIdMap; + if (excludeSeriesId != null) { + excludeSeriesIdMap = createHashMap(); + each$4(normalizeToArray(excludeSeriesId), function(id) { + var modelId = convertOptionIdName(id, null); + if (modelId != null) { + excludeSeriesIdMap.set(modelId, true); + } + }); + } + ecModel && ecModel.eachComponent(condition, function(model) { + var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null; + if (isExcluded) { + return; + } + if (isHighDownPayload(payload)) { + if (model instanceof SeriesModel) { + if (payload.type === HIGHLIGHT_ACTION_TYPE && !payload.notBlur && !model.get(["emphasis", "disabled"])) { + blurSeriesFromHighlightPayload(model, payload, ecIns._api); + } + } else { + var _a = findComponentHighDownDispatchers(model.mainType, model.componentIndex, payload.name, ecIns._api), focusSelf = _a.focusSelf, dispatchers = _a.dispatchers; + if (payload.type === HIGHLIGHT_ACTION_TYPE && focusSelf && !payload.notBlur) { + blurComponent(model.mainType, model.componentIndex, ecIns._api); + } + if (dispatchers) { + each$4(dispatchers, function(dispatcher) { + payload.type === HIGHLIGHT_ACTION_TYPE ? enterEmphasis(dispatcher) : leaveEmphasis(dispatcher); + }); + } + } + } else if (isSelectChangePayload(payload)) { + if (model instanceof SeriesModel) { + toggleSelectionFromPayload(model, payload, ecIns._api); + updateSeriesElementSelection(model); + markStatusToUpdate(ecIns); + } + } + }, ecIns); + ecModel && ecModel.eachComponent(condition, function(model) { + var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null; + if (isExcluded) { + return; + } + callView(ecIns[mainType === "series" ? "_chartsMap" : "_componentsMap"][model.__viewId]); + }, ecIns); + function callView(view) { + view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload); + } + }; + updateMethods = { + prepareAndUpdate: function(payload) { + prepare(this); + updateMethods.update.call(this, payload, { + // Needs to mark option changed if newOption is given. + // It's from MagicType. + // TODO If use a separate flag optionChanged in payload? + optionChanged: payload.newOption != null + }); + }, + update: function(payload, updateParams) { + var ecModel = this._model; + var api = this._api; + var zr = this._zr; + var coordSysMgr = this._coordSysMgr; + var scheduler = this._scheduler; + if (!ecModel) { + return; + } + ecModel.setUpdatePayload(payload); + scheduler.restoreData(ecModel, payload); + scheduler.performSeriesTasks(ecModel); + coordSysMgr.create(ecModel, api); + scheduler.performDataProcessorTasks(ecModel, payload); + updateStreamModes(this, ecModel); + coordSysMgr.update(ecModel, api); + clearColorPalette(ecModel); + scheduler.performVisualTasks(ecModel, payload); + render(this, ecModel, api, payload, updateParams); + var backgroundColor = ecModel.get("backgroundColor") || "transparent"; + var darkMode = ecModel.get("darkMode"); + zr.setBackgroundColor(backgroundColor); + if (darkMode != null && darkMode !== "auto") { + zr.setDarkMode(darkMode); + } + lifecycle.trigger("afterupdate", ecModel, api); + }, + updateTransform: function(payload) { + var _this = this; + var ecModel = this._model; + var api = this._api; + if (!ecModel) { + return; + } + ecModel.setUpdatePayload(payload); + var componentDirtyList = []; + ecModel.eachComponent(function(componentType, componentModel) { + if (componentType === "series") { + return; + } + var componentView = _this.getViewOfComponentModel(componentModel); + if (componentView && componentView.__alive) { + if (componentView.updateTransform) { + var result = componentView.updateTransform(componentModel, ecModel, api, payload); + result && result.update && componentDirtyList.push(componentView); + } else { + componentDirtyList.push(componentView); + } + } + }); + var seriesDirtyMap = createHashMap(); + ecModel.eachSeries(function(seriesModel) { + var chartView = _this._chartsMap[seriesModel.__viewId]; + if (chartView.updateTransform) { + var result = chartView.updateTransform(seriesModel, ecModel, api, payload); + result && result.update && seriesDirtyMap.set(seriesModel.uid, 1); + } else { + seriesDirtyMap.set(seriesModel.uid, 1); + } + }); + clearColorPalette(ecModel); + this._scheduler.performVisualTasks(ecModel, payload, { + setDirty: true, + dirtyMap: seriesDirtyMap + }); + renderSeries(this, ecModel, api, payload, {}, seriesDirtyMap); + lifecycle.trigger("afterupdate", ecModel, api); + }, + updateView: function(payload) { + var ecModel = this._model; + if (!ecModel) { + return; + } + ecModel.setUpdatePayload(payload); + ChartView.markUpdateMethod(payload, "updateView"); + clearColorPalette(ecModel); + this._scheduler.performVisualTasks(ecModel, payload, { + setDirty: true + }); + render(this, ecModel, this._api, payload, {}); + lifecycle.trigger("afterupdate", ecModel, this._api); + }, + updateVisual: function(payload) { + var _this = this; + var ecModel = this._model; + if (!ecModel) { + return; + } + ecModel.setUpdatePayload(payload); + ecModel.eachSeries(function(seriesModel) { + seriesModel.getData().clearAllVisual(); + }); + ChartView.markUpdateMethod(payload, "updateVisual"); + clearColorPalette(ecModel); + this._scheduler.performVisualTasks(ecModel, payload, { + visualType: "visual", + setDirty: true + }); + ecModel.eachComponent(function(componentType, componentModel) { + if (componentType !== "series") { + var componentView = _this.getViewOfComponentModel(componentModel); + componentView && componentView.__alive && componentView.updateVisual(componentModel, ecModel, _this._api, payload); + } + }); + ecModel.eachSeries(function(seriesModel) { + var chartView = _this._chartsMap[seriesModel.__viewId]; + chartView.updateVisual(seriesModel, ecModel, _this._api, payload); + }); + lifecycle.trigger("afterupdate", ecModel, this._api); + }, + updateLayout: function(payload) { + updateMethods.update.call(this, payload); + } + }; + doConvertPixel = function(ecIns, methodName, finder, value) { + if (ecIns._disposed) { + disposedWarning(ecIns.id); + return; + } + var ecModel = ecIns._model; + var coordSysList = ecIns._coordSysMgr.getCoordinateSystems(); + var result; + var parsedFinder = parseFinder(ecModel, finder); + for (var i = 0; i < coordSysList.length; i++) { + var coordSys = coordSysList[i]; + if (coordSys[methodName] && (result = coordSys[methodName](ecModel, parsedFinder, value)) != null) { + return result; + } + } + }; + updateStreamModes = function(ecIns, ecModel) { + var chartsMap = ecIns._chartsMap; + var scheduler = ecIns._scheduler; + ecModel.eachSeries(function(seriesModel) { + scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]); + }); + }; + doDispatchAction = function(payload, silent) { + var _this = this; + var ecModel = this.getModel(); + var payloadType = payload.type; + var escapeConnect = payload.escapeConnect; + var actionWrap = actions[payloadType]; + var actionInfo = actionWrap.actionInfo; + var cptTypeTmp = (actionInfo.update || "update").split(":"); + var updateMethod = cptTypeTmp.pop(); + var cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]); + this[IN_MAIN_PROCESS_KEY] = true; + var payloads = [payload]; + var batched = false; + if (payload.batch) { + batched = true; + payloads = map$1(payload.batch, function(item) { + item = defaults(extend({}, item), payload); + item.batch = null; + return item; + }); + } + var eventObjBatch = []; + var eventObj; + var isSelectChange = isSelectChangePayload(payload); + var isHighDown = isHighDownPayload(payload); + if (isHighDown) { + allLeaveBlur(this._api); + } + each$4(payloads, function(batchItem) { + eventObj = actionWrap.action(batchItem, _this._model, _this._api); + eventObj = eventObj || extend({}, batchItem); + eventObj.type = actionInfo.event || eventObj.type; + eventObjBatch.push(eventObj); + if (isHighDown) { + var _a = preParseFinder(payload), queryOptionMap = _a.queryOptionMap, mainTypeSpecified = _a.mainTypeSpecified; + var componentMainType = mainTypeSpecified ? queryOptionMap.keys()[0] : "series"; + updateDirectly(_this, updateMethod, batchItem, componentMainType); + markStatusToUpdate(_this); + } else if (isSelectChange) { + updateDirectly(_this, updateMethod, batchItem, "series"); + markStatusToUpdate(_this); + } else if (cptType) { + updateDirectly(_this, updateMethod, batchItem, cptType.main, cptType.sub); + } + }); + if (updateMethod !== "none" && !isHighDown && !isSelectChange && !cptType) { + try { + if (this[PENDING_UPDATE]) { + prepare(this); + updateMethods.update.call(this, payload); + this[PENDING_UPDATE] = null; + } else { + updateMethods[updateMethod].call(this, payload); + } + } catch (e) { + this[IN_MAIN_PROCESS_KEY] = false; + throw e; + } + } + if (batched) { + eventObj = { + type: actionInfo.event || payloadType, + escapeConnect, + batch: eventObjBatch + }; + } else { + eventObj = eventObjBatch[0]; + } + this[IN_MAIN_PROCESS_KEY] = false; + if (!silent) { + var messageCenter = this._messageCenter; + messageCenter.trigger(eventObj.type, eventObj); + if (isSelectChange) { + var newObj = { + type: "selectchanged", + escapeConnect, + selected: getAllSelectedIndices(ecModel), + isFromClick: payload.isFromClick || false, + fromAction: payload.type, + fromActionPayload: payload + }; + messageCenter.trigger(newObj.type, newObj); + } + } + }; + flushPendingActions = function(silent) { + var pendingActions = this._pendingActions; + while (pendingActions.length) { + var payload = pendingActions.shift(); + doDispatchAction.call(this, payload, silent); + } + }; + triggerUpdatedEvent = function(silent) { + !silent && this.trigger("updated"); + }; + bindRenderedEvent = function(zr, ecIns) { + zr.on("rendered", function(params) { + ecIns.trigger("rendered", params); + if ( + // Although zr is dirty if initial animation is not finished + // and this checking is called on frame, we also check + // animation finished for robustness. + zr.animation.isFinished() && !ecIns[PENDING_UPDATE] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length + ) { + ecIns.trigger("finished"); + } + }); + }; + bindMouseEvent = function(zr, ecIns) { + zr.on("mouseover", function(e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, isHighDownDispatcher); + if (dispatcher) { + handleGlobalMouseOverForHighDown(dispatcher, e, ecIns._api); + markStatusToUpdate(ecIns); + } + }).on("mouseout", function(e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, isHighDownDispatcher); + if (dispatcher) { + handleGlobalMouseOutForHighDown(dispatcher, e, ecIns._api); + markStatusToUpdate(ecIns); + } + }).on("click", function(e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, function(target) { + return getECData(target).dataIndex != null; + }, true); + if (dispatcher) { + var actionType = dispatcher.selected ? "unselect" : "select"; + var ecData = getECData(dispatcher); + ecIns._api.dispatchAction({ + type: actionType, + dataType: ecData.dataType, + dataIndexInside: ecData.dataIndex, + seriesIndex: ecData.seriesIndex, + isFromClick: true + }); + } + }); + }; + function clearColorPalette(ecModel) { + ecModel.clearColorPalette(); + ecModel.eachSeries(function(seriesModel) { + seriesModel.clearColorPalette(); + }); + } + function allocateZlevels(ecModel) { + var componentZLevels = []; + var seriesZLevels = []; + var hasSeparateZLevel = false; + ecModel.eachComponent(function(componentType, componentModel) { + var zlevel = componentModel.get("zlevel") || 0; + var z = componentModel.get("z") || 0; + var zlevelKey = componentModel.getZLevelKey(); + hasSeparateZLevel = hasSeparateZLevel || !!zlevelKey; + (componentType === "series" ? seriesZLevels : componentZLevels).push({ + zlevel, + z, + idx: componentModel.componentIndex, + type: componentType, + key: zlevelKey + }); + }); + if (hasSeparateZLevel) { + var zLevels = componentZLevels.concat(seriesZLevels); + var lastSeriesZLevel_1; + var lastSeriesKey_1; + sort(zLevels, function(a, b) { + if (a.zlevel === b.zlevel) { + return a.z - b.z; + } + return a.zlevel - b.zlevel; + }); + each$4(zLevels, function(item) { + var componentModel = ecModel.getComponent(item.type, item.idx); + var zlevel = item.zlevel; + var key = item.key; + if (lastSeriesZLevel_1 != null) { + zlevel = Math.max(lastSeriesZLevel_1, zlevel); + } + if (key) { + if (zlevel === lastSeriesZLevel_1 && key !== lastSeriesKey_1) { + zlevel++; + } + lastSeriesKey_1 = key; + } else if (lastSeriesKey_1) { + if (zlevel === lastSeriesZLevel_1) { + zlevel++; + } + lastSeriesKey_1 = ""; + } + lastSeriesZLevel_1 = zlevel; + componentModel.setZLevel(zlevel); + }); + } + } + render = function(ecIns, ecModel, api, payload, updateParams) { + allocateZlevels(ecModel); + renderComponents(ecIns, ecModel, api, payload, updateParams); + each$4(ecIns._chartsViews, function(chart) { + chart.__alive = false; + }); + renderSeries(ecIns, ecModel, api, payload, updateParams); + each$4(ecIns._chartsViews, function(chart) { + if (!chart.__alive) { + chart.remove(ecModel, api); + } + }); + }; + renderComponents = function(ecIns, ecModel, api, payload, updateParams, dirtyList) { + each$4(dirtyList || ecIns._componentsViews, function(componentView) { + var componentModel = componentView.__model; + clearStates(componentModel, componentView); + componentView.render(componentModel, ecModel, api, payload); + updateZ(componentModel, componentView); + updateStates(componentModel, componentView); + }); + }; + renderSeries = function(ecIns, ecModel, api, payload, updateParams, dirtyMap) { + var scheduler = ecIns._scheduler; + updateParams = extend(updateParams || {}, { + updatedSeries: ecModel.getSeries() + }); + lifecycle.trigger("series:beforeupdate", ecModel, api, updateParams); + var unfinished = false; + ecModel.eachSeries(function(seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + chartView.__alive = true; + var renderTask = chartView.renderTask; + scheduler.updatePayload(renderTask, payload); + clearStates(seriesModel, chartView); + if (dirtyMap && dirtyMap.get(seriesModel.uid)) { + renderTask.dirty(); + } + if (renderTask.perform(scheduler.getPerformArgs(renderTask))) { + unfinished = true; + } + chartView.group.silent = !!seriesModel.get("silent"); + updateBlend(seriesModel, chartView); + updateSeriesElementSelection(seriesModel); + }); + scheduler.unfinished = unfinished || scheduler.unfinished; + lifecycle.trigger("series:layoutlabels", ecModel, api, updateParams); + lifecycle.trigger("series:transition", ecModel, api, updateParams); + ecModel.eachSeries(function(seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + updateZ(seriesModel, chartView); + updateStates(seriesModel, chartView); + }); + updateHoverLayerStatus(ecIns, ecModel); + lifecycle.trigger("series:afterupdate", ecModel, api, updateParams); + }; + markStatusToUpdate = function(ecIns) { + ecIns[STATUS_NEEDS_UPDATE_KEY] = true; + ecIns.getZr().wakeUp(); + }; + applyChangedStates = function(ecIns) { + if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) { + return; + } + ecIns.getZr().storage.traverse(function(el) { + if (isElementRemoved(el)) { + return; + } + applyElementStates(el); + }); + ecIns[STATUS_NEEDS_UPDATE_KEY] = false; + }; + function applyElementStates(el) { + var newStates = []; + var oldStates = el.currentStates; + for (var i = 0; i < oldStates.length; i++) { + var stateName = oldStates[i]; + if (!(stateName === "emphasis" || stateName === "blur" || stateName === "select")) { + newStates.push(stateName); + } + } + if (el.selected && el.states.select) { + newStates.push("select"); + } + if (el.hoverState === HOVER_STATE_EMPHASIS && el.states.emphasis) { + newStates.push("emphasis"); + } else if (el.hoverState === HOVER_STATE_BLUR && el.states.blur) { + newStates.push("blur"); + } + el.useStates(newStates); + } + function updateHoverLayerStatus(ecIns, ecModel) { + var zr = ecIns._zr; + var storage = zr.storage; + var elCount = 0; + storage.traverse(function(el) { + if (!el.isGroup) { + elCount++; + } + }); + if (elCount > ecModel.get("hoverLayerThreshold") && !env.node && !env.worker) { + ecModel.eachSeries(function(seriesModel) { + if (seriesModel.preventUsingHoverLayer) { + return; + } + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + if (chartView.__alive) { + chartView.eachRendered(function(el) { + if (el.states.emphasis) { + el.states.emphasis.hoverLayer = true; + } + }); + } + }); + } + } + function updateBlend(seriesModel, chartView) { + var blendMode = seriesModel.get("blendMode") || null; + chartView.eachRendered(function(el) { + if (!el.isGroup) { + el.style.blend = blendMode; + } + }); + } + function updateZ(model, view) { + if (model.preventAutoZ) { + return; + } + var z = model.get("z") || 0; + var zlevel = model.get("zlevel") || 0; + view.eachRendered(function(el) { + doUpdateZ(el, z, zlevel, -Infinity); + return true; + }); + } + function doUpdateZ(el, z, zlevel, maxZ2) { + var label = el.getTextContent(); + var labelLine = el.getTextGuideLine(); + var isGroup = el.isGroup; + if (isGroup) { + var children = el.childrenRef(); + for (var i = 0; i < children.length; i++) { + maxZ2 = Math.max(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2); + } + } else { + el.z = z; + el.zlevel = zlevel; + maxZ2 = Math.max(el.z2, maxZ2); + } + if (label) { + label.z = z; + label.zlevel = zlevel; + isFinite(maxZ2) && (label.z2 = maxZ2 + 2); + } + if (labelLine) { + var textGuideLineConfig = el.textGuideLineConfig; + labelLine.z = z; + labelLine.zlevel = zlevel; + isFinite(maxZ2) && (labelLine.z2 = maxZ2 + (textGuideLineConfig && textGuideLineConfig.showAbove ? 1 : -1)); + } + return maxZ2; + } + function clearStates(model, view) { + view.eachRendered(function(el) { + if (isElementRemoved(el)) { + return; + } + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + if (el.stateTransition) { + el.stateTransition = null; + } + if (textContent && textContent.stateTransition) { + textContent.stateTransition = null; + } + if (textGuide && textGuide.stateTransition) { + textGuide.stateTransition = null; + } + if (el.hasState()) { + el.prevStates = el.currentStates; + el.clearStates(); + } else if (el.prevStates) { + el.prevStates = null; + } + }); + } + function updateStates(model, view) { + var stateAnimationModel = model.getModel("stateAnimation"); + var enableAnimation = model.isAnimationEnabled(); + var duration = stateAnimationModel.get("duration"); + var stateTransition = duration > 0 ? { + duration, + delay: stateAnimationModel.get("delay"), + easing: stateAnimationModel.get("easing") + // additive: stateAnimationModel.get('additive') + } : null; + view.eachRendered(function(el) { + if (el.states && el.states.emphasis) { + if (isElementRemoved(el)) { + return; + } + if (el instanceof Path) { + savePathStates(el); + } + if (el.__dirty) { + var prevStates = el.prevStates; + if (prevStates) { + el.useStates(prevStates); + } + } + if (enableAnimation) { + el.stateTransition = stateTransition; + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + if (textContent) { + textContent.stateTransition = stateTransition; + } + if (textGuide) { + textGuide.stateTransition = stateTransition; + } + } + if (el.__dirty) { + applyElementStates(el); + } + } + }); + } + createExtensionAPI = function(ecIns) { + return new /** @class */ + (function(_super2) { + __extends(class_1, _super2); + function class_1() { + return _super2 !== null && _super2.apply(this, arguments) || this; + } + class_1.prototype.getCoordinateSystems = function() { + return ecIns._coordSysMgr.getCoordinateSystems(); + }; + class_1.prototype.getComponentByElement = function(el) { + while (el) { + var modelInfo = el.__ecComponentInfo; + if (modelInfo != null) { + return ecIns._model.getComponent(modelInfo.mainType, modelInfo.index); + } + el = el.parent; + } + }; + class_1.prototype.enterEmphasis = function(el, highlightDigit) { + enterEmphasis(el, highlightDigit); + markStatusToUpdate(ecIns); + }; + class_1.prototype.leaveEmphasis = function(el, highlightDigit) { + leaveEmphasis(el, highlightDigit); + markStatusToUpdate(ecIns); + }; + class_1.prototype.enterBlur = function(el) { + enterBlur(el); + markStatusToUpdate(ecIns); + }; + class_1.prototype.leaveBlur = function(el) { + leaveBlur(el); + markStatusToUpdate(ecIns); + }; + class_1.prototype.enterSelect = function(el) { + enterSelect(el); + markStatusToUpdate(ecIns); + }; + class_1.prototype.leaveSelect = function(el) { + leaveSelect(el); + markStatusToUpdate(ecIns); + }; + class_1.prototype.getModel = function() { + return ecIns.getModel(); + }; + class_1.prototype.getViewOfComponentModel = function(componentModel) { + return ecIns.getViewOfComponentModel(componentModel); + }; + class_1.prototype.getViewOfSeriesModel = function(seriesModel) { + return ecIns.getViewOfSeriesModel(seriesModel); + }; + return class_1; + }(ExtensionAPI))(ecIns); + }; + enableConnect = function(chart) { + function updateConnectedChartsStatus(charts, status) { + for (var i = 0; i < charts.length; i++) { + var otherChart = charts[i]; + otherChart[CONNECT_STATUS_KEY] = status; + } + } + each$4(eventActionMap, function(actionType, eventType) { + chart._messageCenter.on(eventType, function(event) { + if (connectedGroups[chart.group] && chart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_PENDING) { + if (event && event.escapeConnect) { + return; + } + var action_1 = chart.makeActionFromEvent(event); + var otherCharts_1 = []; + each$4(instances, function(otherChart) { + if (otherChart !== chart && otherChart.group === chart.group) { + otherCharts_1.push(otherChart); + } + }); + updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_PENDING); + each$4(otherCharts_1, function(otherChart) { + if (otherChart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_UPDATING) { + otherChart.dispatchAction(action_1); + } + }); + updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_UPDATED); + } + }); + }); + }; + }(); + return ECharts2; + }(Eventful) +); +var echartsProto = ECharts.prototype; +echartsProto.on = createRegisterEventWithLowercaseECharts("on"); +echartsProto.off = createRegisterEventWithLowercaseECharts("off"); +echartsProto.one = function(eventName, cb, ctx) { + var self = this; + function wrapped() { + var args2 = []; + for (var _i = 0; _i < arguments.length; _i++) { + args2[_i] = arguments[_i]; + } + cb && cb.apply && cb.apply(this, args2); + self.off(eventName, wrapped); + } + this.on.call(this, eventName, wrapped, ctx); +}; +var MOUSE_EVENT_NAMES = ["click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "globalout", "contextmenu"]; +function disposedWarning(id) { +} +var actions = {}; +var eventActionMap = {}; +var dataProcessorFuncs = []; +var optionPreprocessorFuncs = []; +var visualFuncs = []; +var themeStorage = {}; +var loadingEffects = {}; +var instances = {}; +var connectedGroups = {}; +var idBase = +/* @__PURE__ */ new Date() - 0; +var DOM_ATTRIBUTE_KEY = "_echarts_instance_"; +function init(dom, theme, opts) { + var isClient = !(opts && opts.ssr); + if (isClient) { + var existInstance = getInstanceByDom(dom); + if (existInstance) { + return existInstance; + } + } + var chart = new ECharts(dom, theme, opts); + chart.id = "ec_" + idBase++; + instances[chart.id] = chart; + isClient && setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id); + enableConnect(chart); + lifecycle.trigger("afterinit", chart); + return chart; +} +function getInstanceByDom(dom) { + return instances[getAttribute(dom, DOM_ATTRIBUTE_KEY)]; +} +function registerTheme(name, theme) { + themeStorage[name] = theme; +} +function registerPreprocessor(preprocessorFunc) { + if (indexOf(optionPreprocessorFuncs, preprocessorFunc) < 0) { + optionPreprocessorFuncs.push(preprocessorFunc); + } +} +function registerProcessor(priority, processor) { + normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT); +} +function registerPostInit(postInitFunc) { + registerUpdateLifecycle("afterinit", postInitFunc); +} +function registerPostUpdate(postUpdateFunc) { + registerUpdateLifecycle("afterupdate", postUpdateFunc); +} +function registerUpdateLifecycle(name, cb) { + lifecycle.on(name, cb); +} +function registerAction(actionInfo, eventName, action) { + if (isFunction(eventName)) { + action = eventName; + eventName = ""; + } + var actionType = isObject$2(actionInfo) ? actionInfo.type : [actionInfo, actionInfo = { + event: eventName + }][0]; + actionInfo.event = (actionInfo.event || actionType).toLowerCase(); + eventName = actionInfo.event; + if (eventActionMap[eventName]) { + return; + } + assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName)); + if (!actions[actionType]) { + actions[actionType] = { + action, + actionInfo + }; + } + eventActionMap[eventName] = actionType; +} +function registerCoordinateSystem(type, coordSysCreator) { + CoordinateSystemManager.register(type, coordSysCreator); +} +function registerLayout(priority, layoutTask) { + normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, "layout"); +} +function registerVisual(priority, visualTask) { + normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, "visual"); +} +var registeredTasks = []; +function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) { + if (isFunction(priority) || isObject$2(priority)) { + fn = priority; + priority = defaultPriority; + } + if (indexOf(registeredTasks, fn) >= 0) { + return; + } + registeredTasks.push(fn); + var stageHandler = Scheduler.wrapStageHandler(fn, visualType); + stageHandler.__prio = priority; + stageHandler.__raw = fn; + targetList.push(stageHandler); +} +function registerLoading(name, loadingFx) { + loadingEffects[name] = loadingFx; +} +function registerMap(mapName, geoJson, specialAreas) { + var registerMap2 = getImpl("registerMap"); + registerMap2 && registerMap2(mapName, geoJson, specialAreas); +} +var registerTransform = registerExternalTransform; +registerVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask); +registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask); +registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask); +registerVisual(PRIORITY_VISUAL_GLOBAL, seriesSymbolTask); +registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataSymbolTask); +registerVisual(PRIORITY_VISUAL_DECAL, decalVisual); +registerPreprocessor(globalBackwardCompat); +registerProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack); +registerLoading("default", defaultLoading); +registerAction({ + type: HIGHLIGHT_ACTION_TYPE, + event: HIGHLIGHT_ACTION_TYPE, + update: HIGHLIGHT_ACTION_TYPE +}, noop); +registerAction({ + type: DOWNPLAY_ACTION_TYPE, + event: DOWNPLAY_ACTION_TYPE, + update: DOWNPLAY_ACTION_TYPE +}, noop); +registerAction({ + type: SELECT_ACTION_TYPE, + event: SELECT_ACTION_TYPE, + update: SELECT_ACTION_TYPE +}, noop); +registerAction({ + type: UNSELECT_ACTION_TYPE, + event: UNSELECT_ACTION_TYPE, + update: UNSELECT_ACTION_TYPE +}, noop); +registerAction({ + type: TOGGLE_SELECT_ACTION_TYPE, + event: TOGGLE_SELECT_ACTION_TYPE, + update: TOGGLE_SELECT_ACTION_TYPE +}, noop); +registerTheme("light", lightTheme); +registerTheme("dark", theme); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +function dataIndexMapValueLength(valNumOrArrLengthMoreThan2) { + return valNumOrArrLengthMoreThan2 == null ? 0 : valNumOrArrLengthMoreThan2.length || 1; +} +function defaultKeyGetter(item) { + return item; +} +var DataDiffer = /** @class */function () { + /** + * @param context Can be visited by this.context in callback. + */ + function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context, + // By default: 'oneToOne'. + diffMode) { + this._old = oldArr; + this._new = newArr; + this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; + this._newKeyGetter = newKeyGetter || defaultKeyGetter; + // Visible in callback via `this.context`; + this.context = context; + this._diffModeMultiple = diffMode === 'multiple'; + } + /** + * Callback function when add a data + */ + DataDiffer.prototype.add = function (func) { + this._add = func; + return this; + }; + /** + * Callback function when update a data + */ + DataDiffer.prototype.update = function (func) { + this._update = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + DataDiffer.prototype.updateManyToOne = function (func) { + this._updateManyToOne = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + DataDiffer.prototype.updateOneToMany = function (func) { + this._updateOneToMany = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + DataDiffer.prototype.updateManyToMany = function (func) { + this._updateManyToMany = func; + return this; + }; + /** + * Callback function when remove a data + */ + DataDiffer.prototype.remove = function (func) { + this._remove = func; + return this; + }; + DataDiffer.prototype.execute = function () { + this[this._diffModeMultiple ? '_executeMultiple' : '_executeOneToOne'](); + }; + DataDiffer.prototype._executeOneToOne = function () { + var oldArr = this._old; + var newArr = this._new; + var newDataIndexMap = {}; + var oldDataKeyArr = new Array(oldArr.length); + var newDataKeyArr = new Array(newArr.length); + this._initIndexMap(oldArr, null, oldDataKeyArr, '_oldKeyGetter'); + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + for (var i = 0; i < oldArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); + // idx can never be empty array here. see 'set null' logic below. + if (newIdxMapValLen > 1) { + // Consider there is duplicate key (for example, use dataItem.name as key). + // We should make sure every item in newArr and oldArr can be visited. + var newIdx = newIdxMapVal.shift(); + if (newIdxMapVal.length === 1) { + newDataIndexMap[oldKey] = newIdxMapVal[0]; + } + this._update && this._update(newIdx, i); + } else if (newIdxMapValLen === 1) { + newDataIndexMap[oldKey] = null; + this._update && this._update(newIdxMapVal, i); + } else { + this._remove && this._remove(i); + } + } + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + /** + * For example, consider the case: + * oldData: [o0, o1, o2, o3, o4, o5, o6, o7], + * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8], + * Where: + * o0, o1, n0 has key 'a' (many to one) + * o5, n4, n5, n6 has key 'b' (one to many) + * o2, n1 has key 'c' (one to one) + * n2, n3 has key 'd' (add) + * o3, o4 has key 'e' (remove) + * o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove) + * Then: + * (The order of the following directives are not ensured.) + * this._updateManyToOne(n0, [o0, o1]); + * this._updateOneToMany([n4, n5, n6], o5); + * this._update(n1, o2); + * this._remove(o3); + * this._remove(o4); + * this._remove(o6); + * this._remove(o7); + * this._add(n2); + * this._add(n3); + * this._add(n7); + * this._add(n8); + */ + DataDiffer.prototype._executeMultiple = function () { + var oldArr = this._old; + var newArr = this._new; + var oldDataIndexMap = {}; + var newDataIndexMap = {}; + var oldDataKeyArr = []; + var newDataKeyArr = []; + this._initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter'); + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + for (var i = 0; i < oldDataKeyArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var oldIdxMapVal = oldDataIndexMap[oldKey]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var oldIdxMapValLen = dataIndexMapValueLength(oldIdxMapVal); + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); + if (oldIdxMapValLen > 1 && newIdxMapValLen === 1) { + this._updateManyToOne && this._updateManyToOne(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen > 1) { + this._updateOneToMany && this._updateOneToMany(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen === 1) { + this._update && this._update(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen > 1 && newIdxMapValLen > 1) { + this._updateManyToMany && this._updateManyToMany(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen > 1) { + for (var i_1 = 0; i_1 < oldIdxMapValLen; i_1++) { + this._remove && this._remove(oldIdxMapVal[i_1]); + } + } else { + this._remove && this._remove(oldIdxMapVal); + } + } + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + DataDiffer.prototype._performRestAdd = function (newDataKeyArr, newDataIndexMap) { + for (var i = 0; i < newDataKeyArr.length; i++) { + var newKey = newDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[newKey]; + var idxMapValLen = dataIndexMapValueLength(newIdxMapVal); + if (idxMapValLen > 1) { + for (var j = 0; j < idxMapValLen; j++) { + this._add && this._add(newIdxMapVal[j]); + } + } else if (idxMapValLen === 1) { + this._add && this._add(newIdxMapVal); + } + // Support both `newDataKeyArr` are duplication removed or not removed. + newDataIndexMap[newKey] = null; + } + }; + DataDiffer.prototype._initIndexMap = function (arr, + // Can be null. + map, + // In 'byKey', the output `keyArr` is duplication removed. + // In 'byIndex', the output `keyArr` is not duplication removed and + // its indices are accurately corresponding to `arr`. + keyArr, keyGetterName) { + var cbModeMultiple = this._diffModeMultiple; + for (var i = 0; i < arr.length; i++) { + // Add prefix to avoid conflict with Object.prototype. + var key = '_ec_' + this[keyGetterName](arr[i], i); + if (!cbModeMultiple) { + keyArr[i] = key; + } + if (!map) { + continue; + } + var idxMapVal = map[key]; + var idxMapValLen = dataIndexMapValueLength(idxMapVal); + if (idxMapValLen === 0) { + // Simple optimize: in most cases, one index has one key, + // do not need array. + map[key] = i; + if (cbModeMultiple) { + keyArr.push(key); + } + } else if (idxMapValLen === 1) { + map[key] = [idxMapVal, i]; + } else { + idxMapVal.push(i); + } + } + }; + return DataDiffer; +}(); + +var DimensionUserOuput = ( + /** @class */ + function() { + function DimensionUserOuput2(encode, dimRequest) { + this._encode = encode; + this._schema = dimRequest; + } + DimensionUserOuput2.prototype.get = function() { + return { + // Do not generate full dimension name until fist used. + fullDimensions: this._getFullDimensionNames(), + encode: this._encode + }; + }; + DimensionUserOuput2.prototype._getFullDimensionNames = function() { + if (!this._cachedDimNames) { + this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : []; + } + return this._cachedDimNames; + }; + return DimensionUserOuput2; + }() +); +function summarizeDimensions(data, schema) { + var summary = {}; + var encode = summary.encode = {}; + var notExtraCoordDimMap = createHashMap(); + var defaultedLabel = []; + var defaultedTooltip = []; + var userOutputEncode = {}; + each$4(data.dimensions, function(dimName) { + var dimItem = data.getDimensionInfo(dimName); + var coordDim = dimItem.coordDim; + if (coordDim) { + var coordDimIndex = dimItem.coordDimIndex; + getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName; + if (!dimItem.isExtraCoord) { + notExtraCoordDimMap.set(coordDim, 1); + if (mayLabelDimType(dimItem.type)) { + defaultedLabel[0] = dimName; + } + getOrCreateEncodeArr(userOutputEncode, coordDim)[coordDimIndex] = data.getDimensionIndex(dimItem.name); + } + if (dimItem.defaultTooltip) { + defaultedTooltip.push(dimName); + } + } + VISUAL_DIMENSIONS.each(function(v, otherDim) { + var encodeArr = getOrCreateEncodeArr(encode, otherDim); + var dimIndex = dimItem.otherDims[otherDim]; + if (dimIndex != null && dimIndex !== false) { + encodeArr[dimIndex] = dimItem.name; + } + }); + }); + var dataDimsOnCoord = []; + var encodeFirstDimNotExtra = {}; + notExtraCoordDimMap.each(function(v, coordDim) { + var dimArr = encode[coordDim]; + encodeFirstDimNotExtra[coordDim] = dimArr[0]; + dataDimsOnCoord = dataDimsOnCoord.concat(dimArr); + }); + summary.dataDimsOnCoord = dataDimsOnCoord; + summary.dataDimIndicesOnCoord = map$1(dataDimsOnCoord, function(dimName) { + return data.getDimensionInfo(dimName).storeDimIndex; + }); + summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra; + var encodeLabel = encode.label; + if (encodeLabel && encodeLabel.length) { + defaultedLabel = encodeLabel.slice(); + } + var encodeTooltip = encode.tooltip; + if (encodeTooltip && encodeTooltip.length) { + defaultedTooltip = encodeTooltip.slice(); + } else if (!defaultedTooltip.length) { + defaultedTooltip = defaultedLabel.slice(); + } + encode.defaultedLabel = defaultedLabel; + encode.defaultedTooltip = defaultedTooltip; + summary.userOutput = new DimensionUserOuput(userOutputEncode, schema); + return summary; +} +function getOrCreateEncodeArr(encode, dim) { + if (!encode.hasOwnProperty(dim)) { + encode[dim] = []; + } + return encode[dim]; +} +function getDimensionTypeByAxis(axisType) { + return axisType === "category" ? "ordinal" : axisType === "time" ? "time" : "float"; +} +function mayLabelDimType(dimType) { + return !(dimType === "ordinal" || dimType === "time"); +} + +var SeriesDimensionDefine = /** @class */function () { + /** + * @param opt All of the fields will be shallow copied. + */ + function SeriesDimensionDefine(opt) { + /** + * The format of `otherDims` is: + * ```js + * { + * tooltip?: number + * label?: number + * itemName?: number + * seriesName?: number + * } + * ``` + * + * A `series.encode` can specified these fields: + * ```js + * encode: { + * // "3, 1, 5" is the index of data dimension. + * tooltip: [3, 1, 5], + * label: [0, 3], + * ... + * } + * ``` + * `otherDims` is the parse result of the `series.encode` above, like: + * ```js + * // Suppose the index of this data dimension is `3`. + * this.otherDims = { + * // `3` is at the index `0` of the `encode.tooltip` + * tooltip: 0, + * // `3` is at the index `1` of the `encode.label` + * label: 1 + * }; + * ``` + * + * This prop should never be `null`/`undefined` after initialized. + */ + this.otherDims = {}; + if (opt != null) { + extend(this, opt); + } + } + return SeriesDimensionDefine; +}(); + +var inner$5 = makeInner(); +var dimTypeShort = { + float: 'f', + int: 'i', + ordinal: 'o', + number: 'n', + time: 't' +}; +/** + * Represents the dimension requirement of a series. + * + * NOTICE: + * When there are too many dimensions in dataset and many series, only the used dimensions + * (i.e., used by coord sys and declared in `series.encode`) are add to `dimensionDefineList`. + * But users may query data by other unused dimension names. + * In this case, users can only query data if and only if they have defined dimension names + * via ec option, so we provide `getDimensionIndexFromSource`, which only query them from + * `source` dimensions. + */ +var SeriesDataSchema = /** @class */function () { + function SeriesDataSchema(opt) { + this.dimensions = opt.dimensions; + this._dimOmitted = opt.dimensionOmitted; + this.source = opt.source; + this._fullDimCount = opt.fullDimensionCount; + this._updateDimOmitted(opt.dimensionOmitted); + } + SeriesDataSchema.prototype.isDimensionOmitted = function () { + return this._dimOmitted; + }; + SeriesDataSchema.prototype._updateDimOmitted = function (dimensionOmitted) { + this._dimOmitted = dimensionOmitted; + if (!dimensionOmitted) { + return; + } + if (!this._dimNameMap) { + this._dimNameMap = ensureSourceDimNameMap(this.source); + } + }; + /** + * @caution Can only be used when `dimensionOmitted: true`. + * + * Get index by user defined dimension name (i.e., not internal generate name). + * That is, get index from `dimensionsDefine`. + * If no `dimensionsDefine`, or no name get, return -1. + */ + SeriesDataSchema.prototype.getSourceDimensionIndex = function (dimName) { + return retrieve2(this._dimNameMap.get(dimName), -1); + }; + /** + * @caution Can only be used when `dimensionOmitted: true`. + * + * Notice: may return `null`/`undefined` if user not specify dimension names. + */ + SeriesDataSchema.prototype.getSourceDimension = function (dimIndex) { + var dimensionsDefine = this.source.dimensionsDefine; + if (dimensionsDefine) { + return dimensionsDefine[dimIndex]; + } + }; + SeriesDataSchema.prototype.makeStoreSchema = function () { + var dimCount = this._fullDimCount; + var willRetrieveDataByName = shouldRetrieveDataByName(this.source); + var makeHashStrict = !shouldOmitUnusedDimensions(dimCount); + // If source don't have dimensions or series don't omit unsed dimensions. + // Generate from seriesDimList directly + var dimHash = ''; + var dims = []; + for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < dimCount; fullDimIdx++) { + var property = void 0; + var type = void 0; + var ordinalMeta = void 0; + var seriesDimDef = this.dimensions[seriesDimIdx]; + // The list has been sorted by `storeDimIndex` asc. + if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { + property = willRetrieveDataByName ? seriesDimDef.name : null; + type = seriesDimDef.type; + ordinalMeta = seriesDimDef.ordinalMeta; + seriesDimIdx++; + } else { + var sourceDimDef = this.getSourceDimension(fullDimIdx); + if (sourceDimDef) { + property = willRetrieveDataByName ? sourceDimDef.name : null; + type = sourceDimDef.type; + } + } + dims.push({ + property: property, + type: type, + ordinalMeta: ordinalMeta + }); + // If retrieving data by index, + // use to determine whether data can be shared. + // (Because in this case there might be no dimension name defined in dataset, but indices always exists). + // (Indices are always 0, 1, 2, ..., so we can ignore them to shorten the hash). + // Otherwise if retrieving data by property name (like `data: [{aa: 123, bb: 765}, ...]`), + // use in hash. + if (willRetrieveDataByName && property != null + // For data stack, we have make sure each series has its own dim on this store. + // So we do not add property to hash to make sure they can share this store. + && (!seriesDimDef || !seriesDimDef.isCalculationCoord)) { + dimHash += makeHashStrict + // Use escape character '`' in case that property name contains '$'. + ? property.replace(/\`/g, '`1').replace(/\$/g, '`2') + // For better performance, when there are large dimensions, tolerant this defects that hardly meet. + : property; + } + dimHash += '$'; + dimHash += dimTypeShort[type] || 'f'; + if (ordinalMeta) { + dimHash += ordinalMeta.uid; + } + dimHash += '$'; + } + // Source from endpoint(usually series) will be read differently + // when seriesLayoutBy or startIndex(which is affected by sourceHeader) are different. + // So we use this three props as key. + var source = this.source; + var hash = [source.seriesLayoutBy, source.startIndex, dimHash].join('$$'); + return { + dimensions: dims, + hash: hash + }; + }; + SeriesDataSchema.prototype.makeOutputDimensionNames = function () { + var result = []; + for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < this._fullDimCount; fullDimIdx++) { + var name_1 = void 0; + var seriesDimDef = this.dimensions[seriesDimIdx]; + // The list has been sorted by `storeDimIndex` asc. + if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { + if (!seriesDimDef.isCalculationCoord) { + name_1 = seriesDimDef.name; + } + seriesDimIdx++; + } else { + var sourceDimDef = this.getSourceDimension(fullDimIdx); + if (sourceDimDef) { + name_1 = sourceDimDef.name; + } + } + result.push(name_1); + } + return result; + }; + SeriesDataSchema.prototype.appendCalculationDimension = function (dimDef) { + this.dimensions.push(dimDef); + dimDef.isCalculationCoord = true; + this._fullDimCount++; + // If append dimension on a data store, consider the store + // might be shared by different series, series dimensions not + // really map to store dimensions. + this._updateDimOmitted(true); + }; + return SeriesDataSchema; +}(); +function isSeriesDataSchema(schema) { + return schema instanceof SeriesDataSchema; +} +function createDimNameMap(dimsDef) { + var dataDimNameMap = createHashMap(); + for (var i = 0; i < (dimsDef || []).length; i++) { + var dimDefItemRaw = dimsDef[i]; + var userDimName = isObject$2(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw; + if (userDimName != null && dataDimNameMap.get(userDimName) == null) { + dataDimNameMap.set(userDimName, i); + } + } + return dataDimNameMap; +} +function ensureSourceDimNameMap(source) { + var innerSource = inner$5(source); + return innerSource.dimNameMap || (innerSource.dimNameMap = createDimNameMap(source.dimensionsDefine)); +} +function shouldOmitUnusedDimensions(dimCount) { + return dimCount > 30; +} + +var isObject = isObject$2; +var map = map$1; +var CtorInt32Array = typeof Int32Array === "undefined" ? Array : Int32Array; +var ID_PREFIX = "e\0\0"; +var INDEX_NOT_FOUND = -1; +var TRANSFERABLE_PROPERTIES = ["hasItemOption", "_nameList", "_idList", "_invertedIndicesMap", "_dimSummary", "userOutput", "_rawData", "_dimValueGetter", "_nameDimIdx", "_idDimIdx", "_nameRepeatCount"]; +var CLONE_PROPERTIES = ["_approximateExtent"]; +var prepareInvertedIndex; +var getId; +var getIdNameFromStore; +var normalizeDimensions; +var transferProperties; +var cloneListForMapAndSample; +var makeIdFromName; +var SeriesData = ( + /** @class */ + function() { + function SeriesData2(dimensionsInput, hostModel) { + this.type = "list"; + this._dimOmitted = false; + this._nameList = []; + this._idList = []; + this._visual = {}; + this._layout = {}; + this._itemVisuals = []; + this._itemLayouts = []; + this._graphicEls = []; + this._approximateExtent = {}; + this._calculationInfo = {}; + this.hasItemOption = false; + this.TRANSFERABLE_METHODS = ["cloneShallow", "downSample", "minmaxDownSample", "lttbDownSample", "map"]; + this.CHANGABLE_METHODS = ["filterSelf", "selectRange"]; + this.DOWNSAMPLE_METHODS = ["downSample", "minmaxDownSample", "lttbDownSample"]; + var dimensions; + var assignStoreDimIdx = false; + if (isSeriesDataSchema(dimensionsInput)) { + dimensions = dimensionsInput.dimensions; + this._dimOmitted = dimensionsInput.isDimensionOmitted(); + this._schema = dimensionsInput; + } else { + assignStoreDimIdx = true; + dimensions = dimensionsInput; + } + dimensions = dimensions || ["x", "y"]; + var dimensionInfos = {}; + var dimensionNames = []; + var invertedIndicesMap = {}; + var needsHasOwn = false; + var emptyObj = {}; + for (var i = 0; i < dimensions.length; i++) { + var dimInfoInput = dimensions[i]; + var dimensionInfo = isString(dimInfoInput) ? new SeriesDimensionDefine({ + name: dimInfoInput + }) : !(dimInfoInput instanceof SeriesDimensionDefine) ? new SeriesDimensionDefine(dimInfoInput) : dimInfoInput; + var dimensionName = dimensionInfo.name; + dimensionInfo.type = dimensionInfo.type || "float"; + if (!dimensionInfo.coordDim) { + dimensionInfo.coordDim = dimensionName; + dimensionInfo.coordDimIndex = 0; + } + var otherDims = dimensionInfo.otherDims = dimensionInfo.otherDims || {}; + dimensionNames.push(dimensionName); + dimensionInfos[dimensionName] = dimensionInfo; + if (emptyObj[dimensionName] != null) { + needsHasOwn = true; + } + if (dimensionInfo.createInvertedIndices) { + invertedIndicesMap[dimensionName] = []; + } + if (otherDims.itemName === 0) { + this._nameDimIdx = i; + } + if (otherDims.itemId === 0) { + this._idDimIdx = i; + } + if (assignStoreDimIdx) { + dimensionInfo.storeDimIndex = i; + } + } + this.dimensions = dimensionNames; + this._dimInfos = dimensionInfos; + this._initGetDimensionInfo(needsHasOwn); + this.hostModel = hostModel; + this._invertedIndicesMap = invertedIndicesMap; + if (this._dimOmitted) { + var dimIdxToName_1 = this._dimIdxToName = createHashMap(); + each$4(dimensionNames, function(dimName) { + dimIdxToName_1.set(dimensionInfos[dimName].storeDimIndex, dimName); + }); + } + } + SeriesData2.prototype.getDimension = function(dim) { + var dimIdx = this._recognizeDimIndex(dim); + if (dimIdx == null) { + return dim; + } + dimIdx = dim; + if (!this._dimOmitted) { + return this.dimensions[dimIdx]; + } + var dimName = this._dimIdxToName.get(dimIdx); + if (dimName != null) { + return dimName; + } + var sourceDimDef = this._schema.getSourceDimension(dimIdx); + if (sourceDimDef) { + return sourceDimDef.name; + } + }; + SeriesData2.prototype.getDimensionIndex = function(dim) { + var dimIdx = this._recognizeDimIndex(dim); + if (dimIdx != null) { + return dimIdx; + } + if (dim == null) { + return -1; + } + var dimInfo = this._getDimInfo(dim); + return dimInfo ? dimInfo.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(dim) : -1; + }; + SeriesData2.prototype._recognizeDimIndex = function(dim) { + if (isNumber(dim) || dim != null && !isNaN(dim) && !this._getDimInfo(dim) && (!this._dimOmitted || this._schema.getSourceDimensionIndex(dim) < 0)) { + return +dim; + } + }; + SeriesData2.prototype._getStoreDimIndex = function(dim) { + var dimIdx = this.getDimensionIndex(dim); + return dimIdx; + }; + SeriesData2.prototype.getDimensionInfo = function(dim) { + return this._getDimInfo(this.getDimension(dim)); + }; + SeriesData2.prototype._initGetDimensionInfo = function(needsHasOwn) { + var dimensionInfos = this._dimInfos; + this._getDimInfo = needsHasOwn ? function(dimName) { + return dimensionInfos.hasOwnProperty(dimName) ? dimensionInfos[dimName] : void 0; + } : function(dimName) { + return dimensionInfos[dimName]; + }; + }; + SeriesData2.prototype.getDimensionsOnCoord = function() { + return this._dimSummary.dataDimsOnCoord.slice(); + }; + SeriesData2.prototype.mapDimension = function(coordDim, idx) { + var dimensionsSummary = this._dimSummary; + if (idx == null) { + return dimensionsSummary.encodeFirstDimNotExtra[coordDim]; + } + var dims = dimensionsSummary.encode[coordDim]; + return dims ? dims[idx] : null; + }; + SeriesData2.prototype.mapDimensionsAll = function(coordDim) { + var dimensionsSummary = this._dimSummary; + var dims = dimensionsSummary.encode[coordDim]; + return (dims || []).slice(); + }; + SeriesData2.prototype.getStore = function() { + return this._store; + }; + SeriesData2.prototype.initData = function(data, nameList, dimValueGetter) { + var _this = this; + var store; + if (data instanceof DataStore) { + store = data; + } + if (!store) { + var dimensions = this.dimensions; + var provider = isSourceInstance(data) || isArrayLike(data) ? new DefaultDataProvider(data, dimensions.length) : data; + store = new DataStore(); + var dimensionInfos = map(dimensions, function(dimName) { + return { + type: _this._dimInfos[dimName].type, + property: dimName + }; + }); + store.initData(provider, dimensionInfos, dimValueGetter); + } + this._store = store; + this._nameList = (nameList || []).slice(); + this._idList = []; + this._nameRepeatCount = {}; + this._doInit(0, store.count()); + this._dimSummary = summarizeDimensions(this, this._schema); + this.userOutput = this._dimSummary.userOutput; + }; + SeriesData2.prototype.appendData = function(data) { + var range = this._store.appendData(data); + this._doInit(range[0], range[1]); + }; + SeriesData2.prototype.appendValues = function(values, names) { + var _a = this._store.appendValues(values, names && names.length), start = _a.start, end = _a.end; + var shouldMakeIdFromName = this._shouldMakeIdFromName(); + this._updateOrdinalMeta(); + if (names) { + for (var idx = start; idx < end; idx++) { + var sourceIdx = idx - start; + this._nameList[idx] = names[sourceIdx]; + if (shouldMakeIdFromName) { + makeIdFromName(this, idx); + } + } + } + }; + SeriesData2.prototype._updateOrdinalMeta = function() { + var store = this._store; + var dimensions = this.dimensions; + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = this._dimInfos[dimensions[i]]; + if (dimInfo.ordinalMeta) { + store.collectOrdinalMeta(dimInfo.storeDimIndex, dimInfo.ordinalMeta); + } + } + }; + SeriesData2.prototype._shouldMakeIdFromName = function() { + var provider = this._store.getProvider(); + return this._idDimIdx == null && provider.getSource().sourceFormat !== SOURCE_FORMAT_TYPED_ARRAY && !provider.fillStorage; + }; + SeriesData2.prototype._doInit = function(start, end) { + if (start >= end) { + return; + } + var store = this._store; + var provider = store.getProvider(); + this._updateOrdinalMeta(); + var nameList = this._nameList; + var idList = this._idList; + var sourceFormat = provider.getSource().sourceFormat; + var isFormatOriginal = sourceFormat === SOURCE_FORMAT_ORIGINAL; + if (isFormatOriginal && !provider.pure) { + var sharedDataItem = []; + for (var idx = start; idx < end; idx++) { + var dataItem = provider.getItem(idx, sharedDataItem); + if (!this.hasItemOption && isDataItemOption(dataItem)) { + this.hasItemOption = true; + } + if (dataItem) { + var itemName = dataItem.name; + if (nameList[idx] == null && itemName != null) { + nameList[idx] = convertOptionIdName(itemName, null); + } + var itemId = dataItem.id; + if (idList[idx] == null && itemId != null) { + idList[idx] = convertOptionIdName(itemId, null); + } + } + } + } + if (this._shouldMakeIdFromName()) { + for (var idx = start; idx < end; idx++) { + makeIdFromName(this, idx); + } + } + prepareInvertedIndex(this); + }; + SeriesData2.prototype.getApproximateExtent = function(dim) { + return this._approximateExtent[dim] || this._store.getDataExtent(this._getStoreDimIndex(dim)); + }; + SeriesData2.prototype.setApproximateExtent = function(extent, dim) { + dim = this.getDimension(dim); + this._approximateExtent[dim] = extent.slice(); + }; + SeriesData2.prototype.getCalculationInfo = function(key) { + return this._calculationInfo[key]; + }; + SeriesData2.prototype.setCalculationInfo = function(key, value) { + isObject(key) ? extend(this._calculationInfo, key) : this._calculationInfo[key] = value; + }; + SeriesData2.prototype.getName = function(idx) { + var rawIndex = this.getRawIndex(idx); + var name = this._nameList[rawIndex]; + if (name == null && this._nameDimIdx != null) { + name = getIdNameFromStore(this, this._nameDimIdx, rawIndex); + } + if (name == null) { + name = ""; + } + return name; + }; + SeriesData2.prototype._getCategory = function(dimIdx, idx) { + var ordinal = this._store.get(dimIdx, idx); + var ordinalMeta = this._store.getOrdinalMeta(dimIdx); + if (ordinalMeta) { + return ordinalMeta.categories[ordinal]; + } + return ordinal; + }; + SeriesData2.prototype.getId = function(idx) { + return getId(this, this.getRawIndex(idx)); + }; + SeriesData2.prototype.count = function() { + return this._store.count(); + }; + SeriesData2.prototype.get = function(dim, idx) { + var store = this._store; + var dimInfo = this._dimInfos[dim]; + if (dimInfo) { + return store.get(dimInfo.storeDimIndex, idx); + } + }; + SeriesData2.prototype.getByRawIndex = function(dim, rawIdx) { + var store = this._store; + var dimInfo = this._dimInfos[dim]; + if (dimInfo) { + return store.getByRawIndex(dimInfo.storeDimIndex, rawIdx); + } + }; + SeriesData2.prototype.getIndices = function() { + return this._store.getIndices(); + }; + SeriesData2.prototype.getDataExtent = function(dim) { + return this._store.getDataExtent(this._getStoreDimIndex(dim)); + }; + SeriesData2.prototype.getSum = function(dim) { + return this._store.getSum(this._getStoreDimIndex(dim)); + }; + SeriesData2.prototype.getMedian = function(dim) { + return this._store.getMedian(this._getStoreDimIndex(dim)); + }; + SeriesData2.prototype.getValues = function(dimensions, idx) { + var _this = this; + var store = this._store; + return isArray(dimensions) ? store.getValues(map(dimensions, function(dim) { + return _this._getStoreDimIndex(dim); + }), idx) : store.getValues(dimensions); + }; + SeriesData2.prototype.hasValue = function(idx) { + var dataDimIndicesOnCoord = this._dimSummary.dataDimIndicesOnCoord; + for (var i = 0, len = dataDimIndicesOnCoord.length; i < len; i++) { + if (isNaN(this._store.get(dataDimIndicesOnCoord[i], idx))) { + return false; + } + } + return true; + }; + SeriesData2.prototype.indexOfName = function(name) { + for (var i = 0, len = this._store.count(); i < len; i++) { + if (this.getName(i) === name) { + return i; + } + } + return -1; + }; + SeriesData2.prototype.getRawIndex = function(idx) { + return this._store.getRawIndex(idx); + }; + SeriesData2.prototype.indexOfRawIndex = function(rawIndex) { + return this._store.indexOfRawIndex(rawIndex); + }; + SeriesData2.prototype.rawIndexOf = function(dim, value) { + var invertedIndices = dim && this._invertedIndicesMap[dim]; + var rawIndex = invertedIndices && invertedIndices[value]; + if (rawIndex == null || isNaN(rawIndex)) { + return INDEX_NOT_FOUND; + } + return rawIndex; + }; + SeriesData2.prototype.indicesOfNearest = function(dim, value, maxDistance) { + return this._store.indicesOfNearest(this._getStoreDimIndex(dim), value, maxDistance); + }; + SeriesData2.prototype.each = function(dims, cb, ctx) { + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } + var fCtx = ctx || this; + var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this); + this._store.each(dimIndices, fCtx ? bind$1(cb, fCtx) : cb); + }; + SeriesData2.prototype.filterSelf = function(dims, cb, ctx) { + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } + var fCtx = ctx || this; + var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this); + this._store = this._store.filter(dimIndices, fCtx ? bind$1(cb, fCtx) : cb); + return this; + }; + SeriesData2.prototype.selectRange = function(range) { + var _this = this; + var innerRange = {}; + var dims = keys(range); + each$4(dims, function(dim) { + var dimIdx = _this._getStoreDimIndex(dim); + innerRange[dimIdx] = range[dim]; + }); + this._store = this._store.selectRange(innerRange); + return this; + }; + SeriesData2.prototype.mapArray = function(dims, cb, ctx) { + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } + ctx = ctx || this; + var result = []; + this.each(dims, function() { + result.push(cb && cb.apply(this, arguments)); + }, ctx); + return result; + }; + SeriesData2.prototype.map = function(dims, cb, ctx, ctxCompat) { + var fCtx = ctx || ctxCompat || this; + var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this); + var list = cloneListForMapAndSample(this); + list._store = this._store.map(dimIndices, fCtx ? bind$1(cb, fCtx) : cb); + return list; + }; + SeriesData2.prototype.modify = function(dims, cb, ctx, ctxCompat) { + var fCtx = ctx || ctxCompat || this; + var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this); + this._store.modify(dimIndices, fCtx ? bind$1(cb, fCtx) : cb); + }; + SeriesData2.prototype.downSample = function(dimension, rate, sampleValue, sampleIndex) { + var list = cloneListForMapAndSample(this); + list._store = this._store.downSample(this._getStoreDimIndex(dimension), rate, sampleValue, sampleIndex); + return list; + }; + SeriesData2.prototype.minmaxDownSample = function(valueDimension, rate) { + var list = cloneListForMapAndSample(this); + list._store = this._store.minmaxDownSample(this._getStoreDimIndex(valueDimension), rate); + return list; + }; + SeriesData2.prototype.lttbDownSample = function(valueDimension, rate) { + var list = cloneListForMapAndSample(this); + list._store = this._store.lttbDownSample(this._getStoreDimIndex(valueDimension), rate); + return list; + }; + SeriesData2.prototype.getRawDataItem = function(idx) { + return this._store.getRawDataItem(idx); + }; + SeriesData2.prototype.getItemModel = function(idx) { + var hostModel = this.hostModel; + var dataItem = this.getRawDataItem(idx); + return new Model(dataItem, hostModel, hostModel && hostModel.ecModel); + }; + SeriesData2.prototype.diff = function(otherList) { + var thisList = this; + return new DataDiffer(otherList ? otherList.getStore().getIndices() : [], this.getStore().getIndices(), function(idx) { + return getId(otherList, idx); + }, function(idx) { + return getId(thisList, idx); + }); + }; + SeriesData2.prototype.getVisual = function(key) { + var visual = this._visual; + return visual && visual[key]; + }; + SeriesData2.prototype.setVisual = function(kvObj, val) { + this._visual = this._visual || {}; + if (isObject(kvObj)) { + extend(this._visual, kvObj); + } else { + this._visual[kvObj] = val; + } + }; + SeriesData2.prototype.getItemVisual = function(idx, key) { + var itemVisual = this._itemVisuals[idx]; + var val = itemVisual && itemVisual[key]; + if (val == null) { + return this.getVisual(key); + } + return val; + }; + SeriesData2.prototype.hasItemVisual = function() { + return this._itemVisuals.length > 0; + }; + SeriesData2.prototype.ensureUniqueItemVisual = function(idx, key) { + var itemVisuals = this._itemVisuals; + var itemVisual = itemVisuals[idx]; + if (!itemVisual) { + itemVisual = itemVisuals[idx] = {}; + } + var val = itemVisual[key]; + if (val == null) { + val = this.getVisual(key); + if (isArray(val)) { + val = val.slice(); + } else if (isObject(val)) { + val = extend({}, val); + } + itemVisual[key] = val; + } + return val; + }; + SeriesData2.prototype.setItemVisual = function(idx, key, value) { + var itemVisual = this._itemVisuals[idx] || {}; + this._itemVisuals[idx] = itemVisual; + if (isObject(key)) { + extend(itemVisual, key); + } else { + itemVisual[key] = value; + } + }; + SeriesData2.prototype.clearAllVisual = function() { + this._visual = {}; + this._itemVisuals = []; + }; + SeriesData2.prototype.setLayout = function(key, val) { + isObject(key) ? extend(this._layout, key) : this._layout[key] = val; + }; + SeriesData2.prototype.getLayout = function(key) { + return this._layout[key]; + }; + SeriesData2.prototype.getItemLayout = function(idx) { + return this._itemLayouts[idx]; + }; + SeriesData2.prototype.setItemLayout = function(idx, layout, merge) { + this._itemLayouts[idx] = merge ? extend(this._itemLayouts[idx] || {}, layout) : layout; + }; + SeriesData2.prototype.clearItemLayouts = function() { + this._itemLayouts.length = 0; + }; + SeriesData2.prototype.setItemGraphicEl = function(idx, el) { + var seriesIndex = this.hostModel && this.hostModel.seriesIndex; + setCommonECData(seriesIndex, this.dataType, idx, el); + this._graphicEls[idx] = el; + }; + SeriesData2.prototype.getItemGraphicEl = function(idx) { + return this._graphicEls[idx]; + }; + SeriesData2.prototype.eachItemGraphicEl = function(cb, context) { + each$4(this._graphicEls, function(el, idx) { + if (el) { + cb && cb.call(context, el, idx); + } + }); + }; + SeriesData2.prototype.cloneShallow = function(list) { + if (!list) { + list = new SeriesData2(this._schema ? this._schema : map(this.dimensions, this._getDimInfo, this), this.hostModel); + } + transferProperties(list, this); + list._store = this._store; + return list; + }; + SeriesData2.prototype.wrapMethod = function(methodName, injectFunction) { + var originalMethod = this[methodName]; + if (!isFunction(originalMethod)) { + return; + } + this.__wrappedMethods = this.__wrappedMethods || []; + this.__wrappedMethods.push(methodName); + this[methodName] = function() { + var res = originalMethod.apply(this, arguments); + return injectFunction.apply(this, [res].concat(slice(arguments))); + }; + }; + SeriesData2.internalField = function() { + prepareInvertedIndex = function(data) { + var invertedIndicesMap = data._invertedIndicesMap; + each$4(invertedIndicesMap, function(invertedIndices, dim) { + var dimInfo = data._dimInfos[dim]; + var ordinalMeta = dimInfo.ordinalMeta; + var store = data._store; + if (ordinalMeta) { + invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array(ordinalMeta.categories.length); + for (var i = 0; i < invertedIndices.length; i++) { + invertedIndices[i] = INDEX_NOT_FOUND; + } + for (var i = 0; i < store.count(); i++) { + invertedIndices[store.get(dimInfo.storeDimIndex, i)] = i; + } + } + }); + }; + getIdNameFromStore = function(data, dimIdx, idx) { + return convertOptionIdName(data._getCategory(dimIdx, idx), null); + }; + getId = function(data, rawIndex) { + var id = data._idList[rawIndex]; + if (id == null && data._idDimIdx != null) { + id = getIdNameFromStore(data, data._idDimIdx, rawIndex); + } + if (id == null) { + id = ID_PREFIX + rawIndex; + } + return id; + }; + normalizeDimensions = function(dimensions) { + if (!isArray(dimensions)) { + dimensions = dimensions != null ? [dimensions] : []; + } + return dimensions; + }; + cloneListForMapAndSample = function(original) { + var list = new SeriesData2(original._schema ? original._schema : map(original.dimensions, original._getDimInfo, original), original.hostModel); + transferProperties(list, original); + return list; + }; + transferProperties = function(target, source) { + each$4(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function(propName) { + if (source.hasOwnProperty(propName)) { + target[propName] = source[propName]; + } + }); + target.__wrappedMethods = source.__wrappedMethods; + each$4(CLONE_PROPERTIES, function(propName) { + target[propName] = clone$2(source[propName]); + }); + target._calculationInfo = extend({}, source._calculationInfo); + }; + makeIdFromName = function(data, idx) { + var nameList = data._nameList; + var idList = data._idList; + var nameDimIdx = data._nameDimIdx; + var idDimIdx = data._idDimIdx; + var name = nameList[idx]; + var id = idList[idx]; + if (name == null && nameDimIdx != null) { + nameList[idx] = name = getIdNameFromStore(data, nameDimIdx, idx); + } + if (id == null && idDimIdx != null) { + idList[idx] = id = getIdNameFromStore(data, idDimIdx, idx); + } + if (id == null && name != null) { + var nameRepeatCount = data._nameRepeatCount; + var nmCnt = nameRepeatCount[name] = (nameRepeatCount[name] || 0) + 1; + id = name; + if (nmCnt > 1) { + id += "__ec__" + nmCnt; + } + idList[idx] = id; + } + }; + }(); + return SeriesData2; + }() +); + +/** + * This method builds the relationship between: + * + "what the coord sys or series requires (see `coordDimensions`)", + * + "what the user defines (in `encode` and `dimensions`, see `opt.dimensionsDefine` and `opt.encodeDefine`)" + * + "what the data source provids (see `source`)". + * + * Some guess strategy will be adapted if user does not define something. + * If no 'value' dimension specified, the first no-named dimension will be + * named as 'value'. + * + * @return The results are always sorted by `storeDimIndex` asc. + */ +function prepareSeriesDataSchema( +// TODO: TYPE completeDimensions type +source, opt) { + if (!isSourceInstance(source)) { + source = createSourceFromSeriesDataOption(source); + } + opt = opt || {}; + var sysDims = opt.coordDimensions || []; + var dimsDef = opt.dimensionsDefine || source.dimensionsDefine || []; + var coordDimNameMap = createHashMap(); + var resultList = []; + var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount); + // Try to ignore unused dimensions if sharing a high dimension datastore + // 30 is an experience value. + var omitUnusedDimensions = opt.canOmitUnusedDimensions && shouldOmitUnusedDimensions(dimCount); + var isUsingSourceDimensionsDef = dimsDef === source.dimensionsDefine; + var dataDimNameMap = isUsingSourceDimensionsDef ? ensureSourceDimNameMap(source) : createDimNameMap(dimsDef); + var encodeDef = opt.encodeDefine; + if (!encodeDef && opt.encodeDefaulter) { + encodeDef = opt.encodeDefaulter(source, dimCount); + } + var encodeDefMap = createHashMap(encodeDef); + var indicesMap = new CtorInt32Array$1(dimCount); + for (var i = 0; i < indicesMap.length; i++) { + indicesMap[i] = -1; + } + function getResultItem(dimIdx) { + var idx = indicesMap[dimIdx]; + if (idx < 0) { + var dimDefItemRaw = dimsDef[dimIdx]; + var dimDefItem = isObject$2(dimDefItemRaw) ? dimDefItemRaw : { + name: dimDefItemRaw + }; + var resultItem = new SeriesDimensionDefine(); + var userDimName = dimDefItem.name; + if (userDimName != null && dataDimNameMap.get(userDimName) != null) { + // Only if `series.dimensions` is defined in option + // displayName, will be set, and dimension will be displayed vertically in + // tooltip by default. + resultItem.name = resultItem.displayName = userDimName; + } + dimDefItem.type != null && (resultItem.type = dimDefItem.type); + dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName); + var newIdx = resultList.length; + indicesMap[dimIdx] = newIdx; + resultItem.storeDimIndex = dimIdx; + resultList.push(resultItem); + return resultItem; + } + return resultList[idx]; + } + if (!omitUnusedDimensions) { + for (var i = 0; i < dimCount; i++) { + getResultItem(i); + } + } + // Set `coordDim` and `coordDimIndex` by `encodeDefMap` and normalize `encodeDefMap`. + encodeDefMap.each(function (dataDimsRaw, coordDim) { + var dataDims = normalizeToArray(dataDimsRaw).slice(); + // Note: It is allowed that `dataDims.length` is `0`, e.g., options is + // `{encode: {x: -1, y: 1}}`. Should not filter anything in + // this case. + if (dataDims.length === 1 && !isString(dataDims[0]) && dataDims[0] < 0) { + encodeDefMap.set(coordDim, false); + return; + } + var validDataDims = encodeDefMap.set(coordDim, []); + each$4(dataDims, function (resultDimIdxOrName, idx) { + // The input resultDimIdx can be dim name or index. + var resultDimIdx = isString(resultDimIdxOrName) ? dataDimNameMap.get(resultDimIdxOrName) : resultDimIdxOrName; + if (resultDimIdx != null && resultDimIdx < dimCount) { + validDataDims[idx] = resultDimIdx; + applyDim(getResultItem(resultDimIdx), coordDim, idx); + } + }); + }); + // Apply templates and default order from `sysDims`. + var availDimIdx = 0; + each$4(sysDims, function (sysDimItemRaw) { + var coordDim; + var sysDimItemDimsDef; + var sysDimItemOtherDims; + var sysDimItem; + if (isString(sysDimItemRaw)) { + coordDim = sysDimItemRaw; + sysDimItem = {}; + } else { + sysDimItem = sysDimItemRaw; + coordDim = sysDimItem.name; + var ordinalMeta = sysDimItem.ordinalMeta; + sysDimItem.ordinalMeta = null; + sysDimItem = extend({}, sysDimItem); + sysDimItem.ordinalMeta = ordinalMeta; + // `coordDimIndex` should not be set directly. + sysDimItemDimsDef = sysDimItem.dimsDef; + sysDimItemOtherDims = sysDimItem.otherDims; + sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null; + } + var dataDims = encodeDefMap.get(coordDim); + // negative resultDimIdx means no need to mapping. + if (dataDims === false) { + return; + } + dataDims = normalizeToArray(dataDims); + // dimensions provides default dim sequences. + if (!dataDims.length) { + for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) { + while (availDimIdx < dimCount && getResultItem(availDimIdx).coordDim != null) { + availDimIdx++; + } + availDimIdx < dimCount && dataDims.push(availDimIdx++); + } + } + // Apply templates. + each$4(dataDims, function (resultDimIdx, coordDimIndex) { + var resultItem = getResultItem(resultDimIdx); + // Coordinate system has a higher priority on dim type than source. + if (isUsingSourceDimensionsDef && sysDimItem.type != null) { + resultItem.type = sysDimItem.type; + } + applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex); + if (resultItem.name == null && sysDimItemDimsDef) { + var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex]; + !isObject$2(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = { + name: sysDimItemDimsDefItem + }); + resultItem.name = resultItem.displayName = sysDimItemDimsDefItem.name; + resultItem.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip; + } + // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}} + sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims); + }); + }); + function applyDim(resultItem, coordDim, coordDimIndex) { + if (VISUAL_DIMENSIONS.get(coordDim) != null) { + resultItem.otherDims[coordDim] = coordDimIndex; + } else { + resultItem.coordDim = coordDim; + resultItem.coordDimIndex = coordDimIndex; + coordDimNameMap.set(coordDim, true); + } + } + // Make sure the first extra dim is 'value'. + var generateCoord = opt.generateCoord; + var generateCoordCount = opt.generateCoordCount; + var fromZero = generateCoordCount != null; + generateCoordCount = generateCoord ? generateCoordCount || 1 : 0; + var extra = generateCoord || 'value'; + function ifNoNameFillWithCoordName(resultItem) { + if (resultItem.name == null) { + // Duplication will be removed in the next step. + resultItem.name = resultItem.coordDim; + } + } + // Set dim `name` and other `coordDim` and other props. + if (!omitUnusedDimensions) { + for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) { + var resultItem = getResultItem(resultDimIdx); + var coordDim = resultItem.coordDim; + if (coordDim == null) { + // TODO no need to generate coordDim for isExtraCoord? + resultItem.coordDim = genCoordDimName(extra, coordDimNameMap, fromZero); + resultItem.coordDimIndex = 0; + // Series specified generateCoord is using out. + if (!generateCoord || generateCoordCount <= 0) { + resultItem.isExtraCoord = true; + } + generateCoordCount--; + } + ifNoNameFillWithCoordName(resultItem); + if (resultItem.type == null && (guessOrdinal(source, resultDimIdx) === BE_ORDINAL.Must + // Consider the case: + // { + // dataset: {source: [ + // ['2001', 123], + // ['2002', 456], + // ... + // ['The others', 987], + // ]}, + // series: {type: 'pie'} + // } + // The first column should better be treated as a "ordinal" although it + // might not be detected as an "ordinal" by `guessOrdinal`. + || resultItem.isExtraCoord && (resultItem.otherDims.itemName != null || resultItem.otherDims.seriesName != null))) { + resultItem.type = 'ordinal'; + } + } + } else { + each$4(resultList, function (resultItem) { + // PENDING: guessOrdinal or let user specify type: 'ordinal' manually? + ifNoNameFillWithCoordName(resultItem); + }); + // Sort dimensions: there are some rule that use the last dim as label, + // and for some latter travel process easier. + resultList.sort(function (item0, item1) { + return item0.storeDimIndex - item1.storeDimIndex; + }); + } + removeDuplication(resultList); + return new SeriesDataSchema({ + source: source, + dimensions: resultList, + fullDimensionCount: dimCount, + dimensionOmitted: omitUnusedDimensions + }); +} +function removeDuplication(result) { + var duplicationMap = createHashMap(); + for (var i = 0; i < result.length; i++) { + var dim = result[i]; + var dimOriginalName = dim.name; + var count = duplicationMap.get(dimOriginalName) || 0; + if (count > 0) { + // Starts from 0. + dim.name = dimOriginalName + (count - 1); + } + count++; + duplicationMap.set(dimOriginalName, count); + } +} +// ??? TODO +// Originally detect dimCount by data[0]. Should we +// optimize it to only by sysDims and dimensions and encode. +// So only necessary dims will be initialized. +// But +// (1) custom series should be considered. where other dims +// may be visited. +// (2) sometimes user need to calculate bubble size or use visualMap +// on other dimensions besides coordSys needed. +// So, dims that is not used by system, should be shared in data store? +function getDimCount(source, sysDims, dimsDef, optDimCount) { + // Note that the result dimCount should not small than columns count + // of data, otherwise `dataDimNameMap` checking will be incorrect. + var dimCount = Math.max(source.dimensionsDetectedCount || 1, sysDims.length, dimsDef.length, optDimCount || 0); + each$4(sysDims, function (sysDimItem) { + var sysDimItemDimsDef; + if (isObject$2(sysDimItem) && (sysDimItemDimsDef = sysDimItem.dimsDef)) { + dimCount = Math.max(dimCount, sysDimItemDimsDef.length); + } + }); + return dimCount; +} +function genCoordDimName(name, map, fromZero) { + if (fromZero || map.hasKey(name)) { + var i = 0; + while (map.hasKey(name + i)) { + i++; + } + name += i; + } + map.set(name, true); + return name; +} + +var CoordSysInfo = ( + /** @class */ + /* @__PURE__ */ function() { + function CoordSysInfo2(coordSysName) { + this.coordSysDims = []; + this.axisMap = createHashMap(); + this.categoryAxisMap = createHashMap(); + this.coordSysName = coordSysName; + } + return CoordSysInfo2; + }() +); +function getCoordSysInfoBySeries(seriesModel) { + var coordSysName = seriesModel.get("coordinateSystem"); + var result = new CoordSysInfo(coordSysName); + var fetch = fetchers[coordSysName]; + if (fetch) { + fetch(seriesModel, result, result.axisMap, result.categoryAxisMap); + return result; + } +} +var fetchers = { + cartesian2d: function(seriesModel, result, axisMap, categoryAxisMap) { + var xAxisModel = seriesModel.getReferringComponents("xAxis", SINGLE_REFERRING).models[0]; + var yAxisModel = seriesModel.getReferringComponents("yAxis", SINGLE_REFERRING).models[0]; + result.coordSysDims = ["x", "y"]; + axisMap.set("x", xAxisModel); + axisMap.set("y", yAxisModel); + if (isCategory(xAxisModel)) { + categoryAxisMap.set("x", xAxisModel); + result.firstCategoryDimIndex = 0; + } + if (isCategory(yAxisModel)) { + categoryAxisMap.set("y", yAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + singleAxis: function(seriesModel, result, axisMap, categoryAxisMap) { + var singleAxisModel = seriesModel.getReferringComponents("singleAxis", SINGLE_REFERRING).models[0]; + result.coordSysDims = ["single"]; + axisMap.set("single", singleAxisModel); + if (isCategory(singleAxisModel)) { + categoryAxisMap.set("single", singleAxisModel); + result.firstCategoryDimIndex = 0; + } + }, + polar: function(seriesModel, result, axisMap, categoryAxisMap) { + var polarModel = seriesModel.getReferringComponents("polar", SINGLE_REFERRING).models[0]; + var radiusAxisModel = polarModel.findAxisModel("radiusAxis"); + var angleAxisModel = polarModel.findAxisModel("angleAxis"); + result.coordSysDims = ["radius", "angle"]; + axisMap.set("radius", radiusAxisModel); + axisMap.set("angle", angleAxisModel); + if (isCategory(radiusAxisModel)) { + categoryAxisMap.set("radius", radiusAxisModel); + result.firstCategoryDimIndex = 0; + } + if (isCategory(angleAxisModel)) { + categoryAxisMap.set("angle", angleAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + geo: function(seriesModel, result, axisMap, categoryAxisMap) { + result.coordSysDims = ["lng", "lat"]; + }, + parallel: function(seriesModel, result, axisMap, categoryAxisMap) { + var ecModel = seriesModel.ecModel; + var parallelModel = ecModel.getComponent("parallel", seriesModel.get("parallelIndex")); + var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice(); + each$4(parallelModel.parallelAxisIndex, function(axisIndex, index) { + var axisModel = ecModel.getComponent("parallelAxis", axisIndex); + var axisDim = coordSysDims[index]; + axisMap.set(axisDim, axisModel); + if (isCategory(axisModel)) { + categoryAxisMap.set(axisDim, axisModel); + if (result.firstCategoryDimIndex == null) { + result.firstCategoryDimIndex = index; + } + } + }); + } +}; +function isCategory(axisModel) { + return axisModel.get("type") === "category"; +} + +/** + * Note that it is too complicated to support 3d stack by value + * (have to create two-dimension inverted index), so in 3d case + * we just support that stacked by index. + * + * @param seriesModel + * @param dimensionsInput The same as the input of . + * The input will be modified. + * @param opt + * @param opt.stackedCoordDimension Specify a coord dimension if needed. + * @param opt.byIndex=false + * @return calculationInfo + * { + * stackedDimension: string + * stackedByDimension: string + * isStackedByIndex: boolean + * stackedOverDimension: string + * stackResultDimension: string + * } + */ +function enableDataStack(seriesModel, dimensionsInput, opt) { + opt = opt || {}; + var byIndex = opt.byIndex; + var stackedCoordDimension = opt.stackedCoordDimension; + var dimensionDefineList; + var schema; + var store; + if (isLegacyDimensionsInput(dimensionsInput)) { + dimensionDefineList = dimensionsInput; + } else { + schema = dimensionsInput.schema; + dimensionDefineList = schema.dimensions; + store = dimensionsInput.store; + } + // Compatibal: when `stack` is set as '', do not stack. + var mayStack = !!(seriesModel && seriesModel.get('stack')); + var stackedByDimInfo; + var stackedDimInfo; + var stackResultDimension; + var stackedOverDimension; + each$4(dimensionDefineList, function (dimensionInfo, index) { + if (isString(dimensionInfo)) { + dimensionDefineList[index] = dimensionInfo = { + name: dimensionInfo + }; + } + if (mayStack && !dimensionInfo.isExtraCoord) { + // Find the first ordinal dimension as the stackedByDimInfo. + if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) { + stackedByDimInfo = dimensionInfo; + } + // Find the first stackable dimension as the stackedDimInfo. + if (!stackedDimInfo && dimensionInfo.type !== 'ordinal' && dimensionInfo.type !== 'time' && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) { + stackedDimInfo = dimensionInfo; + } + } + }); + if (stackedDimInfo && !byIndex && !stackedByDimInfo) { + // Compatible with previous design, value axis (time axis) only stack by index. + // It may make sense if the user provides elaborately constructed data. + byIndex = true; + } + // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`. + // That put stack logic in List is for using conveniently in echarts extensions, but it + // might not be a good way. + if (stackedDimInfo) { + // Use a weird name that not duplicated with other names. + // Also need to use seriesModel.id as postfix because different + // series may share same data store. The stack dimension needs to be distinguished. + stackResultDimension = '__\0ecstackresult_' + seriesModel.id; + stackedOverDimension = '__\0ecstackedover_' + seriesModel.id; + // Create inverted index to fast query index by value. + if (stackedByDimInfo) { + stackedByDimInfo.createInvertedIndices = true; + } + var stackedDimCoordDim_1 = stackedDimInfo.coordDim; + var stackedDimType = stackedDimInfo.type; + var stackedDimCoordIndex_1 = 0; + each$4(dimensionDefineList, function (dimensionInfo) { + if (dimensionInfo.coordDim === stackedDimCoordDim_1) { + stackedDimCoordIndex_1++; + } + }); + var stackedOverDimensionDefine = { + name: stackResultDimension, + coordDim: stackedDimCoordDim_1, + coordDimIndex: stackedDimCoordIndex_1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true, + storeDimIndex: dimensionDefineList.length + }; + var stackResultDimensionDefine = { + name: stackedOverDimension, + // This dimension contains stack base (generally, 0), so do not set it as + // `stackedDimCoordDim` to avoid extent calculation, consider log scale. + coordDim: stackedOverDimension, + coordDimIndex: stackedDimCoordIndex_1 + 1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true, + storeDimIndex: dimensionDefineList.length + 1 + }; + if (schema) { + if (store) { + stackedOverDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackedOverDimension, stackedDimType); + stackResultDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackResultDimension, stackedDimType); + } + schema.appendCalculationDimension(stackedOverDimensionDefine); + schema.appendCalculationDimension(stackResultDimensionDefine); + } else { + dimensionDefineList.push(stackedOverDimensionDefine); + dimensionDefineList.push(stackResultDimensionDefine); + } + } + return { + stackedDimension: stackedDimInfo && stackedDimInfo.name, + stackedByDimension: stackedByDimInfo && stackedByDimInfo.name, + isStackedByIndex: byIndex, + stackedOverDimension: stackedOverDimension, + stackResultDimension: stackResultDimension + }; +} +function isLegacyDimensionsInput(dimensionsInput) { + return !isSeriesDataSchema(dimensionsInput.schema); +} +function isDimensionStacked(data, stackedDim) { + // Each single series only maps to one pair of axis. So we do not need to + // check stackByDim, whatever stacked by a dimension or stacked by index. + return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension'); +} +function getStackedDimension(data, targetDim) { + return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim; +} + +function getCoordSysDimDefs(seriesModel, coordSysInfo) { + var coordSysName = seriesModel.get('coordinateSystem'); + var registeredCoordSys = CoordinateSystemManager.get(coordSysName); + var coordSysDimDefs; + if (coordSysInfo && coordSysInfo.coordSysDims) { + coordSysDimDefs = map$1(coordSysInfo.coordSysDims, function (dim) { + var dimInfo = { + name: dim + }; + var axisModel = coordSysInfo.axisMap.get(dim); + if (axisModel) { + var axisType = axisModel.get('type'); + dimInfo.type = getDimensionTypeByAxis(axisType); + } + return dimInfo; + }); + } + if (!coordSysDimDefs) { + // Get dimensions from registered coordinate system + coordSysDimDefs = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ['x', 'y']; + } + return coordSysDimDefs; +} +function injectOrdinalMeta(dimInfoList, createInvertedIndices, coordSysInfo) { + var firstCategoryDimIndex; + var hasNameEncode; + coordSysInfo && each$4(dimInfoList, function (dimInfo, dimIndex) { + var coordDim = dimInfo.coordDim; + var categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim); + if (categoryAxisModel) { + if (firstCategoryDimIndex == null) { + firstCategoryDimIndex = dimIndex; + } + dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta(); + if (createInvertedIndices) { + dimInfo.createInvertedIndices = true; + } + } + if (dimInfo.otherDims.itemName != null) { + hasNameEncode = true; + } + }); + if (!hasNameEncode && firstCategoryDimIndex != null) { + dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0; + } + return firstCategoryDimIndex; +} +/** + * Caution: there are side effects to `sourceManager` in this method. + * Should better only be called in `Series['getInitialData']`. + */ +function createSeriesData(sourceRaw, seriesModel, opt) { + opt = opt || {}; + var sourceManager = seriesModel.getSourceManager(); + var source; + var isOriginalSource = false; + { + source = sourceManager.getSource(); + // Is series.data. not dataset. + isOriginalSource = source.sourceFormat === SOURCE_FORMAT_ORIGINAL; + } + var coordSysInfo = getCoordSysInfoBySeries(seriesModel); + var coordSysDimDefs = getCoordSysDimDefs(seriesModel, coordSysInfo); + var useEncodeDefaulter = opt.useEncodeDefaulter; + var encodeDefaulter = isFunction(useEncodeDefaulter) ? useEncodeDefaulter : useEncodeDefaulter ? curry$1(makeSeriesEncodeForAxisCoordSys, coordSysDimDefs, seriesModel) : null; + var createDimensionOptions = { + coordDimensions: coordSysDimDefs, + generateCoord: opt.generateCoord, + encodeDefine: seriesModel.getEncode(), + encodeDefaulter: encodeDefaulter, + canOmitUnusedDimensions: !isOriginalSource + }; + var schema = prepareSeriesDataSchema(source, createDimensionOptions); + var firstCategoryDimIndex = injectOrdinalMeta(schema.dimensions, opt.createInvertedIndices, coordSysInfo); + var store = !isOriginalSource ? sourceManager.getSharedDataStore(schema) : null; + var stackCalculationInfo = enableDataStack(seriesModel, { + schema: schema, + store: store + }); + var data = new SeriesData(schema, seriesModel); + data.setCalculationInfo(stackCalculationInfo); + var dimValueGetter = firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source) ? function (itemOpt, dimName, dataIndex, dimIndex) { + // Use dataIndex as ordinal value in categoryAxis + return dimIndex === firstCategoryDimIndex ? dataIndex : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex); + } : null; + data.hasItemOption = false; + data.initData( + // Try to reuse the data store in sourceManager if using dataset. + isOriginalSource ? source : store, null, dimValueGetter); + return data; +} +function isNeedCompleteOrdinalData(source) { + if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var sampleItem = firstDataNotNull(source.data || []); + return !isArray(getDataItemValue(sampleItem)); + } +} +function firstDataNotNull(arr) { + var i = 0; + while (i < arr.length && arr[i] == null) { + i++; + } + return arr[i]; +} + +var Scale = /** @class */function () { + function Scale(setting) { + this._setting = setting || {}; + this._extent = [Infinity, -Infinity]; + } + Scale.prototype.getSetting = function (name) { + return this._setting[name]; + }; + /** + * Set extent from data + */ + Scale.prototype.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + // not setExtent because in log axis it may transformed to power + // this.setExtent(extent[0], extent[1]); + }; + /** + * Set extent from data + */ + Scale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Get extent + * + * Extent is always in increase order. + */ + Scale.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Set extent + */ + Scale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; + if (!isNaN(start)) { + thisExtent[0] = start; + } + if (!isNaN(end)) { + thisExtent[1] = end; + } + }; + /** + * If value is in extent range + */ + Scale.prototype.isInExtentRange = function (value) { + return this._extent[0] <= value && this._extent[1] >= value; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + Scale.prototype.isBlank = function () { + return this._isBlank; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + Scale.prototype.setBlank = function (isBlank) { + this._isBlank = isBlank; + }; + return Scale; +}(); +enableClassManagement(Scale); + +var uidBase = 0; +var OrdinalMeta = /** @class */function () { + function OrdinalMeta(opt) { + this.categories = opt.categories || []; + this._needCollect = opt.needCollect; + this._deduplication = opt.deduplication; + this.uid = ++uidBase; + } + OrdinalMeta.createByAxisModel = function (axisModel) { + var option = axisModel.option; + var data = option.data; + var categories = data && map$1(data, getName); + return new OrdinalMeta({ + categories: categories, + needCollect: !categories, + // deduplication is default in axis. + deduplication: option.dedplication !== false + }); + }; + OrdinalMeta.prototype.getOrdinal = function (category) { + // @ts-ignore + return this._getOrCreateMap().get(category); + }; + /** + * @return The ordinal. If not found, return NaN. + */ + OrdinalMeta.prototype.parseAndCollect = function (category) { + var index; + var needCollect = this._needCollect; + // The value of category dim can be the index of the given category set. + // This feature is only supported when !needCollect, because we should + // consider a common case: a value is 2017, which is a number but is + // expected to be tread as a category. This case usually happen in dataset, + // where it happent to be no need of the index feature. + if (!isString(category) && !needCollect) { + return category; + } + // Optimize for the scenario: + // category is ['2012-01-01', '2012-01-02', ...], where the input + // data has been ensured not duplicate and is large data. + // Notice, if a dataset dimension provide categroies, usually echarts + // should remove duplication except user tell echarts dont do that + // (set axis.deduplication = false), because echarts do not know whether + // the values in the category dimension has duplication (consider the + // parallel-aqi example) + if (needCollect && !this._deduplication) { + index = this.categories.length; + this.categories[index] = category; + return index; + } + var map = this._getOrCreateMap(); + // @ts-ignore + index = map.get(category); + if (index == null) { + if (needCollect) { + index = this.categories.length; + this.categories[index] = category; + // @ts-ignore + map.set(category, index); + } else { + index = NaN; + } + } + return index; + }; + // Consider big data, do not create map until needed. + OrdinalMeta.prototype._getOrCreateMap = function () { + return this._map || (this._map = createHashMap(this.categories)); + }; + return OrdinalMeta; +}(); +function getName(obj) { + if (isObject$2(obj) && obj.value != null) { + return obj.value; + } else { + return obj + ''; + } +} + +function isIntervalOrLogScale(scale) { + return scale.type === 'interval' || scale.type === 'log'; +} +/** + * @param extent Both extent[0] and extent[1] should be valid number. + * Should be extent[0] < extent[1]. + * @param splitNumber splitNumber should be >= 1. + */ +function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) { + var result = {}; + var span = extent[1] - extent[0]; + var interval = result.interval = nice(span / splitNumber); + if (minInterval != null && interval < minInterval) { + interval = result.interval = minInterval; + } + if (maxInterval != null && interval > maxInterval) { + interval = result.interval = maxInterval; + } + // Tow more digital for tick. + var precision = result.intervalPrecision = getIntervalPrecision(interval); + // Niced extent inside original extent + var niceTickExtent = result.niceTickExtent = [round$1(Math.ceil(extent[0] / interval) * interval, precision), round$1(Math.floor(extent[1] / interval) * interval, precision)]; + fixExtent(niceTickExtent, extent); + return result; +} +function increaseInterval(interval) { + var exp10 = Math.pow(10, quantityExponent(interval)); + // Increase interval + var f = interval / exp10; + if (!f) { + f = 1; + } else if (f === 2) { + f = 3; + } else if (f === 3) { + f = 5; + } else { + // f is 1 or 5 + f *= 2; + } + return round$1(f * exp10); +} +/** + * @return interval precision + */ +function getIntervalPrecision(interval) { + // Tow more digital for tick. + return getPrecision(interval) + 2; +} +function clamp(niceTickExtent, idx, extent) { + niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]); +} +// In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent. +function fixExtent(niceTickExtent, extent) { + !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]); + !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]); + clamp(niceTickExtent, 0, extent); + clamp(niceTickExtent, 1, extent); + if (niceTickExtent[0] > niceTickExtent[1]) { + niceTickExtent[0] = niceTickExtent[1]; + } +} +function contain(val, extent) { + return val >= extent[0] && val <= extent[1]; +} +function normalize(val, extent) { + if (extent[1] === extent[0]) { + return 0.5; + } + return (val - extent[0]) / (extent[1] - extent[0]); +} +function scale(val, extent) { + return val * (extent[1] - extent[0]) + extent[0]; +} + +var OrdinalScale = /** @class */function (_super) { + __extends(OrdinalScale, _super); + function OrdinalScale(setting) { + var _this = _super.call(this, setting) || this; + _this.type = 'ordinal'; + var ordinalMeta = _this.getSetting('ordinalMeta'); + // Caution: Should not use instanceof, consider ec-extensions using + // import approach to get OrdinalMeta class. + if (!ordinalMeta) { + ordinalMeta = new OrdinalMeta({}); + } + if (isArray(ordinalMeta)) { + ordinalMeta = new OrdinalMeta({ + categories: map$1(ordinalMeta, function (item) { + return isObject$2(item) ? item.value : item; + }) + }); + } + _this._ordinalMeta = ordinalMeta; + _this._extent = _this.getSetting('extent') || [0, ordinalMeta.categories.length - 1]; + return _this; + } + OrdinalScale.prototype.parse = function (val) { + // Caution: Math.round(null) will return `0` rather than `NaN` + if (val == null) { + return NaN; + } + return isString(val) ? this._ordinalMeta.getOrdinal(val) + // val might be float. + : Math.round(val); + }; + OrdinalScale.prototype.contain = function (rank) { + rank = this.parse(rank); + return contain(rank, this._extent) && this._ordinalMeta.categories[rank] != null; + }; + /** + * Normalize given rank or name to linear [0, 1] + * @param val raw ordinal number. + * @return normalized value in [0, 1]. + */ + OrdinalScale.prototype.normalize = function (val) { + val = this._getTickNumber(this.parse(val)); + return normalize(val, this._extent); + }; + /** + * @param val normalized value in [0, 1]. + * @return raw ordinal number. + */ + OrdinalScale.prototype.scale = function (val) { + val = Math.round(scale(val, this._extent)); + return this.getRawOrdinalNumber(val); + }; + OrdinalScale.prototype.getTicks = function () { + var ticks = []; + var extent = this._extent; + var rank = extent[0]; + while (rank <= extent[1]) { + ticks.push({ + value: rank + }); + rank++; + } + return ticks; + }; + OrdinalScale.prototype.getMinorTicks = function (splitNumber) { + // Not support. + return; + }; + /** + * @see `Ordinal['_ordinalNumbersByTick']` + */ + OrdinalScale.prototype.setSortInfo = function (info) { + if (info == null) { + this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null; + return; + } + var infoOrdinalNumbers = info.ordinalNumbers; + var ordinalsByTick = this._ordinalNumbersByTick = []; + var ticksByOrdinal = this._ticksByOrdinalNumber = []; + // Unnecessary support negative tick in `realtimeSort`. + var tickNum = 0; + var allCategoryLen = this._ordinalMeta.categories.length; + for (var len = Math.min(allCategoryLen, infoOrdinalNumbers.length); tickNum < len; ++tickNum) { + var ordinalNumber = infoOrdinalNumbers[tickNum]; + ordinalsByTick[tickNum] = ordinalNumber; + ticksByOrdinal[ordinalNumber] = tickNum; + } + // Handle that `series.data` only covers part of the `axis.category.data`. + var unusedOrdinal = 0; + for (; tickNum < allCategoryLen; ++tickNum) { + while (ticksByOrdinal[unusedOrdinal] != null) { + unusedOrdinal++; + } + ordinalsByTick.push(unusedOrdinal); + ticksByOrdinal[unusedOrdinal] = tickNum; + } + }; + OrdinalScale.prototype._getTickNumber = function (ordinal) { + var ticksByOrdinalNumber = this._ticksByOrdinalNumber; + // also support ordinal out of range of `ordinalMeta.categories.length`, + // where ordinal numbers are used as tick value directly. + return ticksByOrdinalNumber && ordinal >= 0 && ordinal < ticksByOrdinalNumber.length ? ticksByOrdinalNumber[ordinal] : ordinal; + }; + /** + * @usage + * ```js + * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal); + * + * // case0 + * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber]; + * // case1 + * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber]; + * // case2 + * const coord = axis.dataToCoord(ordinalNumber); + * ``` + * + * @param {OrdinalNumber} tickNumber index of display + */ + OrdinalScale.prototype.getRawOrdinalNumber = function (tickNumber) { + var ordinalNumbersByTick = this._ordinalNumbersByTick; + // tickNumber may be out of range, e.g., when axis max is larger than `ordinalMeta.categories.length`., + // where ordinal numbers are used as tick value directly. + return ordinalNumbersByTick && tickNumber >= 0 && tickNumber < ordinalNumbersByTick.length ? ordinalNumbersByTick[tickNumber] : tickNumber; + }; + /** + * Get item on tick + */ + OrdinalScale.prototype.getLabel = function (tick) { + if (!this.isBlank()) { + var ordinalNumber = this.getRawOrdinalNumber(tick.value); + var cateogry = this._ordinalMeta.categories[ordinalNumber]; + // Note that if no data, ordinalMeta.categories is an empty array. + // Return empty if it's not exist. + return cateogry == null ? '' : cateogry + ''; + } + }; + OrdinalScale.prototype.count = function () { + return this._extent[1] - this._extent[0] + 1; + }; + OrdinalScale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * @override + * If value is in extent range + */ + OrdinalScale.prototype.isInExtentRange = function (value) { + value = this._getTickNumber(value); + return this._extent[0] <= value && this._extent[1] >= value; + }; + OrdinalScale.prototype.getOrdinalMeta = function () { + return this._ordinalMeta; + }; + OrdinalScale.prototype.calcNiceTicks = function () {}; + OrdinalScale.prototype.calcNiceExtent = function () {}; + OrdinalScale.type = 'ordinal'; + return OrdinalScale; +}(Scale); +Scale.registerClass(OrdinalScale); + +var roundNumber = round$1; +var IntervalScale = /** @class */function (_super) { + __extends(IntervalScale, _super); + function IntervalScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = 'interval'; + // Step is calculated in adjustExtent. + _this._interval = 0; + _this._intervalPrecision = 2; + return _this; + } + IntervalScale.prototype.parse = function (val) { + return val; + }; + IntervalScale.prototype.contain = function (val) { + return contain(val, this._extent); + }; + IntervalScale.prototype.normalize = function (val) { + return normalize(val, this._extent); + }; + IntervalScale.prototype.scale = function (val) { + return scale(val, this._extent); + }; + IntervalScale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; + // start,end may be a Number like '25',so... + if (!isNaN(start)) { + thisExtent[0] = parseFloat(start); + } + if (!isNaN(end)) { + thisExtent[1] = parseFloat(end); + } + }; + IntervalScale.prototype.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + // unionExtent may called by it's sub classes + this.setExtent(extent[0], extent[1]); + }; + IntervalScale.prototype.getInterval = function () { + return this._interval; + }; + IntervalScale.prototype.setInterval = function (interval) { + this._interval = interval; + // Dropped auto calculated niceExtent and use user-set extent. + // We assume user wants to set both interval, min, max to get a better result. + this._niceExtent = this._extent.slice(); + this._intervalPrecision = getIntervalPrecision(interval); + }; + /** + * @param expandToNicedExtent Whether expand the ticks to niced extent. + */ + IntervalScale.prototype.getTicks = function (expandToNicedExtent) { + var interval = this._interval; + var extent = this._extent; + var niceTickExtent = this._niceExtent; + var intervalPrecision = this._intervalPrecision; + var ticks = []; + // If interval is 0, return []; + if (!interval) { + return ticks; + } + // Consider this case: using dataZoom toolbox, zoom and zoom. + var safeLimit = 10000; + if (extent[0] < niceTickExtent[0]) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber(niceTickExtent[0] - interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[0] + }); + } + } + var tick = niceTickExtent[0]; + while (tick <= niceTickExtent[1]) { + ticks.push({ + value: tick + }); + // Avoid rounding error + tick = roundNumber(tick + interval, intervalPrecision); + if (tick === ticks[ticks.length - 1].value) { + // Consider out of safe float point, e.g., + // -3711126.9907707 + 2e-10 === -3711126.9907707 + break; + } + if (ticks.length > safeLimit) { + return []; + } + } + // Consider this case: the last item of ticks is smaller + // than niceTickExtent[1] and niceTickExtent[1] === extent[1]. + var lastNiceTick = ticks.length ? ticks[ticks.length - 1].value : niceTickExtent[1]; + if (extent[1] > lastNiceTick) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber(lastNiceTick + interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[1] + }); + } + } + return ticks; + }; + IntervalScale.prototype.getMinorTicks = function (splitNumber) { + var ticks = this.getTicks(true); + var minorTicks = []; + var extent = this.getExtent(); + for (var i = 1; i < ticks.length; i++) { + var nextTick = ticks[i]; + var prevTick = ticks[i - 1]; + var count = 0; + var minorTicksGroup = []; + var interval = nextTick.value - prevTick.value; + var minorInterval = interval / splitNumber; + while (count < splitNumber - 1) { + var minorTick = roundNumber(prevTick.value + (count + 1) * minorInterval); + // For the first and last interval. The count may be less than splitNumber. + if (minorTick > extent[0] && minorTick < extent[1]) { + minorTicksGroup.push(minorTick); + } + count++; + } + minorTicks.push(minorTicksGroup); + } + return minorTicks; + }; + /** + * @param opt.precision If 'auto', use nice presision. + * @param opt.pad returns 1.50 but not 1.5 if precision is 2. + */ + IntervalScale.prototype.getLabel = function (data, opt) { + if (data == null) { + return ''; + } + var precision = opt && opt.precision; + if (precision == null) { + precision = getPrecision(data.value) || 0; + } else if (precision === 'auto') { + // Should be more precise then tick. + precision = this._intervalPrecision; + } + // (1) If `precision` is set, 12.005 should be display as '12.00500'. + // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'. + var dataNum = roundNumber(data.value, precision, true); + return addCommas(dataNum); + }; + /** + * @param splitNumber By default `5`. + */ + IntervalScale.prototype.calcNiceTicks = function (splitNumber, minInterval, maxInterval) { + splitNumber = splitNumber || 5; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (!isFinite(span)) { + return; + } + // User may set axis min 0 and data are all negative + // FIXME If it needs to reverse ? + if (span < 0) { + span = -span; + extent.reverse(); + } + var result = intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval); + this._intervalPrecision = result.intervalPrecision; + this._interval = result.interval; + this._niceExtent = result.niceTickExtent; + }; + IntervalScale.prototype.calcNiceExtent = function (opt) { + var extent = this._extent; + // If extent start and end are same, expand them + if (extent[0] === extent[1]) { + if (extent[0] !== 0) { + // Expand extent + // Note that extents can be both negative. See #13154 + var expandSize = Math.abs(extent[0]); + // In the fowllowing case + // Axis has been fixed max 100 + // Plus data are all 100 and axis extent are [100, 100]. + // Extend to the both side will cause expanded max is larger than fixed max. + // So only expand to the smaller side. + if (!opt.fixMax) { + extent[1] += expandSize / 2; + extent[0] -= expandSize / 2; + } else { + extent[0] -= expandSize / 2; + } + } else { + extent[1] = 1; + } + } + var span = extent[1] - extent[0]; + // If there are no data and extent are [Infinity, -Infinity] + if (!isFinite(span)) { + extent[0] = 0; + extent[1] = 1; + } + this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); + // let extent = this._extent; + var interval = this._interval; + if (!opt.fixMin) { + extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval); + } + if (!opt.fixMax) { + extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval); + } + }; + IntervalScale.prototype.setNiceExtent = function (min, max) { + this._niceExtent = [min, max]; + }; + IntervalScale.type = 'interval'; + return IntervalScale; +}(Scale); +Scale.registerClass(IntervalScale); + +/* global Float32Array */ +var supportFloat32Array = typeof Float32Array !== 'undefined'; +var Float32ArrayCtor = !supportFloat32Array ? Array : Float32Array; +function createFloat32Array(arg) { + if (isArray(arg)) { + // Return self directly if don't support TypedArray. + return supportFloat32Array ? new Float32Array(arg) : arg; + } + // Else is number + return new Float32ArrayCtor(arg); +} + +var STACK_PREFIX = '__ec_stack_'; +function getSeriesStackId(seriesModel) { + return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex; +} +function getAxisKey(axis) { + return axis.dim + axis.index; +} +function prepareLayoutBarSeries(seriesType, ecModel) { + var seriesModels = []; + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for cartesian2d only + if (isOnCartesian(seriesModel)) { + seriesModels.push(seriesModel); + } + }); + return seriesModels; +} +/** + * Map from (baseAxis.dim + '_' + baseAxis.index) to min gap of two adjacent + * values. + * This works for time axes, value axes, and log axes. + * For a single time axis, return value is in the form like + * {'x_0': [1000000]}. + * The value of 1000000 is in milliseconds. + */ +function getValueAxesMinGaps(barSeries) { + /** + * Map from axis.index to values. + * For a single time axis, axisValues is in the form like + * {'x_0': [1495555200000, 1495641600000, 1495728000000]}. + * Items in axisValues[x], e.g. 1495555200000, are time values of all + * series. + */ + var axisValues = {}; + each$4(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + if (baseAxis.type !== 'time' && baseAxis.type !== 'value') { + return; + } + var data = seriesModel.getData(); + var key = baseAxis.dim + '_' + baseAxis.index; + var dimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim)); + var store = data.getStore(); + for (var i = 0, cnt = store.count(); i < cnt; ++i) { + var value = store.get(dimIdx, i); + if (!axisValues[key]) { + // No previous data for the axis + axisValues[key] = [value]; + } else { + // No value in previous series + axisValues[key].push(value); + } + // Ignore duplicated time values in the same axis + } + }); + var axisMinGaps = {}; + for (var key in axisValues) { + if (axisValues.hasOwnProperty(key)) { + var valuesInAxis = axisValues[key]; + if (valuesInAxis) { + // Sort axis values into ascending order to calculate gaps + valuesInAxis.sort(function (a, b) { + return a - b; + }); + var min = null; + for (var j = 1; j < valuesInAxis.length; ++j) { + var delta = valuesInAxis[j] - valuesInAxis[j - 1]; + if (delta > 0) { + // Ignore 0 delta because they are of the same axis value + min = min === null ? delta : Math.min(min, delta); + } + } + // Set to null if only have one data + axisMinGaps[key] = min; + } + } + } + return axisMinGaps; +} +function makeColumnLayout(barSeries) { + var axisMinGaps = getValueAxesMinGaps(barSeries); + var seriesInfoList = []; + each$4(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var axisExtent = baseAxis.getExtent(); + var bandWidth; + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } else if (baseAxis.type === 'value' || baseAxis.type === 'time') { + var key = baseAxis.dim + '_' + baseAxis.index; + var minGap = axisMinGaps[key]; + var extentSpan = Math.abs(axisExtent[1] - axisExtent[0]); + var scale = baseAxis.scale.getExtent(); + var scaleSpan = Math.abs(scale[1] - scale[0]); + bandWidth = minGap ? extentSpan / scaleSpan * minGap : extentSpan; // When there is only one data value + } else { + var data = seriesModel.getData(); + bandWidth = Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + } + var barWidth = parsePercent(seriesModel.get('barWidth'), bandWidth); + var barMaxWidth = parsePercent(seriesModel.get('barMaxWidth'), bandWidth); + var barMinWidth = parsePercent( + // barMinWidth by default is 0.5 / 1 in cartesian. Because in value axis, + // the auto-calculated bar width might be less than 0.5 / 1. + seriesModel.get('barMinWidth') || (isInLargeMode(seriesModel) ? 0.5 : 1), bandWidth); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + seriesInfoList.push({ + bandWidth: bandWidth, + barWidth: barWidth, + barMaxWidth: barMaxWidth, + barMinWidth: barMinWidth, + barGap: barGap, + barCategoryGap: barCategoryGap, + axisKey: getAxisKey(baseAxis), + stackId: getSeriesStackId(seriesModel) + }); + }); + return doCalBarWidthAndOffset(seriesInfoList); +} +function doCalBarWidthAndOffset(seriesInfoList) { + // Columns info on each category axis. Key is cartesian name + var columnsMap = {}; + each$4(seriesInfoList, function (seriesInfo, idx) { + var axisKey = seriesInfo.axisKey; + var bandWidth = seriesInfo.bandWidth; + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: null, + gap: '20%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + var stackId = seriesInfo.stackId; + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + // Caution: In a single coordinate system, these barGrid attributes + // will be shared by series. Consider that they have default values, + // only the attributes set on the last series will work. + // Do not change this fact unless there will be a break change. + var barWidth = seriesInfo.barWidth; + if (barWidth && !stacks[stackId].width) { + // See #6312, do not restrict width. + stacks[stackId].width = barWidth; + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + columnsOnAxis.remainedWidth -= barWidth; + } + var barMaxWidth = seriesInfo.barMaxWidth; + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + var barMinWidth = seriesInfo.barMinWidth; + barMinWidth && (stacks[stackId].minWidth = barMinWidth); + var barGap = seriesInfo.barGap; + barGap != null && (columnsOnAxis.gap = barGap); + var barCategoryGap = seriesInfo.barCategoryGap; + barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); + }); + var result = {}; + each$4(columnsMap, function (columnsOnAxis, coordSysName) { + result[coordSysName] = {}; + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGapPercent = columnsOnAxis.categoryGap; + if (categoryGapPercent == null) { + var columnCount = keys(stacks).length; + // More columns in one group + // the spaces between group is smaller. Or the column will be too thin. + categoryGapPercent = Math.max(35 - columnCount * 4, 15) + '%'; + } + var categoryGap = parsePercent(categoryGapPercent, bandWidth); + var barGapPercent = parsePercent(columnsOnAxis.gap, 1); + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + // Find if any auto calculated bar exceeded maxBarWidth + each$4(stacks, function (column) { + var maxWidth = column.maxWidth; + var minWidth = column.minWidth; + if (!column.width) { + var finalWidth = autoWidth; + if (maxWidth && maxWidth < finalWidth) { + finalWidth = Math.min(maxWidth, remainedWidth); + } + // `minWidth` has higher priority. `minWidth` decide that whether the + // bar is able to be visible. So `minWidth` should not be restricted + // by `maxWidth` or `remainedWidth` (which is from `bandWidth`). In + // the extreme cases for `value` axis, bars are allowed to overlap + // with each other if `minWidth` specified. + if (minWidth && minWidth > finalWidth) { + finalWidth = minWidth; + } + if (finalWidth !== autoWidth) { + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + } else { + // `barMinWidth/barMaxWidth` has higher priority than `barWidth`, as + // CSS does. Because barWidth can be a percent value, where + // `barMaxWidth` can be used to restrict the final width. + var finalWidth = column.width; + if (maxWidth) { + finalWidth = Math.min(finalWidth, maxWidth); + } + // `minWidth` has higher priority, as described above + if (minWidth) { + finalWidth = Math.max(finalWidth, minWidth); + } + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + }); + // Recalculate width again + autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + var widthSum = 0; + var lastColumn; + each$4(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + var offset = -widthSum / 2; + each$4(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + bandWidth: bandWidth, + offset: offset, + width: column.width + }; + offset += column.width * (1 + barGapPercent); + }); + }); + return result; +} +function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) { + if (barWidthAndOffset && axis) { + var result = barWidthAndOffset[getAxisKey(axis)]; + return result; + } +} +function isOnCartesian(seriesModel) { + return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d'; +} +function isInLargeMode(seriesModel) { + return seriesModel.pipelineContext && seriesModel.pipelineContext.large; +} + +var bisect = function(a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + if (a[mid][1] < x) { + lo = mid + 1; + } else { + hi = mid; + } + } + return lo; +}; +var TimeScale = ( + /** @class */ + function(_super) { + __extends(TimeScale2, _super); + function TimeScale2(settings) { + var _this = _super.call(this, settings) || this; + _this.type = "time"; + return _this; + } + TimeScale2.prototype.getLabel = function(tick) { + var useUTC = this.getSetting("useUTC"); + return format(tick.value, fullLeveledFormatter[getDefaultFormatPrecisionOfInterval(getPrimaryTimeUnit(this._minLevelUnit))] || fullLeveledFormatter.second, useUTC, this.getSetting("locale")); + }; + TimeScale2.prototype.getFormattedLabel = function(tick, idx, labelFormatter) { + var isUTC = this.getSetting("useUTC"); + var lang = this.getSetting("locale"); + return leveledFormat(tick, idx, labelFormatter, lang, isUTC); + }; + TimeScale2.prototype.getTicks = function() { + var interval = this._interval; + var extent = this._extent; + var ticks = []; + if (!interval) { + return ticks; + } + ticks.push({ + value: extent[0], + level: 0 + }); + var useUTC = this.getSetting("useUTC"); + var innerTicks = getIntervalTicks(this._minLevelUnit, this._approxInterval, useUTC, extent); + ticks = ticks.concat(innerTicks); + ticks.push({ + value: extent[1], + level: 0 + }); + return ticks; + }; + TimeScale2.prototype.calcNiceExtent = function(opt) { + var extent = this._extent; + if (extent[0] === extent[1]) { + extent[0] -= ONE_DAY; + extent[1] += ONE_DAY; + } + if (extent[1] === -Infinity && extent[0] === Infinity) { + var d = /* @__PURE__ */ new Date(); + extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate()); + extent[0] = extent[1] - ONE_DAY; + } + this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); + }; + TimeScale2.prototype.calcNiceTicks = function(approxTickNum, minInterval, maxInterval) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + this._approxInterval = span / approxTickNum; + if (minInterval != null && this._approxInterval < minInterval) { + this._approxInterval = minInterval; + } + if (maxInterval != null && this._approxInterval > maxInterval) { + this._approxInterval = maxInterval; + } + var scaleIntervalsLen = scaleIntervals.length; + var idx = Math.min(bisect(scaleIntervals, this._approxInterval, 0, scaleIntervalsLen), scaleIntervalsLen - 1); + this._interval = scaleIntervals[idx][1]; + this._minLevelUnit = scaleIntervals[Math.max(idx - 1, 0)][0]; + }; + TimeScale2.prototype.parse = function(val) { + return isNumber(val) ? val : +parseDate(val); + }; + TimeScale2.prototype.contain = function(val) { + return contain(this.parse(val), this._extent); + }; + TimeScale2.prototype.normalize = function(val) { + return normalize(this.parse(val), this._extent); + }; + TimeScale2.prototype.scale = function(val) { + return scale(val, this._extent); + }; + TimeScale2.type = "time"; + return TimeScale2; + }(IntervalScale) +); +var scaleIntervals = [ + // Format interval + ["second", ONE_SECOND], + ["minute", ONE_MINUTE], + ["hour", ONE_HOUR], + ["quarter-day", ONE_HOUR * 6], + ["half-day", ONE_HOUR * 12], + ["day", ONE_DAY * 1.2], + ["half-week", ONE_DAY * 3.5], + ["week", ONE_DAY * 7], + ["month", ONE_DAY * 31], + ["quarter", ONE_DAY * 95], + ["half-year", ONE_YEAR / 2], + ["year", ONE_YEAR] + // 1Y +]; +function isUnitValueSame(unit, valueA, valueB, isUTC) { + var dateA = parseDate(valueA); + var dateB = parseDate(valueB); + var isSame = function(unit2) { + return getUnitValue(dateA, unit2, isUTC) === getUnitValue(dateB, unit2, isUTC); + }; + var isSameYear = function() { + return isSame("year"); + }; + var isSameMonth = function() { + return isSameYear() && isSame("month"); + }; + var isSameDay = function() { + return isSameMonth() && isSame("day"); + }; + var isSameHour = function() { + return isSameDay() && isSame("hour"); + }; + var isSameMinute = function() { + return isSameHour() && isSame("minute"); + }; + var isSameSecond = function() { + return isSameMinute() && isSame("second"); + }; + var isSameMilliSecond = function() { + return isSameSecond() && isSame("millisecond"); + }; + switch (unit) { + case "year": + return isSameYear(); + case "month": + return isSameMonth(); + case "day": + return isSameDay(); + case "hour": + return isSameHour(); + case "minute": + return isSameMinute(); + case "second": + return isSameSecond(); + case "millisecond": + return isSameMilliSecond(); + } +} +function getDateInterval(approxInterval, daysInMonth) { + approxInterval /= ONE_DAY; + return approxInterval > 16 ? 16 : approxInterval > 7.5 ? 7 : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1; +} +function getMonthInterval(approxInterval) { + var APPROX_ONE_MONTH = 30 * ONE_DAY; + approxInterval /= APPROX_ONE_MONTH; + return approxInterval > 6 ? 6 : approxInterval > 3 ? 3 : approxInterval > 2 ? 2 : 1; +} +function getHourInterval(approxInterval) { + approxInterval /= ONE_HOUR; + return approxInterval > 12 ? 12 : approxInterval > 6 ? 6 : approxInterval > 3.5 ? 4 : approxInterval > 2 ? 2 : 1; +} +function getMinutesAndSecondsInterval(approxInterval, isMinutes) { + approxInterval /= isMinutes ? ONE_MINUTE : ONE_SECOND; + return approxInterval > 30 ? 30 : approxInterval > 20 ? 20 : approxInterval > 15 ? 15 : approxInterval > 10 ? 10 : approxInterval > 5 ? 5 : approxInterval > 2 ? 2 : 1; +} +function getMillisecondsInterval(approxInterval) { + return nice(approxInterval); +} +function getFirstTimestampOfUnit(date, unitName, isUTC) { + var outDate = new Date(date); + switch (getPrimaryTimeUnit(unitName)) { + case "year": + case "month": + outDate[monthSetterName(isUTC)](0); + case "day": + outDate[dateSetterName(isUTC)](1); + case "hour": + outDate[hoursSetterName(isUTC)](0); + case "minute": + outDate[minutesSetterName(isUTC)](0); + case "second": + outDate[secondsSetterName(isUTC)](0); + outDate[millisecondsSetterName(isUTC)](0); + } + return outDate.getTime(); +} +function getIntervalTicks(bottomUnitName, approxInterval, isUTC, extent) { + var safeLimit = 1e4; + var unitNames = timeUnits; + var iter = 0; + function addTicksInSpan(interval, minTimestamp, maxTimestamp, getMethodName, setMethodName, isDate, out) { + var date = new Date(minTimestamp); + var dateTime = minTimestamp; + var d = date[getMethodName](); + while (dateTime < maxTimestamp && dateTime <= extent[1]) { + out.push({ + value: dateTime + }); + d += interval; + date[setMethodName](d); + dateTime = date.getTime(); + } + out.push({ + value: dateTime, + notAdd: true + }); + } + function addLevelTicks(unitName, lastLevelTicks, levelTicks2) { + var newAddedTicks = []; + var isFirstLevel = !lastLevelTicks.length; + if (isUnitValueSame(getPrimaryTimeUnit(unitName), extent[0], extent[1], isUTC)) { + return; + } + if (isFirstLevel) { + lastLevelTicks = [{ + // TODO Optimize. Not include so may ticks. + value: getFirstTimestampOfUnit(new Date(extent[0]), unitName, isUTC) + }, { + value: extent[1] + }]; + } + for (var i2 = 0; i2 < lastLevelTicks.length - 1; i2++) { + var startTick = lastLevelTicks[i2].value; + var endTick = lastLevelTicks[i2 + 1].value; + if (startTick === endTick) { + continue; + } + var interval = void 0; + var getterName = void 0; + var setterName = void 0; + var isDate = false; + switch (unitName) { + case "year": + interval = Math.max(1, Math.round(approxInterval / ONE_DAY / 365)); + getterName = fullYearGetterName(isUTC); + setterName = fullYearSetterName(isUTC); + break; + case "half-year": + case "quarter": + case "month": + interval = getMonthInterval(approxInterval); + getterName = monthGetterName(isUTC); + setterName = monthSetterName(isUTC); + break; + case "week": + case "half-week": + case "day": + interval = getDateInterval(approxInterval); + getterName = dateGetterName(isUTC); + setterName = dateSetterName(isUTC); + isDate = true; + break; + case "half-day": + case "quarter-day": + case "hour": + interval = getHourInterval(approxInterval); + getterName = hoursGetterName(isUTC); + setterName = hoursSetterName(isUTC); + break; + case "minute": + interval = getMinutesAndSecondsInterval(approxInterval, true); + getterName = minutesGetterName(isUTC); + setterName = minutesSetterName(isUTC); + break; + case "second": + interval = getMinutesAndSecondsInterval(approxInterval, false); + getterName = secondsGetterName(isUTC); + setterName = secondsSetterName(isUTC); + break; + case "millisecond": + interval = getMillisecondsInterval(approxInterval); + getterName = millisecondsGetterName(isUTC); + setterName = millisecondsSetterName(isUTC); + break; + } + addTicksInSpan(interval, startTick, endTick, getterName, setterName, isDate, newAddedTicks); + if (unitName === "year" && levelTicks2.length > 1 && i2 === 0) { + levelTicks2.unshift({ + value: levelTicks2[0].value - interval + }); + } + } + for (var i2 = 0; i2 < newAddedTicks.length; i2++) { + levelTicks2.push(newAddedTicks[i2]); + } + return newAddedTicks; + } + var levelsTicks = []; + var currentLevelTicks = []; + var tickCount = 0; + var lastLevelTickCount = 0; + for (var i = 0; i < unitNames.length && iter++ < safeLimit; ++i) { + var primaryTimeUnit = getPrimaryTimeUnit(unitNames[i]); + if (!isPrimaryTimeUnit(unitNames[i])) { + continue; + } + addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks); + var nextPrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null; + if (primaryTimeUnit !== nextPrimaryTimeUnit) { + if (currentLevelTicks.length) { + lastLevelTickCount = tickCount; + currentLevelTicks.sort(function(a, b) { + return a.value - b.value; + }); + var levelTicksRemoveDuplicated = []; + for (var i_1 = 0; i_1 < currentLevelTicks.length; ++i_1) { + var tickValue = currentLevelTicks[i_1].value; + if (i_1 === 0 || currentLevelTicks[i_1 - 1].value !== tickValue) { + levelTicksRemoveDuplicated.push(currentLevelTicks[i_1]); + if (tickValue >= extent[0] && tickValue <= extent[1]) { + tickCount++; + } + } + } + var targetTickNum = (extent[1] - extent[0]) / approxInterval; + if (tickCount > targetTickNum * 1.5 && lastLevelTickCount > targetTickNum / 1.5) { + break; + } + levelsTicks.push(levelTicksRemoveDuplicated); + if (tickCount > targetTickNum || bottomUnitName === unitNames[i]) { + break; + } + } + currentLevelTicks = []; + } + } + var levelsTicksInExtent = filter(map$1(levelsTicks, function(levelTicks2) { + return filter(levelTicks2, function(tick) { + return tick.value >= extent[0] && tick.value <= extent[1] && !tick.notAdd; + }); + }), function(levelTicks2) { + return levelTicks2.length > 0; + }); + var ticks = []; + var maxLevel = levelsTicksInExtent.length - 1; + for (var i = 0; i < levelsTicksInExtent.length; ++i) { + var levelTicks = levelsTicksInExtent[i]; + for (var k = 0; k < levelTicks.length; ++k) { + ticks.push({ + value: levelTicks[k].value, + level: maxLevel - i + }); + } + } + ticks.sort(function(a, b) { + return a.value - b.value; + }); + var result = []; + for (var i = 0; i < ticks.length; ++i) { + if (i === 0 || ticks[i].value !== ticks[i - 1].value) { + result.push(ticks[i]); + } + } + return result; +} +Scale.registerClass(TimeScale); + +var scaleProto = Scale.prototype; +// FIXME:TS refactor: not good to call it directly with `this`? +var intervalScaleProto = IntervalScale.prototype; +var roundingErrorFix = round$1; +var mathFloor = Math.floor; +var mathCeil = Math.ceil; +var mathPow = Math.pow; +var mathLog$1 = Math.log; +var LogScale = /** @class */function (_super) { + __extends(LogScale, _super); + function LogScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = 'log'; + _this.base = 10; + _this._originalScale = new IntervalScale(); + // FIXME:TS actually used by `IntervalScale` + _this._interval = 0; + return _this; + } + /** + * @param Whether expand the ticks to niced extent. + */ + LogScale.prototype.getTicks = function (expandToNicedExtent) { + var originalScale = this._originalScale; + var extent = this._extent; + var originalExtent = originalScale.getExtent(); + var ticks = intervalScaleProto.getTicks.call(this, expandToNicedExtent); + return map$1(ticks, function (tick) { + var val = tick.value; + var powVal = round$1(mathPow(this.base, val)); + // Fix #4158 + powVal = val === extent[0] && this._fixMin ? fixRoundingError(powVal, originalExtent[0]) : powVal; + powVal = val === extent[1] && this._fixMax ? fixRoundingError(powVal, originalExtent[1]) : powVal; + return { + value: powVal + }; + }, this); + }; + LogScale.prototype.setExtent = function (start, end) { + var base = mathLog$1(this.base); + // log(-Infinity) is NaN, so safe guard here + start = mathLog$1(Math.max(0, start)) / base; + end = mathLog$1(Math.max(0, end)) / base; + intervalScaleProto.setExtent.call(this, start, end); + }; + /** + * @return {number} end + */ + LogScale.prototype.getExtent = function () { + var base = this.base; + var extent = scaleProto.getExtent.call(this); + extent[0] = mathPow(base, extent[0]); + extent[1] = mathPow(base, extent[1]); + // Fix #4158 + var originalScale = this._originalScale; + var originalExtent = originalScale.getExtent(); + this._fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0])); + this._fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1])); + return extent; + }; + LogScale.prototype.unionExtent = function (extent) { + this._originalScale.unionExtent(extent); + var base = this.base; + extent[0] = mathLog$1(extent[0]) / mathLog$1(base); + extent[1] = mathLog$1(extent[1]) / mathLog$1(base); + scaleProto.unionExtent.call(this, extent); + }; + LogScale.prototype.unionExtentFromData = function (data, dim) { + // TODO + // filter value that <= 0 + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Update interval and extent of intervals for nice ticks + * @param approxTickNum default 10 Given approx tick number + */ + LogScale.prototype.calcNiceTicks = function (approxTickNum) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (span === Infinity || span <= 0) { + return; + } + var interval = quantity(span); + var err = approxTickNum / span * interval; + // Filter ticks to get closer to the desired count. + if (err <= 0.5) { + interval *= 10; + } + // Interval should be integer + while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) { + interval *= 10; + } + var niceExtent = [round$1(mathCeil(extent[0] / interval) * interval), round$1(mathFloor(extent[1] / interval) * interval)]; + this._interval = interval; + this._niceExtent = niceExtent; + }; + LogScale.prototype.calcNiceExtent = function (opt) { + intervalScaleProto.calcNiceExtent.call(this, opt); + this._fixMin = opt.fixMin; + this._fixMax = opt.fixMax; + }; + LogScale.prototype.parse = function (val) { + return val; + }; + LogScale.prototype.contain = function (val) { + val = mathLog$1(val) / mathLog$1(this.base); + return contain(val, this._extent); + }; + LogScale.prototype.normalize = function (val) { + val = mathLog$1(val) / mathLog$1(this.base); + return normalize(val, this._extent); + }; + LogScale.prototype.scale = function (val) { + val = scale(val, this._extent); + return mathPow(this.base, val); + }; + LogScale.type = 'log'; + return LogScale; +}(Scale); +var proto = LogScale.prototype; +proto.getMinorTicks = intervalScaleProto.getMinorTicks; +proto.getLabel = intervalScaleProto.getLabel; +function fixRoundingError(val, originalVal) { + return roundingErrorFix(val, getPrecision(originalVal)); +} +Scale.registerClass(LogScale); + +var ScaleRawExtentInfo = ( + /** @class */ + function() { + function ScaleRawExtentInfo2(scale, model, originalExtent) { + this._prepareParams(scale, model, originalExtent); + } + ScaleRawExtentInfo2.prototype._prepareParams = function(scale, model, dataExtent) { + if (dataExtent[1] < dataExtent[0]) { + dataExtent = [NaN, NaN]; + } + this._dataMin = dataExtent[0]; + this._dataMax = dataExtent[1]; + var isOrdinal = this._isOrdinal = scale.type === "ordinal"; + this._needCrossZero = scale.type === "interval" && model.getNeedCrossZero && model.getNeedCrossZero(); + var axisMinValue = model.get("min", true); + if (axisMinValue == null) { + axisMinValue = model.get("startValue", true); + } + var modelMinRaw = this._modelMinRaw = axisMinValue; + if (isFunction(modelMinRaw)) { + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMinRaw !== "dataMin") { + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw); + } + var modelMaxRaw = this._modelMaxRaw = model.get("max", true); + if (isFunction(modelMaxRaw)) { + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMaxRaw !== "dataMax") { + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw); + } + if (isOrdinal) { + this._axisDataLen = model.getCategories().length; + } else { + var boundaryGap = model.get("boundaryGap"); + var boundaryGapArr = isArray(boundaryGap) ? boundaryGap : [boundaryGap || 0, boundaryGap || 0]; + if (typeof boundaryGapArr[0] === "boolean" || typeof boundaryGapArr[1] === "boolean") { + this._boundaryGapInner = [0, 0]; + } else { + this._boundaryGapInner = [parsePercent$1(boundaryGapArr[0], 1), parsePercent$1(boundaryGapArr[1], 1)]; + } + } + }; + ScaleRawExtentInfo2.prototype.calculate = function() { + var isOrdinal = this._isOrdinal; + var dataMin = this._dataMin; + var dataMax = this._dataMax; + var axisDataLen = this._axisDataLen; + var boundaryGapInner = this._boundaryGapInner; + var span = !isOrdinal ? dataMax - dataMin || Math.abs(dataMin) : null; + var min = this._modelMinRaw === "dataMin" ? dataMin : this._modelMinNum; + var max = this._modelMaxRaw === "dataMax" ? dataMax : this._modelMaxNum; + var minFixed = min != null; + var maxFixed = max != null; + if (min == null) { + min = isOrdinal ? axisDataLen ? 0 : NaN : dataMin - boundaryGapInner[0] * span; + } + if (max == null) { + max = isOrdinal ? axisDataLen ? axisDataLen - 1 : NaN : dataMax + boundaryGapInner[1] * span; + } + (min == null || !isFinite(min)) && (min = NaN); + (max == null || !isFinite(max)) && (max = NaN); + var isBlank = eqNaN(min) || eqNaN(max) || isOrdinal && !axisDataLen; + if (this._needCrossZero) { + if (min > 0 && max > 0 && !minFixed) { + min = 0; + } + if (min < 0 && max < 0 && !maxFixed) { + max = 0; + } + } + var determinedMin = this._determinedMin; + var determinedMax = this._determinedMax; + if (determinedMin != null) { + min = determinedMin; + minFixed = true; + } + if (determinedMax != null) { + max = determinedMax; + maxFixed = true; + } + return { + min, + max, + minFixed, + maxFixed, + isBlank + }; + }; + ScaleRawExtentInfo2.prototype.modifyDataMinMax = function(minMaxName, val) { + this[DATA_MIN_MAX_ATTR[minMaxName]] = val; + }; + ScaleRawExtentInfo2.prototype.setDeterminedMinMax = function(minMaxName, val) { + var attr = DETERMINED_MIN_MAX_ATTR[minMaxName]; + this[attr] = val; + }; + ScaleRawExtentInfo2.prototype.freeze = function() { + this.frozen = true; + }; + return ScaleRawExtentInfo2; + }() +); +var DETERMINED_MIN_MAX_ATTR = { + min: "_determinedMin", + max: "_determinedMax" +}; +var DATA_MIN_MAX_ATTR = { + min: "_dataMin", + max: "_dataMax" +}; +function ensureScaleRawExtentInfo(scale, model, originalExtent) { + var rawExtentInfo = scale.rawExtentInfo; + if (rawExtentInfo) { + return rawExtentInfo; + } + rawExtentInfo = new ScaleRawExtentInfo(scale, model, originalExtent); + scale.rawExtentInfo = rawExtentInfo; + return rawExtentInfo; +} +function parseAxisModelMinMax(scale, minMax) { + return minMax == null ? null : eqNaN(minMax) ? NaN : scale.parse(minMax); +} + +/** + * Get axis scale extent before niced. + * Item of returned array can only be number (including Infinity and NaN). + * + * Caution: + * Precondition of calling this method: + * The scale extent has been initialized using series data extent via + * `scale.setExtent` or `scale.unionExtentFromData`; + */ +function getScaleExtent(scale, model) { + var scaleType = scale.type; + var rawExtentResult = ensureScaleRawExtentInfo(scale, model, scale.getExtent()).calculate(); + scale.setBlank(rawExtentResult.isBlank); + var min = rawExtentResult.min; + var max = rawExtentResult.max; + // If bars are placed on a base axis of type time or interval account for axis boundary overflow and current axis + // is base axis + // FIXME + // (1) Consider support value axis, where below zero and axis `onZero` should be handled properly. + // (2) Refactor the logic with `barGrid`. Is it not need to `makeBarWidthAndOffsetInfo` twice with different extent? + // Should not depend on series type `bar`? + // (3) Fix that might overlap when using dataZoom. + // (4) Consider other chart types using `barGrid`? + // See #6728, #4862, `test/bar-overflow-time-plot.html` + var ecModel = model.ecModel; + if (ecModel && scaleType === 'time' /* || scaleType === 'interval' */) { + var barSeriesModels = prepareLayoutBarSeries('bar', ecModel); + var isBaseAxisAndHasBarSeries_1 = false; + each$4(barSeriesModels, function (seriesModel) { + isBaseAxisAndHasBarSeries_1 = isBaseAxisAndHasBarSeries_1 || seriesModel.getBaseAxis() === model.axis; + }); + if (isBaseAxisAndHasBarSeries_1) { + // Calculate placement of bars on axis. TODO should be decoupled + // with barLayout + var barWidthAndOffset = makeColumnLayout(barSeriesModels); + // Adjust axis min and max to account for overflow + var adjustedScale = adjustScaleForOverflow(min, max, model, barWidthAndOffset); + min = adjustedScale.min; + max = adjustedScale.max; + } + } + return { + extent: [min, max], + // "fix" means "fixed", the value should not be + // changed in the subsequent steps. + fixMin: rawExtentResult.minFixed, + fixMax: rawExtentResult.maxFixed + }; +} +function adjustScaleForOverflow(min, max, model, +// Only support cartesian coord yet. +barWidthAndOffset) { + // Get Axis Length + var axisExtent = model.axis.getExtent(); + var axisLength = Math.abs(axisExtent[1] - axisExtent[0]); + // Get bars on current base axis and calculate min and max overflow + var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis); + if (barsOnCurrentAxis === undefined) { + return { + min: min, + max: max + }; + } + var minOverflow = Infinity; + each$4(barsOnCurrentAxis, function (item) { + minOverflow = Math.min(item.offset, minOverflow); + }); + var maxOverflow = -Infinity; + each$4(barsOnCurrentAxis, function (item) { + maxOverflow = Math.max(item.offset + item.width, maxOverflow); + }); + minOverflow = Math.abs(minOverflow); + maxOverflow = Math.abs(maxOverflow); + var totalOverFlow = minOverflow + maxOverflow; + // Calculate required buffer based on old range and overflow + var oldRange = max - min; + var oldRangePercentOfNew = 1 - (minOverflow + maxOverflow) / axisLength; + var overflowBuffer = oldRange / oldRangePercentOfNew - oldRange; + max += overflowBuffer * (maxOverflow / totalOverFlow); + min -= overflowBuffer * (minOverflow / totalOverFlow); + return { + min: min, + max: max + }; +} +// Precondition of calling this method: +// The scale extent has been initialized using series data extent via +// `scale.setExtent` or `scale.unionExtentFromData`; +function niceScaleExtent(scale, inModel) { + var model = inModel; + var extentInfo = getScaleExtent(scale, model); + var extent = extentInfo.extent; + var splitNumber = model.get('splitNumber'); + if (scale instanceof LogScale) { + scale.base = model.get('logBase'); + } + var scaleType = scale.type; + var interval = model.get('interval'); + var isIntervalOrTime = scaleType === 'interval' || scaleType === 'time'; + scale.setExtent(extent[0], extent[1]); + scale.calcNiceExtent({ + splitNumber: splitNumber, + fixMin: extentInfo.fixMin, + fixMax: extentInfo.fixMax, + minInterval: isIntervalOrTime ? model.get('minInterval') : null, + maxInterval: isIntervalOrTime ? model.get('maxInterval') : null + }); + // If some one specified the min, max. And the default calculated interval + // is not good enough. He can specify the interval. It is often appeared + // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard + // to be 60. + // FIXME + if (interval != null) { + scale.setInterval && scale.setInterval(interval); + } +} +/** + * @param axisType Default retrieve from model.type + */ +function createScaleByModel(model, axisType) { + axisType = axisType || model.get('type'); + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale({ + ordinalMeta: model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(), + extent: [Infinity, -Infinity] + }); + case 'time': + return new TimeScale({ + locale: model.ecModel.getLocaleModel(), + useUTC: model.ecModel.get('useUTC') + }); + default: + // case 'value'/'interval', 'log', or others. + return new (Scale.getClass(axisType) || IntervalScale)(); + } + } +} +/** + * Check if the axis cross 0 + */ +function ifAxisCrossZero(axis) { + var dataExtent = axis.scale.getExtent(); + var min = dataExtent[0]; + var max = dataExtent[1]; + return !(min > 0 && max > 0 || min < 0 && max < 0); +} +/** + * @param axis + * @return Label formatter function. + * param: {number} tickValue, + * param: {number} idx, the index in all ticks. + * If category axis, this param is not required. + * return: {string} label string. + */ +function makeLabelFormatter(axis) { + var labelFormatter = axis.getLabelModel().get('formatter'); + var categoryTickStart = axis.type === 'category' ? axis.scale.getExtent()[0] : null; + if (axis.scale.type === 'time') { + return function (tpl) { + return function (tick, idx) { + return axis.scale.getFormattedLabel(tick, idx, tpl); + }; + }(labelFormatter); + } else if (isString(labelFormatter)) { + return function (tpl) { + return function (tick) { + // For category axis, get raw value; for numeric axis, + // get formatted label like '1,333,444'. + var label = axis.scale.getLabel(tick); + var text = tpl.replace('{value}', label != null ? label : ''); + return text; + }; + }(labelFormatter); + } else if (isFunction(labelFormatter)) { + return function (cb) { + return function (tick, idx) { + // The original intention of `idx` is "the index of the tick in all ticks". + // But the previous implementation of category axis do not consider the + // `axisLabel.interval`, which cause that, for example, the `interval` is + // `1`, then the ticks "name5", "name7", "name9" are displayed, where the + // corresponding `idx` are `0`, `2`, `4`, but not `0`, `1`, `2`. So we keep + // the definition here for back compatibility. + if (categoryTickStart != null) { + idx = tick.value - categoryTickStart; + } + return cb(getAxisRawValue(axis, tick), idx, tick.level != null ? { + level: tick.level + } : null); + }; + }(labelFormatter); + } else { + return function (tick) { + return axis.scale.getLabel(tick); + }; + } +} +function getAxisRawValue(axis, tick) { + // In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + return axis.type === 'category' ? axis.scale.getLabel(tick) : tick.value; +} +/** + * @param axis + * @return Be null/undefined if no labels. + */ +function estimateLabelUnionRect(axis) { + var axisModel = axis.model; + var scale = axis.scale; + if (!axisModel.get(['axisLabel', 'show']) || scale.isBlank()) { + return; + } + var realNumberScaleTicks; + var tickCount; + var categoryScaleExtent = scale.getExtent(); + // Optimize for large category data, avoid call `getTicks()`. + if (scale instanceof OrdinalScale) { + tickCount = scale.count(); + } else { + realNumberScaleTicks = scale.getTicks(); + tickCount = realNumberScaleTicks.length; + } + var axisLabelModel = axis.getLabelModel(); + var labelFormatter = makeLabelFormatter(axis); + var rect; + var step = 1; + // Simple optimization for large amount of labels + if (tickCount > 40) { + step = Math.ceil(tickCount / 40); + } + for (var i = 0; i < tickCount; i += step) { + var tick = realNumberScaleTicks ? realNumberScaleTicks[i] : { + value: categoryScaleExtent[0] + i + }; + var label = labelFormatter(tick, i); + var unrotatedSingleRect = axisLabelModel.getTextRect(label); + var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0); + rect ? rect.union(singleRect) : rect = singleRect; + } + return rect; +} +function rotateTextRect(textRect, rotate) { + var rotateRadians = rotate * Math.PI / 180; + var beforeWidth = textRect.width; + var beforeHeight = textRect.height; + var afterWidth = beforeWidth * Math.abs(Math.cos(rotateRadians)) + Math.abs(beforeHeight * Math.sin(rotateRadians)); + var afterHeight = beforeWidth * Math.abs(Math.sin(rotateRadians)) + Math.abs(beforeHeight * Math.cos(rotateRadians)); + var rotatedRect = new BoundingRect(textRect.x, textRect.y, afterWidth, afterHeight); + return rotatedRect; +} +/** + * @param model axisLabelModel or axisTickModel + * @return {number|String} Can be null|'auto'|number|function + */ +function getOptionCategoryInterval(model) { + var interval = model.get('interval'); + return interval == null ? 'auto' : interval; +} +/** + * Set `categoryInterval` as 0 implicitly indicates that + * show all labels regardless of overlap. + * @param {Object} axis axisModel.axis + */ +function shouldShowAllLabels(axis) { + return axis.type === 'category' && getOptionCategoryInterval(axis.getLabelModel()) === 0; +} +function getDataDimensionsOnAxis(data, axisDim) { + // Remove duplicated dat dimensions caused by `getStackedDimension`. + var dataDimMap = {}; + // Currently `mapDimensionsAll` will contain stack result dimension ('__\0ecstackresult'). + // PENDING: is it reasonable? Do we need to remove the original dim from "coord dim" since + // there has been stacked result dim? + each$4(data.mapDimensionsAll(axisDim), function (dataDim) { + // For example, the extent of the original dimension + // is [0.1, 0.5], the extent of the `stackResultDimension` + // is [7, 9], the final extent should NOT include [0.1, 0.5], + // because there is no graphic corresponding to [0.1, 0.5]. + // See the case in `test/area-stack.html` `main1`, where area line + // stack needs `yAxis` not start from 0. + dataDimMap[getStackedDimension(data, dataDim)] = true; + }); + return keys(dataDimMap); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +var AxisModelCommonMixin = /** @class */function () { + function AxisModelCommonMixin() {} + AxisModelCommonMixin.prototype.getNeedCrossZero = function () { + var option = this.option; + return !option.scale; + }; + /** + * Should be implemented by each axis model if necessary. + * @return coordinate system model + */ + AxisModelCommonMixin.prototype.getCoordSysModel = function () { + return; + }; + return AxisModelCommonMixin; +}(); + +var extensions = []; +var extensionRegisters = { + registerPreprocessor: registerPreprocessor, + registerProcessor: registerProcessor, + registerPostInit: registerPostInit, + registerPostUpdate: registerPostUpdate, + registerUpdateLifecycle: registerUpdateLifecycle, + registerAction: registerAction, + registerCoordinateSystem: registerCoordinateSystem, + registerLayout: registerLayout, + registerVisual: registerVisual, + registerTransform: registerTransform, + registerLoading: registerLoading, + registerMap: registerMap, + registerImpl: registerImpl, + PRIORITY: PRIORITY, + ComponentModel: ComponentModel, + ComponentView: ComponentView, + SeriesModel: SeriesModel, + ChartView: ChartView, + // TODO Use ComponentModel and SeriesModel instead of Constructor + registerComponentModel: function (ComponentModelClass) { + ComponentModel.registerClass(ComponentModelClass); + }, + registerComponentView: function (ComponentViewClass) { + ComponentView.registerClass(ComponentViewClass); + }, + registerSeriesModel: function (SeriesModelClass) { + SeriesModel.registerClass(SeriesModelClass); + }, + registerChartView: function (ChartViewClass) { + ChartView.registerClass(ChartViewClass); + }, + registerSubTypeDefaulter: function (componentType, defaulter) { + ComponentModel.registerSubTypeDefaulter(componentType, defaulter); + }, + registerPainter: function (painterType, PainterCtor) { + registerPainter(painterType, PainterCtor); + } +}; +function use(ext) { + if (isArray(ext)) { + // use([ChartLine, ChartBar]); + each$4(ext, function (singleExt) { + use(singleExt); + }); + return; + } + if (indexOf(extensions, ext) >= 0) { + return; + } + extensions.push(ext); + if (isFunction(ext)) { + ext = { + install: ext + }; + } + ext.install(extensionRegisters); +} + +var inner$4 = makeInner(); +function tickValuesToNumbers(axis, values) { + var nums = map$1(values, function (val) { + return axis.scale.parse(val); + }); + if (axis.type === 'time' && nums.length > 0) { + // Time axis needs duplicate first/last tick (see TimeScale.getTicks()) + // The first and last tick/label don't get drawn + nums.sort(); + nums.unshift(nums[0]); + nums.push(nums[nums.length - 1]); + } + return nums; +} +function createAxisLabels(axis) { + var custom = axis.getLabelModel().get('customValues'); + if (custom) { + var labelFormatter_1 = makeLabelFormatter(axis); + var extent_1 = axis.scale.getExtent(); + var tickNumbers = tickValuesToNumbers(axis, custom); + var ticks = filter(tickNumbers, function (val) { + return val >= extent_1[0] && val <= extent_1[1]; + }); + return { + labels: map$1(ticks, function (numval) { + var tick = { + value: numval + }; + return { + formattedLabel: labelFormatter_1(tick), + rawLabel: axis.scale.getLabel(tick), + tickValue: numval + }; + }) + }; + } + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryLabels(axis) : makeRealNumberLabels(axis); +} +/** + * @param {module:echats/coord/Axis} axis + * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea. + * @return {Object} { + * ticks: Array. + * tickCategoryInterval: number + * } + */ +function createAxisTicks(axis, tickModel) { + var custom = axis.getTickModel().get('customValues'); + if (custom) { + var extent_2 = axis.scale.getExtent(); + var tickNumbers = tickValuesToNumbers(axis, custom); + return { + ticks: filter(tickNumbers, function (val) { + return val >= extent_2[0] && val <= extent_2[1]; + }) + }; + } + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryTicks(axis, tickModel) : { + ticks: map$1(axis.scale.getTicks(), function (tick) { + return tick.value; + }) + }; +} +function makeCategoryLabels(axis) { + var labelModel = axis.getLabelModel(); + var result = makeCategoryLabelsActually(axis, labelModel); + return !labelModel.get('show') || axis.scale.isBlank() ? { + labels: [], + labelCategoryInterval: result.labelCategoryInterval + } : result; +} +function makeCategoryLabelsActually(axis, labelModel) { + var labelsCache = getListCache(axis, 'labels'); + var optionLabelInterval = getOptionCategoryInterval(labelModel); + var result = listCacheGet(labelsCache, optionLabelInterval); + if (result) { + return result; + } + var labels; + var numericLabelInterval; + if (isFunction(optionLabelInterval)) { + labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval); + } else { + numericLabelInterval = optionLabelInterval === 'auto' ? makeAutoCategoryInterval(axis) : optionLabelInterval; + labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval); + } + // Cache to avoid calling interval function repeatedly. + return listCacheSet(labelsCache, optionLabelInterval, { + labels: labels, + labelCategoryInterval: numericLabelInterval + }); +} +function makeCategoryTicks(axis, tickModel) { + var ticksCache = getListCache(axis, 'ticks'); + var optionTickInterval = getOptionCategoryInterval(tickModel); + var result = listCacheGet(ticksCache, optionTickInterval); + if (result) { + return result; + } + var ticks; + var tickCategoryInterval; + // Optimize for the case that large category data and no label displayed, + // we should not return all ticks. + if (!tickModel.get('show') || axis.scale.isBlank()) { + ticks = []; + } + if (isFunction(optionTickInterval)) { + ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true); + } + // Always use label interval by default despite label show. Consider this + // scenario, Use multiple grid with the xAxis sync, and only one xAxis shows + // labels. `splitLine` and `axisTick` should be consistent in this case. + else if (optionTickInterval === 'auto') { + var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel()); + tickCategoryInterval = labelsResult.labelCategoryInterval; + ticks = map$1(labelsResult.labels, function (labelItem) { + return labelItem.tickValue; + }); + } else { + tickCategoryInterval = optionTickInterval; + ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true); + } + // Cache to avoid calling interval function repeatedly. + return listCacheSet(ticksCache, optionTickInterval, { + ticks: ticks, + tickCategoryInterval: tickCategoryInterval + }); +} +function makeRealNumberLabels(axis) { + var ticks = axis.scale.getTicks(); + var labelFormatter = makeLabelFormatter(axis); + return { + labels: map$1(ticks, function (tick, idx) { + return { + level: tick.level, + formattedLabel: labelFormatter(tick, idx), + rawLabel: axis.scale.getLabel(tick), + tickValue: tick.value + }; + }) + }; +} +function getListCache(axis, prop) { + // Because key can be a function, and cache size always is small, we use array cache. + return inner$4(axis)[prop] || (inner$4(axis)[prop] = []); +} +function listCacheGet(cache, key) { + for (var i = 0; i < cache.length; i++) { + if (cache[i].key === key) { + return cache[i].value; + } + } +} +function listCacheSet(cache, key, value) { + cache.push({ + key: key, + value: value + }); + return value; +} +function makeAutoCategoryInterval(axis) { + var result = inner$4(axis).autoInterval; + return result != null ? result : inner$4(axis).autoInterval = axis.calculateCategoryInterval(); +} +/** + * Calculate interval for category axis ticks and labels. + * To get precise result, at least one of `getRotate` and `isHorizontal` + * should be implemented in axis. + */ +function calculateCategoryInterval(axis) { + var params = fetchAutoCategoryIntervalCalculationParams(axis); + var labelFormatter = makeLabelFormatter(axis); + var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI; + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); + // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + var tickCount = ordinalScale.count(); + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + var step = 1; + // Simple optimization. Empirical value: tick count should less than 40. + if (tickCount > 40) { + step = Math.max(1, Math.floor(tickCount / 40)); + } + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitW = Math.abs(unitSpan * Math.cos(rotation)); + var unitH = Math.abs(unitSpan * Math.sin(rotation)); + var maxW = 0; + var maxH = 0; + // Caution: Performance sensitive for large category data. + // Consider dataZoom, we should make appropriate step to avoid O(n) loop. + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + var width = 0; + var height = 0; + // Not precise, do not consider align and vertical align + // and each distance from axis line yet. + var rect = getBoundingRect(labelFormatter({ + value: tickValue + }), params.font, 'center', 'top'); + // Magic number + width = rect.width * 1.3; + height = rect.height * 1.3; + // Min size, void long loop. + maxW = Math.max(maxW, width, 7); + maxH = Math.max(maxH, height, 7); + } + var dw = maxW / unitW; + var dh = maxH / unitH; + // 0/0 is NaN, 1/0 is Infinity. + isNaN(dw) && (dw = Infinity); + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(Math.min(dw, dh))); + var cache = inner$4(axis.model); + var axisExtent = axis.getExtent(); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; + // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + // For example, if all of the axis labels are `a, b, c, d, e, f, g`. + // The jitter will cause that sometimes the displayed labels are + // `a, d, g` (interval: 2) sometimes `a, c, e`(interval: 1). + if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 + // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval + // If the axis change is caused by chart resize, the cache should not + // be used. Otherwise some hidden labels might not be shown again. + && cache.axisExtent0 === axisExtent[0] && cache.axisExtent1 === axisExtent[1]) { + interval = lastAutoInterval; + } + // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + cache.axisExtent0 = axisExtent[0]; + cache.axisExtent1 = axisExtent[1]; + } + return interval; +} +function fetchAutoCategoryIntervalCalculationParams(axis) { + var labelModel = axis.getLabelModel(); + return { + axisRotate: axis.getRotate ? axis.getRotate() : axis.isHorizontal && !axis.isHorizontal() ? 90 : 0, + labelRotate: labelModel.get('rotate') || 0, + font: labelModel.getFont() + }; +} +function makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) { + var labelFormatter = makeLabelFormatter(axis); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); + var labelModel = axis.getLabelModel(); + var result = []; + // TODO: axisType: ordinalTime, pick the tick from each month/day/year/... + var step = Math.max((categoryInterval || 0) + 1, 1); + var startTick = ordinalExtent[0]; + var tickCount = ordinalScale.count(); + // Calculate start tick based on zero if possible to keep label consistent + // while zooming and moving while interval > 0. Otherwise the selection + // of displayable ticks and symbols probably keep changing. + // 3 is empirical value. + if (startTick !== 0 && step > 1 && tickCount / step > 2) { + startTick = Math.round(Math.ceil(startTick / step) * step); + } + // (1) Only add min max label here but leave overlap checking + // to render stage, which also ensure the returned list + // suitable for splitLine and splitArea rendering. + // (2) Scales except category always contain min max label so + // do not need to perform this process. + var showAllLabel = shouldShowAllLabels(axis); + var includeMinLabel = labelModel.get('showMinLabel') || showAllLabel; + var includeMaxLabel = labelModel.get('showMaxLabel') || showAllLabel; + if (includeMinLabel && startTick !== ordinalExtent[0]) { + addItem(ordinalExtent[0]); + } + // Optimize: avoid generating large array by `ordinalScale.getTicks()`. + var tickValue = startTick; + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + addItem(tickValue); + } + if (includeMaxLabel && tickValue - step !== ordinalExtent[1]) { + addItem(ordinalExtent[1]); + } + function addItem(tickValue) { + var tickObj = { + value: tickValue + }; + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tickObj), + rawLabel: ordinalScale.getLabel(tickObj), + tickValue: tickValue + }); + } + return result; +} +function makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) { + var ordinalScale = axis.scale; + var labelFormatter = makeLabelFormatter(axis); + var result = []; + each$4(ordinalScale.getTicks(), function (tick) { + var rawLabel = ordinalScale.getLabel(tick); + var tickValue = tick.value; + if (categoryInterval(tick.value, rawLabel)) { + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tick), + rawLabel: rawLabel, + tickValue: tickValue + }); + } + }); + return result; +} + +var NORMALIZED_EXTENT = [0, 1]; +/** + * Base class of Axis. + */ +var Axis = /** @class */function () { + function Axis(dim, scale, extent) { + this.onBand = false; + this.inverse = false; + this.dim = dim; + this.scale = scale; + this._extent = extent || [0, 0]; + } + /** + * If axis extent contain given coord + */ + Axis.prototype.contain = function (coord) { + var extent = this._extent; + var min = Math.min(extent[0], extent[1]); + var max = Math.max(extent[0], extent[1]); + return coord >= min && coord <= max; + }; + /** + * If axis extent contain given data + */ + Axis.prototype.containData = function (data) { + return this.scale.contain(data); + }; + /** + * Get coord extent. + */ + Axis.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Get precision used for formatting + */ + Axis.prototype.getPixelPrecision = function (dataExtent) { + return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent); + }; + /** + * Set coord extent + */ + Axis.prototype.setExtent = function (start, end) { + var extent = this._extent; + extent[0] = start; + extent[1] = end; + }; + /** + * Convert data to coord. Data is the rank if it has an ordinal scale + */ + Axis.prototype.dataToCoord = function (data, clamp) { + var extent = this._extent; + var scale = this.scale; + data = scale.normalize(data); + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + return linearMap(data, NORMALIZED_EXTENT, extent, clamp); + }; + /** + * Convert coord to data. Data is the rank if it has an ordinal scale + */ + Axis.prototype.coordToData = function (coord, clamp) { + var extent = this._extent; + var scale = this.scale; + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp); + return this.scale.scale(t); + }; + /** + * Convert pixel point to data in axis + */ + Axis.prototype.pointToData = function (point, clamp) { + // Should be implemented in derived class if necessary. + return; + }; + /** + * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`, + * `axis.getTicksCoords` considers `onBand`, which is used by + * `boundaryGap:true` of category axis and splitLine and splitArea. + * @param opt.tickModel default: axis.model.getModel('axisTick') + * @param opt.clamp If `true`, the first and the last + * tick must be at the axis end points. Otherwise, clip ticks + * that outside the axis extent. + */ + Axis.prototype.getTicksCoords = function (opt) { + opt = opt || {}; + var tickModel = opt.tickModel || this.getTickModel(); + var result = createAxisTicks(this, tickModel); + var ticks = result.ticks; + var ticksCoords = map$1(ticks, function (tickVal) { + return { + coord: this.dataToCoord(this.scale.type === 'ordinal' ? this.scale.getRawOrdinalNumber(tickVal) : tickVal), + tickValue: tickVal + }; + }, this); + var alignWithLabel = tickModel.get('alignWithLabel'); + fixOnBandTicksCoords(this, ticksCoords, alignWithLabel, opt.clamp); + return ticksCoords; + }; + Axis.prototype.getMinorTicksCoords = function () { + if (this.scale.type === 'ordinal') { + // Category axis doesn't support minor ticks + return []; + } + var minorTickModel = this.model.getModel('minorTick'); + var splitNumber = minorTickModel.get('splitNumber'); + // Protection. + if (!(splitNumber > 0 && splitNumber < 100)) { + splitNumber = 5; + } + var minorTicks = this.scale.getMinorTicks(splitNumber); + var minorTicksCoords = map$1(minorTicks, function (minorTicksGroup) { + return map$1(minorTicksGroup, function (minorTick) { + return { + coord: this.dataToCoord(minorTick), + tickValue: minorTick + }; + }, this); + }, this); + return minorTicksCoords; + }; + Axis.prototype.getViewLabels = function () { + return createAxisLabels(this).labels; + }; + Axis.prototype.getLabelModel = function () { + return this.model.getModel('axisLabel'); + }; + /** + * Notice here we only get the default tick model. For splitLine + * or splitArea, we should pass the splitLineModel or splitAreaModel + * manually when calling `getTicksCoords`. + * In GL, this method may be overridden to: + * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));` + */ + Axis.prototype.getTickModel = function () { + return this.model.getModel('axisTick'); + }; + /** + * Get width of band + */ + Axis.prototype.getBandWidth = function () { + var axisExtent = this._extent; + var dataExtent = this.scale.getExtent(); + var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); + // Fix #2728, avoid NaN when only one data. + len === 0 && (len = 1); + var size = Math.abs(axisExtent[1] - axisExtent[0]); + return Math.abs(size) / len; + }; + /** + * Only be called in category axis. + * Can be overridden, consider other axes like in 3D. + * @return Auto interval for cateogry axis tick and label + */ + Axis.prototype.calculateCategoryInterval = function () { + return calculateCategoryInterval(this); + }; + return Axis; +}(); +function fixExtentWithBands(extent, nTick) { + var size = extent[1] - extent[0]; + var len = nTick; + var margin = size / len / 2; + extent[0] += margin; + extent[1] -= margin; +} +// If axis has labels [1, 2, 3, 4]. Bands on the axis are +// |---1---|---2---|---3---|---4---|. +// So the displayed ticks and splitLine/splitArea should between +// each data item, otherwise cause misleading (e.g., split tow bars +// of a single data item when there are two bar series). +// Also consider if tickCategoryInterval > 0 and onBand, ticks and +// splitLine/spliteArea should layout appropriately corresponding +// to displayed labels. (So we should not use `getBandWidth` in this +// case). +function fixOnBandTicksCoords(axis, ticksCoords, alignWithLabel, clamp) { + var ticksLen = ticksCoords.length; + if (!axis.onBand || alignWithLabel || !ticksLen) { + return; + } + var axisExtent = axis.getExtent(); + var last; + var diffSize; + if (ticksLen === 1) { + ticksCoords[0].coord = axisExtent[0]; + last = ticksCoords[1] = { + coord: axisExtent[1], + tickValue: ticksCoords[0].tickValue + }; + } else { + var crossLen = ticksCoords[ticksLen - 1].tickValue - ticksCoords[0].tickValue; + var shift_1 = (ticksCoords[ticksLen - 1].coord - ticksCoords[0].coord) / crossLen; + each$4(ticksCoords, function (ticksItem) { + ticksItem.coord -= shift_1 / 2; + }); + var dataExtent = axis.scale.getExtent(); + diffSize = 1 + dataExtent[1] - ticksCoords[ticksLen - 1].tickValue; + last = { + coord: ticksCoords[ticksLen - 1].coord + shift_1 * diffSize, + tickValue: dataExtent[1] + 1 + }; + ticksCoords.push(last); + } + var inverse = axisExtent[0] > axisExtent[1]; + // Handling clamp. + if (littleThan(ticksCoords[0].coord, axisExtent[0])) { + clamp ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift(); + } + if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) { + ticksCoords.unshift({ + coord: axisExtent[0] + }); + } + if (littleThan(axisExtent[1], last.coord)) { + clamp ? last.coord = axisExtent[1] : ticksCoords.pop(); + } + if (clamp && littleThan(last.coord, axisExtent[1])) { + ticksCoords.push({ + coord: axisExtent[1] + }); + } + function littleThan(a, b) { + // Avoid rounding error cause calculated tick coord different with extent. + // It may cause an extra unnecessary tick added. + a = round$1(a); + b = round$1(b); + return inverse ? a > b : a < b; + } +} + +function projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) { + var dx = x - x1; + var dy = y - y1; + var dx1 = x2 - x1; + var dy1 = y2 - y1; + var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1); + dx1 /= lineLen; + dy1 /= lineLen; + // dot product + var projectedLen = dx * dx1 + dy * dy1; + var t = projectedLen / lineLen; + t *= lineLen; + var ox = out[0] = x1 + t * dx1; + var oy = out[1] = y1 + t * dy1; + return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); +} +// Temporal variable for intermediate usage. +var pt0 = new Point(); +var pt1 = new Point(); +var pt2 = new Point(); +var dir = new Point(); +var dir2 = new Point(); +// Temporal variable for the limitTurnAngle function +var tmpArr = []; +var tmpProjPoint = new Point(); +/** + * Reduce the line segment attached to the label to limit the turn angle between two segments. + * @param linePoints + * @param minTurnAngle Radian of minimum turn angle. 0 - 180 + */ +function limitTurnAngle(linePoints, minTurnAngle) { + if (!(minTurnAngle <= 180 && minTurnAngle > 0)) { + return; + } + minTurnAngle = minTurnAngle / 180 * Math.PI; + // The line points can be + // /pt1----pt2 (label) + // / + // pt0/ + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt0, pt1); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(dir2); + var minTurnAngleCos = Math.cos(minTurnAngle); + if (minTurnAngleCos < angleCos) { + // Smaller than minTurnAngle + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr); + tmpProjPoint.fromArray(tmpArr); + // Calculate new projected length with limited minTurnAngle and get the new connect point + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle)); + // Limit the new calculated connect point between pt1 and pt2. + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + if (isNaN(t)) { + return; + } + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + tmpProjPoint.toArray(linePoints[1]); + } +} +/** + * Limit the angle of line and the surface + * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite + */ +function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) { + if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) { + return; + } + maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI; + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt1, pt0); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(surfaceNormal); + var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle); + if (angleCos < maxSurfaceAngleCos) { + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr); + tmpProjPoint.fromArray(tmpArr); + var HALF_PI = Math.PI / 2; + var angle2 = Math.acos(dir2.dot(surfaceNormal)); + var newAngle = HALF_PI + angle2 - maxSurfaceAngle; + if (newAngle >= HALF_PI) { + // parallel + Point.copy(tmpProjPoint, pt2); + } else { + // Calculate new projected length with limited minTurnAngle and get the new connect point + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle)); + // Limit the new calculated connect point between pt1 and pt2. + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + if (isNaN(t)) { + return; + } + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + } + tmpProjPoint.toArray(linePoints[1]); + } +} +function setLabelLineState(labelLine, ignore, stateName, stateModel) { + var isNormal = stateName === 'normal'; + var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName); + // Make sure display. + stateObj.ignore = ignore; + // Set smooth + var smooth = stateModel.get('smooth'); + if (smooth && smooth === true) { + smooth = 0.3; + } + stateObj.shape = stateObj.shape || {}; + if (smooth > 0) { + stateObj.shape.smooth = smooth; + } + var styleObj = stateModel.getModel('lineStyle').getLineStyle(); + isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj; +} +function buildLabelLinePath(path, shape) { + var smooth = shape.smooth; + var points = shape.points; + if (!points) { + return; + } + path.moveTo(points[0][0], points[0][1]); + if (smooth > 0 && points.length >= 3) { + var len1 = dist$1(points[0], points[1]); + var len2 = dist$1(points[1], points[2]); + if (!len1 || !len2) { + path.lineTo(points[1][0], points[1][1]); + path.lineTo(points[2][0], points[2][1]); + return; + } + var moveLen = Math.min(len1, len2) * smooth; + var midPoint0 = lerp$1([], points[1], points[0], moveLen / len1); + var midPoint2 = lerp$1([], points[1], points[2], moveLen / len2); + var midPoint1 = lerp$1([], midPoint0, midPoint2, 0.5); + path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]); + path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points[2][0], points[2][1]); + } else { + for (var i = 1; i < points.length; i++) { + path.lineTo(points[i][0], points[i][1]); + } + } +} +/** + * Create a label line if necessary and set it's style. + */ +function setLabelLineStyle(targetEl, statesModels, defaultStyle) { + var labelLine = targetEl.getTextGuideLine(); + var label = targetEl.getTextContent(); + if (!label) { + // Not show label line if there is no label. + if (labelLine) { + targetEl.removeTextGuideLine(); + } + return; + } + var normalModel = statesModels.normal; + var showNormal = normalModel.get('show'); + var labelIgnoreNormal = label.ignore; + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateName = DISPLAY_STATES[i]; + var stateModel = statesModels[stateName]; + var isNormal = stateName === 'normal'; + if (stateModel) { + var stateShow = stateModel.get('show'); + var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal); + if (isLabelIgnored // Not show when label is not shown in this state. + || !retrieve2(stateShow, showNormal) // Use normal state by default if not set. + ) { + var stateObj = isNormal ? labelLine : labelLine && labelLine.states[stateName]; + if (stateObj) { + stateObj.ignore = true; + } + if (!!labelLine) { + setLabelLineState(labelLine, true, stateName, stateModel); + } + continue; + } + // Create labelLine if not exists + if (!labelLine) { + labelLine = new Polyline(); + targetEl.setTextGuideLine(labelLine); + // Reset state of normal because it's new created. + // NOTE: NORMAL should always been the first! + if (!isNormal && (labelIgnoreNormal || !showNormal)) { + setLabelLineState(labelLine, true, 'normal', statesModels.normal); + } + // Use same state proxy. + if (targetEl.stateProxy) { + labelLine.stateProxy = targetEl.stateProxy; + } + } + setLabelLineState(labelLine, false, stateName, stateModel); + } + } + if (labelLine) { + defaults(labelLine.style, defaultStyle); + // Not fill. + labelLine.style.fill = null; + var showAbove = normalModel.get('showAbove'); + var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {}; + labelLineConfig.showAbove = showAbove || false; + // Custom the buildPath. + labelLine.buildPath = buildLabelLinePath; + } +} +function getLabelLineStatesModels(itemModel, labelLineName) { + labelLineName = labelLineName || 'labelLine'; + var statesModels = { + normal: itemModel.getModel(labelLineName) + }; + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelLineName]); + } + return statesModels; +} + +function prepareLayoutList(input) { + var list = []; + for (var i = 0; i < input.length; i++) { + var rawItem = input[i]; + if (rawItem.defaultAttr.ignore) { + continue; + } + var label = rawItem.label; + var transform = label.getComputedTransform(); + // NOTE: Get bounding rect after getComputedTransform, or label may not been updated by the host el. + var localRect = label.getBoundingRect(); + var isAxisAligned = !transform || transform[1] < 1e-5 && transform[2] < 1e-5; + var minMargin = label.style.margin || 0; + var globalRect = localRect.clone(); + globalRect.applyTransform(transform); + globalRect.x -= minMargin / 2; + globalRect.y -= minMargin / 2; + globalRect.width += minMargin; + globalRect.height += minMargin; + var obb = isAxisAligned ? new OrientedBoundingRect(localRect, transform) : null; + list.push({ + label: label, + labelLine: rawItem.labelLine, + rect: globalRect, + localRect: localRect, + obb: obb, + priority: rawItem.priority, + defaultAttr: rawItem.defaultAttr, + layoutOption: rawItem.computedLayoutOption, + axisAligned: isAxisAligned, + transform: transform + }); + } + return list; +} +function shiftLayout(list, xyDim, sizeDim, minBound, maxBound, balanceShift) { + var len = list.length; + if (len < 2) { + return; + } + list.sort(function (a, b) { + return a.rect[xyDim] - b.rect[xyDim]; + }); + var lastPos = 0; + var delta; + var adjusted = false; + for (var i = 0; i < len; i++) { + var item = list[i]; + var rect = item.rect; + delta = rect[xyDim] - lastPos; + if (delta < 0) { + // shiftForward(i, len, -delta); + rect[xyDim] -= delta; + item.label[xyDim] -= delta; + adjusted = true; + } + lastPos = rect[xyDim] + rect[sizeDim]; + } + // TODO bleedMargin? + var first = list[0]; + var last = list[len - 1]; + var minGap; + var maxGap; + updateMinMaxGap(); + // If ends exceed two bounds, squeeze at most 80%, then take the gap of two bounds. + minGap < 0 && squeezeGaps(-minGap, 0.8); + maxGap < 0 && squeezeGaps(maxGap, 0.8); + updateMinMaxGap(); + takeBoundsGap(minGap, maxGap, 1); + takeBoundsGap(maxGap, minGap, -1); + // Handle bailout when there is not enough space. + updateMinMaxGap(); + if (minGap < 0) { + squeezeWhenBailout(-minGap); + } + if (maxGap < 0) { + squeezeWhenBailout(maxGap); + } + function updateMinMaxGap() { + minGap = first.rect[xyDim] - minBound; + maxGap = maxBound - last.rect[xyDim] - last.rect[sizeDim]; + } + function takeBoundsGap(gapThisBound, gapOtherBound, moveDir) { + if (gapThisBound < 0) { + // Move from other gap if can. + var moveFromMaxGap = Math.min(gapOtherBound, -gapThisBound); + if (moveFromMaxGap > 0) { + shiftList(moveFromMaxGap * moveDir, 0, len); + var remained = moveFromMaxGap + gapThisBound; + if (remained < 0) { + squeezeGaps(-remained * moveDir, 1); + } + } else { + squeezeGaps(-gapThisBound * moveDir, 1); + } + } + } + function shiftList(delta, start, end) { + if (delta !== 0) { + adjusted = true; + } + for (var i = start; i < end; i++) { + var item = list[i]; + var rect = item.rect; + rect[xyDim] += delta; + item.label[xyDim] += delta; + } + } + // Squeeze gaps if the labels exceed margin. + function squeezeGaps(delta, maxSqeezePercent) { + var gaps = []; + var totalGaps = 0; + for (var i = 1; i < len; i++) { + var prevItemRect = list[i - 1].rect; + var gap = Math.max(list[i].rect[xyDim] - prevItemRect[xyDim] - prevItemRect[sizeDim], 0); + gaps.push(gap); + totalGaps += gap; + } + if (!totalGaps) { + return; + } + var squeezePercent = Math.min(Math.abs(delta) / totalGaps, maxSqeezePercent); + if (delta > 0) { + for (var i = 0; i < len - 1; i++) { + // Distribute the shift delta to all gaps. + var movement = gaps[i] * squeezePercent; + // Forward + shiftList(movement, 0, i + 1); + } + } else { + // Backward + for (var i = len - 1; i > 0; i--) { + // Distribute the shift delta to all gaps. + var movement = gaps[i - 1] * squeezePercent; + shiftList(-movement, i, len); + } + } + } + /** + * Squeeze to allow overlap if there is no more space available. + * Let other overlapping strategy like hideOverlap do the job instead of keep exceeding the bounds. + */ + function squeezeWhenBailout(delta) { + var dir = delta < 0 ? -1 : 1; + delta = Math.abs(delta); + var moveForEachLabel = Math.ceil(delta / (len - 1)); + for (var i = 0; i < len - 1; i++) { + if (dir > 0) { + // Forward + shiftList(moveForEachLabel, 0, i + 1); + } else { + // Backward + shiftList(-moveForEachLabel, len - i - 1, len); + } + delta -= moveForEachLabel; + if (delta <= 0) { + return; + } + } + } + return adjusted; +} +/** + * Adjust labels on y direction to avoid overlap. + */ +function shiftLayoutOnY(list, topBound, bottomBound, +// If average the shifts on all labels and add them to 0 +balanceShift) { + return shiftLayout(list, 'y', 'height', topBound, bottomBound); +} +function hideOverlap(labelList) { + var displayedLabels = []; + // TODO, render overflow visible first, put in the displayedLabels. + labelList.sort(function (a, b) { + return b.priority - a.priority; + }); + var globalRect = new BoundingRect(0, 0, 0, 0); + function hideEl(el) { + if (!el.ignore) { + // Show on emphasis. + var emphasisState = el.ensureState('emphasis'); + if (emphasisState.ignore == null) { + emphasisState.ignore = false; + } + } + el.ignore = true; + } + for (var i = 0; i < labelList.length; i++) { + var labelItem = labelList[i]; + var isAxisAligned = labelItem.axisAligned; + var localRect = labelItem.localRect; + var transform = labelItem.transform; + var label = labelItem.label; + var labelLine = labelItem.labelLine; + globalRect.copy(labelItem.rect); + // Add a threshold because layout may be aligned precisely. + globalRect.width -= 0.1; + globalRect.height -= 0.1; + globalRect.x += 0.05; + globalRect.y += 0.05; + var obb = labelItem.obb; + var overlapped = false; + for (var j = 0; j < displayedLabels.length; j++) { + var existsTextCfg = displayedLabels[j]; + // Fast rejection. + if (!globalRect.intersect(existsTextCfg.rect)) { + continue; + } + if (isAxisAligned && existsTextCfg.axisAligned) { + // Is overlapped + overlapped = true; + break; + } + if (!existsTextCfg.obb) { + // If self is not axis aligned. But other is. + existsTextCfg.obb = new OrientedBoundingRect(existsTextCfg.localRect, existsTextCfg.transform); + } + if (!obb) { + // If self is axis aligned. But other is not. + obb = new OrientedBoundingRect(localRect, transform); + } + if (obb.intersect(existsTextCfg.obb)) { + overlapped = true; + break; + } + } + // TODO Callback to determine if this overlap should be handled? + if (overlapped) { + hideEl(label); + labelLine && hideEl(labelLine); + } else { + label.attr('ignore', labelItem.defaultAttr.ignore); + labelLine && labelLine.attr('ignore', labelItem.defaultAttr.labelGuideIgnore); + displayedLabels.push(labelItem); + } + } +} + +var raf = null; +function requestAnimationFrame (callback) { + if (!raf) { + raf = ( + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function (callback) { + return setTimeout(callback, 16) + } + ).bind(window); + } + return raf(callback) +} + +var caf = null; +function cancelAnimationFrame (id) { + if (!caf) { + caf = ( + window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + function (id) { + clearTimeout(id); + } + ).bind(window); + } + + caf(id); +} + +function createStyles (styleText) { + var style = document.createElement('style'); + + if (style.styleSheet) { + style.styleSheet.cssText = styleText; + } else { + style.appendChild(document.createTextNode(styleText)); + } + (document.querySelector('head') || document.body).appendChild(style); + return style +} + +function createElement (tagName, props) { + if ( props === void 0 ) props = {}; + + var elem = document.createElement(tagName); + Object.keys(props).forEach(function (key) { + elem[key] = props[key]; + }); + return elem +} + +function getComputedStyle$1 (elem, prop, pseudo) { + // for older versions of Firefox, `getComputedStyle` required + // the second argument and may return `null` for some elements + // when `display: none` + var computedStyle = window.getComputedStyle(elem, null) || { + display: 'none' + }; + + return computedStyle[prop] +} + +function getRenderInfo (elem) { + if (!document.documentElement.contains(elem)) { + return { + detached: true, + rendered: false + } + } + + var current = elem; + while (current !== document) { + if (getComputedStyle$1(current, 'display') === 'none') { + return { + detached: false, + rendered: false + } + } + current = current.parentNode; + } + + return { + detached: false, + rendered: true + } +} + +var css_248z = ".resize-triggers{visibility:hidden;opacity:0;pointer-events:none}.resize-contract-trigger,.resize-contract-trigger:before,.resize-expand-trigger,.resize-triggers{content:\"\";position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden}.resize-contract-trigger,.resize-expand-trigger{background:#eee;overflow:auto}.resize-contract-trigger:before{width:200%;height:200%}"; + +var total = 0; +var style = null; + +function addListener (elem, callback) { + if (!elem.__resize_mutation_handler__) { + elem.__resize_mutation_handler__ = handleMutation.bind(elem); + } + + var listeners = elem.__resize_listeners__; + + if (!listeners) { + elem.__resize_listeners__ = []; + if (window.ResizeObserver) { + var offsetWidth = elem.offsetWidth; + var offsetHeight = elem.offsetHeight; + var ro = new ResizeObserver(function () { + if (!elem.__resize_observer_triggered__) { + elem.__resize_observer_triggered__ = true; + if (elem.offsetWidth === offsetWidth && elem.offsetHeight === offsetHeight) { + return + } + } + runCallbacks(elem); + }); + + // initially display none won't trigger ResizeObserver callback + var ref = getRenderInfo(elem); + var detached = ref.detached; + var rendered = ref.rendered; + elem.__resize_observer_triggered__ = detached === false && rendered === false; + elem.__resize_observer__ = ro; + ro.observe(elem); + } else if (elem.attachEvent && elem.addEventListener) { + // targeting IE9/10 + elem.__resize_legacy_resize_handler__ = function handleLegacyResize () { + runCallbacks(elem); + }; + elem.attachEvent('onresize', elem.__resize_legacy_resize_handler__); + document.addEventListener('DOMSubtreeModified', elem.__resize_mutation_handler__); + } else { + if (!total) { + style = createStyles(css_248z); + } + initTriggers(elem); + + elem.__resize_rendered__ = getRenderInfo(elem).rendered; + if (window.MutationObserver) { + var mo = new MutationObserver(elem.__resize_mutation_handler__); + mo.observe(document, { + attributes: true, + childList: true, + characterData: true, + subtree: true + }); + elem.__resize_mutation_observer__ = mo; + } + } + } + + elem.__resize_listeners__.push(callback); + total++; +} + +function removeListener (elem, callback) { + var listeners = elem.__resize_listeners__; + if (!listeners) { + return + } + + if (callback) { + listeners.splice(listeners.indexOf(callback), 1); + } + + // no listeners exist, or removing all listeners + if (!listeners.length || !callback) { + // targeting IE9/10 + if (elem.detachEvent && elem.removeEventListener) { + elem.detachEvent('onresize', elem.__resize_legacy_resize_handler__); + document.removeEventListener('DOMSubtreeModified', elem.__resize_mutation_handler__); + return + } + + if (elem.__resize_observer__) { + elem.__resize_observer__.unobserve(elem); + elem.__resize_observer__.disconnect(); + elem.__resize_observer__ = null; + } else { + if (elem.__resize_mutation_observer__) { + elem.__resize_mutation_observer__.disconnect(); + elem.__resize_mutation_observer__ = null; + } + elem.removeEventListener('scroll', handleScroll); + elem.removeChild(elem.__resize_triggers__.triggers); + elem.__resize_triggers__ = null; + } + elem.__resize_listeners__ = null; + } + + if (!--total && style) { + style.parentNode.removeChild(style); + } +} + +function getUpdatedSize (elem) { + var ref = elem.__resize_last__; + var width = ref.width; + var height = ref.height; + var offsetWidth = elem.offsetWidth; + var offsetHeight = elem.offsetHeight; + if (offsetWidth !== width || offsetHeight !== height) { + return { + width: offsetWidth, + height: offsetHeight + } + } + return null +} + +function handleMutation () { + // `this` denotes the scrolling element + var ref = getRenderInfo(this); + var rendered = ref.rendered; + var detached = ref.detached; + if (rendered !== this.__resize_rendered__) { + if (!detached && this.__resize_triggers__) { + resetTriggers(this); + this.addEventListener('scroll', handleScroll, true); + } + this.__resize_rendered__ = rendered; + runCallbacks(this); + } +} + +function handleScroll () { + var this$1$1 = this; + + // `this` denotes the scrolling element + resetTriggers(this); + if (this.__resize_raf__) { + cancelAnimationFrame(this.__resize_raf__); + } + this.__resize_raf__ = requestAnimationFrame(function () { + var updated = getUpdatedSize(this$1$1); + if (updated) { + this$1$1.__resize_last__ = updated; + runCallbacks(this$1$1); + } + }); +} + +function runCallbacks (elem) { + if (!elem || !elem.__resize_listeners__) { + return + } + elem.__resize_listeners__.forEach(function (callback) { + callback.call(elem, elem); + }); +} + +function initTriggers (elem) { + var position = getComputedStyle$1(elem, 'position'); + if (!position || position === 'static') { + elem.style.position = 'relative'; + } + + elem.__resize_old_position__ = position; + elem.__resize_last__ = {}; + + var triggers = createElement('div', { + className: 'resize-triggers' + }); + var expand = createElement('div', { + className: 'resize-expand-trigger' + }); + var expandChild = createElement('div'); + var contract = createElement('div', { + className: 'resize-contract-trigger' + }); + expand.appendChild(expandChild); + triggers.appendChild(expand); + triggers.appendChild(contract); + elem.appendChild(triggers); + + elem.__resize_triggers__ = { + triggers: triggers, + expand: expand, + expandChild: expandChild, + contract: contract + }; + + resetTriggers(elem); + elem.addEventListener('scroll', handleScroll, true); + + elem.__resize_last__ = { + width: elem.offsetWidth, + height: elem.offsetHeight + }; +} + +function resetTriggers (elem) { + var ref = elem.__resize_triggers__; + var expand = ref.expand; + var expandChild = ref.expandChild; + var contract = ref.contract; + + // batch read + var csw = contract.scrollWidth; + var csh = contract.scrollHeight; + var eow = expand.offsetWidth; + var eoh = expand.offsetHeight; + var esw = expand.scrollWidth; + var esh = expand.scrollHeight; + + // batch write + contract.scrollLeft = csw; + contract.scrollTop = csh; + expandChild.style.width = eow + 1 + 'px'; + expandChild.style.height = eoh + 1 + 'px'; + expand.scrollLeft = esw; + expand.scrollTop = esh; +} + +var b=function(){return b=Object.assign||function(e){for(var t,n=1,r=arguments.length;n= maxRepaintRectCount; + } + } + } + for (var i = this.__startIndex; i < this.__endIndex; ++i) { + var el = displayList[i]; + if (el) { + var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true); + var prevRect = el.__isRendered && ((el.__dirty & REDRAW_BIT) || !shouldPaint) + ? el.getPrevPaintRect() + : null; + if (prevRect) { + addRectToMergePool(prevRect); + } + var curRect = shouldPaint && ((el.__dirty & REDRAW_BIT) || !el.__isRendered) + ? el.getPaintRect() + : null; + if (curRect) { + addRectToMergePool(curRect); + } + } + } + for (var i = this.__prevStartIndex; i < this.__prevEndIndex; ++i) { + var el = prevList[i]; + var shouldPaint = el && el.shouldBePainted(viewWidth, viewHeight, true, true); + if (el && (!shouldPaint || !el.__zr) && el.__isRendered) { + var prevRect = el.getPrevPaintRect(); + if (prevRect) { + addRectToMergePool(prevRect); + } + } + } + var hasIntersections; + do { + hasIntersections = false; + for (var i = 0; i < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].isZero()) { + mergedRepaintRects.splice(i, 1); + continue; + } + for (var j = i + 1; j < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].intersect(mergedRepaintRects[j])) { + hasIntersections = true; + mergedRepaintRects[i].union(mergedRepaintRects[j]); + mergedRepaintRects.splice(j, 1); + } + else { + j++; + } + } + i++; + } + } while (hasIntersections); + this._paintRects = mergedRepaintRects; + return mergedRepaintRects; + }; + Layer.prototype.debugGetPaintRects = function () { + return (this._paintRects || []).slice(); + }; + Layer.prototype.resize = function (width, height) { + var dpr = this.dpr; + var dom = this.dom; + var domStyle = dom.style; + var domBack = this.domBack; + if (domStyle) { + domStyle.width = width + 'px'; + domStyle.height = height + 'px'; + } + dom.width = width * dpr; + dom.height = height * dpr; + if (domBack) { + domBack.width = width * dpr; + domBack.height = height * dpr; + if (dpr !== 1) { + this.ctxBack.scale(dpr, dpr); + } + } + }; + Layer.prototype.clear = function (clearAll, clearColor, repaintRects) { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + clearColor = clearColor || this.clearColor; + var haveMotionBLur = this.motionBlur && !clearAll; + var lastFrameAlpha = this.lastFrameAlpha; + var dpr = this.dpr; + var self = this; + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage(dom, 0, 0, width / dpr, height / dpr); + } + var domBack = this.domBack; + function doClear(x, y, width, height) { + ctx.clearRect(x, y, width, height); + if (clearColor && clearColor !== 'transparent') { + var clearColorGradientOrPattern = void 0; + if (isGradientObject(clearColor)) { + var shouldCache = clearColor.global || (clearColor.__width === width + && clearColor.__height === height); + clearColorGradientOrPattern = shouldCache + && clearColor.__canvasGradient + || getCanvasGradient(ctx, clearColor, { + x: 0, + y: 0, + width: width, + height: height + }); + clearColor.__canvasGradient = clearColorGradientOrPattern; + clearColor.__width = width; + clearColor.__height = height; + } + else if (isImagePatternObject(clearColor)) { + clearColor.scaleX = clearColor.scaleX || dpr; + clearColor.scaleY = clearColor.scaleY || dpr; + clearColorGradientOrPattern = createCanvasPattern(ctx, clearColor, { + dirty: function () { + self.setUnpainted(); + self.painter.refresh(); + } + }); + } + ctx.save(); + ctx.fillStyle = clearColorGradientOrPattern || clearColor; + ctx.fillRect(x, y, width, height); + ctx.restore(); + } + if (haveMotionBLur) { + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, x, y, width, height); + ctx.restore(); + } + } + if (!repaintRects || haveMotionBLur) { + doClear(0, 0, width, height); + } + else if (repaintRects.length) { + each$4(repaintRects, function (rect) { + doClear(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + }); + } + }; + return Layer; +}(Eventful)); + +var HOVER_LAYER_ZLEVEL = 1e5; +var CANVAS_ZLEVEL = 314159; +var EL_AFTER_INCREMENTAL_INC = 0.01; +var INCREMENTAL_INC = 1e-3; +function isLayerValid(layer) { + if (!layer) { + return false; + } + if (layer.__builtin__) { + return true; + } + if (typeof layer.resize !== "function" || typeof layer.refresh !== "function") { + return false; + } + return true; +} +function createRoot(width, height) { + var domRoot = document.createElement("div"); + domRoot.style.cssText = [ + "position:relative", + "width:" + width + "px", + "height:" + height + "px", + "padding:0", + "margin:0", + "border-width:0" + ].join(";") + ";"; + return domRoot; +} +var CanvasPainter = function() { + function CanvasPainter2(root, storage, opts, id) { + this.type = "canvas"; + this._zlevelList = []; + this._prevDisplayList = []; + this._layers = {}; + this._layerConfig = {}; + this._needsManuallyCompositing = false; + this.type = "canvas"; + var singleCanvas = !root.nodeName || root.nodeName.toUpperCase() === "CANVAS"; + this._opts = opts = extend({}, opts || {}); + this.dpr = opts.devicePixelRatio || devicePixelRatio; + this._singleCanvas = singleCanvas; + this.root = root; + var rootStyle = root.style; + if (rootStyle) { + disableUserSelect(root); + root.innerHTML = ""; + } + this.storage = storage; + var zlevelList = this._zlevelList; + this._prevDisplayList = []; + var layers = this._layers; + if (!singleCanvas) { + this._width = getSize(root, 0, opts); + this._height = getSize(root, 1, opts); + var domRoot = this._domRoot = createRoot(this._width, this._height); + root.appendChild(domRoot); + } else { + var rootCanvas = root; + var width = rootCanvas.width; + var height = rootCanvas.height; + if (opts.width != null) { + width = opts.width; + } + if (opts.height != null) { + height = opts.height; + } + this.dpr = opts.devicePixelRatio || 1; + rootCanvas.width = width * this.dpr; + rootCanvas.height = height * this.dpr; + this._width = width; + this._height = height; + var mainLayer = new Layer(rootCanvas, this, this.dpr); + mainLayer.__builtin__ = true; + mainLayer.initContext(); + layers[CANVAS_ZLEVEL] = mainLayer; + mainLayer.zlevel = CANVAS_ZLEVEL; + zlevelList.push(CANVAS_ZLEVEL); + this._domRoot = root; + } + } + CanvasPainter2.prototype.getType = function() { + return "canvas"; + }; + CanvasPainter2.prototype.isSingleCanvas = function() { + return this._singleCanvas; + }; + CanvasPainter2.prototype.getViewportRoot = function() { + return this._domRoot; + }; + CanvasPainter2.prototype.getViewportRootOffset = function() { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }; + CanvasPainter2.prototype.refresh = function(paintAll) { + var list = this.storage.getDisplayList(true); + var prevList = this._prevDisplayList; + var zlevelList = this._zlevelList; + this._redrawId = Math.random(); + this._paintList(list, prevList, paintAll, this._redrawId); + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__ && layer.refresh) { + var clearColor = i === 0 ? this._backgroundColor : null; + layer.refresh(clearColor); + } + } + if (this._opts.useDirtyRect) { + this._prevDisplayList = list.slice(); + } + return this; + }; + CanvasPainter2.prototype.refreshHover = function() { + this._paintHoverList(this.storage.getDisplayList(false)); + }; + CanvasPainter2.prototype._paintHoverList = function(list) { + var len = list.length; + var hoverLayer = this._hoverlayer; + hoverLayer && hoverLayer.clear(); + if (!len) { + return; + } + var scope = { + inHover: true, + viewWidth: this._width, + viewHeight: this._height + }; + var ctx; + for (var i = 0; i < len; i++) { + var el = list[i]; + if (el.__inHover) { + if (!hoverLayer) { + hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL); + } + if (!ctx) { + ctx = hoverLayer.ctx; + ctx.save(); + } + brush(ctx, el, scope, i === len - 1); + } + } + if (ctx) { + ctx.restore(); + } + }; + CanvasPainter2.prototype.getHoverLayer = function() { + return this.getLayer(HOVER_LAYER_ZLEVEL); + }; + CanvasPainter2.prototype.paintOne = function(ctx, el) { + brushSingle(ctx, el); + }; + CanvasPainter2.prototype._paintList = function(list, prevList, paintAll, redrawId) { + if (this._redrawId !== redrawId) { + return; + } + paintAll = paintAll || false; + this._updateLayerStatus(list); + var _a = this._doPaintList(list, prevList, paintAll), finished = _a.finished, needsRefreshHover = _a.needsRefreshHover; + if (this._needsManuallyCompositing) { + this._compositeManually(); + } + if (needsRefreshHover) { + this._paintHoverList(list); + } + if (!finished) { + var self_1 = this; + requestAnimationFrame$1(function() { + self_1._paintList(list, prevList, paintAll, redrawId); + }); + } else { + this.eachLayer(function(layer) { + layer.afterBrush && layer.afterBrush(); + }); + } + }; + CanvasPainter2.prototype._compositeManually = function() { + var ctx = this.getLayer(CANVAS_ZLEVEL).ctx; + var width = this._domRoot.width; + var height = this._domRoot.height; + ctx.clearRect(0, 0, width, height); + this.eachBuiltinLayer(function(layer) { + if (layer.virtual) { + ctx.drawImage(layer.dom, 0, 0, width, height); + } + }); + }; + CanvasPainter2.prototype._doPaintList = function(list, prevList, paintAll) { + var _this = this; + var layerList = []; + var useDirtyRect = this._opts.useDirtyRect; + for (var zi = 0; zi < this._zlevelList.length; zi++) { + var zlevel = this._zlevelList[zi]; + var layer = this._layers[zlevel]; + if (layer.__builtin__ && layer !== this._hoverlayer && (layer.__dirty || paintAll)) { + layerList.push(layer); + } + } + var finished = true; + var needsRefreshHover = false; + var _loop_1 = function(k2) { + var layer2 = layerList[k2]; + var ctx = layer2.ctx; + var repaintRects = useDirtyRect && layer2.createRepaintRects(list, prevList, this_1._width, this_1._height); + var start = paintAll ? layer2.__startIndex : layer2.__drawIndex; + var useTimer = !paintAll && layer2.incremental && Date.now; + var startTime = useTimer && Date.now(); + var clearColor = layer2.zlevel === this_1._zlevelList[0] ? this_1._backgroundColor : null; + if (layer2.__startIndex === layer2.__endIndex) { + layer2.clear(false, clearColor, repaintRects); + } else if (start === layer2.__startIndex) { + var firstEl = list[start]; + if (!firstEl.incremental || !firstEl.notClear || paintAll) { + layer2.clear(false, clearColor, repaintRects); + } + } + if (start === -1) { + console.error("For some unknown reason. drawIndex is -1"); + start = layer2.__startIndex; + } + var i; + var repaint = function(repaintRect) { + var scope = { + inHover: false, + allClipped: false, + prevEl: null, + viewWidth: _this._width, + viewHeight: _this._height + }; + for (i = start; i < layer2.__endIndex; i++) { + var el = list[i]; + if (el.__inHover) { + needsRefreshHover = true; + } + _this._doPaintEl(el, layer2, useDirtyRect, repaintRect, scope, i === layer2.__endIndex - 1); + if (useTimer) { + var dTime = Date.now() - startTime; + if (dTime > 15) { + break; + } + } + } + if (scope.prevElClipPaths) { + ctx.restore(); + } + }; + if (repaintRects) { + if (repaintRects.length === 0) { + i = layer2.__endIndex; + } else { + var dpr = this_1.dpr; + for (var r = 0; r < repaintRects.length; ++r) { + var rect = repaintRects[r]; + ctx.save(); + ctx.beginPath(); + ctx.rect(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + ctx.clip(); + repaint(rect); + ctx.restore(); + } + } + } else { + ctx.save(); + repaint(); + ctx.restore(); + } + layer2.__drawIndex = i; + if (layer2.__drawIndex < layer2.__endIndex) { + finished = false; + } + }; + var this_1 = this; + for (var k = 0; k < layerList.length; k++) { + _loop_1(k); + } + if (env.wxa) { + each$4(this._layers, function(layer2) { + if (layer2 && layer2.ctx && layer2.ctx.draw) { + layer2.ctx.draw(); + } + }); + } + return { + finished, + needsRefreshHover + }; + }; + CanvasPainter2.prototype._doPaintEl = function(el, currentLayer, useDirtyRect, repaintRect, scope, isLast) { + var ctx = currentLayer.ctx; + if (useDirtyRect) { + var paintRect = el.getPaintRect(); + if (!repaintRect || paintRect && paintRect.intersect(repaintRect)) { + brush(ctx, el, scope, isLast); + el.setPrevPaintRect(paintRect); + } + } else { + brush(ctx, el, scope, isLast); + } + }; + CanvasPainter2.prototype.getLayer = function(zlevel, virtual) { + if (this._singleCanvas && !this._needsManuallyCompositing) { + zlevel = CANVAS_ZLEVEL; + } + var layer = this._layers[zlevel]; + if (!layer) { + layer = new Layer("zr_" + zlevel, this, this.dpr); + layer.zlevel = zlevel; + layer.__builtin__ = true; + if (this._layerConfig[zlevel]) { + merge(layer, this._layerConfig[zlevel], true); + } else if (this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC]) { + merge(layer, this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC], true); + } + if (virtual) { + layer.virtual = virtual; + } + this.insertLayer(zlevel, layer); + layer.initContext(); + } + return layer; + }; + CanvasPainter2.prototype.insertLayer = function(zlevel, layer) { + var layersMap = this._layers; + var zlevelList = this._zlevelList; + var len = zlevelList.length; + var domRoot = this._domRoot; + var prevLayer = null; + var i = -1; + if (layersMap[zlevel]) { + return; + } + if (!isLayerValid(layer)) { + return; + } + if (len > 0 && zlevel > zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if (zlevelList[i] < zlevel && zlevelList[i + 1] > zlevel) { + break; + } + } + prevLayer = layersMap[zlevelList[i]]; + } + zlevelList.splice(i + 1, 0, zlevel); + layersMap[zlevel] = layer; + if (!layer.virtual) { + if (prevLayer) { + var prevDom = prevLayer.dom; + if (prevDom.nextSibling) { + domRoot.insertBefore(layer.dom, prevDom.nextSibling); + } else { + domRoot.appendChild(layer.dom); + } + } else { + if (domRoot.firstChild) { + domRoot.insertBefore(layer.dom, domRoot.firstChild); + } else { + domRoot.appendChild(layer.dom); + } + } + } + layer.painter || (layer.painter = this); + }; + CanvasPainter2.prototype.eachLayer = function(cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + cb.call(context, this._layers[z], z); + } + }; + CanvasPainter2.prototype.eachBuiltinLayer = function(cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter2.prototype.eachOtherLayer = function(cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter2.prototype.getLayers = function() { + return this._layers; + }; + CanvasPainter2.prototype._updateLayerStatus = function(list) { + this.eachBuiltinLayer(function(layer2, z) { + layer2.__dirty = layer2.__used = false; + }); + function updatePrevLayer(idx) { + if (prevLayer) { + if (prevLayer.__endIndex !== idx) { + prevLayer.__dirty = true; + } + prevLayer.__endIndex = idx; + } + } + if (this._singleCanvas) { + for (var i_1 = 1; i_1 < list.length; i_1++) { + var el = list[i_1]; + if (el.zlevel !== list[i_1 - 1].zlevel || el.incremental) { + this._needsManuallyCompositing = true; + break; + } + } + } + var prevLayer = null; + var incrementalLayerCount = 0; + var prevZlevel; + var i; + for (i = 0; i < list.length; i++) { + var el = list[i]; + var zlevel = el.zlevel; + var layer = void 0; + if (prevZlevel !== zlevel) { + prevZlevel = zlevel; + incrementalLayerCount = 0; + } + if (el.incremental) { + layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing); + layer.incremental = true; + incrementalLayerCount = 1; + } else { + layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing); + } + if (!layer.__builtin__) { + logError("ZLevel " + zlevel + " has been used by unkown layer " + layer.id); + } + if (layer !== prevLayer) { + layer.__used = true; + if (layer.__startIndex !== i) { + layer.__dirty = true; + } + layer.__startIndex = i; + if (!layer.incremental) { + layer.__drawIndex = i; + } else { + layer.__drawIndex = -1; + } + updatePrevLayer(i); + prevLayer = layer; + } + if (el.__dirty & REDRAW_BIT && !el.__inHover) { + layer.__dirty = true; + if (layer.incremental && layer.__drawIndex < 0) { + layer.__drawIndex = i; + } + } + } + updatePrevLayer(i); + this.eachBuiltinLayer(function(layer2, z) { + if (!layer2.__used && layer2.getElementCount() > 0) { + layer2.__dirty = true; + layer2.__startIndex = layer2.__endIndex = layer2.__drawIndex = 0; + } + if (layer2.__dirty && layer2.__drawIndex < 0) { + layer2.__drawIndex = layer2.__startIndex; + } + }); + }; + CanvasPainter2.prototype.clear = function() { + this.eachBuiltinLayer(this._clearLayer); + return this; + }; + CanvasPainter2.prototype._clearLayer = function(layer) { + layer.clear(); + }; + CanvasPainter2.prototype.setBackgroundColor = function(backgroundColor) { + this._backgroundColor = backgroundColor; + each$4(this._layers, function(layer) { + layer.setUnpainted(); + }); + }; + CanvasPainter2.prototype.configLayer = function(zlevel, config) { + if (config) { + var layerConfig = this._layerConfig; + if (!layerConfig[zlevel]) { + layerConfig[zlevel] = config; + } else { + merge(layerConfig[zlevel], config, true); + } + for (var i = 0; i < this._zlevelList.length; i++) { + var _zlevel = this._zlevelList[i]; + if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) { + var layer = this._layers[_zlevel]; + merge(layer, layerConfig[zlevel], true); + } + } + } + }; + CanvasPainter2.prototype.delLayer = function(zlevel) { + var layers = this._layers; + var zlevelList = this._zlevelList; + var layer = layers[zlevel]; + if (!layer) { + return; + } + layer.dom.parentNode.removeChild(layer.dom); + delete layers[zlevel]; + zlevelList.splice(indexOf(zlevelList, zlevel), 1); + }; + CanvasPainter2.prototype.resize = function(width, height) { + if (!this._domRoot.style) { + if (width == null || height == null) { + return; + } + this._width = width; + this._height = height; + this.getLayer(CANVAS_ZLEVEL).resize(width, height); + } else { + var domRoot = this._domRoot; + domRoot.style.display = "none"; + var opts = this._opts; + var root = this.root; + width != null && (opts.width = width); + height != null && (opts.height = height); + width = getSize(root, 0, opts); + height = getSize(root, 1, opts); + domRoot.style.display = ""; + if (this._width !== width || height !== this._height) { + domRoot.style.width = width + "px"; + domRoot.style.height = height + "px"; + for (var id in this._layers) { + if (this._layers.hasOwnProperty(id)) { + this._layers[id].resize(width, height); + } + } + this.refresh(true); + } + this._width = width; + this._height = height; + } + return this; + }; + CanvasPainter2.prototype.clearLayer = function(zlevel) { + var layer = this._layers[zlevel]; + if (layer) { + layer.clear(); + } + }; + CanvasPainter2.prototype.dispose = function() { + this.root.innerHTML = ""; + this.root = this.storage = this._domRoot = this._layers = null; + }; + CanvasPainter2.prototype.getRenderedCanvas = function(opts) { + opts = opts || {}; + if (this._singleCanvas && !this._compositeManually) { + return this._layers[CANVAS_ZLEVEL].dom; + } + var imageLayer = new Layer("image", this, opts.pixelRatio || this.dpr); + imageLayer.initContext(); + imageLayer.clear(false, opts.backgroundColor || this._backgroundColor); + var ctx = imageLayer.ctx; + if (opts.pixelRatio <= this.dpr) { + this.refresh(); + var width_1 = imageLayer.dom.width; + var height_1 = imageLayer.dom.height; + this.eachLayer(function(layer) { + if (layer.__builtin__) { + ctx.drawImage(layer.dom, 0, 0, width_1, height_1); + } else if (layer.renderToCanvas) { + ctx.save(); + layer.renderToCanvas(ctx); + ctx.restore(); + } + }); + } else { + var scope = { + inHover: false, + viewWidth: this._width, + viewHeight: this._height + }; + var displayList = this.storage.getDisplayList(true); + for (var i = 0, len = displayList.length; i < len; i++) { + var el = displayList[i]; + brush(ctx, el, scope, i === len - 1); + } + } + return imageLayer.dom; + }; + CanvasPainter2.prototype.getWidth = function() { + return this._width; + }; + CanvasPainter2.prototype.getHeight = function() { + return this._height; + }; + return CanvasPainter2; +}(); + +function install$a(registers) { + registers.registerPainter('canvas', CanvasPainter); +} + +var LineSeriesModel = ( + /** @class */ + function(_super) { + __extends(LineSeriesModel2, _super); + function LineSeriesModel2() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = LineSeriesModel2.type; + _this.hasSymbolVisual = true; + return _this; + } + LineSeriesModel2.prototype.getInitialData = function(option) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + LineSeriesModel2.prototype.getLegendIcon = function(opt) { + var group = new Group$2(); + var line = createSymbol("line", 0, opt.itemHeight / 2, opt.itemWidth, 0, opt.lineStyle.stroke, false); + group.add(line); + line.setStyle(opt.lineStyle); + var visualType = this.getData().getVisual("symbol"); + var visualRotate = this.getData().getVisual("symbolRotate"); + var symbolType = visualType === "none" ? "circle" : visualType; + var size = opt.itemHeight * 0.8; + var symbol = createSymbol(symbolType, (opt.itemWidth - size) / 2, (opt.itemHeight - size) / 2, size, size, opt.itemStyle.fill); + group.add(symbol); + symbol.setStyle(opt.itemStyle); + var symbolRotate = opt.iconRotate === "inherit" ? visualRotate : opt.iconRotate || 0; + symbol.rotation = symbolRotate * Math.PI / 180; + symbol.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); + if (symbolType.indexOf("empty") > -1) { + symbol.style.stroke = symbol.style.fill; + symbol.style.fill = "#fff"; + symbol.style.lineWidth = 2; + } + return group; + }; + LineSeriesModel2.type = "series.line"; + LineSeriesModel2.dependencies = ["grid", "polar"]; + LineSeriesModel2.defaultOption = { + // zlevel: 0, + z: 3, + coordinateSystem: "cartesian2d", + legendHoverLink: true, + clip: true, + label: { + position: "top" + }, + // itemStyle: { + // }, + endLabel: { + show: false, + valueAnimation: true, + distance: 8 + }, + lineStyle: { + width: 2, + type: "solid" + }, + emphasis: { + scale: true + }, + // areaStyle: { + // origin of areaStyle. Valid values: + // `'auto'/null/undefined`: from axisLine to data + // `'start'`: from min to data + // `'end'`: from data to max + // origin: 'auto' + // }, + // false, 'start', 'end', 'middle' + step: false, + // Disabled if step is true + smooth: false, + smoothMonotone: null, + symbol: "emptyCircle", + symbolSize: 4, + symbolRotate: null, + showSymbol: true, + // `false`: follow the label interval strategy. + // `true`: show all symbols. + // `'auto'`: If possible, show all symbols, otherwise + // follow the label interval strategy. + showAllSymbol: "auto", + // Whether to connect break point. + connectNulls: false, + // Sampling for large data. Can be: 'average', 'max', 'min', 'sum', 'lttb'. + sampling: "none", + animationEasing: "linear", + // Disable progressive + progressive: 0, + hoverLayerThreshold: Infinity, + universalTransition: { + divideShape: "clone" + }, + triggerLineEvent: false + }; + return LineSeriesModel2; + }(SeriesModel) +); + +/** + * @return label string. Not null/undefined + */ +function getDefaultLabel(data, dataIndex) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + var len = labelDims.length; + // Simple optimization (in lots of cases, label dims length is 1) + if (len === 1) { + var rawVal = retrieveRawValue(data, dataIndex, labelDims[0]); + return rawVal != null ? rawVal + '' : null; + } else if (len) { + var vals = []; + for (var i = 0; i < labelDims.length; i++) { + vals.push(retrieveRawValue(data, dataIndex, labelDims[i])); + } + return vals.join(' '); + } +} +function getDefaultInterpolatedLabel(data, interpolatedValue) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + if (!isArray(interpolatedValue)) { + return interpolatedValue + ''; + } + var vals = []; + for (var i = 0; i < labelDims.length; i++) { + var dimIndex = data.getDimensionIndex(labelDims[i]); + if (dimIndex >= 0) { + vals.push(interpolatedValue[dimIndex]); + } + } + return vals.join(' '); +} + +var Symbol$1 = /** @class */function (_super) { + __extends(Symbol, _super); + function Symbol(data, idx, seriesScope, opts) { + var _this = _super.call(this) || this; + _this.updateData(data, idx, seriesScope, opts); + return _this; + } + Symbol.prototype._createSymbol = function (symbolType, data, idx, symbolSize, keepAspect) { + // Remove paths created before + this.removeAll(); + // let symbolPath = createSymbol( + // symbolType, -0.5, -0.5, 1, 1, color + // ); + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4150. + var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, null, keepAspect); + symbolPath.attr({ + z2: 100, + culling: true, + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }); + // Rewrite drift method + symbolPath.drift = driftSymbol; + this._symbolType = symbolType; + this.add(symbolPath); + }; + /** + * Stop animation + * @param {boolean} toLastFrame + */ + Symbol.prototype.stopSymbolAnimation = function (toLastFrame) { + this.childAt(0).stopAnimation(null, toLastFrame); + }; + Symbol.prototype.getSymbolType = function () { + return this._symbolType; + }; + /** + * FIXME: + * Caution: This method breaks the encapsulation of this module, + * but it indeed brings convenience. So do not use the method + * unless you detailedly know all the implements of `Symbol`, + * especially animation. + * + * Get symbol path element. + */ + Symbol.prototype.getSymbolPath = function () { + return this.childAt(0); + }; + /** + * Highlight symbol + */ + Symbol.prototype.highlight = function () { + enterEmphasis(this.childAt(0)); + }; + /** + * Downplay symbol + */ + Symbol.prototype.downplay = function () { + leaveEmphasis(this.childAt(0)); + }; + /** + * @param {number} zlevel + * @param {number} z + */ + Symbol.prototype.setZ = function (zlevel, z) { + var symbolPath = this.childAt(0); + symbolPath.zlevel = zlevel; + symbolPath.z = z; + }; + Symbol.prototype.setDraggable = function (draggable, hasCursorOption) { + var symbolPath = this.childAt(0); + symbolPath.draggable = draggable; + symbolPath.cursor = !hasCursorOption && draggable ? 'move' : symbolPath.cursor; + }; + /** + * Update symbol properties + */ + Symbol.prototype.updateData = function (data, idx, seriesScope, opts) { + this.silent = false; + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var seriesModel = data.hostModel; + var symbolSize = Symbol.getSymbolSize(data, idx); + var isInit = symbolType !== this._symbolType; + var disableAnimation = opts && opts.disableAnimation; + if (isInit) { + var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect'); + this._createSymbol(symbolType, data, idx, symbolSize, keepAspect); + } else { + var symbolPath = this.childAt(0); + symbolPath.silent = false; + var target = { + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }; + disableAnimation ? symbolPath.attr(target) : updateProps$1(symbolPath, target, seriesModel, idx); + saveOldStyle(symbolPath); + } + this._updateCommon(data, idx, symbolSize, seriesScope, opts); + if (isInit) { + var symbolPath = this.childAt(0); + if (!disableAnimation) { + var target = { + scaleX: this._sizeX, + scaleY: this._sizeY, + style: { + // Always fadeIn. Because it has fadeOut animation when symbol is removed.. + opacity: symbolPath.style.opacity + } + }; + symbolPath.scaleX = symbolPath.scaleY = 0; + symbolPath.style.opacity = 0; + initProps(symbolPath, target, seriesModel, idx); + } + } + if (disableAnimation) { + // Must stop leave transition manually if don't call initProps or updateProps. + this.childAt(0).stopAnimation('leave'); + } + }; + Symbol.prototype._updateCommon = function (data, idx, symbolSize, seriesScope, opts) { + var symbolPath = this.childAt(0); + var seriesModel = data.hostModel; + var emphasisItemStyle; + var blurItemStyle; + var selectItemStyle; + var focus; + var blurScope; + var emphasisDisabled; + var labelStatesModels; + var hoverScale; + var cursorStyle; + if (seriesScope) { + emphasisItemStyle = seriesScope.emphasisItemStyle; + blurItemStyle = seriesScope.blurItemStyle; + selectItemStyle = seriesScope.selectItemStyle; + focus = seriesScope.focus; + blurScope = seriesScope.blurScope; + labelStatesModels = seriesScope.labelStatesModels; + hoverScale = seriesScope.hoverScale; + cursorStyle = seriesScope.cursorStyle; + emphasisDisabled = seriesScope.emphasisDisabled; + } + if (!seriesScope || data.hasItemOption) { + var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + selectItemStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + blurItemStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + emphasisDisabled = emphasisModel.get('disabled'); + labelStatesModels = getLabelStatesModels(itemModel); + hoverScale = emphasisModel.getShallow('scale'); + cursorStyle = itemModel.getShallow('cursor'); + } + var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); + symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0); + var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize); + if (symbolOffset) { + symbolPath.x = symbolOffset[0]; + symbolPath.y = symbolOffset[1]; + } + cursorStyle && symbolPath.attr('cursor', cursorStyle); + var symbolStyle = data.getItemVisual(idx, 'style'); + var visualColor = symbolStyle.fill; + if (symbolPath instanceof ZRImage) { + var pathStyle = symbolPath.style; + symbolPath.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolStyle)); + } else { + if (symbolPath.__isEmptyBrush) { + // fill and stroke will be swapped if it's empty. + // So we cloned a new style to avoid it affecting the original style in visual storage. + // TODO Better implementation. No empty logic! + symbolPath.useStyle(extend({}, symbolStyle)); + } else { + symbolPath.useStyle(symbolStyle); + } + // Disable decal because symbol scale will been applied on the decal. + symbolPath.style.decal = null; + symbolPath.setColor(visualColor, opts && opts.symbolInnerColor); + symbolPath.style.strokeNoScale = true; + } + var liftZ = data.getItemVisual(idx, 'liftZ'); + var z2Origin = this._z2; + if (liftZ != null) { + if (z2Origin == null) { + this._z2 = symbolPath.z2; + symbolPath.z2 += liftZ; + } + } else if (z2Origin != null) { + symbolPath.z2 = z2Origin; + this._z2 = null; + } + var useNameLabel = opts && opts.useNameLabel; + setLabelStyle(symbolPath, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultText: getLabelDefaultText, + inheritColor: visualColor, + defaultOpacity: symbolStyle.opacity + }); + // Do not execute util needed. + function getLabelDefaultText(idx) { + return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx); + } + this._sizeX = symbolSize[0] / 2; + this._sizeY = symbolSize[1] / 2; + var emphasisState = symbolPath.ensureState('emphasis'); + emphasisState.style = emphasisItemStyle; + symbolPath.ensureState('select').style = selectItemStyle; + symbolPath.ensureState('blur').style = blurItemStyle; + // null / undefined / true means to use default strategy. + // 0 / false / negative number / NaN / Infinity means no scale. + var scaleRatio = hoverScale == null || hoverScale === true ? Math.max(1.1, 3 / this._sizeY) + // PENDING: restrict hoverScale > 1? It seems unreasonable to scale down + : isFinite(hoverScale) && hoverScale > 0 ? +hoverScale : 1; + // always set scale to allow resetting + emphasisState.scaleX = this._sizeX * scaleRatio; + emphasisState.scaleY = this._sizeY * scaleRatio; + this.setSymbolScale(1); + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + Symbol.prototype.setSymbolScale = function (scale) { + this.scaleX = this.scaleY = scale; + }; + Symbol.prototype.fadeOut = function (cb, seriesModel, opt) { + var symbolPath = this.childAt(0); + var dataIndex = getECData(this).dataIndex; + var animationOpt = opt && opt.animation; + // Avoid mistaken hover when fading out + this.silent = symbolPath.silent = true; + // Not show text when animating + if (opt && opt.fadeLabel) { + var textContent = symbolPath.getTextContent(); + if (textContent) { + removeElement(textContent, { + style: { + opacity: 0 + } + }, seriesModel, { + dataIndex: dataIndex, + removeOpt: animationOpt, + cb: function () { + symbolPath.removeTextContent(); + } + }); + } + } else { + symbolPath.removeTextContent(); + } + removeElement(symbolPath, { + style: { + opacity: 0 + }, + scaleX: 0, + scaleY: 0 + }, seriesModel, { + dataIndex: dataIndex, + cb: cb, + removeOpt: animationOpt + }); + }; + Symbol.getSymbolSize = function (data, idx) { + return normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + }; + return Symbol; +}(Group$2); +function driftSymbol(dx, dy) { + this.parent.drift(dx, dy); +} + +function symbolNeedsDraw(data, point, idx, opt) { + return point && !isNaN(point[0]) && !isNaN(point[1]) && !(opt.isIgnore && opt.isIgnore(idx)) + // We do not set clipShape on group, because it will cut part of + // the symbol element shape. We use the same clip shape here as + // the line clip. + && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) && data.getItemVisual(idx, 'symbol') !== 'none'; +} +function normalizeUpdateOpt(opt) { + if (opt != null && !isObject$2(opt)) { + opt = { + isIgnore: opt + }; + } + return opt || {}; +} +function makeSeriesScope(data) { + var seriesModel = data.hostModel; + var emphasisModel = seriesModel.getModel('emphasis'); + return { + emphasisItemStyle: emphasisModel.getModel('itemStyle').getItemStyle(), + blurItemStyle: seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(), + selectItemStyle: seriesModel.getModel(['select', 'itemStyle']).getItemStyle(), + focus: emphasisModel.get('focus'), + blurScope: emphasisModel.get('blurScope'), + emphasisDisabled: emphasisModel.get('disabled'), + hoverScale: emphasisModel.get('scale'), + labelStatesModels: getLabelStatesModels(seriesModel), + cursorStyle: seriesModel.get('cursor') + }; +} +var SymbolDraw = /** @class */function () { + function SymbolDraw(SymbolCtor) { + this.group = new Group$2(); + this._SymbolCtor = SymbolCtor || Symbol$1; + } + /** + * Update symbols draw by new data + */ + SymbolDraw.prototype.updateData = function (data, opt) { + // Remove progressive els. + this._progressiveEls = null; + opt = normalizeUpdateOpt(opt); + var group = this.group; + var seriesModel = data.hostModel; + var oldData = this._data; + var SymbolCtor = this._SymbolCtor; + var disableAnimation = opt.disableAnimation; + var seriesScope = makeSeriesScope(data); + var symbolUpdateOpt = { + disableAnimation: disableAnimation + }; + var getSymbolPoint = opt.getSymbolPoint || function (idx) { + return data.getItemLayout(idx); + }; + // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + if (!oldData) { + group.removeAll(); + } + data.diff(oldData).add(function (newIdx) { + var point = getSymbolPoint(newIdx); + if (symbolNeedsDraw(data, point, newIdx, opt)) { + var symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); + symbolEl.setPosition(point); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + var point = getSymbolPoint(newIdx); + if (!symbolNeedsDraw(data, point, newIdx, opt)) { + group.remove(symbolEl); + return; + } + var newSymbolType = data.getItemVisual(newIdx, 'symbol') || 'circle'; + var oldSymbolType = symbolEl && symbolEl.getSymbolType && symbolEl.getSymbolType(); + if (!symbolEl + // Create a new if symbol type changed. + || oldSymbolType && oldSymbolType !== newSymbolType) { + group.remove(symbolEl); + symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); + symbolEl.setPosition(point); + } else { + symbolEl.updateData(data, newIdx, seriesScope, symbolUpdateOpt); + var target = { + x: point[0], + y: point[1] + }; + disableAnimation ? symbolEl.attr(target) : updateProps$1(symbolEl, target, seriesModel); + } + // Add back + group.add(symbolEl); + data.setItemGraphicEl(newIdx, symbolEl); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && el.fadeOut(function () { + group.remove(el); + }, seriesModel); + }).execute(); + this._getSymbolPoint = getSymbolPoint; + this._data = data; + }; + SymbolDraw.prototype.updateLayout = function () { + var _this = this; + var data = this._data; + if (data) { + // Not use animation + data.eachItemGraphicEl(function (el, idx) { + var point = _this._getSymbolPoint(idx); + el.setPosition(point); + el.markRedraw(); + }); + } + }; + SymbolDraw.prototype.incrementalPrepareUpdate = function (data) { + this._seriesScope = makeSeriesScope(data); + this._data = null; + this.group.removeAll(); + }; + /** + * Update symbols draw by new data + */ + SymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) { + // Clear + this._progressiveEls = []; + opt = normalizeUpdateOpt(opt); + function updateIncrementalAndHover(el) { + if (!el.isGroup) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var point = data.getItemLayout(idx); + if (symbolNeedsDraw(data, point, idx, opt)) { + var el = new this._SymbolCtor(data, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + el.setPosition(point); + this.group.add(el); + data.setItemGraphicEl(idx, el); + this._progressiveEls.push(el); + } + } + }; + SymbolDraw.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + SymbolDraw.prototype.remove = function (enableAnimation) { + var group = this.group; + var data = this._data; + // Incremental model do not have this._data. + if (data && enableAnimation) { + data.eachItemGraphicEl(function (el) { + el.fadeOut(function () { + group.remove(el); + }, data.hostModel); + }); + } else { + group.removeAll(); + } + }; + return SymbolDraw; +}(); + +function prepareDataCoordInfo(coordSys, data, valueOrigin) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = getValueStart(valueAxis, valueOrigin); + var baseAxisDim = baseAxis.dim; + var valueAxisDim = valueAxis.dim; + var valueDim = data.mapDimension(valueAxisDim); + var baseDim = data.mapDimension(baseAxisDim); + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var dims = map$1(coordSys.dimensions, function (coordDim) { + return data.mapDimension(coordDim); + }); + var stacked = false; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + if (isDimensionStacked(data, dims[0] /* , dims[1] */)) { + // jshint ignore:line + stacked = true; + dims[0] = stackResultDim; + } + if (isDimensionStacked(data, dims[1] /* , dims[0] */)) { + // jshint ignore:line + stacked = true; + dims[1] = stackResultDim; + } + return { + dataDimsForPoint: dims, + valueStart: valueStart, + valueAxisDim: valueAxisDim, + baseAxisDim: baseAxisDim, + stacked: !!stacked, + valueDim: valueDim, + baseDim: baseDim, + baseDataOffset: baseDataOffset, + stackedOverDimension: data.getCalculationInfo('stackedOverDimension') + }; +} +function getValueStart(valueAxis, valueOrigin) { + var valueStart = 0; + var extent = valueAxis.scale.getExtent(); + if (valueOrigin === 'start') { + valueStart = extent[0]; + } else if (valueOrigin === 'end') { + valueStart = extent[1]; + } + // If origin is specified as a number, use it as + // valueStart directly + else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) { + valueStart = valueOrigin; + } + // auto + else { + // Both positive + if (extent[0] > 0) { + valueStart = extent[0]; + } + // Both negative + else if (extent[1] < 0) { + valueStart = extent[1]; + } + // If is one positive, and one negative, onZero shall be true + } + return valueStart; +} +function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) { + var value = NaN; + if (dataCoordInfo.stacked) { + value = data.get(data.getCalculationInfo('stackedOverDimension'), idx); + } + if (isNaN(value)) { + value = dataCoordInfo.valueStart; + } + var baseDataOffset = dataCoordInfo.baseDataOffset; + var stackedData = []; + stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx); + stackedData[1 - baseDataOffset] = value; + return coordSys.dataToPoint(stackedData); +} + +function diffData(oldData, newData) { + var diffResult = []; + newData.diff(oldData).add(function (idx) { + diffResult.push({ + cmd: '+', + idx: idx + }); + }).update(function (newIdx, oldIdx) { + diffResult.push({ + cmd: '=', + idx: oldIdx, + idx1: newIdx + }); + }).remove(function (idx) { + diffResult.push({ + cmd: '-', + idx: idx + }); + }).execute(); + return diffResult; +} +function lineAnimationDiff(oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys, oldValueOrigin, newValueOrigin) { + var diff = diffData(oldData, newData); + // let newIdList = newData.mapArray(newData.getId); + // let oldIdList = oldData.mapArray(oldData.getId); + // convertToIntId(newIdList, oldIdList); + // // FIXME One data ? + // diff = arrayDiff(oldIdList, newIdList); + var currPoints = []; + var nextPoints = []; + // Points for stacking base line + var currStackedPoints = []; + var nextStackedPoints = []; + var status = []; + var sortedIndices = []; + var rawIndices = []; + var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin); + // const oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin); + var oldPoints = oldData.getLayout('points') || []; + var newPoints = newData.getLayout('points') || []; + for (var i = 0; i < diff.length; i++) { + var diffItem = diff[i]; + var pointAdded = true; + var oldIdx2 = void 0; + var newIdx2 = void 0; + // FIXME, animation is not so perfect when dataZoom window moves fast + // Which is in case remvoing or add more than one data in the tail or head + switch (diffItem.cmd) { + case '=': + oldIdx2 = diffItem.idx * 2; + newIdx2 = diffItem.idx1 * 2; + var currentX = oldPoints[oldIdx2]; + var currentY = oldPoints[oldIdx2 + 1]; + var nextX = newPoints[newIdx2]; + var nextY = newPoints[newIdx2 + 1]; + // If previous data is NaN, use next point directly + if (isNaN(currentX) || isNaN(currentY)) { + currentX = nextX; + currentY = nextY; + } + currPoints.push(currentX, currentY); + nextPoints.push(nextX, nextY); + currStackedPoints.push(oldStackedOnPoints[oldIdx2], oldStackedOnPoints[oldIdx2 + 1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(diffItem.idx1)); + break; + case '+': + var newIdx = diffItem.idx; + var newDataDimsForPoint = newDataOldCoordInfo.dataDimsForPoint; + var oldPt = oldCoordSys.dataToPoint([newData.get(newDataDimsForPoint[0], newIdx), newData.get(newDataDimsForPoint[1], newIdx)]); + newIdx2 = newIdx * 2; + currPoints.push(oldPt[0], oldPt[1]); + nextPoints.push(newPoints[newIdx2], newPoints[newIdx2 + 1]); + var stackedOnPoint = getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, newIdx); + currStackedPoints.push(stackedOnPoint[0], stackedOnPoint[1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(newIdx)); + break; + case '-': + pointAdded = false; + } + // Original indices + if (pointAdded) { + status.push(diffItem); + sortedIndices.push(sortedIndices.length); + } + } + // Diff result may be crossed if all items are changed + // Sort by data index + sortedIndices.sort(function (a, b) { + return rawIndices[a] - rawIndices[b]; + }); + var len = currPoints.length; + var sortedCurrPoints = createFloat32Array(len); + var sortedNextPoints = createFloat32Array(len); + var sortedCurrStackedPoints = createFloat32Array(len); + var sortedNextStackedPoints = createFloat32Array(len); + var sortedStatus = []; + for (var i = 0; i < sortedIndices.length; i++) { + var idx = sortedIndices[i]; + var i2 = i * 2; + var idx2 = idx * 2; + sortedCurrPoints[i2] = currPoints[idx2]; + sortedCurrPoints[i2 + 1] = currPoints[idx2 + 1]; + sortedNextPoints[i2] = nextPoints[idx2]; + sortedNextPoints[i2 + 1] = nextPoints[idx2 + 1]; + sortedCurrStackedPoints[i2] = currStackedPoints[idx2]; + sortedCurrStackedPoints[i2 + 1] = currStackedPoints[idx2 + 1]; + sortedNextStackedPoints[i2] = nextStackedPoints[idx2]; + sortedNextStackedPoints[i2 + 1] = nextStackedPoints[idx2 + 1]; + sortedStatus[i] = status[idx]; + } + return { + current: sortedCurrPoints, + next: sortedNextPoints, + stackedOnCurrent: sortedCurrStackedPoints, + stackedOnNext: sortedNextStackedPoints, + status: sortedStatus + }; +} + +var mathMin = Math.min; +var mathMax = Math.max; +function isPointNull$1(x, y) { + return isNaN(x) || isNaN(y); +} +/** + * Draw smoothed line in non-monotone, in may cause undesired curve in extreme + * situations. This should be used when points are non-monotone neither in x or + * y dimension. + */ +function drawSegment(ctx, points, start, segLen, allLen, dir, smooth, smoothMonotone, connectNulls) { + var prevX; + var prevY; + var cpx0; + var cpy0; + var cpx1; + var cpy1; + var idx = start; + var k = 0; + for (; k < segLen; k++) { + var x = points[idx * 2]; + var y = points[idx * 2 + 1]; + if (idx >= allLen || idx < 0) { + break; + } + if (isPointNull$1(x, y)) { + if (connectNulls) { + idx += dir; + continue; + } + break; + } + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](x, y); + cpx0 = x; + cpy0 = y; + } else { + var dx = x - prevX; + var dy = y - prevY; + // Ignore tiny segment. + if (dx * dx + dy * dy < 0.5) { + idx += dir; + continue; + } + if (smooth > 0) { + var nextIdx = idx + dir; + var nextX = points[nextIdx * 2]; + var nextY = points[nextIdx * 2 + 1]; + // Ignore duplicate point + while (nextX === x && nextY === y && k < segLen) { + k++; + nextIdx += dir; + idx += dir; + nextX = points[nextIdx * 2]; + nextY = points[nextIdx * 2 + 1]; + x = points[idx * 2]; + y = points[idx * 2 + 1]; + dx = x - prevX; + dy = y - prevY; + } + var tmpK = k + 1; + if (connectNulls) { + // Find next point not null + while (isPointNull$1(nextX, nextY) && tmpK < segLen) { + tmpK++; + nextIdx += dir; + nextX = points[nextIdx * 2]; + nextY = points[nextIdx * 2 + 1]; + } + } + var ratioNextSeg = 0.5; + var vx = 0; + var vy = 0; + var nextCpx0 = void 0; + var nextCpy0 = void 0; + // Is last point + if (tmpK >= segLen || isPointNull$1(nextX, nextY)) { + cpx1 = x; + cpy1 = y; + } else { + vx = nextX - prevX; + vy = nextY - prevY; + var dx0 = x - prevX; + var dx1 = nextX - x; + var dy0 = y - prevY; + var dy1 = nextY - y; + var lenPrevSeg = void 0; + var lenNextSeg = void 0; + if (smoothMonotone === 'x') { + lenPrevSeg = Math.abs(dx0); + lenNextSeg = Math.abs(dx1); + var dir_1 = vx > 0 ? 1 : -1; + cpx1 = x - dir_1 * lenPrevSeg * smooth; + cpy1 = y; + nextCpx0 = x + dir_1 * lenNextSeg * smooth; + nextCpy0 = y; + } else if (smoothMonotone === 'y') { + lenPrevSeg = Math.abs(dy0); + lenNextSeg = Math.abs(dy1); + var dir_2 = vy > 0 ? 1 : -1; + cpx1 = x; + cpy1 = y - dir_2 * lenPrevSeg * smooth; + nextCpx0 = x; + nextCpy0 = y + dir_2 * lenNextSeg * smooth; + } else { + lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0); + lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1); + // Use ratio of seg length + ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); + cpx1 = x - vx * smooth * (1 - ratioNextSeg); + cpy1 = y - vy * smooth * (1 - ratioNextSeg); + // cp0 of next segment + nextCpx0 = x + vx * smooth * ratioNextSeg; + nextCpy0 = y + vy * smooth * ratioNextSeg; + // Smooth constraint between point and next point. + // Avoid exceeding extreme after smoothing. + nextCpx0 = mathMin(nextCpx0, mathMax(nextX, x)); + nextCpy0 = mathMin(nextCpy0, mathMax(nextY, y)); + nextCpx0 = mathMax(nextCpx0, mathMin(nextX, x)); + nextCpy0 = mathMax(nextCpy0, mathMin(nextY, y)); + // Reclaculate cp1 based on the adjusted cp0 of next seg. + vx = nextCpx0 - x; + vy = nextCpy0 - y; + cpx1 = x - vx * lenPrevSeg / lenNextSeg; + cpy1 = y - vy * lenPrevSeg / lenNextSeg; + // Smooth constraint between point and prev point. + // Avoid exceeding extreme after smoothing. + cpx1 = mathMin(cpx1, mathMax(prevX, x)); + cpy1 = mathMin(cpy1, mathMax(prevY, y)); + cpx1 = mathMax(cpx1, mathMin(prevX, x)); + cpy1 = mathMax(cpy1, mathMin(prevY, y)); + // Adjust next cp0 again. + vx = x - cpx1; + vy = y - cpy1; + nextCpx0 = x + vx * lenNextSeg / lenPrevSeg; + nextCpy0 = y + vy * lenNextSeg / lenPrevSeg; + } + } + ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y); + cpx0 = nextCpx0; + cpy0 = nextCpy0; + } else { + ctx.lineTo(x, y); + } + } + prevX = x; + prevY = y; + idx += dir; + } + return k; +} +var ECPolylineShape = /** @class */function () { + function ECPolylineShape() { + this.smooth = 0; + this.smoothConstraint = true; + } + return ECPolylineShape; +}(); +var ECPolyline = /** @class */function (_super) { + __extends(ECPolyline, _super); + function ECPolyline(opts) { + var _this = _super.call(this, opts) || this; + _this.type = 'ec-polyline'; + return _this; + } + ECPolyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + ECPolyline.prototype.getDefaultShape = function () { + return new ECPolylineShape(); + }; + ECPolyline.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var i = 0; + var len = points.length / 2; + // const result = getBoundingBox(points, shape.smoothConstraint); + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull$1(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + for (; i < len; i++) { + if (!isPointNull$1(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + while (i < len) { + i += drawSegment(ctx, points, i, len, len, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1; + } + }; + ECPolyline.prototype.getPointOn = function (xOrY, dim) { + if (!this.path) { + this.createPathProxy(); + this.buildPath(this.path, this.shape); + } + var path = this.path; + var data = path.data; + var CMD = PathProxy.CMD; + var x0; + var y0; + var isDimX = dim === 'x'; + var roots = []; + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + var x = void 0; + var y = void 0; + var x2 = void 0; + var y2 = void 0; + var x3 = void 0; + var y3 = void 0; + var t = void 0; + switch (cmd) { + case CMD.M: + x0 = data[i++]; + y0 = data[i++]; + break; + case CMD.L: + x = data[i++]; + y = data[i++]; + t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0); + if (t <= 1 && t >= 0) { + var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0; + return isDimX ? [xOrY, val] : [val, xOrY]; + } + x0 = x; + y0 = y; + break; + case CMD.C: + x = data[i++]; + y = data[i++]; + x2 = data[i++]; + y2 = data[i++]; + x3 = data[i++]; + y3 = data[i++]; + var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots); + if (nRoot > 0) { + for (var i_1 = 0; i_1 < nRoot; i_1++) { + var t_1 = roots[i_1]; + if (t_1 <= 1 && t_1 >= 0) { + var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1); + return isDimX ? [xOrY, val] : [val, xOrY]; + } + } + } + x0 = x3; + y0 = y3; + break; + } + } + }; + return ECPolyline; +}(Path); +var ECPolygonShape = /** @class */function (_super) { + __extends(ECPolygonShape, _super); + function ECPolygonShape() { + return _super !== null && _super.apply(this, arguments) || this; + } + return ECPolygonShape; +}(ECPolylineShape); +var ECPolygon = /** @class */function (_super) { + __extends(ECPolygon, _super); + function ECPolygon(opts) { + var _this = _super.call(this, opts) || this; + _this.type = 'ec-polygon'; + return _this; + } + ECPolygon.prototype.getDefaultShape = function () { + return new ECPolygonShape(); + }; + ECPolygon.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var stackedOnPoints = shape.stackedOnPoints; + var i = 0; + var len = points.length / 2; + var smoothMonotone = shape.smoothMonotone; + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull$1(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + for (; i < len; i++) { + if (!isPointNull$1(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + while (i < len) { + var k = drawSegment(ctx, points, i, len, len, 1, shape.smooth, smoothMonotone, shape.connectNulls); + drawSegment(ctx, stackedOnPoints, i + k - 1, k, len, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls); + i += k + 1; + ctx.closePath(); + } + }; + return ECPolygon; +}(Path); + +function createGridClipPath(cartesian, hasAnimation, seriesModel, done, during) { + var rect = cartesian.getArea(); + var x = rect.x; + var y = rect.y; + var width = rect.width; + var height = rect.height; + var lineWidth = seriesModel.get(['lineStyle', 'width']) || 0; + // Expand the clip path a bit to avoid the border is clipped and looks thinner + x -= lineWidth / 2; + y -= lineWidth / 2; + width += lineWidth; + height += lineWidth; + // fix: https://github.com/apache/incubator-echarts/issues/11369 + width = Math.ceil(width); + if (x !== Math.floor(x)) { + x = Math.floor(x); + // if no extra 1px on `width`, it will still be clipped since `x` is floored + width++; + } + var clipPath = new Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + } + }); + if (hasAnimation) { + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isAxisInversed = baseAxis.inverse; + if (isHorizontal) { + if (isAxisInversed) { + clipPath.shape.x += width; + } + clipPath.shape.width = 0; + } else { + if (!isAxisInversed) { + clipPath.shape.y += height; + } + clipPath.shape.height = 0; + } + var duringCb = isFunction(during) ? function (percent) { + during(percent, clipPath); + } : null; + initProps(clipPath, { + shape: { + width: width, + height: height, + x: x, + y: y + } + }, seriesModel, null, done, duringCb); + } + return clipPath; +} +function createPolarClipPath(polar, hasAnimation, seriesModel) { + var sectorArea = polar.getArea(); + // Avoid float number rounding error for symbol on the edge of axis extent. + var r0 = round$1(sectorArea.r0, 1); + var r = round$1(sectorArea.r, 1); + var clipPath = new Sector({ + shape: { + cx: round$1(polar.cx, 1), + cy: round$1(polar.cy, 1), + r0: r0, + r: r, + startAngle: sectorArea.startAngle, + endAngle: sectorArea.endAngle, + clockwise: sectorArea.clockwise + } + }); + if (hasAnimation) { + var isRadial = polar.getBaseAxis().dim === 'angle'; + if (isRadial) { + clipPath.shape.endAngle = sectorArea.startAngle; + } else { + clipPath.shape.r = r0; + } + initProps(clipPath, { + shape: { + endAngle: sectorArea.endAngle, + r: r + } + }, seriesModel); + } + return clipPath; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +function isCoordinateSystemType(coordSys, type) { + return coordSys.type === type; +} + +function isPointsSame(points1, points2) { + if (points1.length !== points2.length) { + return; + } + for (var i = 0; i < points1.length; i++) { + if (points1[i] !== points2[i]) { + return; + } + } + return true; +} +function bboxFromPoints(points) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < points.length; ) { + var x = points[i++]; + var y = points[i++]; + if (!isNaN(x)) { + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + } + if (!isNaN(y)) { + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + } + return [[minX, minY], [maxX, maxY]]; +} +function getBoundingDiff(points1, points2) { + var _a = bboxFromPoints(points1), min1 = _a[0], max1 = _a[1]; + var _b = bboxFromPoints(points2), min2 = _b[0], max2 = _b[1]; + return Math.max(Math.abs(min1[0] - min2[0]), Math.abs(min1[1] - min2[1]), Math.abs(max1[0] - max2[0]), Math.abs(max1[1] - max2[1])); +} +function getSmooth(smooth) { + return isNumber(smooth) ? smooth : smooth ? 0.5 : 0; +} +function getStackedOnPoints(coordSys, data, dataCoordInfo) { + if (!dataCoordInfo.valueDim) { + return []; + } + var len = data.count(); + var points = createFloat32Array(len * 2); + for (var idx = 0; idx < len; idx++) { + var pt = getStackedOnPoint(dataCoordInfo, coordSys, data, idx); + points[idx * 2] = pt[0]; + points[idx * 2 + 1] = pt[1]; + } + return points; +} +function turnPointsIntoStep(points, basePoints, coordSys, stepTurnAt, connectNulls) { + var baseAxis = coordSys.getBaseAxis(); + var baseIndex = baseAxis.dim === "x" || baseAxis.dim === "radius" ? 0 : 1; + var stepPoints = []; + var i = 0; + var stepPt = []; + var pt = []; + var nextPt = []; + var filteredPoints = []; + if (connectNulls) { + for (i = 0; i < points.length; i += 2) { + var reference = basePoints || points; + if (!isNaN(reference[i]) && !isNaN(reference[i + 1])) { + filteredPoints.push(points[i], points[i + 1]); + } + } + points = filteredPoints; + } + for (i = 0; i < points.length - 2; i += 2) { + nextPt[0] = points[i + 2]; + nextPt[1] = points[i + 3]; + pt[0] = points[i]; + pt[1] = points[i + 1]; + stepPoints.push(pt[0], pt[1]); + switch (stepTurnAt) { + case "end": + stepPt[baseIndex] = nextPt[baseIndex]; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + break; + case "middle": + var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2; + var stepPt2 = []; + stepPt[baseIndex] = stepPt2[baseIndex] = middle; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPt2[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + stepPoints.push(stepPt2[0], stepPt2[1]); + break; + default: + stepPt[baseIndex] = pt[baseIndex]; + stepPt[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + } + } + stepPoints.push(points[i++], points[i++]); + return stepPoints; +} +function clipColorStops(colorStops, maxSize) { + var newColorStops = []; + var len = colorStops.length; + var prevOutOfRangeColorStop; + var prevInRangeColorStop; + function lerpStop(stop0, stop1, clippedCoord) { + var coord0 = stop0.coord; + var p = (clippedCoord - coord0) / (stop1.coord - coord0); + var color = lerp(p, [stop0.color, stop1.color]); + return { + coord: clippedCoord, + color + }; + } + for (var i = 0; i < len; i++) { + var stop_1 = colorStops[i]; + var coord = stop_1.coord; + if (coord < 0) { + prevOutOfRangeColorStop = stop_1; + } else if (coord > maxSize) { + if (prevInRangeColorStop) { + newColorStops.push(lerpStop(prevInRangeColorStop, stop_1, maxSize)); + } else if (prevOutOfRangeColorStop) { + newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0), lerpStop(prevOutOfRangeColorStop, stop_1, maxSize)); + } + break; + } else { + if (prevOutOfRangeColorStop) { + newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0)); + prevOutOfRangeColorStop = null; + } + newColorStops.push(stop_1); + prevInRangeColorStop = stop_1; + } + } + return newColorStops; +} +function getVisualGradient(data, coordSys, api) { + var visualMetaList = data.getVisual("visualMeta"); + if (!visualMetaList || !visualMetaList.length || !data.count()) { + return; + } + if (coordSys.type !== "cartesian2d") { + return; + } + var coordDim; + var visualMeta; + for (var i = visualMetaList.length - 1; i >= 0; i--) { + var dimInfo = data.getDimensionInfo(visualMetaList[i].dimension); + coordDim = dimInfo && dimInfo.coordDim; + if (coordDim === "x" || coordDim === "y") { + visualMeta = visualMetaList[i]; + break; + } + } + if (!visualMeta) { + return; + } + var axis = coordSys.getAxis(coordDim); + var colorStops = map$1(visualMeta.stops, function(stop) { + return { + coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)), + color: stop.color + }; + }); + var stopLen = colorStops.length; + var outerColors = visualMeta.outerColors.slice(); + if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) { + colorStops.reverse(); + outerColors.reverse(); + } + var colorStopsInRange = clipColorStops(colorStops, coordDim === "x" ? api.getWidth() : api.getHeight()); + var inRangeStopLen = colorStopsInRange.length; + if (!inRangeStopLen && stopLen) { + return colorStops[0].coord < 0 ? outerColors[1] ? outerColors[1] : colorStops[stopLen - 1].color : outerColors[0] ? outerColors[0] : colorStops[0].color; + } + var tinyExtent = 10; + var minCoord = colorStopsInRange[0].coord - tinyExtent; + var maxCoord = colorStopsInRange[inRangeStopLen - 1].coord + tinyExtent; + var coordSpan = maxCoord - minCoord; + if (coordSpan < 1e-3) { + return "transparent"; + } + each$4(colorStopsInRange, function(stop) { + stop.offset = (stop.coord - minCoord) / coordSpan; + }); + colorStopsInRange.push({ + // NOTE: inRangeStopLen may still be 0 if stoplen is zero. + offset: inRangeStopLen ? colorStopsInRange[inRangeStopLen - 1].offset : 0.5, + color: outerColors[1] || "transparent" + }); + colorStopsInRange.unshift({ + offset: inRangeStopLen ? colorStopsInRange[0].offset : 0.5, + color: outerColors[0] || "transparent" + }); + var gradient = new LinearGradient(0, 0, 0, 0, colorStopsInRange, true); + gradient[coordDim] = minCoord; + gradient[coordDim + "2"] = maxCoord; + return gradient; +} +function getIsIgnoreFunc(seriesModel, data, coordSys) { + var showAllSymbol = seriesModel.get("showAllSymbol"); + var isAuto = showAllSymbol === "auto"; + if (showAllSymbol && !isAuto) { + return; + } + var categoryAxis = coordSys.getAxesByScale("ordinal")[0]; + if (!categoryAxis) { + return; + } + if (isAuto && canShowAllSymbolForCategory(categoryAxis, data)) { + return; + } + var categoryDataDim = data.mapDimension(categoryAxis.dim); + var labelMap = {}; + each$4(categoryAxis.getViewLabels(), function(labelItem) { + var ordinalNumber = categoryAxis.scale.getRawOrdinalNumber(labelItem.tickValue); + labelMap[ordinalNumber] = 1; + }); + return function(dataIndex) { + return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex)); + }; +} +function canShowAllSymbolForCategory(categoryAxis, data) { + var axisExtent = categoryAxis.getExtent(); + var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis.scale.count(); + isNaN(availSize) && (availSize = 0); + var dataLen = data.count(); + var step = Math.max(1, Math.round(dataLen / 5)); + for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) { + if (Symbol$1.getSymbolSize( + data, + dataIndex + // Only for cartesian, where `isHorizontal` exists. + )[categoryAxis.isHorizontal() ? 1 : 0] * 1.5 > availSize) { + return false; + } + } + return true; +} +function isPointNull(x, y) { + return isNaN(x) || isNaN(y); +} +function getLastIndexNotNull(points) { + var len = points.length / 2; + for (; len > 0; len--) { + if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + return len - 1; +} +function getPointAtIndex(points, idx) { + return [points[idx * 2], points[idx * 2 + 1]]; +} +function getIndexRange(points, xOrY, dim) { + var len = points.length / 2; + var dimIdx = dim === "x" ? 0 : 1; + var a; + var b; + var prevIndex = 0; + var nextIndex = -1; + for (var i = 0; i < len; i++) { + b = points[i * 2 + dimIdx]; + if (isNaN(b) || isNaN(points[i * 2 + 1 - dimIdx])) { + continue; + } + if (i === 0) { + a = b; + continue; + } + if (a <= xOrY && b >= xOrY || a >= xOrY && b <= xOrY) { + nextIndex = i; + break; + } + prevIndex = i; + a = b; + } + return { + range: [prevIndex, nextIndex], + t: (xOrY - a) / (b - a) + }; +} +function anyStateShowEndLabel(seriesModel) { + if (seriesModel.get(["endLabel", "show"])) { + return true; + } + for (var i = 0; i < SPECIAL_STATES.length; i++) { + if (seriesModel.get([SPECIAL_STATES[i], "endLabel", "show"])) { + return true; + } + } + return false; +} +function createLineClipPath(lineView, coordSys, hasAnimation, seriesModel) { + if (isCoordinateSystemType(coordSys, "cartesian2d")) { + var endLabelModel_1 = seriesModel.getModel("endLabel"); + var valueAnimation_1 = endLabelModel_1.get("valueAnimation"); + var data_1 = seriesModel.getData(); + var labelAnimationRecord_1 = { + lastFrameIndex: 0 + }; + var during = anyStateShowEndLabel(seriesModel) ? function(percent, clipRect) { + lineView._endLabelOnDuring(percent, clipRect, data_1, labelAnimationRecord_1, valueAnimation_1, endLabelModel_1, coordSys); + } : null; + var isHorizontal = coordSys.getBaseAxis().isHorizontal(); + var clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel, function() { + var endLabel = lineView._endLabel; + if (endLabel && hasAnimation) { + if (labelAnimationRecord_1.originalX != null) { + endLabel.attr({ + x: labelAnimationRecord_1.originalX, + y: labelAnimationRecord_1.originalY + }); + } + } + }, during); + if (!seriesModel.get("clip", true)) { + var rectShape = clipPath.shape; + var expandSize = Math.max(rectShape.width, rectShape.height); + if (isHorizontal) { + rectShape.y -= expandSize; + rectShape.height += expandSize * 2; + } else { + rectShape.x -= expandSize; + rectShape.width += expandSize * 2; + } + } + if (during) { + during(1, clipPath); + } + return clipPath; + } else { + return createPolarClipPath(coordSys, hasAnimation, seriesModel); + } +} +function getEndLabelStateSpecified(endLabelModel, coordSys) { + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var align = isHorizontal ? isBaseInversed ? "right" : "left" : "center"; + var verticalAlign = isHorizontal ? "middle" : isBaseInversed ? "top" : "bottom"; + return { + normal: { + align: endLabelModel.get("align") || align, + verticalAlign: endLabelModel.get("verticalAlign") || verticalAlign + } + }; +} +var LineView = ( + /** @class */ + function(_super) { + __extends(LineView2, _super); + function LineView2() { + return _super !== null && _super.apply(this, arguments) || this; + } + LineView2.prototype.init = function() { + var lineGroup = new Group$2(); + var symbolDraw = new SymbolDraw(); + this.group.add(symbolDraw.group); + this._symbolDraw = symbolDraw; + this._lineGroup = lineGroup; + this._changePolyState = bind$1(this._changePolyState, this); + }; + LineView2.prototype.render = function(seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var lineStyleModel = seriesModel.getModel("lineStyle"); + var areaStyleModel = seriesModel.getModel("areaStyle"); + var points = data.getLayout("points") || []; + var isCoordSysPolar = coordSys.type === "polar"; + var prevCoordSys = this._coordSys; + var symbolDraw = this._symbolDraw; + var polyline = this._polyline; + var polygon = this._polygon; + var lineGroup = this._lineGroup; + var hasAnimation = !ecModel.ssr && seriesModel.get("animation"); + var isAreaChart = !areaStyleModel.isEmpty(); + var valueOrigin = areaStyleModel.get("origin"); + var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin); + var stackedOnPoints = isAreaChart && getStackedOnPoints(coordSys, data, dataCoordInfo); + var showSymbol = seriesModel.get("showSymbol"); + var connectNulls = seriesModel.get("connectNulls"); + var isIgnoreFunc = showSymbol && !isCoordSysPolar && getIsIgnoreFunc(seriesModel, data, coordSys); + var oldData = this._data; + oldData && oldData.eachItemGraphicEl(function(el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + if (!showSymbol) { + symbolDraw.remove(); + } + group.add(lineGroup); + var step = !isCoordSysPolar ? seriesModel.get("step") : false; + var clipShapeForSymbol; + if (coordSys && coordSys.getArea && seriesModel.get("clip", true)) { + clipShapeForSymbol = coordSys.getArea(); + if (clipShapeForSymbol.width != null) { + clipShapeForSymbol.x -= 0.1; + clipShapeForSymbol.y -= 0.1; + clipShapeForSymbol.width += 0.2; + clipShapeForSymbol.height += 0.2; + } else if (clipShapeForSymbol.r0) { + clipShapeForSymbol.r0 -= 0.5; + clipShapeForSymbol.r += 0.5; + } + } + this._clipShapeForSymbol = clipShapeForSymbol; + var visualColor = getVisualGradient(data, coordSys, api) || data.getVisual("style")[data.getVisual("drawType")]; + if (!(polyline && prevCoordSys.type === coordSys.type && step === this._step)) { + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function(idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); + hasAnimation && this._initSymbolLabelAnimation(data, coordSys, clipShapeForSymbol); + if (step) { + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, points, coordSys, step, connectNulls); + } + points = turnPointsIntoStep(points, null, coordSys, step, connectNulls); + } + polyline = this._newPolyline(points); + if (isAreaChart) { + polygon = this._newPolygon(points, stackedOnPoints); + } else if (polygon) { + lineGroup.remove(polygon); + polygon = this._polygon = null; + } + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } + lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); + } else { + if (isAreaChart && !polygon) { + polygon = this._newPolygon(points, stackedOnPoints); + } else if (polygon && !isAreaChart) { + lineGroup.remove(polygon); + polygon = this._polygon = null; + } + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } + var oldClipPath = lineGroup.getClipPath(); + if (oldClipPath) { + var newClipPath = createLineClipPath(this, coordSys, false, seriesModel); + initProps(oldClipPath, { + shape: newClipPath.shape + }, seriesModel); + } else { + lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); + } + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function(idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); + if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) || !isPointsSame(this._points, points)) { + if (hasAnimation) { + this._doUpdateAnimation(data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls); + } else { + if (step) { + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, points, coordSys, step, connectNulls); + } + points = turnPointsIntoStep(points, null, coordSys, step, connectNulls); + } + polyline.setShape({ + points + }); + polygon && polygon.setShape({ + points, + stackedOnPoints + }); + } + } + } + var emphasisModel = seriesModel.getModel("emphasis"); + var focus = emphasisModel.get("focus"); + var blurScope = emphasisModel.get("blurScope"); + var emphasisDisabled = emphasisModel.get("disabled"); + polyline.useStyle(defaults( + // Use color in lineStyle first + lineStyleModel.getLineStyle(), + { + fill: "none", + stroke: visualColor, + lineJoin: "bevel" + } + )); + setStatesStylesFromModel(polyline, seriesModel, "lineStyle"); + if (polyline.style.lineWidth > 0 && seriesModel.get(["emphasis", "lineStyle", "width"]) === "bolder") { + var emphasisLineStyle = polyline.getState("emphasis").style; + emphasisLineStyle.lineWidth = +polyline.style.lineWidth + 1; + } + getECData(polyline).seriesIndex = seriesModel.seriesIndex; + toggleHoverEmphasis(polyline, focus, blurScope, emphasisDisabled); + var smooth = getSmooth(seriesModel.get("smooth")); + var smoothMonotone = seriesModel.get("smoothMonotone"); + polyline.setShape({ + smooth, + smoothMonotone, + connectNulls + }); + if (polygon) { + var stackedOnSeries = data.getCalculationInfo("stackedOnSeries"); + var stackedOnSmooth = 0; + polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { + fill: visualColor, + opacity: 0.7, + lineJoin: "bevel", + decal: data.getVisual("style").decal + })); + if (stackedOnSeries) { + stackedOnSmooth = getSmooth(stackedOnSeries.get("smooth")); + } + polygon.setShape({ + smooth, + stackedOnSmooth, + smoothMonotone, + connectNulls + }); + setStatesStylesFromModel(polygon, seriesModel, "areaStyle"); + getECData(polygon).seriesIndex = seriesModel.seriesIndex; + toggleHoverEmphasis(polygon, focus, blurScope, emphasisDisabled); + } + var changePolyState = this._changePolyState; + data.eachItemGraphicEl(function(el) { + el && (el.onHoverStateChange = changePolyState); + }); + this._polyline.onHoverStateChange = changePolyState; + this._data = data; + this._coordSys = coordSys; + this._stackedOnPoints = stackedOnPoints; + this._points = points; + this._step = step; + this._valueOrigin = valueOrigin; + if (seriesModel.get("triggerLineEvent")) { + this.packEventData(seriesModel, polyline); + polygon && this.packEventData(seriesModel, polygon); + } + }; + LineView2.prototype.packEventData = function(seriesModel, el) { + getECData(el).eventData = { + componentType: "series", + componentSubType: "line", + componentIndex: seriesModel.componentIndex, + seriesIndex: seriesModel.seriesIndex, + seriesName: seriesModel.name, + seriesType: "line" + }; + }; + LineView2.prototype.highlight = function(seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + this._changePolyState("emphasis"); + if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) { + var points = data.getLayout("points"); + var symbol = data.getItemGraphicEl(dataIndex); + if (!symbol) { + var x = points[dataIndex * 2]; + var y = points[dataIndex * 2 + 1]; + if (isNaN(x) || isNaN(y)) { + return; + } + if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) { + return; + } + var zlevel = seriesModel.get("zlevel") || 0; + var z = seriesModel.get("z") || 0; + symbol = new Symbol$1(data, dataIndex); + symbol.x = x; + symbol.y = y; + symbol.setZ(zlevel, z); + var symbolLabel = symbol.getSymbolPath().getTextContent(); + if (symbolLabel) { + symbolLabel.zlevel = zlevel; + symbolLabel.z = z; + symbolLabel.z2 = this._polyline.z2 + 1; + } + symbol.__temp = true; + data.setItemGraphicEl(dataIndex, symbol); + symbol.stopSymbolAnimation(true); + this.group.add(symbol); + } + symbol.highlight(); + } else { + ChartView.prototype.highlight.call(this, seriesModel, ecModel, api, payload); + } + }; + LineView2.prototype.downplay = function(seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + this._changePolyState("normal"); + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + if (symbol) { + if (symbol.__temp) { + data.setItemGraphicEl(dataIndex, null); + this.group.remove(symbol); + } else { + symbol.downplay(); + } + } + } else { + ChartView.prototype.downplay.call(this, seriesModel, ecModel, api, payload); + } + }; + LineView2.prototype._changePolyState = function(toState) { + var polygon = this._polygon; + setStatesFlag(this._polyline, toState); + polygon && setStatesFlag(polygon, toState); + }; + LineView2.prototype._newPolyline = function(points) { + var polyline = this._polyline; + if (polyline) { + this._lineGroup.remove(polyline); + } + polyline = new ECPolyline({ + shape: { + points + }, + segmentIgnoreThreshold: 2, + z2: 10 + }); + this._lineGroup.add(polyline); + this._polyline = polyline; + return polyline; + }; + LineView2.prototype._newPolygon = function(points, stackedOnPoints) { + var polygon = this._polygon; + if (polygon) { + this._lineGroup.remove(polygon); + } + polygon = new ECPolygon({ + shape: { + points, + stackedOnPoints + }, + segmentIgnoreThreshold: 2 + }); + this._lineGroup.add(polygon); + this._polygon = polygon; + return polygon; + }; + LineView2.prototype._initSymbolLabelAnimation = function(data, coordSys, clipShape) { + var isHorizontalOrRadial; + var isCoordSysPolar; + var baseAxis = coordSys.getBaseAxis(); + var isAxisInverse = baseAxis.inverse; + if (coordSys.type === "cartesian2d") { + isHorizontalOrRadial = baseAxis.isHorizontal(); + isCoordSysPolar = false; + } else if (coordSys.type === "polar") { + isHorizontalOrRadial = baseAxis.dim === "angle"; + isCoordSysPolar = true; + } + var seriesModel = data.hostModel; + var seriesDuration = seriesModel.get("animationDuration"); + if (isFunction(seriesDuration)) { + seriesDuration = seriesDuration(null); + } + var seriesDelay = seriesModel.get("animationDelay") || 0; + var seriesDelayValue = isFunction(seriesDelay) ? seriesDelay(null) : seriesDelay; + data.eachItemGraphicEl(function(symbol, idx) { + var el = symbol; + if (el) { + var point = [symbol.x, symbol.y]; + var start = void 0; + var end = void 0; + var current = void 0; + if (clipShape) { + if (isCoordSysPolar) { + var polarClip = clipShape; + var coord = coordSys.pointToCoord(point); + if (isHorizontalOrRadial) { + start = polarClip.startAngle; + end = polarClip.endAngle; + current = -coord[1] / 180 * Math.PI; + } else { + start = polarClip.r0; + end = polarClip.r; + current = coord[0]; + } + } else { + var gridClip = clipShape; + if (isHorizontalOrRadial) { + start = gridClip.x; + end = gridClip.x + gridClip.width; + current = symbol.x; + } else { + start = gridClip.y + gridClip.height; + end = gridClip.y; + current = symbol.y; + } + } + } + var ratio = end === start ? 0 : (current - start) / (end - start); + if (isAxisInverse) { + ratio = 1 - ratio; + } + var delay = isFunction(seriesDelay) ? seriesDelay(idx) : seriesDuration * ratio + seriesDelayValue; + var symbolPath = el.getSymbolPath(); + var text = symbolPath.getTextContent(); + el.attr({ + scaleX: 0, + scaleY: 0 + }); + el.animateTo({ + scaleX: 1, + scaleY: 1 + }, { + duration: 200, + setToFinal: true, + delay + }); + if (text) { + text.animateFrom({ + style: { + opacity: 0 + } + }, { + duration: 300, + delay + }); + } + symbolPath.disableLabelAnimation = true; + } + }); + }; + LineView2.prototype._initOrUpdateEndLabel = function(seriesModel, coordSys, inheritColor) { + var endLabelModel = seriesModel.getModel("endLabel"); + if (anyStateShowEndLabel(seriesModel)) { + var data_2 = seriesModel.getData(); + var polyline = this._polyline; + var points = data_2.getLayout("points"); + if (!points) { + polyline.removeTextContent(); + this._endLabel = null; + return; + } + var endLabel = this._endLabel; + if (!endLabel) { + endLabel = this._endLabel = new ZRText({ + z2: 200 + // should be higher than item symbol + }); + endLabel.ignoreClip = true; + polyline.setTextContent(this._endLabel); + polyline.disableLabelAnimation = true; + } + var dataIndex = getLastIndexNotNull(points); + if (dataIndex >= 0) { + setLabelStyle(polyline, getLabelStatesModels(seriesModel, "endLabel"), { + inheritColor, + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: function(dataIndex2, opt, interpolatedValue) { + return interpolatedValue != null ? getDefaultInterpolatedLabel(data_2, interpolatedValue) : getDefaultLabel(data_2, dataIndex2); + }, + enableTextSetter: true + }, getEndLabelStateSpecified(endLabelModel, coordSys)); + polyline.textConfig.position = null; + } + } else if (this._endLabel) { + this._polyline.removeTextContent(); + this._endLabel = null; + } + }; + LineView2.prototype._endLabelOnDuring = function(percent, clipRect, data, animationRecord, valueAnimation, endLabelModel, coordSys) { + var endLabel = this._endLabel; + var polyline = this._polyline; + if (endLabel) { + if (percent < 1 && animationRecord.originalX == null) { + animationRecord.originalX = endLabel.x; + animationRecord.originalY = endLabel.y; + } + var points = data.getLayout("points"); + var seriesModel = data.hostModel; + var connectNulls = seriesModel.get("connectNulls"); + var precision = endLabelModel.get("precision"); + var distance = endLabelModel.get("distance") || 0; + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var clipShape = clipRect.shape; + var xOrY = isBaseInversed ? isHorizontal ? clipShape.x : clipShape.y + clipShape.height : isHorizontal ? clipShape.x + clipShape.width : clipShape.y; + var distanceX = (isHorizontal ? distance : 0) * (isBaseInversed ? -1 : 1); + var distanceY = (isHorizontal ? 0 : -distance) * (isBaseInversed ? -1 : 1); + var dim = isHorizontal ? "x" : "y"; + var dataIndexRange = getIndexRange(points, xOrY, dim); + var indices = dataIndexRange.range; + var diff = indices[1] - indices[0]; + var value = void 0; + if (diff >= 1) { + if (diff > 1 && !connectNulls) { + var pt = getPointAtIndex(points, indices[0]); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + valueAnimation && (value = seriesModel.getRawValue(indices[0])); + } else { + var pt = polyline.getPointOn(xOrY, dim); + pt && endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + var startValue = seriesModel.getRawValue(indices[0]); + var endValue = seriesModel.getRawValue(indices[1]); + valueAnimation && (value = interpolateRawValues(data, precision, startValue, endValue, dataIndexRange.t)); + } + animationRecord.lastFrameIndex = indices[0]; + } else { + var idx = percent === 1 || animationRecord.lastFrameIndex > 0 ? indices[0] : 0; + var pt = getPointAtIndex(points, idx); + valueAnimation && (value = seriesModel.getRawValue(idx)); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + } + if (valueAnimation) { + var inner = labelInner(endLabel); + if (typeof inner.setLabelText === "function") { + inner.setLabelText(value); + } + } + } + }; + LineView2.prototype._doUpdateAnimation = function(data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls) { + var polyline = this._polyline; + var polygon = this._polygon; + var seriesModel = data.hostModel; + var diff = lineAnimationDiff(this._data, data, this._stackedOnPoints, stackedOnPoints, this._coordSys, coordSys, this._valueOrigin); + var current = diff.current; + var stackedOnCurrent = diff.stackedOnCurrent; + var next = diff.next; + var stackedOnNext = diff.stackedOnNext; + if (step) { + stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, diff.current, coordSys, step, connectNulls); + current = turnPointsIntoStep(diff.current, null, coordSys, step, connectNulls); + stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, diff.next, coordSys, step, connectNulls); + next = turnPointsIntoStep(diff.next, null, coordSys, step, connectNulls); + } + if (getBoundingDiff(current, next) > 3e3 || polygon && getBoundingDiff(stackedOnCurrent, stackedOnNext) > 3e3) { + polyline.stopAnimation(); + polyline.setShape({ + points: next + }); + if (polygon) { + polygon.stopAnimation(); + polygon.setShape({ + points: next, + stackedOnPoints: stackedOnNext + }); + } + return; + } + polyline.shape.__points = diff.current; + polyline.shape.points = current; + var target = { + shape: { + points: next + } + }; + if (diff.current !== current) { + target.shape.__points = diff.next; + } + polyline.stopAnimation(); + updateProps$1(polyline, target, seriesModel); + if (polygon) { + polygon.setShape({ + // Reuse the points with polyline. + points: current, + stackedOnPoints: stackedOnCurrent + }); + polygon.stopAnimation(); + updateProps$1(polygon, { + shape: { + stackedOnPoints: stackedOnNext + } + }, seriesModel); + if (polyline.shape.points !== polygon.shape.points) { + polygon.shape.points = polyline.shape.points; + } + } + var updatedDataInfo = []; + var diffStatus = diff.status; + for (var i = 0; i < diffStatus.length; i++) { + var cmd = diffStatus[i].cmd; + if (cmd === "=") { + var el = data.getItemGraphicEl(diffStatus[i].idx1); + if (el) { + updatedDataInfo.push({ + el, + ptIdx: i + // Index of points + }); + } + } + } + if (polyline.animators && polyline.animators.length) { + polyline.animators[0].during(function() { + polygon && polygon.dirtyShape(); + var points = polyline.shape.__points; + for (var i2 = 0; i2 < updatedDataInfo.length; i2++) { + var el2 = updatedDataInfo[i2].el; + var offset = updatedDataInfo[i2].ptIdx * 2; + el2.x = points[offset]; + el2.y = points[offset + 1]; + el2.markRedraw(); + } + }); + } + }; + LineView2.prototype.remove = function(ecModel) { + var group = this.group; + var oldData = this._data; + this._lineGroup.removeAll(); + this._symbolDraw.remove(true); + oldData && oldData.eachItemGraphicEl(function(el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._endLabel = this._data = null; + }; + LineView2.type = "line"; + return LineView2; + }(ChartView) +); + +function pointsLayout(seriesType, forceStoreInTypedArray) { + return { + seriesType: seriesType, + plan: createRenderPlanner(), + reset: function (seriesModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + seriesModel.pipelineContext; + if (!coordSys) { + return; + } + var dims = map$1(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }).slice(0, 2); + var dimLen = dims.length; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + if (isDimensionStacked(data, dims[0])) { + dims[0] = stackResultDim; + } + if (isDimensionStacked(data, dims[1])) { + dims[1] = stackResultDim; + } + var store = data.getStore(); + var dimIdx0 = data.getDimensionIndex(dims[0]); + var dimIdx1 = data.getDimensionIndex(dims[1]); + return dimLen && { + progress: function (params, data) { + var segCount = params.end - params.start; + var points = createFloat32Array(segCount * dimLen); + var tmpIn = []; + var tmpOut = []; + for (var i = params.start, offset = 0; i < params.end; i++) { + var point = void 0; + if (dimLen === 1) { + var x = store.get(dimIdx0, i); + // NOTE: Make sure the second parameter is null to use default strategy. + point = coordSys.dataToPoint(x, null, tmpOut); + } else { + tmpIn[0] = store.get(dimIdx0, i); + tmpIn[1] = store.get(dimIdx1, i); + // Let coordinate system to handle the NaN data. + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + } + { + points[offset++] = point[0]; + points[offset++] = point[1]; + } + } + data.setLayout('points', points); + } + }; + } + }; +} + +var samplers = { + average: function (frame) { + var sum = 0; + var count = 0; + for (var i = 0; i < frame.length; i++) { + if (!isNaN(frame[i])) { + sum += frame[i]; + count++; + } + } + // Return NaN if count is 0 + return count === 0 ? NaN : sum / count; + }, + sum: function (frame) { + var sum = 0; + for (var i = 0; i < frame.length; i++) { + // Ignore NaN + sum += frame[i] || 0; + } + return sum; + }, + max: function (frame) { + var max = -Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] > max && (max = frame[i]); + } + // NaN will cause illegal axis extent. + return isFinite(max) ? max : NaN; + }, + min: function (frame) { + var min = Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] < min && (min = frame[i]); + } + // NaN will cause illegal axis extent. + return isFinite(min) ? min : NaN; + }, + // TODO + // Median + nearest: function (frame) { + return frame[0]; + } +}; +var indexSampler = function (frame) { + return Math.round(frame.length / 2); +}; +function dataSample(seriesType) { + return { + seriesType: seriesType, + // FIXME:TS never used, so comment it + // modifyOutputEnd: true, + reset: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var sampling = seriesModel.get('sampling'); + var coordSys = seriesModel.coordinateSystem; + var count = data.count(); + // Only cartesian2d support down sampling. Disable it when there is few data. + if (count > 10 && coordSys.type === 'cartesian2d' && sampling) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var extent = baseAxis.getExtent(); + var dpr = api.getDevicePixelRatio(); + // Coordinste system has been resized + var size = Math.abs(extent[1] - extent[0]) * (dpr || 1); + var rate = Math.round(count / size); + if (isFinite(rate) && rate > 1) { + if (sampling === 'lttb') { + seriesModel.setData(data.lttbDownSample(data.mapDimension(valueAxis.dim), 1 / rate)); + } else if (sampling === 'minmax') { + seriesModel.setData(data.minmaxDownSample(data.mapDimension(valueAxis.dim), 1 / rate)); + } + var sampler = void 0; + if (isString(sampling)) { + sampler = samplers[sampling]; + } else if (isFunction(sampling)) { + sampler = sampling; + } + if (sampler) { + // Only support sample the first dim mapped from value axis. + seriesModel.setData(data.downSample(data.mapDimension(valueAxis.dim), 1 / rate, sampler, indexSampler)); + } + } + } + } + }; +} + +function install$9(registers) { + registers.registerChartView(LineView); + registers.registerSeriesModel(LineSeriesModel); + registers.registerLayout(pointsLayout('line')); + registers.registerVisual({ + seriesType: 'line', + reset: function (seriesModel) { + var data = seriesModel.getData(); + // Visual coding for legend + var lineStyle = seriesModel.getModel('lineStyle').getLineStyle(); + if (lineStyle && !lineStyle.stroke) { + // Fill in visual should be palette color if + // has color callback + lineStyle.stroke = data.getVisual('style').fill; + } + data.setVisual('legendLineStyle', lineStyle); + } + }); + // Down sample after filter + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('line')); +} + +function getSectorCornerRadius(model, shape, zeroIfNull) { + var cornerRadius = model.get('borderRadius'); + if (cornerRadius == null) { + return zeroIfNull ? { + cornerRadius: 0 + } : null; + } + if (!isArray(cornerRadius)) { + cornerRadius = [cornerRadius, cornerRadius, cornerRadius, cornerRadius]; + } + var dr = Math.abs(shape.r || 0 - shape.r0 || 0); + return { + cornerRadius: map$1(cornerRadius, function (cr) { + return parsePercent$1(cr, dr); + }) + }; +} + +var PI2 = Math.PI * 2; +var RADIAN$1 = Math.PI / 180; +function getViewRect(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); +} +function getBasicPieLayout(seriesModel, api) { + var viewRect = getViewRect(seriesModel, api); + // center can be string or number when coordinateSystem is specified + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + if (!isArray(radius)) { + radius = [0, radius]; + } + var width = parsePercent(viewRect.width, api.getWidth()); + var height = parsePercent(viewRect.height, api.getHeight()); + var size = Math.min(width, height); + var r0 = parsePercent(radius[0], size / 2); + var r = parsePercent(radius[1], size / 2); + var cx; + var cy; + var coordSys = seriesModel.coordinateSystem; + if (coordSys) { + // percentage is not allowed when coordinate system is specified + var point = coordSys.dataToPoint(center); + cx = point[0] || 0; + cy = point[1] || 0; + } else { + if (!isArray(center)) { + center = [center, center]; + } + cx = parsePercent(center[0], width) + viewRect.x; + cy = parsePercent(center[1], height) + viewRect.y; + } + return { + cx: cx, + cy: cy, + r0: r0, + r: r + }; +} +function pieLayout(seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var viewRect = getViewRect(seriesModel, api); + var _a = getBasicPieLayout(seriesModel, api), + cx = _a.cx, + cy = _a.cy, + r = _a.r, + r0 = _a.r0; + var startAngle = -seriesModel.get('startAngle') * RADIAN$1; + var endAngle = seriesModel.get('endAngle'); + var padAngle = seriesModel.get('padAngle') * RADIAN$1; + endAngle = endAngle === 'auto' ? startAngle - PI2 : -endAngle * RADIAN$1; + var minAngle = seriesModel.get('minAngle') * RADIAN$1; + var minAndPadAngle = minAngle + padAngle; + var validDataCount = 0; + data.each(valueDim, function (value) { + !isNaN(value) && validDataCount++; + }); + var sum = data.getSum(valueDim); + // Sum may be 0 + var unitRadian = Math.PI / (sum || validDataCount) * 2; + var clockwise = seriesModel.get('clockwise'); + var roseType = seriesModel.get('roseType'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); + // [0...max] + var extent = data.getDataExtent(valueDim); + extent[0] = 0; + var dir = clockwise ? 1 : -1; + var angles = [startAngle, endAngle]; + var halfPadAngle = dir * padAngle / 2; + normalizeArcAngles(angles, !clockwise); + startAngle = angles[0], endAngle = angles[1]; + var layoutData = getSeriesLayoutData(seriesModel); + layoutData.startAngle = startAngle; + layoutData.endAngle = endAngle; + layoutData.clockwise = clockwise; + var angleRange = Math.abs(endAngle - startAngle); + // In the case some sector angle is smaller than minAngle + var restAngle = angleRange; + var valueSumLargerThanMinAngle = 0; + var currentAngle = startAngle; + data.setLayout({ + viewRect: viewRect, + r: r + }); + data.each(valueDim, function (value, idx) { + var angle; + if (isNaN(value)) { + data.setItemLayout(idx, { + angle: NaN, + startAngle: NaN, + endAngle: NaN, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType ? NaN : r + }); + return; + } + // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样? + if (roseType !== 'area') { + angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; + } else { + angle = angleRange / validDataCount; + } + if (angle < minAndPadAngle) { + angle = minAndPadAngle; + restAngle -= minAndPadAngle; + } else { + valueSumLargerThanMinAngle += value; + } + var endAngle = currentAngle + dir * angle; + // calculate display angle + var actualStartAngle = 0; + var actualEndAngle = 0; + if (padAngle > angle) { + actualStartAngle = currentAngle + dir * angle / 2; + actualEndAngle = actualStartAngle; + } else { + actualStartAngle = currentAngle + halfPadAngle; + actualEndAngle = endAngle - halfPadAngle; + } + data.setItemLayout(idx, { + angle: angle, + startAngle: actualStartAngle, + endAngle: actualEndAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType ? linearMap(value, extent, [r0, r]) : r + }); + currentAngle = endAngle; + }); + // Some sector is constrained by minAngle and padAngle + // Rest sectors needs recalculate angle + if (restAngle < PI2 && validDataCount) { + // Average the angle if rest angle is not enough after all angles is + // Constrained by minAngle and padAngle + if (restAngle <= 1e-3) { + var angle_1 = angleRange / validDataCount; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_1 = data.getItemLayout(idx); + layout_1.angle = angle_1; + var actualStartAngle = 0; + var actualEndAngle = 0; + if (angle_1 < padAngle) { + actualStartAngle = startAngle + dir * (idx + 1 / 2) * angle_1; + actualEndAngle = actualStartAngle; + } else { + actualStartAngle = startAngle + dir * idx * angle_1 + halfPadAngle; + actualEndAngle = startAngle + dir * (idx + 1) * angle_1 - halfPadAngle; + } + layout_1.startAngle = actualStartAngle; + layout_1.endAngle = actualEndAngle; + } + }); + } else { + unitRadian = restAngle / valueSumLargerThanMinAngle; + currentAngle = startAngle; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_2 = data.getItemLayout(idx); + var angle = layout_2.angle === minAndPadAngle ? minAndPadAngle : value * unitRadian; + var actualStartAngle = 0; + var actualEndAngle = 0; + if (angle < padAngle) { + actualStartAngle = currentAngle + dir * angle / 2; + actualEndAngle = actualStartAngle; + } else { + actualStartAngle = currentAngle + halfPadAngle; + actualEndAngle = currentAngle + dir * angle - halfPadAngle; + } + layout_2.startAngle = actualStartAngle; + layout_2.endAngle = actualEndAngle; + currentAngle += dir * angle; + } + }); + } + } + }); +} +var getSeriesLayoutData = makeInner(); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +function dataFilter(seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (!legendModels || !legendModels.length) { + return; + } + var data = seriesModel.getData(); + data.filterSelf(function (idx) { + var name = data.getName(idx); + // If in any legend component the status is not selected. + for (var i = 0; i < legendModels.length; i++) { + // @ts-ignore FIXME: LegendModel + if (!legendModels[i].isSelected(name)) { + return false; + } + } + return true; + }); + } + }; +} + +var RADIAN = Math.PI / 180; +function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft, viewTop, farthestX) { + if (list.length < 2) { + return; + } + function recalculateXOnSemiToAlignOnEllipseCurve(semi) { + var rB = semi.rB; + var rB2 = rB * rB; + for (var i = 0; i < semi.list.length; i++) { + var item = semi.list[i]; + var dy = Math.abs(item.label.y - cy); + // horizontal r is always same with original r because x is not changed. + var rA = r + item.len; + var rA2 = rA * rA; + // Use ellipse implicit function to calculate x + var dx = Math.sqrt(Math.abs((1 - dy * dy / rB2) * rA2)); + var newX = cx + (dx + item.len2) * dir; + var deltaX = newX - item.label.x; + var newTargetWidth = item.targetTextWidth - deltaX * dir; + // text x is changed, so need to recalculate width. + constrainTextWidth(item, newTargetWidth, true); + item.label.x = newX; + } + } + // Adjust X based on the shifted y. Make tight labels aligned on an ellipse curve. + function recalculateX(items) { + // Extremes of + var topSemi = { + list: [], + maxY: 0 + }; + var bottomSemi = { + list: [], + maxY: 0 + }; + for (var i = 0; i < items.length; i++) { + if (items[i].labelAlignTo !== 'none') { + continue; + } + var item = items[i]; + var semi = item.label.y > cy ? bottomSemi : topSemi; + var dy = Math.abs(item.label.y - cy); + if (dy >= semi.maxY) { + var dx = item.label.x - cx - item.len2 * dir; + // horizontal r is always same with original r because x is not changed. + var rA = r + item.len; + // Canculate rB based on the topest / bottemest label. + var rB = Math.abs(dx) < rA ? Math.sqrt(dy * dy / (1 - dx * dx / rA / rA)) : rA; + semi.rB = rB; + semi.maxY = dy; + } + semi.list.push(item); + } + recalculateXOnSemiToAlignOnEllipseCurve(topSemi); + recalculateXOnSemiToAlignOnEllipseCurve(bottomSemi); + } + var len = list.length; + for (var i = 0; i < len; i++) { + if (list[i].position === 'outer' && list[i].labelAlignTo === 'labelLine') { + var dx = list[i].label.x - farthestX; + list[i].linePoints[1][0] += dx; + list[i].label.x = farthestX; + } + } + if (shiftLayoutOnY(list, viewTop, viewTop + viewHeight)) { + recalculateX(list); + } +} +function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) { + var leftList = []; + var rightList = []; + var leftmostX = Number.MAX_VALUE; + var rightmostX = -Number.MAX_VALUE; + for (var i = 0; i < labelLayoutList.length; i++) { + var label = labelLayoutList[i].label; + if (isPositionCenter(labelLayoutList[i])) { + continue; + } + if (label.x < cx) { + leftmostX = Math.min(leftmostX, label.x); + leftList.push(labelLayoutList[i]); + } else { + rightmostX = Math.max(rightmostX, label.x); + rightList.push(labelLayoutList[i]); + } + } + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + if (!isPositionCenter(layout) && layout.linePoints) { + if (layout.labelStyleWidth != null) { + continue; + } + var label = layout.label; + var linePoints = layout.linePoints; + var targetTextWidth = void 0; + if (layout.labelAlignTo === 'edge') { + if (label.x < cx) { + targetTextWidth = linePoints[2][0] - layout.labelDistance - viewLeft - layout.edgeDistance; + } else { + targetTextWidth = viewLeft + viewWidth - layout.edgeDistance - linePoints[2][0] - layout.labelDistance; + } + } else if (layout.labelAlignTo === 'labelLine') { + if (label.x < cx) { + targetTextWidth = leftmostX - viewLeft - layout.bleedMargin; + } else { + targetTextWidth = viewLeft + viewWidth - rightmostX - layout.bleedMargin; + } + } else { + if (label.x < cx) { + targetTextWidth = label.x - viewLeft - layout.bleedMargin; + } else { + targetTextWidth = viewLeft + viewWidth - label.x - layout.bleedMargin; + } + } + layout.targetTextWidth = targetTextWidth; + constrainTextWidth(layout, targetTextWidth); + } + } + adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight, viewLeft, viewTop, rightmostX); + adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX); + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + if (!isPositionCenter(layout) && layout.linePoints) { + var label = layout.label; + var linePoints = layout.linePoints; + var isAlignToEdge = layout.labelAlignTo === 'edge'; + var padding = label.style.padding; + var paddingH = padding ? padding[1] + padding[3] : 0; + // textRect.width already contains paddingH if bgColor is set + var extraPaddingH = label.style.backgroundColor ? 0 : paddingH; + var realTextWidth = layout.rect.width + extraPaddingH; + var dist = linePoints[1][0] - linePoints[2][0]; + if (isAlignToEdge) { + if (label.x < cx) { + linePoints[2][0] = viewLeft + layout.edgeDistance + realTextWidth + layout.labelDistance; + } else { + linePoints[2][0] = viewLeft + viewWidth - layout.edgeDistance - realTextWidth - layout.labelDistance; + } + } else { + if (label.x < cx) { + linePoints[2][0] = label.x + layout.labelDistance; + } else { + linePoints[2][0] = label.x - layout.labelDistance; + } + linePoints[1][0] = linePoints[2][0] + dist; + } + linePoints[1][1] = linePoints[2][1] = label.y; + } + } +} +/** + * Set max width of each label, and then wrap each label to the max width. + * + * @param layout label layout + * @param availableWidth max width for the label to display + * @param forceRecalculate recaculate the text layout even if the current width + * is smaller than `availableWidth`. This is useful when the text was previously + * wrapped by calling `constrainTextWidth` but now `availableWidth` changed, in + * which case, previous wrapping should be redo. + */ +function constrainTextWidth(layout, availableWidth, forceRecalculate) { + if (forceRecalculate === void 0) { + forceRecalculate = false; + } + if (layout.labelStyleWidth != null) { + // User-defined style.width has the highest priority. + return; + } + var label = layout.label; + var style = label.style; + var textRect = layout.rect; + var bgColor = style.backgroundColor; + var padding = style.padding; + var paddingH = padding ? padding[1] + padding[3] : 0; + var overflow = style.overflow; + // textRect.width already contains paddingH if bgColor is set + var oldOuterWidth = textRect.width + (bgColor ? 0 : paddingH); + if (availableWidth < oldOuterWidth || forceRecalculate) { + var oldHeight = textRect.height; + if (overflow && overflow.match('break')) { + // Temporarily set background to be null to calculate + // the bounding box without background. + label.setStyle('backgroundColor', null); + // Set constraining width + label.setStyle('width', availableWidth - paddingH); + // This is the real bounding box of the text without padding. + var innerRect = label.getBoundingRect(); + label.setStyle('width', Math.ceil(innerRect.width)); + label.setStyle('backgroundColor', bgColor); + } else { + var availableInnerWidth = availableWidth - paddingH; + var newWidth = availableWidth < oldOuterWidth + // Current text is too wide, use `availableWidth` as max width. + ? availableInnerWidth : + // Current available width is enough, but the text may have + // already been wrapped with a smaller available width. + forceRecalculate ? availableInnerWidth > layout.unconstrainedWidth + // Current available is larger than text width, + // so don't constrain width (otherwise it may have + // empty space in the background). + ? null + // Current available is smaller than text width, so + // use the current available width as constraining + // width. + : availableInnerWidth + // Current available width is enough, so no need to + // constrain. + : null; + label.setStyle('width', newWidth); + } + var newRect = label.getBoundingRect(); + textRect.width = newRect.width; + var margin = (label.style.margin || 0) + 2.1; + textRect.height = newRect.height + margin; + textRect.y -= (textRect.height - oldHeight) / 2; + } +} +function isPositionCenter(sectorShape) { + // Not change x for center label + return sectorShape.position === 'center'; +} +function pieLabelLayout(seriesModel) { + var data = seriesModel.getData(); + var labelLayoutList = []; + var cx; + var cy; + var hasLabelRotate = false; + var minShowLabelRadian = (seriesModel.get('minShowLabelAngle') || 0) * RADIAN; + var viewRect = data.getLayout('viewRect'); + var r = data.getLayout('r'); + var viewWidth = viewRect.width; + var viewLeft = viewRect.x; + var viewTop = viewRect.y; + var viewHeight = viewRect.height; + function setNotShow(el) { + el.ignore = true; + } + function isLabelShown(label) { + if (!label.ignore) { + return true; + } + for (var key in label.states) { + if (label.states[key].ignore === false) { + return true; + } + } + return false; + } + data.each(function (idx) { + var sector = data.getItemGraphicEl(idx); + var sectorShape = sector.shape; + var label = sector.getTextContent(); + var labelLine = sector.getTextGuideLine(); + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); + // Use position in normal or emphasis + var labelPosition = labelModel.get('position') || itemModel.get(['emphasis', 'label', 'position']); + var labelDistance = labelModel.get('distanceToLabelLine'); + var labelAlignTo = labelModel.get('alignTo'); + var edgeDistance = parsePercent(labelModel.get('edgeDistance'), viewWidth); + var bleedMargin = labelModel.get('bleedMargin'); + var labelLineModel = itemModel.getModel('labelLine'); + var labelLineLen = labelLineModel.get('length'); + labelLineLen = parsePercent(labelLineLen, viewWidth); + var labelLineLen2 = labelLineModel.get('length2'); + labelLineLen2 = parsePercent(labelLineLen2, viewWidth); + if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) { + each$4(label.states, setNotShow); + label.ignore = true; + if (labelLine) { + each$4(labelLine.states, setNotShow); + labelLine.ignore = true; + } + return; + } + if (!isLabelShown(label)) { + return; + } + var midAngle = (sectorShape.startAngle + sectorShape.endAngle) / 2; + var nx = Math.cos(midAngle); + var ny = Math.sin(midAngle); + var textX; + var textY; + var linePoints; + var textAlign; + cx = sectorShape.cx; + cy = sectorShape.cy; + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + if (labelPosition === 'center') { + textX = sectorShape.cx; + textY = sectorShape.cy; + textAlign = 'center'; + } else { + var x1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * nx : sectorShape.r * nx) + cx; + var y1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * ny : sectorShape.r * ny) + cy; + textX = x1 + nx * 3; + textY = y1 + ny * 3; + if (!isLabelInside) { + // For roseType + var x2 = x1 + nx * (labelLineLen + r - sectorShape.r); + var y2 = y1 + ny * (labelLineLen + r - sectorShape.r); + var x3 = x2 + (nx < 0 ? -1 : 1) * labelLineLen2; + var y3 = y2; + if (labelAlignTo === 'edge') { + // Adjust textX because text align of edge is opposite + textX = nx < 0 ? viewLeft + edgeDistance : viewLeft + viewWidth - edgeDistance; + } else { + textX = x3 + (nx < 0 ? -labelDistance : labelDistance); + } + textY = y3; + linePoints = [[x1, y1], [x2, y2], [x3, y3]]; + } + textAlign = isLabelInside ? 'center' : labelAlignTo === 'edge' ? nx > 0 ? 'right' : 'left' : nx > 0 ? 'left' : 'right'; + } + var PI = Math.PI; + var labelRotate = 0; + var rotate = labelModel.get('rotate'); + if (isNumber(rotate)) { + labelRotate = rotate * (PI / 180); + } else if (labelPosition === 'center') { + labelRotate = 0; + } else if (rotate === 'radial' || rotate === true) { + var radialAngle = nx < 0 ? -midAngle + PI : -midAngle; + labelRotate = radialAngle; + } else if (rotate === 'tangential' && labelPosition !== 'outside' && labelPosition !== 'outer') { + var rad = Math.atan2(nx, ny); + if (rad < 0) { + rad = PI * 2 + rad; + } + var isDown = ny > 0; + if (isDown) { + rad = PI + rad; + } + labelRotate = rad - PI; + } + hasLabelRotate = !!labelRotate; + label.x = textX; + label.y = textY; + label.rotation = labelRotate; + label.setStyle({ + verticalAlign: 'middle' + }); + // Not sectorShape the inside label + if (!isLabelInside) { + var textRect = label.getBoundingRect().clone(); + textRect.applyTransform(label.getComputedTransform()); + // Text has a default 1px stroke. Exclude this. + var margin = (label.style.margin || 0) + 2.1; + textRect.y -= margin / 2; + textRect.height += margin; + labelLayoutList.push({ + label: label, + labelLine: labelLine, + position: labelPosition, + len: labelLineLen, + len2: labelLineLen2, + minTurnAngle: labelLineModel.get('minTurnAngle'), + maxSurfaceAngle: labelLineModel.get('maxSurfaceAngle'), + surfaceNormal: new Point(nx, ny), + linePoints: linePoints, + textAlign: textAlign, + labelDistance: labelDistance, + labelAlignTo: labelAlignTo, + edgeDistance: edgeDistance, + bleedMargin: bleedMargin, + rect: textRect, + unconstrainedWidth: textRect.width, + labelStyleWidth: label.style.width + }); + } else { + label.setStyle({ + align: textAlign + }); + var selectState = label.states.select; + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + sector.setTextConfig({ + inside: isLabelInside + }); + }); + if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) { + avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop); + } + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + var label = layout.label; + var labelLine = layout.labelLine; + var notShowLabel = isNaN(label.x) || isNaN(label.y); + if (label) { + label.setStyle({ + align: layout.textAlign + }); + if (notShowLabel) { + each$4(label.states, setNotShow); + label.ignore = true; + } + var selectState = label.states.select; + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + if (labelLine) { + var linePoints = layout.linePoints; + if (notShowLabel || !linePoints) { + each$4(labelLine.states, setNotShow); + labelLine.ignore = true; + } else { + limitTurnAngle(linePoints, layout.minTurnAngle); + limitSurfaceAngle(linePoints, layout.surfaceNormal, layout.maxSurfaceAngle); + labelLine.setShape({ + points: linePoints + }); + // Set the anchor to the midpoint of sector + label.__hostTarget.textGuideLineConfig = { + anchor: new Point(linePoints[0][0], linePoints[0][1]) + }; + } + } + } +} + +/** + * Piece of pie including Sector, Label, LabelLine + */ +var PiePiece = /** @class */function (_super) { + __extends(PiePiece, _super); + function PiePiece(data, idx, startAngle) { + var _this = _super.call(this) || this; + _this.z2 = 2; + var text = new ZRText(); + _this.setTextContent(text); + _this.updateData(data, idx, startAngle, true); + return _this; + } + PiePiece.prototype.updateData = function (data, idx, startAngle, firstCreate) { + var sector = this; + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var layout = data.getItemLayout(idx); + // cornerRadius & innerCornerRadius doesn't exist in the item layout. Use `0` if null value is specified. + // see `setItemLayout` in `pieLayout.ts`. + var sectorShape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout); + // Ignore NaN data. + if (isNaN(sectorShape.startAngle)) { + // Use NaN shape to avoid drawing shape. + sector.setShape(sectorShape); + return; + } + if (firstCreate) { + sector.setShape(sectorShape); + var animationType = seriesModel.getShallow('animationType'); + if (seriesModel.ecModel.ssr) { + // Use scale animation in SSR mode(opacity?) + // Because CSS SVG animation doesn't support very customized shape animation. + initProps(sector, { + scaleX: 0, + scaleY: 0 + }, seriesModel, { + dataIndex: idx, + isFrom: true + }); + sector.originX = sectorShape.cx; + sector.originY = sectorShape.cy; + } else if (animationType === 'scale') { + sector.shape.r = layout.r0; + initProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, idx); + } + // Expansion + else { + if (startAngle != null) { + sector.setShape({ + startAngle: startAngle, + endAngle: startAngle + }); + initProps(sector, { + shape: { + startAngle: layout.startAngle, + endAngle: layout.endAngle + } + }, seriesModel, idx); + } else { + sector.shape.endAngle = layout.startAngle; + updateProps$1(sector, { + shape: { + endAngle: layout.endAngle + } + }, seriesModel, idx); + } + } + } else { + saveOldStyle(sector); + // Transition animation from the old shape + updateProps$1(sector, { + shape: sectorShape + }, seriesModel, idx); + } + sector.useStyle(data.getItemVisual(idx, 'style')); + setStatesStylesFromModel(sector, itemModel); + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var offset = seriesModel.get('selectedOffset'); + var dx = Math.cos(midAngle) * offset; + var dy = Math.sin(midAngle) * offset; + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + this._updateLabel(seriesModel, data, idx); + sector.ensureState('emphasis').shape = extend({ + r: layout.r + (emphasisModel.get('scale') ? emphasisModel.get('scaleSize') || 0 : 0) + }, getSectorCornerRadius(emphasisModel.getModel('itemStyle'), layout)); + extend(sector.ensureState('select'), { + x: dx, + y: dy, + shape: getSectorCornerRadius(itemModel.getModel(['select', 'itemStyle']), layout) + }); + extend(sector.ensureState('blur'), { + shape: getSectorCornerRadius(itemModel.getModel(['blur', 'itemStyle']), layout) + }); + var labelLine = sector.getTextGuideLine(); + var labelText = sector.getTextContent(); + labelLine && extend(labelLine.ensureState('select'), { + x: dx, + y: dy + }); + // TODO: needs dx, dy in zrender? + extend(labelText.ensureState('select'), { + x: dx, + y: dy + }); + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + PiePiece.prototype._updateLabel = function (seriesModel, data, idx) { + var sector = this; + var itemModel = data.getItemModel(idx); + var labelLineModel = itemModel.getModel('labelLine'); + var style = data.getItemVisual(idx, 'style'); + var visualColor = style && style.fill; + var visualOpacity = style && style.opacity; + setLabelStyle(sector, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + inheritColor: visualColor, + defaultOpacity: visualOpacity, + defaultText: seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx) + }); + var labelText = sector.getTextContent(); + // Set textConfig on sector. + sector.setTextConfig({ + // reset position, rotation + position: null, + rotation: null + }); + // Make sure update style on labelText after setLabelStyle. + // Because setLabelStyle will replace a new style on it. + labelText.attr({ + z2: 10 + }); + var labelPosition = seriesModel.get(['label', 'position']); + if (labelPosition !== 'outside' && labelPosition !== 'outer') { + sector.removeTextGuideLine(); + } else { + var polyline = this.getTextGuideLine(); + if (!polyline) { + polyline = new Polyline(); + this.setTextGuideLine(polyline); + } + // Default use item visual color + setLabelLineStyle(this, getLabelLineStatesModels(itemModel), { + stroke: visualColor, + opacity: retrieve3(labelLineModel.get(['lineStyle', 'opacity']), visualOpacity, 1) + }); + } + }; + return PiePiece; +}(Sector); +// Pie view +var PieView = /** @class */function (_super) { + __extends(PieView, _super); + function PieView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.ignoreLabelLineUpdate = true; + return _this; + } + PieView.prototype.render = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var startAngle; + // First render + if (!oldData && data.count() > 0) { + var shape = data.getItemLayout(0); + for (var s = 1; isNaN(shape && shape.startAngle) && s < data.count(); ++s) { + shape = data.getItemLayout(s); + } + if (shape) { + startAngle = shape.startAngle; + } + } + // remove empty-circle if it exists + if (this._emptyCircleSector) { + group.remove(this._emptyCircleSector); + } + // when all data are filtered, show lightgray empty circle + if (data.count() === 0 && seriesModel.get('showEmptyCircle')) { + var layoutData = getSeriesLayoutData(seriesModel); + var sector = new Sector({ + shape: extend(getBasicPieLayout(seriesModel, api), layoutData) + }); + sector.useStyle(seriesModel.getModel('emptyCircleStyle').getItemStyle()); + this._emptyCircleSector = sector; + group.add(sector); + } + data.diff(oldData).add(function (idx) { + var piePiece = new PiePiece(data, idx, startAngle); + data.setItemGraphicEl(idx, piePiece); + group.add(piePiece); + }).update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + piePiece.updateData(data, newIdx, startAngle); + piePiece.off('click'); + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }).remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + removeElementWithFadeOut(piePiece, seriesModel, idx); + }).execute(); + pieLabelLayout(seriesModel); + // Always use initial animation. + if (seriesModel.get('animationTypeUpdate') !== 'expansion') { + this._data = data; + } + }; + PieView.prototype.dispose = function () {}; + PieView.prototype.containPoint = function (point, seriesModel) { + var data = seriesModel.getData(); + var itemLayout = data.getItemLayout(0); + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + }; + PieView.type = 'pie'; + return PieView; +}(ChartView); + +/** + * [Usage]: + * (1) + * createListSimply(seriesModel, ['value']); + * (2) + * createListSimply(seriesModel, { + * coordDimensions: ['value'], + * dimensionsCount: 5 + * }); + */ +function createSeriesDataSimply(seriesModel, opt, nameList) { + opt = isArray(opt) && { + coordDimensions: opt + } || extend({ + encodeDefine: seriesModel.getEncode() + }, opt); + var source = seriesModel.getSource(); + var dimensions = prepareSeriesDataSchema(source, opt).dimensions; + var list = new SeriesData(dimensions, seriesModel); + list.initData(source, nameList); + return list; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +/** + * LegendVisualProvider is an bridge that pick encoded color from data and + * provide to the legend component. + */ +var LegendVisualProvider = /** @class */function () { + function LegendVisualProvider( + // Function to get data after filtered. It stores all the encoding info + getDataWithEncodedVisual, + // Function to get raw data before filtered. + getRawData) { + this._getDataWithEncodedVisual = getDataWithEncodedVisual; + this._getRawData = getRawData; + } + LegendVisualProvider.prototype.getAllNames = function () { + var rawData = this._getRawData(); + // We find the name from the raw data. In case it's filtered by the legend component. + // Normally, the name can be found in rawData, but can't be found in filtered data will display as gray. + return rawData.mapArray(rawData.getName); + }; + LegendVisualProvider.prototype.containName = function (name) { + var rawData = this._getRawData(); + return rawData.indexOfName(name) >= 0; + }; + LegendVisualProvider.prototype.indexOfName = function (name) { + // Only get data when necessary. + // Because LegendVisualProvider constructor may be new in the stage that data is not prepared yet. + // Invoking Series#getData immediately will throw an error. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + return dataWithEncodedVisual.indexOfName(name); + }; + LegendVisualProvider.prototype.getItemVisual = function (dataIndex, key) { + // Get encoded visual properties from final filtered data. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + return dataWithEncodedVisual.getItemVisual(dataIndex, key); + }; + return LegendVisualProvider; +}(); + +var innerData = makeInner(); +var PieSeriesModel = /** @class */function (_super) { + __extends(PieSeriesModel, _super); + function PieSeriesModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @overwrite + */ + PieSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendVisualProvider = new LegendVisualProvider(bind$1(this.getData, this), bind$1(this.getRawData, this)); + this._defaultLabelLine(option); + }; + /** + * @overwrite + */ + PieSeriesModel.prototype.mergeOption = function () { + _super.prototype.mergeOption.apply(this, arguments); + }; + /** + * @overwrite + */ + PieSeriesModel.prototype.getInitialData = function () { + return createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry$1(makeSeriesEncodeForNameBased, this) + }); + }; + /** + * @overwrite + */ + PieSeriesModel.prototype.getDataParams = function (dataIndex) { + var data = this.getData(); + // update seats when data is changed + var dataInner = innerData(data); + var seats = dataInner.seats; + if (!seats) { + var valueList_1 = []; + data.each(data.mapDimension('value'), function (value) { + valueList_1.push(value); + }); + seats = dataInner.seats = getPercentSeats(valueList_1, data.hostModel.get('percentPrecision')); + } + var params = _super.prototype.getDataParams.call(this, dataIndex); + // seats may be empty when sum is 0 + params.percent = seats[dataIndex] || 0; + params.$vars.push('percent'); + return params; + }; + PieSeriesModel.prototype._defaultLabelLine = function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; + // Not show label line if `label.normal.show = false` + labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; + }; + PieSeriesModel.type = 'series.pie'; + PieSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + legendHoverLink: true, + colorBy: 'data', + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + endAngle: 'auto', + padAngle: 0, + // 最小角度改为0 + minAngle: 0, + // If the angle of a sector less than `minShowLabelAngle`, + // the label will not be displayed. + minShowLabelAngle: 0, + // 选中时扇区偏移量 + selectedOffset: 10, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) + // roseType: null, + percentPrecision: 2, + // If still show when all data zero. + stillShowZeroSum: true, + // cursor: null, + left: 0, + top: 0, + right: 0, + bottom: 0, + width: null, + height: null, + label: { + // color: 'inherit', + // If rotate around circle + rotate: 0, + show: true, + overflow: 'truncate', + // 'outer', 'inside', 'center' + position: 'outer', + // 'none', 'labelLine', 'edge'. Works only when position is 'outer' + alignTo: 'none', + // Closest distance between label and chart edge. + // Works only position is 'outer' and alignTo is 'edge'. + edgeDistance: '25%', + // Works only position is 'outer' and alignTo is not 'edge'. + bleedMargin: 10, + // Distance between text and label line. + distanceToLabelLine: 5 + // formatter: 标签文本格式器,同 tooltip.formatter,不支持异步回调 + // 默认使用全局文本样式,详见 textStyle + // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 + }, + // Enabled when label.normal.position is 'outer' + labelLine: { + show: true, + // 引导线两段中的第一段长度 + length: 15, + // 引导线两段中的第二段长度 + length2: 15, + smooth: false, + minTurnAngle: 90, + maxSurfaceAngle: 90, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + }, + itemStyle: { + borderWidth: 1, + borderJoin: 'round' + }, + showEmptyCircle: true, + emptyCircleStyle: { + color: 'lightgray', + opacity: 1 + }, + labelLayout: { + // Hide the overlapped label. + hideOverlap: true + }, + emphasis: { + scale: true, + scaleSize: 5 + }, + // If use strategy to avoid label overlapping + avoidLabelOverlap: true, + // Animation type. Valid values: expansion, scale + animationType: 'expansion', + animationDuration: 1000, + // Animation type when update. Valid values: transition, expansion + animationTypeUpdate: 'transition', + animationEasingUpdate: 'cubicInOut', + animationDurationUpdate: 500, + animationEasing: 'cubicInOut' + }; + return PieSeriesModel; +}(SeriesModel); + +function negativeDataFilter(seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + data.filterSelf(function (idx) { + // handle negative value condition + var valueDim = data.mapDimension('value'); + var curValue = data.get(valueDim, idx); + if (isNumber(curValue) && !isNaN(curValue) && curValue < 0) { + return false; + } + return true; + }); + } + }; +} + +function install$8(registers) { + registers.registerChartView(PieView); + registers.registerSeriesModel(PieSeriesModel); + createLegacyDataSelectAction('pie', registers.registerAction); + registers.registerLayout(curry$1(pieLayout, 'pie')); + registers.registerProcessor(dataFilter('pie')); + registers.registerProcessor(negativeDataFilter('pie')); +} + +var GridModel = /** @class */function (_super) { + __extends(GridModel, _super); + function GridModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + GridModel.type = 'grid'; + GridModel.dependencies = ['xAxis', 'yAxis']; + GridModel.layoutMode = 'box'; + GridModel.defaultOption = { + show: false, + // zlevel: 0, + z: 0, + left: '10%', + top: 60, + right: '10%', + bottom: 70, + // If grid size contain label + containLabel: false, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 1, + borderColor: '#ccc' + }; + return GridModel; +}(ComponentModel); + +var CartesianAxisModel = /** @class */function (_super) { + __extends(CartesianAxisModel, _super); + function CartesianAxisModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + CartesianAxisModel.prototype.getCoordSysModel = function () { + return this.getReferringComponents('grid', SINGLE_REFERRING).models[0]; + }; + CartesianAxisModel.type = 'cartesian2dAxis'; + return CartesianAxisModel; +}(ComponentModel); +mixin(CartesianAxisModel, AxisModelCommonMixin); + +var defaultOption = { + show: true, + // zlevel: 0, + z: 0, + // Inverse the axis. + inverse: false, + // Axis name displayed. + name: '', + // 'start' | 'middle' | 'end' + nameLocation: 'end', + // By degree. By default auto rotate by nameLocation. + nameRotate: null, + nameTruncate: { + maxWidth: null, + ellipsis: '...', + placeholder: '.' + }, + // Use global text style by default. + nameTextStyle: {}, + // The gap between axisName and axisLine. + nameGap: 15, + // Default `false` to support tooltip. + silent: false, + // Default `false` to avoid legacy user event listener fail. + triggerEvent: false, + tooltip: { + show: false + }, + axisPointer: {}, + axisLine: { + show: true, + onZero: true, + onZeroAxisIndex: null, + lineStyle: { + color: '#6E7079', + width: 1, + type: 'solid' + }, + // The arrow at both ends the the axis. + symbol: ['none', 'none'], + symbolSize: [10, 15] + }, + axisTick: { + show: true, + // Whether axisTick is inside the grid or outside the grid. + inside: false, + // The length of axisTick. + length: 5, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + // Whether axisLabel is inside the grid or outside the grid. + inside: false, + rotate: 0, + // true | false | null/undefined (auto) + showMinLabel: null, + // true | false | null/undefined (auto) + showMaxLabel: null, + margin: 8, + // formatter: null, + fontSize: 12 + }, + splitLine: { + show: true, + showMinLine: true, + showMaxLine: true, + lineStyle: { + color: ['#E0E6F1'], + width: 1, + type: 'solid' + } + }, + splitArea: { + show: false, + areaStyle: { + color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)'] + } + } +}; +var categoryAxis = merge({ + // The gap at both ends of the axis. For categoryAxis, boolean. + boundaryGap: true, + // Set false to faster category collection. + deduplication: null, + // splitArea: { + // show: false + // }, + splitLine: { + show: false + }, + axisTick: { + // If tick is align with label when boundaryGap is true + alignWithLabel: false, + interval: 'auto' + }, + axisLabel: { + interval: 'auto' + } +}, defaultOption); +var valueAxis = merge({ + boundaryGap: [0, 0], + axisLine: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + axisTick: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + // TODO + // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60] + splitNumber: 5, + minorTick: { + // Minor tick, not available for cateogry axis. + show: false, + // Split number of minor ticks. The value should be in range of (0, 100) + splitNumber: 5, + // Length of minor tick + length: 3, + // Line style + lineStyle: { + // Default to be same with axisTick + } + }, + minorSplitLine: { + show: false, + lineStyle: { + color: '#F4F7FD', + width: 1 + } + } +}, defaultOption); +var timeAxis = merge({ + splitNumber: 6, + axisLabel: { + // To eliminate labels that are not nice + showMinLabel: false, + showMaxLabel: false, + rich: { + primary: { + fontWeight: 'bold' + } + } + }, + splitLine: { + show: false + } +}, valueAxis); +var logAxis = defaults({ + logBase: 10 +}, valueAxis); +const axisDefault = { + category: categoryAxis, + value: valueAxis, + time: timeAxis, + log: logAxis +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +var AXIS_TYPES = { + value: 1, + category: 1, + time: 1, + log: 1 +}; + +/** + * Generate sub axis model class + * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ... + */ +function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) { + each$4(AXIS_TYPES, function (v, axisType) { + var defaultOption = merge(merge({}, axisDefault[axisType], true), extraDefaultOption, true); + var AxisModel = /** @class */function (_super) { + __extends(AxisModel, _super); + function AxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = axisName + 'Axis.' + axisType; + return _this; + } + AxisModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(axisType + 'Axis')); + merge(option, this.getDefaultOption()); + option.type = getAxisType(option); + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + AxisModel.prototype.optionUpdated = function () { + var thisOption = this.option; + if (thisOption.type === 'category') { + this.__ordinalMeta = OrdinalMeta.createByAxisModel(this); + } + }; + /** + * Should not be called before all of 'getInitailData' finished. + * Because categories are collected during initializing data. + */ + AxisModel.prototype.getCategories = function (rawData) { + var option = this.option; + // FIXME + // warning if called before all of 'getInitailData' finished. + if (option.type === 'category') { + if (rawData) { + return option.data; + } + return this.__ordinalMeta.categories; + } + }; + AxisModel.prototype.getOrdinalMeta = function () { + return this.__ordinalMeta; + }; + AxisModel.type = axisName + 'Axis.' + axisType; + AxisModel.defaultOption = defaultOption; + return AxisModel; + }(BaseAxisModelClass); + registers.registerComponentModel(AxisModel); + }); + registers.registerSubTypeDefaulter(axisName + 'Axis', getAxisType); +} +function getAxisType(option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); +} + +var Cartesian = /** @class */function () { + function Cartesian(name) { + this.type = 'cartesian'; + this._dimList = []; + this._axes = {}; + this.name = name || ''; + } + Cartesian.prototype.getAxis = function (dim) { + return this._axes[dim]; + }; + Cartesian.prototype.getAxes = function () { + return map$1(this._dimList, function (dim) { + return this._axes[dim]; + }, this); + }; + Cartesian.prototype.getAxesByScale = function (scaleType) { + scaleType = scaleType.toLowerCase(); + return filter(this.getAxes(), function (axis) { + return axis.scale.type === scaleType; + }); + }; + Cartesian.prototype.addAxis = function (axis) { + var dim = axis.dim; + this._axes[dim] = axis; + this._dimList.push(dim); + }; + return Cartesian; +}(); + +var cartesian2DDimensions = ['x', 'y']; +function canCalculateAffineTransform(scale) { + return scale.type === 'interval' || scale.type === 'time'; +} +var Cartesian2D = /** @class */function (_super) { + __extends(Cartesian2D, _super); + function Cartesian2D() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = 'cartesian2d'; + _this.dimensions = cartesian2DDimensions; + return _this; + } + /** + * Calculate an affine transform matrix if two axes are time or value. + * It's mainly for accelartion on the large time series data. + */ + Cartesian2D.prototype.calcAffineTransform = function () { + this._transform = this._invTransform = null; + var xAxisScale = this.getAxis('x').scale; + var yAxisScale = this.getAxis('y').scale; + if (!canCalculateAffineTransform(xAxisScale) || !canCalculateAffineTransform(yAxisScale)) { + return; + } + var xScaleExtent = xAxisScale.getExtent(); + var yScaleExtent = yAxisScale.getExtent(); + var start = this.dataToPoint([xScaleExtent[0], yScaleExtent[0]]); + var end = this.dataToPoint([xScaleExtent[1], yScaleExtent[1]]); + var xScaleSpan = xScaleExtent[1] - xScaleExtent[0]; + var yScaleSpan = yScaleExtent[1] - yScaleExtent[0]; + if (!xScaleSpan || !yScaleSpan) { + return; + } + // Accelerate data to point calculation on the special large time series data. + var scaleX = (end[0] - start[0]) / xScaleSpan; + var scaleY = (end[1] - start[1]) / yScaleSpan; + var translateX = start[0] - xScaleExtent[0] * scaleX; + var translateY = start[1] - yScaleExtent[0] * scaleY; + var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY]; + this._invTransform = invert([], m); + }; + /** + * Base axis will be used on stacking. + */ + Cartesian2D.prototype.getBaseAxis = function () { + return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAxis('x'); + }; + Cartesian2D.prototype.containPoint = function (point) { + var axisX = this.getAxis('x'); + var axisY = this.getAxis('y'); + return axisX.contain(axisX.toLocalCoord(point[0])) && axisY.contain(axisY.toLocalCoord(point[1])); + }; + Cartesian2D.prototype.containData = function (data) { + return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]); + }; + Cartesian2D.prototype.containZone = function (data1, data2) { + var zoneDiag1 = this.dataToPoint(data1); + var zoneDiag2 = this.dataToPoint(data2); + var area = this.getArea(); + var zone = new BoundingRect(zoneDiag1[0], zoneDiag1[1], zoneDiag2[0] - zoneDiag1[0], zoneDiag2[1] - zoneDiag1[1]); + return area.intersect(zone); + }; + Cartesian2D.prototype.dataToPoint = function (data, clamp, out) { + out = out || []; + var xVal = data[0]; + var yVal = data[1]; + // Fast path + if (this._transform + // It's supported that if data is like `[Inifity, 123]`, where only Y pixel calculated. + && xVal != null && isFinite(xVal) && yVal != null && isFinite(yVal)) { + return applyTransform$1(out, data, this._transform); + } + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(xVal, clamp)); + out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(yVal, clamp)); + return out; + }; + Cartesian2D.prototype.clampData = function (data, out) { + var xScale = this.getAxis('x').scale; + var yScale = this.getAxis('y').scale; + var xAxisExtent = xScale.getExtent(); + var yAxisExtent = yScale.getExtent(); + var x = xScale.parse(data[0]); + var y = yScale.parse(data[1]); + out = out || []; + out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1])); + out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1])); + return out; + }; + Cartesian2D.prototype.pointToData = function (point, clamp) { + var out = []; + if (this._invTransform) { + return applyTransform$1(out, point, this._invTransform); + } + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp); + out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp); + return out; + }; + Cartesian2D.prototype.getOtherAxis = function (axis) { + return this.getAxis(axis.dim === 'x' ? 'y' : 'x'); + }; + /** + * Get rect area of cartesian. + * Area will have a contain function to determine if a point is in the coordinate system. + */ + Cartesian2D.prototype.getArea = function (tolerance) { + tolerance = tolerance || 0; + var xExtent = this.getAxis('x').getGlobalExtent(); + var yExtent = this.getAxis('y').getGlobalExtent(); + var x = Math.min(xExtent[0], xExtent[1]) - tolerance; + var y = Math.min(yExtent[0], yExtent[1]) - tolerance; + var width = Math.max(xExtent[0], xExtent[1]) - x + tolerance; + var height = Math.max(yExtent[0], yExtent[1]) - y + tolerance; + return new BoundingRect(x, y, width, height); + }; + return Cartesian2D; +}(Cartesian); + +var Axis2D = /** @class */function (_super) { + __extends(Axis2D, _super); + function Axis2D(dim, scale, coordExtent, axisType, position) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + /** + * Index of axis, can be used as key + * Injected outside. + */ + _this.index = 0; + _this.type = axisType || 'value'; + _this.position = position || 'bottom'; + return _this; + } + Axis2D.prototype.isHorizontal = function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }; + /** + * Each item cooresponds to this.getExtent(), which + * means globalExtent[0] may greater than globalExtent[1], + * unless `asc` is input. + * + * @param {boolean} [asc] + * @return {Array.} + */ + Axis2D.prototype.getGlobalExtent = function (asc) { + var ret = this.getExtent(); + ret[0] = this.toGlobalCoord(ret[0]); + ret[1] = this.toGlobalCoord(ret[1]); + asc && ret[0] > ret[1] && ret.reverse(); + return ret; + }; + Axis2D.prototype.pointToData = function (point, clamp) { + return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp); + }; + /** + * Set ordinalSortInfo + * @param info new OrdinalSortInfo + */ + Axis2D.prototype.setCategorySortInfo = function (info) { + if (this.type !== 'category') { + return false; + } + this.model.option.categorySortInfo = info; + this.scale.setSortInfo(info); + }; + return Axis2D; +}(Axis); + +function layout(gridModel, axisModel, opt) { + opt = opt || {}; + var grid = gridModel.coordinateSystem; + var axis = axisModel.axis; + var layout2 = {}; + var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0]; + var rawAxisPosition = axis.position; + var axisPosition = otherAxisOnZeroOf ? "onZero" : rawAxisPosition; + var axisDim = axis.dim; + var rect = grid.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var idx = { + left: 0, + right: 1, + top: 0, + bottom: 1, + onZero: 2 + }; + var axisOffset = axisModel.get("offset") || 0; + var posBound = axisDim === "x" ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] : [rectBound[0] - axisOffset, rectBound[1] + axisOffset]; + if (otherAxisOnZeroOf) { + var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0)); + posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]); + } + layout2.position = [axisDim === "y" ? posBound[idx[axisPosition]] : rectBound[0], axisDim === "x" ? posBound[idx[axisPosition]] : rectBound[3]]; + layout2.rotation = Math.PI / 2 * (axisDim === "x" ? 0 : 1); + var dirMap = { + top: -1, + bottom: 1, + left: -1, + right: 1 + }; + layout2.labelDirection = layout2.tickDirection = layout2.nameDirection = dirMap[rawAxisPosition]; + layout2.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0; + if (axisModel.get(["axisTick", "inside"])) { + layout2.tickDirection = -layout2.tickDirection; + } + if (retrieve(opt.labelInside, axisModel.get(["axisLabel", "inside"]))) { + layout2.labelDirection = -layout2.labelDirection; + } + var labelRotate = axisModel.get(["axisLabel", "rotate"]); + layout2.labelRotate = axisPosition === "top" ? -labelRotate : labelRotate; + layout2.z2 = 1; + return layout2; +} +function isCartesian2DSeries(seriesModel) { + return seriesModel.get("coordinateSystem") === "cartesian2d"; +} +function findAxisModels(seriesModel) { + var axisModelMap = { + xAxisModel: null, + yAxisModel: null + }; + each$4(axisModelMap, function(v, key) { + var axisType = key.replace(/Model$/, ""); + var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; + axisModelMap[key] = axisModel; + }); + return axisModelMap; +} + +var mathLog = Math.log; +function alignScaleTicks(scale, axisModel, alignToScale) { + var intervalScaleProto = IntervalScale.prototype; + var alignToTicks = intervalScaleProto.getTicks.call(alignToScale); + var alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true); + var alignToSplitNumber = alignToTicks.length - 1; + var alignToInterval = intervalScaleProto.getInterval.call(alignToScale); + var scaleExtent = getScaleExtent(scale, axisModel); + var rawExtent = scaleExtent.extent; + var isMinFixed = scaleExtent.fixMin; + var isMaxFixed = scaleExtent.fixMax; + if (scale.type === "log") { + var logBase = mathLog(scale.base); + rawExtent = [mathLog(rawExtent[0]) / logBase, mathLog(rawExtent[1]) / logBase]; + } + scale.setExtent(rawExtent[0], rawExtent[1]); + scale.calcNiceExtent({ + splitNumber: alignToSplitNumber, + fixMin: isMinFixed, + fixMax: isMaxFixed + }); + var extent = intervalScaleProto.getExtent.call(scale); + if (isMinFixed) { + rawExtent[0] = extent[0]; + } + if (isMaxFixed) { + rawExtent[1] = extent[1]; + } + var interval = intervalScaleProto.getInterval.call(scale); + var min = rawExtent[0]; + var max = rawExtent[1]; + if (isMinFixed && isMaxFixed) { + interval = (max - min) / alignToSplitNumber; + } else if (isMinFixed) { + max = rawExtent[0] + interval * alignToSplitNumber; + while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])) { + interval = increaseInterval(interval); + max = rawExtent[0] + interval * alignToSplitNumber; + } + } else if (isMaxFixed) { + min = rawExtent[1] - interval * alignToSplitNumber; + while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])) { + interval = increaseInterval(interval); + min = rawExtent[1] - interval * alignToSplitNumber; + } + } else { + var nicedSplitNumber = scale.getTicks().length - 1; + if (nicedSplitNumber > alignToSplitNumber) { + interval = increaseInterval(interval); + } + var range = interval * alignToSplitNumber; + max = Math.ceil(rawExtent[1] / interval) * interval; + min = round$1(max - range); + if (min < 0 && rawExtent[0] >= 0) { + min = 0; + max = round$1(range); + } else if (max > 0 && rawExtent[1] <= 0) { + max = 0; + min = -round$1(range); + } + } + var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval; + var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval; + intervalScaleProto.setExtent.call(scale, min + interval * t0, max + interval * t1); + intervalScaleProto.setInterval.call(scale, interval); + if (t0 || t1) { + intervalScaleProto.setNiceExtent.call(scale, min + interval, max - interval); + } +} + +var Grid = ( + /** @class */ + function() { + function Grid2(gridModel, ecModel, api) { + this.type = "grid"; + this._coordsMap = {}; + this._coordsList = []; + this._axesMap = {}; + this._axesList = []; + this.axisPointerEnabled = true; + this.dimensions = cartesian2DDimensions; + this._initCartesian(gridModel, ecModel, api); + this.model = gridModel; + } + Grid2.prototype.getRect = function() { + return this._rect; + }; + Grid2.prototype.update = function(ecModel, api) { + var axesMap = this._axesMap; + this._updateScale(ecModel, this.model); + function updateAxisTicks(axes) { + var alignTo; + var axesIndices = keys(axes); + var len = axesIndices.length; + if (!len) { + return; + } + var axisNeedsAlign = []; + for (var i = len - 1; i >= 0; i--) { + var idx = +axesIndices[i]; + var axis = axes[idx]; + var model = axis.model; + var scale = axis.scale; + if ( + // Only value and log axis without interval support alignTicks. + isIntervalOrLogScale(scale) && model.get("alignTicks") && model.get("interval") == null + ) { + axisNeedsAlign.push(axis); + } else { + niceScaleExtent(scale, model); + if (isIntervalOrLogScale(scale)) { + alignTo = axis; + } + } + } + if (axisNeedsAlign.length) { + if (!alignTo) { + alignTo = axisNeedsAlign.pop(); + niceScaleExtent(alignTo.scale, alignTo.model); + } + each$4(axisNeedsAlign, function(axis2) { + alignScaleTicks(axis2.scale, axis2.model, alignTo.scale); + }); + } + } + updateAxisTicks(axesMap.x); + updateAxisTicks(axesMap.y); + var onZeroRecords = {}; + each$4(axesMap.x, function(xAxis) { + fixAxisOnZero(axesMap, "y", xAxis, onZeroRecords); + }); + each$4(axesMap.y, function(yAxis) { + fixAxisOnZero(axesMap, "x", yAxis, onZeroRecords); + }); + this.resize(this.model, api); + }; + Grid2.prototype.resize = function(gridModel, api, ignoreContainLabel) { + var boxLayoutParams = gridModel.getBoxLayoutParams(); + var isContainLabel = !ignoreContainLabel && gridModel.get("containLabel"); + var gridRect = getLayoutRect(boxLayoutParams, { + width: api.getWidth(), + height: api.getHeight() + }); + this._rect = gridRect; + var axesList = this._axesList; + adjustAxes(); + if (isContainLabel) { + each$4(axesList, function(axis) { + if (!axis.model.get(["axisLabel", "inside"])) { + var labelUnionRect = estimateLabelUnionRect(axis); + if (labelUnionRect) { + var dim = axis.isHorizontal() ? "height" : "width"; + var margin = axis.model.get(["axisLabel", "margin"]); + gridRect[dim] -= labelUnionRect[dim] + margin; + if (axis.position === "top") { + gridRect.y += labelUnionRect.height + margin; + } else if (axis.position === "left") { + gridRect.x += labelUnionRect.width + margin; + } + } + } + }); + adjustAxes(); + } + each$4(this._coordsList, function(coord) { + coord.calcAffineTransform(); + }); + function adjustAxes() { + each$4(axesList, function(axis) { + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y); + }); + } + }; + Grid2.prototype.getAxis = function(dim, axisIndex) { + var axesMapOnDim = this._axesMap[dim]; + if (axesMapOnDim != null) { + return axesMapOnDim[axisIndex || 0]; + } + }; + Grid2.prototype.getAxes = function() { + return this._axesList.slice(); + }; + Grid2.prototype.getCartesian = function(xAxisIndex, yAxisIndex) { + if (xAxisIndex != null && yAxisIndex != null) { + var key = "x" + xAxisIndex + "y" + yAxisIndex; + return this._coordsMap[key]; + } + if (isObject$2(xAxisIndex)) { + yAxisIndex = xAxisIndex.yAxisIndex; + xAxisIndex = xAxisIndex.xAxisIndex; + } + for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) { + if (coordList[i].getAxis("x").index === xAxisIndex || coordList[i].getAxis("y").index === yAxisIndex) { + return coordList[i]; + } + } + }; + Grid2.prototype.getCartesians = function() { + return this._coordsList.slice(); + }; + Grid2.prototype.convertToPixel = function(ecModel, finder, value) { + var target = this._findConvertTarget(finder); + return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null; + }; + Grid2.prototype.convertFromPixel = function(ecModel, finder, value) { + var target = this._findConvertTarget(finder); + return target.cartesian ? target.cartesian.pointToData(value) : target.axis ? target.axis.coordToData(target.axis.toLocalCoord(value)) : null; + }; + Grid2.prototype._findConvertTarget = function(finder) { + var seriesModel = finder.seriesModel; + var xAxisModel = finder.xAxisModel || seriesModel && seriesModel.getReferringComponents("xAxis", SINGLE_REFERRING).models[0]; + var yAxisModel = finder.yAxisModel || seriesModel && seriesModel.getReferringComponents("yAxis", SINGLE_REFERRING).models[0]; + var gridModel = finder.gridModel; + var coordsList = this._coordsList; + var cartesian; + var axis; + if (seriesModel) { + cartesian = seriesModel.coordinateSystem; + indexOf(coordsList, cartesian) < 0 && (cartesian = null); + } else if (xAxisModel && yAxisModel) { + cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + } else if (xAxisModel) { + axis = this.getAxis("x", xAxisModel.componentIndex); + } else if (yAxisModel) { + axis = this.getAxis("y", yAxisModel.componentIndex); + } else if (gridModel) { + var grid = gridModel.coordinateSystem; + if (grid === this) { + cartesian = this._coordsList[0]; + } + } + return { + cartesian, + axis + }; + }; + Grid2.prototype.containPoint = function(point) { + var coord = this._coordsList[0]; + if (coord) { + return coord.containPoint(point); + } + }; + Grid2.prototype._initCartesian = function(gridModel, ecModel, api) { + var _this = this; + var grid = this; + var axisPositionUsed = { + left: false, + right: false, + top: false, + bottom: false + }; + var axesMap = { + x: {}, + y: {} + }; + var axesCount = { + x: 0, + y: 0 + }; + ecModel.eachComponent("xAxis", createAxisCreator("x"), this); + ecModel.eachComponent("yAxis", createAxisCreator("y"), this); + if (!axesCount.x || !axesCount.y) { + this._axesMap = {}; + this._axesList = []; + return; + } + this._axesMap = axesMap; + each$4(axesMap.x, function(xAxis, xAxisIndex) { + each$4(axesMap.y, function(yAxis, yAxisIndex) { + var key = "x" + xAxisIndex + "y" + yAxisIndex; + var cartesian = new Cartesian2D(key); + cartesian.master = _this; + cartesian.model = gridModel; + _this._coordsMap[key] = cartesian; + _this._coordsList.push(cartesian); + cartesian.addAxis(xAxis); + cartesian.addAxis(yAxis); + }); + }); + function createAxisCreator(dimName) { + return function(axisModel, idx) { + if (!isAxisUsedInTheGrid(axisModel, gridModel)) { + return; + } + var axisPosition = axisModel.get("position"); + if (dimName === "x") { + if (axisPosition !== "top" && axisPosition !== "bottom") { + axisPosition = axisPositionUsed.bottom ? "top" : "bottom"; + } + } else { + if (axisPosition !== "left" && axisPosition !== "right") { + axisPosition = axisPositionUsed.left ? "right" : "left"; + } + } + axisPositionUsed[axisPosition] = true; + var axis = new Axis2D(dimName, createScaleByModel(axisModel), [0, 0], axisModel.get("type"), axisPosition); + var isCategory = axis.type === "category"; + axis.onBand = isCategory && axisModel.get("boundaryGap"); + axis.inverse = axisModel.get("inverse"); + axisModel.axis = axis; + axis.model = axisModel; + axis.grid = grid; + axis.index = idx; + grid._axesList.push(axis); + axesMap[dimName][idx] = axis; + axesCount[dimName]++; + }; + } + }; + Grid2.prototype._updateScale = function(ecModel, gridModel) { + each$4(this._axesList, function(axis) { + axis.scale.setExtent(Infinity, -Infinity); + if (axis.type === "category") { + var categorySortInfo = axis.model.get("categorySortInfo"); + axis.scale.setSortInfo(categorySortInfo); + } + }); + ecModel.eachSeries(function(seriesModel) { + if (isCartesian2DSeries(seriesModel)) { + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + if (!isAxisUsedInTheGrid(xAxisModel, gridModel) || !isAxisUsedInTheGrid(yAxisModel, gridModel)) { + return; + } + var cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + var data = seriesModel.getData(); + var xAxis = cartesian.getAxis("x"); + var yAxis = cartesian.getAxis("y"); + unionExtent(data, xAxis); + unionExtent(data, yAxis); + } + }, this); + function unionExtent(data, axis) { + each$4(getDataDimensionsOnAxis(data, axis.dim), function(dim) { + axis.scale.unionExtentFromData(data, dim); + }); + } + }; + Grid2.prototype.getTooltipAxes = function(dim) { + var baseAxes = []; + var otherAxes = []; + each$4(this.getCartesians(), function(cartesian) { + var baseAxis = dim != null && dim !== "auto" ? cartesian.getAxis(dim) : cartesian.getBaseAxis(); + var otherAxis = cartesian.getOtherAxis(baseAxis); + indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis); + indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis); + }); + return { + baseAxes, + otherAxes + }; + }; + Grid2.create = function(ecModel, api) { + var grids = []; + ecModel.eachComponent("grid", function(gridModel, idx) { + var grid = new Grid2(gridModel, ecModel, api); + grid.name = "grid_" + idx; + grid.resize(gridModel, api, true); + gridModel.coordinateSystem = grid; + grids.push(grid); + }); + ecModel.eachSeries(function(seriesModel) { + if (!isCartesian2DSeries(seriesModel)) { + return; + } + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + var gridModel = xAxisModel.getCoordSysModel(); + var grid = gridModel.coordinateSystem; + seriesModel.coordinateSystem = grid.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + }); + return grids; + }; + Grid2.dimensions = cartesian2DDimensions; + return Grid2; + }() +); +function isAxisUsedInTheGrid(axisModel, gridModel) { + return axisModel.getCoordSysModel() === gridModel; +} +function fixAxisOnZero(axesMap, otherAxisDim, axis, onZeroRecords) { + axis.getAxesOnZeroOf = function() { + return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : []; + }; + var otherAxes = axesMap[otherAxisDim]; + var otherAxisOnZeroOf; + var axisModel = axis.model; + var onZero = axisModel.get(["axisLine", "onZero"]); + var onZeroAxisIndex = axisModel.get(["axisLine", "onZeroAxisIndex"]); + if (!onZero) { + return; + } + if (onZeroAxisIndex != null) { + if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) { + otherAxisOnZeroOf = otherAxes[onZeroAxisIndex]; + } + } else { + for (var idx in otherAxes) { + if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx]) && !onZeroRecords[getOnZeroRecordKey(otherAxes[idx])]) { + otherAxisOnZeroOf = otherAxes[idx]; + break; + } + } + } + if (otherAxisOnZeroOf) { + onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true; + } + function getOnZeroRecordKey(axis2) { + return axis2.dim + "_" + axis2.index; + } +} +function canOnZeroToAxis(axis) { + return axis && axis.type !== "category" && axis.type !== "time" && ifAxisCrossZero(axis); +} +function updateAxisTransform(axis, coordBase) { + var axisExtent = axis.getExtent(); + var axisExtentSum = axisExtent[0] + axisExtent[1]; + axis.toGlobalCoord = axis.dim === "x" ? function(coord) { + return coord + coordBase; + } : function(coord) { + return axisExtentSum - coord + coordBase; + }; + axis.toLocalCoord = axis.dim === "x" ? function(coord) { + return coord - coordBase; + } : function(coord) { + return axisExtentSum - coord + coordBase; + }; +} + +var PI = Math.PI; +/** + * A final axis is translated and rotated from a "standard axis". + * So opt.position and opt.rotation is required. + * + * A standard axis is and axis from [0, 0] to [0, axisExtent[1]], + * for example: (0, 0) ------------> (0, 50) + * + * nameDirection or tickDirection or labelDirection is 1 means tick + * or label is below the standard axis, whereas is -1 means above + * the standard axis. labelOffset means offset between label and axis, + * which is useful when 'onZero', where axisLabel is in the grid and + * label in outside grid. + * + * Tips: like always, + * positive rotation represents anticlockwise, and negative rotation + * represents clockwise. + * The direction of position coordinate is the same as the direction + * of screen coordinate. + * + * Do not need to consider axis 'inverse', which is auto processed by + * axis extent. + */ +var AxisBuilder = /** @class */function () { + function AxisBuilder(axisModel, opt) { + this.group = new Group$2(); + this.opt = opt; + this.axisModel = axisModel; + // Default value + defaults(opt, { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: true, + handleAutoShown: function () { + return true; + } + }); + // FIXME Not use a separate text group? + var transformGroup = new Group$2({ + x: opt.position[0], + y: opt.position[1], + rotation: opt.rotation + }); + // this.group.add(transformGroup); + // this._transformGroup = transformGroup; + transformGroup.updateTransform(); + this._transformGroup = transformGroup; + } + AxisBuilder.prototype.hasBuilder = function (name) { + return !!builders[name]; + }; + AxisBuilder.prototype.add = function (name) { + builders[name](this.opt, this.axisModel, this.group, this._transformGroup); + }; + AxisBuilder.prototype.getGroup = function () { + return this.group; + }; + AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) { + var rotationDiff = remRadian(textRotation - axisRotation); + var textAlign; + var textVerticalAlign; + if (isRadianAroundZero(rotationDiff)) { + // Label is parallel with axis line. + textVerticalAlign = direction > 0 ? 'top' : 'bottom'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI)) { + // Label is inverse parallel with axis line. + textVerticalAlign = direction > 0 ? 'bottom' : 'top'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + if (rotationDiff > 0 && rotationDiff < PI) { + textAlign = direction > 0 ? 'right' : 'left'; + } else { + textAlign = direction > 0 ? 'left' : 'right'; + } + } + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; + }; + AxisBuilder.makeAxisEventDataBase = function (axisModel) { + var eventData = { + componentType: axisModel.mainType, + componentIndex: axisModel.componentIndex + }; + eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex; + return eventData; + }; + AxisBuilder.isLabelSilent = function (axisModel) { + var tooltipOpt = axisModel.get('tooltip'); + return axisModel.get('silent') + // Consider mouse cursor, add these restrictions. + || !(axisModel.get('triggerEvent') || tooltipOpt && tooltipOpt.show); + }; + return AxisBuilder; +}(); +var builders = { + axisLine: function (opt, axisModel, group, transformGroup) { + var shown = axisModel.get(['axisLine', 'show']); + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisLine'); + } + if (!shown) { + return; + } + var extent = axisModel.axis.getExtent(); + var matrix = transformGroup.transform; + var pt1 = [extent[0], 0]; + var pt2 = [extent[1], 0]; + var inverse = pt1[0] > pt2[0]; + if (matrix) { + applyTransform$1(pt1, pt1, matrix); + applyTransform$1(pt2, pt2, matrix); + } + var lineStyle = extend({ + lineCap: 'round' + }, axisModel.getModel(['axisLine', 'lineStyle']).getLineStyle()); + var line = new Line({ + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: lineStyle, + strokeContainThreshold: opt.strokeContainThreshold || 5, + silent: true, + z2: 1 + }); + subPixelOptimizeLine(line.shape, line.style.lineWidth); + line.anid = 'line'; + group.add(line); + var arrows = axisModel.get(['axisLine', 'symbol']); + if (arrows != null) { + var arrowSize = axisModel.get(['axisLine', 'symbolSize']); + if (isString(arrows)) { + // Use the same arrow for start and end point + arrows = [arrows, arrows]; + } + if (isString(arrowSize) || isNumber(arrowSize)) { + // Use the same size for width and height + arrowSize = [arrowSize, arrowSize]; + } + var arrowOffset = normalizeSymbolOffset(axisModel.get(['axisLine', 'symbolOffset']) || 0, arrowSize); + var symbolWidth_1 = arrowSize[0]; + var symbolHeight_1 = arrowSize[1]; + each$4([{ + rotate: opt.rotation + Math.PI / 2, + offset: arrowOffset[0], + r: 0 + }, { + rotate: opt.rotation - Math.PI / 2, + offset: arrowOffset[1], + r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0]) + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1])) + }], function (point, index) { + if (arrows[index] !== 'none' && arrows[index] != null) { + var symbol = createSymbol(arrows[index], -symbolWidth_1 / 2, -symbolHeight_1 / 2, symbolWidth_1, symbolHeight_1, lineStyle.stroke, true); + // Calculate arrow position with offset + var r = point.r + point.offset; + var pt = inverse ? pt2 : pt1; + symbol.attr({ + rotation: point.rotate, + x: pt[0] + r * Math.cos(opt.rotation), + y: pt[1] - r * Math.sin(opt.rotation), + silent: true, + z2: 11 + }); + group.add(symbol); + } + }); + } + }, + axisTickLabel: function (opt, axisModel, group, transformGroup) { + var ticksEls = buildAxisMajorTicks(group, transformGroup, axisModel, opt); + var labelEls = buildAxisLabel(group, transformGroup, axisModel, opt); + fixMinMaxLabelShow(axisModel, labelEls, ticksEls); + buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection); + // This bit fixes the label overlap issue for the time chart. + // See https://github.com/apache/echarts/issues/14266 for more. + if (axisModel.get(['axisLabel', 'hideOverlap'])) { + var labelList = prepareLayoutList(map$1(labelEls, function (label) { + return { + label: label, + priority: label.z2, + defaultAttr: { + ignore: label.ignore + } + }; + })); + hideOverlap(labelList); + } + }, + axisName: function (opt, axisModel, group, transformGroup) { + var name = retrieve(opt.axisName, axisModel.get('name')); + if (!name) { + return; + } + var nameLocation = axisModel.get('nameLocation'); + var nameDirection = opt.nameDirection; + var textStyleModel = axisModel.getModel('nameTextStyle'); + var gap = axisModel.get('nameGap') || 0; + var extent = axisModel.axis.getExtent(); + var gapSignal = extent[0] > extent[1] ? -1 : 1; + var pos = [nameLocation === 'start' ? extent[0] - gapSignal * gap : nameLocation === 'end' ? extent[1] + gapSignal * gap : (extent[0] + extent[1]) / 2, + // Reuse labelOffset. + isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0]; + var labelLayout; + var nameRotation = axisModel.get('nameRotate'); + if (nameRotation != null) { + nameRotation = nameRotation * PI / 180; // To radian. + } + var axisNameAvailableWidth; + if (isNameLocationCenter(nameLocation)) { + labelLayout = AxisBuilder.innerTextLayout(opt.rotation, nameRotation != null ? nameRotation : opt.rotation, + // Adapt to axis. + nameDirection); + } else { + labelLayout = endTextLayout(opt.rotation, nameLocation, nameRotation || 0, extent); + axisNameAvailableWidth = opt.axisNameAvailableWidth; + if (axisNameAvailableWidth != null) { + axisNameAvailableWidth = Math.abs(axisNameAvailableWidth / Math.sin(labelLayout.rotation)); + !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null); + } + } + var textFont = textStyleModel.getFont(); + var truncateOpt = axisModel.get('nameTruncate', true) || {}; + var ellipsis = truncateOpt.ellipsis; + var maxWidth = retrieve(opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth); + var textEl = new ZRText({ + x: pos[0], + y: pos[1], + rotation: labelLayout.rotation, + silent: AxisBuilder.isLabelSilent(axisModel), + style: createTextStyle(textStyleModel, { + text: name, + font: textFont, + overflow: 'truncate', + width: maxWidth, + ellipsis: ellipsis, + fill: textStyleModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']), + align: textStyleModel.get('align') || labelLayout.textAlign, + verticalAlign: textStyleModel.get('verticalAlign') || labelLayout.textVerticalAlign + }), + z2: 1 + }); + setTooltipConfig({ + el: textEl, + componentModel: axisModel, + itemName: name + }); + textEl.__fullText = name; + // Id for animation + textEl.anid = 'name'; + if (axisModel.get('triggerEvent')) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisName'; + eventData.name = name; + getECData(textEl).eventData = eventData; + } + // FIXME + transformGroup.add(textEl); + textEl.updateTransform(); + group.add(textEl); + textEl.decomposeTransform(); + } +}; +function endTextLayout(rotation, textPosition, textRotate, extent) { + var rotationDiff = remRadian(textRotate - rotation); + var textAlign; + var textVerticalAlign; + var inverse = extent[0] > extent[1]; + var onLeft = textPosition === 'start' && !inverse || textPosition !== 'start' && inverse; + if (isRadianAroundZero(rotationDiff - PI / 2)) { + textVerticalAlign = onLeft ? 'bottom' : 'top'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI * 1.5)) { + textVerticalAlign = onLeft ? 'top' : 'bottom'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + if (rotationDiff < PI * 1.5 && rotationDiff > PI / 2) { + textAlign = onLeft ? 'left' : 'right'; + } else { + textAlign = onLeft ? 'right' : 'left'; + } + } + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; +} +function fixMinMaxLabelShow(axisModel, labelEls, tickEls) { + if (shouldShowAllLabels(axisModel.axis)) { + return; + } + // If min or max are user set, we need to check + // If the tick on min(max) are overlap on their neighbour tick + // If they are overlapped, we need to hide the min(max) tick label + var showMinLabel = axisModel.get(['axisLabel', 'showMinLabel']); + var showMaxLabel = axisModel.get(['axisLabel', 'showMaxLabel']); + // FIXME + // Have not consider onBand yet, where tick els is more than label els. + labelEls = labelEls || []; + tickEls = tickEls || []; + var firstLabel = labelEls[0]; + var nextLabel = labelEls[1]; + var lastLabel = labelEls[labelEls.length - 1]; + var prevLabel = labelEls[labelEls.length - 2]; + var firstTick = tickEls[0]; + var nextTick = tickEls[1]; + var lastTick = tickEls[tickEls.length - 1]; + var prevTick = tickEls[tickEls.length - 2]; + if (showMinLabel === false) { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } else if (isTwoLabelOverlapped(firstLabel, nextLabel)) { + if (showMinLabel) { + ignoreEl(nextLabel); + ignoreEl(nextTick); + } else { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } + } + if (showMaxLabel === false) { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } else if (isTwoLabelOverlapped(prevLabel, lastLabel)) { + if (showMaxLabel) { + ignoreEl(prevLabel); + ignoreEl(prevTick); + } else { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } + } +} +function ignoreEl(el) { + el && (el.ignore = true); +} +function isTwoLabelOverlapped(current, next) { + // current and next has the same rotation. + var firstRect = current && current.getBoundingRect().clone(); + var nextRect = next && next.getBoundingRect().clone(); + if (!firstRect || !nextRect) { + return; + } + // When checking intersect of two rotated labels, we use mRotationBack + // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`. + var mRotationBack = identity([]); + rotate(mRotationBack, mRotationBack, -current.rotation); + firstRect.applyTransform(mul([], mRotationBack, current.getLocalTransform())); + nextRect.applyTransform(mul([], mRotationBack, next.getLocalTransform())); + return firstRect.intersect(nextRect); +} +function isNameLocationCenter(nameLocation) { + return nameLocation === 'middle' || nameLocation === 'center'; +} +function createTicks(ticksCoords, tickTransform, tickEndCoord, tickLineStyle, anidPrefix) { + var tickEls = []; + var pt1 = []; + var pt2 = []; + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = ticksCoords[i].coord; + pt1[0] = tickCoord; + pt1[1] = 0; + pt2[0] = tickCoord; + pt2[1] = tickEndCoord; + if (tickTransform) { + applyTransform$1(pt1, pt1, tickTransform); + applyTransform$1(pt2, pt2, tickTransform); + } + // Tick line, Not use group transform to have better line draw + var tickEl = new Line({ + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: tickLineStyle, + z2: 2, + autoBatch: true, + silent: true + }); + subPixelOptimizeLine(tickEl.shape, tickEl.style.lineWidth); + tickEl.anid = anidPrefix + '_' + ticksCoords[i].tickValue; + tickEls.push(tickEl); + } + return tickEls; +} +function buildAxisMajorTicks(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var tickModel = axisModel.getModel('axisTick'); + var shown = tickModel.get('show'); + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisTick'); + } + if (!shown || axis.scale.isBlank()) { + return; + } + var lineStyleModel = tickModel.getModel('lineStyle'); + var tickEndCoord = opt.tickDirection * tickModel.get('length'); + var ticksCoords = axis.getTicksCoords(); + var ticksEls = createTicks(ticksCoords, transformGroup.transform, tickEndCoord, defaults(lineStyleModel.getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + }), 'ticks'); + for (var i = 0; i < ticksEls.length; i++) { + group.add(ticksEls[i]); + } + return ticksEls; +} +function buildAxisMinorTicks(group, transformGroup, axisModel, tickDirection) { + var axis = axisModel.axis; + var minorTickModel = axisModel.getModel('minorTick'); + if (!minorTickModel.get('show') || axis.scale.isBlank()) { + return; + } + var minorTicksCoords = axis.getMinorTicksCoords(); + if (!minorTicksCoords.length) { + return; + } + var lineStyleModel = minorTickModel.getModel('lineStyle'); + var tickEndCoord = tickDirection * minorTickModel.get('length'); + var minorTickLineStyle = defaults(lineStyleModel.getLineStyle(), defaults(axisModel.getModel('axisTick').getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + })); + for (var i = 0; i < minorTicksCoords.length; i++) { + var minorTicksEls = createTicks(minorTicksCoords[i], transformGroup.transform, tickEndCoord, minorTickLineStyle, 'minorticks_' + i); + for (var k = 0; k < minorTicksEls.length; k++) { + group.add(minorTicksEls[k]); + } + } +} +function buildAxisLabel(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var show = retrieve(opt.axisLabelShow, axisModel.get(['axisLabel', 'show'])); + if (!show || axis.scale.isBlank()) { + return; + } + var labelModel = axisModel.getModel('axisLabel'); + var labelMargin = labelModel.get('margin'); + var labels = axis.getViewLabels(); + // Special label rotate. + var labelRotation = (retrieve(opt.labelRotate, labelModel.get('rotate')) || 0) * PI / 180; + var labelLayout = AxisBuilder.innerTextLayout(opt.rotation, labelRotation, opt.labelDirection); + var rawCategoryData = axisModel.getCategories && axisModel.getCategories(true); + var labelEls = []; + var silent = AxisBuilder.isLabelSilent(axisModel); + var triggerEvent = axisModel.get('triggerEvent'); + each$4(labels, function (labelItem, index) { + var tickValue = axis.scale.type === 'ordinal' ? axis.scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; + var formattedLabel = labelItem.formattedLabel; + var rawLabel = labelItem.rawLabel; + var itemLabelModel = labelModel; + if (rawCategoryData && rawCategoryData[tickValue]) { + var rawCategoryItem = rawCategoryData[tickValue]; + if (isObject$2(rawCategoryItem) && rawCategoryItem.textStyle) { + itemLabelModel = new Model(rawCategoryItem.textStyle, labelModel, axisModel.ecModel); + } + } + var textColor = itemLabelModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']); + var tickCoord = axis.dataToCoord(tickValue); + var align = itemLabelModel.getShallow('align', true) || labelLayout.textAlign; + var alignMin = retrieve2(itemLabelModel.getShallow('alignMinLabel', true), align); + var alignMax = retrieve2(itemLabelModel.getShallow('alignMaxLabel', true), align); + var verticalAlign = itemLabelModel.getShallow('verticalAlign', true) || itemLabelModel.getShallow('baseline', true) || labelLayout.textVerticalAlign; + var verticalAlignMin = retrieve2(itemLabelModel.getShallow('verticalAlignMinLabel', true), verticalAlign); + var verticalAlignMax = retrieve2(itemLabelModel.getShallow('verticalAlignMaxLabel', true), verticalAlign); + var textEl = new ZRText({ + x: tickCoord, + y: opt.labelOffset + opt.labelDirection * labelMargin, + rotation: labelLayout.rotation, + silent: silent, + z2: 10 + (labelItem.level || 0), + style: createTextStyle(itemLabelModel, { + text: formattedLabel, + align: index === 0 ? alignMin : index === labels.length - 1 ? alignMax : align, + verticalAlign: index === 0 ? verticalAlignMin : index === labels.length - 1 ? verticalAlignMax : verticalAlign, + fill: isFunction(textColor) ? textColor( + // (1) In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + // (2) Compatible with previous version, which always use formatted label as + // input. But in interval scale the formatted label is like '223,445', which + // maked user replace ','. So we modify it to return original val but remain + // it as 'string' to avoid error in replacing. + axis.type === 'category' ? rawLabel : axis.type === 'value' ? tickValue + '' : tickValue, index) : textColor + }) + }); + textEl.anid = 'label_' + tickValue; + setTooltipConfig({ + el: textEl, + componentModel: axisModel, + itemName: formattedLabel, + formatterParamsExtra: { + isTruncated: function () { + return textEl.isTruncated; + }, + value: rawLabel, + tickIndex: index + } + }); + // Pack data for mouse event + if (triggerEvent) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisLabel'; + eventData.value = rawLabel; + eventData.tickIndex = index; + if (axis.type === 'category') { + eventData.dataIndex = tickValue; + } + getECData(textEl).eventData = eventData; + } + // FIXME + transformGroup.add(textEl); + textEl.updateTransform(); + labelEls.push(textEl); + group.add(textEl); + textEl.decomposeTransform(); + }); + return labelEls; +} + +// Build axisPointerModel, mergin tooltip.axisPointer model for each axis. +// allAxesInfo should be updated when setOption performed. +function collect(ecModel, api) { + var result = { + /** + * key: makeKey(axis.model) + * value: { + * axis, + * coordSys, + * axisPointerModel, + * triggerTooltip, + * triggerEmphasis, + * involveSeries, + * snap, + * seriesModels, + * seriesDataCount + * } + */ + axesInfo: {}, + seriesInvolved: false, + /** + * key: makeKey(coordSys.model) + * value: Object: key makeKey(axis.model), value: axisInfo + */ + coordSysAxesInfo: {}, + coordSysMap: {} + }; + collectAxesInfo(result, ecModel, api); + // Check seriesInvolved for performance, in case too many series in some chart. + result.seriesInvolved && collectSeriesInfo(result, ecModel); + return result; +} +function collectAxesInfo(result, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var globalAxisPointerModel = ecModel.getComponent('axisPointer'); + // links can only be set on global. + var linksOption = globalAxisPointerModel.get('link', true) || []; + var linkGroups = []; + // Collect axes info. + each$4(api.getCoordinateSystems(), function (coordSys) { + // Some coordinate system do not support axes, like geo. + if (!coordSys.axisPointerEnabled) { + return; + } + var coordSysKey = makeKey(coordSys.model); + var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {}; + result.coordSysMap[coordSysKey] = coordSys; + // Set tooltip (like 'cross') is a convenient way to show axisPointer + // for user. So we enable setting tooltip on coordSys model. + var coordSysModel = coordSys.model; + var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel); + each$4(coordSys.getAxes(), curry$1(saveTooltipAxisInfo, false, null)); + // If axis tooltip used, choose tooltip axis for each coordSys. + // Notice this case: coordSys is `grid` but not `cartesian2D` here. + if (coordSys.getTooltipAxes && globalTooltipModel + // If tooltip.showContent is set as false, tooltip will not + // show but axisPointer will show as normal. + && baseTooltipModel.get('show')) { + // Compatible with previous logic. But series.tooltip.trigger: 'axis' + // or series.data[n].tooltip.trigger: 'axis' are not support any more. + var triggerAxis = baseTooltipModel.get('trigger') === 'axis'; + var cross = baseTooltipModel.get(['axisPointer', 'type']) === 'cross'; + var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(['axisPointer', 'axis'])); + if (triggerAxis || cross) { + each$4(tooltipAxes.baseAxes, curry$1(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis)); + } + if (cross) { + each$4(tooltipAxes.otherAxes, curry$1(saveTooltipAxisInfo, 'cross', false)); + } + } + // fromTooltip: true | false | 'cross' + // triggerTooltip: true | false | null + function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) { + var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel); + var axisPointerShow = axisPointerModel.get('show'); + if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) { + return; + } + if (triggerTooltip == null) { + triggerTooltip = axisPointerModel.get('triggerTooltip'); + } + axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel; + var snap = axisPointerModel.get('snap'); + var triggerEmphasis = axisPointerModel.get('triggerEmphasis'); + var axisKey = makeKey(axis.model); + var involveSeries = triggerTooltip || snap || axis.type === 'category'; + // If result.axesInfo[key] exist, override it (tooltip has higher priority). + var axisInfo = result.axesInfo[axisKey] = { + key: axisKey, + axis: axis, + coordSys: coordSys, + axisPointerModel: axisPointerModel, + triggerTooltip: triggerTooltip, + triggerEmphasis: triggerEmphasis, + involveSeries: involveSeries, + snap: snap, + useHandle: isHandleTrigger(axisPointerModel), + seriesModels: [], + linkGroup: null + }; + axesInfoInCoordSys[axisKey] = axisInfo; + result.seriesInvolved = result.seriesInvolved || involveSeries; + var groupIndex = getLinkGroupIndex(linksOption, axis); + if (groupIndex != null) { + var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = { + axesInfo: {} + }); + linkGroup.axesInfo[axisKey] = axisInfo; + linkGroup.mapper = linksOption[groupIndex].mapper; + axisInfo.linkGroup = linkGroup; + } + } + }); +} +function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) { + var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer'); + var fields = ['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z']; + var volatileOption = {}; + each$4(fields, function (field) { + volatileOption[field] = clone$2(tooltipAxisPointerModel.get(field)); + }); + // category axis do not auto snap, otherwise some tick that do not + // has value can not be hovered. value/time/log axis default snap if + // triggered from tooltip and trigger tooltip. + volatileOption.snap = axis.type !== 'category' && !!triggerTooltip; + // Compatible with previous behavior, tooltip axis does not show label by default. + // Only these properties can be overridden from tooltip to axisPointer. + if (tooltipAxisPointerModel.get('type') === 'cross') { + volatileOption.type = 'line'; + } + var labelOption = volatileOption.label || (volatileOption.label = {}); + // Follow the convention, do not show label when triggered by tooltip by default. + labelOption.show == null && (labelOption.show = false); + if (fromTooltip === 'cross') { + // When 'cross', both axes show labels. + var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(['label', 'show']); + labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; + // If triggerTooltip, this is a base axis, which should better not use cross style + // (cross style is dashed by default) + if (!triggerTooltip) { + var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle'); + crossStyle && defaults(labelOption, crossStyle.textStyle); + } + } + return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel)); +} +function collectSeriesInfo(result, ecModel) { + // Prepare data for axis trigger + ecModel.eachSeries(function (seriesModel) { + // Notice this case: this coordSys is `cartesian2D` but not `grid`. + var coordSys = seriesModel.coordinateSystem; + var seriesTooltipTrigger = seriesModel.get(['tooltip', 'trigger'], true); + var seriesTooltipShow = seriesModel.get(['tooltip', 'show'], true); + if (!coordSys || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get(['axisPointer', 'show'], true) === false) { + return; + } + each$4(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) { + var axis = axisInfo.axis; + if (coordSys.getAxis(axis.dim) === axis) { + axisInfo.seriesModels.push(seriesModel); + axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0); + axisInfo.seriesDataCount += seriesModel.getData().count(); + } + }); + }); +} +/** + * For example: + * { + * axisPointer: { + * links: [{ + * xAxisIndex: [2, 4], + * yAxisIndex: 'all' + * }, { + * xAxisId: ['a5', 'a7'], + * xAxisName: 'xxx' + * }] + * } + * } + */ +function getLinkGroupIndex(linksOption, axis) { + var axisModel = axis.model; + var dim = axis.dim; + for (var i = 0; i < linksOption.length; i++) { + var linkOption = linksOption[i] || {}; + if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) { + return i; + } + } +} +function checkPropInLink(linkPropValue, axisPropValue) { + return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue; +} +function fixValue(axisModel) { + var axisInfo = getAxisInfo(axisModel); + if (!axisInfo) { + return; + } + var axisPointerModel = axisInfo.axisPointerModel; + var scale = axisInfo.axis.scale; + var option = axisPointerModel.option; + var status = axisPointerModel.get('status'); + var value = axisPointerModel.get('value'); + // Parse init value for category and time axis. + if (value != null) { + value = scale.parse(value); + } + var useHandle = isHandleTrigger(axisPointerModel); + // If `handle` used, `axisPointer` will always be displayed, so value + // and status should be initialized. + if (status == null) { + option.status = useHandle ? 'show' : 'hide'; + } + var extent = scale.getExtent().slice(); + extent[0] > extent[1] && extent.reverse(); + if ( + // Pick a value on axis when initializing. + value == null + // If both `handle` and `dataZoom` are used, value may be out of axis extent, + // where we should re-pick a value to keep `handle` displaying normally. + || value > extent[1]) { + // Make handle displayed on the end of the axis when init, which looks better. + value = extent[1]; + } + if (value < extent[0]) { + value = extent[0]; + } + option.value = value; + if (useHandle) { + option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show'; + } +} +function getAxisInfo(axisModel) { + var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo; + return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)]; +} +function getAxisPointerModel(axisModel) { + var axisInfo = getAxisInfo(axisModel); + return axisInfo && axisInfo.axisPointerModel; +} +function isHandleTrigger(axisPointerModel) { + return !!axisPointerModel.get(['handle', 'show']); +} +/** + * @param {module:echarts/model/Model} model + * @return {string} unique key + */ +function makeKey(model) { + return model.type + '||' + model.id; +} + +var axisPointerClazz = {}; +var AxisView = ( + /** @class */ + function(_super) { + __extends(AxisView2, _super); + function AxisView2() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = AxisView2.type; + return _this; + } + AxisView2.prototype.render = function(axisModel, ecModel, api, payload) { + this.axisPointerClass && fixValue(axisModel); + _super.prototype.render.apply(this, arguments); + this._doUpdateAxisPointerClass(axisModel, api, true); + }; + AxisView2.prototype.updateAxisPointer = function(axisModel, ecModel, api, payload) { + this._doUpdateAxisPointerClass(axisModel, api, false); + }; + AxisView2.prototype.remove = function(ecModel, api) { + var axisPointer = this._axisPointer; + axisPointer && axisPointer.remove(api); + }; + AxisView2.prototype.dispose = function(ecModel, api) { + this._disposeAxisPointer(api); + _super.prototype.dispose.apply(this, arguments); + }; + AxisView2.prototype._doUpdateAxisPointerClass = function(axisModel, api, forceRender) { + var Clazz = AxisView2.getAxisPointerClass(this.axisPointerClass); + if (!Clazz) { + return; + } + var axisPointerModel = getAxisPointerModel(axisModel); + axisPointerModel ? (this._axisPointer || (this._axisPointer = new Clazz())).render(axisModel, axisPointerModel, api, forceRender) : this._disposeAxisPointer(api); + }; + AxisView2.prototype._disposeAxisPointer = function(api) { + this._axisPointer && this._axisPointer.dispose(api); + this._axisPointer = null; + }; + AxisView2.registerAxisPointerClass = function(type, clazz) { + axisPointerClazz[type] = clazz; + }; + AxisView2.getAxisPointerClass = function(type) { + return type && axisPointerClazz[type]; + }; + AxisView2.type = "axis"; + return AxisView2; + }(ComponentView) +); + +var inner$3 = makeInner(); +function rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + if (axis.scale.isBlank()) { + return; + } + // TODO: TYPE + var splitAreaModel = axisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var gridRect = gridModel.coordinateSystem.getRect(); + var ticksCoords = axis.getTicksCoords({ + tickModel: splitAreaModel, + clamp: true + }); + if (!ticksCoords.length) { + return; + } + // For Making appropriate splitArea animation, the color and anid + // should be corresponding to previous one if possible. + var areaColorsLen = areaColors.length; + var lastSplitAreaColors = inner$3(axisView).splitAreaColors; + var newSplitAreaColors = createHashMap(); + var colorIndex = 0; + if (lastSplitAreaColors) { + for (var i = 0; i < ticksCoords.length; i++) { + var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue); + if (cIndex != null) { + colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen; + break; + } + } + } + var prev = axis.toGlobalCoord(ticksCoords[0].coord); + var areaStyle = areaStyleModel.getAreaStyle(); + areaColors = isArray(areaColors) ? areaColors : [areaColors]; + for (var i = 1; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + var x = void 0; + var y = void 0; + var width = void 0; + var height = void 0; + if (axis.isHorizontal()) { + x = prev; + y = gridRect.y; + width = tickCoord - x; + height = gridRect.height; + prev = x + width; + } else { + x = gridRect.x; + y = prev; + width = gridRect.width; + height = tickCoord - y; + prev = y + height; + } + var tickValue = ticksCoords[i - 1].tickValue; + tickValue != null && newSplitAreaColors.set(tickValue, colorIndex); + axisGroup.add(new Rect({ + anid: tickValue != null ? 'area_' + tickValue : null, + shape: { + x: x, + y: y, + width: width, + height: height + }, + style: defaults({ + fill: areaColors[colorIndex] + }, areaStyle), + autoBatch: true, + silent: true + })); + colorIndex = (colorIndex + 1) % areaColorsLen; + } + inner$3(axisView).splitAreaColors = newSplitAreaColors; +} +function rectCoordAxisHandleRemove(axisView) { + inner$3(axisView).splitAreaColors = null; +} + +var axisBuilderAttrs = ['axisLine', 'axisTickLabel', 'axisName']; +var selfBuilderAttrs = ['splitArea', 'splitLine', 'minorSplitLine']; +var CartesianAxisView = /** @class */function (_super) { + __extends(CartesianAxisView, _super); + function CartesianAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = CartesianAxisView.type; + _this.axisPointerClass = 'CartesianAxisPointer'; + return _this; + } + /** + * @override + */ + CartesianAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + this.group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group$2(); + this.group.add(this._axisGroup); + if (!axisModel.get('show')) { + return; + } + var gridModel = axisModel.getCoordSysModel(); + var layout$1 = layout(gridModel, axisModel); + var axisBuilder = new AxisBuilder(axisModel, extend({ + handleAutoShown: function (elementType) { + var cartesians = gridModel.coordinateSystem.getCartesians(); + for (var i = 0; i < cartesians.length; i++) { + if (isIntervalOrLogScale(cartesians[i].getOtherAxis(axisModel.axis).scale)) { + // Still show axis tick or axisLine if other axis is value / log + return true; + } + } + // Not show axisTick or axisLine if other axis is category / time + return false; + } + }, layout$1)); + each$4(axisBuilderAttrs, axisBuilder.add, axisBuilder); + this._axisGroup.add(axisBuilder.getGroup()); + each$4(selfBuilderAttrs, function (name) { + if (axisModel.get([name, 'show'])) { + axisElementBuilders[name](this, this._axisGroup, axisModel, gridModel); + } + }, this); + // THIS is a special case for bar racing chart. + // Update the axis label from the natural initial layout to + // sorted layout should has no animation. + var isInitialSortFromBarRacing = payload && payload.type === 'changeAxisOrder' && payload.isInitSort; + if (!isInitialSortFromBarRacing) { + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + } + _super.prototype.render.call(this, axisModel, ecModel, api, payload); + }; + CartesianAxisView.prototype.remove = function () { + rectCoordAxisHandleRemove(this); + }; + CartesianAxisView.type = 'cartesianAxis'; + return CartesianAxisView; +}(AxisView); +var axisElementBuilders = { + splitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + if (axis.scale.isBlank()) { + return; + } + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var showMinLine = splitLineModel.get('showMinLine') !== false; + var showMaxLine = splitLineModel.get('showMaxLine') !== false; + lineColors = isArray(lineColors) ? lineColors : [lineColors]; + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var lineCount = 0; + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + if (i === 0 && !showMinLine || i === ticksCoords.length - 1 && !showMaxLine) { + continue; + } + var tickValue = ticksCoords[i].tickValue; + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + var colorIndex = lineCount++ % lineColors.length; + var line = new Line({ + anid: tickValue != null ? 'line_' + tickValue : null, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: defaults({ + stroke: lineColors[colorIndex] + }, lineStyle), + silent: true + }); + subPixelOptimizeLine(line.shape, lineStyle.lineWidth); + axisGroup.add(line); + } + }, + minorSplitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + var minorSplitLineModel = axisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var minorTicksCoords = axis.getMinorTicksCoords(); + if (!minorTicksCoords.length) { + return; + } + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + for (var i = 0; i < minorTicksCoords.length; i++) { + for (var k = 0; k < minorTicksCoords[i].length; k++) { + var tickCoord = axis.toGlobalCoord(minorTicksCoords[i][k].coord); + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + var line = new Line({ + anid: 'minor_line_' + minorTicksCoords[i][k].tickValue, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: lineStyle, + silent: true + }); + subPixelOptimizeLine(line.shape, lineStyle.lineWidth); + axisGroup.add(line); + } + } + }, + splitArea: function (axisView, axisGroup, axisModel, gridModel) { + rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel); + } +}; +var CartesianXAxisView = /** @class */function (_super) { + __extends(CartesianXAxisView, _super); + function CartesianXAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = CartesianXAxisView.type; + return _this; + } + CartesianXAxisView.type = 'xAxis'; + return CartesianXAxisView; +}(CartesianAxisView); +var CartesianYAxisView = /** @class */function (_super) { + __extends(CartesianYAxisView, _super); + function CartesianYAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = CartesianXAxisView.type; + return _this; + } + CartesianYAxisView.type = 'yAxis'; + return CartesianYAxisView; +}(CartesianAxisView); + +// Grid view +var GridView = /** @class */function (_super) { + __extends(GridView, _super); + function GridView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = 'grid'; + return _this; + } + GridView.prototype.render = function (gridModel, ecModel) { + this.group.removeAll(); + if (gridModel.get('show')) { + this.group.add(new Rect({ + shape: gridModel.coordinateSystem.getRect(), + style: defaults({ + fill: gridModel.get('backgroundColor') + }, gridModel.getItemStyle()), + silent: true, + z2: -1 + })); + } + }; + GridView.type = 'grid'; + return GridView; +}(ComponentView); +var extraOption = { + // gridIndex: 0, + // gridId: '', + offset: 0 +}; +function install$7(registers) { + registers.registerComponentView(GridView); + registers.registerComponentModel(GridModel); + registers.registerCoordinateSystem('cartesian2d', Grid); + axisModelCreator(registers, 'x', CartesianAxisModel, extraOption); + axisModelCreator(registers, 'y', CartesianAxisModel, extraOption); + registers.registerComponentView(CartesianXAxisView); + registers.registerComponentView(CartesianYAxisView); + registers.registerPreprocessor(function (option) { + // Only create grid when need + if (option.xAxis && option.yAxis && !option.grid) { + option.grid = {}; + } + }); +} + +var inner$2 = makeInner(); +var clone = clone$2; +var bind = bind$1; +/** + * Base axis pointer class in 2D. + */ +var BaseAxisPointer = /** @class */function () { + function BaseAxisPointer() { + this._dragging = false; + /** + * In px, arbitrary value. Do not set too small, + * no animation is ok for most cases. + */ + this.animationThreshold = 15; + } + /** + * @implement + */ + BaseAxisPointer.prototype.render = function (axisModel, axisPointerModel, api, forceRender) { + var value = axisPointerModel.get('value'); + var status = axisPointerModel.get('status'); + // Bind them to `this`, not in closure, otherwise they will not + // be replaced when user calling setOption in not merge mode. + this._axisModel = axisModel; + this._axisPointerModel = axisPointerModel; + this._api = api; + // Optimize: `render` will be called repeatedly during mouse move. + // So it is power consuming if performing `render` each time, + // especially on mobile device. + if (!forceRender && this._lastValue === value && this._lastStatus === status) { + return; + } + this._lastValue = value; + this._lastStatus = status; + var group = this._group; + var handle = this._handle; + if (!status || status === 'hide') { + // Do not clear here, for animation better. + group && group.hide(); + handle && handle.hide(); + return; + } + group && group.show(); + handle && handle.show(); + // Otherwise status is 'show' + var elOption = {}; + this.makeElOption(elOption, value, axisModel, axisPointerModel, api); + // Enable change axis pointer type. + var graphicKey = elOption.graphicKey; + if (graphicKey !== this._lastGraphicKey) { + this.clear(api); + } + this._lastGraphicKey = graphicKey; + var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel); + if (!group) { + group = this._group = new Group$2(); + this.createPointerEl(group, elOption, axisModel, axisPointerModel); + this.createLabelEl(group, elOption, axisModel, axisPointerModel); + api.getZr().add(group); + } else { + var doUpdateProps = curry$1(updateProps, axisPointerModel, moveAnimation); + this.updatePointerEl(group, elOption, doUpdateProps); + this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel); + } + updateMandatoryProps(group, axisPointerModel, true); + this._renderHandle(value); + }; + /** + * @implement + */ + BaseAxisPointer.prototype.remove = function (api) { + this.clear(api); + }; + /** + * @implement + */ + BaseAxisPointer.prototype.dispose = function (api) { + this.clear(api); + }; + /** + * @protected + */ + BaseAxisPointer.prototype.determineAnimation = function (axisModel, axisPointerModel) { + var animation = axisPointerModel.get('animation'); + var axis = axisModel.axis; + var isCategoryAxis = axis.type === 'category'; + var useSnap = axisPointerModel.get('snap'); + // Value axis without snap always do not snap. + if (!useSnap && !isCategoryAxis) { + return false; + } + if (animation === 'auto' || animation == null) { + var animationThreshold = this.animationThreshold; + if (isCategoryAxis && axis.getBandWidth() > animationThreshold) { + return true; + } + // It is important to auto animation when snap used. Consider if there is + // a dataZoom, animation will be disabled when too many points exist, while + // it will be enabled for better visual effect when little points exist. + if (useSnap) { + var seriesDataCount = getAxisInfo(axisModel).seriesDataCount; + var axisExtent = axis.getExtent(); + // Approximate band width + return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold; + } + return false; + } + return animation === true; + }; + /** + * add {pointer, label, graphicKey} to elOption + * @protected + */ + BaseAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + // Should be implemenented by sub-class. + }; + /** + * @protected + */ + BaseAxisPointer.prototype.createPointerEl = function (group, elOption, axisModel, axisPointerModel) { + var pointerOption = elOption.pointer; + if (pointerOption) { + var pointerEl = inner$2(group).pointerEl = new graphic[pointerOption.type](clone(elOption.pointer)); + group.add(pointerEl); + } + }; + /** + * @protected + */ + BaseAxisPointer.prototype.createLabelEl = function (group, elOption, axisModel, axisPointerModel) { + if (elOption.label) { + var labelEl = inner$2(group).labelEl = new ZRText(clone(elOption.label)); + group.add(labelEl); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @protected + */ + BaseAxisPointer.prototype.updatePointerEl = function (group, elOption, updateProps) { + var pointerEl = inner$2(group).pointerEl; + if (pointerEl && elOption.pointer) { + pointerEl.setStyle(elOption.pointer.style); + updateProps(pointerEl, { + shape: elOption.pointer.shape + }); + } + }; + /** + * @protected + */ + BaseAxisPointer.prototype.updateLabelEl = function (group, elOption, updateProps, axisPointerModel) { + var labelEl = inner$2(group).labelEl; + if (labelEl) { + labelEl.setStyle(elOption.label.style); + updateProps(labelEl, { + // Consider text length change in vertical axis, animation should + // be used on shape, otherwise the effect will be weird. + // TODOTODO + // shape: elOption.label.shape, + x: elOption.label.x, + y: elOption.label.y + }); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @private + */ + BaseAxisPointer.prototype._renderHandle = function (value) { + if (this._dragging || !this.updateHandleTransform) { + return; + } + var axisPointerModel = this._axisPointerModel; + var zr = this._api.getZr(); + var handle = this._handle; + var handleModel = axisPointerModel.getModel('handle'); + var status = axisPointerModel.get('status'); + if (!handleModel.get('show') || !status || status === 'hide') { + handle && zr.remove(handle); + this._handle = null; + return; + } + var isInit; + if (!this._handle) { + isInit = true; + handle = this._handle = createIcon(handleModel.get('icon'), { + cursor: 'move', + draggable: true, + onmousemove: function (e) { + // For mobile device, prevent screen slider on the button. + stop(e.event); + }, + onmousedown: bind(this._onHandleDragMove, this, 0, 0), + drift: bind(this._onHandleDragMove, this), + ondragend: bind(this._onHandleDragEnd, this) + }); + zr.add(handle); + } + updateMandatoryProps(handle, axisPointerModel, false); + // update style + handle.setStyle(handleModel.getItemStyle(null, ['color', 'borderColor', 'borderWidth', 'opacity', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'])); + // update position + var handleSize = handleModel.get('size'); + if (!isArray(handleSize)) { + handleSize = [handleSize, handleSize]; + } + handle.scaleX = handleSize[0] / 2; + handle.scaleY = handleSize[1] / 2; + createOrUpdate(this, '_doDispatchAxisPointer', handleModel.get('throttle') || 0, 'fixRate'); + this._moveHandleToValue(value, isInit); + }; + BaseAxisPointer.prototype._moveHandleToValue = function (value, isInit) { + updateProps(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel))); + }; + BaseAxisPointer.prototype._onHandleDragMove = function (dx, dy) { + var handle = this._handle; + if (!handle) { + return; + } + this._dragging = true; + // Persistent for throttle. + var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel); + this._payloadInfo = trans; + handle.stopAnimation(); + handle.attr(getHandleTransProps(trans)); + inner$2(handle).lastProp = null; + this._doDispatchAxisPointer(); + }; + /** + * Throttled method. + */ + BaseAxisPointer.prototype._doDispatchAxisPointer = function () { + var handle = this._handle; + if (!handle) { + return; + } + var payloadInfo = this._payloadInfo; + var axisModel = this._axisModel; + this._api.dispatchAction({ + type: 'updateAxisPointer', + x: payloadInfo.cursorPoint[0], + y: payloadInfo.cursorPoint[1], + tooltipOption: payloadInfo.tooltipOption, + axesInfo: [{ + axisDim: axisModel.axis.dim, + axisIndex: axisModel.componentIndex + }] + }); + }; + BaseAxisPointer.prototype._onHandleDragEnd = function () { + this._dragging = false; + var handle = this._handle; + if (!handle) { + return; + } + var value = this._axisPointerModel.get('value'); + // Consider snap or categroy axis, handle may be not consistent with + // axisPointer. So move handle to align the exact value position when + // drag ended. + this._moveHandleToValue(value); + // For the effect: tooltip will be shown when finger holding on handle + // button, and will be hidden after finger left handle button. + this._api.dispatchAction({ + type: 'hideTip' + }); + }; + /** + * @private + */ + BaseAxisPointer.prototype.clear = function (api) { + this._lastValue = null; + this._lastStatus = null; + var zr = api.getZr(); + var group = this._group; + var handle = this._handle; + if (zr && group) { + this._lastGraphicKey = null; + group && zr.remove(group); + handle && zr.remove(handle); + this._group = null; + this._handle = null; + this._payloadInfo = null; + } + clear(this, '_doDispatchAxisPointer'); + }; + /** + * @protected + */ + BaseAxisPointer.prototype.doClear = function () { + // Implemented by sub-class if necessary. + }; + BaseAxisPointer.prototype.buildLabel = function (xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + }; + return BaseAxisPointer; +}(); +function updateProps(animationModel, moveAnimation, el, props) { + // Animation optimize. + if (!propsEqual(inner$2(el).lastProp, props)) { + inner$2(el).lastProp = props; + moveAnimation ? updateProps$1(el, props, animationModel) : (el.stopAnimation(), el.attr(props)); + } +} +function propsEqual(lastProps, newProps) { + if (isObject$2(lastProps) && isObject$2(newProps)) { + var equals_1 = true; + each$4(newProps, function (item, key) { + equals_1 = equals_1 && propsEqual(lastProps[key], item); + }); + return !!equals_1; + } else { + return lastProps === newProps; + } +} +function updateLabelShowHide(labelEl, axisPointerModel) { + labelEl[axisPointerModel.get(['label', 'show']) ? 'show' : 'hide'](); +} +function getHandleTransProps(trans) { + return { + x: trans.x || 0, + y: trans.y || 0, + rotation: trans.rotation || 0 + }; +} +function updateMandatoryProps(group, axisPointerModel, silent) { + var z = axisPointerModel.get('z'); + var zlevel = axisPointerModel.get('zlevel'); + group && group.traverse(function (el) { + if (el.type !== 'group') { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + el.silent = silent; + } + }); +} + +function buildElStyle(axisPointerModel) { + var axisPointerType = axisPointerModel.get('type'); + var styleModel = axisPointerModel.getModel(axisPointerType + 'Style'); + var style; + if (axisPointerType === 'line') { + style = styleModel.getLineStyle(); + style.fill = null; + } else if (axisPointerType === 'shadow') { + style = styleModel.getAreaStyle(); + style.stroke = null; + } + return style; +} +/** + * @param {Function} labelPos {align, verticalAlign, position} + */ +function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) { + var value = axisPointerModel.get('value'); + var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get('seriesDataIndices'), { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }); + var labelModel = axisPointerModel.getModel('label'); + var paddings = normalizeCssArray(labelModel.get('padding') || 0); + var font = labelModel.getFont(); + var textRect = getBoundingRect(text, font); + var position = labelPos.position; + var width = textRect.width + paddings[1] + paddings[3]; + var height = textRect.height + paddings[0] + paddings[2]; + // Adjust by align. + var align = labelPos.align; + align === 'right' && (position[0] -= width); + align === 'center' && (position[0] -= width / 2); + var verticalAlign = labelPos.verticalAlign; + verticalAlign === 'bottom' && (position[1] -= height); + verticalAlign === 'middle' && (position[1] -= height / 2); + // Not overflow ec container + confineInContainer(position, width, height, api); + var bgColor = labelModel.get('backgroundColor'); + if (!bgColor || bgColor === 'auto') { + bgColor = axisModel.get(['axisLine', 'lineStyle', 'color']); + } + elOption.label = { + // shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')}, + x: position[0], + y: position[1], + style: createTextStyle(labelModel, { + text: text, + font: font, + fill: labelModel.getTextColor(), + padding: paddings, + backgroundColor: bgColor + }), + // Label should be over axisPointer. + z2: 10 + }; +} +// Do not overflow ec container +function confineInContainer(position, width, height, api) { + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + position[0] = Math.min(position[0] + width, viewWidth) - width; + position[1] = Math.min(position[1] + height, viewHeight) - height; + position[0] = Math.max(position[0], 0); + position[1] = Math.max(position[1], 0); +} +function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) { + value = axis.scale.parse(value); + var text = axis.scale.getLabel({ + value: value + }, { + // If `precision` is set, width can be fixed (like '12.00500'), which + // helps to debounce when when moving label. + precision: opt.precision + }); + var formatter = opt.formatter; + if (formatter) { + var params_1 = { + value: getAxisRawValue(axis, { + value: value + }), + axisDimension: axis.dim, + axisIndex: axis.index, + seriesData: [] + }; + each$4(seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var dataParams = series && series.getDataParams(dataIndex); + dataParams && params_1.seriesData.push(dataParams); + }); + if (isString(formatter)) { + text = formatter.replace('{value}', text); + } else if (isFunction(formatter)) { + text = formatter(params_1); + } + } + return text; +} +function getTransformedPosition(axis, value, layoutInfo) { + var transform = create(); + rotate(transform, transform, layoutInfo.rotation); + translate(transform, transform, layoutInfo.position); + return applyTransform([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform); +} +function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) { + // @ts-ignore + var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection); + layoutInfo.labelMargin = axisPointerModel.get(['label', 'margin']); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, { + position: getTransformedPosition(axisModel.axis, value, layoutInfo), + align: textLayout.textAlign, + verticalAlign: textLayout.textVerticalAlign + }); +} +function makeLineShape(p1, p2, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x1: p1[xDimIndex], + y1: p1[1 - xDimIndex], + x2: p2[xDimIndex], + y2: p2[1 - xDimIndex] + }; +} +function makeRectShape(xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; +} + +var CartesianAxisPointer = /** @class */function (_super) { + __extends(CartesianAxisPointer, _super); + function CartesianAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @override + */ + CartesianAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisPointerType = axisPointerModel.get('type'); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true)); + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + var layoutInfo = layout(grid.model, axisModel); + buildCartesianSingleLabelElOption( + // @ts-ignore + value, elOption, layoutInfo, axisModel, axisPointerModel, api); + }; + /** + * @override + */ + CartesianAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) { + var layoutInfo = layout(axisModel.axis.grid.model, axisModel, { + labelInside: false + }); + // @ts-ignore + layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']); + var pos = getTransformedPosition(axisModel.axis, value, layoutInfo); + return { + x: pos[0], + y: pos[1], + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }; + /** + * @override + */ + CartesianAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisExtent = axis.getGlobalExtent(true); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var dimIndex = axis.dim === 'x' ? 0 : 1; + var currPosition = [transform.x, transform.y]; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; + // Make tooltip do not overlap axisPointer and in the middle of the grid. + var tooltipOptions = [{ + verticalAlign: 'middle' + }, { + align: 'center' + }]; + return { + x: currPosition[0], + y: currPosition[1], + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: tooltipOptions[dimIndex] + }; + }; + return CartesianAxisPointer; +}(BaseAxisPointer); +function getCartesian(grid, axis) { + var opt = {}; + opt[axis.dim + 'AxisIndex'] = axis.index; + return grid.getCartesian(opt); +} +var pointerShapeBuilder = { + line: function (axis, pixelValue, otherExtent) { + var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getAxisDimIndex(axis)); + return { + type: 'Line', + subPixelOptimize: true, + shape: targetShape + }; + }, + shadow: function (axis, pixelValue, otherExtent) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getAxisDimIndex(axis)) + }; + } +}; +function getAxisDimIndex(axis) { + return axis.dim === 'x' ? 0 : 1; +} + +var AxisPointerModel = /** @class */function (_super) { + __extends(AxisPointerModel, _super); + function AxisPointerModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = AxisPointerModel.type; + return _this; + } + AxisPointerModel.type = 'axisPointer'; + AxisPointerModel.defaultOption = { + // 'auto' means that show when triggered by tooltip or handle. + show: 'auto', + // zlevel: 0, + z: 50, + type: 'line', + // axispointer triggered by tootip determine snap automatically, + // see `modelHelper`. + snap: false, + triggerTooltip: true, + triggerEmphasis: true, + value: null, + status: null, + link: [], + // Do not set 'auto' here, otherwise global animation: false + // will not effect at this axispointer. + animation: null, + animationDurationUpdate: 200, + lineStyle: { + color: '#B9BEC9', + width: 1, + type: 'dashed' + }, + shadowStyle: { + color: 'rgba(210,219,238,0.2)' + }, + label: { + show: true, + formatter: null, + precision: 'auto', + margin: 3, + color: '#fff', + padding: [5, 7, 5, 7], + backgroundColor: 'auto', + borderColor: null, + borderWidth: 0, + borderRadius: 3 + }, + handle: { + show: false, + // eslint-disable-next-line + icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', + size: 45, + // handle margin is from symbol center to axis, which is stable when circular move. + margin: 50, + // color: '#1b8bbd' + // color: '#2f4554' + color: '#333', + shadowBlur: 3, + shadowColor: '#aaa', + shadowOffsetX: 0, + shadowOffsetY: 2, + // For mobile performance + throttle: 40 + } + }; + return AxisPointerModel; +}(ComponentModel); + +var inner$1 = makeInner(); +var each$1 = each$4; +/** + * @param {string} key + * @param {module:echarts/ExtensionAPI} api + * @param {Function} handler + * param: {string} currTrigger + * param: {Array.} point + */ +function register(key, api, handler) { + if (env.node) { + return; + } + var zr = api.getZr(); + inner$1(zr).records || (inner$1(zr).records = {}); + initGlobalListeners(zr, api); + var record = inner$1(zr).records[key] || (inner$1(zr).records[key] = {}); + record.handler = handler; +} +function initGlobalListeners(zr, api) { + if (inner$1(zr).initialized) { + return; + } + inner$1(zr).initialized = true; + useHandler('click', curry$1(doEnter, 'click')); + useHandler('mousemove', curry$1(doEnter, 'mousemove')); + // useHandler('mouseout', onLeave); + useHandler('globalout', onLeave); + function useHandler(eventType, cb) { + zr.on(eventType, function (e) { + var dis = makeDispatchAction$1(api); + each$1(inner$1(zr).records, function (record) { + record && cb(record, e, dis.dispatchAction); + }); + dispatchTooltipFinally(dis.pendings, api); + }); + } +} +function dispatchTooltipFinally(pendings, api) { + var showLen = pendings.showTip.length; + var hideLen = pendings.hideTip.length; + var actuallyPayload; + if (showLen) { + actuallyPayload = pendings.showTip[showLen - 1]; + } else if (hideLen) { + actuallyPayload = pendings.hideTip[hideLen - 1]; + } + if (actuallyPayload) { + actuallyPayload.dispatchAction = null; + api.dispatchAction(actuallyPayload); + } +} +function onLeave(record, e, dispatchAction) { + record.handler('leave', null, dispatchAction); +} +function doEnter(currTrigger, record, e, dispatchAction) { + record.handler(currTrigger, e, dispatchAction); +} +function makeDispatchAction$1(api) { + var pendings = { + showTip: [], + hideTip: [] + }; + // FIXME + // better approach? + // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip, + // which may be conflict, (axisPointer call showTip but tooltip call hideTip); + // So we have to add "final stage" to merge those dispatched actions. + var dispatchAction = function (payload) { + var pendingList = pendings[payload.type]; + if (pendingList) { + pendingList.push(payload); + } else { + payload.dispatchAction = dispatchAction; + api.dispatchAction(payload); + } + }; + return { + dispatchAction: dispatchAction, + pendings: pendings + }; +} +function unregister(key, api) { + if (env.node) { + return; + } + var zr = api.getZr(); + var record = (inner$1(zr).records || {})[key]; + if (record) { + inner$1(zr).records[key] = null; + } +} + +var AxisPointerView = /** @class */function (_super) { + __extends(AxisPointerView, _super); + function AxisPointerView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = AxisPointerView.type; + return _this; + } + AxisPointerView.prototype.render = function (globalAxisPointerModel, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var triggerOn = globalAxisPointerModel.get('triggerOn') || globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click'; + // Register global listener in AxisPointerView to enable + // AxisPointerView to be independent to Tooltip. + register('axisPointer', api, function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none' && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)) { + dispatchAction({ + type: 'updateAxisPointer', + currTrigger: currTrigger, + x: e && e.offsetX, + y: e && e.offsetY + }); + } + }); + }; + AxisPointerView.prototype.remove = function (ecModel, api) { + unregister('axisPointer', api); + }; + AxisPointerView.prototype.dispose = function (ecModel, api) { + unregister('axisPointer', api); + }; + AxisPointerView.type = 'axisPointer'; + return AxisPointerView; +}(ComponentView); + +/** + * @param finder contains {seriesIndex, dataIndex, dataIndexInside} + * @param ecModel + * @return {point: [x, y], el: ...} point Will not be null. + */ +function findPointFromSeries(finder, ecModel) { + var point = []; + var seriesIndex = finder.seriesIndex; + var seriesModel; + if (seriesIndex == null || !(seriesModel = ecModel.getSeriesByIndex(seriesIndex))) { + return { + point: [] + }; + } + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, finder); + if (dataIndex == null || dataIndex < 0 || isArray(dataIndex)) { + return { + point: [] + }; + } + var el = data.getItemGraphicEl(dataIndex); + var coordSys = seriesModel.coordinateSystem; + if (seriesModel.getTooltipPosition) { + point = seriesModel.getTooltipPosition(dataIndex) || []; + } else if (coordSys && coordSys.dataToPoint) { + if (finder.isStacked) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueAxisDim = valueAxis.dim; + var baseAxisDim = baseAxis.dim; + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var baseDim = data.mapDimension(baseAxisDim); + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseDim, dataIndex); + stackedData[1 - baseDataOffset] = data.get(data.getCalculationInfo('stackResultDimension'), dataIndex); + point = coordSys.dataToPoint(stackedData) || []; + } else { + point = coordSys.dataToPoint(data.getValues(map$1(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }), dataIndex)) || []; + } + } else if (el) { + // Use graphic bounding rect + var rect = el.getBoundingRect().clone(); + rect.applyTransform(el.transform); + point = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + } + return { + point: point, + el: el + }; +} + +var inner = makeInner(); +/** + * Basic logic: check all axis, if they do not demand show/highlight, + * then hide/downplay them. + * + * @return content of event obj for echarts.connect. + */ +function axisTrigger(payload, ecModel, api) { + var currTrigger = payload.currTrigger; + var point = [payload.x, payload.y]; + var finder = payload; + var dispatchAction = payload.dispatchAction || bind$1(api.dispatchAction, api); + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; + // Pending + // See #6121. But we are not able to reproduce it yet. + if (!coordSysAxesInfo) { + return; + } + if (illegalPoint(point)) { + // Used in the default behavior of `connection`: use the sample seriesIndex + // and dataIndex. And also used in the tooltipView trigger. + point = findPointFromSeries({ + seriesIndex: finder.seriesIndex, + // Do not use dataIndexInside from other ec instance. + // FIXME: auto detect it? + dataIndex: finder.dataIndex + }, ecModel).point; + } + var isIllegalPoint = illegalPoint(point); + // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}). + // Notice: In this case, it is difficult to get the `point` (which is necessary to show + // tooltip, so if point is not given, we just use the point found by sample seriesIndex + // and dataIndex. + var inputAxesInfo = finder.axesInfo; + var axesInfo = coordSysAxesInfo.axesInfo; + var shouldHide = currTrigger === 'leave' || illegalPoint(point); + var outputPayload = {}; + var showValueMap = {}; + var dataByCoordSys = { + list: [], + map: {} + }; + var updaters = { + showPointer: curry$1(showPointer, showValueMap), + showTooltip: curry$1(showTooltip, dataByCoordSys) + }; + // Process for triggered axes. + each$4(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) { + // If a point given, it must be contained by the coordinate system. + var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point); + each$4(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) { + var axis = axisInfo.axis; + var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo); + // If no inputAxesInfo, no axis is restricted. + if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) { + var val = inputAxisInfo && inputAxisInfo.value; + if (val == null && !isIllegalPoint) { + val = axis.pointToData(point); + } + val != null && processOnAxis(axisInfo, val, updaters, false, outputPayload); + } + }); + }); + // Process for linked axes. + var linkTriggers = {}; + each$4(axesInfo, function (tarAxisInfo, tarKey) { + var linkGroup = tarAxisInfo.linkGroup; + // If axis has been triggered in the previous stage, it should not be triggered by link. + if (linkGroup && !showValueMap[tarKey]) { + each$4(linkGroup.axesInfo, function (srcAxisInfo, srcKey) { + var srcValItem = showValueMap[srcKey]; + // If srcValItem exist, source axis is triggered, so link to target axis. + if (srcAxisInfo !== tarAxisInfo && srcValItem) { + var val = srcValItem.value; + linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo)))); + linkTriggers[tarAxisInfo.key] = val; + } + }); + } + }); + each$4(linkTriggers, function (val, tarKey) { + processOnAxis(axesInfo[tarKey], val, updaters, true, outputPayload); + }); + updateModelActually(showValueMap, axesInfo, outputPayload); + dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction); + dispatchHighDownActually(axesInfo, dispatchAction, api); + return outputPayload; +} +function processOnAxis(axisInfo, newValue, updaters, noSnap, outputFinder) { + var axis = axisInfo.axis; + if (axis.scale.isBlank() || !axis.containData(newValue)) { + return; + } + if (!axisInfo.involveSeries) { + updaters.showPointer(axisInfo, newValue); + return; + } + // Heavy calculation. So put it after axis.containData checking. + var payloadInfo = buildPayloadsBySeries(newValue, axisInfo); + var payloadBatch = payloadInfo.payloadBatch; + var snapToValue = payloadInfo.snapToValue; + // Fill content of event obj for echarts.connect. + // By default use the first involved series data as a sample to connect. + if (payloadBatch[0] && outputFinder.seriesIndex == null) { + extend(outputFinder, payloadBatch[0]); + } + // If no linkSource input, this process is for collecting link + // target, where snap should not be accepted. + if (!noSnap && axisInfo.snap) { + if (axis.containData(snapToValue) && snapToValue != null) { + newValue = snapToValue; + } + } + updaters.showPointer(axisInfo, newValue, payloadBatch); + // Tooltip should always be snapToValue, otherwise there will be + // incorrect "axis value ~ series value" mapping displayed in tooltip. + updaters.showTooltip(axisInfo, payloadInfo, snapToValue); +} +function buildPayloadsBySeries(value, axisInfo) { + var axis = axisInfo.axis; + var dim = axis.dim; + var snapToValue = value; + var payloadBatch = []; + var minDist = Number.MAX_VALUE; + var minDiff = -1; + each$4(axisInfo.seriesModels, function (series, idx) { + var dataDim = series.getData().mapDimensionsAll(dim); + var seriesNestestValue; + var dataIndices; + if (series.getAxisTooltipData) { + var result = series.getAxisTooltipData(dataDim, value, axis); + dataIndices = result.dataIndices; + seriesNestestValue = result.nestestValue; + } else { + dataIndices = series.getData().indicesOfNearest(dataDim[0], value, + // Add a threshold to avoid find the wrong dataIndex + // when data length is not same. + // false, + axis.type === 'category' ? 0.5 : null); + if (!dataIndices.length) { + return; + } + seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]); + } + if (seriesNestestValue == null || !isFinite(seriesNestestValue)) { + return; + } + var diff = value - seriesNestestValue; + var dist = Math.abs(diff); + // Consider category case + if (dist <= minDist) { + if (dist < minDist || diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + snapToValue = seriesNestestValue; + payloadBatch.length = 0; + } + each$4(dataIndices, function (dataIndex) { + payloadBatch.push({ + seriesIndex: series.seriesIndex, + dataIndexInside: dataIndex, + dataIndex: series.getData().getRawIndex(dataIndex) + }); + }); + } + }); + return { + payloadBatch: payloadBatch, + snapToValue: snapToValue + }; +} +function showPointer(showValueMap, axisInfo, value, payloadBatch) { + showValueMap[axisInfo.key] = { + value: value, + payloadBatch: payloadBatch + }; +} +function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) { + var payloadBatch = payloadInfo.payloadBatch; + var axis = axisInfo.axis; + var axisModel = axis.model; + var axisPointerModel = axisInfo.axisPointerModel; + // If no data, do not create anything in dataByCoordSys, + // whose length will be used to judge whether dispatch action. + if (!axisInfo.triggerTooltip || !payloadBatch.length) { + return; + } + var coordSysModel = axisInfo.coordSys.model; + var coordSysKey = makeKey(coordSysModel); + var coordSysItem = dataByCoordSys.map[coordSysKey]; + if (!coordSysItem) { + coordSysItem = dataByCoordSys.map[coordSysKey] = { + coordSysId: coordSysModel.id, + coordSysIndex: coordSysModel.componentIndex, + coordSysType: coordSysModel.type, + coordSysMainType: coordSysModel.mainType, + dataByAxis: [] + }; + dataByCoordSys.list.push(coordSysItem); + } + coordSysItem.dataByAxis.push({ + axisDim: axis.dim, + axisIndex: axisModel.componentIndex, + axisType: axisModel.type, + axisId: axisModel.id, + value: value, + // Caustion: viewHelper.getValueLabel is actually on "view stage", which + // depends that all models have been updated. So it should not be performed + // here. Considering axisPointerModel used here is volatile, which is hard + // to be retrieve in TooltipView, we prepare parameters here. + valueLabelOpt: { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }, + seriesDataIndices: payloadBatch.slice() + }); +} +function updateModelActually(showValueMap, axesInfo, outputPayload) { + var outputAxesInfo = outputPayload.axesInfo = []; + // Basic logic: If no 'show' required, 'hide' this axisPointer. + each$4(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + var valItem = showValueMap[key]; + if (valItem) { + !axisInfo.useHandle && (option.status = 'show'); + option.value = valItem.value; + // For label formatter param and highlight. + option.seriesDataIndices = (valItem.payloadBatch || []).slice(); + } + // When always show (e.g., handle used), remain + // original value and status. + else { + // If hide, value still need to be set, consider + // click legend to toggle axis blank. + !axisInfo.useHandle && (option.status = 'hide'); + } + // If status is 'hide', should be no info in payload. + option.status === 'show' && outputAxesInfo.push({ + axisDim: axisInfo.axis.dim, + axisIndex: axisInfo.axis.model.componentIndex, + value: option.value + }); + }); +} +function dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction) { + // Basic logic: If no showTip required, hideTip will be dispatched. + if (illegalPoint(point) || !dataByCoordSys.list.length) { + dispatchAction({ + type: 'hideTip' + }); + return; + } + // In most case only one axis (or event one series is used). It is + // convenient to fetch payload.seriesIndex and payload.dataIndex + // directly. So put the first seriesIndex and dataIndex of the first + // axis on the payload. + var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {}; + dispatchAction({ + type: 'showTip', + escapeConnect: true, + x: point[0], + y: point[1], + tooltipOption: payload.tooltipOption, + position: payload.position, + dataIndexInside: sampleItem.dataIndexInside, + dataIndex: sampleItem.dataIndex, + seriesIndex: sampleItem.seriesIndex, + dataByCoordSys: dataByCoordSys.list + }); +} +function dispatchHighDownActually(axesInfo, dispatchAction, api) { + // FIXME + // highlight status modification should be a stage of main process? + // (Consider confilct (e.g., legend and axisPointer) and setOption) + var zr = api.getZr(); + var highDownKey = 'axisPointerLastHighlights'; + var lastHighlights = inner(zr)[highDownKey] || {}; + var newHighlights = inner(zr)[highDownKey] = {}; + // Update highlight/downplay status according to axisPointer model. + // Build hash map and remove duplicate incidentally. + each$4(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + option.status === 'show' && axisInfo.triggerEmphasis && each$4(option.seriesDataIndices, function (batchItem) { + var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex; + newHighlights[key] = batchItem; + }); + }); + // Diff. + var toHighlight = []; + var toDownplay = []; + each$4(lastHighlights, function (batchItem, key) { + !newHighlights[key] && toDownplay.push(batchItem); + }); + each$4(newHighlights, function (batchItem, key) { + !lastHighlights[key] && toHighlight.push(batchItem); + }); + toDownplay.length && api.dispatchAction({ + type: 'downplay', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toDownplay + }); + toHighlight.length && api.dispatchAction({ + type: 'highlight', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toHighlight + }); +} +function findInputAxisInfo(inputAxesInfo, axisInfo) { + for (var i = 0; i < (inputAxesInfo || []).length; i++) { + var inputAxisInfo = inputAxesInfo[i]; + if (axisInfo.axis.dim === inputAxisInfo.axisDim && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex) { + return inputAxisInfo; + } + } +} +function makeMapperParam(axisInfo) { + var axisModel = axisInfo.axis.model; + var item = {}; + var dim = item.axisDim = axisInfo.axis.dim; + item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex; + item.axisName = item[dim + 'AxisName'] = axisModel.name; + item.axisId = item[dim + 'AxisId'] = axisModel.id; + return item; +} +function illegalPoint(point) { + return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]); +} + +function install$6(registers) { + // CartesianAxisPointer is not supposed to be required here. But consider + // echarts.simple.js and online build tooltip, which only require gridSimple, + // CartesianAxisPointer should be able to required somewhere. + AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer); + registers.registerComponentModel(AxisPointerModel); + registers.registerComponentView(AxisPointerView); + registers.registerPreprocessor(function (option) { + // Always has a global axisPointerModel for default setting. + if (option) { + (!option.axisPointer || option.axisPointer.length === 0) && (option.axisPointer = {}); + var link = option.axisPointer.link; + // Normalize to array to avoid object mergin. But if link + // is not set, remain null/undefined, otherwise it will + // override existent link setting. + if (link && !isArray(link)) { + option.axisPointer.link = [link]; + } + } + }); + // This process should proformed after coordinate systems created + // and series data processed. So put it on statistic processing stage. + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) { + // Build axisPointerModel, mergin tooltip.axisPointer model for each axis. + // allAxesInfo should be updated when setOption performed. + ecModel.getComponent('axisPointer').coordSysAxesInfo = collect(ecModel, api); + }); + // Broadcast to all views. + registers.registerAction({ + type: 'updateAxisPointer', + event: 'updateAxisPointer', + update: ':updateAxisPointer' + }, axisTrigger); +} + +function install$5(registers) { + use(install$7); + use(install$6); +} + +function makeBackground(rect, componentModel) { + var padding = normalizeCssArray(componentModel.get('padding')); + var style = componentModel.getItemStyle(['color', 'opacity']); + style.fill = componentModel.get('backgroundColor'); + rect = new Rect({ + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[1] + padding[3], + height: rect.height + padding[0] + padding[2], + r: componentModel.get('borderRadius') + }, + style: style, + silent: true, + z2: -1 + }); + // FIXME + // `subPixelOptimizeRect` may bring some gap between edge of viewpart + // and background rect when setting like `left: 0`, `top: 0`. + // graphic.subPixelOptimizeRect(rect); + return rect; +} + +var TooltipModel = /** @class */function (_super) { + __extends(TooltipModel, _super); + function TooltipModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = TooltipModel.type; + return _this; + } + TooltipModel.type = 'tooltip'; + TooltipModel.dependencies = ['axisPointer']; + TooltipModel.defaultOption = { + // zlevel: 0, + z: 60, + show: true, + // tooltip main content + showContent: true, + // 'trigger' only works on coordinate system. + // 'item' | 'axis' | 'none' + trigger: 'item', + // 'click' | 'mousemove' | 'none' + triggerOn: 'mousemove|click', + alwaysShowContent: false, + displayMode: 'single', + renderMode: 'auto', + // whether restraint content inside viewRect. + // If renderMode: 'richText', default true. + // If renderMode: 'html', defaut false (for backward compat). + confine: null, + showDelay: 0, + hideDelay: 100, + // Animation transition time, unit is second + transitionDuration: 0.4, + enterable: false, + backgroundColor: '#fff', + // box shadow + shadowBlur: 10, + shadowColor: 'rgba(0, 0, 0, .2)', + shadowOffsetX: 1, + shadowOffsetY: 2, + // tooltip border radius, unit is px, default is 4 + borderRadius: 4, + // tooltip border width, unit is px, default is 0 (no border) + borderWidth: 1, + // Tooltip inside padding, default is 5 for all direction + // Array is allowed to set up, right, bottom, left, same with css + // The default value: See `tooltip/tooltipMarkup.ts#getPaddingFromTooltipModel`. + padding: null, + // Extra css text + extraCssText: '', + // axis indicator, trigger by axis + axisPointer: { + // default is line + // legal values: 'line' | 'shadow' | 'cross' + type: 'line', + // Valid when type is line, appoint tooltip line locate on which line. Optional + // legal values: 'x' | 'y' | 'angle' | 'radius' | 'auto' + // default is 'auto', chose the axis which type is category. + // for multiply y axis, cartesian coord chose x axis, polar chose angle axis + axis: 'auto', + animation: 'auto', + animationDurationUpdate: 200, + animationEasingUpdate: 'exponentialOut', + crossStyle: { + color: '#999', + width: 1, + type: 'dashed', + // TODO formatter + textStyle: {} + } + // lineStyle and shadowStyle should not be specified here, + // otherwise it will always override those styles on option.axisPointer. + }, + textStyle: { + color: '#666', + fontSize: 14 + } + }; + return TooltipModel; +}(ComponentModel); + +/* global document */ +function shouldTooltipConfine(tooltipModel) { + var confineOption = tooltipModel.get('confine'); + return confineOption != null ? !!confineOption + // In richText mode, the outside part can not be visible. + : tooltipModel.get('renderMode') === 'richText'; +} +function testStyle(styleProps) { + if (!env.domSupported) { + return; + } + var style = document.documentElement.style; + for (var i = 0, len = styleProps.length; i < len; i++) { + if (styleProps[i] in style) { + return styleProps[i]; + } + } +} +var TRANSFORM_VENDOR = testStyle(['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']); +var TRANSITION_VENDOR = testStyle(['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); +function toCSSVendorPrefix(styleVendor, styleProp) { + if (!styleVendor) { + return styleProp; + } + styleProp = toCamelCase(styleProp, true); + var idx = styleVendor.indexOf(styleProp); + styleVendor = idx === -1 ? styleProp : "-" + styleVendor.slice(0, idx) + "-" + styleProp; + return styleVendor.toLowerCase(); +} +function getComputedStyle(el, style) { + var stl = el.currentStyle || document.defaultView && document.defaultView.getComputedStyle(el); + return stl ? stl[style] : null; +} + +/* global document, window */ +var CSS_TRANSITION_VENDOR = toCSSVendorPrefix(TRANSITION_VENDOR, 'transition'); +var CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, 'transform'); +// eslint-disable-next-line +var gCssText = "position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;" + (env.transform3dSupported ? 'will-change:transform;' : ''); +function mirrorPos(pos) { + pos = pos === 'left' ? 'right' : pos === 'right' ? 'left' : pos === 'top' ? 'bottom' : 'top'; + return pos; +} +function assembleArrow(tooltipModel, borderColor, arrowPosition) { + if (!isString(arrowPosition) || arrowPosition === 'inside') { + return ''; + } + var backgroundColor = tooltipModel.get('backgroundColor'); + var borderWidth = tooltipModel.get('borderWidth'); + borderColor = convertToColorString(borderColor); + var arrowPos = mirrorPos(arrowPosition); + var arrowSize = Math.max(Math.round(borderWidth) * 1.5, 6); + var positionStyle = ''; + var transformStyle = CSS_TRANSFORM_VENDOR + ':'; + var rotateDeg; + if (indexOf(['left', 'right'], arrowPos) > -1) { + positionStyle += 'top:50%'; + transformStyle += "translateY(-50%) rotate(" + (rotateDeg = arrowPos === 'left' ? -225 : -45) + "deg)"; + } else { + positionStyle += 'left:50%'; + transformStyle += "translateX(-50%) rotate(" + (rotateDeg = arrowPos === 'top' ? 225 : 45) + "deg)"; + } + var rotateRadian = rotateDeg * Math.PI / 180; + var arrowWH = arrowSize + borderWidth; + var rotatedWH = arrowWH * Math.abs(Math.cos(rotateRadian)) + arrowWH * Math.abs(Math.sin(rotateRadian)); + var arrowOffset = Math.round(((rotatedWH - Math.SQRT2 * borderWidth) / 2 + Math.SQRT2 * borderWidth - (rotatedWH - arrowWH) / 2) * 100) / 100; + positionStyle += ";" + arrowPos + ":-" + arrowOffset + "px"; + var borderStyle = borderColor + " solid " + borderWidth + "px;"; + var styleCss = ["position:absolute;width:" + arrowSize + "px;height:" + arrowSize + "px;z-index:-1;", positionStyle + ";" + transformStyle + ";", "border-bottom:" + borderStyle, "border-right:" + borderStyle, "background-color:" + backgroundColor + ";"]; + return "
"; +} +function assembleTransition(duration, onlyFade) { + var transitionCurve = 'cubic-bezier(0.23,1,0.32,1)'; + var transitionOption = " " + duration / 2 + "s " + transitionCurve; + var transitionText = "opacity" + transitionOption + ",visibility" + transitionOption; + if (!onlyFade) { + transitionOption = " " + duration + "s " + transitionCurve; + transitionText += env.transformSupported ? "," + CSS_TRANSFORM_VENDOR + transitionOption : ",left" + transitionOption + ",top" + transitionOption; + } + return CSS_TRANSITION_VENDOR + ':' + transitionText; +} +function assembleTransform(x, y, toString) { + // If using float on style, the final width of the dom might + // keep changing slightly while mouse move. So `toFixed(0)` them. + var x0 = x.toFixed(0) + 'px'; + var y0 = y.toFixed(0) + 'px'; + // not support transform, use `left` and `top` instead. + if (!env.transformSupported) { + return toString ? "top:" + y0 + ";left:" + x0 + ";" : [['top', y0], ['left', x0]]; + } + // support transform + var is3d = env.transform3dSupported; + var translate = "translate" + (is3d ? '3d' : '') + "(" + x0 + "," + y0 + (is3d ? ',0' : '') + ")"; + return toString ? 'top:0;left:0;' + CSS_TRANSFORM_VENDOR + ':' + translate + ';' : [['top', 0], ['left', 0], [TRANSFORM_VENDOR, translate]]; +} +/** + * @param {Object} textStyle + * @return {string} + * @inner + */ +function assembleFont(textStyleModel) { + var cssText = []; + var fontSize = textStyleModel.get('fontSize'); + var color = textStyleModel.getTextColor(); + color && cssText.push('color:' + color); + cssText.push('font:' + textStyleModel.getFont()); + // @ts-ignore, leave it to the tooltip refactor. + var lineHeight = retrieve2(textStyleModel.get('lineHeight'), Math.round(fontSize * 3 / 2)); + fontSize && cssText.push('line-height:' + lineHeight + 'px'); + var shadowColor = textStyleModel.get('textShadowColor'); + var shadowBlur = textStyleModel.get('textShadowBlur') || 0; + var shadowOffsetX = textStyleModel.get('textShadowOffsetX') || 0; + var shadowOffsetY = textStyleModel.get('textShadowOffsetY') || 0; + shadowColor && shadowBlur && cssText.push('text-shadow:' + shadowOffsetX + 'px ' + shadowOffsetY + 'px ' + shadowBlur + 'px ' + shadowColor); + each$4(['decoration', 'align'], function (name) { + var val = textStyleModel.get(name); + val && cssText.push('text-' + name + ':' + val); + }); + return cssText.join(';'); +} +function assembleCssText(tooltipModel, enableTransition, onlyFade) { + var cssText = []; + var transitionDuration = tooltipModel.get('transitionDuration'); + var backgroundColor = tooltipModel.get('backgroundColor'); + var shadowBlur = tooltipModel.get('shadowBlur'); + var shadowColor = tooltipModel.get('shadowColor'); + var shadowOffsetX = tooltipModel.get('shadowOffsetX'); + var shadowOffsetY = tooltipModel.get('shadowOffsetY'); + var textStyleModel = tooltipModel.getModel('textStyle'); + var padding = getPaddingFromTooltipModel(tooltipModel, 'html'); + var boxShadow = shadowOffsetX + "px " + shadowOffsetY + "px " + shadowBlur + "px " + shadowColor; + cssText.push('box-shadow:' + boxShadow); + // Animation transition. Do not animate when transitionDuration is 0. + enableTransition && transitionDuration && cssText.push(assembleTransition(transitionDuration, onlyFade)); + if (backgroundColor) { + cssText.push('background-color:' + backgroundColor); + } + // Border style + each$4(['width', 'color', 'radius'], function (name) { + var borderName = 'border-' + name; + var camelCase = toCamelCase(borderName); + var val = tooltipModel.get(camelCase); + val != null && cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px')); + }); + // Text style + cssText.push(assembleFont(textStyleModel)); + // Padding + if (padding != null) { + cssText.push('padding:' + normalizeCssArray(padding).join('px ') + 'px'); + } + return cssText.join(';') + ';'; +} +// If not able to make, do not modify the input `out`. +function makeStyleCoord$1(out, zr, container, zrX, zrY) { + var zrPainter = zr && zr.painter; + if (container) { + var zrViewportRoot = zrPainter && zrPainter.getViewportRoot(); + if (zrViewportRoot) { + // Some APPs might use scale on body, so we support CSS transform here. + transformLocalCoord(out, zrViewportRoot, container, zrX, zrY); + } + } else { + out[0] = zrX; + out[1] = zrY; + // xy should be based on canvas root. But tooltipContent is + // the sibling of canvas root. So padding of ec container + // should be considered here. + var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset(); + if (viewportRootOffset) { + out[0] += viewportRootOffset.offsetLeft; + out[1] += viewportRootOffset.offsetTop; + } + } + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); +} +var TooltipHTMLContent = /** @class */function () { + function TooltipHTMLContent(api, opt) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._enterable = true; + this._alwaysShowContent = false; + this._firstShow = true; + this._longHide = true; + if (env.wxa) { + return null; + } + var el = document.createElement('div'); + // TODO: TYPE + el.domBelongToZr = true; + this.el = el; + var zr = this._zr = api.getZr(); + var appendTo = opt.appendTo; + var container = appendTo && (isString(appendTo) ? document.querySelector(appendTo) : isDom(appendTo) ? appendTo : isFunction(appendTo) && appendTo(api.getDom())); + makeStyleCoord$1(this._styleCoord, zr, container, api.getWidth() / 2, api.getHeight() / 2); + (container || api.getDom()).appendChild(el); + this._api = api; + this._container = container; + // FIXME + // Is it needed to trigger zr event manually if + // the browser do not support `pointer-events: none`. + var self = this; + el.onmouseenter = function () { + // clear the timeout in hideLater and keep showing tooltip + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + self._inContent = true; + }; + el.onmousemove = function (e) { + e = e || window.event; + if (!self._enterable) { + // `pointer-events: none` is set to tooltip content div + // if `enterable` is set as `false`, and `el.onmousemove` + // can not be triggered. But in browser that do not + // support `pointer-events`, we need to do this: + // Try trigger zrender event to avoid mouse + // in and out shape too frequently + var handler = zr.handler; + var zrViewportRoot = zr.painter.getViewportRoot(); + normalizeEvent(zrViewportRoot, e, true); + handler.dispatch('mousemove', e); + } + }; + el.onmouseleave = function () { + // set `_inContent` to `false` before `hideLater` + self._inContent = false; + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + }; + } + /** + * Update when tooltip is rendered + */ + TooltipHTMLContent.prototype.update = function (tooltipModel) { + // FIXME + // Move this logic to ec main? + if (!this._container) { + var container = this._api.getDom(); + var position = getComputedStyle(container, 'position'); + var domStyle = container.style; + if (domStyle.position !== 'absolute' && position !== 'absolute') { + domStyle.position = 'relative'; + } + } + // move tooltip if chart resized + var alwaysShowContent = tooltipModel.get('alwaysShowContent'); + alwaysShowContent && this._moveIfResized(); + // update alwaysShowContent + this._alwaysShowContent = alwaysShowContent; + // update className + this.el.className = tooltipModel.get('className') || ''; + // Hide the tooltip + // PENDING + // this.hide(); + }; + TooltipHTMLContent.prototype.show = function (tooltipModel, nearPointColor) { + clearTimeout(this._hideTimeout); + clearTimeout(this._longHideTimeout); + var el = this.el; + var style = el.style; + var styleCoord = this._styleCoord; + if (!el.innerHTML) { + style.display = 'none'; + } else { + style.cssText = gCssText + assembleCssText(tooltipModel, !this._firstShow, this._longHide) + // initial transform + + assembleTransform(styleCoord[0], styleCoord[1], true) + ("border-color:" + convertToColorString(nearPointColor) + ";") + (tooltipModel.get('extraCssText') || '') + // If mouse occasionally move over the tooltip, a mouseout event will be + // triggered by canvas, and cause some unexpectable result like dragging + // stop, "unfocusAdjacency". Here `pointer-events: none` is used to solve + // it. Although it is not supported by IE8~IE10, fortunately it is a rare + // scenario. + + (";pointer-events:" + (this._enterable ? 'auto' : 'none')); + } + this._show = true; + this._firstShow = false; + this._longHide = false; + }; + TooltipHTMLContent.prototype.setContent = function (content, markers, tooltipModel, borderColor, arrowPosition) { + var el = this.el; + if (content == null) { + el.innerHTML = ''; + return; + } + var arrow = ''; + if (isString(arrowPosition) && tooltipModel.get('trigger') === 'item' && !shouldTooltipConfine(tooltipModel)) { + arrow = assembleArrow(tooltipModel, borderColor, arrowPosition); + } + if (isString(content)) { + el.innerHTML = content + arrow; + } else if (content) { + // Clear previous + el.innerHTML = ''; + if (!isArray(content)) { + content = [content]; + } + for (var i = 0; i < content.length; i++) { + if (isDom(content[i]) && content[i].parentNode !== el) { + el.appendChild(content[i]); + } + } + // no arrow if empty + if (arrow && el.childNodes.length) { + // no need to create a new parent element, but it's not supported by IE 10 and older. + // const arrowEl = document.createRange().createContextualFragment(arrow); + var arrowEl = document.createElement('div'); + arrowEl.innerHTML = arrow; + el.appendChild(arrowEl); + } + } + }; + TooltipHTMLContent.prototype.setEnterable = function (enterable) { + this._enterable = enterable; + }; + TooltipHTMLContent.prototype.getSize = function () { + var el = this.el; + return el ? [el.offsetWidth, el.offsetHeight] : [0, 0]; + }; + TooltipHTMLContent.prototype.moveTo = function (zrX, zrY) { + if (!this.el) { + return; + } + var styleCoord = this._styleCoord; + makeStyleCoord$1(styleCoord, this._zr, this._container, zrX, zrY); + if (styleCoord[0] != null && styleCoord[1] != null) { + var style_1 = this.el.style; + var transforms = assembleTransform(styleCoord[0], styleCoord[1]); + each$4(transforms, function (transform) { + style_1[transform[0]] = transform[1]; + }); + } + }; + /** + * when `alwaysShowContent` is true, + * move the tooltip after chart resized + */ + TooltipHTMLContent.prototype._moveIfResized = function () { + // The ratio of left to width + var ratioX = this._styleCoord[2]; + // The ratio of top to height + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + TooltipHTMLContent.prototype.hide = function () { + var _this = this; + var style = this.el.style; + style.visibility = 'hidden'; + style.opacity = '0'; + env.transform3dSupported && (style.willChange = ''); + this._show = false; + this._longHideTimeout = setTimeout(function () { + return _this._longHide = true; + }, 500); + }; + TooltipHTMLContent.prototype.hideLater = function (time) { + if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) { + if (time) { + this._hideDelay = time; + // Set show false to avoid invoke hideLater multiple times + this._show = false; + this._hideTimeout = setTimeout(bind$1(this.hide, this), time); + } else { + this.hide(); + } + } + }; + TooltipHTMLContent.prototype.isShow = function () { + return this._show; + }; + TooltipHTMLContent.prototype.dispose = function () { + clearTimeout(this._hideTimeout); + clearTimeout(this._longHideTimeout); + var parentNode = this.el.parentNode; + parentNode && parentNode.removeChild(this.el); + this.el = this._container = null; + }; + return TooltipHTMLContent; +}(); + +var TooltipRichContent = ( + /** @class */ + function() { + function TooltipRichContent2(api) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._alwaysShowContent = false; + this._enterable = true; + this._zr = api.getZr(); + makeStyleCoord(this._styleCoord, this._zr, api.getWidth() / 2, api.getHeight() / 2); + } + TooltipRichContent2.prototype.update = function(tooltipModel) { + var alwaysShowContent = tooltipModel.get("alwaysShowContent"); + alwaysShowContent && this._moveIfResized(); + this._alwaysShowContent = alwaysShowContent; + }; + TooltipRichContent2.prototype.show = function() { + if (this._hideTimeout) { + clearTimeout(this._hideTimeout); + } + this.el.show(); + this._show = true; + }; + TooltipRichContent2.prototype.setContent = function(content, markupStyleCreator, tooltipModel, borderColor, arrowPosition) { + var _this = this; + if (isObject$2(content)) { + throwError(""); + } + if (this.el) { + this._zr.remove(this.el); + } + var textStyleModel = tooltipModel.getModel("textStyle"); + this.el = new ZRText({ + style: { + rich: markupStyleCreator.richTextStyles, + text: content, + lineHeight: 22, + borderWidth: 1, + borderColor, + textShadowColor: textStyleModel.get("textShadowColor"), + fill: tooltipModel.get(["textStyle", "color"]), + padding: getPaddingFromTooltipModel(tooltipModel, "richText"), + verticalAlign: "top", + align: "left" + }, + z: tooltipModel.get("z") + }); + each$4(["backgroundColor", "borderRadius", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"], function(propName) { + _this.el.style[propName] = tooltipModel.get(propName); + }); + each$4(["textShadowBlur", "textShadowOffsetX", "textShadowOffsetY"], function(propName) { + _this.el.style[propName] = textStyleModel.get(propName) || 0; + }); + this._zr.add(this.el); + var self = this; + this.el.on("mouseover", function() { + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + self._inContent = true; + }); + this.el.on("mouseout", function() { + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + self._inContent = false; + }); + }; + TooltipRichContent2.prototype.setEnterable = function(enterable) { + this._enterable = enterable; + }; + TooltipRichContent2.prototype.getSize = function() { + var el = this.el; + var bounding = this.el.getBoundingRect(); + var shadowOuterSize = calcShadowOuterSize(el.style); + return [bounding.width + shadowOuterSize.left + shadowOuterSize.right, bounding.height + shadowOuterSize.top + shadowOuterSize.bottom]; + }; + TooltipRichContent2.prototype.moveTo = function(x, y) { + var el = this.el; + if (el) { + var styleCoord = this._styleCoord; + makeStyleCoord(styleCoord, this._zr, x, y); + x = styleCoord[0]; + y = styleCoord[1]; + var style = el.style; + var borderWidth = mathMaxWith0(style.borderWidth || 0); + var shadowOuterSize = calcShadowOuterSize(style); + el.x = x + borderWidth + shadowOuterSize.left; + el.y = y + borderWidth + shadowOuterSize.top; + el.markRedraw(); + } + }; + TooltipRichContent2.prototype._moveIfResized = function() { + var ratioX = this._styleCoord[2]; + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + TooltipRichContent2.prototype.hide = function() { + if (this.el) { + this.el.hide(); + } + this._show = false; + }; + TooltipRichContent2.prototype.hideLater = function(time) { + if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) { + if (time) { + this._hideDelay = time; + this._show = false; + this._hideTimeout = setTimeout(bind$1(this.hide, this), time); + } else { + this.hide(); + } + } + }; + TooltipRichContent2.prototype.isShow = function() { + return this._show; + }; + TooltipRichContent2.prototype.dispose = function() { + this._zr.remove(this.el); + }; + return TooltipRichContent2; + }() +); +function mathMaxWith0(val) { + return Math.max(0, val); +} +function calcShadowOuterSize(style) { + var shadowBlur = mathMaxWith0(style.shadowBlur || 0); + var shadowOffsetX = mathMaxWith0(style.shadowOffsetX || 0); + var shadowOffsetY = mathMaxWith0(style.shadowOffsetY || 0); + return { + left: mathMaxWith0(shadowBlur - shadowOffsetX), + right: mathMaxWith0(shadowBlur + shadowOffsetX), + top: mathMaxWith0(shadowBlur - shadowOffsetY), + bottom: mathMaxWith0(shadowBlur + shadowOffsetY) + }; +} +function makeStyleCoord(out, zr, zrX, zrY) { + out[0] = zrX; + out[1] = zrY; + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); +} + +var proxyRect = new Rect({ + shape: { + x: -1, + y: -1, + width: 2, + height: 2 + } +}); +var TooltipView = /** @class */function (_super) { + __extends(TooltipView, _super); + function TooltipView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = TooltipView.type; + return _this; + } + TooltipView.prototype.init = function (ecModel, api) { + if (env.node || !api.getDom()) { + return; + } + var tooltipModel = ecModel.getComponent('tooltip'); + var renderMode = this._renderMode = getTooltipRenderMode(tooltipModel.get('renderMode')); + this._tooltipContent = renderMode === 'richText' ? new TooltipRichContent(api) : new TooltipHTMLContent(api, { + appendTo: tooltipModel.get('appendToBody', true) ? 'body' : tooltipModel.get('appendTo', true) + }); + }; + TooltipView.prototype.render = function (tooltipModel, ecModel, api) { + if (env.node || !api.getDom()) { + return; + } + // Reset + this.group.removeAll(); + this._tooltipModel = tooltipModel; + this._ecModel = ecModel; + this._api = api; + var tooltipContent = this._tooltipContent; + tooltipContent.update(tooltipModel); + tooltipContent.setEnterable(tooltipModel.get('enterable')); + this._initGlobalListener(); + this._keepShow(); + // PENDING + // `mousemove` event will be triggered very frequently when the mouse moves fast, + // which causes that the `updatePosition` function was also called frequently. + // In Chrome with devtools open and Firefox, tooltip looks laggy and shakes. See #14695 #16101 + // To avoid frequent triggering, + // consider throttling it in 50ms when transition is enabled + if (this._renderMode !== 'richText' && tooltipModel.get('transitionDuration')) { + createOrUpdate(this, '_updatePosition', 50, 'fixRate'); + } else { + clear(this, '_updatePosition'); + } + }; + TooltipView.prototype._initGlobalListener = function () { + var tooltipModel = this._tooltipModel; + var triggerOn = tooltipModel.get('triggerOn'); + register('itemTooltip', this._api, bind$1(function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none') { + if (triggerOn.indexOf(currTrigger) >= 0) { + this._tryShow(e, dispatchAction); + } else if (currTrigger === 'leave') { + this._hide(dispatchAction); + } + } + }, this)); + }; + TooltipView.prototype._keepShow = function () { + var tooltipModel = this._tooltipModel; + var ecModel = this._ecModel; + var api = this._api; + var triggerOn = tooltipModel.get('triggerOn'); + // Try to keep the tooltip show when refreshing + if (this._lastX != null && this._lastY != null + // When user is willing to control tooltip totally using API, + // self.manuallyShowTip({x, y}) might cause tooltip hide, + // which is not expected. + && triggerOn !== 'none' && triggerOn !== 'click') { + var self_1 = this; + clearTimeout(this._refreshUpdateTimeout); + this._refreshUpdateTimeout = setTimeout(function () { + // Show tip next tick after other charts are rendered + // In case highlight action has wrong result + // FIXME + !api.isDisposed() && self_1.manuallyShowTip(tooltipModel, ecModel, api, { + x: self_1._lastX, + y: self_1._lastY, + dataByCoordSys: self_1._lastDataByCoordSys + }); + }); + } + }; + /** + * Show tip manually by + * dispatchAction({ + * type: 'showTip', + * x: 10, + * y: 10 + * }); + * Or + * dispatchAction({ + * type: 'showTip', + * seriesIndex: 0, + * dataIndex or dataIndexInside or name + * }); + * + * TODO Batch + */ + TooltipView.prototype.manuallyShowTip = function (tooltipModel, ecModel, api, payload) { + if (payload.from === this.uid || env.node || !api.getDom()) { + return; + } + var dispatchAction = makeDispatchAction(payload, api); + // Reset ticket + this._ticket = ''; + // When triggered from axisPointer. + var dataByCoordSys = payload.dataByCoordSys; + var cmptRef = findComponentReference(payload, ecModel, api); + if (cmptRef) { + var rect = cmptRef.el.getBoundingRect().clone(); + rect.applyTransform(cmptRef.el.transform); + this._tryShow({ + offsetX: rect.x + rect.width / 2, + offsetY: rect.y + rect.height / 2, + target: cmptRef.el, + position: payload.position, + // When manully trigger, the mouse is not on the el, so we'd better to + // position tooltip on the bottom of the el and display arrow is possible. + positionDefault: 'bottom' + }, dispatchAction); + } else if (payload.tooltip && payload.x != null && payload.y != null) { + var el = proxyRect; + el.x = payload.x; + el.y = payload.y; + el.update(); + getECData(el).tooltipConfig = { + name: null, + option: payload.tooltip + }; + // Manually show tooltip while view is not using zrender elements. + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + target: el + }, dispatchAction); + } else if (dataByCoordSys) { + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + dataByCoordSys: dataByCoordSys, + tooltipOption: payload.tooltipOption + }, dispatchAction); + } else if (payload.seriesIndex != null) { + if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) { + return; + } + var pointInfo = findPointFromSeries(payload, ecModel); + var cx = pointInfo.point[0]; + var cy = pointInfo.point[1]; + if (cx != null && cy != null) { + this._tryShow({ + offsetX: cx, + offsetY: cy, + target: pointInfo.el, + position: payload.position, + // When manully trigger, the mouse is not on the el, so we'd better to + // position tooltip on the bottom of the el and display arrow is possible. + positionDefault: 'bottom' + }, dispatchAction); + } + } else if (payload.x != null && payload.y != null) { + // FIXME + // should wrap dispatchAction like `axisPointer/globalListener` ? + api.dispatchAction({ + type: 'updateAxisPointer', + x: payload.x, + y: payload.y + }); + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + target: api.getZr().findHover(payload.x, payload.y).target + }, dispatchAction); + } + }; + TooltipView.prototype.manuallyHideTip = function (tooltipModel, ecModel, api, payload) { + var tooltipContent = this._tooltipContent; + if (this._tooltipModel) { + tooltipContent.hideLater(this._tooltipModel.get('hideDelay')); + } + this._lastX = this._lastY = this._lastDataByCoordSys = null; + if (payload.from !== this.uid) { + this._hide(makeDispatchAction(payload, api)); + } + }; + // Be compatible with previous design, that is, when tooltip.type is 'axis' and + // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer + // and tooltip. + TooltipView.prototype._manuallyAxisShowTip = function (tooltipModel, ecModel, api, payload) { + var seriesIndex = payload.seriesIndex; + var dataIndex = payload.dataIndex; + // @ts-ignore + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; + if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) { + return; + } + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + if (!seriesModel) { + return; + } + var data = seriesModel.getData(); + var tooltipCascadedModel = buildTooltipModel([data.getItemModel(dataIndex), seriesModel, (seriesModel.coordinateSystem || {}).model], this._tooltipModel); + if (tooltipCascadedModel.get('trigger') !== 'axis') { + return; + } + api.dispatchAction({ + type: 'updateAxisPointer', + seriesIndex: seriesIndex, + dataIndex: dataIndex, + position: payload.position + }); + return true; + }; + TooltipView.prototype._tryShow = function (e, dispatchAction) { + var el = e.target; + var tooltipModel = this._tooltipModel; + if (!tooltipModel) { + return; + } + // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed + this._lastX = e.offsetX; + this._lastY = e.offsetY; + var dataByCoordSys = e.dataByCoordSys; + if (dataByCoordSys && dataByCoordSys.length) { + this._showAxisTooltip(dataByCoordSys, e); + } else if (el) { + var ecData = getECData(el); + if (ecData.ssrType === 'legend') { + // Don't trigger tooltip for legend tooltip item + return; + } + this._lastDataByCoordSys = null; + var seriesDispatcher_1; + var cmptDispatcher_1; + findEventDispatcher(el, function (target) { + // Always show item tooltip if mouse is on the element with dataIndex + if (getECData(target).dataIndex != null) { + seriesDispatcher_1 = target; + return true; + } + // Tooltip provided directly. Like legend. + if (getECData(target).tooltipConfig != null) { + cmptDispatcher_1 = target; + return true; + } + }, true); + if (seriesDispatcher_1) { + this._showSeriesItemTooltip(e, seriesDispatcher_1, dispatchAction); + } else if (cmptDispatcher_1) { + this._showComponentItemTooltip(e, cmptDispatcher_1, dispatchAction); + } else { + this._hide(dispatchAction); + } + } else { + this._lastDataByCoordSys = null; + this._hide(dispatchAction); + } + }; + TooltipView.prototype._showOrMove = function (tooltipModel, cb) { + // showDelay is used in this case: tooltip.enterable is set + // as true. User intent to move mouse into tooltip and click + // something. `showDelay` makes it easier to enter the content + // but tooltip do not move immediately. + var delay = tooltipModel.get('showDelay'); + cb = bind$1(cb, this); + clearTimeout(this._showTimout); + delay > 0 ? this._showTimout = setTimeout(cb, delay) : cb(); + }; + TooltipView.prototype._showAxisTooltip = function (dataByCoordSys, e) { + var ecModel = this._ecModel; + var globalTooltipModel = this._tooltipModel; + var point = [e.offsetX, e.offsetY]; + var singleTooltipModel = buildTooltipModel([e.tooltipOption], globalTooltipModel); + var renderMode = this._renderMode; + var cbParamsList = []; + var articleMarkup = createTooltipMarkup('section', { + blocks: [], + noHeader: true + }); + // Only for legacy: `Serise['formatTooltip']` returns a string. + var markupTextArrLegacy = []; + var markupStyleCreator = new TooltipMarkupStyleCreator(); + each$4(dataByCoordSys, function (itemCoordSys) { + each$4(itemCoordSys.dataByAxis, function (axisItem) { + var axisModel = ecModel.getComponent(axisItem.axisDim + 'Axis', axisItem.axisIndex); + var axisValue = axisItem.value; + if (!axisModel || axisValue == null) { + return; + } + var axisValueLabel = getValueLabel(axisValue, axisModel.axis, ecModel, axisItem.seriesDataIndices, axisItem.valueLabelOpt); + var axisSectionMarkup = createTooltipMarkup('section', { + header: axisValueLabel, + noHeader: !trim(axisValueLabel), + sortBlocks: true, + blocks: [] + }); + articleMarkup.blocks.push(axisSectionMarkup); + each$4(axisItem.seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var cbParams = series.getDataParams(dataIndex); + // Can't find data. + if (cbParams.dataIndex < 0) { + return; + } + cbParams.axisDim = axisItem.axisDim; + cbParams.axisIndex = axisItem.axisIndex; + cbParams.axisType = axisItem.axisType; + cbParams.axisId = axisItem.axisId; + cbParams.axisValue = getAxisRawValue(axisModel.axis, { + value: axisValue + }); + cbParams.axisValueLabel = axisValueLabel; + // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + cbParams.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(cbParams.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(series.formatTooltip(dataIndex, true, null)); + var frag = seriesTooltipResult.frag; + if (frag) { + var valueFormatter = buildTooltipModel([series], globalTooltipModel).get('valueFormatter'); + axisSectionMarkup.blocks.push(valueFormatter ? extend({ + valueFormatter: valueFormatter + }, frag) : frag); + } + if (seriesTooltipResult.text) { + markupTextArrLegacy.push(seriesTooltipResult.text); + } + cbParamsList.push(cbParams); + }); + }); + }); + // In most cases, the second axis is displays upper on the first one. + // So we reverse it to look better. + articleMarkup.blocks.reverse(); + markupTextArrLegacy.reverse(); + var positionExpr = e.position; + var orderMode = singleTooltipModel.get('order'); + var builtMarkupText = buildTooltipMarkup(articleMarkup, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), singleTooltipModel.get('textStyle')); + builtMarkupText && markupTextArrLegacy.unshift(builtMarkupText); + var blockBreak = renderMode === 'richText' ? '\n\n' : '
'; + var allMarkupText = markupTextArrLegacy.join(blockBreak); + this._showOrMove(singleTooltipModel, function () { + if (this._updateContentNotChangedOnAxis(dataByCoordSys, cbParamsList)) { + this._updatePosition(singleTooltipModel, positionExpr, point[0], point[1], this._tooltipContent, cbParamsList); + } else { + this._showTooltipContent(singleTooltipModel, allMarkupText, cbParamsList, Math.random() + '', point[0], point[1], positionExpr, null, markupStyleCreator); + } + }); + // Do not trigger events here, because this branch only be entered + // from dispatchAction. + }; + TooltipView.prototype._showSeriesItemTooltip = function (e, dispatcher, dispatchAction) { + var ecModel = this._ecModel; + var ecData = getECData(dispatcher); + // Use dataModel in element if possible + // Used when mouseover on a element like markPoint or edge + // In which case, the data is not main data in series. + var seriesIndex = ecData.seriesIndex; + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + // For example, graph link. + var dataModel = ecData.dataModel || seriesModel; + var dataIndex = ecData.dataIndex; + var dataType = ecData.dataType; + var data = dataModel.getData(dataType); + var renderMode = this._renderMode; + var positionDefault = e.positionDefault; + var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), dataModel, seriesModel && (seriesModel.coordinateSystem || {}).model], this._tooltipModel, positionDefault ? { + position: positionDefault + } : null); + var tooltipTrigger = tooltipModel.get('trigger'); + if (tooltipTrigger != null && tooltipTrigger !== 'item') { + return; + } + var params = dataModel.getDataParams(dataIndex, dataType); + var markupStyleCreator = new TooltipMarkupStyleCreator(); + // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + params.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(params.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(dataModel.formatTooltip(dataIndex, false, dataType)); + var orderMode = tooltipModel.get('order'); + var valueFormatter = tooltipModel.get('valueFormatter'); + var frag = seriesTooltipResult.frag; + var markupText = frag ? buildTooltipMarkup(valueFormatter ? extend({ + valueFormatter: valueFormatter + }, frag) : frag, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), tooltipModel.get('textStyle')) : seriesTooltipResult.text; + var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex; + this._showOrMove(tooltipModel, function () { + this._showTooltipContent(tooltipModel, markupText, params, asyncTicket, e.offsetX, e.offsetY, e.position, e.target, markupStyleCreator); + }); + // FIXME + // duplicated showtip if manuallyShowTip is called from dispatchAction. + dispatchAction({ + type: 'showTip', + dataIndexInside: dataIndex, + dataIndex: data.getRawIndex(dataIndex), + seriesIndex: seriesIndex, + from: this.uid + }); + }; + TooltipView.prototype._showComponentItemTooltip = function (e, el, dispatchAction) { + var isHTMLRenderMode = this._renderMode === 'html'; + var ecData = getECData(el); + var tooltipConfig = ecData.tooltipConfig; + var tooltipOpt = tooltipConfig.option || {}; + var encodeHTMLContent = tooltipOpt.encodeHTMLContent; + if (isString(tooltipOpt)) { + var content = tooltipOpt; + tooltipOpt = { + content: content, + // Fixed formatter + formatter: content + }; + // when `tooltipConfig.option` is a string rather than an object, + // we can't know if the content needs to be encoded + // for the sake of security, encode it by default. + encodeHTMLContent = true; + } + if (encodeHTMLContent && isHTMLRenderMode && tooltipOpt.content) { + // clone might be unnecessary? + tooltipOpt = clone$2(tooltipOpt); + tooltipOpt.content = encodeHTML(tooltipOpt.content); + } + var tooltipModelCascade = [tooltipOpt]; + var cmpt = this._ecModel.getComponent(ecData.componentMainType, ecData.componentIndex); + if (cmpt) { + tooltipModelCascade.push(cmpt); + } + // In most cases, component tooltip formatter has different params with series tooltip formatter, + // so that they cannot share the same formatter. Since the global tooltip formatter is used for series + // by convention, we do not use it as the default formatter for component. + tooltipModelCascade.push({ + formatter: tooltipOpt.content + }); + var positionDefault = e.positionDefault; + var subTooltipModel = buildTooltipModel(tooltipModelCascade, this._tooltipModel, positionDefault ? { + position: positionDefault + } : null); + var defaultHtml = subTooltipModel.get('content'); + var asyncTicket = Math.random() + ''; + // PENDING: this case do not support richText style yet. + var markupStyleCreator = new TooltipMarkupStyleCreator(); + // Do not check whether `trigger` is 'none' here, because `trigger` + // only works on coordinate system. In fact, we have not found case + // that requires setting `trigger` nothing on component yet. + this._showOrMove(subTooltipModel, function () { + // Use formatterParams from element defined in component + // Avoid users modify it. + var formatterParams = clone$2(subTooltipModel.get('formatterParams') || {}); + this._showTooltipContent(subTooltipModel, defaultHtml, formatterParams, asyncTicket, e.offsetX, e.offsetY, e.position, el, markupStyleCreator); + }); + // If not dispatch showTip, tip may be hide triggered by axis. + dispatchAction({ + type: 'showTip', + from: this.uid + }); + }; + TooltipView.prototype._showTooltipContent = function ( + // Use Model insteadof TooltipModel because this model may be from series or other options. + // Instead of top level tooltip. + tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markupStyleCreator) { + // Reset ticket + this._ticket = ''; + if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) { + return; + } + var tooltipContent = this._tooltipContent; + tooltipContent.setEnterable(tooltipModel.get('enterable')); + var formatter = tooltipModel.get('formatter'); + positionExpr = positionExpr || tooltipModel.get('position'); + var html = defaultHtml; + var nearPoint = this._getNearestPoint([x, y], params, tooltipModel.get('trigger'), tooltipModel.get('borderColor')); + var nearPointColor = nearPoint.color; + if (formatter) { + if (isString(formatter)) { + var useUTC = tooltipModel.ecModel.get('useUTC'); + var params0 = isArray(params) ? params[0] : params; + var isTimeAxis = params0 && params0.axisType && params0.axisType.indexOf('time') >= 0; + html = formatter; + if (isTimeAxis) { + html = format(params0.axisValue, html, useUTC); + } + html = formatTpl(html, params, true); + } else if (isFunction(formatter)) { + var callback = bind$1(function (cbTicket, html) { + if (cbTicket === this._ticket) { + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + } + }, this); + this._ticket = asyncTicket; + html = formatter(params, asyncTicket, callback); + } else { + html = formatter; + } + } + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); + tooltipContent.show(tooltipModel, nearPointColor); + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + }; + TooltipView.prototype._getNearestPoint = function (point, tooltipDataParams, trigger, borderColor) { + if (trigger === 'axis' || isArray(tooltipDataParams)) { + return { + color: borderColor || (this._renderMode === 'html' ? '#fff' : 'none') + }; + } + if (!isArray(tooltipDataParams)) { + return { + color: borderColor || tooltipDataParams.color || tooltipDataParams.borderColor + }; + } + }; + TooltipView.prototype._updatePosition = function (tooltipModel, positionExpr, x, + // Mouse x + y, + // Mouse y + content, params, el) { + var viewWidth = this._api.getWidth(); + var viewHeight = this._api.getHeight(); + positionExpr = positionExpr || tooltipModel.get('position'); + var contentSize = content.getSize(); + var align = tooltipModel.get('align'); + var vAlign = tooltipModel.get('verticalAlign'); + var rect = el && el.getBoundingRect().clone(); + el && rect.applyTransform(el.transform); + if (isFunction(positionExpr)) { + // Callback of position can be an array or a string specify the position + positionExpr = positionExpr([x, y], params, content.el, rect, { + viewSize: [viewWidth, viewHeight], + contentSize: contentSize.slice() + }); + } + if (isArray(positionExpr)) { + x = parsePercent(positionExpr[0], viewWidth); + y = parsePercent(positionExpr[1], viewHeight); + } else if (isObject$2(positionExpr)) { + var boxLayoutPosition = positionExpr; + boxLayoutPosition.width = contentSize[0]; + boxLayoutPosition.height = contentSize[1]; + var layoutRect = getLayoutRect(boxLayoutPosition, { + width: viewWidth, + height: viewHeight + }); + x = layoutRect.x; + y = layoutRect.y; + align = null; + // When positionExpr is left/top/right/bottom, + // align and verticalAlign will not work. + vAlign = null; + } + // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element + else if (isString(positionExpr) && el) { + var pos = calcTooltipPosition(positionExpr, rect, contentSize, tooltipModel.get('borderWidth')); + x = pos[0]; + y = pos[1]; + } else { + var pos = refixTooltipPosition(x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20); + x = pos[0]; + y = pos[1]; + } + align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0); + vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0); + if (shouldTooltipConfine(tooltipModel)) { + var pos = confineTooltipPosition(x, y, content, viewWidth, viewHeight); + x = pos[0]; + y = pos[1]; + } + content.moveTo(x, y); + }; + // FIXME + // Should we remove this but leave this to user? + TooltipView.prototype._updateContentNotChangedOnAxis = function (dataByCoordSys, cbParamsList) { + var lastCoordSys = this._lastDataByCoordSys; + var lastCbParamsList = this._cbParamsList; + var contentNotChanged = !!lastCoordSys && lastCoordSys.length === dataByCoordSys.length; + contentNotChanged && each$4(lastCoordSys, function (lastItemCoordSys, indexCoordSys) { + var lastDataByAxis = lastItemCoordSys.dataByAxis || []; + var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {}; + var thisDataByAxis = thisItemCoordSys.dataByAxis || []; + contentNotChanged = contentNotChanged && lastDataByAxis.length === thisDataByAxis.length; + contentNotChanged && each$4(lastDataByAxis, function (lastItem, indexAxis) { + var thisItem = thisDataByAxis[indexAxis] || {}; + var lastIndices = lastItem.seriesDataIndices || []; + var newIndices = thisItem.seriesDataIndices || []; + contentNotChanged = contentNotChanged && lastItem.value === thisItem.value && lastItem.axisType === thisItem.axisType && lastItem.axisId === thisItem.axisId && lastIndices.length === newIndices.length; + contentNotChanged && each$4(lastIndices, function (lastIdxItem, j) { + var newIdxItem = newIndices[j]; + contentNotChanged = contentNotChanged && lastIdxItem.seriesIndex === newIdxItem.seriesIndex && lastIdxItem.dataIndex === newIdxItem.dataIndex; + }); + // check is cbParams data value changed + lastCbParamsList && each$4(lastItem.seriesDataIndices, function (idxItem) { + var seriesIdx = idxItem.seriesIndex; + var cbParams = cbParamsList[seriesIdx]; + var lastCbParams = lastCbParamsList[seriesIdx]; + if (cbParams && lastCbParams && lastCbParams.data !== cbParams.data) { + contentNotChanged = false; + } + }); + }); + }); + this._lastDataByCoordSys = dataByCoordSys; + this._cbParamsList = cbParamsList; + return !!contentNotChanged; + }; + TooltipView.prototype._hide = function (dispatchAction) { + // Do not directly hideLater here, because this behavior may be prevented + // in dispatchAction when showTip is dispatched. + // FIXME + // duplicated hideTip if manuallyHideTip is called from dispatchAction. + this._lastDataByCoordSys = null; + dispatchAction({ + type: 'hideTip', + from: this.uid + }); + }; + TooltipView.prototype.dispose = function (ecModel, api) { + if (env.node || !api.getDom()) { + return; + } + clear(this, '_updatePosition'); + this._tooltipContent.dispose(); + unregister('itemTooltip', api); + }; + TooltipView.type = 'tooltip'; + return TooltipView; +}(ComponentView); +/** + * From top to bottom. (the last one should be globalTooltipModel); + */ +function buildTooltipModel(modelCascade, globalTooltipModel, defaultTooltipOption) { + // Last is always tooltip model. + var ecModel = globalTooltipModel.ecModel; + var resultModel; + if (defaultTooltipOption) { + resultModel = new Model(defaultTooltipOption, ecModel, ecModel); + resultModel = new Model(globalTooltipModel.option, resultModel, ecModel); + } else { + resultModel = globalTooltipModel; + } + for (var i = modelCascade.length - 1; i >= 0; i--) { + var tooltipOpt = modelCascade[i]; + if (tooltipOpt) { + if (tooltipOpt instanceof Model) { + tooltipOpt = tooltipOpt.get('tooltip', true); + } + // In each data item tooltip can be simply write: + // { + // value: 10, + // tooltip: 'Something you need to know' + // } + if (isString(tooltipOpt)) { + tooltipOpt = { + formatter: tooltipOpt + }; + } + if (tooltipOpt) { + resultModel = new Model(tooltipOpt, resultModel, ecModel); + } + } + } + return resultModel; +} +function makeDispatchAction(payload, api) { + return payload.dispatchAction || bind$1(api.dispatchAction, api); +} +function refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) { + var size = content.getSize(); + var width = size[0]; + var height = size[1]; + if (gapH != null) { + // Add extra 2 pixels for this case: + // At present the "values" in default tooltip are using CSS `float: right`. + // When the right edge of the tooltip box is on the right side of the + // viewport, the `float` layout might push the "values" to the second line. + if (x + width + gapH + 2 > viewWidth) { + x -= width + gapH; + } else { + x += gapH; + } + } + if (gapV != null) { + if (y + height + gapV > viewHeight) { + y -= height + gapV; + } else { + y += gapV; + } + } + return [x, y]; +} +function confineTooltipPosition(x, y, content, viewWidth, viewHeight) { + var size = content.getSize(); + var width = size[0]; + var height = size[1]; + x = Math.min(x + width, viewWidth) - width; + y = Math.min(y + height, viewHeight) - height; + x = Math.max(x, 0); + y = Math.max(y, 0); + return [x, y]; +} +function calcTooltipPosition(position, rect, contentSize, borderWidth) { + var domWidth = contentSize[0]; + var domHeight = contentSize[1]; + var offset = Math.ceil(Math.SQRT2 * borderWidth) + 8; + var x = 0; + var y = 0; + var rectWidth = rect.width; + var rectHeight = rect.height; + switch (position) { + case 'inside': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + case 'top': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y - domHeight - offset; + break; + case 'bottom': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight + offset; + break; + case 'left': + x = rect.x - domWidth - offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + case 'right': + x = rect.x + rectWidth + offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + } + return [x, y]; +} +function isCenterAlign(align) { + return align === 'center' || align === 'middle'; +} +/** + * Find target component by payload like: + * ```js + * { legendId: 'some_id', name: 'xxx' } + * { toolboxIndex: 1, name: 'xxx' } + * { geoName: 'some_name', name: 'xxx' } + * ``` + * PENDING: at present only + * + * If not found, return null/undefined. + */ +function findComponentReference(payload, ecModel, api) { + var queryOptionMap = preParseFinder(payload).queryOptionMap; + var componentMainType = queryOptionMap.keys()[0]; + if (!componentMainType || componentMainType === 'series') { + return; + } + var queryResult = queryReferringComponents(ecModel, componentMainType, queryOptionMap.get(componentMainType), { + useDefault: false, + enableAll: false, + enableNone: false + }); + var model = queryResult.models[0]; + if (!model) { + return; + } + var view = api.getViewOfComponentModel(model); + var el; + view.group.traverse(function (subEl) { + var tooltipConfig = getECData(subEl).tooltipConfig; + if (tooltipConfig && tooltipConfig.name === payload.name) { + el = subEl; + return true; // stop + } + }); + if (el) { + return { + componentMainType: componentMainType, + componentIndex: model.componentIndex, + el: el + }; + } +} + +function install$4(registers) { + use(install$6); + registers.registerComponentModel(TooltipModel); + registers.registerComponentView(TooltipView); + /** + * @action + * @property {string} type + * @property {number} seriesIndex + * @property {number} dataIndex + * @property {number} [x] + * @property {number} [y] + */ + registers.registerAction({ + type: 'showTip', + event: 'showTip', + update: 'tooltip:manuallyShowTip' + }, noop); + registers.registerAction({ + type: 'hideTip', + event: 'hideTip', + update: 'tooltip:manuallyHideTip' + }, noop); +} + +var TitleModel = /** @class */function (_super) { + __extends(TitleModel, _super); + function TitleModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = TitleModel.type; + _this.layoutMode = { + type: 'box', + ignoreSize: true + }; + return _this; + } + TitleModel.type = 'title'; + TitleModel.defaultOption = { + // zlevel: 0, + z: 6, + show: true, + 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: 'bold', + color: '#464646' + }, + subtextStyle: { + fontSize: 12, + color: '#6E7079' + } + }; + return TitleModel; +}(ComponentModel); +// View +var TitleView = /** @class */function (_super) { + __extends(TitleView, _super); + function TitleView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = TitleView.type; + return _this; + } + TitleView.prototype.render = function (titleModel, ecModel, api) { + this.group.removeAll(); + if (!titleModel.get('show')) { + return; + } + var group = this.group; + var textStyleModel = titleModel.getModel('textStyle'); + var subtextStyleModel = titleModel.getModel('subtextStyle'); + var textAlign = titleModel.get('textAlign'); + var textVerticalAlign = retrieve2(titleModel.get('textBaseline'), titleModel.get('textVerticalAlign')); + var textEl = new ZRText({ + style: createTextStyle(textStyleModel, { + text: titleModel.get('text'), + fill: textStyleModel.getTextColor() + }, { + disableBox: true + }), + z2: 10 + }); + var textRect = textEl.getBoundingRect(); + var subText = titleModel.get('subtext'); + var subTextEl = new ZRText({ + style: createTextStyle(subtextStyleModel, { + text: subText, + fill: subtextStyleModel.getTextColor(), + y: textRect.height + titleModel.get('itemGap'), + verticalAlign: 'top' + }, { + disableBox: true + }), + z2: 10 + }); + var link = titleModel.get('link'); + var sublink = titleModel.get('sublink'); + var triggerEvent = titleModel.get('triggerEvent', true); + textEl.silent = !link && !triggerEvent; + subTextEl.silent = !sublink && !triggerEvent; + if (link) { + textEl.on('click', function () { + windowOpen(link, '_' + titleModel.get('target')); + }); + } + if (sublink) { + subTextEl.on('click', function () { + windowOpen(sublink, '_' + titleModel.get('subtarget')); + }); + } + getECData(textEl).eventData = getECData(subTextEl).eventData = triggerEvent ? { + componentType: 'title', + componentIndex: titleModel.componentIndex + } : null; + group.add(textEl); + subText && group.add(subTextEl); + // If no subText, but add subTextEl, there will be an empty line. + var groupRect = group.getBoundingRect(); + var layoutOption = titleModel.getBoxLayoutParams(); + layoutOption.width = groupRect.width; + layoutOption.height = groupRect.height; + var layoutRect = getLayoutRect(layoutOption, { + width: api.getWidth(), + height: api.getHeight() + }, titleModel.get('padding')); + // Adjust text align based on position + if (!textAlign) { + // Align left if title is on the left. center and right is same + textAlign = titleModel.get('left') || titleModel.get('right'); + // @ts-ignore + if (textAlign === 'middle') { + textAlign = 'center'; + } + // Adjust layout by text align + if (textAlign === 'right') { + layoutRect.x += layoutRect.width; + } else if (textAlign === 'center') { + layoutRect.x += layoutRect.width / 2; + } + } + if (!textVerticalAlign) { + textVerticalAlign = titleModel.get('top') || titleModel.get('bottom'); + // @ts-ignore + if (textVerticalAlign === 'center') { + textVerticalAlign = 'middle'; + } + if (textVerticalAlign === 'bottom') { + layoutRect.y += layoutRect.height; + } else if (textVerticalAlign === 'middle') { + layoutRect.y += layoutRect.height / 2; + } + textVerticalAlign = textVerticalAlign || 'top'; + } + group.x = layoutRect.x; + group.y = layoutRect.y; + group.markRedraw(); + var alignStyle = { + align: textAlign, + verticalAlign: textVerticalAlign + }; + textEl.setStyle(alignStyle); + subTextEl.setStyle(alignStyle); + // Render background + // Get groupRect again because textAlign has been changed + groupRect = group.getBoundingRect(); + var padding = layoutRect.margin; + var style = titleModel.getItemStyle(['color', 'opacity']); + style.fill = titleModel.get('backgroundColor'); + var rect = new Rect({ + shape: { + x: groupRect.x - padding[3], + y: groupRect.y - padding[0], + width: groupRect.width + padding[1] + padding[3], + height: groupRect.height + padding[0] + padding[2], + r: titleModel.get('borderRadius') + }, + style: style, + subPixelOptimize: true, + silent: true + }); + group.add(rect); + }; + TitleView.type = 'title'; + return TitleView; +}(ComponentView); +function install$3(registers) { + registers.registerComponentModel(TitleModel); + registers.registerComponentView(TitleView); +} + +var getDefaultSelectorOptions = function (ecModel, type) { + if (type === 'all') { + return { + type: 'all', + title: ecModel.getLocaleModel().get(['legend', 'selector', 'all']) + }; + } else if (type === 'inverse') { + return { + type: 'inverse', + title: ecModel.getLocaleModel().get(['legend', 'selector', 'inverse']) + }; + } +}; +var LegendModel = /** @class */function (_super) { + __extends(LegendModel, _super); + function LegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = LegendModel.type; + _this.layoutMode = { + type: 'box', + // legend.width/height are maxWidth/maxHeight actually, + // whereas real width/height is calculated by its content. + // (Setting {left: 10, right: 10} does not make sense). + // So consider the case: + // `setOption({legend: {left: 10});` + // then `setOption({legend: {right: 10});` + // The previous `left` should be cleared by setting `ignoreSize`. + ignoreSize: true + }; + return _this; + } + LegendModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + option.selected = option.selected || {}; + this._updateSelector(option); + }; + LegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + this._updateSelector(option); + }; + LegendModel.prototype._updateSelector = function (option) { + var selector = option.selector; + var ecModel = this.ecModel; + if (selector === true) { + selector = option.selector = ['all', 'inverse']; + } + if (isArray(selector)) { + each$4(selector, function (item, index) { + isString(item) && (item = { + type: item + }); + selector[index] = merge(item, getDefaultSelectorOptions(ecModel, item.type)); + }); + } + }; + LegendModel.prototype.optionUpdated = function () { + this._updateData(this.ecModel); + var legendData = this._data; + // If selectedMode is single, try to select one + if (legendData[0] && this.get('selectedMode') === 'single') { + var hasSelected = false; + // If has any selected in option.selected + for (var i = 0; i < legendData.length; i++) { + var name_1 = legendData[i].get('name'); + if (this.isSelected(name_1)) { + // Force to unselect others + this.select(name_1); + hasSelected = true; + break; + } + } + // Try select the first if selectedMode is single + !hasSelected && this.select(legendData[0].get('name')); + } + }; + LegendModel.prototype._updateData = function (ecModel) { + var potentialData = []; + var availableNames = []; + ecModel.eachRawSeries(function (seriesModel) { + var seriesName = seriesModel.name; + availableNames.push(seriesName); + var isPotential; + if (seriesModel.legendVisualProvider) { + var provider = seriesModel.legendVisualProvider; + var names = provider.getAllNames(); + if (!ecModel.isSeriesFiltered(seriesModel)) { + availableNames = availableNames.concat(names); + } + if (names.length) { + potentialData = potentialData.concat(names); + } else { + isPotential = true; + } + } else { + isPotential = true; + } + if (isPotential && isNameSpecified(seriesModel)) { + potentialData.push(seriesModel.name); + } + }); + /** + * @type {Array.} + * @private + */ + this._availableNames = availableNames; + // If legend.data is not specified in option, use availableNames as data, + // which is convenient for user preparing option. + var rawData = this.get('data') || potentialData; + var legendNameMap = createHashMap(); + var legendData = map$1(rawData, function (dataItem) { + // Can be string or number + if (isString(dataItem) || isNumber(dataItem)) { + dataItem = { + name: dataItem + }; + } + if (legendNameMap.get(dataItem.name)) { + // remove legend name duplicate + return null; + } + legendNameMap.set(dataItem.name, true); + return new Model(dataItem, this, this.ecModel); + }, this); + /** + * @type {Array.} + * @private + */ + this._data = filter(legendData, function (item) { + return !!item; + }); + }; + LegendModel.prototype.getData = function () { + return this._data; + }; + LegendModel.prototype.select = function (name) { + var selected = this.option.selected; + var selectedMode = this.get('selectedMode'); + if (selectedMode === 'single') { + var data = this._data; + each$4(data, function (dataItem) { + selected[dataItem.get('name')] = false; + }); + } + selected[name] = true; + }; + LegendModel.prototype.unSelect = function (name) { + if (this.get('selectedMode') !== 'single') { + this.option.selected[name] = false; + } + }; + LegendModel.prototype.toggleSelected = function (name) { + var selected = this.option.selected; + // Default is true + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + this[selected[name] ? 'unSelect' : 'select'](name); + }; + LegendModel.prototype.allSelect = function () { + var data = this._data; + var selected = this.option.selected; + each$4(data, function (dataItem) { + selected[dataItem.get('name', true)] = true; + }); + }; + LegendModel.prototype.inverseSelect = function () { + var data = this._data; + var selected = this.option.selected; + each$4(data, function (dataItem) { + var name = dataItem.get('name', true); + // Initially, default value is true + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + selected[name] = !selected[name]; + }); + }; + LegendModel.prototype.isSelected = function (name) { + var selected = this.option.selected; + return !(selected.hasOwnProperty(name) && !selected[name]) && indexOf(this._availableNames, name) >= 0; + }; + LegendModel.prototype.getOrient = function () { + return this.get('orient') === 'vertical' ? { + index: 1, + name: 'vertical' + } : { + index: 0, + name: 'horizontal' + }; + }; + LegendModel.type = 'legend.plain'; + LegendModel.dependencies = ['series']; + LegendModel.defaultOption = { + // zlevel: 0, + z: 4, + show: true, + orient: 'horizontal', + left: 'center', + // right: 'center', + top: 0, + // bottom: null, + align: 'auto', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemGap: 10, + itemWidth: 25, + itemHeight: 14, + symbolRotate: 'inherit', + symbolKeepAspect: true, + inactiveColor: '#ccc', + inactiveBorderColor: '#ccc', + inactiveBorderWidth: 'auto', + itemStyle: { + color: 'inherit', + opacity: 'inherit', + borderColor: 'inherit', + borderWidth: 'auto', + borderCap: 'inherit', + borderJoin: 'inherit', + borderDashOffset: 'inherit', + borderMiterLimit: 'inherit' + }, + lineStyle: { + width: 'auto', + color: 'inherit', + inactiveColor: '#ccc', + inactiveWidth: 2, + opacity: 'inherit', + type: 'inherit', + cap: 'inherit', + join: 'inherit', + dashOffset: 'inherit', + miterLimit: 'inherit' + }, + textStyle: { + color: '#333' + }, + selectedMode: true, + selector: false, + selectorLabel: { + show: true, + borderRadius: 10, + padding: [3, 5, 3, 5], + fontSize: 12, + fontFamily: 'sans-serif', + color: '#666', + borderWidth: 1, + borderColor: '#666' + }, + emphasis: { + selectorLabel: { + show: true, + color: '#eee', + backgroundColor: '#666' + } + }, + selectorPosition: 'auto', + selectorItemGap: 7, + selectorButtonGap: 10, + tooltip: { + show: false + } + }; + return LegendModel; +}(ComponentModel); + +var curry = curry$1; +var each = each$4; +var Group$1 = Group$2; +var LegendView = ( + /** @class */ + function(_super) { + __extends(LegendView2, _super); + function LegendView2() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = LegendView2.type; + _this.newlineDisabled = false; + return _this; + } + LegendView2.prototype.init = function() { + this.group.add(this._contentGroup = new Group$1()); + this.group.add(this._selectorGroup = new Group$1()); + this._isFirstRender = true; + }; + LegendView2.prototype.getContentGroup = function() { + return this._contentGroup; + }; + LegendView2.prototype.getSelectorGroup = function() { + return this._selectorGroup; + }; + LegendView2.prototype.render = function(legendModel, ecModel, api) { + var isFirstRender = this._isFirstRender; + this._isFirstRender = false; + this.resetInner(); + if (!legendModel.get("show", true)) { + return; + } + var itemAlign = legendModel.get("align"); + var orient = legendModel.get("orient"); + if (!itemAlign || itemAlign === "auto") { + itemAlign = legendModel.get("left") === "right" && orient === "vertical" ? "right" : "left"; + } + var selector = legendModel.get("selector", true); + var selectorPosition = legendModel.get("selectorPosition", true); + if (selector && (!selectorPosition || selectorPosition === "auto")) { + selectorPosition = orient === "horizontal" ? "end" : "start"; + } + this.renderInner(itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); + var positionInfo = legendModel.getBoxLayoutParams(); + var viewportSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var padding = legendModel.get("padding"); + var maxSize = getLayoutRect(positionInfo, viewportSize, padding); + var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition); + var layoutRect = getLayoutRect(defaults({ + width: mainRect.width, + height: mainRect.height + }, positionInfo), viewportSize, padding); + this.group.x = layoutRect.x - mainRect.x; + this.group.y = layoutRect.y - mainRect.y; + this.group.markRedraw(); + this.group.add(this._backgroundEl = makeBackground(mainRect, legendModel)); + }; + LegendView2.prototype.resetInner = function() { + this.getContentGroup().removeAll(); + this._backgroundEl && this.group.remove(this._backgroundEl); + this.getSelectorGroup().removeAll(); + }; + LegendView2.prototype.renderInner = function(itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var contentGroup = this.getContentGroup(); + var legendDrawnMap = createHashMap(); + var selectMode = legendModel.get("selectedMode"); + var excludeSeriesId = []; + ecModel.eachRawSeries(function(seriesModel) { + !seriesModel.get("legendHoverLink") && excludeSeriesId.push(seriesModel.id); + }); + each(legendModel.getData(), function(legendItemModel, dataIndex) { + var name = legendItemModel.get("name"); + if (!this.newlineDisabled && (name === "" || name === "\n")) { + var g = new Group$1(); + g.newline = true; + contentGroup.add(g); + return; + } + var seriesModel = ecModel.getSeriesByName(name)[0]; + if (legendDrawnMap.get(name)) { + return; + } + if (seriesModel) { + var data = seriesModel.getData(); + var lineVisualStyle = data.getVisual("legendLineStyle") || {}; + var legendIcon = data.getVisual("legendIcon"); + var style = data.getVisual("style"); + var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode, api); + itemGroup.on("click", curry(dispatchSelectAction, name, null, api, excludeSeriesId)).on("mouseover", curry(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on("mouseout", curry(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId)); + if (ecModel.ssr) { + itemGroup.eachChild(function(child) { + var ecData = getECData(child); + ecData.seriesIndex = seriesModel.seriesIndex; + ecData.dataIndex = dataIndex; + ecData.ssrType = "legend"; + }); + } + legendDrawnMap.set(name, true); + } else { + ecModel.eachRawSeries(function(seriesModel2) { + if (legendDrawnMap.get(name)) { + return; + } + if (seriesModel2.legendVisualProvider) { + var provider = seriesModel2.legendVisualProvider; + if (!provider.containName(name)) { + return; + } + var idx = provider.indexOfName(name); + var style2 = provider.getItemVisual(idx, "style"); + var legendIcon2 = provider.getItemVisual(idx, "legendIcon"); + var colorArr = parse(style2.fill); + if (colorArr && colorArr[3] === 0) { + colorArr[3] = 0.2; + style2 = extend(extend({}, style2), { + fill: stringify(colorArr, "rgba") + }); + } + var itemGroup2 = this._createItem(seriesModel2, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style2, legendIcon2, selectMode, api); + itemGroup2.on("click", curry(dispatchSelectAction, null, name, api, excludeSeriesId)).on("mouseover", curry(dispatchHighlightAction, null, name, api, excludeSeriesId)).on("mouseout", curry(dispatchDownplayAction, null, name, api, excludeSeriesId)); + if (ecModel.ssr) { + itemGroup2.eachChild(function(child) { + var ecData = getECData(child); + ecData.seriesIndex = seriesModel2.seriesIndex; + ecData.dataIndex = dataIndex; + ecData.ssrType = "legend"; + }); + } + legendDrawnMap.set(name, true); + } + }, this); + } + }, this); + if (selector) { + this._createSelector(selector, legendModel, api, orient, selectorPosition); + } + }; + LegendView2.prototype._createSelector = function(selector, legendModel, api, orient, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + each(selector, function createSelectorButton(selectorItem) { + var type = selectorItem.type; + var labelText = new ZRText({ + style: { + x: 0, + y: 0, + align: "center", + verticalAlign: "middle" + }, + onclick: function() { + api.dispatchAction({ + type: type === "all" ? "legendAllSelect" : "legendInverseSelect", + legendId: legendModel.id + }); + } + }); + selectorGroup.add(labelText); + var labelModel = legendModel.getModel("selectorLabel"); + var emphasisLabelModel = legendModel.getModel(["emphasis", "selectorLabel"]); + setLabelStyle(labelText, { + normal: labelModel, + emphasis: emphasisLabelModel + }, { + defaultText: selectorItem.title + }); + enableHoverEmphasis(labelText); + }); + }; + LegendView2.prototype._createItem = function(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode, api) { + var drawType = seriesModel.visualDrawType; + var itemWidth = legendModel.get("itemWidth"); + var itemHeight = legendModel.get("itemHeight"); + var isSelected = legendModel.isSelected(name); + var iconRotate = legendItemModel.get("symbolRotate"); + var symbolKeepAspect = legendItemModel.get("symbolKeepAspect"); + var legendIconType = legendItemModel.get("icon"); + legendIcon = legendIconType || legendIcon || "roundRect"; + var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api); + var itemGroup = new Group$1(); + var textStyleModel = legendItemModel.getModel("textStyle"); + if (isFunction(seriesModel.getLegendIcon) && (!legendIconType || legendIconType === "inherit")) { + itemGroup.add(seriesModel.getLegendIcon({ + itemWidth, + itemHeight, + icon: legendIcon, + iconRotate, + itemStyle: style.itemStyle, + lineStyle: style.lineStyle, + symbolKeepAspect + })); + } else { + var rotate = legendIconType === "inherit" && seriesModel.getData().getVisual("symbol") ? iconRotate === "inherit" ? seriesModel.getData().getVisual("symbolRotate") : iconRotate : 0; + itemGroup.add(getDefaultLegendIcon({ + itemWidth, + itemHeight, + icon: legendIcon, + iconRotate: rotate, + itemStyle: style.itemStyle, + symbolKeepAspect + })); + } + var textX = itemAlign === "left" ? itemWidth + 5 : -5; + var textAlign = itemAlign; + var formatter = legendModel.get("formatter"); + var content = name; + if (isString(formatter) && formatter) { + content = formatter.replace("{name}", name != null ? name : ""); + } else if (isFunction(formatter)) { + content = formatter(name); + } + var textColor = isSelected ? textStyleModel.getTextColor() : legendItemModel.get("inactiveColor"); + itemGroup.add(new ZRText({ + style: createTextStyle(textStyleModel, { + text: content, + x: textX, + y: itemHeight / 2, + fill: textColor, + align: textAlign, + verticalAlign: "middle" + }, { + inheritColor: textColor + }) + })); + var hitRect = new Rect({ + shape: itemGroup.getBoundingRect(), + style: { + // Cannot use 'invisible' because SVG SSR will miss the node + fill: "transparent" + } + }); + var tooltipModel = legendItemModel.getModel("tooltip"); + if (tooltipModel.get("show")) { + setTooltipConfig({ + el: hitRect, + componentModel: legendModel, + itemName: name, + itemTooltipOption: tooltipModel.option + }); + } + itemGroup.add(hitRect); + itemGroup.eachChild(function(child) { + child.silent = true; + }); + hitRect.silent = !selectMode; + this.getContentGroup().add(itemGroup); + enableHoverEmphasis(itemGroup); + itemGroup.__legendDataIndex = dataIndex; + return itemGroup; + }; + LegendView2.prototype.layoutInner = function(legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var contentGroup = this.getContentGroup(); + var selectorGroup = this.getSelectorGroup(); + box(legendModel.get("orient"), contentGroup, legendModel.get("itemGap"), maxSize.width, maxSize.height); + var contentRect = contentGroup.getBoundingRect(); + var contentPos = [-contentRect.x, -contentRect.y]; + selectorGroup.markRedraw(); + contentGroup.markRedraw(); + if (selector) { + box( + // Buttons in selectorGroup always layout horizontally + "horizontal", + selectorGroup, + legendModel.get("selectorItemGap", true) + ); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var selectorButtonGap = legendModel.get("selectorButtonGap", true); + var orientIdx = legendModel.getOrient().index; + var wh = orientIdx === 0 ? "width" : "height"; + var hw = orientIdx === 0 ? "height" : "width"; + var yx = orientIdx === 0 ? "y" : "x"; + if (selectorPosition === "end") { + selectorPos[orientIdx] += contentRect[wh] + selectorButtonGap; + } else { + contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap; + } + selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2; + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + var mainRect = { + x: 0, + y: 0 + }; + mainRect[wh] = contentRect[wh] + selectorButtonGap + selectorRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(0, selectorRect[yx] + selectorPos[1 - orientIdx]); + return mainRect; + } else { + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + return this.group.getBoundingRect(); + } + }; + LegendView2.prototype.remove = function() { + this.getContentGroup().removeAll(); + this._isFirstRender = true; + }; + LegendView2.type = "legend.plain"; + return LegendView2; + }(ComponentView) +); +function getLegendStyle(iconType, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api) { + function handleCommonProps(style, visualStyle) { + if (style.lineWidth === "auto") { + style.lineWidth = visualStyle.lineWidth > 0 ? 2 : 0; + } + each(style, function(propVal, propName) { + style[propName] === "inherit" && (style[propName] = visualStyle[propName]); + }); + } + var itemStyleModel = legendItemModel.getModel("itemStyle"); + var itemStyle = itemStyleModel.getItemStyle(); + var iconBrushType = iconType.lastIndexOf("empty", 0) === 0 ? "fill" : "stroke"; + var decalStyle = itemStyleModel.getShallow("decal"); + itemStyle.decal = !decalStyle || decalStyle === "inherit" ? itemVisualStyle.decal : createOrUpdatePatternFromDecal(decalStyle, api); + if (itemStyle.fill === "inherit") { + itemStyle.fill = itemVisualStyle[drawType]; + } + if (itemStyle.stroke === "inherit") { + itemStyle.stroke = itemVisualStyle[iconBrushType]; + } + if (itemStyle.opacity === "inherit") { + itemStyle.opacity = (drawType === "fill" ? itemVisualStyle : lineVisualStyle).opacity; + } + handleCommonProps(itemStyle, itemVisualStyle); + var legendLineModel = legendItemModel.getModel("lineStyle"); + var lineStyle = legendLineModel.getLineStyle(); + handleCommonProps(lineStyle, lineVisualStyle); + itemStyle.fill === "auto" && (itemStyle.fill = itemVisualStyle.fill); + itemStyle.stroke === "auto" && (itemStyle.stroke = itemVisualStyle.fill); + lineStyle.stroke === "auto" && (lineStyle.stroke = itemVisualStyle.fill); + if (!isSelected) { + var borderWidth = legendItemModel.get("inactiveBorderWidth"); + var visualHasBorder = itemStyle[iconBrushType]; + itemStyle.lineWidth = borderWidth === "auto" ? itemVisualStyle.lineWidth > 0 && visualHasBorder ? 2 : 0 : itemStyle.lineWidth; + itemStyle.fill = legendItemModel.get("inactiveColor"); + itemStyle.stroke = legendItemModel.get("inactiveBorderColor"); + lineStyle.stroke = legendLineModel.get("inactiveColor"); + lineStyle.lineWidth = legendLineModel.get("inactiveWidth"); + } + return { + itemStyle, + lineStyle + }; +} +function getDefaultLegendIcon(opt) { + var symboType = opt.icon || "roundRect"; + var icon = createSymbol(symboType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill, opt.symbolKeepAspect); + icon.setStyle(opt.itemStyle); + icon.rotation = (opt.iconRotate || 0) * Math.PI / 180; + icon.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); + if (symboType.indexOf("empty") > -1) { + icon.style.stroke = icon.style.fill; + icon.style.fill = "#fff"; + icon.style.lineWidth = 2; + } + return icon; +} +function dispatchSelectAction(seriesName, dataName, api, excludeSeriesId) { + dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId); + api.dispatchAction({ + type: "legendToggleSelect", + name: seriesName != null ? seriesName : dataName + }); + dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId); +} +function isUseHoverLayer(api) { + var list = api.getZr().storage.getDisplayList(); + var emphasisState; + var i = 0; + var len = list.length; + while (i < len && !(emphasisState = list[i].states.emphasis)) { + i++; + } + return emphasisState && emphasisState.hoverLayer; +} +function dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) { + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: "highlight", + seriesName, + name: dataName, + excludeSeriesId + }); + } +} +function dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) { + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: "downplay", + seriesName, + name: dataName, + excludeSeriesId + }); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +function legendFilter(ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (legendModels && legendModels.length) { + ecModel.filterSeries(function (series) { + // If in any legend component the status is not selected. + // Because in legend series is assumed selected when it is not in the legend data. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(series.name)) { + return false; + } + } + return true; + }); + } +} + +function legendSelectActionHandler(methodName, payload, ecModel) { + var isAllSelect = methodName === 'allSelect' || methodName === 'inverseSelect'; + var selectedMap = {}; + var actionLegendIndices = []; + ecModel.eachComponent({ + mainType: 'legend', + query: payload + }, function (legendModel) { + if (isAllSelect) { + legendModel[methodName](); + } else { + legendModel[methodName](payload.name); + } + makeSelectedMap(legendModel, selectedMap); + actionLegendIndices.push(legendModel.componentIndex); + }); + var allSelectedMap = {}; + // make selectedMap from all legend components + ecModel.eachComponent('legend', function (legendModel) { + each$4(selectedMap, function (isSelected, name) { + // Force other legend has same selected status + // Or the first is toggled to true and other are toggled to false + // In the case one legend has some item unSelected in option. And if other legend + // doesn't has the item, they will assume it is selected. + legendModel[isSelected ? 'select' : 'unSelect'](name); + }); + makeSelectedMap(legendModel, allSelectedMap); + }); + // Return the event explicitly + return isAllSelect ? { + selected: allSelectedMap, + // return legendIndex array to tell the developers which legends are allSelect / inverseSelect + legendIndex: actionLegendIndices + } : { + name: payload.name, + selected: allSelectedMap + }; +} +function makeSelectedMap(legendModel, out) { + var selectedMap = out || {}; + each$4(legendModel.getData(), function (model) { + var name = model.get('name'); + // Wrap element + if (name === '\n' || name === '') { + return; + } + var isItemSelected = legendModel.isSelected(name); + if (hasOwn(selectedMap, name)) { + // Unselected if any legend is unselected + selectedMap[name] = selectedMap[name] && isItemSelected; + } else { + selectedMap[name] = isItemSelected; + } + }); + return selectedMap; +} +function installLegendAction(registers) { + /** + * @event legendToggleSelect + * @type {Object} + * @property {string} type 'legendToggleSelect' + * @property {string} [from] + * @property {string} name Series name or data item name + */ + registers.registerAction('legendToggleSelect', 'legendselectchanged', curry$1(legendSelectActionHandler, 'toggleSelected')); + registers.registerAction('legendAllSelect', 'legendselectall', curry$1(legendSelectActionHandler, 'allSelect')); + registers.registerAction('legendInverseSelect', 'legendinverseselect', curry$1(legendSelectActionHandler, 'inverseSelect')); + /** + * @event legendSelect + * @type {Object} + * @property {string} type 'legendSelect' + * @property {string} name Series name or data item name + */ + registers.registerAction('legendSelect', 'legendselected', curry$1(legendSelectActionHandler, 'select')); + /** + * @event legendUnSelect + * @type {Object} + * @property {string} type 'legendUnSelect' + * @property {string} name Series name or data item name + */ + registers.registerAction('legendUnSelect', 'legendunselected', curry$1(legendSelectActionHandler, 'unSelect')); +} + +function install$2(registers) { + registers.registerComponentModel(LegendModel); + registers.registerComponentView(LegendView); + registers.registerProcessor(registers.PRIORITY.PROCESSOR.SERIES_FILTER, legendFilter); + registers.registerSubTypeDefaulter('legend', function () { + return 'plain'; + }); + installLegendAction(registers); +} + +var ScrollableLegendModel = /** @class */function (_super) { + __extends(ScrollableLegendModel, _super); + function ScrollableLegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = ScrollableLegendModel.type; + return _this; + } + /** + * @param {number} scrollDataIndex + */ + ScrollableLegendModel.prototype.setScrollDataIndex = function (scrollDataIndex) { + this.option.scrollDataIndex = scrollDataIndex; + }; + ScrollableLegendModel.prototype.init = function (option, parentModel, ecModel) { + var inputPositionParams = getLayoutParams(option); + _super.prototype.init.call(this, option, parentModel, ecModel); + mergeAndNormalizeLayoutParams(this, option, inputPositionParams); + }; + /** + * @override + */ + ScrollableLegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + mergeAndNormalizeLayoutParams(this, this.option, option); + }; + ScrollableLegendModel.type = 'legend.scroll'; + ScrollableLegendModel.defaultOption = inheritDefaultOption(LegendModel.defaultOption, { + scrollDataIndex: 0, + pageButtonItemGap: 5, + pageButtonGap: null, + pageButtonPosition: 'end', + pageFormatter: '{current}/{total}', + pageIcons: { + horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'], + vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z'] + }, + pageIconColor: '#2f4554', + pageIconInactiveColor: '#aaa', + pageIconSize: 15, + pageTextStyle: { + color: '#333' + }, + animationDurationUpdate: 800 + }); + return ScrollableLegendModel; +}(LegendModel); +// Do not `ignoreSize` to enable setting {left: 10, right: 10}. +function mergeAndNormalizeLayoutParams(legendModel, target, raw) { + var orient = legendModel.getOrient(); + var ignoreSize = [1, 1]; + ignoreSize[orient.index] = 0; + mergeLayoutParam(target, raw, { + type: 'box', + ignoreSize: !!ignoreSize + }); +} + +var Group = Group$2; +var WH = ['width', 'height']; +var XY = ['x', 'y']; +var ScrollableLegendView = /** @class */function (_super) { + __extends(ScrollableLegendView, _super); + function ScrollableLegendView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = ScrollableLegendView.type; + _this.newlineDisabled = true; + _this._currentIndex = 0; + return _this; + } + ScrollableLegendView.prototype.init = function () { + _super.prototype.init.call(this); + this.group.add(this._containerGroup = new Group()); + this._containerGroup.add(this.getContentGroup()); + this.group.add(this._controllerGroup = new Group()); + }; + /** + * @override + */ + ScrollableLegendView.prototype.resetInner = function () { + _super.prototype.resetInner.call(this); + this._controllerGroup.removeAll(); + this._containerGroup.removeClipPath(); + this._containerGroup.__rectSize = null; + }; + /** + * @override + */ + ScrollableLegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var self = this; + // Render content items. + _super.prototype.renderInner.call(this, itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); + var controllerGroup = this._controllerGroup; + // FIXME: support be 'auto' adapt to size number text length, + // e.g., '3/12345' should not overlap with the control arrow button. + var pageIconSize = legendModel.get('pageIconSize', true); + var pageIconSizeArr = isArray(pageIconSize) ? pageIconSize : [pageIconSize, pageIconSize]; + createPageButton('pagePrev', 0); + var pageTextStyleModel = legendModel.getModel('pageTextStyle'); + controllerGroup.add(new ZRText({ + name: 'pageText', + style: { + // Placeholder to calculate a proper layout. + text: 'xx/xx', + fill: pageTextStyleModel.getTextColor(), + font: pageTextStyleModel.getFont(), + verticalAlign: 'middle', + align: 'center' + }, + silent: true + })); + createPageButton('pageNext', 1); + function createPageButton(name, iconIdx) { + var pageDataIndexName = name + 'DataIndex'; + var icon = createIcon(legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx], { + // Buttons will be created in each render, so we do not need + // to worry about avoiding using legendModel kept in scope. + onclick: bind$1(self._pageGo, self, pageDataIndexName, legendModel, api) + }, { + x: -pageIconSizeArr[0] / 2, + y: -pageIconSizeArr[1] / 2, + width: pageIconSizeArr[0], + height: pageIconSizeArr[1] + }); + icon.name = name; + controllerGroup.add(icon); + } + }; + /** + * @override + */ + ScrollableLegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + var orientIdx = legendModel.getOrient().index; + var wh = WH[orientIdx]; + var xy = XY[orientIdx]; + var hw = WH[1 - orientIdx]; + var yx = XY[1 - orientIdx]; + selector && box( + // Buttons in selectorGroup always layout horizontally + 'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); + var selectorButtonGap = legendModel.get('selectorButtonGap', true); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var processMaxSize = clone$2(maxSize); + selector && (processMaxSize[wh] = maxSize[wh] - selectorRect[wh] - selectorButtonGap); + var mainRect = this._layoutContentAndController(legendModel, isFirstRender, processMaxSize, orientIdx, wh, hw, yx, xy); + if (selector) { + if (selectorPosition === 'end') { + selectorPos[orientIdx] += mainRect[wh] + selectorButtonGap; + } else { + var offset = selectorRect[wh] + selectorButtonGap; + selectorPos[orientIdx] -= offset; + mainRect[xy] -= offset; + } + mainRect[wh] += selectorRect[wh] + selectorButtonGap; + selectorPos[1 - orientIdx] += mainRect[yx] + mainRect[hw] / 2 - selectorRect[hw] / 2; + mainRect[hw] = Math.max(mainRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(mainRect[yx], selectorRect[yx] + selectorPos[1 - orientIdx]); + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + selectorGroup.markRedraw(); + } + return mainRect; + }; + ScrollableLegendView.prototype._layoutContentAndController = function (legendModel, isFirstRender, maxSize, orientIdx, wh, hw, yx, xy) { + var contentGroup = this.getContentGroup(); + var containerGroup = this._containerGroup; + var controllerGroup = this._controllerGroup; + // Place items in contentGroup. + box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), !orientIdx ? null : maxSize.width, orientIdx ? null : maxSize.height); + box( + // Buttons in controller are layout always horizontally. + 'horizontal', controllerGroup, legendModel.get('pageButtonItemGap', true)); + var contentRect = contentGroup.getBoundingRect(); + var controllerRect = controllerGroup.getBoundingRect(); + var showController = this._showController = contentRect[wh] > maxSize[wh]; + // In case that the inner elements of contentGroup layout do not based on [0, 0] + var contentPos = [-contentRect.x, -contentRect.y]; + // Remain contentPos when scroll animation perfroming. + // If first rendering, `contentGroup.position` is [0, 0], which + // does not make sense and may cause unexepcted animation if adopted. + if (!isFirstRender) { + contentPos[orientIdx] = contentGroup[xy]; + } + // Layout container group based on 0. + var containerPos = [0, 0]; + var controllerPos = [-controllerRect.x, -controllerRect.y]; + var pageButtonGap = retrieve2(legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true)); + // Place containerGroup and controllerGroup and contentGroup. + if (showController) { + var pageButtonPosition = legendModel.get('pageButtonPosition', true); + // controller is on the right / bottom. + if (pageButtonPosition === 'end') { + controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh]; + } + // controller is on the left / top. + else { + containerPos[orientIdx] += controllerRect[wh] + pageButtonGap; + } + } + // Always align controller to content as 'middle'. + controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2; + contentGroup.setPosition(contentPos); + containerGroup.setPosition(containerPos); + controllerGroup.setPosition(controllerPos); + // Calculate `mainRect` and set `clipPath`. + // mainRect should not be calculated by `this.group.getBoundingRect()` + // for sake of the overflow. + var mainRect = { + x: 0, + y: 0 + }; + // Consider content may be overflow (should be clipped). + mainRect[wh] = showController ? maxSize[wh] : contentRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]); + // `containerRect[yx] + containerPos[1 - orientIdx]` is 0. + mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]); + containerGroup.__rectSize = maxSize[wh]; + if (showController) { + var clipShape = { + x: 0, + y: 0 + }; + clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0); + clipShape[hw] = mainRect[hw]; + containerGroup.setClipPath(new Rect({ + shape: clipShape + })); + // Consider content may be larger than container, container rect + // can not be obtained from `containerGroup.getBoundingRect()`. + containerGroup.__rectSize = clipShape[wh]; + } else { + // Do not remove or ignore controller. Keep them set as placeholders. + controllerGroup.eachChild(function (child) { + child.attr({ + invisible: true, + silent: true + }); + }); + } + // Content translate animation. + var pageInfo = this._getPageInfo(legendModel); + pageInfo.pageIndex != null && updateProps$1(contentGroup, { + x: pageInfo.contentPosition[0], + y: pageInfo.contentPosition[1] + }, + // When switch from "show controller" to "not show controller", view should be + // updated immediately without animation, otherwise causes weird effect. + showController ? legendModel : null); + this._updatePageInfoView(legendModel, pageInfo); + return mainRect; + }; + ScrollableLegendView.prototype._pageGo = function (to, legendModel, api) { + var scrollDataIndex = this._getPageInfo(legendModel)[to]; + scrollDataIndex != null && api.dispatchAction({ + type: 'legendScroll', + scrollDataIndex: scrollDataIndex, + legendId: legendModel.id + }); + }; + ScrollableLegendView.prototype._updatePageInfoView = function (legendModel, pageInfo) { + var controllerGroup = this._controllerGroup; + each$4(['pagePrev', 'pageNext'], function (name) { + var key = name + 'DataIndex'; + var canJump = pageInfo[key] != null; + var icon = controllerGroup.childOfName(name); + if (icon) { + icon.setStyle('fill', canJump ? legendModel.get('pageIconColor', true) : legendModel.get('pageIconInactiveColor', true)); + icon.cursor = canJump ? 'pointer' : 'default'; + } + }); + var pageText = controllerGroup.childOfName('pageText'); + var pageFormatter = legendModel.get('pageFormatter'); + var pageIndex = pageInfo.pageIndex; + var current = pageIndex != null ? pageIndex + 1 : 0; + var total = pageInfo.pageCount; + pageText && pageFormatter && pageText.setStyle('text', isString(pageFormatter) ? pageFormatter.replace('{current}', current == null ? '' : current + '').replace('{total}', total == null ? '' : total + '') : pageFormatter({ + current: current, + total: total + })); + }; + /** + * contentPosition: Array., null when data item not found. + * pageIndex: number, null when data item not found. + * pageCount: number, always be a number, can be 0. + * pagePrevDataIndex: number, null when no previous page. + * pageNextDataIndex: number, null when no next page. + * } + */ + ScrollableLegendView.prototype._getPageInfo = function (legendModel) { + var scrollDataIndex = legendModel.get('scrollDataIndex', true); + var contentGroup = this.getContentGroup(); + var containerRectSize = this._containerGroup.__rectSize; + var orientIdx = legendModel.getOrient().index; + var wh = WH[orientIdx]; + var xy = XY[orientIdx]; + var targetItemIndex = this._findTargetItemIndex(scrollDataIndex); + var children = contentGroup.children(); + var targetItem = children[targetItemIndex]; + var itemCount = children.length; + var pCount = !itemCount ? 0 : 1; + var result = { + contentPosition: [contentGroup.x, contentGroup.y], + pageCount: pCount, + pageIndex: pCount - 1, + pagePrevDataIndex: null, + pageNextDataIndex: null + }; + if (!targetItem) { + return result; + } + var targetItemInfo = getItemInfo(targetItem); + result.contentPosition[orientIdx] = -targetItemInfo.s; + // Strategy: + // (1) Always align based on the left/top most item. + // (2) It is user-friendly that the last item shown in the + // current window is shown at the begining of next window. + // Otherwise if half of the last item is cut by the window, + // it will have no chance to display entirely. + // (3) Consider that item size probably be different, we + // have calculate pageIndex by size rather than item index, + // and we can not get page index directly by division. + // (4) The window is to narrow to contain more than + // one item, we should make sure that the page can be fliped. + for (var i = targetItemIndex + 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i <= itemCount; ++i) { + currItemInfo = getItemInfo(children[i]); + if ( + // Half of the last item is out of the window. + !currItemInfo && winEndItemInfo.e > winStartItemInfo.s + containerRectSize + // If the current item does not intersect with the window, the new page + // can be started at the current item or the last item. + || currItemInfo && !intersect(currItemInfo, winStartItemInfo.s)) { + if (winEndItemInfo.i > winStartItemInfo.i) { + winStartItemInfo = winEndItemInfo; + } else { + // e.g., when page size is smaller than item size. + winStartItemInfo = currItemInfo; + } + if (winStartItemInfo) { + if (result.pageNextDataIndex == null) { + result.pageNextDataIndex = winStartItemInfo.i; + } + ++result.pageCount; + } + } + winEndItemInfo = currItemInfo; + } + for (var i = targetItemIndex - 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i >= -1; --i) { + currItemInfo = getItemInfo(children[i]); + if ( + // If the the end item does not intersect with the window started + // from the current item, a page can be settled. + (!currItemInfo || !intersect(winEndItemInfo, currItemInfo.s) + // e.g., when page size is smaller than item size. + ) && winStartItemInfo.i < winEndItemInfo.i) { + winEndItemInfo = winStartItemInfo; + if (result.pagePrevDataIndex == null) { + result.pagePrevDataIndex = winStartItemInfo.i; + } + ++result.pageCount; + ++result.pageIndex; + } + winStartItemInfo = currItemInfo; + } + return result; + function getItemInfo(el) { + if (el) { + var itemRect = el.getBoundingRect(); + var start = itemRect[xy] + el[xy]; + return { + s: start, + e: start + itemRect[wh], + i: el.__legendDataIndex + }; + } + } + function intersect(itemInfo, winStart) { + return itemInfo.e >= winStart && itemInfo.s <= winStart + containerRectSize; + } + }; + ScrollableLegendView.prototype._findTargetItemIndex = function (targetDataIndex) { + if (!this._showController) { + return 0; + } + var index; + var contentGroup = this.getContentGroup(); + var defaultIndex; + contentGroup.eachChild(function (child, idx) { + var legendDataIdx = child.__legendDataIndex; + // FIXME + // If the given targetDataIndex (from model) is illegal, + // we use defaultIndex. But the index on the legend model and + // action payload is still illegal. That case will not be + // changed until some scenario requires. + if (defaultIndex == null && legendDataIdx != null) { + defaultIndex = idx; + } + if (legendDataIdx === targetDataIndex) { + index = idx; + } + }); + return index != null ? index : defaultIndex; + }; + ScrollableLegendView.type = 'legend.scroll'; + return ScrollableLegendView; +}(LegendView); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +function installScrollableLegendAction(registers) { + /** + * @event legendScroll + * @type {Object} + * @property {string} type 'legendScroll' + * @property {string} scrollDataIndex + */ + registers.registerAction('legendScroll', 'legendscroll', function (payload, ecModel) { + var scrollDataIndex = payload.scrollDataIndex; + scrollDataIndex != null && ecModel.eachComponent({ + mainType: 'legend', + subType: 'scroll', + query: payload + }, function (legendModel) { + legendModel.setScrollDataIndex(scrollDataIndex); + }); + }); +} + +function install$1(registers) { + use(install$2); + registers.registerComponentModel(ScrollableLegendModel); + registers.registerComponentView(ScrollableLegendView); + installScrollableLegendAction(registers); +} + +function install(registers) { + use(install$2); + use(install$1); +} + +const {resolveComponent:_resolveComponent,createVNode:_createVNode,openBlock:_openBlock,createElementBlock:_createElementBlock,createCommentVNode:_createCommentVNode,unref:_unref,renderList:_renderList,Fragment:_Fragment,toDisplayString:_toDisplayString,createTextVNode:_createTextVNode,withCtx:_withCtx,createElementVNode:_createElementVNode,createSlots:_createSlots,createBlock:_createBlock} = await importShared('vue'); + + +const _hoisted_1 = { class: "dashboard-widget" }; +const _hoisted_2 = { class: "dashboard-content" }; +const _hoisted_3 = { + key: 0, + class: "d-flex justify-center align-center py-4" +}; +const _hoisted_4 = { key: 1 }; +const _hoisted_5 = { + key: 0, + class: "chart-container" +}; +const _hoisted_6 = { class: "text-caption" }; +const _hoisted_7 = { + key: 0, + class: "d-flex justify-center align-center py-4" +}; +const _hoisted_8 = { key: 1 }; +const _hoisted_9 = { + key: 0, + class: "chart-container" +}; +const _hoisted_10 = { class: "text-caption" }; + +const {ref,computed,onMounted,onUnmounted} = await importShared('vue'); + +// 注册ECharts组件 + +const _sfc_main = { + __name: 'Dashboard', + props: { + config: { + type: Object, + default: () => ({}), + }, + allowRefresh: { + type: Boolean, + default: true, + }, +}, + setup(__props) { + +try { + use([install$a, install$9, install$8, install$5, install$4, install, install$3]); +} catch (e) { + console.warn('ECharts components registration failed', e); +} + +// 接收仪表板配置 +const props = __props; + +// 组件状态 +const loading = ref(true); +const items = ref([]); +const chartData = ref(null); +let refreshTimer = null; + +// 获取状态图标 +function getStatusIcon(status) { + const icons = { + 'success': 'mdi-check-circle', + 'warning': 'mdi-alert', + 'error': 'mdi-alert-circle', + 'info': 'mdi-information', + 'running': 'mdi-play-circle', + 'pending': 'mdi-clock-outline', + 'completed': 'mdi-check-circle-outline', + }; + return icons[status] || 'mdi-help-circle' +} + +// 获取状态颜色 +function getStatusColor(status) { + const colors = { + 'success': 'success', + 'warning': 'warning', + 'error': 'error', + 'info': 'info', + 'running': 'primary', + 'pending': 'secondary', + 'completed': 'success', + }; + return colors[status] || 'grey' +} + +// 图表选项 +const chartOptions = computed(() => { + if (!chartData.value) return {} + + const { type, data } = chartData.value; + + if (type === 'line') { + return { + tooltip: { + trigger: 'axis', + }, + xAxis: { + type: 'category', + data: data.xAxis, + axisLabel: { + color: '#888', + }, + }, + yAxis: { + type: 'value', + axisLabel: { + color: '#888', + }, + }, + series: data.series.map(series => ({ + name: series.name, + type: 'line', + smooth: true, + data: series.data, + areaStyle: { opacity: 0.1 }, + })), + } + } + + if (type === 'pie') { + return { + tooltip: { + trigger: 'item', + formatter: '{a}
{b}: {c} ({d}%)', + }, + series: [ + { + name: data.name, + type: 'pie', + radius: ['40%', '70%'], + avoidLabelOverlap: false, + itemStyle: { + borderRadius: 10, + borderColor: '#fff', + borderWidth: 2, + }, + label: { + show: false, + position: 'center', + }, + emphasis: { + label: { + show: true, + fontSize: '12', + fontWeight: 'bold', + }, + }, + labelLine: { + show: false, + }, + data: data.items, + }, + ], + } + } + + return {} +}); + +// 获取仪表板数据 +async function fetchDashboardData() { + if (!props.allowRefresh) return + + loading.value = true; + + try { + // 模拟API调用 + await new Promise(resolve => setTimeout(resolve, 1000)); + + // 随机决定显示饼图或折线图 + const showPie = Math.random() > 0.5; + + if (showPie) { + // 饼图数据 + chartData.value = { + type: 'pie', + data: { + name: '文件分布', + items: [ + { value: Math.floor(Math.random() * 50) + 30, name: '电影' }, + { value: Math.floor(Math.random() * 40) + 20, name: '电视剧' }, + { value: Math.floor(Math.random() * 30) + 10, name: '动漫' }, + { value: Math.floor(Math.random() * 20) + 5, name: '纪录片' }, + ], + }, + }; + } else { + // 折线图数据 + const days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']; + chartData.value = { + type: 'line', + data: { + xAxis: days, + series: [ + { + name: '下载量', + data: days.map(() => Math.floor(Math.random() * 10) + 1), + }, + { + name: '完成量', + data: days.map(() => Math.floor(Math.random() * 8) + 1), + }, + ], + }, + }; + } + + // 生成列表数据 + const statuses = ['success', 'warning', 'error', 'info', 'running', 'pending', 'completed']; + items.value = Array.from({ length: 5 }, (_, i) => { + const status = statuses[Math.floor(Math.random() * statuses.length)]; + return { + title: `项目 ${i + 1}`, + subtitle: `上次更新: ${new Date().toLocaleTimeString()}`, + status, + value: Math.floor(Math.random() * 100) + '%', + } + }); + } catch (error) { + console.error('获取仪表板数据失败:', error); + } finally { + loading.value = false; + } +} + +// 设置定时刷新 +function setupRefreshTimer() { + if (props.allowRefresh) { + // 每30秒刷新一次 + refreshTimer = setInterval(() => { + fetchDashboardData(); + }, 30000); + } +} + +// 初始化 +onMounted(() => { + fetchDashboardData(); + setupRefreshTimer(); +}); + +// 清理 +onUnmounted(() => { + if (refreshTimer) { + clearInterval(refreshTimer); + } +}); + +return (_ctx, _cache) => { + const _component_v_progress_circular = _resolveComponent("v-progress-circular"); + const _component_v_icon = _resolveComponent("v-icon"); + const _component_v_avatar = _resolveComponent("v-avatar"); + const _component_v_list_item = _resolveComponent("v-list-item"); + const _component_v_list = _resolveComponent("v-list"); + const _component_v_card_text = _resolveComponent("v-card-text"); + const _component_v_card = _resolveComponent("v-card"); + const _component_v_card_title = _resolveComponent("v-card-title"); + const _component_v_card_subtitle = _resolveComponent("v-card-subtitle"); + const _component_v_card_item = _resolveComponent("v-card-item"); + + return (_openBlock(), _createElementBlock("div", _hoisted_1, [ + (!__props.config?.attrs?.border) + ? (_openBlock(), _createBlock(_component_v_card, { + key: 0, + flat: "" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_card_text, { class: "pa-0" }, { + default: _withCtx(() => [ + _createElementVNode("div", _hoisted_2, [ + (loading.value) + ? (_openBlock(), _createElementBlock("div", _hoisted_3, [ + _createVNode(_component_v_progress_circular, { + indeterminate: "", + color: "primary" + }) + ])) + : (_openBlock(), _createElementBlock("div", _hoisted_4, [ + (chartData.value) + ? (_openBlock(), _createElementBlock("div", _hoisted_5, [ + _createVNode(_unref(H), { + class: "chart", + option: chartOptions.value, + autoresize: "" + }, null, 8, ["option"]) + ])) + : _createCommentVNode("", true), + (items.value.length) + ? (_openBlock(), _createBlock(_component_v_list, { + key: 1, + density: "compact", + class: "py-0" + }, { + default: _withCtx(() => [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(items.value, (item, index) => { + return (_openBlock(), _createBlock(_component_v_list_item, { + key: index, + title: item.title, + subtitle: item.subtitle + }, _createSlots({ + prepend: _withCtx(() => [ + _createVNode(_component_v_avatar, { + color: getStatusColor(item.status), + size: "small" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { + size: "small", + color: "white" + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(getStatusIcon(item.status)), 1) + ]), + _: 2 + }, 1024) + ]), + _: 2 + }, 1032, ["color"]) + ]), + _: 2 + }, [ + (item.value) + ? { + name: "append", + fn: _withCtx(() => [ + _createElementVNode("span", _hoisted_6, _toDisplayString(item.value), 1) + ]), + key: "0" + } + : undefined + ]), 1032, ["title", "subtitle"])) + }), 128)) + ]), + _: 1 + })) + : _createCommentVNode("", true) + ])) + ]) + ]), + _: 1 + }) + ]), + _: 1 + })) + : (_openBlock(), _createBlock(_component_v_card, { key: 1 }, { + default: _withCtx(() => [ + _createVNode(_component_v_card_item, null, { + default: _withCtx(() => [ + _createVNode(_component_v_card_title, null, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(__props.config?.attrs?.title || '仪表板组件'), 1) + ]), + _: 1 + }), + (__props.config?.attrs?.subtitle) + ? (_openBlock(), _createBlock(_component_v_card_subtitle, { key: 0 }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(__props.config.attrs.subtitle), 1) + ]), + _: 1 + })) + : _createCommentVNode("", true) + ]), + _: 1 + }), + _createVNode(_component_v_card_text, null, { + default: _withCtx(() => [ + (loading.value) + ? (_openBlock(), _createElementBlock("div", _hoisted_7, [ + _createVNode(_component_v_progress_circular, { + indeterminate: "", + color: "primary" + }) + ])) + : (_openBlock(), _createElementBlock("div", _hoisted_8, [ + (chartData.value) + ? (_openBlock(), _createElementBlock("div", _hoisted_9, [ + _createVNode(_unref(H), { + class: "chart", + option: chartOptions.value, + autoresize: "" + }, null, 8, ["option"]) + ])) + : _createCommentVNode("", true), + (items.value.length) + ? (_openBlock(), _createBlock(_component_v_list, { + key: 1, + density: "compact", + class: "rounded pa-0" + }, { + default: _withCtx(() => [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(items.value, (item, index) => { + return (_openBlock(), _createBlock(_component_v_list_item, { + key: index, + title: item.title, + subtitle: item.subtitle + }, _createSlots({ + prepend: _withCtx(() => [ + _createVNode(_component_v_avatar, { + color: getStatusColor(item.status), + size: "small" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { + size: "small", + color: "white" + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(getStatusIcon(item.status)), 1) + ]), + _: 2 + }, 1024) + ]), + _: 2 + }, 1032, ["color"]) + ]), + _: 2 + }, [ + (item.value) + ? { + name: "append", + fn: _withCtx(() => [ + _createElementVNode("span", _hoisted_10, _toDisplayString(item.value), 1) + ]), + key: "0" + } + : undefined + ]), 1032, ["title", "subtitle"])) + }), 128)) + ]), + _: 1 + })) + : _createCommentVNode("", true) + ])) + ]), + _: 1 + }) + ]), + _: 1 + })) + ])) +} +} + +}; + +export { _sfc_main as default }; diff --git a/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Page-Bl7XNZ7k.css b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Page-Bl7XNZ7k.css new file mode 100644 index 0000000..e359222 --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Page-Bl7XNZ7k.css @@ -0,0 +1,48 @@ + +.plugin-page[data-v-d5e502a5] { + max-width: 1200px; + margin: 0 auto; +} + +/* 使卡片等宽并适应移动端 */ +.d-flex.flex-wrap[data-v-d5e502a5] { + gap: 16px; +} +.url-display[data-v-d5e502a5] { + word-break: break-all; + padding: 8px; + background: rgba(0, 0, 0, 0.05); + border-radius: 4px; +} + +/* 移动端堆叠布局 */ +@media (max-width: 768px) { +.d-flex.flex-wrap[data-v-d5e502a5] { + flex-direction: column; +} +} + +/* Add visual distinction between sections */ +.ruleset-section[data-v-d5e502a5] { + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 16px; + background-color: #f5f5f5; +} +.top-section[data-v-d5e502a5] { + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 16px; + background-color: #f9f9f9; +} + +/* Optional: Add different border colors to further distinguish */ +.ruleset-section[data-v-d5e502a5] { + border-left: 4px solid #2196F3; /* Blue accent */ +} +.top-section[data-v-d5e502a5] { + border-left: 4px solid #4CAF50; /* Green accent */ +} +.drag-handle[data-v-d5e502a5] { + cursor: move; +} diff --git a/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Page-DlQgf7u6.js b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Page-DlQgf7u6.js new file mode 100644 index 0000000..594a5fd --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/__federation_expose_Page-DlQgf7u6.js @@ -0,0 +1,1118 @@ +import { importShared } from './__federation_fn_import-JrT3xvdd.js'; +import { _ as _export_sfc } from './_plugin-vue_export-helper-pcqpp-6-.js'; + +const {createTextVNode:_createTextVNode,resolveComponent:_resolveComponent,withCtx:_withCtx,createVNode:_createVNode,toDisplayString:_toDisplayString,openBlock:_openBlock,createBlock:_createBlock,createCommentVNode:_createCommentVNode,createElementVNode:_createElementVNode,renderList:_renderList,Fragment:_Fragment,createElementBlock:_createElementBlock,withModifiers:_withModifiers,normalizeClass:_normalizeClass} = await importShared('vue'); + + +const _hoisted_1 = { class: "plugin-page" }; +const _hoisted_2 = { key: 2 }; +const _hoisted_3 = { class: "mb-6" }; +const _hoisted_4 = { class: "d-flex justify-space-between align-center mb-4" }; +const _hoisted_5 = ["onDragstart", "onDragover", "onDrop"]; +const _hoisted_6 = { class: "mb-6" }; +const _hoisted_7 = { class: "d-flex justify-space-between align-center mb-4" }; +const _hoisted_8 = ["onDragstart", "onDragover", "onDrop"]; +const _hoisted_9 = { class: "d-flex justify-space-between mb-2" }; +const _hoisted_10 = { class: "d-flex justify-space-between mb-2" }; +const _hoisted_11 = { class: "d-flex justify-space-between text-caption text-grey" }; +const _hoisted_12 = { class: "d-flex justify-space-between align-center mb-2" }; +const _hoisted_13 = { + key: 0, + class: "url-display" +}; +const _hoisted_14 = ["href"]; +const _hoisted_15 = { + key: 1, + class: "text-grey" +}; + +const {ref,onMounted,computed} = await importShared('vue'); + + + +const _sfc_main = { + __name: 'Page', + props: { + model: { + type: Object, + default: () => { + }, + }, + api: { + type: Object, + default: () => { + }, + }, +}, + emits: ['action', 'switch', 'close'], + setup(__props, { emit: __emit }) { + +const expansionPanels = ref(null); +const snackbar = ref({ + show: false, + message: '', + color: 'success' +}); +const dragItem = ref(null); +// 添加自定义出站状态 +const customOutbounds = ref([]); +const additionalParamOptions = ref([ + {title: '无', value: ''}, + {title: 'no-resolve', value: 'no-resolve'}, + {title: 'src', value: 'src'} +]); +// 新增状态变量 +const subUrl = ref(''); + +function dragStart(event, priority, type = 'top') { + dragItem.value = {priority, type}; + event.dataTransfer.effectAllowed = 'move'; +} + +function dragOver(event, priority, type = 'top') { + event.preventDefault(); + const currentRules = type === 'top' ? rules.value : ruleset_rules.value; + // 高亮当前悬停行 + currentRules.forEach(rule => { + rule._isHovered = (rule.priority === priority); + }); +} + +async function drop(event, targetPriority, type = 'top') { + // 5. 调用 API 提交 + await props.api.put('/plugin/ClashRuleProvider/reorder-rules', { + moved_priority: dragItem.value.priority, + target_priority: targetPriority, + rule_data: dragItem.value, + type: type + }); + await refreshData(); // 失败时恢复数据 + dragItem.value = null; +} + +// 接收初始配置 +const props = __props; + +// 组件状态 +const loading = ref(true); +const error = ref(null); +const rules = ref([]); +const ruleset_rules = ref([]); +const status = ref('running'); +const rulesetPrefix = ref('Custom_'); +const lastUpdated = ref(''); +const updatingSubscription = ref(false); +const subscriptionUrl = ref(''); + +// 规则编辑相关状态 +const ruleDialog = ref(false); +const editingPriority = ref(null); +const editingType = ref('top'); // 记录当前编辑的规则类型('top' 或 'ruleset') +const newRule = ref({ + type: 'DOMAIN-SUFFIX', + payload: '', + action: 'DIRECT', + additional_params: '', + priority: 0 +}); + +// 排序后的规则 +const sortedRules = computed(() => [...rules.value].sort((a, b) => a.priority - b.priority)); +const sortedRulesetRules = computed(() => [...ruleset_rules.value].sort((a, b) => a.priority - b.priority)); +const showAdditionalParams = computed(() => { + return ['IP-CIDR', 'IP-CIDR6', 'IP-ASN', 'GEOIP'].includes(newRule.value.type); +}); +const ruleProviders = ref([]); +const ruleProviderNames = computed(() => Object.keys(ruleProviders.value)); +// 规则类型和动作选项 +const ruleTypes = computed(() => { + const allTypes = [ + 'DOMAIN', 'DOMAIN-SUFFIX', 'DOMAIN-KEYWORD', 'DOMAIN-REGEX', 'GEOSITE', + 'IP-CIDR', 'IP-CIDR6', 'IP-SUFFIX', 'IP-ASN', 'GEOIP', + 'SRC-GEOIP', 'SRC-IP-ASN', 'SRC-IP-CIDR', 'SRC-IP-SUFFIX', + 'DST-PORT', 'SRC-PORT', 'IN-PORT', 'IN-TYPE', 'IN-USER', 'IN-NAME', + 'PROCESS-PATH', 'PROCESS-PATH-REGEX', 'PROCESS-NAME', 'PROCESS-NAME-REGEX', + 'UID', 'NETWORK', 'DSCP', 'RULE-SET', 'AND', 'OR', 'NOT', 'SUB-RULE', 'MATCH' + ]; + + // 如果是 ruleset 规则,过滤掉 SUB-RULE 和 RULE-SET + if (editingType.value === 'ruleset') { + return allTypes.filter(type => !['SUB-RULE', 'RULE-SET'].includes(type)); + } + + return allTypes; +}); +// 修改actions为计算属性,合并内置动作和自定义出站 +const actions = computed(() => [ + 'DIRECT', 'REJECT', 'REJECT-DROP', 'PASS', 'COMPATIBLE', + ...customOutbounds.value.map(outbound => outbound.name) +]); +const subscriptionInfo = ref({ + download: 0, + upload: 0, + total: 0, + expire: 0, + last_update: 0, + used_percentage: 0, + rule_size: 0 +}); +// 自定义事件,用于通知主应用刷新数据 +const emit = __emit; + +// 格式化字节为易读单位(如 1.5 GB) +function formatBytes(bytes) { + if (bytes === 0) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; +} + +// 在工具函数中添加时间戳转换 +function formatTimestamp(timestamp) { + if (!timestamp) return 'N/A'; + const date = new Date(timestamp * 1000); // 注意:JS时间戳是毫秒,需乘以1000 + return date.toLocaleString(); // 或使用其他格式如 date.toISOString().split('T')[0] +} + +// 更新过期时间颜色判断(基于时间戳) +function getExpireColor(timestamp) { + if (!timestamp) return 'grey'; + const secondsLeft = timestamp - Math.floor(Date.now() / 1000); + const daysLeft = secondsLeft / 86400; + return daysLeft < 7 ? 'error' : daysLeft < 30 ? 'warning' : 'success'; +} + +// 复制功能 +function copyToClipboard(text) { + navigator.clipboard.writeText(text).then(() => { + snackbar.value = { + show: true, + message: '已复制到剪贴板', + color: 'success' + }; + }).catch(() => { + snackbar.value = { + show: true, + message: '复制失败', + color: 'error' + }; + }); +} + +// 计算已用流量百分比 +function calculatePercentage(download, total) { + return total > 0 ? Math.round((download / total) * 100) : 0; +} + +// 根据流量百分比获取颜色 +function getUsageColor(percentage) { + return percentage > 90 ? 'error' : percentage > 70 ? 'warning' : 'success'; +} + +// 获取动作对应的颜色 +function getActionColor(action) { + const colors = { + 'DIRECT': 'success', + 'REJECT': 'error', + 'REJECT-DROP': 'error', + 'PASS': 'warning', + 'COMPATIBLE': 'info' + }; + return colors[action] || 'primary' +} + +function isSystemRule(rule) { + return rule.payload?.startsWith(rulesetPrefix.value); +} + +// 打开添加规则对话框 +function openAddRuleDialog(type = 'top') { + editingPriority.value = null; + editingType.value = type; + const currentRules = type === 'top' ? sortedRules.value : sortedRulesetRules.value; + const nextPriority = currentRules.length > 0 + ? Math.max(...currentRules.map(r => r.priority)) + 1 + : 0; + + newRule.value = { + type: 'DOMAIN-SUFFIX', + payload: '', + action: 'DIRECT', + additional_params: '', + priority: nextPriority + }; + + ruleDialog.value = true; +} + +// 编辑规则 +function editRule(priority, type = 'top') { + editingType.value = type; // 记录当前编辑的类型 + const currentRules = type === 'top' ? sortedRules.value : sortedRulesetRules.value; + const rule = currentRules.find(r => r.priority === priority); + + if (rule) { + editingPriority.value = priority; + newRule.value = { + type: rule.type, + payload: rule.payload, + action: rule.action, + additional_params: rule.additional_params?.join(', ') || '', + priority: rule.priority + }; + ruleDialog.value = true; + } +} + +// 保存规则 +async function saveRule() { + try { + const requestData = { + type: editingType.value, // "top" 或 "ruleset" + rule_data: { + ...newRule.value, + additional_params: newRule.value.additional_params + ? newRule.value.additional_params.split(',').map(param => param.trim()).filter(param => param) + : [] + } + }; + + const method = editingPriority.value === null ? 'post' : 'put'; + await props.api[method]('/plugin/ClashRuleProvider/rule', requestData); + + ruleDialog.value = false; + await refreshData(); + + // 显示成功提示 + snackbar.value = { + show: true, + message: editingPriority.value === null ? '规则添加成功' : '规则更新成功', + color: 'success' + }; + } catch (err) { + console.error('保存规则失败:', err); + error.value = err.message || '保存规则失败'; + snackbar.value = { + show: true, + message: '保存规则失败: ' + (err.message || '未知错误'), + color: 'error' + }; + } +} + +// 删除规则 +async function deleteRule(priority, type = 'top') { + try { + await props.api.delete('/plugin/ClashRuleProvider/rule', { + data: { + type: type, // 规则类型 + priority: priority // 要删除的规则优先级 + } + }); + await refreshData(); + } catch (err) { + error.value = err.message || '删除规则失败'; + } +} + + +// 更新订阅 +async function updateSubscription() { + if (!subscriptionUrl.value) { + error.value = '请先输入订阅URL'; + return + } + + updatingSubscription.value = true; + try { + await props.api.put('plugin/ClashRuleProvider/subscription', { + url: subscriptionUrl.value + }); + // 显示成功提示 + snackbar.value = { + show: true, + message: '订阅更新成功', + color: 'success' + }; + await refreshData(); + } catch (err) { + console.error('更新订阅失败:', err); + error.value = err.message; + } finally { + updatingSubscription.value = false; + } +} + + +// 获取和刷新数据 +async function refreshData() { + loading.value = true; + error.value = null; + const wasPanelOpen = expansionPanels.value === (0); // 检查订阅面板是否展开 + try { + const state = await props.api.get('/plugin/ClashRuleProvider/status'); + status.value = state?.data?.state ? 'running' : 'disabled'; + subUrl.value = state?.data?.sub_url || ''; // 从API获取订阅URL + // 更新订阅信息 + if (state?.data?.subscription_info) { + subscriptionInfo.value = { + ...state.data.subscription_info, + used_percentage: calculatePercentage( + state.data.subscription_info.download, + state.data.subscription_info.total + ), + rule_size: state?.data?.clash?.rule_size + }; + } + rulesetPrefix.value = state?.data?.ruleset_prefix || 'Custom_'; + // 直接从响应中获取规则数组 + const response = await props.api.get('/plugin/ClashRuleProvider/rules?rule_type=top'); + rules.value = response?.data.rules || []; + + const response_ruleset = await props.api.get('/plugin/ClashRuleProvider/rules?rule_type=ruleset'); + ruleset_rules.value = response_ruleset?.data.rules || []; + + // 获取订阅信息 + const subscription = await props.api.get('/plugin/ClashRuleProvider/subscription'); + subscriptionUrl.value = subscription?.data.url; + // 获取自定义出站 + const outboundsResponse = await props.api.get('/plugin/ClashRuleProvider/clash_outbound'); + customOutbounds.value = outboundsResponse?.data.outbound || []; + + const providersResponse = await props.api.get('/plugin/ClashRuleProvider/rule_providers'); + ruleProviders.value = providersResponse?.data || {}; + + lastUpdated.value = new Date().toLocaleString(); + // 刷新后恢复面板状态 + if (wasPanelOpen && !(expansionPanels.value === 0)) { + expansionPanels.value = 0; + } + } catch (err) { + console.error('获取数据失败:', err); + error.value = err.message || '获取数据失败'; + status.value = 'error'; + } finally { + loading.value = false; + emit('action'); + } +} + +// 通知主应用切换到配置页面 +function notifySwitch() { + emit('switch'); +} + +// 通知主应用关闭组件 +function notifyClose() { + emit('close'); +} + +// 组件挂载时加载数据 +onMounted(() => { + refreshData(); +}); + +return (_ctx, _cache) => { + const _component_v_card_title = _resolveComponent("v-card-title"); + const _component_v_icon = _resolveComponent("v-icon"); + const _component_v_btn = _resolveComponent("v-btn"); + const _component_v_card_item = _resolveComponent("v-card-item"); + const _component_v_alert = _resolveComponent("v-alert"); + const _component_v_skeleton_loader = _resolveComponent("v-skeleton-loader"); + const _component_v_chip = _resolveComponent("v-chip"); + const _component_v_table = _resolveComponent("v-table"); + const _component_v_tooltip = _resolveComponent("v-tooltip"); + const _component_v_expansion_panel_title = _resolveComponent("v-expansion-panel-title"); + const _component_v_text_field = _resolveComponent("v-text-field"); + const _component_v_progress_linear = _resolveComponent("v-progress-linear"); + const _component_v_card_text = _resolveComponent("v-card-text"); + const _component_v_card = _resolveComponent("v-card"); + const _component_v_expansion_panel_text = _resolveComponent("v-expansion-panel-text"); + const _component_v_expansion_panel = _resolveComponent("v-expansion-panel"); + const _component_v_expansion_panels = _resolveComponent("v-expansion-panels"); + const _component_v_col = _resolveComponent("v-col"); + const _component_v_row = _resolveComponent("v-row"); + const _component_v_spacer = _resolveComponent("v-spacer"); + const _component_v_card_actions = _resolveComponent("v-card-actions"); + const _component_v_snackbar = _resolveComponent("v-snackbar"); + const _component_v_select = _resolveComponent("v-select"); + const _component_v_dialog = _resolveComponent("v-dialog"); + + return (_openBlock(), _createElementBlock("div", _hoisted_1, [ + _createVNode(_component_v_card, null, { + default: _withCtx(() => [ + _createVNode(_component_v_card_item, null, { + append: _withCtx(() => [ + _createVNode(_component_v_btn, { + icon: "", + color: "primary", + variant: "text", + onClick: notifyClose + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { left: "" }, { + default: _withCtx(() => _cache[15] || (_cache[15] = [ + _createTextVNode("mdi-close") + ])), + _: 1 + }) + ]), + _: 1 + }) + ]), + default: _withCtx(() => [ + _createVNode(_component_v_card_title, null, { + default: _withCtx(() => _cache[14] || (_cache[14] = [ + _createTextVNode("Clash Rule Provider") + ])), + _: 1 + }) + ]), + _: 1 + }), + _createVNode(_component_v_card_text, null, { + default: _withCtx(() => [ + (error.value) + ? (_openBlock(), _createBlock(_component_v_alert, { + key: 0, + type: "error", + class: "mb-4" + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(error.value), 1) + ]), + _: 1 + })) + : _createCommentVNode("", true), + (loading.value) + ? (_openBlock(), _createBlock(_component_v_skeleton_loader, { + key: 1, + type: "card" + })) + : (_openBlock(), _createElementBlock("div", _hoisted_2, [ + _createElementVNode("div", _hoisted_3, [ + _createElementVNode("div", _hoisted_4, [ + _cache[18] || (_cache[18] = _createElementVNode("div", { class: "text-h6" }, "规则集规则", -1)), + _createVNode(_component_v_btn, { + color: "primary", + onClick: _cache[0] || (_cache[0] = $event => (openAddRuleDialog('ruleset'))) + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { left: "" }, { + default: _withCtx(() => _cache[16] || (_cache[16] = [ + _createTextVNode("mdi-plus") + ])), + _: 1 + }), + _cache[17] || (_cache[17] = _createTextVNode(" 添加规则 ")) + ]), + _: 1 + }) + ]), + _createVNode(_component_v_table, { + density: "compact", + hover: "" + }, { + default: _withCtx(() => [ + _cache[22] || (_cache[22] = _createElementVNode("thead", null, [ + _createElementVNode("tr", null, [ + _createElementVNode("th", null, "优先级"), + _createElementVNode("th", null, "类型"), + _createElementVNode("th", null, "内容"), + _createElementVNode("th", null, "出站"), + _createElementVNode("th", null, "规则集"), + _createElementVNode("th", null, "操作") + ]) + ], -1)), + _createElementVNode("tbody", null, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(sortedRulesetRules.value, (rule) => { + return (_openBlock(), _createElementBlock("tr", { + key: rule.priority, + class: _normalizeClass({ 'bg-blue-lighten-5': rule._isHovered }), + draggable: "true", + onDragstart: $event => (dragStart($event, rule.priority, 'ruleset')), + onDragover: _withModifiers($event => (dragOver($event, rule.priority, 'ruleset')), ["prevent"]), + onDrop: $event => (drop($event, rule.priority, 'ruleset')) + }, [ + _createElementVNode("td", null, [ + _createVNode(_component_v_icon, { class: "drag-handle" }, { + default: _withCtx(() => _cache[19] || (_cache[19] = [ + _createTextVNode("mdi-drag") + ])), + _: 1 + }), + _createTextVNode(" " + _toDisplayString(rule.priority), 1) + ]), + _createElementVNode("td", null, _toDisplayString(rule.type), 1), + _createElementVNode("td", null, _toDisplayString(rule.payload), 1), + _createElementVNode("td", null, [ + _createVNode(_component_v_chip, { + color: getActionColor(rule.action), + size: "small" + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(rule.action), 1) + ]), + _: 2 + }, 1032, ["color"]) + ]), + _createElementVNode("td", null, _toDisplayString(rulesetPrefix.value) + _toDisplayString(rule.action), 1), + _createElementVNode("td", null, [ + _createVNode(_component_v_btn, { + icon: "", + size: "small", + color: "primary", + variant: "text", + onClick: $event => (editRule(rule.priority, 'ruleset')) + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, null, { + default: _withCtx(() => _cache[20] || (_cache[20] = [ + _createTextVNode("mdi-pencil") + ])), + _: 1 + }) + ]), + _: 2 + }, 1032, ["onClick"]), + _createVNode(_component_v_btn, { + icon: "", + size: "small", + color: "error", + variant: "text", + onClick: $event => (deleteRule(rule.priority, 'ruleset')) + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, null, { + default: _withCtx(() => _cache[21] || (_cache[21] = [ + _createTextVNode("mdi-delete") + ])), + _: 1 + }) + ]), + _: 2 + }, 1032, ["onClick"]) + ]) + ], 42, _hoisted_5)) + }), 128)) + ]) + ]), + _: 1 + }), + _cache[23] || (_cache[23] = _createElementVNode("div", { class: "text-caption text-grey mt-2" }, " *对规则集中规则的修改可以在Clash中立即生效。 ", -1)) + ]), + _createElementVNode("div", _hoisted_6, [ + _createElementVNode("div", _hoisted_7, [ + _cache[26] || (_cache[26] = _createElementVNode("div", { class: "text-h6" }, "置顶规则", -1)), + _createVNode(_component_v_btn, { + color: "primary", + onClick: _cache[1] || (_cache[1] = $event => (openAddRuleDialog('top'))) + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { left: "" }, { + default: _withCtx(() => _cache[24] || (_cache[24] = [ + _createTextVNode("mdi-plus") + ])), + _: 1 + }), + _cache[25] || (_cache[25] = _createTextVNode(" 添加规则 ")) + ]), + _: 1 + }) + ]), + _createVNode(_component_v_table, { + density: "compact", + hover: "" + }, { + default: _withCtx(() => [ + _cache[31] || (_cache[31] = _createElementVNode("thead", null, [ + _createElementVNode("tr", null, [ + _createElementVNode("th", null, "优先级"), + _createElementVNode("th", null, "类型"), + _createElementVNode("th", null, "内容"), + _createElementVNode("th", null, "出站"), + _createElementVNode("th", null, "操作") + ]) + ], -1)), + _createElementVNode("tbody", null, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(sortedRules.value, (rule) => { + return (_openBlock(), _createElementBlock("tr", { + key: rule.priority, + class: _normalizeClass({ 'bg-blue-lighten-5': rule._isHovered }), + draggable: "true", + onDragstart: $event => (dragStart($event, rule.priority, 'top')), + onDragover: _withModifiers($event => (dragOver($event, rule.priority, 'top')), ["prevent"]), + onDrop: $event => (drop($event, rule.priority, 'top')) + }, [ + _createElementVNode("td", null, [ + _createVNode(_component_v_icon, { class: "drag-handle" }, { + default: _withCtx(() => _cache[27] || (_cache[27] = [ + _createTextVNode("mdi-drag") + ])), + _: 1 + }), + _createTextVNode(" " + _toDisplayString(rule.priority), 1) + ]), + _createElementVNode("td", null, _toDisplayString(rule.type), 1), + _createElementVNode("td", null, _toDisplayString(rule.payload), 1), + _createElementVNode("td", null, [ + _createVNode(_component_v_chip, { + color: getActionColor(rule.action), + size: "small" + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(rule.action), 1) + ]), + _: 2 + }, 1032, ["color"]) + ]), + _createElementVNode("td", null, [ + _createVNode(_component_v_btn, { + icon: "", + size: "small", + color: "primary", + variant: "text", + onClick: $event => (editRule(rule.priority, 'top')), + disabled: isSystemRule(rule) + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, null, { + default: _withCtx(() => _cache[28] || (_cache[28] = [ + _createTextVNode("mdi-pencil") + ])), + _: 1 + }) + ]), + _: 2 + }, 1032, ["onClick", "disabled"]), + _createVNode(_component_v_btn, { + icon: "", + size: "small", + color: "error", + variant: "text", + onClick: $event => (deleteRule(rule.priority, 'top')), + disabled: isSystemRule(rule) + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, null, { + default: _withCtx(() => _cache[29] || (_cache[29] = [ + _createTextVNode("mdi-delete") + ])), + _: 1 + }) + ]), + _: 2 + }, 1032, ["onClick", "disabled"]), + (isSystemRule(rule)) + ? (_openBlock(), _createBlock(_component_v_tooltip, { + key: 0, + activator: "parent", + location: "top" + }, { + default: _withCtx(() => _cache[30] || (_cache[30] = [ + _createTextVNode(" 根据规则集自动添加 ") + ])), + _: 1 + })) + : _createCommentVNode("", true) + ]) + ], 42, _hoisted_8)) + }), 128)) + ]) + ]), + _: 1 + }), + _cache[32] || (_cache[32] = _createElementVNode("div", { class: "text-caption text-grey mt-2" }, " *置顶规则用于管理来自规则集的匹配规则,这些规则会动态更新。 ", -1)), + _cache[33] || (_cache[33] = _createElementVNode("div", { class: "text-caption text-grey mt-2" }, " *对置顶规则的修改只有Clash更新配置后才会生效。 ", -1)) + ]), + _createVNode(_component_v_expansion_panels, { + modelValue: expansionPanels.value, + "onUpdate:modelValue": _cache[3] || (_cache[3] = $event => ((expansionPanels).value = $event)) + }, { + default: _withCtx(() => [ + _createVNode(_component_v_expansion_panel, null, { + default: _withCtx(() => [ + _createVNode(_component_v_expansion_panel_title, null, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { left: "" }, { + default: _withCtx(() => _cache[34] || (_cache[34] = [ + _createTextVNode("mdi-cloud-download") + ])), + _: 1 + }), + _cache[35] || (_cache[35] = _createElementVNode("span", null, "订阅管理", -1)), + (subscriptionInfo.value.last_update) + ? (_openBlock(), _createBlock(_component_v_chip, { + key: 0, + size: "small", + color: "light-blue", + class: "ml-2" + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(formatTimestamp(subscriptionInfo.value.last_update)), 1) + ]), + _: 1 + })) + : _createCommentVNode("", true), + (subscriptionInfo.value.expire) + ? (_openBlock(), _createBlock(_component_v_chip, { + key: 1, + size: "small", + color: getExpireColor(subscriptionInfo.value.expire), + class: "ml-2" + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(formatTimestamp(subscriptionInfo.value.expire)), 1) + ]), + _: 1 + }, 8, ["color"])) + : _createCommentVNode("", true) + ]), + _: 1 + }), + _createVNode(_component_v_expansion_panel_text, null, { + default: _withCtx(() => [ + _createVNode(_component_v_text_field, { + modelValue: subscriptionUrl.value, + "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => ((subscriptionUrl).value = $event)), + label: "订阅URL", + placeholder: "https://example.com/clash-rules.txt", + class: "mb-4", + readonly: "", + loading: loading.value + }, null, 8, ["modelValue", "loading"]), + _createVNode(_component_v_card, { + variant: "outlined", + class: "mb-4" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_card_text, null, { + default: _withCtx(() => [ + _createElementVNode("div", _hoisted_9, [ + _cache[36] || (_cache[36] = _createElementVNode("span", null, "已用流量:", -1)), + _createElementVNode("strong", null, _toDisplayString(formatBytes(subscriptionInfo.value.download + subscriptionInfo.value.upload)), 1) + ]), + _createElementVNode("div", _hoisted_10, [ + _cache[37] || (_cache[37] = _createElementVNode("span", null, "剩余流量:", -1)), + _createElementVNode("strong", null, _toDisplayString(formatBytes(subscriptionInfo.value.total - subscriptionInfo.value.download)), 1) + ]), + _createVNode(_component_v_progress_linear, { + "model-value": subscriptionInfo.value.used_percentage, + color: getUsageColor(subscriptionInfo.value.used_percentage), + height: "10", + class: "mb-2" + }, null, 8, ["model-value", "color"]), + _createElementVNode("div", _hoisted_11, [ + _createElementVNode("span", null, "下载:" + _toDisplayString(formatBytes(subscriptionInfo.value.download)), 1), + _createElementVNode("span", null, "上传:" + _toDisplayString(formatBytes(subscriptionInfo.value.upload)), 1), + _createElementVNode("span", null, "总量:" + _toDisplayString(formatBytes(subscriptionInfo.value.total)), 1) + ]) + ]), + _: 1 + }) + ]), + _: 1 + }), + _createVNode(_component_v_btn, { + color: "primary", + onClick: updateSubscription, + loading: updatingSubscription.value + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { left: "" }, { + default: _withCtx(() => _cache[38] || (_cache[38] = [ + _createTextVNode("mdi-cloud-sync") + ])), + _: 1 + }), + _cache[39] || (_cache[39] = _createTextVNode(" 更新订阅 ")) + ]), + _: 1 + }, 8, ["loading"]) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue"]), + _createVNode(_component_v_row, null, { + default: _withCtx(() => [ + _createVNode(_component_v_col, null, { + default: _withCtx(() => [ + _createVNode(_component_v_card, { class: "flex-grow-1" }, { + default: _withCtx(() => [ + _createVNode(_component_v_card_text, { class: "text-subtitle-2" }, { + default: _withCtx(() => [ + _cache[45] || (_cache[45] = _createElementVNode("div", { class: "text-h6 mb-2" }, "状态信息", -1)), + _createElementVNode("div", null, [ + _cache[40] || (_cache[40] = _createElementVNode("strong", null, "状态: ", -1)), + _createVNode(_component_v_chip, { + size: "small", + color: status.value === 'running' ? 'success' : 'warning' + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(status.value), 1) + ]), + _: 1 + }, 8, ["color"]) + ]), + _createElementVNode("div", null, [ + _cache[41] || (_cache[41] = _createElementVNode("strong", null, "订阅配置规则数量:", -1)), + _createTextVNode(" " + _toDisplayString(subscriptionInfo.value.rule_size), 1) + ]), + _createElementVNode("div", null, [ + _cache[42] || (_cache[42] = _createElementVNode("strong", null, "置顶规则数量:", -1)), + _createTextVNode(" " + _toDisplayString(sortedRules.value.length), 1) + ]), + _createElementVNode("div", null, [ + _cache[43] || (_cache[43] = _createElementVNode("strong", null, "规则集规则数量:", -1)), + _createTextVNode(" " + _toDisplayString(sortedRulesetRules.value.length), 1) + ]), + _createElementVNode("div", null, [ + _cache[44] || (_cache[44] = _createElementVNode("strong", null, "最后更新:", -1)), + _createTextVNode(" " + _toDisplayString(lastUpdated.value), 1) + ]) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }), + _createVNode(_component_v_col, null, { + default: _withCtx(() => [ + _createVNode(_component_v_card, { class: "flex-grow-1" }, { + default: _withCtx(() => [ + _createVNode(_component_v_card_text, { class: "text-subtitle-2" }, { + default: _withCtx(() => [ + _createElementVNode("div", _hoisted_12, [ + _cache[48] || (_cache[48] = _createElementVNode("div", { class: "text-h6" }, "订阅链接", -1)), + (subUrl.value) + ? (_openBlock(), _createBlock(_component_v_btn, { + key: 0, + icon: "", + size: "small", + variant: "text", + color: "primary", + onClick: _cache[4] || (_cache[4] = $event => (copyToClipboard(subUrl.value))) + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, null, { + default: _withCtx(() => _cache[46] || (_cache[46] = [ + _createTextVNode("mdi-content-copy") + ])), + _: 1 + }), + _createVNode(_component_v_tooltip, { + activator: "parent", + location: "top" + }, { + default: _withCtx(() => _cache[47] || (_cache[47] = [ + _createTextVNode("复制链接") + ])), + _: 1 + }) + ]), + _: 1 + })) + : _createCommentVNode("", true) + ]), + (subUrl.value) + ? (_openBlock(), _createElementBlock("div", _hoisted_13, [ + _createElementVNode("a", { + href: subUrl.value, + target: "_blank", + class: "text-primary" + }, _toDisplayString(subUrl.value), 9, _hoisted_14) + ])) + : (_openBlock(), _createElementBlock("div", _hoisted_15, "未配置订阅URL")) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }) + ])) + ]), + _: 1 + }), + _createVNode(_component_v_card_actions, null, { + default: _withCtx(() => [ + _createVNode(_component_v_btn, { + color: "primary", + onClick: refreshData, + loading: loading.value + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { left: "" }, { + default: _withCtx(() => _cache[49] || (_cache[49] = [ + _createTextVNode("mdi-refresh") + ])), + _: 1 + }), + _cache[50] || (_cache[50] = _createTextVNode(" 刷新数据 ")) + ]), + _: 1 + }, 8, ["loading"]), + _createVNode(_component_v_spacer), + _createVNode(_component_v_btn, { + color: "primary", + onClick: notifySwitch + }, { + default: _withCtx(() => [ + _createVNode(_component_v_icon, { left: "" }, { + default: _withCtx(() => _cache[51] || (_cache[51] = [ + _createTextVNode("mdi-cog") + ])), + _: 1 + }), + _cache[52] || (_cache[52] = _createTextVNode(" 配置 ")) + ]), + _: 1 + }) + ]), + _: 1 + }), + _createVNode(_component_v_snackbar, { + modelValue: snackbar.value.show, + "onUpdate:modelValue": _cache[5] || (_cache[5] = $event => ((snackbar.value.show) = $event)), + color: snackbar.value.color, + location: "bottom", + class: "mb-2" + }, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(snackbar.value.message), 1) + ]), + _: 1 + }, 8, ["modelValue", "color"]) + ]), + _: 1 + }), + _createVNode(_component_v_dialog, { + modelValue: ruleDialog.value, + "onUpdate:modelValue": _cache[13] || (_cache[13] = $event => ((ruleDialog).value = $event)), + "max-width": "600" + }, { + default: _withCtx(() => [ + _createVNode(_component_v_card, null, { + default: _withCtx(() => [ + _createVNode(_component_v_card_title, null, { + default: _withCtx(() => [ + _createTextVNode(_toDisplayString(editingPriority.value === null ? '添加规则' : '编辑规则'), 1) + ]), + _: 1 + }), + _createVNode(_component_v_card_text, null, { + default: _withCtx(() => [ + _createVNode(_component_v_select, { + modelValue: newRule.value.type, + "onUpdate:modelValue": _cache[6] || (_cache[6] = $event => ((newRule.value.type) = $event)), + items: ruleTypes.value, + label: "规则类型", + required: "", + class: "mb-4" + }, null, 8, ["modelValue", "items"]), + (newRule.value.type !== 'RULE-SET') + ? (_openBlock(), _createBlock(_component_v_text_field, { + key: 0, + modelValue: newRule.value.payload, + "onUpdate:modelValue": _cache[7] || (_cache[7] = $event => ((newRule.value.payload) = $event)), + label: "内容", + required: "", + class: "mb-4" + }, null, 8, ["modelValue"])) + : (_openBlock(), _createBlock(_component_v_select, { + key: 1, + modelValue: newRule.value.payload, + "onUpdate:modelValue": _cache[8] || (_cache[8] = $event => ((newRule.value.payload) = $event)), + items: ruleProviderNames.value, + label: "选择规则集", + required: "", + class: "mb-4" + }, null, 8, ["modelValue", "items"])), + _createVNode(_component_v_select, { + modelValue: newRule.value.action, + "onUpdate:modelValue": _cache[9] || (_cache[9] = $event => ((newRule.value.action) = $event)), + items: actions.value, + label: "出站", + required: "", + class: "mb-4" + }, null, 8, ["modelValue", "items"]), + (showAdditionalParams.value) + ? (_openBlock(), _createBlock(_component_v_select, { + key: 2, + modelValue: newRule.value.additional_params, + "onUpdate:modelValue": _cache[10] || (_cache[10] = $event => ((newRule.value.additional_params) = $event)), + label: "附加参数", + items: additionalParamOptions.value, + clearable: "", + hint: "可选参数", + "persistent-hint": "", + class: "mb-4" + }, null, 8, ["modelValue", "items"])) + : _createCommentVNode("", true), + (editingPriority.value !== null) + ? (_openBlock(), _createBlock(_component_v_text_field, { + key: 3, + modelValue: newRule.value.priority, + "onUpdate:modelValue": _cache[11] || (_cache[11] = $event => ((newRule.value.priority) = $event)), + modelModifiers: { number: true }, + type: "number", + label: "优先级", + hint: "数字越小优先级越高", + "persistent-hint": "" + }, null, 8, ["modelValue"])) + : _createCommentVNode("", true) + ]), + _: 1 + }), + _createVNode(_component_v_card_actions, null, { + default: _withCtx(() => [ + _createVNode(_component_v_spacer), + _createVNode(_component_v_btn, { + color: "secondary", + onClick: _cache[12] || (_cache[12] = $event => (ruleDialog.value = false)) + }, { + default: _withCtx(() => _cache[53] || (_cache[53] = [ + _createTextVNode("取消") + ])), + _: 1 + }), + _createVNode(_component_v_btn, { + color: "primary", + onClick: saveRule + }, { + default: _withCtx(() => _cache[54] || (_cache[54] = [ + _createTextVNode("保存") + ])), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue"]) + ])) +} +} + +}; +const PageComponent = /*#__PURE__*/_export_sfc(_sfc_main, [['__scopeId',"data-v-d5e502a5"]]); + +export { PageComponent as default }; diff --git a/plugins.v2/clashruleprovider/dist/assets/__federation_fn_import-JrT3xvdd.js b/plugins.v2/clashruleprovider/dist/assets/__federation_fn_import-JrT3xvdd.js new file mode 100644 index 0000000..ed562f5 --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/__federation_fn_import-JrT3xvdd.js @@ -0,0 +1,418 @@ +const buildIdentifier = "[0-9A-Za-z-]+"; +const build = `(?:\\+(${buildIdentifier}(?:\\.${buildIdentifier})*))`; +const numericIdentifier = "0|[1-9]\\d*"; +const numericIdentifierLoose = "[0-9]+"; +const nonNumericIdentifier = "\\d*[a-zA-Z-][a-zA-Z0-9-]*"; +const preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`; +const preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\.${preReleaseIdentifierLoose})*))`; +const preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`; +const preRelease = `(?:-(${preReleaseIdentifier}(?:\\.${preReleaseIdentifier})*))`; +const xRangeIdentifier = `${numericIdentifier}|x|X|\\*`; +const xRangePlain = `[v=\\s]*(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`; +const hyphenRange = `^\\s*(${xRangePlain})\\s+-\\s+(${xRangePlain})\\s*$`; +const mainVersionLoose = `(${numericIdentifierLoose})\\.(${numericIdentifierLoose})\\.(${numericIdentifierLoose})`; +const loosePlain = `[v=\\s]*${mainVersionLoose}${preReleaseLoose}?${build}?`; +const gtlt = "((?:<|>)?=?)"; +const comparatorTrim = `(\\s*)${gtlt}\\s*(${loosePlain}|${xRangePlain})`; +const loneTilde = "(?:~>?)"; +const tildeTrim = `(\\s*)${loneTilde}\\s+`; +const loneCaret = "(?:\\^)"; +const caretTrim = `(\\s*)${loneCaret}\\s+`; +const star = "(<|>)?=?\\s*\\*"; +const caret = `^${loneCaret}${xRangePlain}$`; +const mainVersion = `(${numericIdentifier})\\.(${numericIdentifier})\\.(${numericIdentifier})`; +const fullPlain = `v?${mainVersion}${preRelease}?${build}?`; +const tilde = `^${loneTilde}${xRangePlain}$`; +const xRange = `^${gtlt}\\s*${xRangePlain}$`; +const comparator = `^${gtlt}\\s*(${fullPlain})$|^$`; +const gte0 = "^\\s*>=\\s*0.0.0\\s*$"; +function parseRegex(source) { + return new RegExp(source); +} +function isXVersion(version) { + return !version || version.toLowerCase() === "x" || version === "*"; +} +function pipe(...fns) { + return (x) => { + return fns.reduce((v, f) => f(v), x); + }; +} +function extractComparator(comparatorString) { + return comparatorString.match(parseRegex(comparator)); +} +function combineVersion(major, minor, patch, preRelease2) { + const mainVersion2 = `${major}.${minor}.${patch}`; + if (preRelease2) { + return `${mainVersion2}-${preRelease2}`; + } + return mainVersion2; +} +function parseHyphen(range) { + return range.replace( + parseRegex(hyphenRange), + (_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => { + if (isXVersion(fromMajor)) { + from = ""; + } else if (isXVersion(fromMinor)) { + from = `>=${fromMajor}.0.0`; + } else if (isXVersion(fromPatch)) { + from = `>=${fromMajor}.${fromMinor}.0`; + } else { + from = `>=${from}`; + } + if (isXVersion(toMajor)) { + to = ""; + } else if (isXVersion(toMinor)) { + to = `<${+toMajor + 1}.0.0-0`; + } else if (isXVersion(toPatch)) { + to = `<${toMajor}.${+toMinor + 1}.0-0`; + } else if (toPreRelease) { + to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`; + } else { + to = `<=${to}`; + } + return `${from} ${to}`.trim(); + } + ); +} +function parseComparatorTrim(range) { + return range.replace(parseRegex(comparatorTrim), "$1$2$3"); +} +function parseTildeTrim(range) { + return range.replace(parseRegex(tildeTrim), "$1~"); +} +function parseCaretTrim(range) { + return range.replace(parseRegex(caretTrim), "$1^"); +} +function parseCarets(range) { + return range.trim().split(/\s+/).map((rangeVersion) => { + return rangeVersion.replace( + parseRegex(caret), + (_, major, minor, patch, preRelease2) => { + if (isXVersion(major)) { + return ""; + } else if (isXVersion(minor)) { + return `>=${major}.0.0 <${+major + 1}.0.0-0`; + } else if (isXVersion(patch)) { + if (major === "0") { + return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; + } else { + return `>=${major}.${minor}.0 <${+major + 1}.0.0-0`; + } + } else if (preRelease2) { + if (major === "0") { + if (minor === "0") { + return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${minor}.${+patch + 1}-0`; + } else { + return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; + } + } else { + return `>=${major}.${minor}.${patch}-${preRelease2} <${+major + 1}.0.0-0`; + } + } else { + if (major === "0") { + if (minor === "0") { + return `>=${major}.${minor}.${patch} <${major}.${minor}.${+patch + 1}-0`; + } else { + return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; + } + } + return `>=${major}.${minor}.${patch} <${+major + 1}.0.0-0`; + } + } + ); + }).join(" "); +} +function parseTildes(range) { + return range.trim().split(/\s+/).map((rangeVersion) => { + return rangeVersion.replace( + parseRegex(tilde), + (_, major, minor, patch, preRelease2) => { + if (isXVersion(major)) { + return ""; + } else if (isXVersion(minor)) { + return `>=${major}.0.0 <${+major + 1}.0.0-0`; + } else if (isXVersion(patch)) { + return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; + } else if (preRelease2) { + return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; + } + return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; + } + ); + }).join(" "); +} +function parseXRanges(range) { + return range.split(/\s+/).map((rangeVersion) => { + return rangeVersion.trim().replace( + parseRegex(xRange), + (ret, gtlt2, major, minor, patch, preRelease2) => { + const isXMajor = isXVersion(major); + const isXMinor = isXMajor || isXVersion(minor); + const isXPatch = isXMinor || isXVersion(patch); + if (gtlt2 === "=" && isXPatch) { + gtlt2 = ""; + } + preRelease2 = ""; + if (isXMajor) { + if (gtlt2 === ">" || gtlt2 === "<") { + return "<0.0.0-0"; + } else { + return "*"; + } + } else if (gtlt2 && isXPatch) { + if (isXMinor) { + minor = 0; + } + patch = 0; + if (gtlt2 === ">") { + gtlt2 = ">="; + if (isXMinor) { + major = +major + 1; + minor = 0; + patch = 0; + } else { + minor = +minor + 1; + patch = 0; + } + } else if (gtlt2 === "<=") { + gtlt2 = "<"; + if (isXMinor) { + major = +major + 1; + } else { + minor = +minor + 1; + } + } + if (gtlt2 === "<") { + preRelease2 = "-0"; + } + return `${gtlt2 + major}.${minor}.${patch}${preRelease2}`; + } else if (isXMinor) { + return `>=${major}.0.0${preRelease2} <${+major + 1}.0.0-0`; + } else if (isXPatch) { + return `>=${major}.${minor}.0${preRelease2} <${major}.${+minor + 1}.0-0`; + } + return ret; + } + ); + }).join(" "); +} +function parseStar(range) { + return range.trim().replace(parseRegex(star), ""); +} +function parseGTE0(comparatorString) { + return comparatorString.trim().replace(parseRegex(gte0), ""); +} +function compareAtom(rangeAtom, versionAtom) { + rangeAtom = +rangeAtom || rangeAtom; + versionAtom = +versionAtom || versionAtom; + if (rangeAtom > versionAtom) { + return 1; + } + if (rangeAtom === versionAtom) { + return 0; + } + return -1; +} +function comparePreRelease(rangeAtom, versionAtom) { + const { preRelease: rangePreRelease } = rangeAtom; + const { preRelease: versionPreRelease } = versionAtom; + if (rangePreRelease === void 0 && !!versionPreRelease) { + return 1; + } + if (!!rangePreRelease && versionPreRelease === void 0) { + return -1; + } + if (rangePreRelease === void 0 && versionPreRelease === void 0) { + return 0; + } + for (let i = 0, n = rangePreRelease.length; i <= n; i++) { + const rangeElement = rangePreRelease[i]; + const versionElement = versionPreRelease[i]; + if (rangeElement === versionElement) { + continue; + } + if (rangeElement === void 0 && versionElement === void 0) { + return 0; + } + if (!rangeElement) { + return 1; + } + if (!versionElement) { + return -1; + } + return compareAtom(rangeElement, versionElement); + } + return 0; +} +function compareVersion(rangeAtom, versionAtom) { + return compareAtom(rangeAtom.major, versionAtom.major) || compareAtom(rangeAtom.minor, versionAtom.minor) || compareAtom(rangeAtom.patch, versionAtom.patch) || comparePreRelease(rangeAtom, versionAtom); +} +function eq(rangeAtom, versionAtom) { + return rangeAtom.version === versionAtom.version; +} +function compare(rangeAtom, versionAtom) { + switch (rangeAtom.operator) { + case "": + case "=": + return eq(rangeAtom, versionAtom); + case ">": + return compareVersion(rangeAtom, versionAtom) < 0; + case ">=": + return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0; + case "<": + return compareVersion(rangeAtom, versionAtom) > 0; + case "<=": + return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0; + case void 0: { + return true; + } + default: + return false; + } +} +function parseComparatorString(range) { + return pipe( + parseCarets, + parseTildes, + parseXRanges, + parseStar + )(range); +} +function parseRange(range) { + return pipe( + parseHyphen, + parseComparatorTrim, + parseTildeTrim, + parseCaretTrim + )(range.trim()).split(/\s+/).join(" "); +} +function satisfy(version, range) { + if (!version) { + return false; + } + const parsedRange = parseRange(range); + const parsedComparator = parsedRange.split(" ").map((rangeVersion) => parseComparatorString(rangeVersion)).join(" "); + const comparators = parsedComparator.split(/\s+/).map((comparator2) => parseGTE0(comparator2)); + const extractedVersion = extractComparator(version); + if (!extractedVersion) { + return false; + } + const [ + , + versionOperator, + , + versionMajor, + versionMinor, + versionPatch, + versionPreRelease + ] = extractedVersion; + const versionAtom = { + version: combineVersion( + versionMajor, + versionMinor, + versionPatch, + versionPreRelease + ), + major: versionMajor, + minor: versionMinor, + patch: versionPatch, + preRelease: versionPreRelease == null ? void 0 : versionPreRelease.split(".") + }; + for (const comparator2 of comparators) { + const extractedComparator = extractComparator(comparator2); + if (!extractedComparator) { + return false; + } + const [ + , + rangeOperator, + , + rangeMajor, + rangeMinor, + rangePatch, + rangePreRelease + ] = extractedComparator; + const rangeAtom = { + operator: rangeOperator, + version: combineVersion( + rangeMajor, + rangeMinor, + rangePatch, + rangePreRelease + ), + major: rangeMajor, + minor: rangeMinor, + patch: rangePatch, + preRelease: rangePreRelease == null ? void 0 : rangePreRelease.split(".") + }; + if (!compare(rangeAtom, versionAtom)) { + return false; + } + } + return true; +} + +// eslint-disable-next-line no-undef +const moduleMap = {}; +const moduleCache = Object.create(null); +async function importShared(name, shareScope = 'default') { + return moduleCache[name] + ? new Promise((r) => r(moduleCache[name])) + : (await getSharedFromRuntime(name, shareScope)) || getSharedFromLocal(name) +} +async function getSharedFromRuntime(name, shareScope) { + let module = null; + if (globalThis?.__federation_shared__?.[shareScope]?.[name]) { + const versionObj = globalThis.__federation_shared__[shareScope][name]; + const requiredVersion = moduleMap[name]?.requiredVersion; + const hasRequiredVersion = !!requiredVersion; + if (hasRequiredVersion) { + const versionKey = Object.keys(versionObj).find((version) => + satisfy(version, requiredVersion) + ); + if (versionKey) { + const versionValue = versionObj[versionKey]; + module = await (await versionValue.get())(); + } else { + console.log( + `provider support ${name}(${versionKey}) is not satisfied requiredVersion(\${moduleMap[name].requiredVersion})` + ); + } + } else { + const versionKey = Object.keys(versionObj)[0]; + const versionValue = versionObj[versionKey]; + module = await (await versionValue.get())(); + } + } + if (module) { + return flattenModule(module, name) + } +} +async function getSharedFromLocal(name) { + if (moduleMap[name]?.import) { + let module = await (await moduleMap[name].get())(); + return flattenModule(module, name) + } else { + console.error( + `consumer config import=false,so cant use callback shared module` + ); + } +} +function flattenModule(module, name) { + // use a shared module which export default a function will getting error 'TypeError: xxx is not a function' + if (typeof module.default === 'function') { + Object.keys(module).forEach((key) => { + if (key !== 'default') { + module.default[key] = module[key]; + } + }); + moduleCache[name] = module.default; + return module.default + } + if (module.default) module = Object.assign({}, module.default, module); + moduleCache[name] = module; + return module +} + +export { importShared, getSharedFromLocal as importSharedLocal, getSharedFromRuntime as importSharedRuntime }; diff --git a/plugins.v2/clashruleprovider/dist/assets/__federation_shared_vuetify/styles-I7amCcZu.css b/plugins.v2/clashruleprovider/dist/assets/__federation_shared_vuetify/styles-I7amCcZu.css new file mode 100644 index 0000000..5d03cf1 --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/__federation_shared_vuetify/styles-I7amCcZu.css @@ -0,0 +1,17409 @@ +@keyframes v-shake { + 59% { + margin-left: 0; + } + 60%, 80% { + margin-left: 2px; + } + 70%, 90% { + margin-left: -2px; + } +} +.bg-black { + background-color: #000000 !important; +} +.bg-black { + color: #FFFFFF !important; +} + +.bg-white { + background-color: #FFFFFF !important; +} +.bg-white { + color: #000000 !important; +} + +.bg-transparent { + background-color: transparent !important; +} +.bg-transparent { + color: currentColor !important; +} + +.bg-red { + background-color: #F44336 !important; +} +.bg-red { + color: #FFFFFF !important; +} + +.bg-red-lighten-5 { + background-color: #FFEBEE !important; +} +.bg-red-lighten-5 { + color: #000000 !important; +} + +.bg-red-lighten-4 { + background-color: #FFCDD2 !important; +} +.bg-red-lighten-4 { + color: #000000 !important; +} + +.bg-red-lighten-3 { + background-color: #EF9A9A !important; +} +.bg-red-lighten-3 { + color: #000000 !important; +} + +.bg-red-lighten-2 { + background-color: #E57373 !important; +} +.bg-red-lighten-2 { + color: #FFFFFF !important; +} + +.bg-red-lighten-1 { + background-color: #EF5350 !important; +} +.bg-red-lighten-1 { + color: #FFFFFF !important; +} + +.bg-red-darken-1 { + background-color: #E53935 !important; +} +.bg-red-darken-1 { + color: #FFFFFF !important; +} + +.bg-red-darken-2 { + background-color: #D32F2F !important; +} +.bg-red-darken-2 { + color: #FFFFFF !important; +} + +.bg-red-darken-3 { + background-color: #C62828 !important; +} +.bg-red-darken-3 { + color: #FFFFFF !important; +} + +.bg-red-darken-4 { + background-color: #B71C1C !important; +} +.bg-red-darken-4 { + color: #FFFFFF !important; +} + +.bg-red-accent-1 { + background-color: #FF8A80 !important; +} +.bg-red-accent-1 { + color: #000000 !important; +} + +.bg-red-accent-2 { + background-color: #FF5252 !important; +} +.bg-red-accent-2 { + color: #FFFFFF !important; +} + +.bg-red-accent-3 { + background-color: #FF1744 !important; +} +.bg-red-accent-3 { + color: #FFFFFF !important; +} + +.bg-red-accent-4 { + background-color: #D50000 !important; +} +.bg-red-accent-4 { + color: #FFFFFF !important; +} + +.bg-pink { + background-color: #e91e63 !important; +} +.bg-pink { + color: #FFFFFF !important; +} + +.bg-pink-lighten-5 { + background-color: #fce4ec !important; +} +.bg-pink-lighten-5 { + color: #000000 !important; +} + +.bg-pink-lighten-4 { + background-color: #f8bbd0 !important; +} +.bg-pink-lighten-4 { + color: #000000 !important; +} + +.bg-pink-lighten-3 { + background-color: #f48fb1 !important; +} +.bg-pink-lighten-3 { + color: #000000 !important; +} + +.bg-pink-lighten-2 { + background-color: #f06292 !important; +} +.bg-pink-lighten-2 { + color: #FFFFFF !important; +} + +.bg-pink-lighten-1 { + background-color: #ec407a !important; +} +.bg-pink-lighten-1 { + color: #FFFFFF !important; +} + +.bg-pink-darken-1 { + background-color: #d81b60 !important; +} +.bg-pink-darken-1 { + color: #FFFFFF !important; +} + +.bg-pink-darken-2 { + background-color: #c2185b !important; +} +.bg-pink-darken-2 { + color: #FFFFFF !important; +} + +.bg-pink-darken-3 { + background-color: #ad1457 !important; +} +.bg-pink-darken-3 { + color: #FFFFFF !important; +} + +.bg-pink-darken-4 { + background-color: #880e4f !important; +} +.bg-pink-darken-4 { + color: #FFFFFF !important; +} + +.bg-pink-accent-1 { + background-color: #ff80ab !important; +} +.bg-pink-accent-1 { + color: #FFFFFF !important; +} + +.bg-pink-accent-2 { + background-color: #ff4081 !important; +} +.bg-pink-accent-2 { + color: #FFFFFF !important; +} + +.bg-pink-accent-3 { + background-color: #f50057 !important; +} +.bg-pink-accent-3 { + color: #FFFFFF !important; +} + +.bg-pink-accent-4 { + background-color: #c51162 !important; +} +.bg-pink-accent-4 { + color: #FFFFFF !important; +} + +.bg-purple { + background-color: #9c27b0 !important; +} +.bg-purple { + color: #FFFFFF !important; +} + +.bg-purple-lighten-5 { + background-color: #f3e5f5 !important; +} +.bg-purple-lighten-5 { + color: #000000 !important; +} + +.bg-purple-lighten-4 { + background-color: #e1bee7 !important; +} +.bg-purple-lighten-4 { + color: #000000 !important; +} + +.bg-purple-lighten-3 { + background-color: #ce93d8 !important; +} +.bg-purple-lighten-3 { + color: #FFFFFF !important; +} + +.bg-purple-lighten-2 { + background-color: #ba68c8 !important; +} +.bg-purple-lighten-2 { + color: #FFFFFF !important; +} + +.bg-purple-lighten-1 { + background-color: #ab47bc !important; +} +.bg-purple-lighten-1 { + color: #FFFFFF !important; +} + +.bg-purple-darken-1 { + background-color: #8e24aa !important; +} +.bg-purple-darken-1 { + color: #FFFFFF !important; +} + +.bg-purple-darken-2 { + background-color: #7b1fa2 !important; +} +.bg-purple-darken-2 { + color: #FFFFFF !important; +} + +.bg-purple-darken-3 { + background-color: #6a1b9a !important; +} +.bg-purple-darken-3 { + color: #FFFFFF !important; +} + +.bg-purple-darken-4 { + background-color: #4a148c !important; +} +.bg-purple-darken-4 { + color: #FFFFFF !important; +} + +.bg-purple-accent-1 { + background-color: #ea80fc !important; +} +.bg-purple-accent-1 { + color: #FFFFFF !important; +} + +.bg-purple-accent-2 { + background-color: #e040fb !important; +} +.bg-purple-accent-2 { + color: #FFFFFF !important; +} + +.bg-purple-accent-3 { + background-color: #d500f9 !important; +} +.bg-purple-accent-3 { + color: #FFFFFF !important; +} + +.bg-purple-accent-4 { + background-color: #aa00ff !important; +} +.bg-purple-accent-4 { + color: #FFFFFF !important; +} + +.bg-deep-purple { + background-color: #673ab7 !important; +} +.bg-deep-purple { + color: #FFFFFF !important; +} + +.bg-deep-purple-lighten-5 { + background-color: #ede7f6 !important; +} +.bg-deep-purple-lighten-5 { + color: #000000 !important; +} + +.bg-deep-purple-lighten-4 { + background-color: #d1c4e9 !important; +} +.bg-deep-purple-lighten-4 { + color: #000000 !important; +} + +.bg-deep-purple-lighten-3 { + background-color: #b39ddb !important; +} +.bg-deep-purple-lighten-3 { + color: #FFFFFF !important; +} + +.bg-deep-purple-lighten-2 { + background-color: #9575cd !important; +} +.bg-deep-purple-lighten-2 { + color: #FFFFFF !important; +} + +.bg-deep-purple-lighten-1 { + background-color: #7e57c2 !important; +} +.bg-deep-purple-lighten-1 { + color: #FFFFFF !important; +} + +.bg-deep-purple-darken-1 { + background-color: #5e35b1 !important; +} +.bg-deep-purple-darken-1 { + color: #FFFFFF !important; +} + +.bg-deep-purple-darken-2 { + background-color: #512da8 !important; +} +.bg-deep-purple-darken-2 { + color: #FFFFFF !important; +} + +.bg-deep-purple-darken-3 { + background-color: #4527a0 !important; +} +.bg-deep-purple-darken-3 { + color: #FFFFFF !important; +} + +.bg-deep-purple-darken-4 { + background-color: #311b92 !important; +} +.bg-deep-purple-darken-4 { + color: #FFFFFF !important; +} + +.bg-deep-purple-accent-1 { + background-color: #b388ff !important; +} +.bg-deep-purple-accent-1 { + color: #FFFFFF !important; +} + +.bg-deep-purple-accent-2 { + background-color: #7c4dff !important; +} +.bg-deep-purple-accent-2 { + color: #FFFFFF !important; +} + +.bg-deep-purple-accent-3 { + background-color: #651fff !important; +} +.bg-deep-purple-accent-3 { + color: #FFFFFF !important; +} + +.bg-deep-purple-accent-4 { + background-color: #6200ea !important; +} +.bg-deep-purple-accent-4 { + color: #FFFFFF !important; +} + +.bg-indigo { + background-color: #3f51b5 !important; +} +.bg-indigo { + color: #FFFFFF !important; +} + +.bg-indigo-lighten-5 { + background-color: #e8eaf6 !important; +} +.bg-indigo-lighten-5 { + color: #000000 !important; +} + +.bg-indigo-lighten-4 { + background-color: #c5cae9 !important; +} +.bg-indigo-lighten-4 { + color: #000000 !important; +} + +.bg-indigo-lighten-3 { + background-color: #9fa8da !important; +} +.bg-indigo-lighten-3 { + color: #FFFFFF !important; +} + +.bg-indigo-lighten-2 { + background-color: #7986cb !important; +} +.bg-indigo-lighten-2 { + color: #FFFFFF !important; +} + +.bg-indigo-lighten-1 { + background-color: #5c6bc0 !important; +} +.bg-indigo-lighten-1 { + color: #FFFFFF !important; +} + +.bg-indigo-darken-1 { + background-color: #3949ab !important; +} +.bg-indigo-darken-1 { + color: #FFFFFF !important; +} + +.bg-indigo-darken-2 { + background-color: #303f9f !important; +} +.bg-indigo-darken-2 { + color: #FFFFFF !important; +} + +.bg-indigo-darken-3 { + background-color: #283593 !important; +} +.bg-indigo-darken-3 { + color: #FFFFFF !important; +} + +.bg-indigo-darken-4 { + background-color: #1a237e !important; +} +.bg-indigo-darken-4 { + color: #FFFFFF !important; +} + +.bg-indigo-accent-1 { + background-color: #8c9eff !important; +} +.bg-indigo-accent-1 { + color: #FFFFFF !important; +} + +.bg-indigo-accent-2 { + background-color: #536dfe !important; +} +.bg-indigo-accent-2 { + color: #FFFFFF !important; +} + +.bg-indigo-accent-3 { + background-color: #3d5afe !important; +} +.bg-indigo-accent-3 { + color: #FFFFFF !important; +} + +.bg-indigo-accent-4 { + background-color: #304ffe !important; +} +.bg-indigo-accent-4 { + color: #FFFFFF !important; +} + +.bg-blue { + background-color: #2196F3 !important; +} +.bg-blue { + color: #FFFFFF !important; +} + +.bg-blue-lighten-5 { + background-color: #E3F2FD !important; +} +.bg-blue-lighten-5 { + color: #000000 !important; +} + +.bg-blue-lighten-4 { + background-color: #BBDEFB !important; +} +.bg-blue-lighten-4 { + color: #000000 !important; +} + +.bg-blue-lighten-3 { + background-color: #90CAF9 !important; +} +.bg-blue-lighten-3 { + color: #000000 !important; +} + +.bg-blue-lighten-2 { + background-color: #64B5F6 !important; +} +.bg-blue-lighten-2 { + color: #000000 !important; +} + +.bg-blue-lighten-1 { + background-color: #42A5F5 !important; +} +.bg-blue-lighten-1 { + color: #FFFFFF !important; +} + +.bg-blue-darken-1 { + background-color: #1E88E5 !important; +} +.bg-blue-darken-1 { + color: #FFFFFF !important; +} + +.bg-blue-darken-2 { + background-color: #1976D2 !important; +} +.bg-blue-darken-2 { + color: #FFFFFF !important; +} + +.bg-blue-darken-3 { + background-color: #1565C0 !important; +} +.bg-blue-darken-3 { + color: #FFFFFF !important; +} + +.bg-blue-darken-4 { + background-color: #0D47A1 !important; +} +.bg-blue-darken-4 { + color: #FFFFFF !important; +} + +.bg-blue-accent-1 { + background-color: #82B1FF !important; +} +.bg-blue-accent-1 { + color: #000000 !important; +} + +.bg-blue-accent-2 { + background-color: #448AFF !important; +} +.bg-blue-accent-2 { + color: #FFFFFF !important; +} + +.bg-blue-accent-3 { + background-color: #2979FF !important; +} +.bg-blue-accent-3 { + color: #FFFFFF !important; +} + +.bg-blue-accent-4 { + background-color: #2962FF !important; +} +.bg-blue-accent-4 { + color: #FFFFFF !important; +} + +.bg-light-blue { + background-color: #03a9f4 !important; +} +.bg-light-blue { + color: #FFFFFF !important; +} + +.bg-light-blue-lighten-5 { + background-color: #e1f5fe !important; +} +.bg-light-blue-lighten-5 { + color: #000000 !important; +} + +.bg-light-blue-lighten-4 { + background-color: #b3e5fc !important; +} +.bg-light-blue-lighten-4 { + color: #000000 !important; +} + +.bg-light-blue-lighten-3 { + background-color: #81d4fa !important; +} +.bg-light-blue-lighten-3 { + color: #000000 !important; +} + +.bg-light-blue-lighten-2 { + background-color: #4fc3f7 !important; +} +.bg-light-blue-lighten-2 { + color: #000000 !important; +} + +.bg-light-blue-lighten-1 { + background-color: #29b6f6 !important; +} +.bg-light-blue-lighten-1 { + color: #000000 !important; +} + +.bg-light-blue-darken-1 { + background-color: #039be5 !important; +} +.bg-light-blue-darken-1 { + color: #FFFFFF !important; +} + +.bg-light-blue-darken-2 { + background-color: #0288d1 !important; +} +.bg-light-blue-darken-2 { + color: #FFFFFF !important; +} + +.bg-light-blue-darken-3 { + background-color: #0277bd !important; +} +.bg-light-blue-darken-3 { + color: #FFFFFF !important; +} + +.bg-light-blue-darken-4 { + background-color: #01579b !important; +} +.bg-light-blue-darken-4 { + color: #FFFFFF !important; +} + +.bg-light-blue-accent-1 { + background-color: #80d8ff !important; +} +.bg-light-blue-accent-1 { + color: #000000 !important; +} + +.bg-light-blue-accent-2 { + background-color: #40c4ff !important; +} +.bg-light-blue-accent-2 { + color: #000000 !important; +} + +.bg-light-blue-accent-3 { + background-color: #00b0ff !important; +} +.bg-light-blue-accent-3 { + color: #FFFFFF !important; +} + +.bg-light-blue-accent-4 { + background-color: #0091ea !important; +} +.bg-light-blue-accent-4 { + color: #FFFFFF !important; +} + +.bg-cyan { + background-color: #00bcd4 !important; +} +.bg-cyan { + color: #000000 !important; +} + +.bg-cyan-lighten-5 { + background-color: #e0f7fa !important; +} +.bg-cyan-lighten-5 { + color: #000000 !important; +} + +.bg-cyan-lighten-4 { + background-color: #b2ebf2 !important; +} +.bg-cyan-lighten-4 { + color: #000000 !important; +} + +.bg-cyan-lighten-3 { + background-color: #80deea !important; +} +.bg-cyan-lighten-3 { + color: #000000 !important; +} + +.bg-cyan-lighten-2 { + background-color: #4dd0e1 !important; +} +.bg-cyan-lighten-2 { + color: #000000 !important; +} + +.bg-cyan-lighten-1 { + background-color: #26c6da !important; +} +.bg-cyan-lighten-1 { + color: #000000 !important; +} + +.bg-cyan-darken-1 { + background-color: #00acc1 !important; +} +.bg-cyan-darken-1 { + color: #FFFFFF !important; +} + +.bg-cyan-darken-2 { + background-color: #0097a7 !important; +} +.bg-cyan-darken-2 { + color: #FFFFFF !important; +} + +.bg-cyan-darken-3 { + background-color: #00838f !important; +} +.bg-cyan-darken-3 { + color: #FFFFFF !important; +} + +.bg-cyan-darken-4 { + background-color: #006064 !important; +} +.bg-cyan-darken-4 { + color: #FFFFFF !important; +} + +.bg-cyan-accent-1 { + background-color: #84ffff !important; +} +.bg-cyan-accent-1 { + color: #000000 !important; +} + +.bg-cyan-accent-2 { + background-color: #18ffff !important; +} +.bg-cyan-accent-2 { + color: #000000 !important; +} + +.bg-cyan-accent-3 { + background-color: #00e5ff !important; +} +.bg-cyan-accent-3 { + color: #000000 !important; +} + +.bg-cyan-accent-4 { + background-color: #00b8d4 !important; +} +.bg-cyan-accent-4 { + color: #FFFFFF !important; +} + +.bg-teal { + background-color: #009688 !important; +} +.bg-teal { + color: #FFFFFF !important; +} + +.bg-teal-lighten-5 { + background-color: #e0f2f1 !important; +} +.bg-teal-lighten-5 { + color: #000000 !important; +} + +.bg-teal-lighten-4 { + background-color: #b2dfdb !important; +} +.bg-teal-lighten-4 { + color: #000000 !important; +} + +.bg-teal-lighten-3 { + background-color: #80cbc4 !important; +} +.bg-teal-lighten-3 { + color: #000000 !important; +} + +.bg-teal-lighten-2 { + background-color: #4db6ac !important; +} +.bg-teal-lighten-2 { + color: #FFFFFF !important; +} + +.bg-teal-lighten-1 { + background-color: #26a69a !important; +} +.bg-teal-lighten-1 { + color: #FFFFFF !important; +} + +.bg-teal-darken-1 { + background-color: #00897b !important; +} +.bg-teal-darken-1 { + color: #FFFFFF !important; +} + +.bg-teal-darken-2 { + background-color: #00796b !important; +} +.bg-teal-darken-2 { + color: #FFFFFF !important; +} + +.bg-teal-darken-3 { + background-color: #00695c !important; +} +.bg-teal-darken-3 { + color: #FFFFFF !important; +} + +.bg-teal-darken-4 { + background-color: #004d40 !important; +} +.bg-teal-darken-4 { + color: #FFFFFF !important; +} + +.bg-teal-accent-1 { + background-color: #a7ffeb !important; +} +.bg-teal-accent-1 { + color: #000000 !important; +} + +.bg-teal-accent-2 { + background-color: #64ffda !important; +} +.bg-teal-accent-2 { + color: #000000 !important; +} + +.bg-teal-accent-3 { + background-color: #1de9b6 !important; +} +.bg-teal-accent-3 { + color: #000000 !important; +} + +.bg-teal-accent-4 { + background-color: #00bfa5 !important; +} +.bg-teal-accent-4 { + color: #FFFFFF !important; +} + +.bg-green { + background-color: #4CAF50 !important; +} +.bg-green { + color: #FFFFFF !important; +} + +.bg-green-lighten-5 { + background-color: #E8F5E9 !important; +} +.bg-green-lighten-5 { + color: #000000 !important; +} + +.bg-green-lighten-4 { + background-color: #C8E6C9 !important; +} +.bg-green-lighten-4 { + color: #000000 !important; +} + +.bg-green-lighten-3 { + background-color: #A5D6A7 !important; +} +.bg-green-lighten-3 { + color: #000000 !important; +} + +.bg-green-lighten-2 { + background-color: #81C784 !important; +} +.bg-green-lighten-2 { + color: #000000 !important; +} + +.bg-green-lighten-1 { + background-color: #66BB6A !important; +} +.bg-green-lighten-1 { + color: #FFFFFF !important; +} + +.bg-green-darken-1 { + background-color: #43A047 !important; +} +.bg-green-darken-1 { + color: #FFFFFF !important; +} + +.bg-green-darken-2 { + background-color: #388E3C !important; +} +.bg-green-darken-2 { + color: #FFFFFF !important; +} + +.bg-green-darken-3 { + background-color: #2E7D32 !important; +} +.bg-green-darken-3 { + color: #FFFFFF !important; +} + +.bg-green-darken-4 { + background-color: #1B5E20 !important; +} +.bg-green-darken-4 { + color: #FFFFFF !important; +} + +.bg-green-accent-1 { + background-color: #B9F6CA !important; +} +.bg-green-accent-1 { + color: #000000 !important; +} + +.bg-green-accent-2 { + background-color: #69F0AE !important; +} +.bg-green-accent-2 { + color: #000000 !important; +} + +.bg-green-accent-3 { + background-color: #00E676 !important; +} +.bg-green-accent-3 { + color: #000000 !important; +} + +.bg-green-accent-4 { + background-color: #00C853 !important; +} +.bg-green-accent-4 { + color: #000000 !important; +} + +.bg-light-green { + background-color: #8bc34a !important; +} +.bg-light-green { + color: #000000 !important; +} + +.bg-light-green-lighten-5 { + background-color: #f1f8e9 !important; +} +.bg-light-green-lighten-5 { + color: #000000 !important; +} + +.bg-light-green-lighten-4 { + background-color: #dcedc8 !important; +} +.bg-light-green-lighten-4 { + color: #000000 !important; +} + +.bg-light-green-lighten-3 { + background-color: #c5e1a5 !important; +} +.bg-light-green-lighten-3 { + color: #000000 !important; +} + +.bg-light-green-lighten-2 { + background-color: #aed581 !important; +} +.bg-light-green-lighten-2 { + color: #000000 !important; +} + +.bg-light-green-lighten-1 { + background-color: #9ccc65 !important; +} +.bg-light-green-lighten-1 { + color: #000000 !important; +} + +.bg-light-green-darken-1 { + background-color: #7cb342 !important; +} +.bg-light-green-darken-1 { + color: #FFFFFF !important; +} + +.bg-light-green-darken-2 { + background-color: #689f38 !important; +} +.bg-light-green-darken-2 { + color: #FFFFFF !important; +} + +.bg-light-green-darken-3 { + background-color: #558b2f !important; +} +.bg-light-green-darken-3 { + color: #FFFFFF !important; +} + +.bg-light-green-darken-4 { + background-color: #33691e !important; +} +.bg-light-green-darken-4 { + color: #FFFFFF !important; +} + +.bg-light-green-accent-1 { + background-color: #ccff90 !important; +} +.bg-light-green-accent-1 { + color: #000000 !important; +} + +.bg-light-green-accent-2 { + background-color: #b2ff59 !important; +} +.bg-light-green-accent-2 { + color: #000000 !important; +} + +.bg-light-green-accent-3 { + background-color: #76ff03 !important; +} +.bg-light-green-accent-3 { + color: #000000 !important; +} + +.bg-light-green-accent-4 { + background-color: #64dd17 !important; +} +.bg-light-green-accent-4 { + color: #000000 !important; +} + +.bg-lime { + background-color: #cddc39 !important; +} +.bg-lime { + color: #000000 !important; +} + +.bg-lime-lighten-5 { + background-color: #f9fbe7 !important; +} +.bg-lime-lighten-5 { + color: #000000 !important; +} + +.bg-lime-lighten-4 { + background-color: #f0f4c3 !important; +} +.bg-lime-lighten-4 { + color: #000000 !important; +} + +.bg-lime-lighten-3 { + background-color: #e6ee9c !important; +} +.bg-lime-lighten-3 { + color: #000000 !important; +} + +.bg-lime-lighten-2 { + background-color: #dce775 !important; +} +.bg-lime-lighten-2 { + color: #000000 !important; +} + +.bg-lime-lighten-1 { + background-color: #d4e157 !important; +} +.bg-lime-lighten-1 { + color: #000000 !important; +} + +.bg-lime-darken-1 { + background-color: #c0ca33 !important; +} +.bg-lime-darken-1 { + color: #000000 !important; +} + +.bg-lime-darken-2 { + background-color: #afb42b !important; +} +.bg-lime-darken-2 { + color: #000000 !important; +} + +.bg-lime-darken-3 { + background-color: #9e9d24 !important; +} +.bg-lime-darken-3 { + color: #FFFFFF !important; +} + +.bg-lime-darken-4 { + background-color: #827717 !important; +} +.bg-lime-darken-4 { + color: #FFFFFF !important; +} + +.bg-lime-accent-1 { + background-color: #f4ff81 !important; +} +.bg-lime-accent-1 { + color: #000000 !important; +} + +.bg-lime-accent-2 { + background-color: #eeff41 !important; +} +.bg-lime-accent-2 { + color: #000000 !important; +} + +.bg-lime-accent-3 { + background-color: #c6ff00 !important; +} +.bg-lime-accent-3 { + color: #000000 !important; +} + +.bg-lime-accent-4 { + background-color: #aeea00 !important; +} +.bg-lime-accent-4 { + color: #000000 !important; +} + +.bg-yellow { + background-color: #ffeb3b !important; +} +.bg-yellow { + color: #000000 !important; +} + +.bg-yellow-lighten-5 { + background-color: #fffde7 !important; +} +.bg-yellow-lighten-5 { + color: #000000 !important; +} + +.bg-yellow-lighten-4 { + background-color: #fff9c4 !important; +} +.bg-yellow-lighten-4 { + color: #000000 !important; +} + +.bg-yellow-lighten-3 { + background-color: #fff59d !important; +} +.bg-yellow-lighten-3 { + color: #000000 !important; +} + +.bg-yellow-lighten-2 { + background-color: #fff176 !important; +} +.bg-yellow-lighten-2 { + color: #000000 !important; +} + +.bg-yellow-lighten-1 { + background-color: #ffee58 !important; +} +.bg-yellow-lighten-1 { + color: #000000 !important; +} + +.bg-yellow-darken-1 { + background-color: #fdd835 !important; +} +.bg-yellow-darken-1 { + color: #000000 !important; +} + +.bg-yellow-darken-2 { + background-color: #fbc02d !important; +} +.bg-yellow-darken-2 { + color: #000000 !important; +} + +.bg-yellow-darken-3 { + background-color: #f9a825 !important; +} +.bg-yellow-darken-3 { + color: #000000 !important; +} + +.bg-yellow-darken-4 { + background-color: #f57f17 !important; +} +.bg-yellow-darken-4 { + color: #FFFFFF !important; +} + +.bg-yellow-accent-1 { + background-color: #ffff8d !important; +} +.bg-yellow-accent-1 { + color: #000000 !important; +} + +.bg-yellow-accent-2 { + background-color: #ffff00 !important; +} +.bg-yellow-accent-2 { + color: #000000 !important; +} + +.bg-yellow-accent-3 { + background-color: #ffea00 !important; +} +.bg-yellow-accent-3 { + color: #000000 !important; +} + +.bg-yellow-accent-4 { + background-color: #ffd600 !important; +} +.bg-yellow-accent-4 { + color: #000000 !important; +} + +.bg-amber { + background-color: #ffc107 !important; +} +.bg-amber { + color: #000000 !important; +} + +.bg-amber-lighten-5 { + background-color: #fff8e1 !important; +} +.bg-amber-lighten-5 { + color: #000000 !important; +} + +.bg-amber-lighten-4 { + background-color: #ffecb3 !important; +} +.bg-amber-lighten-4 { + color: #000000 !important; +} + +.bg-amber-lighten-3 { + background-color: #ffe082 !important; +} +.bg-amber-lighten-3 { + color: #000000 !important; +} + +.bg-amber-lighten-2 { + background-color: #ffd54f !important; +} +.bg-amber-lighten-2 { + color: #000000 !important; +} + +.bg-amber-lighten-1 { + background-color: #ffca28 !important; +} +.bg-amber-lighten-1 { + color: #000000 !important; +} + +.bg-amber-darken-1 { + background-color: #ffb300 !important; +} +.bg-amber-darken-1 { + color: #000000 !important; +} + +.bg-amber-darken-2 { + background-color: #ffa000 !important; +} +.bg-amber-darken-2 { + color: #000000 !important; +} + +.bg-amber-darken-3 { + background-color: #ff8f00 !important; +} +.bg-amber-darken-3 { + color: #000000 !important; +} + +.bg-amber-darken-4 { + background-color: #ff6f00 !important; +} +.bg-amber-darken-4 { + color: #FFFFFF !important; +} + +.bg-amber-accent-1 { + background-color: #ffe57f !important; +} +.bg-amber-accent-1 { + color: #000000 !important; +} + +.bg-amber-accent-2 { + background-color: #ffd740 !important; +} +.bg-amber-accent-2 { + color: #000000 !important; +} + +.bg-amber-accent-3 { + background-color: #ffc400 !important; +} +.bg-amber-accent-3 { + color: #000000 !important; +} + +.bg-amber-accent-4 { + background-color: #ffab00 !important; +} +.bg-amber-accent-4 { + color: #000000 !important; +} + +.bg-orange { + background-color: #ff9800 !important; +} +.bg-orange { + color: #000000 !important; +} + +.bg-orange-lighten-5 { + background-color: #fff3e0 !important; +} +.bg-orange-lighten-5 { + color: #000000 !important; +} + +.bg-orange-lighten-4 { + background-color: #ffe0b2 !important; +} +.bg-orange-lighten-4 { + color: #000000 !important; +} + +.bg-orange-lighten-3 { + background-color: #ffcc80 !important; +} +.bg-orange-lighten-3 { + color: #000000 !important; +} + +.bg-orange-lighten-2 { + background-color: #ffb74d !important; +} +.bg-orange-lighten-2 { + color: #000000 !important; +} + +.bg-orange-lighten-1 { + background-color: #ffa726 !important; +} +.bg-orange-lighten-1 { + color: #000000 !important; +} + +.bg-orange-darken-1 { + background-color: #fb8c00 !important; +} +.bg-orange-darken-1 { + color: #FFFFFF !important; +} + +.bg-orange-darken-2 { + background-color: #f57c00 !important; +} +.bg-orange-darken-2 { + color: #FFFFFF !important; +} + +.bg-orange-darken-3 { + background-color: #ef6c00 !important; +} +.bg-orange-darken-3 { + color: #FFFFFF !important; +} + +.bg-orange-darken-4 { + background-color: #e65100 !important; +} +.bg-orange-darken-4 { + color: #FFFFFF !important; +} + +.bg-orange-accent-1 { + background-color: #ffd180 !important; +} +.bg-orange-accent-1 { + color: #000000 !important; +} + +.bg-orange-accent-2 { + background-color: #ffab40 !important; +} +.bg-orange-accent-2 { + color: #000000 !important; +} + +.bg-orange-accent-3 { + background-color: #ff9100 !important; +} +.bg-orange-accent-3 { + color: #000000 !important; +} + +.bg-orange-accent-4 { + background-color: #ff6d00 !important; +} +.bg-orange-accent-4 { + color: #FFFFFF !important; +} + +.bg-deep-orange { + background-color: #ff5722 !important; +} +.bg-deep-orange { + color: #FFFFFF !important; +} + +.bg-deep-orange-lighten-5 { + background-color: #fbe9e7 !important; +} +.bg-deep-orange-lighten-5 { + color: #000000 !important; +} + +.bg-deep-orange-lighten-4 { + background-color: #ffccbc !important; +} +.bg-deep-orange-lighten-4 { + color: #000000 !important; +} + +.bg-deep-orange-lighten-3 { + background-color: #ffab91 !important; +} +.bg-deep-orange-lighten-3 { + color: #000000 !important; +} + +.bg-deep-orange-lighten-2 { + background-color: #ff8a65 !important; +} +.bg-deep-orange-lighten-2 { + color: #000000 !important; +} + +.bg-deep-orange-lighten-1 { + background-color: #ff7043 !important; +} +.bg-deep-orange-lighten-1 { + color: #FFFFFF !important; +} + +.bg-deep-orange-darken-1 { + background-color: #f4511e !important; +} +.bg-deep-orange-darken-1 { + color: #FFFFFF !important; +} + +.bg-deep-orange-darken-2 { + background-color: #e64a19 !important; +} +.bg-deep-orange-darken-2 { + color: #FFFFFF !important; +} + +.bg-deep-orange-darken-3 { + background-color: #d84315 !important; +} +.bg-deep-orange-darken-3 { + color: #FFFFFF !important; +} + +.bg-deep-orange-darken-4 { + background-color: #bf360c !important; +} +.bg-deep-orange-darken-4 { + color: #FFFFFF !important; +} + +.bg-deep-orange-accent-1 { + background-color: #ff9e80 !important; +} +.bg-deep-orange-accent-1 { + color: #000000 !important; +} + +.bg-deep-orange-accent-2 { + background-color: #ff6e40 !important; +} +.bg-deep-orange-accent-2 { + color: #FFFFFF !important; +} + +.bg-deep-orange-accent-3 { + background-color: #ff3d00 !important; +} +.bg-deep-orange-accent-3 { + color: #FFFFFF !important; +} + +.bg-deep-orange-accent-4 { + background-color: #dd2c00 !important; +} +.bg-deep-orange-accent-4 { + color: #FFFFFF !important; +} + +.bg-brown { + background-color: #795548 !important; +} +.bg-brown { + color: #FFFFFF !important; +} + +.bg-brown-lighten-5 { + background-color: #efebe9 !important; +} +.bg-brown-lighten-5 { + color: #000000 !important; +} + +.bg-brown-lighten-4 { + background-color: #d7ccc8 !important; +} +.bg-brown-lighten-4 { + color: #000000 !important; +} + +.bg-brown-lighten-3 { + background-color: #bcaaa4 !important; +} +.bg-brown-lighten-3 { + color: #000000 !important; +} + +.bg-brown-lighten-2 { + background-color: #a1887f !important; +} +.bg-brown-lighten-2 { + color: #FFFFFF !important; +} + +.bg-brown-lighten-1 { + background-color: #8d6e63 !important; +} +.bg-brown-lighten-1 { + color: #FFFFFF !important; +} + +.bg-brown-darken-1 { + background-color: #6d4c41 !important; +} +.bg-brown-darken-1 { + color: #FFFFFF !important; +} + +.bg-brown-darken-2 { + background-color: #5d4037 !important; +} +.bg-brown-darken-2 { + color: #FFFFFF !important; +} + +.bg-brown-darken-3 { + background-color: #4e342e !important; +} +.bg-brown-darken-3 { + color: #FFFFFF !important; +} + +.bg-brown-darken-4 { + background-color: #3e2723 !important; +} +.bg-brown-darken-4 { + color: #FFFFFF !important; +} + +.bg-blue-grey { + background-color: #607d8b !important; +} +.bg-blue-grey { + color: #FFFFFF !important; +} + +.bg-blue-grey-lighten-5 { + background-color: #eceff1 !important; +} +.bg-blue-grey-lighten-5 { + color: #000000 !important; +} + +.bg-blue-grey-lighten-4 { + background-color: #cfd8dc !important; +} +.bg-blue-grey-lighten-4 { + color: #000000 !important; +} + +.bg-blue-grey-lighten-3 { + background-color: #b0bec5 !important; +} +.bg-blue-grey-lighten-3 { + color: #000000 !important; +} + +.bg-blue-grey-lighten-2 { + background-color: #90a4ae !important; +} +.bg-blue-grey-lighten-2 { + color: #FFFFFF !important; +} + +.bg-blue-grey-lighten-1 { + background-color: #78909c !important; +} +.bg-blue-grey-lighten-1 { + color: #FFFFFF !important; +} + +.bg-blue-grey-darken-1 { + background-color: #546e7a !important; +} +.bg-blue-grey-darken-1 { + color: #FFFFFF !important; +} + +.bg-blue-grey-darken-2 { + background-color: #455a64 !important; +} +.bg-blue-grey-darken-2 { + color: #FFFFFF !important; +} + +.bg-blue-grey-darken-3 { + background-color: #37474f !important; +} +.bg-blue-grey-darken-3 { + color: #FFFFFF !important; +} + +.bg-blue-grey-darken-4 { + background-color: #263238 !important; +} +.bg-blue-grey-darken-4 { + color: #FFFFFF !important; +} + +.bg-grey { + background-color: #9e9e9e !important; +} +.bg-grey { + color: #FFFFFF !important; +} + +.bg-grey-lighten-5 { + background-color: #fafafa !important; +} +.bg-grey-lighten-5 { + color: #000000 !important; +} + +.bg-grey-lighten-4 { + background-color: #f5f5f5 !important; +} +.bg-grey-lighten-4 { + color: #000000 !important; +} + +.bg-grey-lighten-3 { + background-color: #eeeeee !important; +} +.bg-grey-lighten-3 { + color: #000000 !important; +} + +.bg-grey-lighten-2 { + background-color: #e0e0e0 !important; +} +.bg-grey-lighten-2 { + color: #000000 !important; +} + +.bg-grey-lighten-1 { + background-color: #bdbdbd !important; +} +.bg-grey-lighten-1 { + color: #000000 !important; +} + +.bg-grey-darken-1 { + background-color: #757575 !important; +} +.bg-grey-darken-1 { + color: #FFFFFF !important; +} + +.bg-grey-darken-2 { + background-color: #616161 !important; +} +.bg-grey-darken-2 { + color: #FFFFFF !important; +} + +.bg-grey-darken-3 { + background-color: #424242 !important; +} +.bg-grey-darken-3 { + color: #FFFFFF !important; +} + +.bg-grey-darken-4 { + background-color: #212121 !important; +} +.bg-grey-darken-4 { + color: #FFFFFF !important; +} + +.bg-shades-black { + background-color: #000000 !important; +} +.bg-shades-black { + color: #FFFFFF !important; +} + +.bg-shades-white { + background-color: #FFFFFF !important; +} +.bg-shades-white { + color: #000000 !important; +} + +.bg-shades-transparent { + background-color: transparent !important; +} +.bg-shades-transparent { + color: currentColor !important; +} + +.text-black { + color: #000000 !important; +} + +.text-white { + color: #FFFFFF !important; +} + +.text-transparent { + color: transparent !important; +} + +.text-red { + color: #F44336 !important; +} + +.text-red-lighten-5 { + color: #FFEBEE !important; +} + +.text-red-lighten-4 { + color: #FFCDD2 !important; +} + +.text-red-lighten-3 { + color: #EF9A9A !important; +} + +.text-red-lighten-2 { + color: #E57373 !important; +} + +.text-red-lighten-1 { + color: #EF5350 !important; +} + +.text-red-darken-1 { + color: #E53935 !important; +} + +.text-red-darken-2 { + color: #D32F2F !important; +} + +.text-red-darken-3 { + color: #C62828 !important; +} + +.text-red-darken-4 { + color: #B71C1C !important; +} + +.text-red-accent-1 { + color: #FF8A80 !important; +} + +.text-red-accent-2 { + color: #FF5252 !important; +} + +.text-red-accent-3 { + color: #FF1744 !important; +} + +.text-red-accent-4 { + color: #D50000 !important; +} + +.text-pink { + color: #e91e63 !important; +} + +.text-pink-lighten-5 { + color: #fce4ec !important; +} + +.text-pink-lighten-4 { + color: #f8bbd0 !important; +} + +.text-pink-lighten-3 { + color: #f48fb1 !important; +} + +.text-pink-lighten-2 { + color: #f06292 !important; +} + +.text-pink-lighten-1 { + color: #ec407a !important; +} + +.text-pink-darken-1 { + color: #d81b60 !important; +} + +.text-pink-darken-2 { + color: #c2185b !important; +} + +.text-pink-darken-3 { + color: #ad1457 !important; +} + +.text-pink-darken-4 { + color: #880e4f !important; +} + +.text-pink-accent-1 { + color: #ff80ab !important; +} + +.text-pink-accent-2 { + color: #ff4081 !important; +} + +.text-pink-accent-3 { + color: #f50057 !important; +} + +.text-pink-accent-4 { + color: #c51162 !important; +} + +.text-purple { + color: #9c27b0 !important; +} + +.text-purple-lighten-5 { + color: #f3e5f5 !important; +} + +.text-purple-lighten-4 { + color: #e1bee7 !important; +} + +.text-purple-lighten-3 { + color: #ce93d8 !important; +} + +.text-purple-lighten-2 { + color: #ba68c8 !important; +} + +.text-purple-lighten-1 { + color: #ab47bc !important; +} + +.text-purple-darken-1 { + color: #8e24aa !important; +} + +.text-purple-darken-2 { + color: #7b1fa2 !important; +} + +.text-purple-darken-3 { + color: #6a1b9a !important; +} + +.text-purple-darken-4 { + color: #4a148c !important; +} + +.text-purple-accent-1 { + color: #ea80fc !important; +} + +.text-purple-accent-2 { + color: #e040fb !important; +} + +.text-purple-accent-3 { + color: #d500f9 !important; +} + +.text-purple-accent-4 { + color: #aa00ff !important; +} + +.text-deep-purple { + color: #673ab7 !important; +} + +.text-deep-purple-lighten-5 { + color: #ede7f6 !important; +} + +.text-deep-purple-lighten-4 { + color: #d1c4e9 !important; +} + +.text-deep-purple-lighten-3 { + color: #b39ddb !important; +} + +.text-deep-purple-lighten-2 { + color: #9575cd !important; +} + +.text-deep-purple-lighten-1 { + color: #7e57c2 !important; +} + +.text-deep-purple-darken-1 { + color: #5e35b1 !important; +} + +.text-deep-purple-darken-2 { + color: #512da8 !important; +} + +.text-deep-purple-darken-3 { + color: #4527a0 !important; +} + +.text-deep-purple-darken-4 { + color: #311b92 !important; +} + +.text-deep-purple-accent-1 { + color: #b388ff !important; +} + +.text-deep-purple-accent-2 { + color: #7c4dff !important; +} + +.text-deep-purple-accent-3 { + color: #651fff !important; +} + +.text-deep-purple-accent-4 { + color: #6200ea !important; +} + +.text-indigo { + color: #3f51b5 !important; +} + +.text-indigo-lighten-5 { + color: #e8eaf6 !important; +} + +.text-indigo-lighten-4 { + color: #c5cae9 !important; +} + +.text-indigo-lighten-3 { + color: #9fa8da !important; +} + +.text-indigo-lighten-2 { + color: #7986cb !important; +} + +.text-indigo-lighten-1 { + color: #5c6bc0 !important; +} + +.text-indigo-darken-1 { + color: #3949ab !important; +} + +.text-indigo-darken-2 { + color: #303f9f !important; +} + +.text-indigo-darken-3 { + color: #283593 !important; +} + +.text-indigo-darken-4 { + color: #1a237e !important; +} + +.text-indigo-accent-1 { + color: #8c9eff !important; +} + +.text-indigo-accent-2 { + color: #536dfe !important; +} + +.text-indigo-accent-3 { + color: #3d5afe !important; +} + +.text-indigo-accent-4 { + color: #304ffe !important; +} + +.text-blue { + color: #2196F3 !important; +} + +.text-blue-lighten-5 { + color: #E3F2FD !important; +} + +.text-blue-lighten-4 { + color: #BBDEFB !important; +} + +.text-blue-lighten-3 { + color: #90CAF9 !important; +} + +.text-blue-lighten-2 { + color: #64B5F6 !important; +} + +.text-blue-lighten-1 { + color: #42A5F5 !important; +} + +.text-blue-darken-1 { + color: #1E88E5 !important; +} + +.text-blue-darken-2 { + color: #1976D2 !important; +} + +.text-blue-darken-3 { + color: #1565C0 !important; +} + +.text-blue-darken-4 { + color: #0D47A1 !important; +} + +.text-blue-accent-1 { + color: #82B1FF !important; +} + +.text-blue-accent-2 { + color: #448AFF !important; +} + +.text-blue-accent-3 { + color: #2979FF !important; +} + +.text-blue-accent-4 { + color: #2962FF !important; +} + +.text-light-blue { + color: #03a9f4 !important; +} + +.text-light-blue-lighten-5 { + color: #e1f5fe !important; +} + +.text-light-blue-lighten-4 { + color: #b3e5fc !important; +} + +.text-light-blue-lighten-3 { + color: #81d4fa !important; +} + +.text-light-blue-lighten-2 { + color: #4fc3f7 !important; +} + +.text-light-blue-lighten-1 { + color: #29b6f6 !important; +} + +.text-light-blue-darken-1 { + color: #039be5 !important; +} + +.text-light-blue-darken-2 { + color: #0288d1 !important; +} + +.text-light-blue-darken-3 { + color: #0277bd !important; +} + +.text-light-blue-darken-4 { + color: #01579b !important; +} + +.text-light-blue-accent-1 { + color: #80d8ff !important; +} + +.text-light-blue-accent-2 { + color: #40c4ff !important; +} + +.text-light-blue-accent-3 { + color: #00b0ff !important; +} + +.text-light-blue-accent-4 { + color: #0091ea !important; +} + +.text-cyan { + color: #00bcd4 !important; +} + +.text-cyan-lighten-5 { + color: #e0f7fa !important; +} + +.text-cyan-lighten-4 { + color: #b2ebf2 !important; +} + +.text-cyan-lighten-3 { + color: #80deea !important; +} + +.text-cyan-lighten-2 { + color: #4dd0e1 !important; +} + +.text-cyan-lighten-1 { + color: #26c6da !important; +} + +.text-cyan-darken-1 { + color: #00acc1 !important; +} + +.text-cyan-darken-2 { + color: #0097a7 !important; +} + +.text-cyan-darken-3 { + color: #00838f !important; +} + +.text-cyan-darken-4 { + color: #006064 !important; +} + +.text-cyan-accent-1 { + color: #84ffff !important; +} + +.text-cyan-accent-2 { + color: #18ffff !important; +} + +.text-cyan-accent-3 { + color: #00e5ff !important; +} + +.text-cyan-accent-4 { + color: #00b8d4 !important; +} + +.text-teal { + color: #009688 !important; +} + +.text-teal-lighten-5 { + color: #e0f2f1 !important; +} + +.text-teal-lighten-4 { + color: #b2dfdb !important; +} + +.text-teal-lighten-3 { + color: #80cbc4 !important; +} + +.text-teal-lighten-2 { + color: #4db6ac !important; +} + +.text-teal-lighten-1 { + color: #26a69a !important; +} + +.text-teal-darken-1 { + color: #00897b !important; +} + +.text-teal-darken-2 { + color: #00796b !important; +} + +.text-teal-darken-3 { + color: #00695c !important; +} + +.text-teal-darken-4 { + color: #004d40 !important; +} + +.text-teal-accent-1 { + color: #a7ffeb !important; +} + +.text-teal-accent-2 { + color: #64ffda !important; +} + +.text-teal-accent-3 { + color: #1de9b6 !important; +} + +.text-teal-accent-4 { + color: #00bfa5 !important; +} + +.text-green { + color: #4CAF50 !important; +} + +.text-green-lighten-5 { + color: #E8F5E9 !important; +} + +.text-green-lighten-4 { + color: #C8E6C9 !important; +} + +.text-green-lighten-3 { + color: #A5D6A7 !important; +} + +.text-green-lighten-2 { + color: #81C784 !important; +} + +.text-green-lighten-1 { + color: #66BB6A !important; +} + +.text-green-darken-1 { + color: #43A047 !important; +} + +.text-green-darken-2 { + color: #388E3C !important; +} + +.text-green-darken-3 { + color: #2E7D32 !important; +} + +.text-green-darken-4 { + color: #1B5E20 !important; +} + +.text-green-accent-1 { + color: #B9F6CA !important; +} + +.text-green-accent-2 { + color: #69F0AE !important; +} + +.text-green-accent-3 { + color: #00E676 !important; +} + +.text-green-accent-4 { + color: #00C853 !important; +} + +.text-light-green { + color: #8bc34a !important; +} + +.text-light-green-lighten-5 { + color: #f1f8e9 !important; +} + +.text-light-green-lighten-4 { + color: #dcedc8 !important; +} + +.text-light-green-lighten-3 { + color: #c5e1a5 !important; +} + +.text-light-green-lighten-2 { + color: #aed581 !important; +} + +.text-light-green-lighten-1 { + color: #9ccc65 !important; +} + +.text-light-green-darken-1 { + color: #7cb342 !important; +} + +.text-light-green-darken-2 { + color: #689f38 !important; +} + +.text-light-green-darken-3 { + color: #558b2f !important; +} + +.text-light-green-darken-4 { + color: #33691e !important; +} + +.text-light-green-accent-1 { + color: #ccff90 !important; +} + +.text-light-green-accent-2 { + color: #b2ff59 !important; +} + +.text-light-green-accent-3 { + color: #76ff03 !important; +} + +.text-light-green-accent-4 { + color: #64dd17 !important; +} + +.text-lime { + color: #cddc39 !important; +} + +.text-lime-lighten-5 { + color: #f9fbe7 !important; +} + +.text-lime-lighten-4 { + color: #f0f4c3 !important; +} + +.text-lime-lighten-3 { + color: #e6ee9c !important; +} + +.text-lime-lighten-2 { + color: #dce775 !important; +} + +.text-lime-lighten-1 { + color: #d4e157 !important; +} + +.text-lime-darken-1 { + color: #c0ca33 !important; +} + +.text-lime-darken-2 { + color: #afb42b !important; +} + +.text-lime-darken-3 { + color: #9e9d24 !important; +} + +.text-lime-darken-4 { + color: #827717 !important; +} + +.text-lime-accent-1 { + color: #f4ff81 !important; +} + +.text-lime-accent-2 { + color: #eeff41 !important; +} + +.text-lime-accent-3 { + color: #c6ff00 !important; +} + +.text-lime-accent-4 { + color: #aeea00 !important; +} + +.text-yellow { + color: #ffeb3b !important; +} + +.text-yellow-lighten-5 { + color: #fffde7 !important; +} + +.text-yellow-lighten-4 { + color: #fff9c4 !important; +} + +.text-yellow-lighten-3 { + color: #fff59d !important; +} + +.text-yellow-lighten-2 { + color: #fff176 !important; +} + +.text-yellow-lighten-1 { + color: #ffee58 !important; +} + +.text-yellow-darken-1 { + color: #fdd835 !important; +} + +.text-yellow-darken-2 { + color: #fbc02d !important; +} + +.text-yellow-darken-3 { + color: #f9a825 !important; +} + +.text-yellow-darken-4 { + color: #f57f17 !important; +} + +.text-yellow-accent-1 { + color: #ffff8d !important; +} + +.text-yellow-accent-2 { + color: #ffff00 !important; +} + +.text-yellow-accent-3 { + color: #ffea00 !important; +} + +.text-yellow-accent-4 { + color: #ffd600 !important; +} + +.text-amber { + color: #ffc107 !important; +} + +.text-amber-lighten-5 { + color: #fff8e1 !important; +} + +.text-amber-lighten-4 { + color: #ffecb3 !important; +} + +.text-amber-lighten-3 { + color: #ffe082 !important; +} + +.text-amber-lighten-2 { + color: #ffd54f !important; +} + +.text-amber-lighten-1 { + color: #ffca28 !important; +} + +.text-amber-darken-1 { + color: #ffb300 !important; +} + +.text-amber-darken-2 { + color: #ffa000 !important; +} + +.text-amber-darken-3 { + color: #ff8f00 !important; +} + +.text-amber-darken-4 { + color: #ff6f00 !important; +} + +.text-amber-accent-1 { + color: #ffe57f !important; +} + +.text-amber-accent-2 { + color: #ffd740 !important; +} + +.text-amber-accent-3 { + color: #ffc400 !important; +} + +.text-amber-accent-4 { + color: #ffab00 !important; +} + +.text-orange { + color: #ff9800 !important; +} + +.text-orange-lighten-5 { + color: #fff3e0 !important; +} + +.text-orange-lighten-4 { + color: #ffe0b2 !important; +} + +.text-orange-lighten-3 { + color: #ffcc80 !important; +} + +.text-orange-lighten-2 { + color: #ffb74d !important; +} + +.text-orange-lighten-1 { + color: #ffa726 !important; +} + +.text-orange-darken-1 { + color: #fb8c00 !important; +} + +.text-orange-darken-2 { + color: #f57c00 !important; +} + +.text-orange-darken-3 { + color: #ef6c00 !important; +} + +.text-orange-darken-4 { + color: #e65100 !important; +} + +.text-orange-accent-1 { + color: #ffd180 !important; +} + +.text-orange-accent-2 { + color: #ffab40 !important; +} + +.text-orange-accent-3 { + color: #ff9100 !important; +} + +.text-orange-accent-4 { + color: #ff6d00 !important; +} + +.text-deep-orange { + color: #ff5722 !important; +} + +.text-deep-orange-lighten-5 { + color: #fbe9e7 !important; +} + +.text-deep-orange-lighten-4 { + color: #ffccbc !important; +} + +.text-deep-orange-lighten-3 { + color: #ffab91 !important; +} + +.text-deep-orange-lighten-2 { + color: #ff8a65 !important; +} + +.text-deep-orange-lighten-1 { + color: #ff7043 !important; +} + +.text-deep-orange-darken-1 { + color: #f4511e !important; +} + +.text-deep-orange-darken-2 { + color: #e64a19 !important; +} + +.text-deep-orange-darken-3 { + color: #d84315 !important; +} + +.text-deep-orange-darken-4 { + color: #bf360c !important; +} + +.text-deep-orange-accent-1 { + color: #ff9e80 !important; +} + +.text-deep-orange-accent-2 { + color: #ff6e40 !important; +} + +.text-deep-orange-accent-3 { + color: #ff3d00 !important; +} + +.text-deep-orange-accent-4 { + color: #dd2c00 !important; +} + +.text-brown { + color: #795548 !important; +} + +.text-brown-lighten-5 { + color: #efebe9 !important; +} + +.text-brown-lighten-4 { + color: #d7ccc8 !important; +} + +.text-brown-lighten-3 { + color: #bcaaa4 !important; +} + +.text-brown-lighten-2 { + color: #a1887f !important; +} + +.text-brown-lighten-1 { + color: #8d6e63 !important; +} + +.text-brown-darken-1 { + color: #6d4c41 !important; +} + +.text-brown-darken-2 { + color: #5d4037 !important; +} + +.text-brown-darken-3 { + color: #4e342e !important; +} + +.text-brown-darken-4 { + color: #3e2723 !important; +} + +.text-blue-grey { + color: #607d8b !important; +} + +.text-blue-grey-lighten-5 { + color: #eceff1 !important; +} + +.text-blue-grey-lighten-4 { + color: #cfd8dc !important; +} + +.text-blue-grey-lighten-3 { + color: #b0bec5 !important; +} + +.text-blue-grey-lighten-2 { + color: #90a4ae !important; +} + +.text-blue-grey-lighten-1 { + color: #78909c !important; +} + +.text-blue-grey-darken-1 { + color: #546e7a !important; +} + +.text-blue-grey-darken-2 { + color: #455a64 !important; +} + +.text-blue-grey-darken-3 { + color: #37474f !important; +} + +.text-blue-grey-darken-4 { + color: #263238 !important; +} + +.text-grey { + color: #9e9e9e !important; +} + +.text-grey-lighten-5 { + color: #fafafa !important; +} + +.text-grey-lighten-4 { + color: #f5f5f5 !important; +} + +.text-grey-lighten-3 { + color: #eeeeee !important; +} + +.text-grey-lighten-2 { + color: #e0e0e0 !important; +} + +.text-grey-lighten-1 { + color: #bdbdbd !important; +} + +.text-grey-darken-1 { + color: #757575 !important; +} + +.text-grey-darken-2 { + color: #616161 !important; +} + +.text-grey-darken-3 { + color: #424242 !important; +} + +.text-grey-darken-4 { + color: #212121 !important; +} + +.text-shades-black { + color: #000000 !important; +} + +.text-shades-white { + color: #FFFFFF !important; +} + +.text-shades-transparent { + color: transparent !important; +} + +/*! + * ress.css • v2.0.4 + * MIT License + * github.com/filipelinhares/ress + */ +/* # ================================================================= + # Global selectors + # ================================================================= */ +html { + box-sizing: border-box; + overflow-y: scroll; /* All browsers without overlaying scrollbars */ + -webkit-text-size-adjust: 100%; /* Prevent adjustments of font size after orientation changes in iOS */ + word-break: normal; + -moz-tab-size: 4; + tab-size: 4; +} + +*, +::before, +::after { + background-repeat: no-repeat; /* Set `background-repeat: no-repeat` to all elements and pseudo elements */ + box-sizing: inherit; +} + +::before, +::after { + text-decoration: inherit; /* Inherit text-decoration and vertical align to ::before and ::after pseudo elements */ + vertical-align: inherit; +} + +* { + padding: 0; /* Reset `padding` and `margin` of all elements */ + margin: 0; +} + +/* # ================================================================= + # General elements + # ================================================================= */ +hr { + overflow: visible; /* Show the overflow in Edge and IE */ + height: 0; /* Add the correct box sizing in Firefox */ +} + +details, +main { + display: block; /* Render the `main` element consistently in IE. */ +} + +summary { + display: list-item; /* Add the correct display in all browsers */ +} + +small { + font-size: 80%; /* Set font-size to 80% in `small` elements */ +} + +[hidden] { + display: none; /* Add the correct display in IE */ +} + +abbr[title] { + border-bottom: none; /* Remove the bottom border in Chrome 57 */ + /* Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari */ + text-decoration: underline; + text-decoration: underline dotted; +} + +a { + background-color: transparent; /* Remove the gray background on active links in IE 10 */ +} + +a:active, +a:hover { + outline-width: 0; /* Remove the outline when hovering in all browsers */ +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; /* Specify the font family of code elements */ +} + +pre { + font-size: 1em; /* Correct the odd `em` font sizing in all browsers */ +} + +b, +strong { + font-weight: bolder; /* Add the correct font weight in Chrome, Edge, and Safari */ +} + +/* https://gist.github.com/unruthless/413930 */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* # ================================================================= + # Forms + # ================================================================= */ +input { + border-radius: 0; +} + +/* Replace pointer cursor in disabled elements */ +[disabled] { + cursor: default; +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; /* Correct the cursor style of increment and decrement buttons in Chrome */ +} + +[type=search] { + -webkit-appearance: textfield; /* Correct the odd appearance in Chrome and Safari */ + outline-offset: -2px; /* Correct the outline style in Safari */ +} + +[type=search]::-webkit-search-cancel-button, +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; /* Remove the inner padding in Chrome and Safari on macOS */ +} + +textarea { + overflow: auto; /* Internet Explorer 11+ */ + resize: vertical; /* Specify textarea resizability */ +} + +button, +input, +optgroup, +select, +textarea { + font: inherit; /* Specify font inheritance of form elements */ +} + +optgroup { + font-weight: bold; /* Restore the font weight unset by the previous rule */ +} + +button { + overflow: visible; /* Address `overflow` set to `hidden` in IE 8/9/10/11 */ +} + +button, +select { + text-transform: none; /* Firefox 40+, Internet Explorer 11- */ +} + +/* Apply cursor pointer to button elements */ +button, +[type=button], +[type=reset], +[type=submit], +[role=button] { + cursor: pointer; + color: inherit; +} + +/* Remove inner padding and border in Firefox 4+ */ +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/* Replace focus style removed in the border reset above */ +button:-moz-focusring, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + outline: 1px dotted ButtonText; +} + +button, +html [type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; /* Correct the inability to style clickable types in iOS */ +} + +/* Remove the default button styling in all browsers */ +button, +input, +select, +textarea { + background-color: transparent; + border-style: none; +} + +/* Style select like a standard input */ +select { + -moz-appearance: none; /* Firefox 36+ */ + -webkit-appearance: none; /* Chrome 41+ */ +} + +select::-ms-expand { + display: none; /* Internet Explorer 11+ */ +} + +select::-ms-value { + color: currentColor; /* Internet Explorer 11+ */ +} + +legend { + border: 0; /* Correct `color` not being inherited in IE 8/9/10/11 */ + color: inherit; /* Correct the color inheritance from `fieldset` elements in IE */ + display: table; /* Correct the text wrapping in Edge and IE */ + max-width: 100%; /* Correct the text wrapping in Edge and IE */ + white-space: normal; /* Correct the text wrapping in Edge and IE */ + max-width: 100%; /* Correct the text wrapping in Edge 18- and IE */ +} + +::-webkit-file-upload-button { + /* Correct the inability to style clickable types in iOS and Safari */ + -webkit-appearance: button; + color: inherit; + font: inherit; /* Change font properties to `inherit` in Chrome and Safari */ +} + +::-ms-clear, +::-ms-reveal { + display: none; +} + +/* # ================================================================= + # Specify media element style + # ================================================================= */ +img { + border-style: none; /* Remove border when inside `a` element in IE 8/9/10 */ +} + +/* Add the correct vertical alignment in Chrome, Firefox, and Opera */ +progress { + vertical-align: baseline; +} + +/* # ================================================================= + # Accessibility + # ================================================================= */ +/* Hide content from screens but not screenreaders */ +@media screen { + [hidden~=screen] { + display: inherit; + } + [hidden~=screen]:not(:active):not(:focus):not(:target) { + position: absolute !important; + clip: rect(0 0 0 0) !important; + } +} +/* Specify the progress cursor of updating elements */ +[aria-busy=true] { + cursor: progress; +} + +/* Specify the pointer cursor of trigger elements */ +[aria-controls] { + cursor: pointer; +} + +/* Specify the unstyled cursor of disabled, not-editable, or otherwise inoperable elements */ +[aria-disabled=true] { + cursor: default; +} + +.dialog-transition-enter-active, +.dialog-bottom-transition-enter-active, +.dialog-top-transition-enter-active { + transition-duration: 225ms !important; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1) !important; +} +.dialog-transition-leave-active, +.dialog-bottom-transition-leave-active, +.dialog-top-transition-leave-active { + transition-duration: 125ms !important; + transition-timing-function: cubic-bezier(0.4, 0, 1, 1) !important; +} +.dialog-transition-enter-active, .dialog-transition-leave-active, +.dialog-bottom-transition-enter-active, +.dialog-bottom-transition-leave-active, +.dialog-top-transition-enter-active, +.dialog-top-transition-leave-active { + transition-property: transform, opacity !important; + pointer-events: none; +} + +.dialog-transition-enter-from, .dialog-transition-leave-to { + transform: scale(0.9); + opacity: 0; +} +.dialog-transition-enter-to, .dialog-transition-leave-from { + opacity: 1; +} + +.dialog-bottom-transition-enter-from, .dialog-bottom-transition-leave-to { + transform: translateY(calc(50vh + 50%)); +} + +.dialog-top-transition-enter-from, .dialog-top-transition-leave-to { + transform: translateY(calc(-50vh - 50%)); +} + +.picker-transition-enter-active, +.picker-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-leave-active, +.picker-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-move, +.picker-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-enter-from, .picker-transition-leave-to, +.picker-reverse-transition-enter-from, +.picker-reverse-transition-leave-to { + opacity: 0; +} +.picker-transition-leave-from, .picker-transition-leave-active, .picker-transition-leave-to, +.picker-reverse-transition-leave-from, +.picker-reverse-transition-leave-active, +.picker-reverse-transition-leave-to { + position: absolute !important; +} +.picker-transition-enter-active, .picker-transition-leave-active, +.picker-reverse-transition-enter-active, +.picker-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.picker-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-enter-from { + transform: translate(100%, 0); +} +.picker-transition-leave-to { + transform: translate(-100%, 0); +} + +.picker-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-reverse-transition-enter-from { + transform: translate(-100%, 0); +} +.picker-reverse-transition-leave-to { + transform: translate(100%, 0); +} + +.expand-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-transition-enter-active, .expand-transition-leave-active { + transition-property: height !important; +} + +.expand-x-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-x-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-x-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-x-transition-enter-active, .expand-x-transition-leave-active { + transition-property: width !important; +} + +.scale-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-transition-leave-to { + opacity: 0; +} +.scale-transition-leave-active { + transition-duration: 100ms !important; +} +.scale-transition-enter-from { + opacity: 0; + transform: scale(0); +} +.scale-transition-enter-active, .scale-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scale-rotate-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-transition-leave-to { + opacity: 0; +} +.scale-rotate-transition-leave-active { + transition-duration: 100ms !important; +} +.scale-rotate-transition-enter-from { + opacity: 0; + transform: scale(0) rotate(-45deg); +} +.scale-rotate-transition-enter-active, .scale-rotate-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scale-rotate-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-reverse-transition-leave-to { + opacity: 0; +} +.scale-rotate-reverse-transition-leave-active { + transition-duration: 100ms !important; +} +.scale-rotate-reverse-transition-enter-from { + opacity: 0; + transform: scale(0) rotate(45deg); +} +.scale-rotate-reverse-transition-enter-active, .scale-rotate-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.message-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.message-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.message-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.message-transition-enter-from, .message-transition-leave-to { + opacity: 0; + transform: translateY(-15px); +} +.message-transition-leave-from, .message-transition-leave-active { + position: absolute; +} +.message-transition-enter-active, .message-transition-leave-active { + transition-property: transform, opacity !important; +} + +.slide-y-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-transition-enter-from, .slide-y-transition-leave-to { + opacity: 0; + transform: translateY(-15px); +} +.slide-y-transition-enter-active, .slide-y-transition-leave-active { + transition-property: transform, opacity !important; +} + +.slide-y-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-reverse-transition-enter-from, .slide-y-reverse-transition-leave-to { + opacity: 0; + transform: translateY(15px); +} +.slide-y-reverse-transition-enter-active, .slide-y-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scroll-y-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-transition-enter-from, .scroll-y-transition-leave-to { + opacity: 0; +} +.scroll-y-transition-enter-from { + transform: translateY(-15px); +} +.scroll-y-transition-leave-to { + transform: translateY(15px); +} +.scroll-y-transition-enter-active, .scroll-y-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scroll-y-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-reverse-transition-enter-from, .scroll-y-reverse-transition-leave-to { + opacity: 0; +} +.scroll-y-reverse-transition-enter-from { + transform: translateY(15px); +} +.scroll-y-reverse-transition-leave-to { + transform: translateY(-15px); +} +.scroll-y-reverse-transition-enter-active, .scroll-y-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scroll-x-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-transition-enter-from, .scroll-x-transition-leave-to { + opacity: 0; +} +.scroll-x-transition-enter-from { + transform: translateX(-15px); +} +.scroll-x-transition-leave-to { + transform: translateX(15px); +} +.scroll-x-transition-enter-active, .scroll-x-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scroll-x-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-reverse-transition-enter-from, .scroll-x-reverse-transition-leave-to { + opacity: 0; +} +.scroll-x-reverse-transition-enter-from { + transform: translateX(15px); +} +.scroll-x-reverse-transition-leave-to { + transform: translateX(-15px); +} +.scroll-x-reverse-transition-enter-active, .scroll-x-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.slide-x-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-transition-enter-from, .slide-x-transition-leave-to { + opacity: 0; + transform: translateX(-15px); +} +.slide-x-transition-enter-active, .slide-x-transition-leave-active { + transition-property: transform, opacity !important; +} + +.slide-x-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-reverse-transition-enter-from, .slide-x-reverse-transition-leave-to { + opacity: 0; + transform: translateX(15px); +} +.slide-x-reverse-transition-enter-active, .slide-x-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.fade-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fade-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fade-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fade-transition-enter-from, .fade-transition-leave-to { + opacity: 0 !important; +} +.fade-transition-enter-active, .fade-transition-leave-active { + transition-property: opacity !important; +} + +.fab-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fab-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fab-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fab-transition-enter-from, .fab-transition-leave-to { + transform: scale(0) rotate(-45deg); +} +.fab-transition-enter-active, .fab-transition-leave-active { + transition-property: transform !important; +} + +.blockquote { + padding: 16px 0 16px 24px; + font-size: 18px; + font-weight: 300; +} + +html { + font-family: "Roboto", sans-serif; + line-height: 1.5; + font-size: 1rem; + overflow-x: hidden; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +html.overflow-y-hidden { + overflow-y: hidden !important; +} + +:root { + --v-theme-overlay-multiplier: 1; + --v-scrollbar-offset: 0px; +} + +@supports (-webkit-touch-callout: none) { + body { + cursor: pointer; + } +} +@media only print { + .hidden-print-only { + display: none !important; + } +} + +@media only screen { + .hidden-screen-only { + display: none !important; + } +} + +@media (max-width: 599.98px) { + .hidden-xs { + display: none !important; + } +} + +@media (min-width: 600px) and (max-width: 959.98px) { + .hidden-sm { + display: none !important; + } +} + +@media (min-width: 960px) and (max-width: 1279.98px) { + .hidden-md { + display: none !important; + } +} + +@media (min-width: 1280px) and (max-width: 1919.98px) { + .hidden-lg { + display: none !important; + } +} + +@media (min-width: 1920px) and (max-width: 2559.98px) { + .hidden-xl { + display: none !important; + } +} + +@media (min-width: 2560px) { + .hidden-xxl { + display: none !important; + } +} + +@media (min-width: 600px) { + .hidden-sm-and-up { + display: none !important; + } +} + +@media (min-width: 960px) { + .hidden-md-and-up { + display: none !important; + } +} + +@media (min-width: 1280px) { + .hidden-lg-and-up { + display: none !important; + } +} + +@media (min-width: 1920px) { + .hidden-xl-and-up { + display: none !important; + } +} + +@media (max-width: 959.98px) { + .hidden-sm-and-down { + display: none !important; + } +} + +@media (max-width: 1279.98px) { + .hidden-md-and-down { + display: none !important; + } +} + +@media (max-width: 1919.98px) { + .hidden-lg-and-down { + display: none !important; + } +} + +@media (max-width: 2559.98px) { + .hidden-xl-and-down { + display: none !important; + } +} + +.elevation-24 { + box-shadow: 0px 11px 15px -7px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 24px 38px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 9px 46px 8px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-23 { + box-shadow: 0px 11px 14px -7px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 23px 36px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 9px 44px 8px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-22 { + box-shadow: 0px 10px 14px -6px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 22px 35px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 8px 42px 7px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-21 { + box-shadow: 0px 10px 13px -6px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 21px 33px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 8px 40px 7px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-20 { + box-shadow: 0px 10px 13px -6px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 20px 31px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 8px 38px 7px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-19 { + box-shadow: 0px 9px 12px -6px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 19px 29px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 7px 36px 6px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-18 { + box-shadow: 0px 9px 11px -5px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 18px 28px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 7px 34px 6px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-17 { + box-shadow: 0px 8px 11px -5px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 17px 26px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 6px 32px 5px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-16 { + box-shadow: 0px 8px 10px -5px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 16px 24px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 6px 30px 5px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-15 { + box-shadow: 0px 8px 9px -5px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 15px 22px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 6px 28px 5px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-14 { + box-shadow: 0px 7px 9px -4px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 14px 21px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 5px 26px 4px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-13 { + box-shadow: 0px 7px 8px -4px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 13px 19px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 5px 24px 4px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-12 { + box-shadow: 0px 7px 8px -4px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 12px 17px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 5px 22px 4px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-11 { + box-shadow: 0px 6px 7px -4px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 11px 15px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 4px 20px 3px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-10 { + box-shadow: 0px 6px 6px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 10px 14px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 4px 18px 3px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-9 { + box-shadow: 0px 5px 6px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 9px 12px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 3px 16px 2px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-8 { + box-shadow: 0px 5px 5px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 8px 10px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 3px 14px 2px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-7 { + box-shadow: 0px 4px 5px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 7px 10px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 2px 16px 1px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-6 { + box-shadow: 0px 3px 5px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 6px 10px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 18px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-5 { + box-shadow: 0px 3px 5px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 5px 8px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 14px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-4 { + box-shadow: 0px 2px 4px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 4px 5px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 10px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-3 { + box-shadow: 0px 3px 3px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 3px 4px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 8px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-2 { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-1 { + box-shadow: 0px 2px 1px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 1px 1px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 3px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-0 { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.d-sr-only, +.d-sr-only-focusable:not(:focus) { + border: 0 !important; + clip: rect(0, 0, 0, 0) !important; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 1px !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.overflow-x-auto { + overflow-x: auto !important; +} + +.overflow-x-hidden { + overflow-x: hidden !important; +} + +.overflow-x-scroll { + overflow-x: scroll !important; +} + +.overflow-y-auto { + overflow-y: auto !important; +} + +.overflow-y-hidden { + overflow-y: hidden !important; +} + +.overflow-y-scroll { + overflow-y: scroll !important; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.float-none { + float: none !important; +} + +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-1-1 { + flex: 1 1 auto !important; +} + +.flex-1-0 { + flex: 1 0 auto !important; +} + +.flex-0-1 { + flex: 0 1 auto !important; +} + +.flex-0-0 { + flex: 0 0 auto !important; +} + +.flex-1-1-100 { + flex: 1 1 100% !important; +} + +.flex-1-0-100 { + flex: 1 0 100% !important; +} + +.flex-0-1-100 { + flex: 0 1 100% !important; +} + +.flex-0-0-100 { + flex: 0 0 100% !important; +} + +.flex-1-1-0 { + flex: 1 1 0 !important; +} + +.flex-1-0-0 { + flex: 1 0 0 !important; +} + +.flex-0-1-0 { + flex: 0 1 0 !important; +} + +.flex-0-0-0 { + flex: 0 0 0 !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.justify-start { + justify-content: flex-start !important; +} + +.justify-end { + justify-content: flex-end !important; +} + +.justify-center { + justify-content: center !important; +} + +.justify-space-between { + justify-content: space-between !important; +} + +.justify-space-around { + justify-content: space-around !important; +} + +.justify-space-evenly { + justify-content: space-evenly !important; +} + +.align-start { + align-items: flex-start !important; +} + +.align-end { + align-items: flex-end !important; +} + +.align-center { + align-items: center !important; +} + +.align-baseline { + align-items: baseline !important; +} + +.align-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-space-between { + align-content: space-between !important; +} + +.align-content-space-around { + align-content: space-around !important; +} + +.align-content-space-evenly { + align-content: space-evenly !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-6 { + order: 6 !important; +} + +.order-7 { + order: 7 !important; +} + +.order-8 { + order: 8 !important; +} + +.order-9 { + order: 9 !important; +} + +.order-10 { + order: 10 !important; +} + +.order-11 { + order: 11 !important; +} + +.order-12 { + order: 12 !important; +} + +.order-last { + order: 13 !important; +} + +.ga-0 { + gap: 0px !important; +} + +.ga-1 { + gap: 4px !important; +} + +.ga-2 { + gap: 8px !important; +} + +.ga-3 { + gap: 12px !important; +} + +.ga-4 { + gap: 16px !important; +} + +.ga-5 { + gap: 20px !important; +} + +.ga-6 { + gap: 24px !important; +} + +.ga-7 { + gap: 28px !important; +} + +.ga-8 { + gap: 32px !important; +} + +.ga-9 { + gap: 36px !important; +} + +.ga-10 { + gap: 40px !important; +} + +.ga-11 { + gap: 44px !important; +} + +.ga-12 { + gap: 48px !important; +} + +.ga-13 { + gap: 52px !important; +} + +.ga-14 { + gap: 56px !important; +} + +.ga-15 { + gap: 60px !important; +} + +.ga-16 { + gap: 64px !important; +} + +.ga-auto { + gap: auto !important; +} + +.gr-0 { + row-gap: 0px !important; +} + +.gr-1 { + row-gap: 4px !important; +} + +.gr-2 { + row-gap: 8px !important; +} + +.gr-3 { + row-gap: 12px !important; +} + +.gr-4 { + row-gap: 16px !important; +} + +.gr-5 { + row-gap: 20px !important; +} + +.gr-6 { + row-gap: 24px !important; +} + +.gr-7 { + row-gap: 28px !important; +} + +.gr-8 { + row-gap: 32px !important; +} + +.gr-9 { + row-gap: 36px !important; +} + +.gr-10 { + row-gap: 40px !important; +} + +.gr-11 { + row-gap: 44px !important; +} + +.gr-12 { + row-gap: 48px !important; +} + +.gr-13 { + row-gap: 52px !important; +} + +.gr-14 { + row-gap: 56px !important; +} + +.gr-15 { + row-gap: 60px !important; +} + +.gr-16 { + row-gap: 64px !important; +} + +.gr-auto { + row-gap: auto !important; +} + +.gc-0 { + column-gap: 0px !important; +} + +.gc-1 { + column-gap: 4px !important; +} + +.gc-2 { + column-gap: 8px !important; +} + +.gc-3 { + column-gap: 12px !important; +} + +.gc-4 { + column-gap: 16px !important; +} + +.gc-5 { + column-gap: 20px !important; +} + +.gc-6 { + column-gap: 24px !important; +} + +.gc-7 { + column-gap: 28px !important; +} + +.gc-8 { + column-gap: 32px !important; +} + +.gc-9 { + column-gap: 36px !important; +} + +.gc-10 { + column-gap: 40px !important; +} + +.gc-11 { + column-gap: 44px !important; +} + +.gc-12 { + column-gap: 48px !important; +} + +.gc-13 { + column-gap: 52px !important; +} + +.gc-14 { + column-gap: 56px !important; +} + +.gc-15 { + column-gap: 60px !important; +} + +.gc-16 { + column-gap: 64px !important; +} + +.gc-auto { + column-gap: auto !important; +} + +.ma-0 { + margin: 0px !important; +} + +.ma-1 { + margin: 4px !important; +} + +.ma-2 { + margin: 8px !important; +} + +.ma-3 { + margin: 12px !important; +} + +.ma-4 { + margin: 16px !important; +} + +.ma-5 { + margin: 20px !important; +} + +.ma-6 { + margin: 24px !important; +} + +.ma-7 { + margin: 28px !important; +} + +.ma-8 { + margin: 32px !important; +} + +.ma-9 { + margin: 36px !important; +} + +.ma-10 { + margin: 40px !important; +} + +.ma-11 { + margin: 44px !important; +} + +.ma-12 { + margin: 48px !important; +} + +.ma-13 { + margin: 52px !important; +} + +.ma-14 { + margin: 56px !important; +} + +.ma-15 { + margin: 60px !important; +} + +.ma-16 { + margin: 64px !important; +} + +.ma-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0px !important; + margin-left: 0px !important; +} + +.mx-1 { + margin-right: 4px !important; + margin-left: 4px !important; +} + +.mx-2 { + margin-right: 8px !important; + margin-left: 8px !important; +} + +.mx-3 { + margin-right: 12px !important; + margin-left: 12px !important; +} + +.mx-4 { + margin-right: 16px !important; + margin-left: 16px !important; +} + +.mx-5 { + margin-right: 20px !important; + margin-left: 20px !important; +} + +.mx-6 { + margin-right: 24px !important; + margin-left: 24px !important; +} + +.mx-7 { + margin-right: 28px !important; + margin-left: 28px !important; +} + +.mx-8 { + margin-right: 32px !important; + margin-left: 32px !important; +} + +.mx-9 { + margin-right: 36px !important; + margin-left: 36px !important; +} + +.mx-10 { + margin-right: 40px !important; + margin-left: 40px !important; +} + +.mx-11 { + margin-right: 44px !important; + margin-left: 44px !important; +} + +.mx-12 { + margin-right: 48px !important; + margin-left: 48px !important; +} + +.mx-13 { + margin-right: 52px !important; + margin-left: 52px !important; +} + +.mx-14 { + margin-right: 56px !important; + margin-left: 56px !important; +} + +.mx-15 { + margin-right: 60px !important; + margin-left: 60px !important; +} + +.mx-16 { + margin-right: 64px !important; + margin-left: 64px !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; +} + +.my-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; +} + +.my-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; +} + +.my-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; +} + +.my-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; +} + +.my-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; +} + +.my-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; +} + +.my-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; +} + +.my-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; +} + +.my-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; +} + +.my-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; +} + +.my-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; +} + +.my-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; +} + +.my-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; +} + +.my-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; +} + +.my-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; +} + +.my-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0px !important; +} + +.mt-1 { + margin-top: 4px !important; +} + +.mt-2 { + margin-top: 8px !important; +} + +.mt-3 { + margin-top: 12px !important; +} + +.mt-4 { + margin-top: 16px !important; +} + +.mt-5 { + margin-top: 20px !important; +} + +.mt-6 { + margin-top: 24px !important; +} + +.mt-7 { + margin-top: 28px !important; +} + +.mt-8 { + margin-top: 32px !important; +} + +.mt-9 { + margin-top: 36px !important; +} + +.mt-10 { + margin-top: 40px !important; +} + +.mt-11 { + margin-top: 44px !important; +} + +.mt-12 { + margin-top: 48px !important; +} + +.mt-13 { + margin-top: 52px !important; +} + +.mt-14 { + margin-top: 56px !important; +} + +.mt-15 { + margin-top: 60px !important; +} + +.mt-16 { + margin-top: 64px !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.mr-0 { + margin-right: 0px !important; +} + +.mr-1 { + margin-right: 4px !important; +} + +.mr-2 { + margin-right: 8px !important; +} + +.mr-3 { + margin-right: 12px !important; +} + +.mr-4 { + margin-right: 16px !important; +} + +.mr-5 { + margin-right: 20px !important; +} + +.mr-6 { + margin-right: 24px !important; +} + +.mr-7 { + margin-right: 28px !important; +} + +.mr-8 { + margin-right: 32px !important; +} + +.mr-9 { + margin-right: 36px !important; +} + +.mr-10 { + margin-right: 40px !important; +} + +.mr-11 { + margin-right: 44px !important; +} + +.mr-12 { + margin-right: 48px !important; +} + +.mr-13 { + margin-right: 52px !important; +} + +.mr-14 { + margin-right: 56px !important; +} + +.mr-15 { + margin-right: 60px !important; +} + +.mr-16 { + margin-right: 64px !important; +} + +.mr-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0px !important; +} + +.mb-1 { + margin-bottom: 4px !important; +} + +.mb-2 { + margin-bottom: 8px !important; +} + +.mb-3 { + margin-bottom: 12px !important; +} + +.mb-4 { + margin-bottom: 16px !important; +} + +.mb-5 { + margin-bottom: 20px !important; +} + +.mb-6 { + margin-bottom: 24px !important; +} + +.mb-7 { + margin-bottom: 28px !important; +} + +.mb-8 { + margin-bottom: 32px !important; +} + +.mb-9 { + margin-bottom: 36px !important; +} + +.mb-10 { + margin-bottom: 40px !important; +} + +.mb-11 { + margin-bottom: 44px !important; +} + +.mb-12 { + margin-bottom: 48px !important; +} + +.mb-13 { + margin-bottom: 52px !important; +} + +.mb-14 { + margin-bottom: 56px !important; +} + +.mb-15 { + margin-bottom: 60px !important; +} + +.mb-16 { + margin-bottom: 64px !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ml-0 { + margin-left: 0px !important; +} + +.ml-1 { + margin-left: 4px !important; +} + +.ml-2 { + margin-left: 8px !important; +} + +.ml-3 { + margin-left: 12px !important; +} + +.ml-4 { + margin-left: 16px !important; +} + +.ml-5 { + margin-left: 20px !important; +} + +.ml-6 { + margin-left: 24px !important; +} + +.ml-7 { + margin-left: 28px !important; +} + +.ml-8 { + margin-left: 32px !important; +} + +.ml-9 { + margin-left: 36px !important; +} + +.ml-10 { + margin-left: 40px !important; +} + +.ml-11 { + margin-left: 44px !important; +} + +.ml-12 { + margin-left: 48px !important; +} + +.ml-13 { + margin-left: 52px !important; +} + +.ml-14 { + margin-left: 56px !important; +} + +.ml-15 { + margin-left: 60px !important; +} + +.ml-16 { + margin-left: 64px !important; +} + +.ml-auto { + margin-left: auto !important; +} + +.ms-0 { + margin-inline-start: 0px !important; +} + +.ms-1 { + margin-inline-start: 4px !important; +} + +.ms-2 { + margin-inline-start: 8px !important; +} + +.ms-3 { + margin-inline-start: 12px !important; +} + +.ms-4 { + margin-inline-start: 16px !important; +} + +.ms-5 { + margin-inline-start: 20px !important; +} + +.ms-6 { + margin-inline-start: 24px !important; +} + +.ms-7 { + margin-inline-start: 28px !important; +} + +.ms-8 { + margin-inline-start: 32px !important; +} + +.ms-9 { + margin-inline-start: 36px !important; +} + +.ms-10 { + margin-inline-start: 40px !important; +} + +.ms-11 { + margin-inline-start: 44px !important; +} + +.ms-12 { + margin-inline-start: 48px !important; +} + +.ms-13 { + margin-inline-start: 52px !important; +} + +.ms-14 { + margin-inline-start: 56px !important; +} + +.ms-15 { + margin-inline-start: 60px !important; +} + +.ms-16 { + margin-inline-start: 64px !important; +} + +.ms-auto { + margin-inline-start: auto !important; +} + +.me-0 { + margin-inline-end: 0px !important; +} + +.me-1 { + margin-inline-end: 4px !important; +} + +.me-2 { + margin-inline-end: 8px !important; +} + +.me-3 { + margin-inline-end: 12px !important; +} + +.me-4 { + margin-inline-end: 16px !important; +} + +.me-5 { + margin-inline-end: 20px !important; +} + +.me-6 { + margin-inline-end: 24px !important; +} + +.me-7 { + margin-inline-end: 28px !important; +} + +.me-8 { + margin-inline-end: 32px !important; +} + +.me-9 { + margin-inline-end: 36px !important; +} + +.me-10 { + margin-inline-end: 40px !important; +} + +.me-11 { + margin-inline-end: 44px !important; +} + +.me-12 { + margin-inline-end: 48px !important; +} + +.me-13 { + margin-inline-end: 52px !important; +} + +.me-14 { + margin-inline-end: 56px !important; +} + +.me-15 { + margin-inline-end: 60px !important; +} + +.me-16 { + margin-inline-end: 64px !important; +} + +.me-auto { + margin-inline-end: auto !important; +} + +.ma-n1 { + margin: -4px !important; +} + +.ma-n2 { + margin: -8px !important; +} + +.ma-n3 { + margin: -12px !important; +} + +.ma-n4 { + margin: -16px !important; +} + +.ma-n5 { + margin: -20px !important; +} + +.ma-n6 { + margin: -24px !important; +} + +.ma-n7 { + margin: -28px !important; +} + +.ma-n8 { + margin: -32px !important; +} + +.ma-n9 { + margin: -36px !important; +} + +.ma-n10 { + margin: -40px !important; +} + +.ma-n11 { + margin: -44px !important; +} + +.ma-n12 { + margin: -48px !important; +} + +.ma-n13 { + margin: -52px !important; +} + +.ma-n14 { + margin: -56px !important; +} + +.ma-n15 { + margin: -60px !important; +} + +.ma-n16 { + margin: -64px !important; +} + +.mx-n1 { + margin-right: -4px !important; + margin-left: -4px !important; +} + +.mx-n2 { + margin-right: -8px !important; + margin-left: -8px !important; +} + +.mx-n3 { + margin-right: -12px !important; + margin-left: -12px !important; +} + +.mx-n4 { + margin-right: -16px !important; + margin-left: -16px !important; +} + +.mx-n5 { + margin-right: -20px !important; + margin-left: -20px !important; +} + +.mx-n6 { + margin-right: -24px !important; + margin-left: -24px !important; +} + +.mx-n7 { + margin-right: -28px !important; + margin-left: -28px !important; +} + +.mx-n8 { + margin-right: -32px !important; + margin-left: -32px !important; +} + +.mx-n9 { + margin-right: -36px !important; + margin-left: -36px !important; +} + +.mx-n10 { + margin-right: -40px !important; + margin-left: -40px !important; +} + +.mx-n11 { + margin-right: -44px !important; + margin-left: -44px !important; +} + +.mx-n12 { + margin-right: -48px !important; + margin-left: -48px !important; +} + +.mx-n13 { + margin-right: -52px !important; + margin-left: -52px !important; +} + +.mx-n14 { + margin-right: -56px !important; + margin-left: -56px !important; +} + +.mx-n15 { + margin-right: -60px !important; + margin-left: -60px !important; +} + +.mx-n16 { + margin-right: -64px !important; + margin-left: -64px !important; +} + +.my-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; +} + +.my-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; +} + +.my-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; +} + +.my-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; +} + +.my-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; +} + +.my-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; +} + +.my-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; +} + +.my-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; +} + +.my-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; +} + +.my-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; +} + +.my-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; +} + +.my-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; +} + +.my-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; +} + +.my-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; +} + +.my-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; +} + +.my-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; +} + +.mt-n1 { + margin-top: -4px !important; +} + +.mt-n2 { + margin-top: -8px !important; +} + +.mt-n3 { + margin-top: -12px !important; +} + +.mt-n4 { + margin-top: -16px !important; +} + +.mt-n5 { + margin-top: -20px !important; +} + +.mt-n6 { + margin-top: -24px !important; +} + +.mt-n7 { + margin-top: -28px !important; +} + +.mt-n8 { + margin-top: -32px !important; +} + +.mt-n9 { + margin-top: -36px !important; +} + +.mt-n10 { + margin-top: -40px !important; +} + +.mt-n11 { + margin-top: -44px !important; +} + +.mt-n12 { + margin-top: -48px !important; +} + +.mt-n13 { + margin-top: -52px !important; +} + +.mt-n14 { + margin-top: -56px !important; +} + +.mt-n15 { + margin-top: -60px !important; +} + +.mt-n16 { + margin-top: -64px !important; +} + +.mr-n1 { + margin-right: -4px !important; +} + +.mr-n2 { + margin-right: -8px !important; +} + +.mr-n3 { + margin-right: -12px !important; +} + +.mr-n4 { + margin-right: -16px !important; +} + +.mr-n5 { + margin-right: -20px !important; +} + +.mr-n6 { + margin-right: -24px !important; +} + +.mr-n7 { + margin-right: -28px !important; +} + +.mr-n8 { + margin-right: -32px !important; +} + +.mr-n9 { + margin-right: -36px !important; +} + +.mr-n10 { + margin-right: -40px !important; +} + +.mr-n11 { + margin-right: -44px !important; +} + +.mr-n12 { + margin-right: -48px !important; +} + +.mr-n13 { + margin-right: -52px !important; +} + +.mr-n14 { + margin-right: -56px !important; +} + +.mr-n15 { + margin-right: -60px !important; +} + +.mr-n16 { + margin-right: -64px !important; +} + +.mb-n1 { + margin-bottom: -4px !important; +} + +.mb-n2 { + margin-bottom: -8px !important; +} + +.mb-n3 { + margin-bottom: -12px !important; +} + +.mb-n4 { + margin-bottom: -16px !important; +} + +.mb-n5 { + margin-bottom: -20px !important; +} + +.mb-n6 { + margin-bottom: -24px !important; +} + +.mb-n7 { + margin-bottom: -28px !important; +} + +.mb-n8 { + margin-bottom: -32px !important; +} + +.mb-n9 { + margin-bottom: -36px !important; +} + +.mb-n10 { + margin-bottom: -40px !important; +} + +.mb-n11 { + margin-bottom: -44px !important; +} + +.mb-n12 { + margin-bottom: -48px !important; +} + +.mb-n13 { + margin-bottom: -52px !important; +} + +.mb-n14 { + margin-bottom: -56px !important; +} + +.mb-n15 { + margin-bottom: -60px !important; +} + +.mb-n16 { + margin-bottom: -64px !important; +} + +.ml-n1 { + margin-left: -4px !important; +} + +.ml-n2 { + margin-left: -8px !important; +} + +.ml-n3 { + margin-left: -12px !important; +} + +.ml-n4 { + margin-left: -16px !important; +} + +.ml-n5 { + margin-left: -20px !important; +} + +.ml-n6 { + margin-left: -24px !important; +} + +.ml-n7 { + margin-left: -28px !important; +} + +.ml-n8 { + margin-left: -32px !important; +} + +.ml-n9 { + margin-left: -36px !important; +} + +.ml-n10 { + margin-left: -40px !important; +} + +.ml-n11 { + margin-left: -44px !important; +} + +.ml-n12 { + margin-left: -48px !important; +} + +.ml-n13 { + margin-left: -52px !important; +} + +.ml-n14 { + margin-left: -56px !important; +} + +.ml-n15 { + margin-left: -60px !important; +} + +.ml-n16 { + margin-left: -64px !important; +} + +.ms-n1 { + margin-inline-start: -4px !important; +} + +.ms-n2 { + margin-inline-start: -8px !important; +} + +.ms-n3 { + margin-inline-start: -12px !important; +} + +.ms-n4 { + margin-inline-start: -16px !important; +} + +.ms-n5 { + margin-inline-start: -20px !important; +} + +.ms-n6 { + margin-inline-start: -24px !important; +} + +.ms-n7 { + margin-inline-start: -28px !important; +} + +.ms-n8 { + margin-inline-start: -32px !important; +} + +.ms-n9 { + margin-inline-start: -36px !important; +} + +.ms-n10 { + margin-inline-start: -40px !important; +} + +.ms-n11 { + margin-inline-start: -44px !important; +} + +.ms-n12 { + margin-inline-start: -48px !important; +} + +.ms-n13 { + margin-inline-start: -52px !important; +} + +.ms-n14 { + margin-inline-start: -56px !important; +} + +.ms-n15 { + margin-inline-start: -60px !important; +} + +.ms-n16 { + margin-inline-start: -64px !important; +} + +.me-n1 { + margin-inline-end: -4px !important; +} + +.me-n2 { + margin-inline-end: -8px !important; +} + +.me-n3 { + margin-inline-end: -12px !important; +} + +.me-n4 { + margin-inline-end: -16px !important; +} + +.me-n5 { + margin-inline-end: -20px !important; +} + +.me-n6 { + margin-inline-end: -24px !important; +} + +.me-n7 { + margin-inline-end: -28px !important; +} + +.me-n8 { + margin-inline-end: -32px !important; +} + +.me-n9 { + margin-inline-end: -36px !important; +} + +.me-n10 { + margin-inline-end: -40px !important; +} + +.me-n11 { + margin-inline-end: -44px !important; +} + +.me-n12 { + margin-inline-end: -48px !important; +} + +.me-n13 { + margin-inline-end: -52px !important; +} + +.me-n14 { + margin-inline-end: -56px !important; +} + +.me-n15 { + margin-inline-end: -60px !important; +} + +.me-n16 { + margin-inline-end: -64px !important; +} + +.pa-0 { + padding: 0px !important; +} + +.pa-1 { + padding: 4px !important; +} + +.pa-2 { + padding: 8px !important; +} + +.pa-3 { + padding: 12px !important; +} + +.pa-4 { + padding: 16px !important; +} + +.pa-5 { + padding: 20px !important; +} + +.pa-6 { + padding: 24px !important; +} + +.pa-7 { + padding: 28px !important; +} + +.pa-8 { + padding: 32px !important; +} + +.pa-9 { + padding: 36px !important; +} + +.pa-10 { + padding: 40px !important; +} + +.pa-11 { + padding: 44px !important; +} + +.pa-12 { + padding: 48px !important; +} + +.pa-13 { + padding: 52px !important; +} + +.pa-14 { + padding: 56px !important; +} + +.pa-15 { + padding: 60px !important; +} + +.pa-16 { + padding: 64px !important; +} + +.px-0 { + padding-right: 0px !important; + padding-left: 0px !important; +} + +.px-1 { + padding-right: 4px !important; + padding-left: 4px !important; +} + +.px-2 { + padding-right: 8px !important; + padding-left: 8px !important; +} + +.px-3 { + padding-right: 12px !important; + padding-left: 12px !important; +} + +.px-4 { + padding-right: 16px !important; + padding-left: 16px !important; +} + +.px-5 { + padding-right: 20px !important; + padding-left: 20px !important; +} + +.px-6 { + padding-right: 24px !important; + padding-left: 24px !important; +} + +.px-7 { + padding-right: 28px !important; + padding-left: 28px !important; +} + +.px-8 { + padding-right: 32px !important; + padding-left: 32px !important; +} + +.px-9 { + padding-right: 36px !important; + padding-left: 36px !important; +} + +.px-10 { + padding-right: 40px !important; + padding-left: 40px !important; +} + +.px-11 { + padding-right: 44px !important; + padding-left: 44px !important; +} + +.px-12 { + padding-right: 48px !important; + padding-left: 48px !important; +} + +.px-13 { + padding-right: 52px !important; + padding-left: 52px !important; +} + +.px-14 { + padding-right: 56px !important; + padding-left: 56px !important; +} + +.px-15 { + padding-right: 60px !important; + padding-left: 60px !important; +} + +.px-16 { + padding-right: 64px !important; + padding-left: 64px !important; +} + +.py-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; +} + +.py-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; +} + +.py-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; +} + +.py-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; +} + +.py-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; +} + +.py-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; +} + +.py-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; +} + +.py-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; +} + +.py-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; +} + +.py-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; +} + +.py-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; +} + +.py-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; +} + +.py-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; +} + +.py-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; +} + +.py-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; +} + +.py-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; +} + +.py-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; +} + +.pt-0 { + padding-top: 0px !important; +} + +.pt-1 { + padding-top: 4px !important; +} + +.pt-2 { + padding-top: 8px !important; +} + +.pt-3 { + padding-top: 12px !important; +} + +.pt-4 { + padding-top: 16px !important; +} + +.pt-5 { + padding-top: 20px !important; +} + +.pt-6 { + padding-top: 24px !important; +} + +.pt-7 { + padding-top: 28px !important; +} + +.pt-8 { + padding-top: 32px !important; +} + +.pt-9 { + padding-top: 36px !important; +} + +.pt-10 { + padding-top: 40px !important; +} + +.pt-11 { + padding-top: 44px !important; +} + +.pt-12 { + padding-top: 48px !important; +} + +.pt-13 { + padding-top: 52px !important; +} + +.pt-14 { + padding-top: 56px !important; +} + +.pt-15 { + padding-top: 60px !important; +} + +.pt-16 { + padding-top: 64px !important; +} + +.pr-0 { + padding-right: 0px !important; +} + +.pr-1 { + padding-right: 4px !important; +} + +.pr-2 { + padding-right: 8px !important; +} + +.pr-3 { + padding-right: 12px !important; +} + +.pr-4 { + padding-right: 16px !important; +} + +.pr-5 { + padding-right: 20px !important; +} + +.pr-6 { + padding-right: 24px !important; +} + +.pr-7 { + padding-right: 28px !important; +} + +.pr-8 { + padding-right: 32px !important; +} + +.pr-9 { + padding-right: 36px !important; +} + +.pr-10 { + padding-right: 40px !important; +} + +.pr-11 { + padding-right: 44px !important; +} + +.pr-12 { + padding-right: 48px !important; +} + +.pr-13 { + padding-right: 52px !important; +} + +.pr-14 { + padding-right: 56px !important; +} + +.pr-15 { + padding-right: 60px !important; +} + +.pr-16 { + padding-right: 64px !important; +} + +.pb-0 { + padding-bottom: 0px !important; +} + +.pb-1 { + padding-bottom: 4px !important; +} + +.pb-2 { + padding-bottom: 8px !important; +} + +.pb-3 { + padding-bottom: 12px !important; +} + +.pb-4 { + padding-bottom: 16px !important; +} + +.pb-5 { + padding-bottom: 20px !important; +} + +.pb-6 { + padding-bottom: 24px !important; +} + +.pb-7 { + padding-bottom: 28px !important; +} + +.pb-8 { + padding-bottom: 32px !important; +} + +.pb-9 { + padding-bottom: 36px !important; +} + +.pb-10 { + padding-bottom: 40px !important; +} + +.pb-11 { + padding-bottom: 44px !important; +} + +.pb-12 { + padding-bottom: 48px !important; +} + +.pb-13 { + padding-bottom: 52px !important; +} + +.pb-14 { + padding-bottom: 56px !important; +} + +.pb-15 { + padding-bottom: 60px !important; +} + +.pb-16 { + padding-bottom: 64px !important; +} + +.pl-0 { + padding-left: 0px !important; +} + +.pl-1 { + padding-left: 4px !important; +} + +.pl-2 { + padding-left: 8px !important; +} + +.pl-3 { + padding-left: 12px !important; +} + +.pl-4 { + padding-left: 16px !important; +} + +.pl-5 { + padding-left: 20px !important; +} + +.pl-6 { + padding-left: 24px !important; +} + +.pl-7 { + padding-left: 28px !important; +} + +.pl-8 { + padding-left: 32px !important; +} + +.pl-9 { + padding-left: 36px !important; +} + +.pl-10 { + padding-left: 40px !important; +} + +.pl-11 { + padding-left: 44px !important; +} + +.pl-12 { + padding-left: 48px !important; +} + +.pl-13 { + padding-left: 52px !important; +} + +.pl-14 { + padding-left: 56px !important; +} + +.pl-15 { + padding-left: 60px !important; +} + +.pl-16 { + padding-left: 64px !important; +} + +.ps-0 { + padding-inline-start: 0px !important; +} + +.ps-1 { + padding-inline-start: 4px !important; +} + +.ps-2 { + padding-inline-start: 8px !important; +} + +.ps-3 { + padding-inline-start: 12px !important; +} + +.ps-4 { + padding-inline-start: 16px !important; +} + +.ps-5 { + padding-inline-start: 20px !important; +} + +.ps-6 { + padding-inline-start: 24px !important; +} + +.ps-7 { + padding-inline-start: 28px !important; +} + +.ps-8 { + padding-inline-start: 32px !important; +} + +.ps-9 { + padding-inline-start: 36px !important; +} + +.ps-10 { + padding-inline-start: 40px !important; +} + +.ps-11 { + padding-inline-start: 44px !important; +} + +.ps-12 { + padding-inline-start: 48px !important; +} + +.ps-13 { + padding-inline-start: 52px !important; +} + +.ps-14 { + padding-inline-start: 56px !important; +} + +.ps-15 { + padding-inline-start: 60px !important; +} + +.ps-16 { + padding-inline-start: 64px !important; +} + +.pe-0 { + padding-inline-end: 0px !important; +} + +.pe-1 { + padding-inline-end: 4px !important; +} + +.pe-2 { + padding-inline-end: 8px !important; +} + +.pe-3 { + padding-inline-end: 12px !important; +} + +.pe-4 { + padding-inline-end: 16px !important; +} + +.pe-5 { + padding-inline-end: 20px !important; +} + +.pe-6 { + padding-inline-end: 24px !important; +} + +.pe-7 { + padding-inline-end: 28px !important; +} + +.pe-8 { + padding-inline-end: 32px !important; +} + +.pe-9 { + padding-inline-end: 36px !important; +} + +.pe-10 { + padding-inline-end: 40px !important; +} + +.pe-11 { + padding-inline-end: 44px !important; +} + +.pe-12 { + padding-inline-end: 48px !important; +} + +.pe-13 { + padding-inline-end: 52px !important; +} + +.pe-14 { + padding-inline-end: 56px !important; +} + +.pe-15 { + padding-inline-end: 60px !important; +} + +.pe-16 { + padding-inline-end: 64px !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-sm { + border-radius: 2px !important; +} + +.rounded { + border-radius: 4px !important; +} + +.rounded-lg { + border-radius: 8px !important; +} + +.rounded-xl { + border-radius: 24px !important; +} + +.rounded-pill { + border-radius: 9999px !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-shaped { + border-radius: 24px 0 !important; +} + +.rounded-t-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} + +.rounded-t-sm { + border-top-left-radius: 2px !important; + border-top-right-radius: 2px !important; +} + +.rounded-t { + border-top-left-radius: 4px !important; + border-top-right-radius: 4px !important; +} + +.rounded-t-lg { + border-top-left-radius: 8px !important; + border-top-right-radius: 8px !important; +} + +.rounded-t-xl { + border-top-left-radius: 24px !important; + border-top-right-radius: 24px !important; +} + +.rounded-t-pill { + border-top-left-radius: 9999px !important; + border-top-right-radius: 9999px !important; +} + +.rounded-t-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; +} + +.rounded-t-shaped { + border-top-left-radius: 24px !important; + border-top-right-radius: 0 !important; +} + +.rounded-b-0 { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.rounded-b-sm { + border-bottom-left-radius: 2px !important; + border-bottom-right-radius: 2px !important; +} + +.rounded-b { + border-bottom-left-radius: 4px !important; + border-bottom-right-radius: 4px !important; +} + +.rounded-b-lg { + border-bottom-left-radius: 8px !important; + border-bottom-right-radius: 8px !important; +} + +.rounded-b-xl { + border-bottom-left-radius: 24px !important; + border-bottom-right-radius: 24px !important; +} + +.rounded-b-pill { + border-bottom-left-radius: 9999px !important; + border-bottom-right-radius: 9999px !important; +} + +.rounded-b-circle { + border-bottom-left-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} + +.rounded-b-shaped { + border-bottom-left-radius: 24px !important; + border-bottom-right-radius: 0 !important; +} + +.border-0 { + border-width: 0 !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border { + border-width: thin !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-thin { + border-width: thin !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-sm { + border-width: 1px !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-md { + border-width: 2px !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-lg { + border-width: 4px !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-xl { + border-width: 8px !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-opacity-0 { + --v-border-opacity: 0 !important; +} + +.border-opacity { + --v-border-opacity: 0.12 !important; +} + +.border-opacity-25 { + --v-border-opacity: 0.25 !important; +} + +.border-opacity-50 { + --v-border-opacity: 0.5 !important; +} + +.border-opacity-75 { + --v-border-opacity: 0.75 !important; +} + +.border-opacity-100 { + --v-border-opacity: 1 !important; +} + +.border-t-0 { + border-block-start-width: 0 !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t { + border-block-start-width: thin !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-thin { + border-block-start-width: thin !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-sm { + border-block-start-width: 1px !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-md { + border-block-start-width: 2px !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-lg { + border-block-start-width: 4px !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-xl { + border-block-start-width: 8px !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-0 { + border-inline-end-width: 0 !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e { + border-inline-end-width: thin !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-thin { + border-inline-end-width: thin !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-sm { + border-inline-end-width: 1px !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-md { + border-inline-end-width: 2px !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-lg { + border-inline-end-width: 4px !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-xl { + border-inline-end-width: 8px !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-0 { + border-block-end-width: 0 !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b { + border-block-end-width: thin !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-thin { + border-block-end-width: thin !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-sm { + border-block-end-width: 1px !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-md { + border-block-end-width: 2px !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-lg { + border-block-end-width: 4px !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-xl { + border-block-end-width: 8px !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-0 { + border-inline-start-width: 0 !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s { + border-inline-start-width: thin !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-thin { + border-inline-start-width: thin !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-sm { + border-inline-start-width: 1px !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-md { + border-inline-start-width: 2px !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-lg { + border-inline-start-width: 4px !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-xl { + border-inline-start-width: 8px !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-solid { + border-style: solid !important; +} + +.border-dashed { + border-style: dashed !important; +} + +.border-dotted { + border-style: dotted !important; +} + +.border-double { + border-style: double !important; +} + +.border-none { + border-style: none !important; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-justify { + text-align: justify !important; +} + +.text-start { + text-align: start !important; +} + +.text-end { + text-align: end !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-overline { + text-decoration: overline !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-no-wrap { + white-space: nowrap !important; +} + +.text-pre { + white-space: pre !important; +} + +.text-pre-line { + white-space: pre-line !important; +} + +.text-pre-wrap { + white-space: pre-wrap !important; +} + +.text-break { + overflow-wrap: break-word !important; + word-break: break-word !important; +} + +.opacity-hover { + opacity: var(--v-hover-opacity) !important; +} + +.opacity-focus { + opacity: var(--v-focus-opacity) !important; +} + +.opacity-selected { + opacity: var(--v-selected-opacity) !important; +} + +.opacity-activated { + opacity: var(--v-activated-opacity) !important; +} + +.opacity-pressed { + opacity: var(--v-pressed-opacity) !important; +} + +.opacity-dragged { + opacity: var(--v-dragged-opacity) !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-10 { + opacity: 0.1 !important; +} + +.opacity-20 { + opacity: 0.2 !important; +} + +.opacity-30 { + opacity: 0.3 !important; +} + +.opacity-40 { + opacity: 0.4 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-60 { + opacity: 0.6 !important; +} + +.opacity-70 { + opacity: 0.7 !important; +} + +.opacity-80 { + opacity: 0.8 !important; +} + +.opacity-90 { + opacity: 0.9 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.text-high-emphasis { + color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity)) !important; +} + +.text-medium-emphasis { + color: rgba(var(--v-theme-on-background), var(--v-medium-emphasis-opacity)) !important; +} + +.text-disabled { + color: rgba(var(--v-theme-on-background), var(--v-disabled-opacity)) !important; +} + +.text-truncate { + white-space: nowrap !important; + overflow: hidden !important; + text-overflow: ellipsis !important; +} + +.text-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; +} + +.text-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; +} + +.text-none { + text-transform: none !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.font-weight-thin { + font-weight: 100 !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-regular { + font-weight: 400 !important; +} + +.font-weight-medium { + font-weight: 500 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-black { + font-weight: 900 !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-mono { + font-family: monospace !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-sticky { + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.right-0 { + right: 0 !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.left-0 { + left: 0 !important; +} + +.cursor-auto { + cursor: auto !important; +} + +.cursor-default { + cursor: default !important; +} + +.cursor-pointer { + cursor: pointer !important; +} + +.cursor-wait { + cursor: wait !important; +} + +.cursor-text { + cursor: text !important; +} + +.cursor-move { + cursor: move !important; +} + +.cursor-help { + cursor: help !important; +} + +.cursor-not-allowed { + cursor: not-allowed !important; +} + +.cursor-progress { + cursor: progress !important; +} + +.cursor-grab { + cursor: grab !important; +} + +.cursor-grabbing { + cursor: grabbing !important; +} + +.cursor-none { + cursor: none !important; +} + +.fill-height { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.h-screen { + height: 100vh !important; +} + +.h-0 { + height: 0 !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-screen { + height: 100dvh !important; +} + +.w-auto { + width: auto !important; +} + +.w-0 { + width: 0 !important; +} + +.w-25 { + width: 25% !important; +} + +.w-33 { + width: 33% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-66 { + width: 66% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +@media (min-width: 600px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .float-sm-none { + float: none !important; + } + .float-sm-left { + float: left !important; + } + .float-sm-right { + float: right !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-1-1 { + flex: 1 1 auto !important; + } + .flex-sm-1-0 { + flex: 1 0 auto !important; + } + .flex-sm-0-1 { + flex: 0 1 auto !important; + } + .flex-sm-0-0 { + flex: 0 0 auto !important; + } + .flex-sm-1-1-100 { + flex: 1 1 100% !important; + } + .flex-sm-1-0-100 { + flex: 1 0 100% !important; + } + .flex-sm-0-1-100 { + flex: 0 1 100% !important; + } + .flex-sm-0-0-100 { + flex: 0 0 100% !important; + } + .flex-sm-1-1-0 { + flex: 1 1 0 !important; + } + .flex-sm-1-0-0 { + flex: 1 0 0 !important; + } + .flex-sm-0-1-0 { + flex: 0 1 0 !important; + } + .flex-sm-0-0-0 { + flex: 0 0 0 !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-sm-start { + justify-content: flex-start !important; + } + .justify-sm-end { + justify-content: flex-end !important; + } + .justify-sm-center { + justify-content: center !important; + } + .justify-sm-space-between { + justify-content: space-between !important; + } + .justify-sm-space-around { + justify-content: space-around !important; + } + .justify-sm-space-evenly { + justify-content: space-evenly !important; + } + .align-sm-start { + align-items: flex-start !important; + } + .align-sm-end { + align-items: flex-end !important; + } + .align-sm-center { + align-items: center !important; + } + .align-sm-baseline { + align-items: baseline !important; + } + .align-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-space-between { + align-content: space-between !important; + } + .align-content-sm-space-around { + align-content: space-around !important; + } + .align-content-sm-space-evenly { + align-content: space-evenly !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-6 { + order: 6 !important; + } + .order-sm-7 { + order: 7 !important; + } + .order-sm-8 { + order: 8 !important; + } + .order-sm-9 { + order: 9 !important; + } + .order-sm-10 { + order: 10 !important; + } + .order-sm-11 { + order: 11 !important; + } + .order-sm-12 { + order: 12 !important; + } + .order-sm-last { + order: 13 !important; + } + .ga-sm-0 { + gap: 0px !important; + } + .ga-sm-1 { + gap: 4px !important; + } + .ga-sm-2 { + gap: 8px !important; + } + .ga-sm-3 { + gap: 12px !important; + } + .ga-sm-4 { + gap: 16px !important; + } + .ga-sm-5 { + gap: 20px !important; + } + .ga-sm-6 { + gap: 24px !important; + } + .ga-sm-7 { + gap: 28px !important; + } + .ga-sm-8 { + gap: 32px !important; + } + .ga-sm-9 { + gap: 36px !important; + } + .ga-sm-10 { + gap: 40px !important; + } + .ga-sm-11 { + gap: 44px !important; + } + .ga-sm-12 { + gap: 48px !important; + } + .ga-sm-13 { + gap: 52px !important; + } + .ga-sm-14 { + gap: 56px !important; + } + .ga-sm-15 { + gap: 60px !important; + } + .ga-sm-16 { + gap: 64px !important; + } + .ga-sm-auto { + gap: auto !important; + } + .gr-sm-0 { + row-gap: 0px !important; + } + .gr-sm-1 { + row-gap: 4px !important; + } + .gr-sm-2 { + row-gap: 8px !important; + } + .gr-sm-3 { + row-gap: 12px !important; + } + .gr-sm-4 { + row-gap: 16px !important; + } + .gr-sm-5 { + row-gap: 20px !important; + } + .gr-sm-6 { + row-gap: 24px !important; + } + .gr-sm-7 { + row-gap: 28px !important; + } + .gr-sm-8 { + row-gap: 32px !important; + } + .gr-sm-9 { + row-gap: 36px !important; + } + .gr-sm-10 { + row-gap: 40px !important; + } + .gr-sm-11 { + row-gap: 44px !important; + } + .gr-sm-12 { + row-gap: 48px !important; + } + .gr-sm-13 { + row-gap: 52px !important; + } + .gr-sm-14 { + row-gap: 56px !important; + } + .gr-sm-15 { + row-gap: 60px !important; + } + .gr-sm-16 { + row-gap: 64px !important; + } + .gr-sm-auto { + row-gap: auto !important; + } + .gc-sm-0 { + column-gap: 0px !important; + } + .gc-sm-1 { + column-gap: 4px !important; + } + .gc-sm-2 { + column-gap: 8px !important; + } + .gc-sm-3 { + column-gap: 12px !important; + } + .gc-sm-4 { + column-gap: 16px !important; + } + .gc-sm-5 { + column-gap: 20px !important; + } + .gc-sm-6 { + column-gap: 24px !important; + } + .gc-sm-7 { + column-gap: 28px !important; + } + .gc-sm-8 { + column-gap: 32px !important; + } + .gc-sm-9 { + column-gap: 36px !important; + } + .gc-sm-10 { + column-gap: 40px !important; + } + .gc-sm-11 { + column-gap: 44px !important; + } + .gc-sm-12 { + column-gap: 48px !important; + } + .gc-sm-13 { + column-gap: 52px !important; + } + .gc-sm-14 { + column-gap: 56px !important; + } + .gc-sm-15 { + column-gap: 60px !important; + } + .gc-sm-16 { + column-gap: 64px !important; + } + .gc-sm-auto { + column-gap: auto !important; + } + .ma-sm-0 { + margin: 0px !important; + } + .ma-sm-1 { + margin: 4px !important; + } + .ma-sm-2 { + margin: 8px !important; + } + .ma-sm-3 { + margin: 12px !important; + } + .ma-sm-4 { + margin: 16px !important; + } + .ma-sm-5 { + margin: 20px !important; + } + .ma-sm-6 { + margin: 24px !important; + } + .ma-sm-7 { + margin: 28px !important; + } + .ma-sm-8 { + margin: 32px !important; + } + .ma-sm-9 { + margin: 36px !important; + } + .ma-sm-10 { + margin: 40px !important; + } + .ma-sm-11 { + margin: 44px !important; + } + .ma-sm-12 { + margin: 48px !important; + } + .ma-sm-13 { + margin: 52px !important; + } + .ma-sm-14 { + margin: 56px !important; + } + .ma-sm-15 { + margin: 60px !important; + } + .ma-sm-16 { + margin: 64px !important; + } + .ma-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-sm-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-sm-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-sm-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-sm-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-sm-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-sm-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-sm-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-sm-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-sm-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-sm-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-sm-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-sm-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-sm-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-sm-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-sm-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-sm-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-sm-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-sm-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-sm-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-sm-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-sm-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-sm-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-sm-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-sm-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-sm-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-sm-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-sm-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-sm-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-sm-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-sm-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-sm-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-sm-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0px !important; + } + .mt-sm-1 { + margin-top: 4px !important; + } + .mt-sm-2 { + margin-top: 8px !important; + } + .mt-sm-3 { + margin-top: 12px !important; + } + .mt-sm-4 { + margin-top: 16px !important; + } + .mt-sm-5 { + margin-top: 20px !important; + } + .mt-sm-6 { + margin-top: 24px !important; + } + .mt-sm-7 { + margin-top: 28px !important; + } + .mt-sm-8 { + margin-top: 32px !important; + } + .mt-sm-9 { + margin-top: 36px !important; + } + .mt-sm-10 { + margin-top: 40px !important; + } + .mt-sm-11 { + margin-top: 44px !important; + } + .mt-sm-12 { + margin-top: 48px !important; + } + .mt-sm-13 { + margin-top: 52px !important; + } + .mt-sm-14 { + margin-top: 56px !important; + } + .mt-sm-15 { + margin-top: 60px !important; + } + .mt-sm-16 { + margin-top: 64px !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .mr-sm-0 { + margin-right: 0px !important; + } + .mr-sm-1 { + margin-right: 4px !important; + } + .mr-sm-2 { + margin-right: 8px !important; + } + .mr-sm-3 { + margin-right: 12px !important; + } + .mr-sm-4 { + margin-right: 16px !important; + } + .mr-sm-5 { + margin-right: 20px !important; + } + .mr-sm-6 { + margin-right: 24px !important; + } + .mr-sm-7 { + margin-right: 28px !important; + } + .mr-sm-8 { + margin-right: 32px !important; + } + .mr-sm-9 { + margin-right: 36px !important; + } + .mr-sm-10 { + margin-right: 40px !important; + } + .mr-sm-11 { + margin-right: 44px !important; + } + .mr-sm-12 { + margin-right: 48px !important; + } + .mr-sm-13 { + margin-right: 52px !important; + } + .mr-sm-14 { + margin-right: 56px !important; + } + .mr-sm-15 { + margin-right: 60px !important; + } + .mr-sm-16 { + margin-right: 64px !important; + } + .mr-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0px !important; + } + .mb-sm-1 { + margin-bottom: 4px !important; + } + .mb-sm-2 { + margin-bottom: 8px !important; + } + .mb-sm-3 { + margin-bottom: 12px !important; + } + .mb-sm-4 { + margin-bottom: 16px !important; + } + .mb-sm-5 { + margin-bottom: 20px !important; + } + .mb-sm-6 { + margin-bottom: 24px !important; + } + .mb-sm-7 { + margin-bottom: 28px !important; + } + .mb-sm-8 { + margin-bottom: 32px !important; + } + .mb-sm-9 { + margin-bottom: 36px !important; + } + .mb-sm-10 { + margin-bottom: 40px !important; + } + .mb-sm-11 { + margin-bottom: 44px !important; + } + .mb-sm-12 { + margin-bottom: 48px !important; + } + .mb-sm-13 { + margin-bottom: 52px !important; + } + .mb-sm-14 { + margin-bottom: 56px !important; + } + .mb-sm-15 { + margin-bottom: 60px !important; + } + .mb-sm-16 { + margin-bottom: 64px !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-0 { + margin-left: 0px !important; + } + .ml-sm-1 { + margin-left: 4px !important; + } + .ml-sm-2 { + margin-left: 8px !important; + } + .ml-sm-3 { + margin-left: 12px !important; + } + .ml-sm-4 { + margin-left: 16px !important; + } + .ml-sm-5 { + margin-left: 20px !important; + } + .ml-sm-6 { + margin-left: 24px !important; + } + .ml-sm-7 { + margin-left: 28px !important; + } + .ml-sm-8 { + margin-left: 32px !important; + } + .ml-sm-9 { + margin-left: 36px !important; + } + .ml-sm-10 { + margin-left: 40px !important; + } + .ml-sm-11 { + margin-left: 44px !important; + } + .ml-sm-12 { + margin-left: 48px !important; + } + .ml-sm-13 { + margin-left: 52px !important; + } + .ml-sm-14 { + margin-left: 56px !important; + } + .ml-sm-15 { + margin-left: 60px !important; + } + .ml-sm-16 { + margin-left: 64px !important; + } + .ml-sm-auto { + margin-left: auto !important; + } + .ms-sm-0 { + margin-inline-start: 0px !important; + } + .ms-sm-1 { + margin-inline-start: 4px !important; + } + .ms-sm-2 { + margin-inline-start: 8px !important; + } + .ms-sm-3 { + margin-inline-start: 12px !important; + } + .ms-sm-4 { + margin-inline-start: 16px !important; + } + .ms-sm-5 { + margin-inline-start: 20px !important; + } + .ms-sm-6 { + margin-inline-start: 24px !important; + } + .ms-sm-7 { + margin-inline-start: 28px !important; + } + .ms-sm-8 { + margin-inline-start: 32px !important; + } + .ms-sm-9 { + margin-inline-start: 36px !important; + } + .ms-sm-10 { + margin-inline-start: 40px !important; + } + .ms-sm-11 { + margin-inline-start: 44px !important; + } + .ms-sm-12 { + margin-inline-start: 48px !important; + } + .ms-sm-13 { + margin-inline-start: 52px !important; + } + .ms-sm-14 { + margin-inline-start: 56px !important; + } + .ms-sm-15 { + margin-inline-start: 60px !important; + } + .ms-sm-16 { + margin-inline-start: 64px !important; + } + .ms-sm-auto { + margin-inline-start: auto !important; + } + .me-sm-0 { + margin-inline-end: 0px !important; + } + .me-sm-1 { + margin-inline-end: 4px !important; + } + .me-sm-2 { + margin-inline-end: 8px !important; + } + .me-sm-3 { + margin-inline-end: 12px !important; + } + .me-sm-4 { + margin-inline-end: 16px !important; + } + .me-sm-5 { + margin-inline-end: 20px !important; + } + .me-sm-6 { + margin-inline-end: 24px !important; + } + .me-sm-7 { + margin-inline-end: 28px !important; + } + .me-sm-8 { + margin-inline-end: 32px !important; + } + .me-sm-9 { + margin-inline-end: 36px !important; + } + .me-sm-10 { + margin-inline-end: 40px !important; + } + .me-sm-11 { + margin-inline-end: 44px !important; + } + .me-sm-12 { + margin-inline-end: 48px !important; + } + .me-sm-13 { + margin-inline-end: 52px !important; + } + .me-sm-14 { + margin-inline-end: 56px !important; + } + .me-sm-15 { + margin-inline-end: 60px !important; + } + .me-sm-16 { + margin-inline-end: 64px !important; + } + .me-sm-auto { + margin-inline-end: auto !important; + } + .ma-sm-n1 { + margin: -4px !important; + } + .ma-sm-n2 { + margin: -8px !important; + } + .ma-sm-n3 { + margin: -12px !important; + } + .ma-sm-n4 { + margin: -16px !important; + } + .ma-sm-n5 { + margin: -20px !important; + } + .ma-sm-n6 { + margin: -24px !important; + } + .ma-sm-n7 { + margin: -28px !important; + } + .ma-sm-n8 { + margin: -32px !important; + } + .ma-sm-n9 { + margin: -36px !important; + } + .ma-sm-n10 { + margin: -40px !important; + } + .ma-sm-n11 { + margin: -44px !important; + } + .ma-sm-n12 { + margin: -48px !important; + } + .ma-sm-n13 { + margin: -52px !important; + } + .ma-sm-n14 { + margin: -56px !important; + } + .ma-sm-n15 { + margin: -60px !important; + } + .ma-sm-n16 { + margin: -64px !important; + } + .mx-sm-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-sm-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-sm-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-sm-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-sm-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-sm-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-sm-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-sm-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-sm-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-sm-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-sm-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-sm-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-sm-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-sm-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-sm-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-sm-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-sm-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-sm-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-sm-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-sm-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-sm-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-sm-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-sm-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-sm-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-sm-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-sm-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-sm-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-sm-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-sm-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-sm-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-sm-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-sm-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-sm-n1 { + margin-top: -4px !important; + } + .mt-sm-n2 { + margin-top: -8px !important; + } + .mt-sm-n3 { + margin-top: -12px !important; + } + .mt-sm-n4 { + margin-top: -16px !important; + } + .mt-sm-n5 { + margin-top: -20px !important; + } + .mt-sm-n6 { + margin-top: -24px !important; + } + .mt-sm-n7 { + margin-top: -28px !important; + } + .mt-sm-n8 { + margin-top: -32px !important; + } + .mt-sm-n9 { + margin-top: -36px !important; + } + .mt-sm-n10 { + margin-top: -40px !important; + } + .mt-sm-n11 { + margin-top: -44px !important; + } + .mt-sm-n12 { + margin-top: -48px !important; + } + .mt-sm-n13 { + margin-top: -52px !important; + } + .mt-sm-n14 { + margin-top: -56px !important; + } + .mt-sm-n15 { + margin-top: -60px !important; + } + .mt-sm-n16 { + margin-top: -64px !important; + } + .mr-sm-n1 { + margin-right: -4px !important; + } + .mr-sm-n2 { + margin-right: -8px !important; + } + .mr-sm-n3 { + margin-right: -12px !important; + } + .mr-sm-n4 { + margin-right: -16px !important; + } + .mr-sm-n5 { + margin-right: -20px !important; + } + .mr-sm-n6 { + margin-right: -24px !important; + } + .mr-sm-n7 { + margin-right: -28px !important; + } + .mr-sm-n8 { + margin-right: -32px !important; + } + .mr-sm-n9 { + margin-right: -36px !important; + } + .mr-sm-n10 { + margin-right: -40px !important; + } + .mr-sm-n11 { + margin-right: -44px !important; + } + .mr-sm-n12 { + margin-right: -48px !important; + } + .mr-sm-n13 { + margin-right: -52px !important; + } + .mr-sm-n14 { + margin-right: -56px !important; + } + .mr-sm-n15 { + margin-right: -60px !important; + } + .mr-sm-n16 { + margin-right: -64px !important; + } + .mb-sm-n1 { + margin-bottom: -4px !important; + } + .mb-sm-n2 { + margin-bottom: -8px !important; + } + .mb-sm-n3 { + margin-bottom: -12px !important; + } + .mb-sm-n4 { + margin-bottom: -16px !important; + } + .mb-sm-n5 { + margin-bottom: -20px !important; + } + .mb-sm-n6 { + margin-bottom: -24px !important; + } + .mb-sm-n7 { + margin-bottom: -28px !important; + } + .mb-sm-n8 { + margin-bottom: -32px !important; + } + .mb-sm-n9 { + margin-bottom: -36px !important; + } + .mb-sm-n10 { + margin-bottom: -40px !important; + } + .mb-sm-n11 { + margin-bottom: -44px !important; + } + .mb-sm-n12 { + margin-bottom: -48px !important; + } + .mb-sm-n13 { + margin-bottom: -52px !important; + } + .mb-sm-n14 { + margin-bottom: -56px !important; + } + .mb-sm-n15 { + margin-bottom: -60px !important; + } + .mb-sm-n16 { + margin-bottom: -64px !important; + } + .ml-sm-n1 { + margin-left: -4px !important; + } + .ml-sm-n2 { + margin-left: -8px !important; + } + .ml-sm-n3 { + margin-left: -12px !important; + } + .ml-sm-n4 { + margin-left: -16px !important; + } + .ml-sm-n5 { + margin-left: -20px !important; + } + .ml-sm-n6 { + margin-left: -24px !important; + } + .ml-sm-n7 { + margin-left: -28px !important; + } + .ml-sm-n8 { + margin-left: -32px !important; + } + .ml-sm-n9 { + margin-left: -36px !important; + } + .ml-sm-n10 { + margin-left: -40px !important; + } + .ml-sm-n11 { + margin-left: -44px !important; + } + .ml-sm-n12 { + margin-left: -48px !important; + } + .ml-sm-n13 { + margin-left: -52px !important; + } + .ml-sm-n14 { + margin-left: -56px !important; + } + .ml-sm-n15 { + margin-left: -60px !important; + } + .ml-sm-n16 { + margin-left: -64px !important; + } + .ms-sm-n1 { + margin-inline-start: -4px !important; + } + .ms-sm-n2 { + margin-inline-start: -8px !important; + } + .ms-sm-n3 { + margin-inline-start: -12px !important; + } + .ms-sm-n4 { + margin-inline-start: -16px !important; + } + .ms-sm-n5 { + margin-inline-start: -20px !important; + } + .ms-sm-n6 { + margin-inline-start: -24px !important; + } + .ms-sm-n7 { + margin-inline-start: -28px !important; + } + .ms-sm-n8 { + margin-inline-start: -32px !important; + } + .ms-sm-n9 { + margin-inline-start: -36px !important; + } + .ms-sm-n10 { + margin-inline-start: -40px !important; + } + .ms-sm-n11 { + margin-inline-start: -44px !important; + } + .ms-sm-n12 { + margin-inline-start: -48px !important; + } + .ms-sm-n13 { + margin-inline-start: -52px !important; + } + .ms-sm-n14 { + margin-inline-start: -56px !important; + } + .ms-sm-n15 { + margin-inline-start: -60px !important; + } + .ms-sm-n16 { + margin-inline-start: -64px !important; + } + .me-sm-n1 { + margin-inline-end: -4px !important; + } + .me-sm-n2 { + margin-inline-end: -8px !important; + } + .me-sm-n3 { + margin-inline-end: -12px !important; + } + .me-sm-n4 { + margin-inline-end: -16px !important; + } + .me-sm-n5 { + margin-inline-end: -20px !important; + } + .me-sm-n6 { + margin-inline-end: -24px !important; + } + .me-sm-n7 { + margin-inline-end: -28px !important; + } + .me-sm-n8 { + margin-inline-end: -32px !important; + } + .me-sm-n9 { + margin-inline-end: -36px !important; + } + .me-sm-n10 { + margin-inline-end: -40px !important; + } + .me-sm-n11 { + margin-inline-end: -44px !important; + } + .me-sm-n12 { + margin-inline-end: -48px !important; + } + .me-sm-n13 { + margin-inline-end: -52px !important; + } + .me-sm-n14 { + margin-inline-end: -56px !important; + } + .me-sm-n15 { + margin-inline-end: -60px !important; + } + .me-sm-n16 { + margin-inline-end: -64px !important; + } + .pa-sm-0 { + padding: 0px !important; + } + .pa-sm-1 { + padding: 4px !important; + } + .pa-sm-2 { + padding: 8px !important; + } + .pa-sm-3 { + padding: 12px !important; + } + .pa-sm-4 { + padding: 16px !important; + } + .pa-sm-5 { + padding: 20px !important; + } + .pa-sm-6 { + padding: 24px !important; + } + .pa-sm-7 { + padding: 28px !important; + } + .pa-sm-8 { + padding: 32px !important; + } + .pa-sm-9 { + padding: 36px !important; + } + .pa-sm-10 { + padding: 40px !important; + } + .pa-sm-11 { + padding: 44px !important; + } + .pa-sm-12 { + padding: 48px !important; + } + .pa-sm-13 { + padding: 52px !important; + } + .pa-sm-14 { + padding: 56px !important; + } + .pa-sm-15 { + padding: 60px !important; + } + .pa-sm-16 { + padding: 64px !important; + } + .px-sm-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-sm-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-sm-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-sm-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-sm-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-sm-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-sm-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-sm-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-sm-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-sm-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-sm-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-sm-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-sm-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-sm-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-sm-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-sm-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-sm-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-sm-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-sm-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-sm-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-sm-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-sm-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-sm-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-sm-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-sm-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-sm-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-sm-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-sm-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-sm-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-sm-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-sm-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-sm-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-sm-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-sm-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-sm-0 { + padding-top: 0px !important; + } + .pt-sm-1 { + padding-top: 4px !important; + } + .pt-sm-2 { + padding-top: 8px !important; + } + .pt-sm-3 { + padding-top: 12px !important; + } + .pt-sm-4 { + padding-top: 16px !important; + } + .pt-sm-5 { + padding-top: 20px !important; + } + .pt-sm-6 { + padding-top: 24px !important; + } + .pt-sm-7 { + padding-top: 28px !important; + } + .pt-sm-8 { + padding-top: 32px !important; + } + .pt-sm-9 { + padding-top: 36px !important; + } + .pt-sm-10 { + padding-top: 40px !important; + } + .pt-sm-11 { + padding-top: 44px !important; + } + .pt-sm-12 { + padding-top: 48px !important; + } + .pt-sm-13 { + padding-top: 52px !important; + } + .pt-sm-14 { + padding-top: 56px !important; + } + .pt-sm-15 { + padding-top: 60px !important; + } + .pt-sm-16 { + padding-top: 64px !important; + } + .pr-sm-0 { + padding-right: 0px !important; + } + .pr-sm-1 { + padding-right: 4px !important; + } + .pr-sm-2 { + padding-right: 8px !important; + } + .pr-sm-3 { + padding-right: 12px !important; + } + .pr-sm-4 { + padding-right: 16px !important; + } + .pr-sm-5 { + padding-right: 20px !important; + } + .pr-sm-6 { + padding-right: 24px !important; + } + .pr-sm-7 { + padding-right: 28px !important; + } + .pr-sm-8 { + padding-right: 32px !important; + } + .pr-sm-9 { + padding-right: 36px !important; + } + .pr-sm-10 { + padding-right: 40px !important; + } + .pr-sm-11 { + padding-right: 44px !important; + } + .pr-sm-12 { + padding-right: 48px !important; + } + .pr-sm-13 { + padding-right: 52px !important; + } + .pr-sm-14 { + padding-right: 56px !important; + } + .pr-sm-15 { + padding-right: 60px !important; + } + .pr-sm-16 { + padding-right: 64px !important; + } + .pb-sm-0 { + padding-bottom: 0px !important; + } + .pb-sm-1 { + padding-bottom: 4px !important; + } + .pb-sm-2 { + padding-bottom: 8px !important; + } + .pb-sm-3 { + padding-bottom: 12px !important; + } + .pb-sm-4 { + padding-bottom: 16px !important; + } + .pb-sm-5 { + padding-bottom: 20px !important; + } + .pb-sm-6 { + padding-bottom: 24px !important; + } + .pb-sm-7 { + padding-bottom: 28px !important; + } + .pb-sm-8 { + padding-bottom: 32px !important; + } + .pb-sm-9 { + padding-bottom: 36px !important; + } + .pb-sm-10 { + padding-bottom: 40px !important; + } + .pb-sm-11 { + padding-bottom: 44px !important; + } + .pb-sm-12 { + padding-bottom: 48px !important; + } + .pb-sm-13 { + padding-bottom: 52px !important; + } + .pb-sm-14 { + padding-bottom: 56px !important; + } + .pb-sm-15 { + padding-bottom: 60px !important; + } + .pb-sm-16 { + padding-bottom: 64px !important; + } + .pl-sm-0 { + padding-left: 0px !important; + } + .pl-sm-1 { + padding-left: 4px !important; + } + .pl-sm-2 { + padding-left: 8px !important; + } + .pl-sm-3 { + padding-left: 12px !important; + } + .pl-sm-4 { + padding-left: 16px !important; + } + .pl-sm-5 { + padding-left: 20px !important; + } + .pl-sm-6 { + padding-left: 24px !important; + } + .pl-sm-7 { + padding-left: 28px !important; + } + .pl-sm-8 { + padding-left: 32px !important; + } + .pl-sm-9 { + padding-left: 36px !important; + } + .pl-sm-10 { + padding-left: 40px !important; + } + .pl-sm-11 { + padding-left: 44px !important; + } + .pl-sm-12 { + padding-left: 48px !important; + } + .pl-sm-13 { + padding-left: 52px !important; + } + .pl-sm-14 { + padding-left: 56px !important; + } + .pl-sm-15 { + padding-left: 60px !important; + } + .pl-sm-16 { + padding-left: 64px !important; + } + .ps-sm-0 { + padding-inline-start: 0px !important; + } + .ps-sm-1 { + padding-inline-start: 4px !important; + } + .ps-sm-2 { + padding-inline-start: 8px !important; + } + .ps-sm-3 { + padding-inline-start: 12px !important; + } + .ps-sm-4 { + padding-inline-start: 16px !important; + } + .ps-sm-5 { + padding-inline-start: 20px !important; + } + .ps-sm-6 { + padding-inline-start: 24px !important; + } + .ps-sm-7 { + padding-inline-start: 28px !important; + } + .ps-sm-8 { + padding-inline-start: 32px !important; + } + .ps-sm-9 { + padding-inline-start: 36px !important; + } + .ps-sm-10 { + padding-inline-start: 40px !important; + } + .ps-sm-11 { + padding-inline-start: 44px !important; + } + .ps-sm-12 { + padding-inline-start: 48px !important; + } + .ps-sm-13 { + padding-inline-start: 52px !important; + } + .ps-sm-14 { + padding-inline-start: 56px !important; + } + .ps-sm-15 { + padding-inline-start: 60px !important; + } + .ps-sm-16 { + padding-inline-start: 64px !important; + } + .pe-sm-0 { + padding-inline-end: 0px !important; + } + .pe-sm-1 { + padding-inline-end: 4px !important; + } + .pe-sm-2 { + padding-inline-end: 8px !important; + } + .pe-sm-3 { + padding-inline-end: 12px !important; + } + .pe-sm-4 { + padding-inline-end: 16px !important; + } + .pe-sm-5 { + padding-inline-end: 20px !important; + } + .pe-sm-6 { + padding-inline-end: 24px !important; + } + .pe-sm-7 { + padding-inline-end: 28px !important; + } + .pe-sm-8 { + padding-inline-end: 32px !important; + } + .pe-sm-9 { + padding-inline-end: 36px !important; + } + .pe-sm-10 { + padding-inline-end: 40px !important; + } + .pe-sm-11 { + padding-inline-end: 44px !important; + } + .pe-sm-12 { + padding-inline-end: 48px !important; + } + .pe-sm-13 { + padding-inline-end: 52px !important; + } + .pe-sm-14 { + padding-inline-end: 56px !important; + } + .pe-sm-15 { + padding-inline-end: 60px !important; + } + .pe-sm-16 { + padding-inline-end: 64px !important; + } + .text-sm-left { + text-align: left !important; + } + .text-sm-right { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } + .text-sm-justify { + text-align: justify !important; + } + .text-sm-start { + text-align: start !important; + } + .text-sm-end { + text-align: end !important; + } + .text-sm-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-sm-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-sm-auto { + height: auto !important; + } + .h-sm-screen { + height: 100vh !important; + } + .h-sm-0 { + height: 0 !important; + } + .h-sm-25 { + height: 25% !important; + } + .h-sm-50 { + height: 50% !important; + } + .h-sm-75 { + height: 75% !important; + } + .h-sm-100 { + height: 100% !important; + } + .w-sm-auto { + width: auto !important; + } + .w-sm-0 { + width: 0 !important; + } + .w-sm-25 { + width: 25% !important; + } + .w-sm-33 { + width: 33% !important; + } + .w-sm-50 { + width: 50% !important; + } + .w-sm-66 { + width: 66% !important; + } + .w-sm-75 { + width: 75% !important; + } + .w-sm-100 { + width: 100% !important; + } +} +@media (min-width: 960px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .float-md-none { + float: none !important; + } + .float-md-left { + float: left !important; + } + .float-md-right { + float: right !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-1-1 { + flex: 1 1 auto !important; + } + .flex-md-1-0 { + flex: 1 0 auto !important; + } + .flex-md-0-1 { + flex: 0 1 auto !important; + } + .flex-md-0-0 { + flex: 0 0 auto !important; + } + .flex-md-1-1-100 { + flex: 1 1 100% !important; + } + .flex-md-1-0-100 { + flex: 1 0 100% !important; + } + .flex-md-0-1-100 { + flex: 0 1 100% !important; + } + .flex-md-0-0-100 { + flex: 0 0 100% !important; + } + .flex-md-1-1-0 { + flex: 1 1 0 !important; + } + .flex-md-1-0-0 { + flex: 1 0 0 !important; + } + .flex-md-0-1-0 { + flex: 0 1 0 !important; + } + .flex-md-0-0-0 { + flex: 0 0 0 !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-md-start { + justify-content: flex-start !important; + } + .justify-md-end { + justify-content: flex-end !important; + } + .justify-md-center { + justify-content: center !important; + } + .justify-md-space-between { + justify-content: space-between !important; + } + .justify-md-space-around { + justify-content: space-around !important; + } + .justify-md-space-evenly { + justify-content: space-evenly !important; + } + .align-md-start { + align-items: flex-start !important; + } + .align-md-end { + align-items: flex-end !important; + } + .align-md-center { + align-items: center !important; + } + .align-md-baseline { + align-items: baseline !important; + } + .align-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-space-between { + align-content: space-between !important; + } + .align-content-md-space-around { + align-content: space-around !important; + } + .align-content-md-space-evenly { + align-content: space-evenly !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-6 { + order: 6 !important; + } + .order-md-7 { + order: 7 !important; + } + .order-md-8 { + order: 8 !important; + } + .order-md-9 { + order: 9 !important; + } + .order-md-10 { + order: 10 !important; + } + .order-md-11 { + order: 11 !important; + } + .order-md-12 { + order: 12 !important; + } + .order-md-last { + order: 13 !important; + } + .ga-md-0 { + gap: 0px !important; + } + .ga-md-1 { + gap: 4px !important; + } + .ga-md-2 { + gap: 8px !important; + } + .ga-md-3 { + gap: 12px !important; + } + .ga-md-4 { + gap: 16px !important; + } + .ga-md-5 { + gap: 20px !important; + } + .ga-md-6 { + gap: 24px !important; + } + .ga-md-7 { + gap: 28px !important; + } + .ga-md-8 { + gap: 32px !important; + } + .ga-md-9 { + gap: 36px !important; + } + .ga-md-10 { + gap: 40px !important; + } + .ga-md-11 { + gap: 44px !important; + } + .ga-md-12 { + gap: 48px !important; + } + .ga-md-13 { + gap: 52px !important; + } + .ga-md-14 { + gap: 56px !important; + } + .ga-md-15 { + gap: 60px !important; + } + .ga-md-16 { + gap: 64px !important; + } + .ga-md-auto { + gap: auto !important; + } + .gr-md-0 { + row-gap: 0px !important; + } + .gr-md-1 { + row-gap: 4px !important; + } + .gr-md-2 { + row-gap: 8px !important; + } + .gr-md-3 { + row-gap: 12px !important; + } + .gr-md-4 { + row-gap: 16px !important; + } + .gr-md-5 { + row-gap: 20px !important; + } + .gr-md-6 { + row-gap: 24px !important; + } + .gr-md-7 { + row-gap: 28px !important; + } + .gr-md-8 { + row-gap: 32px !important; + } + .gr-md-9 { + row-gap: 36px !important; + } + .gr-md-10 { + row-gap: 40px !important; + } + .gr-md-11 { + row-gap: 44px !important; + } + .gr-md-12 { + row-gap: 48px !important; + } + .gr-md-13 { + row-gap: 52px !important; + } + .gr-md-14 { + row-gap: 56px !important; + } + .gr-md-15 { + row-gap: 60px !important; + } + .gr-md-16 { + row-gap: 64px !important; + } + .gr-md-auto { + row-gap: auto !important; + } + .gc-md-0 { + column-gap: 0px !important; + } + .gc-md-1 { + column-gap: 4px !important; + } + .gc-md-2 { + column-gap: 8px !important; + } + .gc-md-3 { + column-gap: 12px !important; + } + .gc-md-4 { + column-gap: 16px !important; + } + .gc-md-5 { + column-gap: 20px !important; + } + .gc-md-6 { + column-gap: 24px !important; + } + .gc-md-7 { + column-gap: 28px !important; + } + .gc-md-8 { + column-gap: 32px !important; + } + .gc-md-9 { + column-gap: 36px !important; + } + .gc-md-10 { + column-gap: 40px !important; + } + .gc-md-11 { + column-gap: 44px !important; + } + .gc-md-12 { + column-gap: 48px !important; + } + .gc-md-13 { + column-gap: 52px !important; + } + .gc-md-14 { + column-gap: 56px !important; + } + .gc-md-15 { + column-gap: 60px !important; + } + .gc-md-16 { + column-gap: 64px !important; + } + .gc-md-auto { + column-gap: auto !important; + } + .ma-md-0 { + margin: 0px !important; + } + .ma-md-1 { + margin: 4px !important; + } + .ma-md-2 { + margin: 8px !important; + } + .ma-md-3 { + margin: 12px !important; + } + .ma-md-4 { + margin: 16px !important; + } + .ma-md-5 { + margin: 20px !important; + } + .ma-md-6 { + margin: 24px !important; + } + .ma-md-7 { + margin: 28px !important; + } + .ma-md-8 { + margin: 32px !important; + } + .ma-md-9 { + margin: 36px !important; + } + .ma-md-10 { + margin: 40px !important; + } + .ma-md-11 { + margin: 44px !important; + } + .ma-md-12 { + margin: 48px !important; + } + .ma-md-13 { + margin: 52px !important; + } + .ma-md-14 { + margin: 56px !important; + } + .ma-md-15 { + margin: 60px !important; + } + .ma-md-16 { + margin: 64px !important; + } + .ma-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-md-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-md-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-md-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-md-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-md-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-md-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-md-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-md-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-md-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-md-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-md-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-md-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-md-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-md-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-md-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-md-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-md-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-md-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-md-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-md-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-md-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-md-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-md-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-md-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-md-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-md-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-md-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-md-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-md-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-md-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-md-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-md-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0px !important; + } + .mt-md-1 { + margin-top: 4px !important; + } + .mt-md-2 { + margin-top: 8px !important; + } + .mt-md-3 { + margin-top: 12px !important; + } + .mt-md-4 { + margin-top: 16px !important; + } + .mt-md-5 { + margin-top: 20px !important; + } + .mt-md-6 { + margin-top: 24px !important; + } + .mt-md-7 { + margin-top: 28px !important; + } + .mt-md-8 { + margin-top: 32px !important; + } + .mt-md-9 { + margin-top: 36px !important; + } + .mt-md-10 { + margin-top: 40px !important; + } + .mt-md-11 { + margin-top: 44px !important; + } + .mt-md-12 { + margin-top: 48px !important; + } + .mt-md-13 { + margin-top: 52px !important; + } + .mt-md-14 { + margin-top: 56px !important; + } + .mt-md-15 { + margin-top: 60px !important; + } + .mt-md-16 { + margin-top: 64px !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .mr-md-0 { + margin-right: 0px !important; + } + .mr-md-1 { + margin-right: 4px !important; + } + .mr-md-2 { + margin-right: 8px !important; + } + .mr-md-3 { + margin-right: 12px !important; + } + .mr-md-4 { + margin-right: 16px !important; + } + .mr-md-5 { + margin-right: 20px !important; + } + .mr-md-6 { + margin-right: 24px !important; + } + .mr-md-7 { + margin-right: 28px !important; + } + .mr-md-8 { + margin-right: 32px !important; + } + .mr-md-9 { + margin-right: 36px !important; + } + .mr-md-10 { + margin-right: 40px !important; + } + .mr-md-11 { + margin-right: 44px !important; + } + .mr-md-12 { + margin-right: 48px !important; + } + .mr-md-13 { + margin-right: 52px !important; + } + .mr-md-14 { + margin-right: 56px !important; + } + .mr-md-15 { + margin-right: 60px !important; + } + .mr-md-16 { + margin-right: 64px !important; + } + .mr-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0px !important; + } + .mb-md-1 { + margin-bottom: 4px !important; + } + .mb-md-2 { + margin-bottom: 8px !important; + } + .mb-md-3 { + margin-bottom: 12px !important; + } + .mb-md-4 { + margin-bottom: 16px !important; + } + .mb-md-5 { + margin-bottom: 20px !important; + } + .mb-md-6 { + margin-bottom: 24px !important; + } + .mb-md-7 { + margin-bottom: 28px !important; + } + .mb-md-8 { + margin-bottom: 32px !important; + } + .mb-md-9 { + margin-bottom: 36px !important; + } + .mb-md-10 { + margin-bottom: 40px !important; + } + .mb-md-11 { + margin-bottom: 44px !important; + } + .mb-md-12 { + margin-bottom: 48px !important; + } + .mb-md-13 { + margin-bottom: 52px !important; + } + .mb-md-14 { + margin-bottom: 56px !important; + } + .mb-md-15 { + margin-bottom: 60px !important; + } + .mb-md-16 { + margin-bottom: 64px !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ml-md-0 { + margin-left: 0px !important; + } + .ml-md-1 { + margin-left: 4px !important; + } + .ml-md-2 { + margin-left: 8px !important; + } + .ml-md-3 { + margin-left: 12px !important; + } + .ml-md-4 { + margin-left: 16px !important; + } + .ml-md-5 { + margin-left: 20px !important; + } + .ml-md-6 { + margin-left: 24px !important; + } + .ml-md-7 { + margin-left: 28px !important; + } + .ml-md-8 { + margin-left: 32px !important; + } + .ml-md-9 { + margin-left: 36px !important; + } + .ml-md-10 { + margin-left: 40px !important; + } + .ml-md-11 { + margin-left: 44px !important; + } + .ml-md-12 { + margin-left: 48px !important; + } + .ml-md-13 { + margin-left: 52px !important; + } + .ml-md-14 { + margin-left: 56px !important; + } + .ml-md-15 { + margin-left: 60px !important; + } + .ml-md-16 { + margin-left: 64px !important; + } + .ml-md-auto { + margin-left: auto !important; + } + .ms-md-0 { + margin-inline-start: 0px !important; + } + .ms-md-1 { + margin-inline-start: 4px !important; + } + .ms-md-2 { + margin-inline-start: 8px !important; + } + .ms-md-3 { + margin-inline-start: 12px !important; + } + .ms-md-4 { + margin-inline-start: 16px !important; + } + .ms-md-5 { + margin-inline-start: 20px !important; + } + .ms-md-6 { + margin-inline-start: 24px !important; + } + .ms-md-7 { + margin-inline-start: 28px !important; + } + .ms-md-8 { + margin-inline-start: 32px !important; + } + .ms-md-9 { + margin-inline-start: 36px !important; + } + .ms-md-10 { + margin-inline-start: 40px !important; + } + .ms-md-11 { + margin-inline-start: 44px !important; + } + .ms-md-12 { + margin-inline-start: 48px !important; + } + .ms-md-13 { + margin-inline-start: 52px !important; + } + .ms-md-14 { + margin-inline-start: 56px !important; + } + .ms-md-15 { + margin-inline-start: 60px !important; + } + .ms-md-16 { + margin-inline-start: 64px !important; + } + .ms-md-auto { + margin-inline-start: auto !important; + } + .me-md-0 { + margin-inline-end: 0px !important; + } + .me-md-1 { + margin-inline-end: 4px !important; + } + .me-md-2 { + margin-inline-end: 8px !important; + } + .me-md-3 { + margin-inline-end: 12px !important; + } + .me-md-4 { + margin-inline-end: 16px !important; + } + .me-md-5 { + margin-inline-end: 20px !important; + } + .me-md-6 { + margin-inline-end: 24px !important; + } + .me-md-7 { + margin-inline-end: 28px !important; + } + .me-md-8 { + margin-inline-end: 32px !important; + } + .me-md-9 { + margin-inline-end: 36px !important; + } + .me-md-10 { + margin-inline-end: 40px !important; + } + .me-md-11 { + margin-inline-end: 44px !important; + } + .me-md-12 { + margin-inline-end: 48px !important; + } + .me-md-13 { + margin-inline-end: 52px !important; + } + .me-md-14 { + margin-inline-end: 56px !important; + } + .me-md-15 { + margin-inline-end: 60px !important; + } + .me-md-16 { + margin-inline-end: 64px !important; + } + .me-md-auto { + margin-inline-end: auto !important; + } + .ma-md-n1 { + margin: -4px !important; + } + .ma-md-n2 { + margin: -8px !important; + } + .ma-md-n3 { + margin: -12px !important; + } + .ma-md-n4 { + margin: -16px !important; + } + .ma-md-n5 { + margin: -20px !important; + } + .ma-md-n6 { + margin: -24px !important; + } + .ma-md-n7 { + margin: -28px !important; + } + .ma-md-n8 { + margin: -32px !important; + } + .ma-md-n9 { + margin: -36px !important; + } + .ma-md-n10 { + margin: -40px !important; + } + .ma-md-n11 { + margin: -44px !important; + } + .ma-md-n12 { + margin: -48px !important; + } + .ma-md-n13 { + margin: -52px !important; + } + .ma-md-n14 { + margin: -56px !important; + } + .ma-md-n15 { + margin: -60px !important; + } + .ma-md-n16 { + margin: -64px !important; + } + .mx-md-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-md-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-md-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-md-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-md-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-md-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-md-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-md-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-md-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-md-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-md-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-md-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-md-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-md-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-md-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-md-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-md-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-md-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-md-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-md-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-md-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-md-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-md-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-md-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-md-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-md-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-md-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-md-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-md-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-md-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-md-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-md-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-md-n1 { + margin-top: -4px !important; + } + .mt-md-n2 { + margin-top: -8px !important; + } + .mt-md-n3 { + margin-top: -12px !important; + } + .mt-md-n4 { + margin-top: -16px !important; + } + .mt-md-n5 { + margin-top: -20px !important; + } + .mt-md-n6 { + margin-top: -24px !important; + } + .mt-md-n7 { + margin-top: -28px !important; + } + .mt-md-n8 { + margin-top: -32px !important; + } + .mt-md-n9 { + margin-top: -36px !important; + } + .mt-md-n10 { + margin-top: -40px !important; + } + .mt-md-n11 { + margin-top: -44px !important; + } + .mt-md-n12 { + margin-top: -48px !important; + } + .mt-md-n13 { + margin-top: -52px !important; + } + .mt-md-n14 { + margin-top: -56px !important; + } + .mt-md-n15 { + margin-top: -60px !important; + } + .mt-md-n16 { + margin-top: -64px !important; + } + .mr-md-n1 { + margin-right: -4px !important; + } + .mr-md-n2 { + margin-right: -8px !important; + } + .mr-md-n3 { + margin-right: -12px !important; + } + .mr-md-n4 { + margin-right: -16px !important; + } + .mr-md-n5 { + margin-right: -20px !important; + } + .mr-md-n6 { + margin-right: -24px !important; + } + .mr-md-n7 { + margin-right: -28px !important; + } + .mr-md-n8 { + margin-right: -32px !important; + } + .mr-md-n9 { + margin-right: -36px !important; + } + .mr-md-n10 { + margin-right: -40px !important; + } + .mr-md-n11 { + margin-right: -44px !important; + } + .mr-md-n12 { + margin-right: -48px !important; + } + .mr-md-n13 { + margin-right: -52px !important; + } + .mr-md-n14 { + margin-right: -56px !important; + } + .mr-md-n15 { + margin-right: -60px !important; + } + .mr-md-n16 { + margin-right: -64px !important; + } + .mb-md-n1 { + margin-bottom: -4px !important; + } + .mb-md-n2 { + margin-bottom: -8px !important; + } + .mb-md-n3 { + margin-bottom: -12px !important; + } + .mb-md-n4 { + margin-bottom: -16px !important; + } + .mb-md-n5 { + margin-bottom: -20px !important; + } + .mb-md-n6 { + margin-bottom: -24px !important; + } + .mb-md-n7 { + margin-bottom: -28px !important; + } + .mb-md-n8 { + margin-bottom: -32px !important; + } + .mb-md-n9 { + margin-bottom: -36px !important; + } + .mb-md-n10 { + margin-bottom: -40px !important; + } + .mb-md-n11 { + margin-bottom: -44px !important; + } + .mb-md-n12 { + margin-bottom: -48px !important; + } + .mb-md-n13 { + margin-bottom: -52px !important; + } + .mb-md-n14 { + margin-bottom: -56px !important; + } + .mb-md-n15 { + margin-bottom: -60px !important; + } + .mb-md-n16 { + margin-bottom: -64px !important; + } + .ml-md-n1 { + margin-left: -4px !important; + } + .ml-md-n2 { + margin-left: -8px !important; + } + .ml-md-n3 { + margin-left: -12px !important; + } + .ml-md-n4 { + margin-left: -16px !important; + } + .ml-md-n5 { + margin-left: -20px !important; + } + .ml-md-n6 { + margin-left: -24px !important; + } + .ml-md-n7 { + margin-left: -28px !important; + } + .ml-md-n8 { + margin-left: -32px !important; + } + .ml-md-n9 { + margin-left: -36px !important; + } + .ml-md-n10 { + margin-left: -40px !important; + } + .ml-md-n11 { + margin-left: -44px !important; + } + .ml-md-n12 { + margin-left: -48px !important; + } + .ml-md-n13 { + margin-left: -52px !important; + } + .ml-md-n14 { + margin-left: -56px !important; + } + .ml-md-n15 { + margin-left: -60px !important; + } + .ml-md-n16 { + margin-left: -64px !important; + } + .ms-md-n1 { + margin-inline-start: -4px !important; + } + .ms-md-n2 { + margin-inline-start: -8px !important; + } + .ms-md-n3 { + margin-inline-start: -12px !important; + } + .ms-md-n4 { + margin-inline-start: -16px !important; + } + .ms-md-n5 { + margin-inline-start: -20px !important; + } + .ms-md-n6 { + margin-inline-start: -24px !important; + } + .ms-md-n7 { + margin-inline-start: -28px !important; + } + .ms-md-n8 { + margin-inline-start: -32px !important; + } + .ms-md-n9 { + margin-inline-start: -36px !important; + } + .ms-md-n10 { + margin-inline-start: -40px !important; + } + .ms-md-n11 { + margin-inline-start: -44px !important; + } + .ms-md-n12 { + margin-inline-start: -48px !important; + } + .ms-md-n13 { + margin-inline-start: -52px !important; + } + .ms-md-n14 { + margin-inline-start: -56px !important; + } + .ms-md-n15 { + margin-inline-start: -60px !important; + } + .ms-md-n16 { + margin-inline-start: -64px !important; + } + .me-md-n1 { + margin-inline-end: -4px !important; + } + .me-md-n2 { + margin-inline-end: -8px !important; + } + .me-md-n3 { + margin-inline-end: -12px !important; + } + .me-md-n4 { + margin-inline-end: -16px !important; + } + .me-md-n5 { + margin-inline-end: -20px !important; + } + .me-md-n6 { + margin-inline-end: -24px !important; + } + .me-md-n7 { + margin-inline-end: -28px !important; + } + .me-md-n8 { + margin-inline-end: -32px !important; + } + .me-md-n9 { + margin-inline-end: -36px !important; + } + .me-md-n10 { + margin-inline-end: -40px !important; + } + .me-md-n11 { + margin-inline-end: -44px !important; + } + .me-md-n12 { + margin-inline-end: -48px !important; + } + .me-md-n13 { + margin-inline-end: -52px !important; + } + .me-md-n14 { + margin-inline-end: -56px !important; + } + .me-md-n15 { + margin-inline-end: -60px !important; + } + .me-md-n16 { + margin-inline-end: -64px !important; + } + .pa-md-0 { + padding: 0px !important; + } + .pa-md-1 { + padding: 4px !important; + } + .pa-md-2 { + padding: 8px !important; + } + .pa-md-3 { + padding: 12px !important; + } + .pa-md-4 { + padding: 16px !important; + } + .pa-md-5 { + padding: 20px !important; + } + .pa-md-6 { + padding: 24px !important; + } + .pa-md-7 { + padding: 28px !important; + } + .pa-md-8 { + padding: 32px !important; + } + .pa-md-9 { + padding: 36px !important; + } + .pa-md-10 { + padding: 40px !important; + } + .pa-md-11 { + padding: 44px !important; + } + .pa-md-12 { + padding: 48px !important; + } + .pa-md-13 { + padding: 52px !important; + } + .pa-md-14 { + padding: 56px !important; + } + .pa-md-15 { + padding: 60px !important; + } + .pa-md-16 { + padding: 64px !important; + } + .px-md-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-md-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-md-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-md-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-md-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-md-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-md-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-md-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-md-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-md-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-md-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-md-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-md-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-md-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-md-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-md-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-md-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-md-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-md-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-md-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-md-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-md-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-md-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-md-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-md-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-md-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-md-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-md-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-md-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-md-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-md-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-md-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-md-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-md-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-md-0 { + padding-top: 0px !important; + } + .pt-md-1 { + padding-top: 4px !important; + } + .pt-md-2 { + padding-top: 8px !important; + } + .pt-md-3 { + padding-top: 12px !important; + } + .pt-md-4 { + padding-top: 16px !important; + } + .pt-md-5 { + padding-top: 20px !important; + } + .pt-md-6 { + padding-top: 24px !important; + } + .pt-md-7 { + padding-top: 28px !important; + } + .pt-md-8 { + padding-top: 32px !important; + } + .pt-md-9 { + padding-top: 36px !important; + } + .pt-md-10 { + padding-top: 40px !important; + } + .pt-md-11 { + padding-top: 44px !important; + } + .pt-md-12 { + padding-top: 48px !important; + } + .pt-md-13 { + padding-top: 52px !important; + } + .pt-md-14 { + padding-top: 56px !important; + } + .pt-md-15 { + padding-top: 60px !important; + } + .pt-md-16 { + padding-top: 64px !important; + } + .pr-md-0 { + padding-right: 0px !important; + } + .pr-md-1 { + padding-right: 4px !important; + } + .pr-md-2 { + padding-right: 8px !important; + } + .pr-md-3 { + padding-right: 12px !important; + } + .pr-md-4 { + padding-right: 16px !important; + } + .pr-md-5 { + padding-right: 20px !important; + } + .pr-md-6 { + padding-right: 24px !important; + } + .pr-md-7 { + padding-right: 28px !important; + } + .pr-md-8 { + padding-right: 32px !important; + } + .pr-md-9 { + padding-right: 36px !important; + } + .pr-md-10 { + padding-right: 40px !important; + } + .pr-md-11 { + padding-right: 44px !important; + } + .pr-md-12 { + padding-right: 48px !important; + } + .pr-md-13 { + padding-right: 52px !important; + } + .pr-md-14 { + padding-right: 56px !important; + } + .pr-md-15 { + padding-right: 60px !important; + } + .pr-md-16 { + padding-right: 64px !important; + } + .pb-md-0 { + padding-bottom: 0px !important; + } + .pb-md-1 { + padding-bottom: 4px !important; + } + .pb-md-2 { + padding-bottom: 8px !important; + } + .pb-md-3 { + padding-bottom: 12px !important; + } + .pb-md-4 { + padding-bottom: 16px !important; + } + .pb-md-5 { + padding-bottom: 20px !important; + } + .pb-md-6 { + padding-bottom: 24px !important; + } + .pb-md-7 { + padding-bottom: 28px !important; + } + .pb-md-8 { + padding-bottom: 32px !important; + } + .pb-md-9 { + padding-bottom: 36px !important; + } + .pb-md-10 { + padding-bottom: 40px !important; + } + .pb-md-11 { + padding-bottom: 44px !important; + } + .pb-md-12 { + padding-bottom: 48px !important; + } + .pb-md-13 { + padding-bottom: 52px !important; + } + .pb-md-14 { + padding-bottom: 56px !important; + } + .pb-md-15 { + padding-bottom: 60px !important; + } + .pb-md-16 { + padding-bottom: 64px !important; + } + .pl-md-0 { + padding-left: 0px !important; + } + .pl-md-1 { + padding-left: 4px !important; + } + .pl-md-2 { + padding-left: 8px !important; + } + .pl-md-3 { + padding-left: 12px !important; + } + .pl-md-4 { + padding-left: 16px !important; + } + .pl-md-5 { + padding-left: 20px !important; + } + .pl-md-6 { + padding-left: 24px !important; + } + .pl-md-7 { + padding-left: 28px !important; + } + .pl-md-8 { + padding-left: 32px !important; + } + .pl-md-9 { + padding-left: 36px !important; + } + .pl-md-10 { + padding-left: 40px !important; + } + .pl-md-11 { + padding-left: 44px !important; + } + .pl-md-12 { + padding-left: 48px !important; + } + .pl-md-13 { + padding-left: 52px !important; + } + .pl-md-14 { + padding-left: 56px !important; + } + .pl-md-15 { + padding-left: 60px !important; + } + .pl-md-16 { + padding-left: 64px !important; + } + .ps-md-0 { + padding-inline-start: 0px !important; + } + .ps-md-1 { + padding-inline-start: 4px !important; + } + .ps-md-2 { + padding-inline-start: 8px !important; + } + .ps-md-3 { + padding-inline-start: 12px !important; + } + .ps-md-4 { + padding-inline-start: 16px !important; + } + .ps-md-5 { + padding-inline-start: 20px !important; + } + .ps-md-6 { + padding-inline-start: 24px !important; + } + .ps-md-7 { + padding-inline-start: 28px !important; + } + .ps-md-8 { + padding-inline-start: 32px !important; + } + .ps-md-9 { + padding-inline-start: 36px !important; + } + .ps-md-10 { + padding-inline-start: 40px !important; + } + .ps-md-11 { + padding-inline-start: 44px !important; + } + .ps-md-12 { + padding-inline-start: 48px !important; + } + .ps-md-13 { + padding-inline-start: 52px !important; + } + .ps-md-14 { + padding-inline-start: 56px !important; + } + .ps-md-15 { + padding-inline-start: 60px !important; + } + .ps-md-16 { + padding-inline-start: 64px !important; + } + .pe-md-0 { + padding-inline-end: 0px !important; + } + .pe-md-1 { + padding-inline-end: 4px !important; + } + .pe-md-2 { + padding-inline-end: 8px !important; + } + .pe-md-3 { + padding-inline-end: 12px !important; + } + .pe-md-4 { + padding-inline-end: 16px !important; + } + .pe-md-5 { + padding-inline-end: 20px !important; + } + .pe-md-6 { + padding-inline-end: 24px !important; + } + .pe-md-7 { + padding-inline-end: 28px !important; + } + .pe-md-8 { + padding-inline-end: 32px !important; + } + .pe-md-9 { + padding-inline-end: 36px !important; + } + .pe-md-10 { + padding-inline-end: 40px !important; + } + .pe-md-11 { + padding-inline-end: 44px !important; + } + .pe-md-12 { + padding-inline-end: 48px !important; + } + .pe-md-13 { + padding-inline-end: 52px !important; + } + .pe-md-14 { + padding-inline-end: 56px !important; + } + .pe-md-15 { + padding-inline-end: 60px !important; + } + .pe-md-16 { + padding-inline-end: 64px !important; + } + .text-md-left { + text-align: left !important; + } + .text-md-right { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } + .text-md-justify { + text-align: justify !important; + } + .text-md-start { + text-align: start !important; + } + .text-md-end { + text-align: end !important; + } + .text-md-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-md-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-md-auto { + height: auto !important; + } + .h-md-screen { + height: 100vh !important; + } + .h-md-0 { + height: 0 !important; + } + .h-md-25 { + height: 25% !important; + } + .h-md-50 { + height: 50% !important; + } + .h-md-75 { + height: 75% !important; + } + .h-md-100 { + height: 100% !important; + } + .w-md-auto { + width: auto !important; + } + .w-md-0 { + width: 0 !important; + } + .w-md-25 { + width: 25% !important; + } + .w-md-33 { + width: 33% !important; + } + .w-md-50 { + width: 50% !important; + } + .w-md-66 { + width: 66% !important; + } + .w-md-75 { + width: 75% !important; + } + .w-md-100 { + width: 100% !important; + } +} +@media (min-width: 1280px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .float-lg-none { + float: none !important; + } + .float-lg-left { + float: left !important; + } + .float-lg-right { + float: right !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-1-1 { + flex: 1 1 auto !important; + } + .flex-lg-1-0 { + flex: 1 0 auto !important; + } + .flex-lg-0-1 { + flex: 0 1 auto !important; + } + .flex-lg-0-0 { + flex: 0 0 auto !important; + } + .flex-lg-1-1-100 { + flex: 1 1 100% !important; + } + .flex-lg-1-0-100 { + flex: 1 0 100% !important; + } + .flex-lg-0-1-100 { + flex: 0 1 100% !important; + } + .flex-lg-0-0-100 { + flex: 0 0 100% !important; + } + .flex-lg-1-1-0 { + flex: 1 1 0 !important; + } + .flex-lg-1-0-0 { + flex: 1 0 0 !important; + } + .flex-lg-0-1-0 { + flex: 0 1 0 !important; + } + .flex-lg-0-0-0 { + flex: 0 0 0 !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-lg-start { + justify-content: flex-start !important; + } + .justify-lg-end { + justify-content: flex-end !important; + } + .justify-lg-center { + justify-content: center !important; + } + .justify-lg-space-between { + justify-content: space-between !important; + } + .justify-lg-space-around { + justify-content: space-around !important; + } + .justify-lg-space-evenly { + justify-content: space-evenly !important; + } + .align-lg-start { + align-items: flex-start !important; + } + .align-lg-end { + align-items: flex-end !important; + } + .align-lg-center { + align-items: center !important; + } + .align-lg-baseline { + align-items: baseline !important; + } + .align-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-space-between { + align-content: space-between !important; + } + .align-content-lg-space-around { + align-content: space-around !important; + } + .align-content-lg-space-evenly { + align-content: space-evenly !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-6 { + order: 6 !important; + } + .order-lg-7 { + order: 7 !important; + } + .order-lg-8 { + order: 8 !important; + } + .order-lg-9 { + order: 9 !important; + } + .order-lg-10 { + order: 10 !important; + } + .order-lg-11 { + order: 11 !important; + } + .order-lg-12 { + order: 12 !important; + } + .order-lg-last { + order: 13 !important; + } + .ga-lg-0 { + gap: 0px !important; + } + .ga-lg-1 { + gap: 4px !important; + } + .ga-lg-2 { + gap: 8px !important; + } + .ga-lg-3 { + gap: 12px !important; + } + .ga-lg-4 { + gap: 16px !important; + } + .ga-lg-5 { + gap: 20px !important; + } + .ga-lg-6 { + gap: 24px !important; + } + .ga-lg-7 { + gap: 28px !important; + } + .ga-lg-8 { + gap: 32px !important; + } + .ga-lg-9 { + gap: 36px !important; + } + .ga-lg-10 { + gap: 40px !important; + } + .ga-lg-11 { + gap: 44px !important; + } + .ga-lg-12 { + gap: 48px !important; + } + .ga-lg-13 { + gap: 52px !important; + } + .ga-lg-14 { + gap: 56px !important; + } + .ga-lg-15 { + gap: 60px !important; + } + .ga-lg-16 { + gap: 64px !important; + } + .ga-lg-auto { + gap: auto !important; + } + .gr-lg-0 { + row-gap: 0px !important; + } + .gr-lg-1 { + row-gap: 4px !important; + } + .gr-lg-2 { + row-gap: 8px !important; + } + .gr-lg-3 { + row-gap: 12px !important; + } + .gr-lg-4 { + row-gap: 16px !important; + } + .gr-lg-5 { + row-gap: 20px !important; + } + .gr-lg-6 { + row-gap: 24px !important; + } + .gr-lg-7 { + row-gap: 28px !important; + } + .gr-lg-8 { + row-gap: 32px !important; + } + .gr-lg-9 { + row-gap: 36px !important; + } + .gr-lg-10 { + row-gap: 40px !important; + } + .gr-lg-11 { + row-gap: 44px !important; + } + .gr-lg-12 { + row-gap: 48px !important; + } + .gr-lg-13 { + row-gap: 52px !important; + } + .gr-lg-14 { + row-gap: 56px !important; + } + .gr-lg-15 { + row-gap: 60px !important; + } + .gr-lg-16 { + row-gap: 64px !important; + } + .gr-lg-auto { + row-gap: auto !important; + } + .gc-lg-0 { + column-gap: 0px !important; + } + .gc-lg-1 { + column-gap: 4px !important; + } + .gc-lg-2 { + column-gap: 8px !important; + } + .gc-lg-3 { + column-gap: 12px !important; + } + .gc-lg-4 { + column-gap: 16px !important; + } + .gc-lg-5 { + column-gap: 20px !important; + } + .gc-lg-6 { + column-gap: 24px !important; + } + .gc-lg-7 { + column-gap: 28px !important; + } + .gc-lg-8 { + column-gap: 32px !important; + } + .gc-lg-9 { + column-gap: 36px !important; + } + .gc-lg-10 { + column-gap: 40px !important; + } + .gc-lg-11 { + column-gap: 44px !important; + } + .gc-lg-12 { + column-gap: 48px !important; + } + .gc-lg-13 { + column-gap: 52px !important; + } + .gc-lg-14 { + column-gap: 56px !important; + } + .gc-lg-15 { + column-gap: 60px !important; + } + .gc-lg-16 { + column-gap: 64px !important; + } + .gc-lg-auto { + column-gap: auto !important; + } + .ma-lg-0 { + margin: 0px !important; + } + .ma-lg-1 { + margin: 4px !important; + } + .ma-lg-2 { + margin: 8px !important; + } + .ma-lg-3 { + margin: 12px !important; + } + .ma-lg-4 { + margin: 16px !important; + } + .ma-lg-5 { + margin: 20px !important; + } + .ma-lg-6 { + margin: 24px !important; + } + .ma-lg-7 { + margin: 28px !important; + } + .ma-lg-8 { + margin: 32px !important; + } + .ma-lg-9 { + margin: 36px !important; + } + .ma-lg-10 { + margin: 40px !important; + } + .ma-lg-11 { + margin: 44px !important; + } + .ma-lg-12 { + margin: 48px !important; + } + .ma-lg-13 { + margin: 52px !important; + } + .ma-lg-14 { + margin: 56px !important; + } + .ma-lg-15 { + margin: 60px !important; + } + .ma-lg-16 { + margin: 64px !important; + } + .ma-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-lg-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-lg-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-lg-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-lg-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-lg-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-lg-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-lg-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-lg-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-lg-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-lg-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-lg-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-lg-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-lg-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-lg-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-lg-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-lg-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-lg-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-lg-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-lg-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-lg-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-lg-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-lg-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-lg-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-lg-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-lg-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-lg-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-lg-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-lg-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-lg-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-lg-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-lg-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-lg-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0px !important; + } + .mt-lg-1 { + margin-top: 4px !important; + } + .mt-lg-2 { + margin-top: 8px !important; + } + .mt-lg-3 { + margin-top: 12px !important; + } + .mt-lg-4 { + margin-top: 16px !important; + } + .mt-lg-5 { + margin-top: 20px !important; + } + .mt-lg-6 { + margin-top: 24px !important; + } + .mt-lg-7 { + margin-top: 28px !important; + } + .mt-lg-8 { + margin-top: 32px !important; + } + .mt-lg-9 { + margin-top: 36px !important; + } + .mt-lg-10 { + margin-top: 40px !important; + } + .mt-lg-11 { + margin-top: 44px !important; + } + .mt-lg-12 { + margin-top: 48px !important; + } + .mt-lg-13 { + margin-top: 52px !important; + } + .mt-lg-14 { + margin-top: 56px !important; + } + .mt-lg-15 { + margin-top: 60px !important; + } + .mt-lg-16 { + margin-top: 64px !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .mr-lg-0 { + margin-right: 0px !important; + } + .mr-lg-1 { + margin-right: 4px !important; + } + .mr-lg-2 { + margin-right: 8px !important; + } + .mr-lg-3 { + margin-right: 12px !important; + } + .mr-lg-4 { + margin-right: 16px !important; + } + .mr-lg-5 { + margin-right: 20px !important; + } + .mr-lg-6 { + margin-right: 24px !important; + } + .mr-lg-7 { + margin-right: 28px !important; + } + .mr-lg-8 { + margin-right: 32px !important; + } + .mr-lg-9 { + margin-right: 36px !important; + } + .mr-lg-10 { + margin-right: 40px !important; + } + .mr-lg-11 { + margin-right: 44px !important; + } + .mr-lg-12 { + margin-right: 48px !important; + } + .mr-lg-13 { + margin-right: 52px !important; + } + .mr-lg-14 { + margin-right: 56px !important; + } + .mr-lg-15 { + margin-right: 60px !important; + } + .mr-lg-16 { + margin-right: 64px !important; + } + .mr-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0px !important; + } + .mb-lg-1 { + margin-bottom: 4px !important; + } + .mb-lg-2 { + margin-bottom: 8px !important; + } + .mb-lg-3 { + margin-bottom: 12px !important; + } + .mb-lg-4 { + margin-bottom: 16px !important; + } + .mb-lg-5 { + margin-bottom: 20px !important; + } + .mb-lg-6 { + margin-bottom: 24px !important; + } + .mb-lg-7 { + margin-bottom: 28px !important; + } + .mb-lg-8 { + margin-bottom: 32px !important; + } + .mb-lg-9 { + margin-bottom: 36px !important; + } + .mb-lg-10 { + margin-bottom: 40px !important; + } + .mb-lg-11 { + margin-bottom: 44px !important; + } + .mb-lg-12 { + margin-bottom: 48px !important; + } + .mb-lg-13 { + margin-bottom: 52px !important; + } + .mb-lg-14 { + margin-bottom: 56px !important; + } + .mb-lg-15 { + margin-bottom: 60px !important; + } + .mb-lg-16 { + margin-bottom: 64px !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-0 { + margin-left: 0px !important; + } + .ml-lg-1 { + margin-left: 4px !important; + } + .ml-lg-2 { + margin-left: 8px !important; + } + .ml-lg-3 { + margin-left: 12px !important; + } + .ml-lg-4 { + margin-left: 16px !important; + } + .ml-lg-5 { + margin-left: 20px !important; + } + .ml-lg-6 { + margin-left: 24px !important; + } + .ml-lg-7 { + margin-left: 28px !important; + } + .ml-lg-8 { + margin-left: 32px !important; + } + .ml-lg-9 { + margin-left: 36px !important; + } + .ml-lg-10 { + margin-left: 40px !important; + } + .ml-lg-11 { + margin-left: 44px !important; + } + .ml-lg-12 { + margin-left: 48px !important; + } + .ml-lg-13 { + margin-left: 52px !important; + } + .ml-lg-14 { + margin-left: 56px !important; + } + .ml-lg-15 { + margin-left: 60px !important; + } + .ml-lg-16 { + margin-left: 64px !important; + } + .ml-lg-auto { + margin-left: auto !important; + } + .ms-lg-0 { + margin-inline-start: 0px !important; + } + .ms-lg-1 { + margin-inline-start: 4px !important; + } + .ms-lg-2 { + margin-inline-start: 8px !important; + } + .ms-lg-3 { + margin-inline-start: 12px !important; + } + .ms-lg-4 { + margin-inline-start: 16px !important; + } + .ms-lg-5 { + margin-inline-start: 20px !important; + } + .ms-lg-6 { + margin-inline-start: 24px !important; + } + .ms-lg-7 { + margin-inline-start: 28px !important; + } + .ms-lg-8 { + margin-inline-start: 32px !important; + } + .ms-lg-9 { + margin-inline-start: 36px !important; + } + .ms-lg-10 { + margin-inline-start: 40px !important; + } + .ms-lg-11 { + margin-inline-start: 44px !important; + } + .ms-lg-12 { + margin-inline-start: 48px !important; + } + .ms-lg-13 { + margin-inline-start: 52px !important; + } + .ms-lg-14 { + margin-inline-start: 56px !important; + } + .ms-lg-15 { + margin-inline-start: 60px !important; + } + .ms-lg-16 { + margin-inline-start: 64px !important; + } + .ms-lg-auto { + margin-inline-start: auto !important; + } + .me-lg-0 { + margin-inline-end: 0px !important; + } + .me-lg-1 { + margin-inline-end: 4px !important; + } + .me-lg-2 { + margin-inline-end: 8px !important; + } + .me-lg-3 { + margin-inline-end: 12px !important; + } + .me-lg-4 { + margin-inline-end: 16px !important; + } + .me-lg-5 { + margin-inline-end: 20px !important; + } + .me-lg-6 { + margin-inline-end: 24px !important; + } + .me-lg-7 { + margin-inline-end: 28px !important; + } + .me-lg-8 { + margin-inline-end: 32px !important; + } + .me-lg-9 { + margin-inline-end: 36px !important; + } + .me-lg-10 { + margin-inline-end: 40px !important; + } + .me-lg-11 { + margin-inline-end: 44px !important; + } + .me-lg-12 { + margin-inline-end: 48px !important; + } + .me-lg-13 { + margin-inline-end: 52px !important; + } + .me-lg-14 { + margin-inline-end: 56px !important; + } + .me-lg-15 { + margin-inline-end: 60px !important; + } + .me-lg-16 { + margin-inline-end: 64px !important; + } + .me-lg-auto { + margin-inline-end: auto !important; + } + .ma-lg-n1 { + margin: -4px !important; + } + .ma-lg-n2 { + margin: -8px !important; + } + .ma-lg-n3 { + margin: -12px !important; + } + .ma-lg-n4 { + margin: -16px !important; + } + .ma-lg-n5 { + margin: -20px !important; + } + .ma-lg-n6 { + margin: -24px !important; + } + .ma-lg-n7 { + margin: -28px !important; + } + .ma-lg-n8 { + margin: -32px !important; + } + .ma-lg-n9 { + margin: -36px !important; + } + .ma-lg-n10 { + margin: -40px !important; + } + .ma-lg-n11 { + margin: -44px !important; + } + .ma-lg-n12 { + margin: -48px !important; + } + .ma-lg-n13 { + margin: -52px !important; + } + .ma-lg-n14 { + margin: -56px !important; + } + .ma-lg-n15 { + margin: -60px !important; + } + .ma-lg-n16 { + margin: -64px !important; + } + .mx-lg-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-lg-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-lg-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-lg-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-lg-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-lg-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-lg-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-lg-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-lg-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-lg-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-lg-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-lg-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-lg-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-lg-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-lg-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-lg-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-lg-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-lg-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-lg-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-lg-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-lg-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-lg-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-lg-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-lg-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-lg-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-lg-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-lg-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-lg-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-lg-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-lg-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-lg-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-lg-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-lg-n1 { + margin-top: -4px !important; + } + .mt-lg-n2 { + margin-top: -8px !important; + } + .mt-lg-n3 { + margin-top: -12px !important; + } + .mt-lg-n4 { + margin-top: -16px !important; + } + .mt-lg-n5 { + margin-top: -20px !important; + } + .mt-lg-n6 { + margin-top: -24px !important; + } + .mt-lg-n7 { + margin-top: -28px !important; + } + .mt-lg-n8 { + margin-top: -32px !important; + } + .mt-lg-n9 { + margin-top: -36px !important; + } + .mt-lg-n10 { + margin-top: -40px !important; + } + .mt-lg-n11 { + margin-top: -44px !important; + } + .mt-lg-n12 { + margin-top: -48px !important; + } + .mt-lg-n13 { + margin-top: -52px !important; + } + .mt-lg-n14 { + margin-top: -56px !important; + } + .mt-lg-n15 { + margin-top: -60px !important; + } + .mt-lg-n16 { + margin-top: -64px !important; + } + .mr-lg-n1 { + margin-right: -4px !important; + } + .mr-lg-n2 { + margin-right: -8px !important; + } + .mr-lg-n3 { + margin-right: -12px !important; + } + .mr-lg-n4 { + margin-right: -16px !important; + } + .mr-lg-n5 { + margin-right: -20px !important; + } + .mr-lg-n6 { + margin-right: -24px !important; + } + .mr-lg-n7 { + margin-right: -28px !important; + } + .mr-lg-n8 { + margin-right: -32px !important; + } + .mr-lg-n9 { + margin-right: -36px !important; + } + .mr-lg-n10 { + margin-right: -40px !important; + } + .mr-lg-n11 { + margin-right: -44px !important; + } + .mr-lg-n12 { + margin-right: -48px !important; + } + .mr-lg-n13 { + margin-right: -52px !important; + } + .mr-lg-n14 { + margin-right: -56px !important; + } + .mr-lg-n15 { + margin-right: -60px !important; + } + .mr-lg-n16 { + margin-right: -64px !important; + } + .mb-lg-n1 { + margin-bottom: -4px !important; + } + .mb-lg-n2 { + margin-bottom: -8px !important; + } + .mb-lg-n3 { + margin-bottom: -12px !important; + } + .mb-lg-n4 { + margin-bottom: -16px !important; + } + .mb-lg-n5 { + margin-bottom: -20px !important; + } + .mb-lg-n6 { + margin-bottom: -24px !important; + } + .mb-lg-n7 { + margin-bottom: -28px !important; + } + .mb-lg-n8 { + margin-bottom: -32px !important; + } + .mb-lg-n9 { + margin-bottom: -36px !important; + } + .mb-lg-n10 { + margin-bottom: -40px !important; + } + .mb-lg-n11 { + margin-bottom: -44px !important; + } + .mb-lg-n12 { + margin-bottom: -48px !important; + } + .mb-lg-n13 { + margin-bottom: -52px !important; + } + .mb-lg-n14 { + margin-bottom: -56px !important; + } + .mb-lg-n15 { + margin-bottom: -60px !important; + } + .mb-lg-n16 { + margin-bottom: -64px !important; + } + .ml-lg-n1 { + margin-left: -4px !important; + } + .ml-lg-n2 { + margin-left: -8px !important; + } + .ml-lg-n3 { + margin-left: -12px !important; + } + .ml-lg-n4 { + margin-left: -16px !important; + } + .ml-lg-n5 { + margin-left: -20px !important; + } + .ml-lg-n6 { + margin-left: -24px !important; + } + .ml-lg-n7 { + margin-left: -28px !important; + } + .ml-lg-n8 { + margin-left: -32px !important; + } + .ml-lg-n9 { + margin-left: -36px !important; + } + .ml-lg-n10 { + margin-left: -40px !important; + } + .ml-lg-n11 { + margin-left: -44px !important; + } + .ml-lg-n12 { + margin-left: -48px !important; + } + .ml-lg-n13 { + margin-left: -52px !important; + } + .ml-lg-n14 { + margin-left: -56px !important; + } + .ml-lg-n15 { + margin-left: -60px !important; + } + .ml-lg-n16 { + margin-left: -64px !important; + } + .ms-lg-n1 { + margin-inline-start: -4px !important; + } + .ms-lg-n2 { + margin-inline-start: -8px !important; + } + .ms-lg-n3 { + margin-inline-start: -12px !important; + } + .ms-lg-n4 { + margin-inline-start: -16px !important; + } + .ms-lg-n5 { + margin-inline-start: -20px !important; + } + .ms-lg-n6 { + margin-inline-start: -24px !important; + } + .ms-lg-n7 { + margin-inline-start: -28px !important; + } + .ms-lg-n8 { + margin-inline-start: -32px !important; + } + .ms-lg-n9 { + margin-inline-start: -36px !important; + } + .ms-lg-n10 { + margin-inline-start: -40px !important; + } + .ms-lg-n11 { + margin-inline-start: -44px !important; + } + .ms-lg-n12 { + margin-inline-start: -48px !important; + } + .ms-lg-n13 { + margin-inline-start: -52px !important; + } + .ms-lg-n14 { + margin-inline-start: -56px !important; + } + .ms-lg-n15 { + margin-inline-start: -60px !important; + } + .ms-lg-n16 { + margin-inline-start: -64px !important; + } + .me-lg-n1 { + margin-inline-end: -4px !important; + } + .me-lg-n2 { + margin-inline-end: -8px !important; + } + .me-lg-n3 { + margin-inline-end: -12px !important; + } + .me-lg-n4 { + margin-inline-end: -16px !important; + } + .me-lg-n5 { + margin-inline-end: -20px !important; + } + .me-lg-n6 { + margin-inline-end: -24px !important; + } + .me-lg-n7 { + margin-inline-end: -28px !important; + } + .me-lg-n8 { + margin-inline-end: -32px !important; + } + .me-lg-n9 { + margin-inline-end: -36px !important; + } + .me-lg-n10 { + margin-inline-end: -40px !important; + } + .me-lg-n11 { + margin-inline-end: -44px !important; + } + .me-lg-n12 { + margin-inline-end: -48px !important; + } + .me-lg-n13 { + margin-inline-end: -52px !important; + } + .me-lg-n14 { + margin-inline-end: -56px !important; + } + .me-lg-n15 { + margin-inline-end: -60px !important; + } + .me-lg-n16 { + margin-inline-end: -64px !important; + } + .pa-lg-0 { + padding: 0px !important; + } + .pa-lg-1 { + padding: 4px !important; + } + .pa-lg-2 { + padding: 8px !important; + } + .pa-lg-3 { + padding: 12px !important; + } + .pa-lg-4 { + padding: 16px !important; + } + .pa-lg-5 { + padding: 20px !important; + } + .pa-lg-6 { + padding: 24px !important; + } + .pa-lg-7 { + padding: 28px !important; + } + .pa-lg-8 { + padding: 32px !important; + } + .pa-lg-9 { + padding: 36px !important; + } + .pa-lg-10 { + padding: 40px !important; + } + .pa-lg-11 { + padding: 44px !important; + } + .pa-lg-12 { + padding: 48px !important; + } + .pa-lg-13 { + padding: 52px !important; + } + .pa-lg-14 { + padding: 56px !important; + } + .pa-lg-15 { + padding: 60px !important; + } + .pa-lg-16 { + padding: 64px !important; + } + .px-lg-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-lg-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-lg-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-lg-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-lg-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-lg-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-lg-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-lg-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-lg-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-lg-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-lg-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-lg-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-lg-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-lg-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-lg-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-lg-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-lg-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-lg-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-lg-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-lg-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-lg-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-lg-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-lg-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-lg-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-lg-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-lg-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-lg-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-lg-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-lg-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-lg-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-lg-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-lg-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-lg-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-lg-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-lg-0 { + padding-top: 0px !important; + } + .pt-lg-1 { + padding-top: 4px !important; + } + .pt-lg-2 { + padding-top: 8px !important; + } + .pt-lg-3 { + padding-top: 12px !important; + } + .pt-lg-4 { + padding-top: 16px !important; + } + .pt-lg-5 { + padding-top: 20px !important; + } + .pt-lg-6 { + padding-top: 24px !important; + } + .pt-lg-7 { + padding-top: 28px !important; + } + .pt-lg-8 { + padding-top: 32px !important; + } + .pt-lg-9 { + padding-top: 36px !important; + } + .pt-lg-10 { + padding-top: 40px !important; + } + .pt-lg-11 { + padding-top: 44px !important; + } + .pt-lg-12 { + padding-top: 48px !important; + } + .pt-lg-13 { + padding-top: 52px !important; + } + .pt-lg-14 { + padding-top: 56px !important; + } + .pt-lg-15 { + padding-top: 60px !important; + } + .pt-lg-16 { + padding-top: 64px !important; + } + .pr-lg-0 { + padding-right: 0px !important; + } + .pr-lg-1 { + padding-right: 4px !important; + } + .pr-lg-2 { + padding-right: 8px !important; + } + .pr-lg-3 { + padding-right: 12px !important; + } + .pr-lg-4 { + padding-right: 16px !important; + } + .pr-lg-5 { + padding-right: 20px !important; + } + .pr-lg-6 { + padding-right: 24px !important; + } + .pr-lg-7 { + padding-right: 28px !important; + } + .pr-lg-8 { + padding-right: 32px !important; + } + .pr-lg-9 { + padding-right: 36px !important; + } + .pr-lg-10 { + padding-right: 40px !important; + } + .pr-lg-11 { + padding-right: 44px !important; + } + .pr-lg-12 { + padding-right: 48px !important; + } + .pr-lg-13 { + padding-right: 52px !important; + } + .pr-lg-14 { + padding-right: 56px !important; + } + .pr-lg-15 { + padding-right: 60px !important; + } + .pr-lg-16 { + padding-right: 64px !important; + } + .pb-lg-0 { + padding-bottom: 0px !important; + } + .pb-lg-1 { + padding-bottom: 4px !important; + } + .pb-lg-2 { + padding-bottom: 8px !important; + } + .pb-lg-3 { + padding-bottom: 12px !important; + } + .pb-lg-4 { + padding-bottom: 16px !important; + } + .pb-lg-5 { + padding-bottom: 20px !important; + } + .pb-lg-6 { + padding-bottom: 24px !important; + } + .pb-lg-7 { + padding-bottom: 28px !important; + } + .pb-lg-8 { + padding-bottom: 32px !important; + } + .pb-lg-9 { + padding-bottom: 36px !important; + } + .pb-lg-10 { + padding-bottom: 40px !important; + } + .pb-lg-11 { + padding-bottom: 44px !important; + } + .pb-lg-12 { + padding-bottom: 48px !important; + } + .pb-lg-13 { + padding-bottom: 52px !important; + } + .pb-lg-14 { + padding-bottom: 56px !important; + } + .pb-lg-15 { + padding-bottom: 60px !important; + } + .pb-lg-16 { + padding-bottom: 64px !important; + } + .pl-lg-0 { + padding-left: 0px !important; + } + .pl-lg-1 { + padding-left: 4px !important; + } + .pl-lg-2 { + padding-left: 8px !important; + } + .pl-lg-3 { + padding-left: 12px !important; + } + .pl-lg-4 { + padding-left: 16px !important; + } + .pl-lg-5 { + padding-left: 20px !important; + } + .pl-lg-6 { + padding-left: 24px !important; + } + .pl-lg-7 { + padding-left: 28px !important; + } + .pl-lg-8 { + padding-left: 32px !important; + } + .pl-lg-9 { + padding-left: 36px !important; + } + .pl-lg-10 { + padding-left: 40px !important; + } + .pl-lg-11 { + padding-left: 44px !important; + } + .pl-lg-12 { + padding-left: 48px !important; + } + .pl-lg-13 { + padding-left: 52px !important; + } + .pl-lg-14 { + padding-left: 56px !important; + } + .pl-lg-15 { + padding-left: 60px !important; + } + .pl-lg-16 { + padding-left: 64px !important; + } + .ps-lg-0 { + padding-inline-start: 0px !important; + } + .ps-lg-1 { + padding-inline-start: 4px !important; + } + .ps-lg-2 { + padding-inline-start: 8px !important; + } + .ps-lg-3 { + padding-inline-start: 12px !important; + } + .ps-lg-4 { + padding-inline-start: 16px !important; + } + .ps-lg-5 { + padding-inline-start: 20px !important; + } + .ps-lg-6 { + padding-inline-start: 24px !important; + } + .ps-lg-7 { + padding-inline-start: 28px !important; + } + .ps-lg-8 { + padding-inline-start: 32px !important; + } + .ps-lg-9 { + padding-inline-start: 36px !important; + } + .ps-lg-10 { + padding-inline-start: 40px !important; + } + .ps-lg-11 { + padding-inline-start: 44px !important; + } + .ps-lg-12 { + padding-inline-start: 48px !important; + } + .ps-lg-13 { + padding-inline-start: 52px !important; + } + .ps-lg-14 { + padding-inline-start: 56px !important; + } + .ps-lg-15 { + padding-inline-start: 60px !important; + } + .ps-lg-16 { + padding-inline-start: 64px !important; + } + .pe-lg-0 { + padding-inline-end: 0px !important; + } + .pe-lg-1 { + padding-inline-end: 4px !important; + } + .pe-lg-2 { + padding-inline-end: 8px !important; + } + .pe-lg-3 { + padding-inline-end: 12px !important; + } + .pe-lg-4 { + padding-inline-end: 16px !important; + } + .pe-lg-5 { + padding-inline-end: 20px !important; + } + .pe-lg-6 { + padding-inline-end: 24px !important; + } + .pe-lg-7 { + padding-inline-end: 28px !important; + } + .pe-lg-8 { + padding-inline-end: 32px !important; + } + .pe-lg-9 { + padding-inline-end: 36px !important; + } + .pe-lg-10 { + padding-inline-end: 40px !important; + } + .pe-lg-11 { + padding-inline-end: 44px !important; + } + .pe-lg-12 { + padding-inline-end: 48px !important; + } + .pe-lg-13 { + padding-inline-end: 52px !important; + } + .pe-lg-14 { + padding-inline-end: 56px !important; + } + .pe-lg-15 { + padding-inline-end: 60px !important; + } + .pe-lg-16 { + padding-inline-end: 64px !important; + } + .text-lg-left { + text-align: left !important; + } + .text-lg-right { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } + .text-lg-justify { + text-align: justify !important; + } + .text-lg-start { + text-align: start !important; + } + .text-lg-end { + text-align: end !important; + } + .text-lg-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-lg-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-lg-auto { + height: auto !important; + } + .h-lg-screen { + height: 100vh !important; + } + .h-lg-0 { + height: 0 !important; + } + .h-lg-25 { + height: 25% !important; + } + .h-lg-50 { + height: 50% !important; + } + .h-lg-75 { + height: 75% !important; + } + .h-lg-100 { + height: 100% !important; + } + .w-lg-auto { + width: auto !important; + } + .w-lg-0 { + width: 0 !important; + } + .w-lg-25 { + width: 25% !important; + } + .w-lg-33 { + width: 33% !important; + } + .w-lg-50 { + width: 50% !important; + } + .w-lg-66 { + width: 66% !important; + } + .w-lg-75 { + width: 75% !important; + } + .w-lg-100 { + width: 100% !important; + } +} +@media (min-width: 1920px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .float-xl-none { + float: none !important; + } + .float-xl-left { + float: left !important; + } + .float-xl-right { + float: right !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-1-1 { + flex: 1 1 auto !important; + } + .flex-xl-1-0 { + flex: 1 0 auto !important; + } + .flex-xl-0-1 { + flex: 0 1 auto !important; + } + .flex-xl-0-0 { + flex: 0 0 auto !important; + } + .flex-xl-1-1-100 { + flex: 1 1 100% !important; + } + .flex-xl-1-0-100 { + flex: 1 0 100% !important; + } + .flex-xl-0-1-100 { + flex: 0 1 100% !important; + } + .flex-xl-0-0-100 { + flex: 0 0 100% !important; + } + .flex-xl-1-1-0 { + flex: 1 1 0 !important; + } + .flex-xl-1-0-0 { + flex: 1 0 0 !important; + } + .flex-xl-0-1-0 { + flex: 0 1 0 !important; + } + .flex-xl-0-0-0 { + flex: 0 0 0 !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-xl-start { + justify-content: flex-start !important; + } + .justify-xl-end { + justify-content: flex-end !important; + } + .justify-xl-center { + justify-content: center !important; + } + .justify-xl-space-between { + justify-content: space-between !important; + } + .justify-xl-space-around { + justify-content: space-around !important; + } + .justify-xl-space-evenly { + justify-content: space-evenly !important; + } + .align-xl-start { + align-items: flex-start !important; + } + .align-xl-end { + align-items: flex-end !important; + } + .align-xl-center { + align-items: center !important; + } + .align-xl-baseline { + align-items: baseline !important; + } + .align-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-space-between { + align-content: space-between !important; + } + .align-content-xl-space-around { + align-content: space-around !important; + } + .align-content-xl-space-evenly { + align-content: space-evenly !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-6 { + order: 6 !important; + } + .order-xl-7 { + order: 7 !important; + } + .order-xl-8 { + order: 8 !important; + } + .order-xl-9 { + order: 9 !important; + } + .order-xl-10 { + order: 10 !important; + } + .order-xl-11 { + order: 11 !important; + } + .order-xl-12 { + order: 12 !important; + } + .order-xl-last { + order: 13 !important; + } + .ga-xl-0 { + gap: 0px !important; + } + .ga-xl-1 { + gap: 4px !important; + } + .ga-xl-2 { + gap: 8px !important; + } + .ga-xl-3 { + gap: 12px !important; + } + .ga-xl-4 { + gap: 16px !important; + } + .ga-xl-5 { + gap: 20px !important; + } + .ga-xl-6 { + gap: 24px !important; + } + .ga-xl-7 { + gap: 28px !important; + } + .ga-xl-8 { + gap: 32px !important; + } + .ga-xl-9 { + gap: 36px !important; + } + .ga-xl-10 { + gap: 40px !important; + } + .ga-xl-11 { + gap: 44px !important; + } + .ga-xl-12 { + gap: 48px !important; + } + .ga-xl-13 { + gap: 52px !important; + } + .ga-xl-14 { + gap: 56px !important; + } + .ga-xl-15 { + gap: 60px !important; + } + .ga-xl-16 { + gap: 64px !important; + } + .ga-xl-auto { + gap: auto !important; + } + .gr-xl-0 { + row-gap: 0px !important; + } + .gr-xl-1 { + row-gap: 4px !important; + } + .gr-xl-2 { + row-gap: 8px !important; + } + .gr-xl-3 { + row-gap: 12px !important; + } + .gr-xl-4 { + row-gap: 16px !important; + } + .gr-xl-5 { + row-gap: 20px !important; + } + .gr-xl-6 { + row-gap: 24px !important; + } + .gr-xl-7 { + row-gap: 28px !important; + } + .gr-xl-8 { + row-gap: 32px !important; + } + .gr-xl-9 { + row-gap: 36px !important; + } + .gr-xl-10 { + row-gap: 40px !important; + } + .gr-xl-11 { + row-gap: 44px !important; + } + .gr-xl-12 { + row-gap: 48px !important; + } + .gr-xl-13 { + row-gap: 52px !important; + } + .gr-xl-14 { + row-gap: 56px !important; + } + .gr-xl-15 { + row-gap: 60px !important; + } + .gr-xl-16 { + row-gap: 64px !important; + } + .gr-xl-auto { + row-gap: auto !important; + } + .gc-xl-0 { + column-gap: 0px !important; + } + .gc-xl-1 { + column-gap: 4px !important; + } + .gc-xl-2 { + column-gap: 8px !important; + } + .gc-xl-3 { + column-gap: 12px !important; + } + .gc-xl-4 { + column-gap: 16px !important; + } + .gc-xl-5 { + column-gap: 20px !important; + } + .gc-xl-6 { + column-gap: 24px !important; + } + .gc-xl-7 { + column-gap: 28px !important; + } + .gc-xl-8 { + column-gap: 32px !important; + } + .gc-xl-9 { + column-gap: 36px !important; + } + .gc-xl-10 { + column-gap: 40px !important; + } + .gc-xl-11 { + column-gap: 44px !important; + } + .gc-xl-12 { + column-gap: 48px !important; + } + .gc-xl-13 { + column-gap: 52px !important; + } + .gc-xl-14 { + column-gap: 56px !important; + } + .gc-xl-15 { + column-gap: 60px !important; + } + .gc-xl-16 { + column-gap: 64px !important; + } + .gc-xl-auto { + column-gap: auto !important; + } + .ma-xl-0 { + margin: 0px !important; + } + .ma-xl-1 { + margin: 4px !important; + } + .ma-xl-2 { + margin: 8px !important; + } + .ma-xl-3 { + margin: 12px !important; + } + .ma-xl-4 { + margin: 16px !important; + } + .ma-xl-5 { + margin: 20px !important; + } + .ma-xl-6 { + margin: 24px !important; + } + .ma-xl-7 { + margin: 28px !important; + } + .ma-xl-8 { + margin: 32px !important; + } + .ma-xl-9 { + margin: 36px !important; + } + .ma-xl-10 { + margin: 40px !important; + } + .ma-xl-11 { + margin: 44px !important; + } + .ma-xl-12 { + margin: 48px !important; + } + .ma-xl-13 { + margin: 52px !important; + } + .ma-xl-14 { + margin: 56px !important; + } + .ma-xl-15 { + margin: 60px !important; + } + .ma-xl-16 { + margin: 64px !important; + } + .ma-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-xl-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-xl-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-xl-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-xl-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-xl-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-xl-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-xl-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-xl-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-xl-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-xl-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-xl-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-xl-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-xl-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-xl-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-xl-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-xl-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-xl-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-xl-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-xl-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-xl-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-xl-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-xl-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-xl-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-xl-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-xl-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-xl-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-xl-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-xl-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-xl-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-xl-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-xl-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-xl-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0px !important; + } + .mt-xl-1 { + margin-top: 4px !important; + } + .mt-xl-2 { + margin-top: 8px !important; + } + .mt-xl-3 { + margin-top: 12px !important; + } + .mt-xl-4 { + margin-top: 16px !important; + } + .mt-xl-5 { + margin-top: 20px !important; + } + .mt-xl-6 { + margin-top: 24px !important; + } + .mt-xl-7 { + margin-top: 28px !important; + } + .mt-xl-8 { + margin-top: 32px !important; + } + .mt-xl-9 { + margin-top: 36px !important; + } + .mt-xl-10 { + margin-top: 40px !important; + } + .mt-xl-11 { + margin-top: 44px !important; + } + .mt-xl-12 { + margin-top: 48px !important; + } + .mt-xl-13 { + margin-top: 52px !important; + } + .mt-xl-14 { + margin-top: 56px !important; + } + .mt-xl-15 { + margin-top: 60px !important; + } + .mt-xl-16 { + margin-top: 64px !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .mr-xl-0 { + margin-right: 0px !important; + } + .mr-xl-1 { + margin-right: 4px !important; + } + .mr-xl-2 { + margin-right: 8px !important; + } + .mr-xl-3 { + margin-right: 12px !important; + } + .mr-xl-4 { + margin-right: 16px !important; + } + .mr-xl-5 { + margin-right: 20px !important; + } + .mr-xl-6 { + margin-right: 24px !important; + } + .mr-xl-7 { + margin-right: 28px !important; + } + .mr-xl-8 { + margin-right: 32px !important; + } + .mr-xl-9 { + margin-right: 36px !important; + } + .mr-xl-10 { + margin-right: 40px !important; + } + .mr-xl-11 { + margin-right: 44px !important; + } + .mr-xl-12 { + margin-right: 48px !important; + } + .mr-xl-13 { + margin-right: 52px !important; + } + .mr-xl-14 { + margin-right: 56px !important; + } + .mr-xl-15 { + margin-right: 60px !important; + } + .mr-xl-16 { + margin-right: 64px !important; + } + .mr-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0px !important; + } + .mb-xl-1 { + margin-bottom: 4px !important; + } + .mb-xl-2 { + margin-bottom: 8px !important; + } + .mb-xl-3 { + margin-bottom: 12px !important; + } + .mb-xl-4 { + margin-bottom: 16px !important; + } + .mb-xl-5 { + margin-bottom: 20px !important; + } + .mb-xl-6 { + margin-bottom: 24px !important; + } + .mb-xl-7 { + margin-bottom: 28px !important; + } + .mb-xl-8 { + margin-bottom: 32px !important; + } + .mb-xl-9 { + margin-bottom: 36px !important; + } + .mb-xl-10 { + margin-bottom: 40px !important; + } + .mb-xl-11 { + margin-bottom: 44px !important; + } + .mb-xl-12 { + margin-bottom: 48px !important; + } + .mb-xl-13 { + margin-bottom: 52px !important; + } + .mb-xl-14 { + margin-bottom: 56px !important; + } + .mb-xl-15 { + margin-bottom: 60px !important; + } + .mb-xl-16 { + margin-bottom: 64px !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-0 { + margin-left: 0px !important; + } + .ml-xl-1 { + margin-left: 4px !important; + } + .ml-xl-2 { + margin-left: 8px !important; + } + .ml-xl-3 { + margin-left: 12px !important; + } + .ml-xl-4 { + margin-left: 16px !important; + } + .ml-xl-5 { + margin-left: 20px !important; + } + .ml-xl-6 { + margin-left: 24px !important; + } + .ml-xl-7 { + margin-left: 28px !important; + } + .ml-xl-8 { + margin-left: 32px !important; + } + .ml-xl-9 { + margin-left: 36px !important; + } + .ml-xl-10 { + margin-left: 40px !important; + } + .ml-xl-11 { + margin-left: 44px !important; + } + .ml-xl-12 { + margin-left: 48px !important; + } + .ml-xl-13 { + margin-left: 52px !important; + } + .ml-xl-14 { + margin-left: 56px !important; + } + .ml-xl-15 { + margin-left: 60px !important; + } + .ml-xl-16 { + margin-left: 64px !important; + } + .ml-xl-auto { + margin-left: auto !important; + } + .ms-xl-0 { + margin-inline-start: 0px !important; + } + .ms-xl-1 { + margin-inline-start: 4px !important; + } + .ms-xl-2 { + margin-inline-start: 8px !important; + } + .ms-xl-3 { + margin-inline-start: 12px !important; + } + .ms-xl-4 { + margin-inline-start: 16px !important; + } + .ms-xl-5 { + margin-inline-start: 20px !important; + } + .ms-xl-6 { + margin-inline-start: 24px !important; + } + .ms-xl-7 { + margin-inline-start: 28px !important; + } + .ms-xl-8 { + margin-inline-start: 32px !important; + } + .ms-xl-9 { + margin-inline-start: 36px !important; + } + .ms-xl-10 { + margin-inline-start: 40px !important; + } + .ms-xl-11 { + margin-inline-start: 44px !important; + } + .ms-xl-12 { + margin-inline-start: 48px !important; + } + .ms-xl-13 { + margin-inline-start: 52px !important; + } + .ms-xl-14 { + margin-inline-start: 56px !important; + } + .ms-xl-15 { + margin-inline-start: 60px !important; + } + .ms-xl-16 { + margin-inline-start: 64px !important; + } + .ms-xl-auto { + margin-inline-start: auto !important; + } + .me-xl-0 { + margin-inline-end: 0px !important; + } + .me-xl-1 { + margin-inline-end: 4px !important; + } + .me-xl-2 { + margin-inline-end: 8px !important; + } + .me-xl-3 { + margin-inline-end: 12px !important; + } + .me-xl-4 { + margin-inline-end: 16px !important; + } + .me-xl-5 { + margin-inline-end: 20px !important; + } + .me-xl-6 { + margin-inline-end: 24px !important; + } + .me-xl-7 { + margin-inline-end: 28px !important; + } + .me-xl-8 { + margin-inline-end: 32px !important; + } + .me-xl-9 { + margin-inline-end: 36px !important; + } + .me-xl-10 { + margin-inline-end: 40px !important; + } + .me-xl-11 { + margin-inline-end: 44px !important; + } + .me-xl-12 { + margin-inline-end: 48px !important; + } + .me-xl-13 { + margin-inline-end: 52px !important; + } + .me-xl-14 { + margin-inline-end: 56px !important; + } + .me-xl-15 { + margin-inline-end: 60px !important; + } + .me-xl-16 { + margin-inline-end: 64px !important; + } + .me-xl-auto { + margin-inline-end: auto !important; + } + .ma-xl-n1 { + margin: -4px !important; + } + .ma-xl-n2 { + margin: -8px !important; + } + .ma-xl-n3 { + margin: -12px !important; + } + .ma-xl-n4 { + margin: -16px !important; + } + .ma-xl-n5 { + margin: -20px !important; + } + .ma-xl-n6 { + margin: -24px !important; + } + .ma-xl-n7 { + margin: -28px !important; + } + .ma-xl-n8 { + margin: -32px !important; + } + .ma-xl-n9 { + margin: -36px !important; + } + .ma-xl-n10 { + margin: -40px !important; + } + .ma-xl-n11 { + margin: -44px !important; + } + .ma-xl-n12 { + margin: -48px !important; + } + .ma-xl-n13 { + margin: -52px !important; + } + .ma-xl-n14 { + margin: -56px !important; + } + .ma-xl-n15 { + margin: -60px !important; + } + .ma-xl-n16 { + margin: -64px !important; + } + .mx-xl-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-xl-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-xl-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-xl-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-xl-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-xl-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-xl-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-xl-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-xl-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-xl-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-xl-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-xl-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-xl-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-xl-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-xl-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-xl-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-xl-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-xl-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-xl-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-xl-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-xl-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-xl-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-xl-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-xl-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-xl-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-xl-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-xl-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-xl-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-xl-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-xl-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-xl-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-xl-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-xl-n1 { + margin-top: -4px !important; + } + .mt-xl-n2 { + margin-top: -8px !important; + } + .mt-xl-n3 { + margin-top: -12px !important; + } + .mt-xl-n4 { + margin-top: -16px !important; + } + .mt-xl-n5 { + margin-top: -20px !important; + } + .mt-xl-n6 { + margin-top: -24px !important; + } + .mt-xl-n7 { + margin-top: -28px !important; + } + .mt-xl-n8 { + margin-top: -32px !important; + } + .mt-xl-n9 { + margin-top: -36px !important; + } + .mt-xl-n10 { + margin-top: -40px !important; + } + .mt-xl-n11 { + margin-top: -44px !important; + } + .mt-xl-n12 { + margin-top: -48px !important; + } + .mt-xl-n13 { + margin-top: -52px !important; + } + .mt-xl-n14 { + margin-top: -56px !important; + } + .mt-xl-n15 { + margin-top: -60px !important; + } + .mt-xl-n16 { + margin-top: -64px !important; + } + .mr-xl-n1 { + margin-right: -4px !important; + } + .mr-xl-n2 { + margin-right: -8px !important; + } + .mr-xl-n3 { + margin-right: -12px !important; + } + .mr-xl-n4 { + margin-right: -16px !important; + } + .mr-xl-n5 { + margin-right: -20px !important; + } + .mr-xl-n6 { + margin-right: -24px !important; + } + .mr-xl-n7 { + margin-right: -28px !important; + } + .mr-xl-n8 { + margin-right: -32px !important; + } + .mr-xl-n9 { + margin-right: -36px !important; + } + .mr-xl-n10 { + margin-right: -40px !important; + } + .mr-xl-n11 { + margin-right: -44px !important; + } + .mr-xl-n12 { + margin-right: -48px !important; + } + .mr-xl-n13 { + margin-right: -52px !important; + } + .mr-xl-n14 { + margin-right: -56px !important; + } + .mr-xl-n15 { + margin-right: -60px !important; + } + .mr-xl-n16 { + margin-right: -64px !important; + } + .mb-xl-n1 { + margin-bottom: -4px !important; + } + .mb-xl-n2 { + margin-bottom: -8px !important; + } + .mb-xl-n3 { + margin-bottom: -12px !important; + } + .mb-xl-n4 { + margin-bottom: -16px !important; + } + .mb-xl-n5 { + margin-bottom: -20px !important; + } + .mb-xl-n6 { + margin-bottom: -24px !important; + } + .mb-xl-n7 { + margin-bottom: -28px !important; + } + .mb-xl-n8 { + margin-bottom: -32px !important; + } + .mb-xl-n9 { + margin-bottom: -36px !important; + } + .mb-xl-n10 { + margin-bottom: -40px !important; + } + .mb-xl-n11 { + margin-bottom: -44px !important; + } + .mb-xl-n12 { + margin-bottom: -48px !important; + } + .mb-xl-n13 { + margin-bottom: -52px !important; + } + .mb-xl-n14 { + margin-bottom: -56px !important; + } + .mb-xl-n15 { + margin-bottom: -60px !important; + } + .mb-xl-n16 { + margin-bottom: -64px !important; + } + .ml-xl-n1 { + margin-left: -4px !important; + } + .ml-xl-n2 { + margin-left: -8px !important; + } + .ml-xl-n3 { + margin-left: -12px !important; + } + .ml-xl-n4 { + margin-left: -16px !important; + } + .ml-xl-n5 { + margin-left: -20px !important; + } + .ml-xl-n6 { + margin-left: -24px !important; + } + .ml-xl-n7 { + margin-left: -28px !important; + } + .ml-xl-n8 { + margin-left: -32px !important; + } + .ml-xl-n9 { + margin-left: -36px !important; + } + .ml-xl-n10 { + margin-left: -40px !important; + } + .ml-xl-n11 { + margin-left: -44px !important; + } + .ml-xl-n12 { + margin-left: -48px !important; + } + .ml-xl-n13 { + margin-left: -52px !important; + } + .ml-xl-n14 { + margin-left: -56px !important; + } + .ml-xl-n15 { + margin-left: -60px !important; + } + .ml-xl-n16 { + margin-left: -64px !important; + } + .ms-xl-n1 { + margin-inline-start: -4px !important; + } + .ms-xl-n2 { + margin-inline-start: -8px !important; + } + .ms-xl-n3 { + margin-inline-start: -12px !important; + } + .ms-xl-n4 { + margin-inline-start: -16px !important; + } + .ms-xl-n5 { + margin-inline-start: -20px !important; + } + .ms-xl-n6 { + margin-inline-start: -24px !important; + } + .ms-xl-n7 { + margin-inline-start: -28px !important; + } + .ms-xl-n8 { + margin-inline-start: -32px !important; + } + .ms-xl-n9 { + margin-inline-start: -36px !important; + } + .ms-xl-n10 { + margin-inline-start: -40px !important; + } + .ms-xl-n11 { + margin-inline-start: -44px !important; + } + .ms-xl-n12 { + margin-inline-start: -48px !important; + } + .ms-xl-n13 { + margin-inline-start: -52px !important; + } + .ms-xl-n14 { + margin-inline-start: -56px !important; + } + .ms-xl-n15 { + margin-inline-start: -60px !important; + } + .ms-xl-n16 { + margin-inline-start: -64px !important; + } + .me-xl-n1 { + margin-inline-end: -4px !important; + } + .me-xl-n2 { + margin-inline-end: -8px !important; + } + .me-xl-n3 { + margin-inline-end: -12px !important; + } + .me-xl-n4 { + margin-inline-end: -16px !important; + } + .me-xl-n5 { + margin-inline-end: -20px !important; + } + .me-xl-n6 { + margin-inline-end: -24px !important; + } + .me-xl-n7 { + margin-inline-end: -28px !important; + } + .me-xl-n8 { + margin-inline-end: -32px !important; + } + .me-xl-n9 { + margin-inline-end: -36px !important; + } + .me-xl-n10 { + margin-inline-end: -40px !important; + } + .me-xl-n11 { + margin-inline-end: -44px !important; + } + .me-xl-n12 { + margin-inline-end: -48px !important; + } + .me-xl-n13 { + margin-inline-end: -52px !important; + } + .me-xl-n14 { + margin-inline-end: -56px !important; + } + .me-xl-n15 { + margin-inline-end: -60px !important; + } + .me-xl-n16 { + margin-inline-end: -64px !important; + } + .pa-xl-0 { + padding: 0px !important; + } + .pa-xl-1 { + padding: 4px !important; + } + .pa-xl-2 { + padding: 8px !important; + } + .pa-xl-3 { + padding: 12px !important; + } + .pa-xl-4 { + padding: 16px !important; + } + .pa-xl-5 { + padding: 20px !important; + } + .pa-xl-6 { + padding: 24px !important; + } + .pa-xl-7 { + padding: 28px !important; + } + .pa-xl-8 { + padding: 32px !important; + } + .pa-xl-9 { + padding: 36px !important; + } + .pa-xl-10 { + padding: 40px !important; + } + .pa-xl-11 { + padding: 44px !important; + } + .pa-xl-12 { + padding: 48px !important; + } + .pa-xl-13 { + padding: 52px !important; + } + .pa-xl-14 { + padding: 56px !important; + } + .pa-xl-15 { + padding: 60px !important; + } + .pa-xl-16 { + padding: 64px !important; + } + .px-xl-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-xl-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-xl-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-xl-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-xl-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-xl-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-xl-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-xl-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-xl-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-xl-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-xl-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-xl-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-xl-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-xl-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-xl-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-xl-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-xl-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-xl-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-xl-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-xl-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-xl-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-xl-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-xl-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-xl-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-xl-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-xl-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-xl-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-xl-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-xl-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-xl-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-xl-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-xl-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-xl-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-xl-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-xl-0 { + padding-top: 0px !important; + } + .pt-xl-1 { + padding-top: 4px !important; + } + .pt-xl-2 { + padding-top: 8px !important; + } + .pt-xl-3 { + padding-top: 12px !important; + } + .pt-xl-4 { + padding-top: 16px !important; + } + .pt-xl-5 { + padding-top: 20px !important; + } + .pt-xl-6 { + padding-top: 24px !important; + } + .pt-xl-7 { + padding-top: 28px !important; + } + .pt-xl-8 { + padding-top: 32px !important; + } + .pt-xl-9 { + padding-top: 36px !important; + } + .pt-xl-10 { + padding-top: 40px !important; + } + .pt-xl-11 { + padding-top: 44px !important; + } + .pt-xl-12 { + padding-top: 48px !important; + } + .pt-xl-13 { + padding-top: 52px !important; + } + .pt-xl-14 { + padding-top: 56px !important; + } + .pt-xl-15 { + padding-top: 60px !important; + } + .pt-xl-16 { + padding-top: 64px !important; + } + .pr-xl-0 { + padding-right: 0px !important; + } + .pr-xl-1 { + padding-right: 4px !important; + } + .pr-xl-2 { + padding-right: 8px !important; + } + .pr-xl-3 { + padding-right: 12px !important; + } + .pr-xl-4 { + padding-right: 16px !important; + } + .pr-xl-5 { + padding-right: 20px !important; + } + .pr-xl-6 { + padding-right: 24px !important; + } + .pr-xl-7 { + padding-right: 28px !important; + } + .pr-xl-8 { + padding-right: 32px !important; + } + .pr-xl-9 { + padding-right: 36px !important; + } + .pr-xl-10 { + padding-right: 40px !important; + } + .pr-xl-11 { + padding-right: 44px !important; + } + .pr-xl-12 { + padding-right: 48px !important; + } + .pr-xl-13 { + padding-right: 52px !important; + } + .pr-xl-14 { + padding-right: 56px !important; + } + .pr-xl-15 { + padding-right: 60px !important; + } + .pr-xl-16 { + padding-right: 64px !important; + } + .pb-xl-0 { + padding-bottom: 0px !important; + } + .pb-xl-1 { + padding-bottom: 4px !important; + } + .pb-xl-2 { + padding-bottom: 8px !important; + } + .pb-xl-3 { + padding-bottom: 12px !important; + } + .pb-xl-4 { + padding-bottom: 16px !important; + } + .pb-xl-5 { + padding-bottom: 20px !important; + } + .pb-xl-6 { + padding-bottom: 24px !important; + } + .pb-xl-7 { + padding-bottom: 28px !important; + } + .pb-xl-8 { + padding-bottom: 32px !important; + } + .pb-xl-9 { + padding-bottom: 36px !important; + } + .pb-xl-10 { + padding-bottom: 40px !important; + } + .pb-xl-11 { + padding-bottom: 44px !important; + } + .pb-xl-12 { + padding-bottom: 48px !important; + } + .pb-xl-13 { + padding-bottom: 52px !important; + } + .pb-xl-14 { + padding-bottom: 56px !important; + } + .pb-xl-15 { + padding-bottom: 60px !important; + } + .pb-xl-16 { + padding-bottom: 64px !important; + } + .pl-xl-0 { + padding-left: 0px !important; + } + .pl-xl-1 { + padding-left: 4px !important; + } + .pl-xl-2 { + padding-left: 8px !important; + } + .pl-xl-3 { + padding-left: 12px !important; + } + .pl-xl-4 { + padding-left: 16px !important; + } + .pl-xl-5 { + padding-left: 20px !important; + } + .pl-xl-6 { + padding-left: 24px !important; + } + .pl-xl-7 { + padding-left: 28px !important; + } + .pl-xl-8 { + padding-left: 32px !important; + } + .pl-xl-9 { + padding-left: 36px !important; + } + .pl-xl-10 { + padding-left: 40px !important; + } + .pl-xl-11 { + padding-left: 44px !important; + } + .pl-xl-12 { + padding-left: 48px !important; + } + .pl-xl-13 { + padding-left: 52px !important; + } + .pl-xl-14 { + padding-left: 56px !important; + } + .pl-xl-15 { + padding-left: 60px !important; + } + .pl-xl-16 { + padding-left: 64px !important; + } + .ps-xl-0 { + padding-inline-start: 0px !important; + } + .ps-xl-1 { + padding-inline-start: 4px !important; + } + .ps-xl-2 { + padding-inline-start: 8px !important; + } + .ps-xl-3 { + padding-inline-start: 12px !important; + } + .ps-xl-4 { + padding-inline-start: 16px !important; + } + .ps-xl-5 { + padding-inline-start: 20px !important; + } + .ps-xl-6 { + padding-inline-start: 24px !important; + } + .ps-xl-7 { + padding-inline-start: 28px !important; + } + .ps-xl-8 { + padding-inline-start: 32px !important; + } + .ps-xl-9 { + padding-inline-start: 36px !important; + } + .ps-xl-10 { + padding-inline-start: 40px !important; + } + .ps-xl-11 { + padding-inline-start: 44px !important; + } + .ps-xl-12 { + padding-inline-start: 48px !important; + } + .ps-xl-13 { + padding-inline-start: 52px !important; + } + .ps-xl-14 { + padding-inline-start: 56px !important; + } + .ps-xl-15 { + padding-inline-start: 60px !important; + } + .ps-xl-16 { + padding-inline-start: 64px !important; + } + .pe-xl-0 { + padding-inline-end: 0px !important; + } + .pe-xl-1 { + padding-inline-end: 4px !important; + } + .pe-xl-2 { + padding-inline-end: 8px !important; + } + .pe-xl-3 { + padding-inline-end: 12px !important; + } + .pe-xl-4 { + padding-inline-end: 16px !important; + } + .pe-xl-5 { + padding-inline-end: 20px !important; + } + .pe-xl-6 { + padding-inline-end: 24px !important; + } + .pe-xl-7 { + padding-inline-end: 28px !important; + } + .pe-xl-8 { + padding-inline-end: 32px !important; + } + .pe-xl-9 { + padding-inline-end: 36px !important; + } + .pe-xl-10 { + padding-inline-end: 40px !important; + } + .pe-xl-11 { + padding-inline-end: 44px !important; + } + .pe-xl-12 { + padding-inline-end: 48px !important; + } + .pe-xl-13 { + padding-inline-end: 52px !important; + } + .pe-xl-14 { + padding-inline-end: 56px !important; + } + .pe-xl-15 { + padding-inline-end: 60px !important; + } + .pe-xl-16 { + padding-inline-end: 64px !important; + } + .text-xl-left { + text-align: left !important; + } + .text-xl-right { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } + .text-xl-justify { + text-align: justify !important; + } + .text-xl-start { + text-align: start !important; + } + .text-xl-end { + text-align: end !important; + } + .text-xl-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-xl-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-xl-auto { + height: auto !important; + } + .h-xl-screen { + height: 100vh !important; + } + .h-xl-0 { + height: 0 !important; + } + .h-xl-25 { + height: 25% !important; + } + .h-xl-50 { + height: 50% !important; + } + .h-xl-75 { + height: 75% !important; + } + .h-xl-100 { + height: 100% !important; + } + .w-xl-auto { + width: auto !important; + } + .w-xl-0 { + width: 0 !important; + } + .w-xl-25 { + width: 25% !important; + } + .w-xl-33 { + width: 33% !important; + } + .w-xl-50 { + width: 50% !important; + } + .w-xl-66 { + width: 66% !important; + } + .w-xl-75 { + width: 75% !important; + } + .w-xl-100 { + width: 100% !important; + } +} +@media (min-width: 2560px) { + .d-xxl-none { + display: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .float-xxl-none { + float: none !important; + } + .float-xxl-left { + float: left !important; + } + .float-xxl-right { + float: right !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-1-1 { + flex: 1 1 auto !important; + } + .flex-xxl-1-0 { + flex: 1 0 auto !important; + } + .flex-xxl-0-1 { + flex: 0 1 auto !important; + } + .flex-xxl-0-0 { + flex: 0 0 auto !important; + } + .flex-xxl-1-1-100 { + flex: 1 1 100% !important; + } + .flex-xxl-1-0-100 { + flex: 1 0 100% !important; + } + .flex-xxl-0-1-100 { + flex: 0 1 100% !important; + } + .flex-xxl-0-0-100 { + flex: 0 0 100% !important; + } + .flex-xxl-1-1-0 { + flex: 1 1 0 !important; + } + .flex-xxl-1-0-0 { + flex: 1 0 0 !important; + } + .flex-xxl-0-1-0 { + flex: 0 1 0 !important; + } + .flex-xxl-0-0-0 { + flex: 0 0 0 !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-xxl-start { + justify-content: flex-start !important; + } + .justify-xxl-end { + justify-content: flex-end !important; + } + .justify-xxl-center { + justify-content: center !important; + } + .justify-xxl-space-between { + justify-content: space-between !important; + } + .justify-xxl-space-around { + justify-content: space-around !important; + } + .justify-xxl-space-evenly { + justify-content: space-evenly !important; + } + .align-xxl-start { + align-items: flex-start !important; + } + .align-xxl-end { + align-items: flex-end !important; + } + .align-xxl-center { + align-items: center !important; + } + .align-xxl-baseline { + align-items: baseline !important; + } + .align-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-space-between { + align-content: space-between !important; + } + .align-content-xxl-space-around { + align-content: space-around !important; + } + .align-content-xxl-space-evenly { + align-content: space-evenly !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-6 { + order: 6 !important; + } + .order-xxl-7 { + order: 7 !important; + } + .order-xxl-8 { + order: 8 !important; + } + .order-xxl-9 { + order: 9 !important; + } + .order-xxl-10 { + order: 10 !important; + } + .order-xxl-11 { + order: 11 !important; + } + .order-xxl-12 { + order: 12 !important; + } + .order-xxl-last { + order: 13 !important; + } + .ga-xxl-0 { + gap: 0px !important; + } + .ga-xxl-1 { + gap: 4px !important; + } + .ga-xxl-2 { + gap: 8px !important; + } + .ga-xxl-3 { + gap: 12px !important; + } + .ga-xxl-4 { + gap: 16px !important; + } + .ga-xxl-5 { + gap: 20px !important; + } + .ga-xxl-6 { + gap: 24px !important; + } + .ga-xxl-7 { + gap: 28px !important; + } + .ga-xxl-8 { + gap: 32px !important; + } + .ga-xxl-9 { + gap: 36px !important; + } + .ga-xxl-10 { + gap: 40px !important; + } + .ga-xxl-11 { + gap: 44px !important; + } + .ga-xxl-12 { + gap: 48px !important; + } + .ga-xxl-13 { + gap: 52px !important; + } + .ga-xxl-14 { + gap: 56px !important; + } + .ga-xxl-15 { + gap: 60px !important; + } + .ga-xxl-16 { + gap: 64px !important; + } + .ga-xxl-auto { + gap: auto !important; + } + .gr-xxl-0 { + row-gap: 0px !important; + } + .gr-xxl-1 { + row-gap: 4px !important; + } + .gr-xxl-2 { + row-gap: 8px !important; + } + .gr-xxl-3 { + row-gap: 12px !important; + } + .gr-xxl-4 { + row-gap: 16px !important; + } + .gr-xxl-5 { + row-gap: 20px !important; + } + .gr-xxl-6 { + row-gap: 24px !important; + } + .gr-xxl-7 { + row-gap: 28px !important; + } + .gr-xxl-8 { + row-gap: 32px !important; + } + .gr-xxl-9 { + row-gap: 36px !important; + } + .gr-xxl-10 { + row-gap: 40px !important; + } + .gr-xxl-11 { + row-gap: 44px !important; + } + .gr-xxl-12 { + row-gap: 48px !important; + } + .gr-xxl-13 { + row-gap: 52px !important; + } + .gr-xxl-14 { + row-gap: 56px !important; + } + .gr-xxl-15 { + row-gap: 60px !important; + } + .gr-xxl-16 { + row-gap: 64px !important; + } + .gr-xxl-auto { + row-gap: auto !important; + } + .gc-xxl-0 { + column-gap: 0px !important; + } + .gc-xxl-1 { + column-gap: 4px !important; + } + .gc-xxl-2 { + column-gap: 8px !important; + } + .gc-xxl-3 { + column-gap: 12px !important; + } + .gc-xxl-4 { + column-gap: 16px !important; + } + .gc-xxl-5 { + column-gap: 20px !important; + } + .gc-xxl-6 { + column-gap: 24px !important; + } + .gc-xxl-7 { + column-gap: 28px !important; + } + .gc-xxl-8 { + column-gap: 32px !important; + } + .gc-xxl-9 { + column-gap: 36px !important; + } + .gc-xxl-10 { + column-gap: 40px !important; + } + .gc-xxl-11 { + column-gap: 44px !important; + } + .gc-xxl-12 { + column-gap: 48px !important; + } + .gc-xxl-13 { + column-gap: 52px !important; + } + .gc-xxl-14 { + column-gap: 56px !important; + } + .gc-xxl-15 { + column-gap: 60px !important; + } + .gc-xxl-16 { + column-gap: 64px !important; + } + .gc-xxl-auto { + column-gap: auto !important; + } + .ma-xxl-0 { + margin: 0px !important; + } + .ma-xxl-1 { + margin: 4px !important; + } + .ma-xxl-2 { + margin: 8px !important; + } + .ma-xxl-3 { + margin: 12px !important; + } + .ma-xxl-4 { + margin: 16px !important; + } + .ma-xxl-5 { + margin: 20px !important; + } + .ma-xxl-6 { + margin: 24px !important; + } + .ma-xxl-7 { + margin: 28px !important; + } + .ma-xxl-8 { + margin: 32px !important; + } + .ma-xxl-9 { + margin: 36px !important; + } + .ma-xxl-10 { + margin: 40px !important; + } + .ma-xxl-11 { + margin: 44px !important; + } + .ma-xxl-12 { + margin: 48px !important; + } + .ma-xxl-13 { + margin: 52px !important; + } + .ma-xxl-14 { + margin: 56px !important; + } + .ma-xxl-15 { + margin: 60px !important; + } + .ma-xxl-16 { + margin: 64px !important; + } + .ma-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-xxl-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-xxl-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-xxl-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-xxl-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-xxl-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-xxl-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-xxl-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-xxl-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-xxl-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-xxl-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-xxl-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-xxl-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-xxl-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-xxl-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-xxl-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-xxl-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-xxl-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-xxl-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-xxl-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-xxl-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-xxl-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-xxl-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-xxl-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-xxl-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-xxl-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-xxl-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-xxl-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-xxl-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-xxl-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-xxl-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-xxl-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-xxl-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0px !important; + } + .mt-xxl-1 { + margin-top: 4px !important; + } + .mt-xxl-2 { + margin-top: 8px !important; + } + .mt-xxl-3 { + margin-top: 12px !important; + } + .mt-xxl-4 { + margin-top: 16px !important; + } + .mt-xxl-5 { + margin-top: 20px !important; + } + .mt-xxl-6 { + margin-top: 24px !important; + } + .mt-xxl-7 { + margin-top: 28px !important; + } + .mt-xxl-8 { + margin-top: 32px !important; + } + .mt-xxl-9 { + margin-top: 36px !important; + } + .mt-xxl-10 { + margin-top: 40px !important; + } + .mt-xxl-11 { + margin-top: 44px !important; + } + .mt-xxl-12 { + margin-top: 48px !important; + } + .mt-xxl-13 { + margin-top: 52px !important; + } + .mt-xxl-14 { + margin-top: 56px !important; + } + .mt-xxl-15 { + margin-top: 60px !important; + } + .mt-xxl-16 { + margin-top: 64px !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .mr-xxl-0 { + margin-right: 0px !important; + } + .mr-xxl-1 { + margin-right: 4px !important; + } + .mr-xxl-2 { + margin-right: 8px !important; + } + .mr-xxl-3 { + margin-right: 12px !important; + } + .mr-xxl-4 { + margin-right: 16px !important; + } + .mr-xxl-5 { + margin-right: 20px !important; + } + .mr-xxl-6 { + margin-right: 24px !important; + } + .mr-xxl-7 { + margin-right: 28px !important; + } + .mr-xxl-8 { + margin-right: 32px !important; + } + .mr-xxl-9 { + margin-right: 36px !important; + } + .mr-xxl-10 { + margin-right: 40px !important; + } + .mr-xxl-11 { + margin-right: 44px !important; + } + .mr-xxl-12 { + margin-right: 48px !important; + } + .mr-xxl-13 { + margin-right: 52px !important; + } + .mr-xxl-14 { + margin-right: 56px !important; + } + .mr-xxl-15 { + margin-right: 60px !important; + } + .mr-xxl-16 { + margin-right: 64px !important; + } + .mr-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0px !important; + } + .mb-xxl-1 { + margin-bottom: 4px !important; + } + .mb-xxl-2 { + margin-bottom: 8px !important; + } + .mb-xxl-3 { + margin-bottom: 12px !important; + } + .mb-xxl-4 { + margin-bottom: 16px !important; + } + .mb-xxl-5 { + margin-bottom: 20px !important; + } + .mb-xxl-6 { + margin-bottom: 24px !important; + } + .mb-xxl-7 { + margin-bottom: 28px !important; + } + .mb-xxl-8 { + margin-bottom: 32px !important; + } + .mb-xxl-9 { + margin-bottom: 36px !important; + } + .mb-xxl-10 { + margin-bottom: 40px !important; + } + .mb-xxl-11 { + margin-bottom: 44px !important; + } + .mb-xxl-12 { + margin-bottom: 48px !important; + } + .mb-xxl-13 { + margin-bottom: 52px !important; + } + .mb-xxl-14 { + margin-bottom: 56px !important; + } + .mb-xxl-15 { + margin-bottom: 60px !important; + } + .mb-xxl-16 { + margin-bottom: 64px !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ml-xxl-0 { + margin-left: 0px !important; + } + .ml-xxl-1 { + margin-left: 4px !important; + } + .ml-xxl-2 { + margin-left: 8px !important; + } + .ml-xxl-3 { + margin-left: 12px !important; + } + .ml-xxl-4 { + margin-left: 16px !important; + } + .ml-xxl-5 { + margin-left: 20px !important; + } + .ml-xxl-6 { + margin-left: 24px !important; + } + .ml-xxl-7 { + margin-left: 28px !important; + } + .ml-xxl-8 { + margin-left: 32px !important; + } + .ml-xxl-9 { + margin-left: 36px !important; + } + .ml-xxl-10 { + margin-left: 40px !important; + } + .ml-xxl-11 { + margin-left: 44px !important; + } + .ml-xxl-12 { + margin-left: 48px !important; + } + .ml-xxl-13 { + margin-left: 52px !important; + } + .ml-xxl-14 { + margin-left: 56px !important; + } + .ml-xxl-15 { + margin-left: 60px !important; + } + .ml-xxl-16 { + margin-left: 64px !important; + } + .ml-xxl-auto { + margin-left: auto !important; + } + .ms-xxl-0 { + margin-inline-start: 0px !important; + } + .ms-xxl-1 { + margin-inline-start: 4px !important; + } + .ms-xxl-2 { + margin-inline-start: 8px !important; + } + .ms-xxl-3 { + margin-inline-start: 12px !important; + } + .ms-xxl-4 { + margin-inline-start: 16px !important; + } + .ms-xxl-5 { + margin-inline-start: 20px !important; + } + .ms-xxl-6 { + margin-inline-start: 24px !important; + } + .ms-xxl-7 { + margin-inline-start: 28px !important; + } + .ms-xxl-8 { + margin-inline-start: 32px !important; + } + .ms-xxl-9 { + margin-inline-start: 36px !important; + } + .ms-xxl-10 { + margin-inline-start: 40px !important; + } + .ms-xxl-11 { + margin-inline-start: 44px !important; + } + .ms-xxl-12 { + margin-inline-start: 48px !important; + } + .ms-xxl-13 { + margin-inline-start: 52px !important; + } + .ms-xxl-14 { + margin-inline-start: 56px !important; + } + .ms-xxl-15 { + margin-inline-start: 60px !important; + } + .ms-xxl-16 { + margin-inline-start: 64px !important; + } + .ms-xxl-auto { + margin-inline-start: auto !important; + } + .me-xxl-0 { + margin-inline-end: 0px !important; + } + .me-xxl-1 { + margin-inline-end: 4px !important; + } + .me-xxl-2 { + margin-inline-end: 8px !important; + } + .me-xxl-3 { + margin-inline-end: 12px !important; + } + .me-xxl-4 { + margin-inline-end: 16px !important; + } + .me-xxl-5 { + margin-inline-end: 20px !important; + } + .me-xxl-6 { + margin-inline-end: 24px !important; + } + .me-xxl-7 { + margin-inline-end: 28px !important; + } + .me-xxl-8 { + margin-inline-end: 32px !important; + } + .me-xxl-9 { + margin-inline-end: 36px !important; + } + .me-xxl-10 { + margin-inline-end: 40px !important; + } + .me-xxl-11 { + margin-inline-end: 44px !important; + } + .me-xxl-12 { + margin-inline-end: 48px !important; + } + .me-xxl-13 { + margin-inline-end: 52px !important; + } + .me-xxl-14 { + margin-inline-end: 56px !important; + } + .me-xxl-15 { + margin-inline-end: 60px !important; + } + .me-xxl-16 { + margin-inline-end: 64px !important; + } + .me-xxl-auto { + margin-inline-end: auto !important; + } + .ma-xxl-n1 { + margin: -4px !important; + } + .ma-xxl-n2 { + margin: -8px !important; + } + .ma-xxl-n3 { + margin: -12px !important; + } + .ma-xxl-n4 { + margin: -16px !important; + } + .ma-xxl-n5 { + margin: -20px !important; + } + .ma-xxl-n6 { + margin: -24px !important; + } + .ma-xxl-n7 { + margin: -28px !important; + } + .ma-xxl-n8 { + margin: -32px !important; + } + .ma-xxl-n9 { + margin: -36px !important; + } + .ma-xxl-n10 { + margin: -40px !important; + } + .ma-xxl-n11 { + margin: -44px !important; + } + .ma-xxl-n12 { + margin: -48px !important; + } + .ma-xxl-n13 { + margin: -52px !important; + } + .ma-xxl-n14 { + margin: -56px !important; + } + .ma-xxl-n15 { + margin: -60px !important; + } + .ma-xxl-n16 { + margin: -64px !important; + } + .mx-xxl-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-xxl-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-xxl-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-xxl-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-xxl-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-xxl-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-xxl-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-xxl-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-xxl-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-xxl-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-xxl-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-xxl-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-xxl-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-xxl-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-xxl-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-xxl-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-xxl-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-xxl-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-xxl-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-xxl-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-xxl-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-xxl-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-xxl-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-xxl-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-xxl-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-xxl-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-xxl-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-xxl-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-xxl-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-xxl-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-xxl-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-xxl-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-xxl-n1 { + margin-top: -4px !important; + } + .mt-xxl-n2 { + margin-top: -8px !important; + } + .mt-xxl-n3 { + margin-top: -12px !important; + } + .mt-xxl-n4 { + margin-top: -16px !important; + } + .mt-xxl-n5 { + margin-top: -20px !important; + } + .mt-xxl-n6 { + margin-top: -24px !important; + } + .mt-xxl-n7 { + margin-top: -28px !important; + } + .mt-xxl-n8 { + margin-top: -32px !important; + } + .mt-xxl-n9 { + margin-top: -36px !important; + } + .mt-xxl-n10 { + margin-top: -40px !important; + } + .mt-xxl-n11 { + margin-top: -44px !important; + } + .mt-xxl-n12 { + margin-top: -48px !important; + } + .mt-xxl-n13 { + margin-top: -52px !important; + } + .mt-xxl-n14 { + margin-top: -56px !important; + } + .mt-xxl-n15 { + margin-top: -60px !important; + } + .mt-xxl-n16 { + margin-top: -64px !important; + } + .mr-xxl-n1 { + margin-right: -4px !important; + } + .mr-xxl-n2 { + margin-right: -8px !important; + } + .mr-xxl-n3 { + margin-right: -12px !important; + } + .mr-xxl-n4 { + margin-right: -16px !important; + } + .mr-xxl-n5 { + margin-right: -20px !important; + } + .mr-xxl-n6 { + margin-right: -24px !important; + } + .mr-xxl-n7 { + margin-right: -28px !important; + } + .mr-xxl-n8 { + margin-right: -32px !important; + } + .mr-xxl-n9 { + margin-right: -36px !important; + } + .mr-xxl-n10 { + margin-right: -40px !important; + } + .mr-xxl-n11 { + margin-right: -44px !important; + } + .mr-xxl-n12 { + margin-right: -48px !important; + } + .mr-xxl-n13 { + margin-right: -52px !important; + } + .mr-xxl-n14 { + margin-right: -56px !important; + } + .mr-xxl-n15 { + margin-right: -60px !important; + } + .mr-xxl-n16 { + margin-right: -64px !important; + } + .mb-xxl-n1 { + margin-bottom: -4px !important; + } + .mb-xxl-n2 { + margin-bottom: -8px !important; + } + .mb-xxl-n3 { + margin-bottom: -12px !important; + } + .mb-xxl-n4 { + margin-bottom: -16px !important; + } + .mb-xxl-n5 { + margin-bottom: -20px !important; + } + .mb-xxl-n6 { + margin-bottom: -24px !important; + } + .mb-xxl-n7 { + margin-bottom: -28px !important; + } + .mb-xxl-n8 { + margin-bottom: -32px !important; + } + .mb-xxl-n9 { + margin-bottom: -36px !important; + } + .mb-xxl-n10 { + margin-bottom: -40px !important; + } + .mb-xxl-n11 { + margin-bottom: -44px !important; + } + .mb-xxl-n12 { + margin-bottom: -48px !important; + } + .mb-xxl-n13 { + margin-bottom: -52px !important; + } + .mb-xxl-n14 { + margin-bottom: -56px !important; + } + .mb-xxl-n15 { + margin-bottom: -60px !important; + } + .mb-xxl-n16 { + margin-bottom: -64px !important; + } + .ml-xxl-n1 { + margin-left: -4px !important; + } + .ml-xxl-n2 { + margin-left: -8px !important; + } + .ml-xxl-n3 { + margin-left: -12px !important; + } + .ml-xxl-n4 { + margin-left: -16px !important; + } + .ml-xxl-n5 { + margin-left: -20px !important; + } + .ml-xxl-n6 { + margin-left: -24px !important; + } + .ml-xxl-n7 { + margin-left: -28px !important; + } + .ml-xxl-n8 { + margin-left: -32px !important; + } + .ml-xxl-n9 { + margin-left: -36px !important; + } + .ml-xxl-n10 { + margin-left: -40px !important; + } + .ml-xxl-n11 { + margin-left: -44px !important; + } + .ml-xxl-n12 { + margin-left: -48px !important; + } + .ml-xxl-n13 { + margin-left: -52px !important; + } + .ml-xxl-n14 { + margin-left: -56px !important; + } + .ml-xxl-n15 { + margin-left: -60px !important; + } + .ml-xxl-n16 { + margin-left: -64px !important; + } + .ms-xxl-n1 { + margin-inline-start: -4px !important; + } + .ms-xxl-n2 { + margin-inline-start: -8px !important; + } + .ms-xxl-n3 { + margin-inline-start: -12px !important; + } + .ms-xxl-n4 { + margin-inline-start: -16px !important; + } + .ms-xxl-n5 { + margin-inline-start: -20px !important; + } + .ms-xxl-n6 { + margin-inline-start: -24px !important; + } + .ms-xxl-n7 { + margin-inline-start: -28px !important; + } + .ms-xxl-n8 { + margin-inline-start: -32px !important; + } + .ms-xxl-n9 { + margin-inline-start: -36px !important; + } + .ms-xxl-n10 { + margin-inline-start: -40px !important; + } + .ms-xxl-n11 { + margin-inline-start: -44px !important; + } + .ms-xxl-n12 { + margin-inline-start: -48px !important; + } + .ms-xxl-n13 { + margin-inline-start: -52px !important; + } + .ms-xxl-n14 { + margin-inline-start: -56px !important; + } + .ms-xxl-n15 { + margin-inline-start: -60px !important; + } + .ms-xxl-n16 { + margin-inline-start: -64px !important; + } + .me-xxl-n1 { + margin-inline-end: -4px !important; + } + .me-xxl-n2 { + margin-inline-end: -8px !important; + } + .me-xxl-n3 { + margin-inline-end: -12px !important; + } + .me-xxl-n4 { + margin-inline-end: -16px !important; + } + .me-xxl-n5 { + margin-inline-end: -20px !important; + } + .me-xxl-n6 { + margin-inline-end: -24px !important; + } + .me-xxl-n7 { + margin-inline-end: -28px !important; + } + .me-xxl-n8 { + margin-inline-end: -32px !important; + } + .me-xxl-n9 { + margin-inline-end: -36px !important; + } + .me-xxl-n10 { + margin-inline-end: -40px !important; + } + .me-xxl-n11 { + margin-inline-end: -44px !important; + } + .me-xxl-n12 { + margin-inline-end: -48px !important; + } + .me-xxl-n13 { + margin-inline-end: -52px !important; + } + .me-xxl-n14 { + margin-inline-end: -56px !important; + } + .me-xxl-n15 { + margin-inline-end: -60px !important; + } + .me-xxl-n16 { + margin-inline-end: -64px !important; + } + .pa-xxl-0 { + padding: 0px !important; + } + .pa-xxl-1 { + padding: 4px !important; + } + .pa-xxl-2 { + padding: 8px !important; + } + .pa-xxl-3 { + padding: 12px !important; + } + .pa-xxl-4 { + padding: 16px !important; + } + .pa-xxl-5 { + padding: 20px !important; + } + .pa-xxl-6 { + padding: 24px !important; + } + .pa-xxl-7 { + padding: 28px !important; + } + .pa-xxl-8 { + padding: 32px !important; + } + .pa-xxl-9 { + padding: 36px !important; + } + .pa-xxl-10 { + padding: 40px !important; + } + .pa-xxl-11 { + padding: 44px !important; + } + .pa-xxl-12 { + padding: 48px !important; + } + .pa-xxl-13 { + padding: 52px !important; + } + .pa-xxl-14 { + padding: 56px !important; + } + .pa-xxl-15 { + padding: 60px !important; + } + .pa-xxl-16 { + padding: 64px !important; + } + .px-xxl-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-xxl-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-xxl-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-xxl-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-xxl-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-xxl-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-xxl-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-xxl-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-xxl-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-xxl-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-xxl-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-xxl-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-xxl-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-xxl-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-xxl-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-xxl-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-xxl-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-xxl-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-xxl-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-xxl-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-xxl-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-xxl-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-xxl-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-xxl-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-xxl-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-xxl-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-xxl-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-xxl-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-xxl-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-xxl-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-xxl-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-xxl-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-xxl-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-xxl-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-xxl-0 { + padding-top: 0px !important; + } + .pt-xxl-1 { + padding-top: 4px !important; + } + .pt-xxl-2 { + padding-top: 8px !important; + } + .pt-xxl-3 { + padding-top: 12px !important; + } + .pt-xxl-4 { + padding-top: 16px !important; + } + .pt-xxl-5 { + padding-top: 20px !important; + } + .pt-xxl-6 { + padding-top: 24px !important; + } + .pt-xxl-7 { + padding-top: 28px !important; + } + .pt-xxl-8 { + padding-top: 32px !important; + } + .pt-xxl-9 { + padding-top: 36px !important; + } + .pt-xxl-10 { + padding-top: 40px !important; + } + .pt-xxl-11 { + padding-top: 44px !important; + } + .pt-xxl-12 { + padding-top: 48px !important; + } + .pt-xxl-13 { + padding-top: 52px !important; + } + .pt-xxl-14 { + padding-top: 56px !important; + } + .pt-xxl-15 { + padding-top: 60px !important; + } + .pt-xxl-16 { + padding-top: 64px !important; + } + .pr-xxl-0 { + padding-right: 0px !important; + } + .pr-xxl-1 { + padding-right: 4px !important; + } + .pr-xxl-2 { + padding-right: 8px !important; + } + .pr-xxl-3 { + padding-right: 12px !important; + } + .pr-xxl-4 { + padding-right: 16px !important; + } + .pr-xxl-5 { + padding-right: 20px !important; + } + .pr-xxl-6 { + padding-right: 24px !important; + } + .pr-xxl-7 { + padding-right: 28px !important; + } + .pr-xxl-8 { + padding-right: 32px !important; + } + .pr-xxl-9 { + padding-right: 36px !important; + } + .pr-xxl-10 { + padding-right: 40px !important; + } + .pr-xxl-11 { + padding-right: 44px !important; + } + .pr-xxl-12 { + padding-right: 48px !important; + } + .pr-xxl-13 { + padding-right: 52px !important; + } + .pr-xxl-14 { + padding-right: 56px !important; + } + .pr-xxl-15 { + padding-right: 60px !important; + } + .pr-xxl-16 { + padding-right: 64px !important; + } + .pb-xxl-0 { + padding-bottom: 0px !important; + } + .pb-xxl-1 { + padding-bottom: 4px !important; + } + .pb-xxl-2 { + padding-bottom: 8px !important; + } + .pb-xxl-3 { + padding-bottom: 12px !important; + } + .pb-xxl-4 { + padding-bottom: 16px !important; + } + .pb-xxl-5 { + padding-bottom: 20px !important; + } + .pb-xxl-6 { + padding-bottom: 24px !important; + } + .pb-xxl-7 { + padding-bottom: 28px !important; + } + .pb-xxl-8 { + padding-bottom: 32px !important; + } + .pb-xxl-9 { + padding-bottom: 36px !important; + } + .pb-xxl-10 { + padding-bottom: 40px !important; + } + .pb-xxl-11 { + padding-bottom: 44px !important; + } + .pb-xxl-12 { + padding-bottom: 48px !important; + } + .pb-xxl-13 { + padding-bottom: 52px !important; + } + .pb-xxl-14 { + padding-bottom: 56px !important; + } + .pb-xxl-15 { + padding-bottom: 60px !important; + } + .pb-xxl-16 { + padding-bottom: 64px !important; + } + .pl-xxl-0 { + padding-left: 0px !important; + } + .pl-xxl-1 { + padding-left: 4px !important; + } + .pl-xxl-2 { + padding-left: 8px !important; + } + .pl-xxl-3 { + padding-left: 12px !important; + } + .pl-xxl-4 { + padding-left: 16px !important; + } + .pl-xxl-5 { + padding-left: 20px !important; + } + .pl-xxl-6 { + padding-left: 24px !important; + } + .pl-xxl-7 { + padding-left: 28px !important; + } + .pl-xxl-8 { + padding-left: 32px !important; + } + .pl-xxl-9 { + padding-left: 36px !important; + } + .pl-xxl-10 { + padding-left: 40px !important; + } + .pl-xxl-11 { + padding-left: 44px !important; + } + .pl-xxl-12 { + padding-left: 48px !important; + } + .pl-xxl-13 { + padding-left: 52px !important; + } + .pl-xxl-14 { + padding-left: 56px !important; + } + .pl-xxl-15 { + padding-left: 60px !important; + } + .pl-xxl-16 { + padding-left: 64px !important; + } + .ps-xxl-0 { + padding-inline-start: 0px !important; + } + .ps-xxl-1 { + padding-inline-start: 4px !important; + } + .ps-xxl-2 { + padding-inline-start: 8px !important; + } + .ps-xxl-3 { + padding-inline-start: 12px !important; + } + .ps-xxl-4 { + padding-inline-start: 16px !important; + } + .ps-xxl-5 { + padding-inline-start: 20px !important; + } + .ps-xxl-6 { + padding-inline-start: 24px !important; + } + .ps-xxl-7 { + padding-inline-start: 28px !important; + } + .ps-xxl-8 { + padding-inline-start: 32px !important; + } + .ps-xxl-9 { + padding-inline-start: 36px !important; + } + .ps-xxl-10 { + padding-inline-start: 40px !important; + } + .ps-xxl-11 { + padding-inline-start: 44px !important; + } + .ps-xxl-12 { + padding-inline-start: 48px !important; + } + .ps-xxl-13 { + padding-inline-start: 52px !important; + } + .ps-xxl-14 { + padding-inline-start: 56px !important; + } + .ps-xxl-15 { + padding-inline-start: 60px !important; + } + .ps-xxl-16 { + padding-inline-start: 64px !important; + } + .pe-xxl-0 { + padding-inline-end: 0px !important; + } + .pe-xxl-1 { + padding-inline-end: 4px !important; + } + .pe-xxl-2 { + padding-inline-end: 8px !important; + } + .pe-xxl-3 { + padding-inline-end: 12px !important; + } + .pe-xxl-4 { + padding-inline-end: 16px !important; + } + .pe-xxl-5 { + padding-inline-end: 20px !important; + } + .pe-xxl-6 { + padding-inline-end: 24px !important; + } + .pe-xxl-7 { + padding-inline-end: 28px !important; + } + .pe-xxl-8 { + padding-inline-end: 32px !important; + } + .pe-xxl-9 { + padding-inline-end: 36px !important; + } + .pe-xxl-10 { + padding-inline-end: 40px !important; + } + .pe-xxl-11 { + padding-inline-end: 44px !important; + } + .pe-xxl-12 { + padding-inline-end: 48px !important; + } + .pe-xxl-13 { + padding-inline-end: 52px !important; + } + .pe-xxl-14 { + padding-inline-end: 56px !important; + } + .pe-xxl-15 { + padding-inline-end: 60px !important; + } + .pe-xxl-16 { + padding-inline-end: 64px !important; + } + .text-xxl-left { + text-align: left !important; + } + .text-xxl-right { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } + .text-xxl-justify { + text-align: justify !important; + } + .text-xxl-start { + text-align: start !important; + } + .text-xxl-end { + text-align: end !important; + } + .text-xxl-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-xxl-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-xxl-auto { + height: auto !important; + } + .h-xxl-screen { + height: 100vh !important; + } + .h-xxl-0 { + height: 0 !important; + } + .h-xxl-25 { + height: 25% !important; + } + .h-xxl-50 { + height: 50% !important; + } + .h-xxl-75 { + height: 75% !important; + } + .h-xxl-100 { + height: 100% !important; + } + .w-xxl-auto { + width: auto !important; + } + .w-xxl-0 { + width: 0 !important; + } + .w-xxl-25 { + width: 25% !important; + } + .w-xxl-33 { + width: 33% !important; + } + .w-xxl-50 { + width: 50% !important; + } + .w-xxl-66 { + width: 66% !important; + } + .w-xxl-75 { + width: 75% !important; + } + .w-xxl-100 { + width: 100% !important; + } +} +@media print { + .d-print-none { + display: none !important; + } + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .float-print-none { + float: none !important; + } + .float-print-left { + float: left !important; + } + .float-print-right { + float: right !important; + } +} \ No newline at end of file diff --git a/plugins.v2/clashruleprovider/dist/assets/_plugin-vue_export-helper-pcqpp-6-.js b/plugins.v2/clashruleprovider/dist/assets/_plugin-vue_export-helper-pcqpp-6-.js new file mode 100644 index 0000000..3da658f --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/_plugin-vue_export-helper-pcqpp-6-.js @@ -0,0 +1,9 @@ +const _export_sfc = (sfc, props) => { + const target = sfc.__vccOpts || sfc; + for (const [key, val] of props) { + target[key] = val; + } + return target; +}; + +export { _export_sfc as _ }; diff --git a/plugins.v2/clashruleprovider/dist/assets/date--mM7W7--.js b/plugins.v2/clashruleprovider/dist/assets/date--mM7W7--.js new file mode 100644 index 0000000..51af79e --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/date--mM7W7--.js @@ -0,0 +1,3498 @@ +import { importShared } from './__federation_fn_import-JrT3xvdd.js'; + +// Types +// eslint-disable-line vue/prefer-import-from-vue + +/** + * Creates a factory function for props definitions. + * This is used to define props in a composable then override + * default values in an implementing component. + * + * @example Simplified signature + * (props: Props) => (defaults?: Record) => Props + * + * @example Usage + * const makeProps = propsFactory({ + * foo: String, + * }) + * + * defineComponent({ + * props: { + * ...makeProps({ + * foo: 'a', + * }), + * }, + * setup (props) { + * // would be "string | undefined", now "string" because a default has been provided + * props.foo + * }, + * } + */ + +function propsFactory(props, source) { + return defaults => { + return Object.keys(props).reduce((obj, prop) => { + const isObjectDefinition = typeof props[prop] === 'object' && props[prop] != null && !Array.isArray(props[prop]); + const definition = isObjectDefinition ? props[prop] : { + type: props[prop] + }; + if (defaults && prop in defaults) { + obj[prop] = { + ...definition, + default: defaults[prop] + }; + } else { + obj[prop] = definition; + } + if (source && !obj[prop].source) { + obj[prop].source = source; + } + return obj; + }, {}); + }; +} + +/** + * Like `Partial` but doesn't care what the value is + */ + +// Copied from Vue + +const IN_BROWSER = typeof window !== 'undefined'; +const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window; +const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0); +const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window; + +function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } +function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } +function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } +function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } +function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } +// Utilities +const {capitalize,Comment,computed: computed$8,Fragment,isVNode,reactive: reactive$3,readonly: readonly$1,shallowRef: shallowRef$4,toRefs: toRefs$1,unref: unref$2,watchEffect: watchEffect$3} = await importShared('vue'); +function getNestedValue(obj, path, fallback) { + const last = path.length - 1; + if (last < 0) return obj === undefined ? fallback : obj; + for (let i = 0; i < last; i++) { + if (obj == null) { + return fallback; + } + obj = obj[path[i]]; + } + if (obj == null) return fallback; + return obj[path[last]] === undefined ? fallback : obj[path[last]]; +} +function deepEqual(a, b) { + if (a === b) return true; + if (a instanceof Date && b instanceof Date && a.getTime() !== b.getTime()) { + // If the values are Date, compare them as timestamps + return false; + } + if (a !== Object(a) || b !== Object(b)) { + // If the values aren't objects, they were already checked for equality + return false; + } + const props = Object.keys(a); + if (props.length !== Object.keys(b).length) { + // Different number of props, don't bother to check + return false; + } + return props.every(p => deepEqual(a[p], b[p])); +} +function getObjectValueByPath(obj, path, fallback) { + // credit: http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key#comment55278413_6491621 + if (obj == null || !path || typeof path !== 'string') return fallback; + if (obj[path] !== undefined) return obj[path]; + path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties + path = path.replace(/^\./, ''); // strip a leading dot + return getNestedValue(obj, path.split('.'), fallback); +} +function getPropertyFromItem(item, property, fallback) { + if (property === true) return item === undefined ? fallback : item; + if (property == null || typeof property === 'boolean') return fallback; + if (item !== Object(item)) { + if (typeof property !== 'function') return fallback; + const value = property(item, fallback); + return typeof value === 'undefined' ? fallback : value; + } + if (typeof property === 'string') return getObjectValueByPath(item, property, fallback); + if (Array.isArray(property)) return getNestedValue(item, property, fallback); + if (typeof property !== 'function') return fallback; + const value = property(item, fallback); + return typeof value === 'undefined' ? fallback : value; +} +function createRange(length) { + let start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + return Array.from({ + length + }, (v, k) => start + k); +} +function convertToUnit(str) { + let unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'px'; + if (str == null || str === '') { + return undefined; + } else if (isNaN(+str)) { + return String(str); + } else if (!isFinite(+str)) { + return undefined; + } else { + return `${Number(str)}${unit}`; + } +} +function isObject(obj) { + return obj !== null && typeof obj === 'object' && !Array.isArray(obj); +} +function isPlainObject(obj) { + let proto; + return obj !== null && typeof obj === 'object' && ((proto = Object.getPrototypeOf(obj)) === Object.prototype || proto === null); +} +function refElement(obj) { + if (obj && '$el' in obj) { + const el = obj.$el; + if (el?.nodeType === Node.TEXT_NODE) { + // Multi-root component, use the first element + return el.nextElementSibling; + } + return el; + } + return obj; +} + +// KeyboardEvent.keyCode aliases +const keyCodes = Object.freeze({ + enter: 13, + tab: 9, + delete: 46, + esc: 27, + space: 32, + up: 38, + down: 40, + left: 37, + right: 39, + end: 35, + home: 36, + del: 46, + backspace: 8, + insert: 45, + pageup: 33, + pagedown: 34, + shift: 16 +}); +const keyValues = Object.freeze({ + enter: 'Enter', + tab: 'Tab', + delete: 'Delete', + esc: 'Escape', + space: 'Space', + up: 'ArrowUp', + down: 'ArrowDown', + left: 'ArrowLeft', + right: 'ArrowRight', + end: 'End', + home: 'Home', + del: 'Delete', + backspace: 'Backspace', + insert: 'Insert', + pageup: 'PageUp', + pagedown: 'PageDown', + shift: 'Shift' +}); +function keys(o) { + return Object.keys(o); +} +function has(obj, key) { + return key.every(k => obj.hasOwnProperty(k)); +} +// Array of keys +function pick(obj, paths) { + const found = {}; + const keys = new Set(Object.keys(obj)); + for (const path of paths) { + if (keys.has(path)) { + found[path] = obj[path]; + } + } + return found; +} + +// Array of keys + +// Array of keys or RegExp to test keys against + +function pickWithRest(obj, paths, exclude) { + const found = Object.create(null); + const rest = Object.create(null); + for (const key in obj) { + if (paths.some(path => path instanceof RegExp ? path.test(key) : path === key) && true) { + found[key] = obj[key]; + } else { + rest[key] = obj[key]; + } + } + return [found, rest]; +} +function omit(obj, exclude) { + const clone = { + ...obj + }; + exclude.forEach(prop => delete clone[prop]); + return clone; +} +function only(obj, include) { + const clone = {}; + include.forEach(prop => clone[prop] = obj[prop]); + return clone; +} +const onRE = /^on[^a-z]/; +const isOn = key => onRE.test(key); +const bubblingEvents = ['onAfterscriptexecute', 'onAnimationcancel', 'onAnimationend', 'onAnimationiteration', 'onAnimationstart', 'onAuxclick', 'onBeforeinput', 'onBeforescriptexecute', 'onChange', 'onClick', 'onCompositionend', 'onCompositionstart', 'onCompositionupdate', 'onContextmenu', 'onCopy', 'onCut', 'onDblclick', 'onFocusin', 'onFocusout', 'onFullscreenchange', 'onFullscreenerror', 'onGesturechange', 'onGestureend', 'onGesturestart', 'onGotpointercapture', 'onInput', 'onKeydown', 'onKeypress', 'onKeyup', 'onLostpointercapture', 'onMousedown', 'onMousemove', 'onMouseout', 'onMouseover', 'onMouseup', 'onMousewheel', 'onPaste', 'onPointercancel', 'onPointerdown', 'onPointerenter', 'onPointerleave', 'onPointermove', 'onPointerout', 'onPointerover', 'onPointerup', 'onReset', 'onSelect', 'onSubmit', 'onTouchcancel', 'onTouchend', 'onTouchmove', 'onTouchstart', 'onTransitioncancel', 'onTransitionend', 'onTransitionrun', 'onTransitionstart', 'onWheel']; +const compositionIgnoreKeys = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft', 'Enter', 'Escape', 'Tab', ' ']; +function isComposingIgnoreKey(e) { + return e.isComposing && compositionIgnoreKeys.includes(e.key); +} + +/** + * Filter attributes that should be applied to + * the root element of an input component. Remaining + * attributes should be passed to the element inside. + */ +function filterInputAttrs(attrs) { + const [events, props] = pickWithRest(attrs, [onRE]); + const inputEvents = omit(events, bubblingEvents); + const [rootAttrs, inputAttrs] = pickWithRest(props, ['class', 'style', 'id', /^data-/]); + Object.assign(rootAttrs, events); + Object.assign(inputAttrs, inputEvents); + return [rootAttrs, inputAttrs]; +} +function wrapInArray(v) { + return v == null ? [] : Array.isArray(v) ? v : [v]; +} +function debounce(fn, delay) { + let timeoutId = 0; + const wrap = function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + clearTimeout(timeoutId); + timeoutId = setTimeout(() => fn(...args), unref$2(delay)); + }; + wrap.clear = () => { + clearTimeout(timeoutId); + }; + wrap.immediate = fn; + return wrap; +} +function clamp(value) { + let min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + let max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + return Math.max(min, Math.min(max, value)); +} +function getDecimals(value) { + const trimmedStr = value.toString().trim(); + return trimmedStr.includes('.') ? trimmedStr.length - trimmedStr.indexOf('.') - 1 : 0; +} +function padEnd(str, length) { + let char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0'; + return str + char.repeat(Math.max(0, length - str.length)); +} +function padStart(str, length) { + let char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0'; + return char.repeat(Math.max(0, length - str.length)) + str; +} +function chunk(str) { + let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + const chunked = []; + let index = 0; + while (index < str.length) { + chunked.push(str.substr(index, size)); + index += size; + } + return chunked; +} +function humanReadableFileSize(bytes) { + let base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000; + if (bytes < base) { + return `${bytes} B`; + } + const prefix = base === 1024 ? ['Ki', 'Mi', 'Gi'] : ['k', 'M', 'G']; + let unit = -1; + while (Math.abs(bytes) >= base && unit < prefix.length - 1) { + bytes /= base; + ++unit; + } + return `${bytes.toFixed(1)} ${prefix[unit]}B`; +} +function mergeDeep() { + let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let arrayFn = arguments.length > 2 ? arguments[2] : undefined; + const out = {}; + for (const key in source) { + out[key] = source[key]; + } + for (const key in target) { + const sourceProperty = source[key]; + const targetProperty = target[key]; + + // Only continue deep merging if + // both properties are plain objects + if (isPlainObject(sourceProperty) && isPlainObject(targetProperty)) { + out[key] = mergeDeep(sourceProperty, targetProperty, arrayFn); + continue; + } + if (arrayFn && Array.isArray(sourceProperty) && Array.isArray(targetProperty)) { + out[key] = arrayFn(sourceProperty, targetProperty); + continue; + } + out[key] = targetProperty; + } + return out; +} +function flattenFragments(nodes) { + return nodes.map(node => { + if (node.type === Fragment) { + return flattenFragments(node.children); + } else { + return node; + } + }).flat(); +} +function toKebabCase() { + let str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + if (toKebabCase.cache.has(str)) return toKebabCase.cache.get(str); + const kebab = str.replace(/[^a-z]/gi, '-').replace(/\B([A-Z])/g, '-$1').toLowerCase(); + toKebabCase.cache.set(str, kebab); + return kebab; +} +toKebabCase.cache = new Map(); +function findChildrenWithProvide(key, vnode) { + if (!vnode || typeof vnode !== 'object') return []; + if (Array.isArray(vnode)) { + return vnode.map(child => findChildrenWithProvide(key, child)).flat(1); + } else if (vnode.suspense) { + return findChildrenWithProvide(key, vnode.ssContent); + } else if (Array.isArray(vnode.children)) { + return vnode.children.map(child => findChildrenWithProvide(key, child)).flat(1); + } else if (vnode.component) { + if (Object.getOwnPropertySymbols(vnode.component.provides).includes(key)) { + return [vnode.component]; + } else if (vnode.component.subTree) { + return findChildrenWithProvide(key, vnode.component.subTree).flat(1); + } + } + return []; +} +var _arr = /*#__PURE__*/new WeakMap(); +var _pointer = /*#__PURE__*/new WeakMap(); +class CircularBuffer { + constructor(size) { + _classPrivateFieldInitSpec(this, _arr, []); + _classPrivateFieldInitSpec(this, _pointer, 0); + this.size = size; + } + push(val) { + _classPrivateFieldGet(_arr, this)[_classPrivateFieldGet(_pointer, this)] = val; + _classPrivateFieldSet(_pointer, this, (_classPrivateFieldGet(_pointer, this) + 1) % this.size); + } + values() { + return _classPrivateFieldGet(_arr, this).slice(_classPrivateFieldGet(_pointer, this)).concat(_classPrivateFieldGet(_arr, this).slice(0, _classPrivateFieldGet(_pointer, this))); + } +} +function getEventCoordinates(e) { + if ('touches' in e) { + return { + clientX: e.touches[0].clientX, + clientY: e.touches[0].clientY + }; + } + return { + clientX: e.clientX, + clientY: e.clientY + }; +} + +// Only allow a single return type + +/** + * Convert a computed ref to a record of refs. + * The getter function must always return an object with the same keys. + */ + +function destructComputed(getter) { + const refs = reactive$3({}); + const base = computed$8(getter); + watchEffect$3(() => { + for (const key in base.value) { + refs[key] = base.value[key]; + } + }, { + flush: 'sync' + }); + return toRefs$1(refs); +} + +/** Array.includes but value can be any type */ +function includes(arr, val) { + return arr.includes(val); +} +function eventName(propName) { + return propName[2].toLowerCase() + propName.slice(3); +} +const EventProp = () => [Function, Array]; +function hasEvent(props, name) { + name = 'on' + capitalize(name); + return !!(props[name] || props[`${name}Once`] || props[`${name}Capture`] || props[`${name}OnceCapture`] || props[`${name}CaptureOnce`]); +} +function callEvent(handler) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + if (Array.isArray(handler)) { + for (const h of handler) { + h(...args); + } + } else if (typeof handler === 'function') { + handler(...args); + } +} +function focusableChildren(el) { + let filterByTabIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex="-1"])' : ''}:not([disabled])`).join(', '); + return [...el.querySelectorAll(targets)]; +} +function getNextElement(elements, location, condition) { + let _el; + let idx = elements.indexOf(document.activeElement); + const inc = location === 'next' ? 1 : -1; + do { + idx += inc; + _el = elements[idx]; + } while ((!_el || _el.offsetParent == null || !(condition?.(_el) ?? true)) && idx < elements.length && idx >= 0); + return _el; +} +function focusChild(el, location) { + const focusable = focusableChildren(el); + if (!location) { + if (el === document.activeElement || !el.contains(document.activeElement)) { + focusable[0]?.focus(); + } + } else if (location === 'first') { + focusable[0]?.focus(); + } else if (location === 'last') { + focusable.at(-1)?.focus(); + } else if (typeof location === 'number') { + focusable[location]?.focus(); + } else { + const _el = getNextElement(focusable, location); + if (_el) _el.focus();else focusChild(el, location === 'next' ? 'first' : 'last'); + } +} +function isEmpty(val) { + return val === null || val === undefined || typeof val === 'string' && val.trim() === ''; +} +function noop() {} + +/** Returns null if the selector is not supported or we can't check */ +function matchesSelector(el, selector) { + const supportsSelector = IN_BROWSER && typeof CSS !== 'undefined' && typeof CSS.supports !== 'undefined' && CSS.supports(`selector(${selector})`); + if (!supportsSelector) return null; + try { + return !!el && el.matches(selector); + } catch (err) { + return null; + } +} +function ensureValidVNode(vnodes) { + return vnodes.some(child => { + if (!isVNode(child)) return true; + if (child.type === Comment) return false; + return child.type !== Fragment || ensureValidVNode(child.children); + }) ? vnodes : null; +} +function defer(timeout, cb) { + if (!IN_BROWSER || timeout === 0) { + cb(); + return () => {}; + } + const timeoutId = window.setTimeout(cb, timeout); + return () => window.clearTimeout(timeoutId); +} +function isClickInsideElement(event, targetDiv) { + const mouseX = event.clientX; + const mouseY = event.clientY; + const divRect = targetDiv.getBoundingClientRect(); + const divLeft = divRect.left; + const divTop = divRect.top; + const divRight = divRect.right; + const divBottom = divRect.bottom; + return mouseX >= divLeft && mouseX <= divRight && mouseY >= divTop && mouseY <= divBottom; +} +function templateRef() { + const el = shallowRef$4(); + const fn = target => { + el.value = target; + }; + Object.defineProperty(fn, 'value', { + enumerable: true, + get: () => el.value, + set: val => el.value = val + }); + Object.defineProperty(fn, 'el', { + enumerable: true, + get: () => refElement(el.value) + }); + return fn; +} +function checkPrintable(e) { + const isPrintableChar = e.key.length === 1; + const noModifier = !e.ctrlKey && !e.metaKey && !e.altKey; + return isPrintableChar && noModifier; +} + +/** + * WCAG 3.0 APCA perceptual contrast algorithm from https://github.com/Myndex/SAPC-APCA + * @licence https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document + * @see https://www.w3.org/WAI/GL/task-forces/silver/wiki/Visual_Contrast_of_Text_Subgroup + */ +// Types + +// MAGICAL NUMBERS + +// sRGB Conversion to Relative Luminance (Y) + +// Transfer Curve (aka "Gamma") for sRGB linearization +// Simple power curve vs piecewise described in docs +// Essentially, 2.4 best models actual display +// characteristics in combination with the total method +const mainTRC = 2.4; +const Rco = 0.2126729; // sRGB Red Coefficient (from matrix) +const Gco = 0.7151522; // sRGB Green Coefficient (from matrix) +const Bco = 0.0721750; // sRGB Blue Coefficient (from matrix) + +// For Finding Raw SAPC Contrast from Relative Luminance (Y) + +// Constants for SAPC Power Curve Exponents +// One pair for normal text, and one for reverse +// These are the "beating heart" of SAPC +const normBG = 0.55; +const normTXT = 0.58; +const revTXT = 0.57; +const revBG = 0.62; + +// For Clamping and Scaling Values + +const blkThrs = 0.03; // Level that triggers the soft black clamp +const blkClmp = 1.45; // Exponent for the soft black clamp curve +const deltaYmin = 0.0005; // Lint trap +const scaleBoW = 1.25; // Scaling for dark text on light +const scaleWoB = 1.25; // Scaling for light text on dark +const loConThresh = 0.078; // Threshold for new simple offset scale +const loConFactor = 12.82051282051282; // = 1/0.078, +const loConOffset = 0.06; // The simple offset +const loClip = 0.001; // Output clip (lint trap #2) + +function APCAcontrast(text, background) { + // Linearize sRGB + const Rtxt = (text.r / 255) ** mainTRC; + const Gtxt = (text.g / 255) ** mainTRC; + const Btxt = (text.b / 255) ** mainTRC; + const Rbg = (background.r / 255) ** mainTRC; + const Gbg = (background.g / 255) ** mainTRC; + const Bbg = (background.b / 255) ** mainTRC; + + // Apply the standard coefficients and sum to Y + let Ytxt = Rtxt * Rco + Gtxt * Gco + Btxt * Bco; + let Ybg = Rbg * Rco + Gbg * Gco + Bbg * Bco; + + // Soft clamp Y when near black. + // Now clamping all colors to prevent crossover errors + if (Ytxt <= blkThrs) Ytxt += (blkThrs - Ytxt) ** blkClmp; + if (Ybg <= blkThrs) Ybg += (blkThrs - Ybg) ** blkClmp; + + // Return 0 Early for extremely low ∆Y (lint trap #1) + if (Math.abs(Ybg - Ytxt) < deltaYmin) return 0.0; + + // SAPC CONTRAST + + let outputContrast; // For weighted final values + if (Ybg > Ytxt) { + // For normal polarity, black text on white + // Calculate the SAPC contrast value and scale + + const SAPC = (Ybg ** normBG - Ytxt ** normTXT) * scaleBoW; + + // NEW! SAPC SmoothScale™ + // Low Contrast Smooth Scale Rollout to prevent polarity reversal + // and also a low clip for very low contrasts (lint trap #2) + // much of this is for very low contrasts, less than 10 + // therefore for most reversing needs, only loConOffset is important + outputContrast = SAPC < loClip ? 0.0 : SAPC < loConThresh ? SAPC - SAPC * loConFactor * loConOffset : SAPC - loConOffset; + } else { + // For reverse polarity, light text on dark + // WoB should always return negative value. + + const SAPC = (Ybg ** revBG - Ytxt ** revTXT) * scaleWoB; + outputContrast = SAPC > -1e-3 ? 0.0 : SAPC > -0.078 ? SAPC - SAPC * loConFactor * loConOffset : SAPC + loConOffset; + } + return outputContrast * 100; +} + +/* eslint-disable no-console */ + +// Utilities +const {warn} = await importShared('vue'); + +function consoleWarn(message) { + warn(`Vuetify: ${message}`); +} +function consoleError(message) { + warn(`Vuetify error: ${message}`); +} +function deprecate(original, replacement) { + replacement = Array.isArray(replacement) ? replacement.slice(0, -1).map(s => `'${s}'`).join(', ') + ` or '${replacement.at(-1)}'` : `'${replacement}'`; + warn(`[Vuetify UPGRADE] '${original}' is deprecated, use ${replacement} instead.`); +} + +// Types + +const delta = 0.20689655172413793; // 6÷29 + +const cielabForwardTransform = t => t > delta ** 3 ? Math.cbrt(t) : t / (3 * delta ** 2) + 4 / 29; +const cielabReverseTransform = t => t > delta ? t ** 3 : 3 * delta ** 2 * (t - 4 / 29); +function fromXYZ$1(xyz) { + const transform = cielabForwardTransform; + const transformedY = transform(xyz[1]); + return [116 * transformedY - 16, 500 * (transform(xyz[0] / 0.95047) - transformedY), 200 * (transformedY - transform(xyz[2] / 1.08883))]; +} +function toXYZ$1(lab) { + const transform = cielabReverseTransform; + const Ln = (lab[0] + 16) / 116; + return [transform(Ln + lab[1] / 500) * 0.95047, transform(Ln), transform(Ln - lab[2] / 200) * 1.08883]; +} + +// Utilities +// For converting XYZ to sRGB +const srgbForwardMatrix = [[3.2406, -1.5372, -0.4986], [-0.9689, 1.8758, 0.0415], [0.0557, -0.204, 1.0570]]; + +// Forward gamma adjust +const srgbForwardTransform = C => C <= 0.0031308 ? C * 12.92 : 1.055 * C ** (1 / 2.4) - 0.055; + +// For converting sRGB to XYZ +const srgbReverseMatrix = [[0.4124, 0.3576, 0.1805], [0.2126, 0.7152, 0.0722], [0.0193, 0.1192, 0.9505]]; + +// Reverse gamma adjust +const srgbReverseTransform = C => C <= 0.04045 ? C / 12.92 : ((C + 0.055) / 1.055) ** 2.4; +function fromXYZ(xyz) { + const rgb = Array(3); + const transform = srgbForwardTransform; + const matrix = srgbForwardMatrix; + + // Matrix transform, then gamma adjustment + for (let i = 0; i < 3; ++i) { + // Rescale back to [0, 255] + rgb[i] = Math.round(clamp(transform(matrix[i][0] * xyz[0] + matrix[i][1] * xyz[1] + matrix[i][2] * xyz[2])) * 255); + } + return { + r: rgb[0], + g: rgb[1], + b: rgb[2] + }; +} +function toXYZ(_ref) { + let { + r, + g, + b + } = _ref; + const xyz = [0, 0, 0]; + const transform = srgbReverseTransform; + const matrix = srgbReverseMatrix; + + // Rescale from [0, 255] to [0, 1] then adjust sRGB gamma to linear RGB + r = transform(r / 255); + g = transform(g / 255); + b = transform(b / 255); + + // Matrix color space transform + for (let i = 0; i < 3; ++i) { + xyz[i] = matrix[i][0] * r + matrix[i][1] * g + matrix[i][2] * b; + } + return xyz; +} + +// Utilities +function isCssColor(color) { + return !!color && /^(#|var\(--|(rgb|hsl)a?\()/.test(color); +} +function isParsableColor(color) { + return isCssColor(color) && !/^((rgb|hsl)a?\()?var\(--/.test(color); +} +const cssColorRe = /^(?(?:rgb|hsl)a?)\((?.+)\)/; +const mappers = { + rgb: (r, g, b, a) => ({ + r, + g, + b, + a + }), + rgba: (r, g, b, a) => ({ + r, + g, + b, + a + }), + hsl: (h, s, l, a) => HSLtoRGB({ + h, + s, + l, + a + }), + hsla: (h, s, l, a) => HSLtoRGB({ + h, + s, + l, + a + }), + hsv: (h, s, v, a) => HSVtoRGB({ + h, + s, + v, + a + }), + hsva: (h, s, v, a) => HSVtoRGB({ + h, + s, + v, + a + }) +}; +function parseColor(color) { + if (typeof color === 'number') { + if (isNaN(color) || color < 0 || color > 0xFFFFFF) { + // int can't have opacity + consoleWarn(`'${color}' is not a valid hex color`); + } + return { + r: (color & 0xFF0000) >> 16, + g: (color & 0xFF00) >> 8, + b: color & 0xFF + }; + } else if (typeof color === 'string' && cssColorRe.test(color)) { + const { + groups + } = color.match(cssColorRe); + const { + fn, + values + } = groups; + const realValues = values.split(/,\s*/).map(v => { + if (v.endsWith('%') && ['hsl', 'hsla', 'hsv', 'hsva'].includes(fn)) { + return parseFloat(v) / 100; + } else { + return parseFloat(v); + } + }); + return mappers[fn](...realValues); + } else if (typeof color === 'string') { + let hex = color.startsWith('#') ? color.slice(1) : color; + if ([3, 4].includes(hex.length)) { + hex = hex.split('').map(char => char + char).join(''); + } else if (![6, 8].includes(hex.length)) { + consoleWarn(`'${color}' is not a valid hex(a) color`); + } + const int = parseInt(hex, 16); + if (isNaN(int) || int < 0 || int > 0xFFFFFFFF) { + consoleWarn(`'${color}' is not a valid hex(a) color`); + } + return HexToRGB(hex); + } else if (typeof color === 'object') { + if (has(color, ['r', 'g', 'b'])) { + return color; + } else if (has(color, ['h', 's', 'l'])) { + return HSVtoRGB(HSLtoHSV(color)); + } else if (has(color, ['h', 's', 'v'])) { + return HSVtoRGB(color); + } + } + throw new TypeError(`Invalid color: ${color == null ? color : String(color) || color.constructor.name}\nExpected #hex, #hexa, rgb(), rgba(), hsl(), hsla(), object or number`); +} + +/** Converts HSVA to RGBA. Based on formula from https://en.wikipedia.org/wiki/HSL_and_HSV */ +function HSVtoRGB(hsva) { + const { + h, + s, + v, + a + } = hsva; + const f = n => { + const k = (n + h / 60) % 6; + return v - v * s * Math.max(Math.min(k, 4 - k, 1), 0); + }; + const rgb = [f(5), f(3), f(1)].map(v => Math.round(v * 255)); + return { + r: rgb[0], + g: rgb[1], + b: rgb[2], + a + }; +} +function HSLtoRGB(hsla) { + return HSVtoRGB(HSLtoHSV(hsla)); +} + +/** Converts RGBA to HSVA. Based on formula from https://en.wikipedia.org/wiki/HSL_and_HSV */ +function RGBtoHSV(rgba) { + if (!rgba) return { + h: 0, + s: 1, + v: 1, + a: 1 + }; + const r = rgba.r / 255; + const g = rgba.g / 255; + const b = rgba.b / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + let h = 0; + if (max !== min) { + if (max === r) { + h = 60 * (0 + (g - b) / (max - min)); + } else if (max === g) { + h = 60 * (2 + (b - r) / (max - min)); + } else if (max === b) { + h = 60 * (4 + (r - g) / (max - min)); + } + } + if (h < 0) h = h + 360; + const s = max === 0 ? 0 : (max - min) / max; + const hsv = [h, s, max]; + return { + h: hsv[0], + s: hsv[1], + v: hsv[2], + a: rgba.a + }; +} +function HSVtoHSL(hsva) { + const { + h, + s, + v, + a + } = hsva; + const l = v - v * s / 2; + const sprime = l === 1 || l === 0 ? 0 : (v - l) / Math.min(l, 1 - l); + return { + h, + s: sprime, + l, + a + }; +} +function HSLtoHSV(hsl) { + const { + h, + s, + l, + a + } = hsl; + const v = l + s * Math.min(l, 1 - l); + const sprime = v === 0 ? 0 : 2 - 2 * l / v; + return { + h, + s: sprime, + v, + a + }; +} +function RGBtoCSS(_ref) { + let { + r, + g, + b, + a + } = _ref; + return a === undefined ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${a})`; +} +function HSVtoCSS(hsva) { + return RGBtoCSS(HSVtoRGB(hsva)); +} +function toHex(v) { + const h = Math.round(v).toString(16); + return ('00'.substr(0, 2 - h.length) + h).toUpperCase(); +} +function RGBtoHex(_ref2) { + let { + r, + g, + b, + a + } = _ref2; + return `#${[toHex(r), toHex(g), toHex(b), a !== undefined ? toHex(Math.round(a * 255)) : ''].join('')}`; +} +function HexToRGB(hex) { + hex = parseHex(hex); + let [r, g, b, a] = chunk(hex, 2).map(c => parseInt(c, 16)); + a = a === undefined ? a : a / 255; + return { + r, + g, + b, + a + }; +} +function HexToHSV(hex) { + const rgb = HexToRGB(hex); + return RGBtoHSV(rgb); +} +function HSVtoHex(hsva) { + return RGBtoHex(HSVtoRGB(hsva)); +} +function parseHex(hex) { + if (hex.startsWith('#')) { + hex = hex.slice(1); + } + hex = hex.replace(/([^0-9a-f])/gi, 'F'); + if (hex.length === 3 || hex.length === 4) { + hex = hex.split('').map(x => x + x).join(''); + } + if (hex.length !== 6) { + hex = padEnd(padEnd(hex, 6), 8, 'F'); + } + return hex; +} +function lighten(value, amount) { + const lab = fromXYZ$1(toXYZ(value)); + lab[0] = lab[0] + amount * 10; + return fromXYZ(toXYZ$1(lab)); +} +function darken(value, amount) { + const lab = fromXYZ$1(toXYZ(value)); + lab[0] = lab[0] - amount * 10; + return fromXYZ(toXYZ$1(lab)); +} + +/** + * Calculate the relative luminance of a given color + * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef + */ +function getLuma(color) { + const rgb = parseColor(color); + return toXYZ(rgb)[1]; +} + +/** + * Returns the contrast ratio (1-21) between two colors. + * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef + */ +function getContrast(first, second) { + const l1 = getLuma(first); + const l2 = getLuma(second); + const light = Math.max(l1, l2); + const dark = Math.min(l1, l2); + return (light + 0.05) / (dark + 0.05); +} +function getForeground(color) { + const blackContrast = Math.abs(APCAcontrast(parseColor(0), parseColor(color))); + const whiteContrast = Math.abs(APCAcontrast(parseColor(0xffffff), parseColor(color))); + + // TODO: warn about poor color selections + // const contrastAsText = Math.abs(APCAcontrast(colorVal, colorToInt(theme.colors.background))) + // const minContrast = Math.max(blackContrast, whiteContrast) + // if (minContrast < 60) { + // consoleInfo(`${key} theme color ${color} has poor contrast (${minContrast.toFixed()}%)`) + // } else if (contrastAsText < 60 && !['background', 'surface'].includes(color)) { + // consoleInfo(`${key} theme color ${color} has poor contrast as text (${contrastAsText.toFixed()}%)`) + // } + + // Prefer white text if both have an acceptable contrast ratio + return whiteContrast > Math.min(blackContrast, 50) ? '#fff' : '#000'; +} + +// Utilities +const {getCurrentInstance:_getCurrentInstance} = await importShared('vue'); +function getCurrentInstance(name, message) { + const vm = _getCurrentInstance(); + if (!vm) { + throw new Error(`[Vuetify] ${name} ${'must be called from inside a setup function'}`); + } + return vm; +} +function getCurrentInstanceName() { + let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'composables'; + const vm = getCurrentInstance(name).type; + return toKebabCase(vm?.aliasName || vm?.name); +} +let _uid = 0; +let _map = new WeakMap(); +function getUid() { + const vm = getCurrentInstance('getUid'); + if (_map.has(vm)) return _map.get(vm);else { + const uid = _uid++; + _map.set(vm, uid); + return uid; + } +} +getUid.reset = () => { + _uid = 0; + _map = new WeakMap(); +}; + +// Utilities +function injectSelf(key) { + let vm = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstance('injectSelf'); + const { + provides + } = vm; + if (provides && key in provides) { + // TS doesn't allow symbol as index type + return provides[key]; + } + return undefined; +} + +// Utilities +const {computed: computed$7,inject: inject$7,provide: provide$3,ref: ref$6,shallowRef: shallowRef$3,unref: unref$1,watchEffect: watchEffect$2} = await importShared('vue'); +const DefaultsSymbol = Symbol.for('vuetify:defaults'); +function createDefaults(options) { + return ref$6(options); +} +function injectDefaults() { + const defaults = inject$7(DefaultsSymbol); + if (!defaults) throw new Error('[Vuetify] Could not find defaults instance'); + return defaults; +} +function provideDefaults(defaults, options) { + const injectedDefaults = injectDefaults(); + const providedDefaults = ref$6(defaults); + const newDefaults = computed$7(() => { + const disabled = unref$1(options?.disabled); + if (disabled) return injectedDefaults.value; + const scoped = unref$1(options?.scoped); + const reset = unref$1(options?.reset); + const root = unref$1(options?.root); + if (providedDefaults.value == null && !(scoped || reset || root)) return injectedDefaults.value; + let properties = mergeDeep(providedDefaults.value, { + prev: injectedDefaults.value + }); + if (scoped) return properties; + if (reset || root) { + const len = Number(reset || Infinity); + for (let i = 0; i <= len; i++) { + if (!properties || !('prev' in properties)) { + break; + } + properties = properties.prev; + } + if (properties && typeof root === 'string' && root in properties) { + properties = mergeDeep(mergeDeep(properties, { + prev: properties + }), properties[root]); + } + return properties; + } + return properties.prev ? mergeDeep(properties.prev, properties) : properties; + }); + provide$3(DefaultsSymbol, newDefaults); + return newDefaults; +} +function propIsDefined(vnode, prop) { + return typeof vnode.props?.[prop] !== 'undefined' || typeof vnode.props?.[toKebabCase(prop)] !== 'undefined'; +} +function internalUseDefaults() { + let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let name = arguments.length > 1 ? arguments[1] : undefined; + let defaults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : injectDefaults(); + const vm = getCurrentInstance('useDefaults'); + name = name ?? vm.type.name ?? vm.type.__name; + if (!name) { + throw new Error('[Vuetify] Could not determine component name'); + } + const componentDefaults = computed$7(() => defaults.value?.[props._as ?? name]); + const _props = new Proxy(props, { + get(target, prop) { + const propValue = Reflect.get(target, prop); + if (prop === 'class' || prop === 'style') { + return [componentDefaults.value?.[prop], propValue].filter(v => v != null); + } else if (typeof prop === 'string' && !propIsDefined(vm.vnode, prop)) { + return componentDefaults.value?.[prop] !== undefined ? componentDefaults.value?.[prop] : defaults.value?.global?.[prop] !== undefined ? defaults.value?.global?.[prop] : propValue; + } + return propValue; + } + }); + const _subcomponentDefaults = shallowRef$3(); + watchEffect$2(() => { + if (componentDefaults.value) { + const subComponents = Object.entries(componentDefaults.value).filter(_ref => { + let [key] = _ref; + return key.startsWith(key[0].toUpperCase()); + }); + _subcomponentDefaults.value = subComponents.length ? Object.fromEntries(subComponents) : undefined; + } else { + _subcomponentDefaults.value = undefined; + } + }); + function provideSubDefaults() { + const injected = injectSelf(DefaultsSymbol, vm); + provide$3(DefaultsSymbol, computed$7(() => { + return _subcomponentDefaults.value ? mergeDeep(injected?.value ?? {}, _subcomponentDefaults.value) : injected?.value; + })); + } + return { + props: _props, + provideSubDefaults + }; +} +function useDefaults() { + let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let name = arguments.length > 1 ? arguments[1] : undefined; + const { + props: _props, + provideSubDefaults + } = internalUseDefaults(props, name); + provideSubDefaults(); + return _props; +} + +const {defineComponent:_defineComponent} = await importShared('vue'); +// No props +// Object Props +// Implementation +function defineComponent(options) { + options._setup = options._setup ?? options.setup; + if (!options.name) { + consoleWarn('The component is missing an explicit name, unable to generate default prop value'); + return options; + } + if (options._setup) { + options.props = propsFactory(options.props ?? {}, options.name)(); + const propKeys = Object.keys(options.props).filter(key => key !== 'class' && key !== 'style'); + options.filterProps = function filterProps(props) { + return pick(props, propKeys); + }; + options.props._as = String; + options.setup = function setup(props, ctx) { + const defaults = injectDefaults(); + + // Skip props proxy if defaults are not provided + if (!defaults.value) return options._setup(props, ctx); + const { + props: _props, + provideSubDefaults + } = internalUseDefaults(props, props._as ?? options.name, defaults); + const setupBindings = options._setup(_props, ctx); + provideSubDefaults(); + return setupBindings; + }; + } + return options; +} + +// No argument - simple default slot + +// Generic constructor argument - generic props and slots + +// Slots argument - simple slots + +// Implementation +function genericComponent() { + let exposeDefaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + return options => (exposeDefaults ? defineComponent : _defineComponent)(options); +} +function defineFunctionalComponent(props, render) { + render.props = props; + return render; +} + +// Adds a filterProps method to the component options + +// https://github.com/vuejs/core/pull/10557 + +// not a vue Component + +// Utilities +const {onBeforeUnmount: onBeforeUnmount$1,readonly,ref: ref$5,watch: watch$5} = await importShared('vue'); +function useResizeObserver(callback) { + let box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'content'; + const resizeRef = templateRef(); + const contentRect = ref$5(); + if (IN_BROWSER) { + const observer = new ResizeObserver(entries => { + callback?.(entries, observer); + if (!entries.length) return; + if (box === 'content') { + contentRect.value = entries[0].contentRect; + } else { + contentRect.value = entries[0].target.getBoundingClientRect(); + } + }); + onBeforeUnmount$1(() => { + observer.disconnect(); + }); + watch$5(() => resizeRef.el, (newValue, oldValue) => { + if (oldValue) { + observer.unobserve(oldValue); + contentRect.value = undefined; + } + if (newValue) observer.observe(newValue); + }, { + flush: 'post' + }); + } + return { + resizeRef, + contentRect: readonly(contentRect) + }; +} + +const {computed: computed$6,inject: inject$6,onActivated,onBeforeUnmount,onDeactivated,onMounted,provide: provide$2,reactive: reactive$2,ref: ref$4,shallowRef: shallowRef$2} = await importShared('vue'); +const VuetifyLayoutKey = Symbol.for('vuetify:layout'); +const VuetifyLayoutItemKey = Symbol.for('vuetify:layout-item'); +const ROOT_ZINDEX = 1000; +const makeLayoutProps = propsFactory({ + overlaps: { + type: Array, + default: () => [] + }, + fullHeight: Boolean +}, 'layout'); + +// Composables +const makeLayoutItemProps = propsFactory({ + name: { + type: String + }, + order: { + type: [Number, String], + default: 0 + }, + absolute: Boolean +}, 'layout-item'); +function useLayout() { + const layout = inject$6(VuetifyLayoutKey); + if (!layout) throw new Error('[Vuetify] Could not find injected layout'); + return { + getLayoutItem: layout.getLayoutItem, + mainRect: layout.mainRect, + mainStyles: layout.mainStyles + }; +} +function useLayoutItem(options) { + const layout = inject$6(VuetifyLayoutKey); + if (!layout) throw new Error('[Vuetify] Could not find injected layout'); + const id = options.id ?? `layout-item-${getUid()}`; + const vm = getCurrentInstance('useLayoutItem'); + provide$2(VuetifyLayoutItemKey, { + id + }); + const isKeptAlive = shallowRef$2(false); + onDeactivated(() => isKeptAlive.value = true); + onActivated(() => isKeptAlive.value = false); + const { + layoutItemStyles, + layoutItemScrimStyles + } = layout.register(vm, { + ...options, + active: computed$6(() => isKeptAlive.value ? false : options.active.value), + id + }); + onBeforeUnmount(() => layout.unregister(id)); + return { + layoutItemStyles, + layoutRect: layout.layoutRect, + layoutItemScrimStyles + }; +} +const generateLayers = (layout, positions, layoutSizes, activeItems) => { + let previousLayer = { + top: 0, + left: 0, + right: 0, + bottom: 0 + }; + const layers = [{ + id: '', + layer: { + ...previousLayer + } + }]; + for (const id of layout) { + const position = positions.get(id); + const amount = layoutSizes.get(id); + const active = activeItems.get(id); + if (!position || !amount || !active) continue; + const layer = { + ...previousLayer, + [position.value]: parseInt(previousLayer[position.value], 10) + (active.value ? parseInt(amount.value, 10) : 0) + }; + layers.push({ + id, + layer + }); + previousLayer = layer; + } + return layers; +}; +function createLayout(props) { + const parentLayout = inject$6(VuetifyLayoutKey, null); + const rootZIndex = computed$6(() => parentLayout ? parentLayout.rootZIndex.value - 100 : ROOT_ZINDEX); + const registered = ref$4([]); + const positions = reactive$2(new Map()); + const layoutSizes = reactive$2(new Map()); + const priorities = reactive$2(new Map()); + const activeItems = reactive$2(new Map()); + const disabledTransitions = reactive$2(new Map()); + const { + resizeRef, + contentRect: layoutRect + } = useResizeObserver(); + const computedOverlaps = computed$6(() => { + const map = new Map(); + const overlaps = props.overlaps ?? []; + for (const overlap of overlaps.filter(item => item.includes(':'))) { + const [top, bottom] = overlap.split(':'); + if (!registered.value.includes(top) || !registered.value.includes(bottom)) continue; + const topPosition = positions.get(top); + const bottomPosition = positions.get(bottom); + const topAmount = layoutSizes.get(top); + const bottomAmount = layoutSizes.get(bottom); + if (!topPosition || !bottomPosition || !topAmount || !bottomAmount) continue; + map.set(bottom, { + position: topPosition.value, + amount: parseInt(topAmount.value, 10) + }); + map.set(top, { + position: bottomPosition.value, + amount: -parseInt(bottomAmount.value, 10) + }); + } + return map; + }); + const layers = computed$6(() => { + const uniquePriorities = [...new Set([...priorities.values()].map(p => p.value))].sort((a, b) => a - b); + const layout = []; + for (const p of uniquePriorities) { + const items = registered.value.filter(id => priorities.get(id)?.value === p); + layout.push(...items); + } + return generateLayers(layout, positions, layoutSizes, activeItems); + }); + const transitionsEnabled = computed$6(() => { + return !Array.from(disabledTransitions.values()).some(ref => ref.value); + }); + const mainRect = computed$6(() => { + return layers.value[layers.value.length - 1].layer; + }); + const mainStyles = computed$6(() => { + return { + '--v-layout-left': convertToUnit(mainRect.value.left), + '--v-layout-right': convertToUnit(mainRect.value.right), + '--v-layout-top': convertToUnit(mainRect.value.top), + '--v-layout-bottom': convertToUnit(mainRect.value.bottom), + ...(transitionsEnabled.value ? undefined : { + transition: 'none' + }) + }; + }); + const items = computed$6(() => { + return layers.value.slice(1).map((_ref, index) => { + let { + id + } = _ref; + const { + layer + } = layers.value[index]; + const size = layoutSizes.get(id); + const position = positions.get(id); + return { + id, + ...layer, + size: Number(size.value), + position: position.value + }; + }); + }); + const getLayoutItem = id => { + return items.value.find(item => item.id === id); + }; + const rootVm = getCurrentInstance('createLayout'); + const isMounted = shallowRef$2(false); + onMounted(() => { + isMounted.value = true; + }); + provide$2(VuetifyLayoutKey, { + register: (vm, _ref2) => { + let { + id, + order, + position, + layoutSize, + elementSize, + active, + disableTransitions, + absolute + } = _ref2; + priorities.set(id, order); + positions.set(id, position); + layoutSizes.set(id, layoutSize); + activeItems.set(id, active); + disableTransitions && disabledTransitions.set(id, disableTransitions); + const instances = findChildrenWithProvide(VuetifyLayoutItemKey, rootVm?.vnode); + const instanceIndex = instances.indexOf(vm); + if (instanceIndex > -1) registered.value.splice(instanceIndex, 0, id);else registered.value.push(id); + const index = computed$6(() => items.value.findIndex(i => i.id === id)); + const zIndex = computed$6(() => rootZIndex.value + layers.value.length * 2 - index.value * 2); + const layoutItemStyles = computed$6(() => { + const isHorizontal = position.value === 'left' || position.value === 'right'; + const isOppositeHorizontal = position.value === 'right'; + const isOppositeVertical = position.value === 'bottom'; + const size = elementSize.value ?? layoutSize.value; + const unit = size === 0 ? '%' : 'px'; + const styles = { + [position.value]: 0, + zIndex: zIndex.value, + transform: `translate${isHorizontal ? 'X' : 'Y'}(${(active.value ? 0 : -(size === 0 ? 100 : size)) * (isOppositeHorizontal || isOppositeVertical ? -1 : 1)}${unit})`, + position: absolute.value || rootZIndex.value !== ROOT_ZINDEX ? 'absolute' : 'fixed', + ...(transitionsEnabled.value ? undefined : { + transition: 'none' + }) + }; + if (!isMounted.value) return styles; + const item = items.value[index.value]; + if (!item) throw new Error(`[Vuetify] Could not find layout item "${id}"`); + const overlap = computedOverlaps.value.get(id); + if (overlap) { + item[overlap.position] += overlap.amount; + } + return { + ...styles, + height: isHorizontal ? `calc(100% - ${item.top}px - ${item.bottom}px)` : elementSize.value ? `${elementSize.value}px` : undefined, + left: isOppositeHorizontal ? undefined : `${item.left}px`, + right: isOppositeHorizontal ? `${item.right}px` : undefined, + top: position.value !== 'bottom' ? `${item.top}px` : undefined, + bottom: position.value !== 'top' ? `${item.bottom}px` : undefined, + width: !isHorizontal ? `calc(100% - ${item.left}px - ${item.right}px)` : elementSize.value ? `${elementSize.value}px` : undefined + }; + }); + const layoutItemScrimStyles = computed$6(() => ({ + zIndex: zIndex.value - 1 + })); + return { + layoutItemStyles, + layoutItemScrimStyles, + zIndex + }; + }, + unregister: id => { + priorities.delete(id); + positions.delete(id); + layoutSizes.delete(id); + activeItems.delete(id); + disabledTransitions.delete(id); + registered.value = registered.value.filter(v => v !== id); + }, + mainRect, + mainStyles, + getLayoutItem, + items, + layoutRect, + rootZIndex + }); + const layoutClasses = computed$6(() => ['v-layout', { + 'v-layout--full-height': props.fullHeight + }]); + const layoutStyles = computed$6(() => ({ + zIndex: parentLayout ? rootZIndex.value : undefined, + position: parentLayout ? 'relative' : undefined, + overflow: parentLayout ? 'hidden' : undefined + })); + return { + layoutClasses, + layoutStyles, + getLayoutItem, + items, + layoutRect, + layoutRef: resizeRef + }; +} + +// Utilities +const {effectScope,onScopeDispose,watch: watch$4} = await importShared('vue'); + + +// Types + +function useToggleScope(source, fn) { + let scope; + function start() { + scope = effectScope(); + scope.run(() => fn.length ? fn(() => { + scope?.stop(); + start(); + }) : fn()); + } + watch$4(source, active => { + if (active && !scope) { + start(); + } else if (!active) { + scope?.stop(); + scope = undefined; + } + }, { + immediate: true + }); + onScopeDispose(() => { + scope?.stop(); + }); +} + +const {computed: computed$5,ref: ref$3,toRaw,watch: watch$3} = await importShared('vue'); +// Composables +function useProxiedModel(props, prop, defaultValue) { + let transformIn = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : v => v; + let transformOut = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : v => v; + const vm = getCurrentInstance('useProxiedModel'); + const internal = ref$3(props[prop] !== undefined ? props[prop] : defaultValue); + const kebabProp = toKebabCase(prop); + const checkKebab = kebabProp !== prop; + const isControlled = checkKebab ? computed$5(() => { + void props[prop]; + return !!((vm.vnode.props?.hasOwnProperty(prop) || vm.vnode.props?.hasOwnProperty(kebabProp)) && (vm.vnode.props?.hasOwnProperty(`onUpdate:${prop}`) || vm.vnode.props?.hasOwnProperty(`onUpdate:${kebabProp}`))); + }) : computed$5(() => { + void props[prop]; + return !!(vm.vnode.props?.hasOwnProperty(prop) && vm.vnode.props?.hasOwnProperty(`onUpdate:${prop}`)); + }); + useToggleScope(() => !isControlled.value, () => { + watch$3(() => props[prop], val => { + internal.value = val; + }); + }); + const model = computed$5({ + get() { + const externalValue = props[prop]; + return transformIn(isControlled.value ? externalValue : internal.value); + }, + set(internalValue) { + const newValue = transformOut(internalValue); + const value = toRaw(isControlled.value ? props[prop] : internal.value); + if (value === newValue || transformIn(value) === internalValue) { + return; + } + internal.value = newValue; + vm?.emit(`update:${prop}`, newValue); + } + }); + Object.defineProperty(model, 'externalValue', { + get: () => isControlled.value ? props[prop] : internal.value + }); + return model; +} + +const en = { + badge: 'Badge', + open: 'Open', + close: 'Close', + dismiss: 'Dismiss', + confirmEdit: { + ok: 'OK', + cancel: 'Cancel' + }, + dataIterator: { + noResultsText: 'No matching records found', + loadingText: 'Loading items...' + }, + dataTable: { + itemsPerPageText: 'Rows per page:', + ariaLabel: { + sortDescending: 'Sorted descending.', + sortAscending: 'Sorted ascending.', + sortNone: 'Not sorted.', + activateNone: 'Activate to remove sorting.', + activateDescending: 'Activate to sort descending.', + activateAscending: 'Activate to sort ascending.' + }, + sortBy: 'Sort by' + }, + dataFooter: { + itemsPerPageText: 'Items per page:', + itemsPerPageAll: 'All', + nextPage: 'Next page', + prevPage: 'Previous page', + firstPage: 'First page', + lastPage: 'Last page', + pageText: '{0}-{1} of {2}' + }, + dateRangeInput: { + divider: 'to' + }, + datePicker: { + itemsSelected: '{0} selected', + range: { + title: 'Select dates', + header: 'Enter dates' + }, + title: 'Select date', + header: 'Enter date', + input: { + placeholder: 'Enter date' + } + }, + noDataText: 'No data available', + carousel: { + prev: 'Previous visual', + next: 'Next visual', + ariaLabel: { + delimiter: 'Carousel slide {0} of {1}' + } + }, + calendar: { + moreEvents: '{0} more', + today: 'Today' + }, + input: { + clear: 'Clear {0}', + prependAction: '{0} prepended action', + appendAction: '{0} appended action', + otp: 'Please enter OTP character {0}' + }, + fileInput: { + counter: '{0} files', + counterSize: '{0} files ({1} in total)' + }, + timePicker: { + am: 'AM', + pm: 'PM', + title: 'Select Time' + }, + pagination: { + ariaLabel: { + root: 'Pagination Navigation', + next: 'Next page', + previous: 'Previous page', + page: 'Go to page {0}', + currentPage: 'Page {0}, Current page', + first: 'First page', + last: 'Last page' + } + }, + stepper: { + next: 'Next', + prev: 'Previous' + }, + rating: { + ariaLabel: { + item: 'Rating {0} of {1}' + } + }, + loading: 'Loading...', + infiniteScroll: { + loadMore: 'Load more', + empty: 'No more' + } +}; + +const {ref: ref$2,shallowRef: shallowRef$1,watch: watch$2} = await importShared('vue'); +const LANG_PREFIX = '$vuetify.'; +const replace = (str, params) => { + return str.replace(/\{(\d+)\}/g, (match, index) => { + return String(params[+index]); + }); +}; +const createTranslateFunction = (current, fallback, messages) => { + return function (key) { + for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + params[_key - 1] = arguments[_key]; + } + if (!key.startsWith(LANG_PREFIX)) { + return replace(key, params); + } + const shortKey = key.replace(LANG_PREFIX, ''); + const currentLocale = current.value && messages.value[current.value]; + const fallbackLocale = fallback.value && messages.value[fallback.value]; + let str = getObjectValueByPath(currentLocale, shortKey, null); + if (!str) { + consoleWarn(`Translation key "${key}" not found in "${current.value}", trying fallback locale`); + str = getObjectValueByPath(fallbackLocale, shortKey, null); + } + if (!str) { + consoleError(`Translation key "${key}" not found in fallback`); + str = key; + } + if (typeof str !== 'string') { + consoleError(`Translation key "${key}" has a non-string value`); + str = key; + } + return replace(str, params); + }; +}; +function createNumberFunction(current, fallback) { + return (value, options) => { + const numberFormat = new Intl.NumberFormat([current.value, fallback.value], options); + return numberFormat.format(value); + }; +} +function useProvided(props, prop, provided) { + const internal = useProxiedModel(props, prop, props[prop] ?? provided.value); + + // TODO: Remove when defaultValue works + internal.value = props[prop] ?? provided.value; + watch$2(provided, v => { + if (props[prop] == null) { + internal.value = provided.value; + } + }); + return internal; +} +function createProvideFunction(state) { + return props => { + const current = useProvided(props, 'locale', state.current); + const fallback = useProvided(props, 'fallback', state.fallback); + const messages = useProvided(props, 'messages', state.messages); + return { + name: 'vuetify', + current, + fallback, + messages, + t: createTranslateFunction(current, fallback, messages), + n: createNumberFunction(current, fallback), + provide: createProvideFunction({ + current, + fallback, + messages + }) + }; + }; +} +function createVuetifyAdapter(options) { + const current = shallowRef$1(options?.locale ?? 'en'); + const fallback = shallowRef$1(options?.fallback ?? 'en'); + const messages = ref$2({ + en, + ...options?.messages + }); + return { + name: 'vuetify', + current, + fallback, + messages, + t: createTranslateFunction(current, fallback, messages), + n: createNumberFunction(current, fallback), + provide: createProvideFunction({ + current, + fallback, + messages + }) + }; +} + +// Utilities +const {computed: computed$4,inject: inject$5,provide: provide$1,ref: ref$1} = await importShared('vue'); +const LocaleSymbol = Symbol.for('vuetify:locale'); +function isLocaleInstance(obj) { + return obj.name != null; +} +function createLocale(options) { + const i18n = options?.adapter && isLocaleInstance(options?.adapter) ? options?.adapter : createVuetifyAdapter(options); + const rtl = createRtl(i18n, options); + return { + ...i18n, + ...rtl + }; +} +function useLocale() { + const locale = inject$5(LocaleSymbol); + if (!locale) throw new Error('[Vuetify] Could not find injected locale instance'); + return locale; +} +function provideLocale(props) { + const locale = inject$5(LocaleSymbol); + if (!locale) throw new Error('[Vuetify] Could not find injected locale instance'); + const i18n = locale.provide(props); + const rtl = provideRtl(i18n, locale.rtl, props); + const data = { + ...i18n, + ...rtl + }; + provide$1(LocaleSymbol, data); + return data; +} +function genDefaults$3() { + return { + af: false, + ar: true, + bg: false, + ca: false, + ckb: false, + cs: false, + de: false, + el: false, + en: false, + es: false, + et: false, + fa: true, + fi: false, + fr: false, + hr: false, + hu: false, + he: true, + id: false, + it: false, + ja: false, + km: false, + ko: false, + lv: false, + lt: false, + nl: false, + no: false, + pl: false, + pt: false, + ro: false, + ru: false, + sk: false, + sl: false, + srCyrl: false, + srLatn: false, + sv: false, + th: false, + tr: false, + az: false, + uk: false, + vi: false, + zhHans: false, + zhHant: false + }; +} +function createRtl(i18n, options) { + const rtl = ref$1(options?.rtl ?? genDefaults$3()); + const isRtl = computed$4(() => rtl.value[i18n.current.value] ?? false); + return { + isRtl, + rtl, + rtlClasses: computed$4(() => `v-locale--is-${isRtl.value ? 'rtl' : 'ltr'}`) + }; +} +function provideRtl(locale, rtl, props) { + const isRtl = computed$4(() => props.rtl ?? rtl.value[locale.current.value] ?? false); + return { + isRtl, + rtl, + rtlClasses: computed$4(() => `v-locale--is-${isRtl.value ? 'rtl' : 'ltr'}`) + }; +} +function useRtl() { + const locale = inject$5(LocaleSymbol); + if (!locale) throw new Error('[Vuetify] Could not find injected rtl instance'); + return { + isRtl: locale.isRtl, + rtlClasses: locale.rtlClasses + }; +} + +// Utilities +const {computed: computed$3,inject: inject$4,provide,ref,watch: watch$1,watchEffect: watchEffect$1} = await importShared('vue'); +const ThemeSymbol = Symbol.for('vuetify:theme'); +const makeThemeProps = propsFactory({ + theme: String +}, 'theme'); +function genDefaults$2() { + return { + defaultTheme: 'light', + variations: { + colors: [], + lighten: 0, + darken: 0 + }, + themes: { + light: { + dark: false, + colors: { + background: '#FFFFFF', + surface: '#FFFFFF', + 'surface-bright': '#FFFFFF', + 'surface-light': '#EEEEEE', + 'surface-variant': '#424242', + 'on-surface-variant': '#EEEEEE', + primary: '#1867C0', + 'primary-darken-1': '#1F5592', + secondary: '#48A9A6', + 'secondary-darken-1': '#018786', + error: '#B00020', + info: '#2196F3', + success: '#4CAF50', + warning: '#FB8C00' + }, + variables: { + 'border-color': '#000000', + 'border-opacity': 0.12, + 'high-emphasis-opacity': 0.87, + 'medium-emphasis-opacity': 0.60, + 'disabled-opacity': 0.38, + 'idle-opacity': 0.04, + 'hover-opacity': 0.04, + 'focus-opacity': 0.12, + 'selected-opacity': 0.08, + 'activated-opacity': 0.12, + 'pressed-opacity': 0.12, + 'dragged-opacity': 0.08, + 'theme-kbd': '#212529', + 'theme-on-kbd': '#FFFFFF', + 'theme-code': '#F5F5F5', + 'theme-on-code': '#000000' + } + }, + dark: { + dark: true, + colors: { + background: '#121212', + surface: '#212121', + 'surface-bright': '#ccbfd6', + 'surface-light': '#424242', + 'surface-variant': '#a3a3a3', + 'on-surface-variant': '#424242', + primary: '#2196F3', + 'primary-darken-1': '#277CC1', + secondary: '#54B6B2', + 'secondary-darken-1': '#48A9A6', + error: '#CF6679', + info: '#2196F3', + success: '#4CAF50', + warning: '#FB8C00' + }, + variables: { + 'border-color': '#FFFFFF', + 'border-opacity': 0.12, + 'high-emphasis-opacity': 1, + 'medium-emphasis-opacity': 0.70, + 'disabled-opacity': 0.50, + 'idle-opacity': 0.10, + 'hover-opacity': 0.04, + 'focus-opacity': 0.12, + 'selected-opacity': 0.08, + 'activated-opacity': 0.12, + 'pressed-opacity': 0.16, + 'dragged-opacity': 0.08, + 'theme-kbd': '#212529', + 'theme-on-kbd': '#FFFFFF', + 'theme-code': '#343434', + 'theme-on-code': '#CCCCCC' + } + } + } + }; +} +function parseThemeOptions() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : genDefaults$2(); + const defaults = genDefaults$2(); + if (!options) return { + ...defaults, + isDisabled: true + }; + const themes = {}; + for (const [key, theme] of Object.entries(options.themes ?? {})) { + const defaultTheme = theme.dark || key === 'dark' ? defaults.themes?.dark : defaults.themes?.light; + themes[key] = mergeDeep(defaultTheme, theme); + } + return mergeDeep(defaults, { + ...options, + themes + }); +} + +// Composables +function createTheme(options) { + const parsedOptions = parseThemeOptions(options); + const name = ref(parsedOptions.defaultTheme); + const themes = ref(parsedOptions.themes); + const computedThemes = computed$3(() => { + const acc = {}; + for (const [name, original] of Object.entries(themes.value)) { + const theme = acc[name] = { + ...original, + colors: { + ...original.colors + } + }; + if (parsedOptions.variations) { + for (const name of parsedOptions.variations.colors) { + const color = theme.colors[name]; + if (!color) continue; + for (const variation of ['lighten', 'darken']) { + const fn = variation === 'lighten' ? lighten : darken; + for (const amount of createRange(parsedOptions.variations[variation], 1)) { + theme.colors[`${name}-${variation}-${amount}`] = RGBtoHex(fn(parseColor(color), amount)); + } + } + } + } + for (const color of Object.keys(theme.colors)) { + if (/^on-[a-z]/.test(color) || theme.colors[`on-${color}`]) continue; + const onColor = `on-${color}`; + const colorVal = parseColor(theme.colors[color]); + theme.colors[onColor] = getForeground(colorVal); + } + } + return acc; + }); + const current = computed$3(() => computedThemes.value[name.value]); + const styles = computed$3(() => { + const lines = []; + if (current.value?.dark) { + createCssClass(lines, ':root', ['color-scheme: dark']); + } + createCssClass(lines, ':root', genCssVariables(current.value)); + for (const [themeName, theme] of Object.entries(computedThemes.value)) { + createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)]); + } + const bgLines = []; + const fgLines = []; + const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors))); + for (const key of colors) { + if (/^on-[a-z]/.test(key)) { + createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`]); + } else { + createCssClass(bgLines, `.bg-${key}`, [`--v-theme-overlay-multiplier: var(--v-theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--v-theme-${key})) !important`, `color: rgb(var(--v-theme-on-${key})) !important`]); + createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`]); + createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`]); + } + } + lines.push(...bgLines, ...fgLines); + return lines.map((str, i) => i === 0 ? str : ` ${str}`).join(''); + }); + function getHead() { + return { + style: [{ + children: styles.value, + id: 'vuetify-theme-stylesheet', + nonce: parsedOptions.cspNonce || false + }] + }; + } + function install(app) { + if (parsedOptions.isDisabled) return; + const head = app._context.provides.usehead; + if (head) { + if (head.push) { + const entry = head.push(getHead); + if (IN_BROWSER) { + watch$1(styles, () => { + entry.patch(getHead); + }); + } + } else { + if (IN_BROWSER) { + head.addHeadObjs(computed$3(getHead)); + watchEffect$1(() => head.updateDOM()); + } else { + head.addHeadObjs(getHead()); + } + } + } else { + let styleEl = IN_BROWSER ? document.getElementById('vuetify-theme-stylesheet') : null; + if (IN_BROWSER) { + watch$1(styles, updateStyles, { + immediate: true + }); + } else { + updateStyles(); + } + function updateStyles() { + if (typeof document !== 'undefined' && !styleEl) { + const el = document.createElement('style'); + el.type = 'text/css'; + el.id = 'vuetify-theme-stylesheet'; + if (parsedOptions.cspNonce) el.setAttribute('nonce', parsedOptions.cspNonce); + styleEl = el; + document.head.appendChild(styleEl); + } + if (styleEl) styleEl.innerHTML = styles.value; + } + } + } + const themeClasses = computed$3(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`); + return { + install, + isDisabled: parsedOptions.isDisabled, + name, + themes, + current, + computedThemes, + themeClasses, + styles, + global: { + name, + current + } + }; +} +function provideTheme(props) { + getCurrentInstance('provideTheme'); + const theme = inject$4(ThemeSymbol, null); + if (!theme) throw new Error('Could not find Vuetify theme injection'); + const name = computed$3(() => { + return props.theme ?? theme.name.value; + }); + const current = computed$3(() => theme.themes.value[name.value]); + const themeClasses = computed$3(() => theme.isDisabled ? undefined : `v-theme--${name.value}`); + const newTheme = { + ...theme, + name, + current, + themeClasses + }; + provide(ThemeSymbol, newTheme); + return newTheme; +} +function useTheme() { + getCurrentInstance('useTheme'); + const theme = inject$4(ThemeSymbol, null); + if (!theme) throw new Error('Could not find Vuetify theme injection'); + return theme; +} +function createCssClass(lines, selector, content) { + lines.push(`${selector} {\n`, ...content.map(line => ` ${line};\n`), '}\n'); +} +function genCssVariables(theme) { + const lightOverlay = theme.dark ? 2 : 1; + const darkOverlay = theme.dark ? 1 : 2; + const variables = []; + for (const [key, value] of Object.entries(theme.colors)) { + const rgb = parseColor(value); + variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`); + if (!key.startsWith('on-')) { + variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`); + } + } + for (const [key, value] of Object.entries(theme.variables)) { + const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined; + const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined; + variables.push(`--v-${key}: ${rgb ?? value}`); + } + return variables; +} + +const {h} = await importShared('vue'); + + +// Types + +const aliases = { + collapse: 'mdi-chevron-up', + complete: 'mdi-check', + cancel: 'mdi-close-circle', + close: 'mdi-close', + delete: 'mdi-close-circle', + // delete (e.g. v-chip close) + clear: 'mdi-close-circle', + success: 'mdi-check-circle', + info: 'mdi-information', + warning: 'mdi-alert-circle', + error: 'mdi-close-circle', + prev: 'mdi-chevron-left', + next: 'mdi-chevron-right', + checkboxOn: 'mdi-checkbox-marked', + checkboxOff: 'mdi-checkbox-blank-outline', + checkboxIndeterminate: 'mdi-minus-box', + delimiter: 'mdi-circle', + // for carousel + sortAsc: 'mdi-arrow-up', + sortDesc: 'mdi-arrow-down', + expand: 'mdi-chevron-down', + menu: 'mdi-menu', + subgroup: 'mdi-menu-down', + dropdown: 'mdi-menu-down', + radioOn: 'mdi-radiobox-marked', + radioOff: 'mdi-radiobox-blank', + edit: 'mdi-pencil', + ratingEmpty: 'mdi-star-outline', + ratingFull: 'mdi-star', + ratingHalf: 'mdi-star-half-full', + loading: 'mdi-cached', + first: 'mdi-page-first', + last: 'mdi-page-last', + unfold: 'mdi-unfold-more-horizontal', + file: 'mdi-paperclip', + plus: 'mdi-plus', + minus: 'mdi-minus', + calendar: 'mdi-calendar', + treeviewCollapse: 'mdi-menu-down', + treeviewExpand: 'mdi-menu-right', + eyeDropper: 'mdi-eyedropper' +}; +const mdi = { + // Not using mergeProps here, functional components merge props by default (?) + component: props => h(VClassIcon, { + ...props, + class: 'mdi' + }) +}; + +const {mergeProps:_mergeProps,createVNode:_createVNode} = await importShared('vue'); +const {computed: computed$2,inject: inject$3,unref} = await importShared('vue'); +const IconValue = [String, Function, Object, Array]; +const IconSymbol = Symbol.for('vuetify:icons'); +const makeIconProps = propsFactory({ + icon: { + type: IconValue + }, + // Could not remove this and use makeTagProps, types complained because it is not required + tag: { + type: String, + required: true + } +}, 'icon'); +const VComponentIcon = genericComponent()({ + name: 'VComponentIcon', + props: makeIconProps(), + setup(props, _ref) { + let { + slots + } = _ref; + return () => { + const Icon = props.icon; + return _createVNode(props.tag, null, { + default: () => [props.icon ? _createVNode(Icon, null, null) : slots.default?.()] + }); + }; + } +}); +const VSvgIcon = defineComponent({ + name: 'VSvgIcon', + inheritAttrs: false, + props: makeIconProps(), + setup(props, _ref2) { + let { + attrs + } = _ref2; + return () => { + return _createVNode(props.tag, _mergeProps(attrs, { + "style": null + }), { + default: () => [_createVNode("svg", { + "class": "v-icon__svg", + "xmlns": "http://www.w3.org/2000/svg", + "viewBox": "0 0 24 24", + "role": "img", + "aria-hidden": "true" + }, [Array.isArray(props.icon) ? props.icon.map(path => Array.isArray(path) ? _createVNode("path", { + "d": path[0], + "fill-opacity": path[1] + }, null) : _createVNode("path", { + "d": path + }, null)) : _createVNode("path", { + "d": props.icon + }, null)])] + }); + }; + } +}); +const VLigatureIcon = defineComponent({ + name: 'VLigatureIcon', + props: makeIconProps(), + setup(props) { + return () => { + return _createVNode(props.tag, null, { + default: () => [props.icon] + }); + }; + } +}); +const VClassIcon = defineComponent({ + name: 'VClassIcon', + props: makeIconProps(), + setup(props) { + return () => { + return _createVNode(props.tag, { + "class": props.icon + }, null); + }; + } +}); +function genDefaults$1() { + return { + svg: { + component: VSvgIcon + }, + class: { + component: VClassIcon + } + }; +} + +// Composables +function createIcons(options) { + const sets = genDefaults$1(); + const defaultSet = options?.defaultSet ?? 'mdi'; + if (defaultSet === 'mdi' && !sets.mdi) { + sets.mdi = mdi; + } + return mergeDeep({ + defaultSet, + sets, + aliases: { + ...aliases, + /* eslint-disable max-len */ + vuetify: ['M8.2241 14.2009L12 21L22 3H14.4459L8.2241 14.2009Z', ['M7.26303 12.4733L7.00113 12L2 3H12.5261C12.5261 3 12.5261 3 12.5261 3L7.26303 12.4733Z', 0.6]], + 'vuetify-outline': 'svg:M7.26 12.47 12.53 3H2L7.26 12.47ZM14.45 3 8.22 14.2 12 21 22 3H14.45ZM18.6 5 12 16.88 10.51 14.2 15.62 5ZM7.26 8.35 5.4 5H9.13L7.26 8.35Z', + 'vuetify-play': ['m6.376 13.184-4.11-7.192C1.505 4.66 2.467 3 4.003 3h8.532l-.953 1.576-.006.01-.396.677c-.429.732-.214 1.507.194 2.015.404.503 1.092.878 1.869.806a3.72 3.72 0 0 1 1.005.022c.276.053.434.143.523.237.138.146.38.635-.25 2.09-.893 1.63-1.553 1.722-1.847 1.677-.213-.033-.468-.158-.756-.406a4.95 4.95 0 0 1-.8-.927c-.39-.564-1.04-.84-1.66-.846-.625-.006-1.316.27-1.693.921l-.478.826-.911 1.506Z', ['M9.093 11.552c.046-.079.144-.15.32-.148a.53.53 0 0 1 .43.207c.285.414.636.847 1.046 1.2.405.35.914.662 1.516.754 1.334.205 2.502-.698 3.48-2.495l.014-.028.013-.03c.687-1.574.774-2.852-.005-3.675-.37-.391-.861-.586-1.333-.676a5.243 5.243 0 0 0-1.447-.044c-.173.016-.393-.073-.54-.257-.145-.18-.127-.316-.082-.392l.393-.672L14.287 3h5.71c1.536 0 2.499 1.659 1.737 2.992l-7.997 13.996c-.768 1.344-2.706 1.344-3.473 0l-3.037-5.314 1.377-2.278.004-.006.004-.007.481-.831Z', 0.6]] + /* eslint-enable max-len */ + } + }, options); +} +const useIcon = props => { + const icons = inject$3(IconSymbol); + if (!icons) throw new Error('Missing Vuetify Icons provide!'); + const iconData = computed$2(() => { + const iconAlias = unref(props); + if (!iconAlias) return { + component: VComponentIcon + }; + let icon = iconAlias; + if (typeof icon === 'string') { + icon = icon.trim(); + if (icon.startsWith('$')) { + icon = icons.aliases?.[icon.slice(1)]; + } + } + if (!icon) consoleWarn(`Could not find aliased icon "${iconAlias}"`); + if (Array.isArray(icon)) { + return { + component: VSvgIcon, + icon + }; + } else if (typeof icon !== 'string') { + return { + component: VComponentIcon, + icon + }; + } + const iconSetName = Object.keys(icons.sets).find(setName => typeof icon === 'string' && icon.startsWith(`${setName}:`)); + const iconName = iconSetName ? icon.slice(iconSetName.length + 1) : icon; + const iconSet = icons.sets[iconSetName ?? icons.defaultSet]; + return { + component: iconSet.component, + icon: iconName + }; + }); + return { + iconData + }; +}; + +// Utilities +const {computed: computed$1,inject: inject$2,reactive: reactive$1,shallowRef,toRefs,watchEffect} = await importShared('vue'); +const breakpoints = ['sm', 'md', 'lg', 'xl', 'xxl']; // no xs + +const DisplaySymbol = Symbol.for('vuetify:display'); +const defaultDisplayOptions = { + mobileBreakpoint: 'lg', + thresholds: { + xs: 0, + sm: 600, + md: 960, + lg: 1280, + xl: 1920, + xxl: 2560 + } +}; +const parseDisplayOptions = function () { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultDisplayOptions; + return mergeDeep(defaultDisplayOptions, options); +}; +function getClientWidth(ssr) { + return IN_BROWSER && !ssr ? window.innerWidth : typeof ssr === 'object' && ssr.clientWidth || 0; +} +function getClientHeight(ssr) { + return IN_BROWSER && !ssr ? window.innerHeight : typeof ssr === 'object' && ssr.clientHeight || 0; +} +function getPlatform(ssr) { + const userAgent = IN_BROWSER && !ssr ? window.navigator.userAgent : 'ssr'; + function match(regexp) { + return Boolean(userAgent.match(regexp)); + } + const android = match(/android/i); + const ios = match(/iphone|ipad|ipod/i); + const cordova = match(/cordova/i); + const electron = match(/electron/i); + const chrome = match(/chrome/i); + const edge = match(/edge/i); + const firefox = match(/firefox/i); + const opera = match(/opera/i); + const win = match(/win/i); + const mac = match(/mac/i); + const linux = match(/linux/i); + return { + android, + ios, + cordova, + electron, + chrome, + edge, + firefox, + opera, + win, + mac, + linux, + touch: SUPPORTS_TOUCH, + ssr: userAgent === 'ssr' + }; +} +function createDisplay(options, ssr) { + const { + thresholds, + mobileBreakpoint + } = parseDisplayOptions(options); + const height = shallowRef(getClientHeight(ssr)); + const platform = shallowRef(getPlatform(ssr)); + const state = reactive$1({}); + const width = shallowRef(getClientWidth(ssr)); + function updateSize() { + height.value = getClientHeight(); + width.value = getClientWidth(); + } + function update() { + updateSize(); + platform.value = getPlatform(); + } + + // eslint-disable-next-line max-statements + watchEffect(() => { + const xs = width.value < thresholds.sm; + const sm = width.value < thresholds.md && !xs; + const md = width.value < thresholds.lg && !(sm || xs); + const lg = width.value < thresholds.xl && !(md || sm || xs); + const xl = width.value < thresholds.xxl && !(lg || md || sm || xs); + const xxl = width.value >= thresholds.xxl; + const name = xs ? 'xs' : sm ? 'sm' : md ? 'md' : lg ? 'lg' : xl ? 'xl' : 'xxl'; + const breakpointValue = typeof mobileBreakpoint === 'number' ? mobileBreakpoint : thresholds[mobileBreakpoint]; + const mobile = width.value < breakpointValue; + state.xs = xs; + state.sm = sm; + state.md = md; + state.lg = lg; + state.xl = xl; + state.xxl = xxl; + state.smAndUp = !xs; + state.mdAndUp = !(xs || sm); + state.lgAndUp = !(xs || sm || md); + state.xlAndUp = !(xs || sm || md || lg); + state.smAndDown = !(md || lg || xl || xxl); + state.mdAndDown = !(lg || xl || xxl); + state.lgAndDown = !(xl || xxl); + state.xlAndDown = !xxl; + state.name = name; + state.height = height.value; + state.width = width.value; + state.mobile = mobile; + state.mobileBreakpoint = mobileBreakpoint; + state.platform = platform.value; + state.thresholds = thresholds; + }); + if (IN_BROWSER) { + window.addEventListener('resize', updateSize, { + passive: true + }); + } + return { + ...toRefs(state), + update, + ssr: !!ssr + }; +} +const makeDisplayProps = propsFactory({ + mobile: { + type: Boolean, + default: false + }, + mobileBreakpoint: [Number, String] +}, 'display'); +function useDisplay() { + let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + const display = inject$2(DisplaySymbol); + if (!display) throw new Error('Could not find Vuetify display injection'); + const mobile = computed$1(() => { + if (props.mobile != null) return props.mobile; + if (!props.mobileBreakpoint) return display.mobile.value; + const breakpointValue = typeof props.mobileBreakpoint === 'number' ? props.mobileBreakpoint : display.thresholds.value[props.mobileBreakpoint]; + return display.width.value < breakpointValue; + }); + const displayClasses = computed$1(() => { + if (!name) return {}; + return { + [`${name}--mobile`]: mobile.value + }; + }); + return { + ...display, + displayClasses, + mobile + }; +} + +// Utilities +const {computed,inject: inject$1} = await importShared('vue'); +const GoToSymbol = Symbol.for('vuetify:goto'); +function genDefaults() { + return { + container: undefined, + duration: 300, + layout: false, + offset: 0, + easing: 'easeInOutCubic', + patterns: { + linear: t => t, + easeInQuad: t => t ** 2, + easeOutQuad: t => t * (2 - t), + easeInOutQuad: t => t < 0.5 ? 2 * t ** 2 : -1 + (4 - 2 * t) * t, + easeInCubic: t => t ** 3, + easeOutCubic: t => --t ** 3 + 1, + easeInOutCubic: t => t < 0.5 ? 4 * t ** 3 : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1, + easeInQuart: t => t ** 4, + easeOutQuart: t => 1 - --t ** 4, + easeInOutQuart: t => t < 0.5 ? 8 * t ** 4 : 1 - 8 * --t ** 4, + easeInQuint: t => t ** 5, + easeOutQuint: t => 1 + --t ** 5, + easeInOutQuint: t => t < 0.5 ? 16 * t ** 5 : 1 + 16 * --t ** 5 + } + }; +} +function getContainer(el) { + return getTarget(el) ?? (document.scrollingElement || document.body); +} +function getTarget(el) { + return typeof el === 'string' ? document.querySelector(el) : refElement(el); +} +function getOffset(target, horizontal, rtl) { + if (typeof target === 'number') return horizontal && rtl ? -target : target; + let el = getTarget(target); + let totalOffset = 0; + while (el) { + totalOffset += horizontal ? el.offsetLeft : el.offsetTop; + el = el.offsetParent; + } + return totalOffset; +} +function createGoTo(options, locale) { + return { + rtl: locale.isRtl, + options: mergeDeep(genDefaults(), options) + }; +} +async function scrollTo(_target, _options, horizontal, goTo) { + const property = horizontal ? 'scrollLeft' : 'scrollTop'; + const options = mergeDeep(goTo?.options ?? genDefaults(), _options); + const rtl = goTo?.rtl.value; + const target = (typeof _target === 'number' ? _target : getTarget(_target)) ?? 0; + const container = options.container === 'parent' && target instanceof HTMLElement ? target.parentElement : getContainer(options.container); + const ease = typeof options.easing === 'function' ? options.easing : options.patterns[options.easing]; + if (!ease) throw new TypeError(`Easing function "${options.easing}" not found.`); + let targetLocation; + if (typeof target === 'number') { + targetLocation = getOffset(target, horizontal, rtl); + } else { + targetLocation = getOffset(target, horizontal, rtl) - getOffset(container, horizontal, rtl); + if (options.layout) { + const styles = window.getComputedStyle(target); + const layoutOffset = styles.getPropertyValue('--v-layout-top'); + if (layoutOffset) targetLocation -= parseInt(layoutOffset, 10); + } + } + targetLocation += options.offset; + targetLocation = clampTarget(container, targetLocation, !!rtl, !!horizontal); + const startLocation = container[property] ?? 0; + if (targetLocation === startLocation) return Promise.resolve(targetLocation); + const startTime = performance.now(); + return new Promise(resolve => requestAnimationFrame(function step(currentTime) { + const timeElapsed = currentTime - startTime; + const progress = timeElapsed / options.duration; + const location = Math.floor(startLocation + (targetLocation - startLocation) * ease(clamp(progress, 0, 1))); + container[property] = location; + + // Allow for some jitter if target time has elapsed + if (progress >= 1 && Math.abs(location - container[property]) < 10) { + return resolve(targetLocation); + } else if (progress > 2) { + // The target might not be reachable + consoleWarn('Scroll target is not reachable'); + return resolve(container[property]); + } + requestAnimationFrame(step); + })); +} +function useGoTo() { + let _options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const goToInstance = inject$1(GoToSymbol); + const { + isRtl + } = useRtl(); + if (!goToInstance) throw new Error('[Vuetify] Could not find injected goto instance'); + const goTo = { + ...goToInstance, + // can be set via VLocaleProvider + rtl: computed(() => goToInstance.rtl.value || isRtl.value) + }; + async function go(target, options) { + return scrollTo(target, mergeDeep(_options, options), false, goTo); + } + go.horizontal = async (target, options) => { + return scrollTo(target, mergeDeep(_options, options), true, goTo); + }; + return go; +} + +/** + * Clamp target value to achieve a smooth scroll animation + * when the value goes outside the scroll container size + */ +function clampTarget(container, value, rtl, horizontal) { + const { + scrollWidth, + scrollHeight + } = container; + const [containerWidth, containerHeight] = container === document.scrollingElement ? [window.innerWidth, window.innerHeight] : [container.offsetWidth, container.offsetHeight]; + let min; + let max; + if (horizontal) { + if (rtl) { + min = -(scrollWidth - containerWidth); + max = 0; + } else { + min = 0; + max = scrollWidth - containerWidth; + } + } else { + min = 0; + max = scrollHeight + -containerHeight; + } + return Math.max(Math.min(value, max), min); +} + +// Utilities +const firstDay = { + '001': 1, + AD: 1, + AE: 6, + AF: 6, + AG: 0, + AI: 1, + AL: 1, + AM: 1, + AN: 1, + AR: 1, + AS: 0, + AT: 1, + AU: 1, + AX: 1, + AZ: 1, + BA: 1, + BD: 0, + BE: 1, + BG: 1, + BH: 6, + BM: 1, + BN: 1, + BR: 0, + BS: 0, + BT: 0, + BW: 0, + BY: 1, + BZ: 0, + CA: 0, + CH: 1, + CL: 1, + CM: 1, + CN: 1, + CO: 0, + CR: 1, + CY: 1, + CZ: 1, + DE: 1, + DJ: 6, + DK: 1, + DM: 0, + DO: 0, + DZ: 6, + EC: 1, + EE: 1, + EG: 6, + ES: 1, + ET: 0, + FI: 1, + FJ: 1, + FO: 1, + FR: 1, + GB: 1, + 'GB-alt-variant': 0, + GE: 1, + GF: 1, + GP: 1, + GR: 1, + GT: 0, + GU: 0, + HK: 0, + HN: 0, + HR: 1, + HU: 1, + ID: 0, + IE: 1, + IL: 0, + IN: 0, + IQ: 6, + IR: 6, + IS: 1, + IT: 1, + JM: 0, + JO: 6, + JP: 0, + KE: 0, + KG: 1, + KH: 0, + KR: 0, + KW: 6, + KZ: 1, + LA: 0, + LB: 1, + LI: 1, + LK: 1, + LT: 1, + LU: 1, + LV: 1, + LY: 6, + MC: 1, + MD: 1, + ME: 1, + MH: 0, + MK: 1, + MM: 0, + MN: 1, + MO: 0, + MQ: 1, + MT: 0, + MV: 5, + MX: 0, + MY: 1, + MZ: 0, + NI: 0, + NL: 1, + NO: 1, + NP: 0, + NZ: 1, + OM: 6, + PA: 0, + PE: 0, + PH: 0, + PK: 0, + PL: 1, + PR: 0, + PT: 0, + PY: 0, + QA: 6, + RE: 1, + RO: 1, + RS: 1, + RU: 1, + SA: 0, + SD: 6, + SE: 1, + SG: 0, + SI: 1, + SK: 1, + SM: 1, + SV: 0, + SY: 6, + TH: 0, + TJ: 1, + TM: 1, + TR: 1, + TT: 0, + TW: 0, + UA: 1, + UM: 0, + US: 0, + UY: 1, + UZ: 1, + VA: 1, + VE: 0, + VI: 0, + VN: 1, + WS: 0, + XK: 1, + YE: 0, + ZA: 0, + ZW: 0 +}; +function getWeekArray(date, locale, firstDayOfWeek) { + const weeks = []; + let currentWeek = []; + const firstDayOfMonth = startOfMonth(date); + const lastDayOfMonth = endOfMonth(date); + const first = firstDayOfWeek ?? firstDay[locale.slice(-2).toUpperCase()] ?? 0; + const firstDayWeekIndex = (firstDayOfMonth.getDay() - first + 7) % 7; + const lastDayWeekIndex = (lastDayOfMonth.getDay() - first + 7) % 7; + for (let i = 0; i < firstDayWeekIndex; i++) { + const adjacentDay = new Date(firstDayOfMonth); + adjacentDay.setDate(adjacentDay.getDate() - (firstDayWeekIndex - i)); + currentWeek.push(adjacentDay); + } + for (let i = 1; i <= lastDayOfMonth.getDate(); i++) { + const day = new Date(date.getFullYear(), date.getMonth(), i); + + // Add the day to the current week + currentWeek.push(day); + + // If the current week has 7 days, add it to the weeks array and start a new week + if (currentWeek.length === 7) { + weeks.push(currentWeek); + currentWeek = []; + } + } + for (let i = 1; i < 7 - lastDayWeekIndex; i++) { + const adjacentDay = new Date(lastDayOfMonth); + adjacentDay.setDate(adjacentDay.getDate() + i); + currentWeek.push(adjacentDay); + } + if (currentWeek.length > 0) { + weeks.push(currentWeek); + } + return weeks; +} +function startOfWeek(date, locale, firstDayOfWeek) { + const day = firstDayOfWeek ?? firstDay[locale.slice(-2).toUpperCase()] ?? 0; + const d = new Date(date); + while (d.getDay() !== day) { + d.setDate(d.getDate() - 1); + } + return d; +} +function endOfWeek(date, locale) { + const d = new Date(date); + const lastDay = ((firstDay[locale.slice(-2).toUpperCase()] ?? 0) + 6) % 7; + while (d.getDay() !== lastDay) { + d.setDate(d.getDate() + 1); + } + return d; +} +function startOfMonth(date) { + return new Date(date.getFullYear(), date.getMonth(), 1); +} +function endOfMonth(date) { + return new Date(date.getFullYear(), date.getMonth() + 1, 0); +} +function parseLocalDate(value) { + const parts = value.split('-').map(Number); + + // new Date() uses local time zone when passing individual date component values + return new Date(parts[0], parts[1] - 1, parts[2]); +} +const _YYYMMDD = /^([12]\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\d|3[01]))$/; +function date(value) { + if (value == null) return new Date(); + if (value instanceof Date) return value; + if (typeof value === 'string') { + let parsed; + if (_YYYMMDD.test(value)) { + return parseLocalDate(value); + } else { + parsed = Date.parse(value); + } + if (!isNaN(parsed)) return new Date(parsed); + } + return null; +} +const sundayJanuarySecond2000 = new Date(2000, 0, 2); +function getWeekdays(locale, firstDayOfWeek) { + const daysFromSunday = firstDayOfWeek ?? firstDay[locale.slice(-2).toUpperCase()] ?? 0; + return createRange(7).map(i => { + const weekday = new Date(sundayJanuarySecond2000); + weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i); + return new Intl.DateTimeFormat(locale, { + weekday: 'narrow' + }).format(weekday); + }); +} +function format(value, formatString, locale, formats) { + const newDate = date(value) ?? new Date(); + const customFormat = formats?.[formatString]; + if (typeof customFormat === 'function') { + return customFormat(newDate, formatString, locale); + } + let options = {}; + switch (formatString) { + case 'fullDate': + options = { + year: 'numeric', + month: 'long', + day: 'numeric' + }; + break; + case 'fullDateWithWeekday': + options = { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + }; + break; + case 'normalDate': + const day = newDate.getDate(); + const month = new Intl.DateTimeFormat(locale, { + month: 'long' + }).format(newDate); + return `${day} ${month}`; + case 'normalDateWithWeekday': + options = { + weekday: 'short', + day: 'numeric', + month: 'short' + }; + break; + case 'shortDate': + options = { + month: 'short', + day: 'numeric' + }; + break; + case 'year': + options = { + year: 'numeric' + }; + break; + case 'month': + options = { + month: 'long' + }; + break; + case 'monthShort': + options = { + month: 'short' + }; + break; + case 'monthAndYear': + options = { + month: 'long', + year: 'numeric' + }; + break; + case 'monthAndDate': + options = { + month: 'long', + day: 'numeric' + }; + break; + case 'weekday': + options = { + weekday: 'long' + }; + break; + case 'weekdayShort': + options = { + weekday: 'short' + }; + break; + case 'dayOfMonth': + return new Intl.NumberFormat(locale).format(newDate.getDate()); + case 'hours12h': + options = { + hour: 'numeric', + hour12: true + }; + break; + case 'hours24h': + options = { + hour: 'numeric', + hour12: false + }; + break; + case 'minutes': + options = { + minute: 'numeric' + }; + break; + case 'seconds': + options = { + second: 'numeric' + }; + break; + case 'fullTime': + options = { + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: true + }; + break; + case 'fullTime12h': + options = { + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: true + }; + break; + case 'fullTime24h': + options = { + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false + }; + break; + case 'fullDateTime': + options = { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: true + }; + break; + case 'fullDateTime12h': + options = { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: true + }; + break; + case 'fullDateTime24h': + options = { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false + }; + break; + case 'keyboardDate': + options = { + year: 'numeric', + month: '2-digit', + day: '2-digit' + }; + break; + case 'keyboardDateTime': + options = { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false + }; + break; + case 'keyboardDateTime12h': + options = { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: true + }; + break; + case 'keyboardDateTime24h': + options = { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false + }; + break; + default: + options = customFormat ?? { + timeZone: 'UTC', + timeZoneName: 'short' + }; + } + return new Intl.DateTimeFormat(locale, options).format(newDate); +} +function toISO(adapter, value) { + const date = adapter.toJsDate(value); + const year = date.getFullYear(); + const month = padStart(String(date.getMonth() + 1), 2, '0'); + const day = padStart(String(date.getDate()), 2, '0'); + return `${year}-${month}-${day}`; +} +function parseISO(value) { + const [year, month, day] = value.split('-').map(Number); + return new Date(year, month - 1, day); +} +function addMinutes(date, amount) { + const d = new Date(date); + d.setMinutes(d.getMinutes() + amount); + return d; +} +function addHours(date, amount) { + const d = new Date(date); + d.setHours(d.getHours() + amount); + return d; +} +function addDays(date, amount) { + const d = new Date(date); + d.setDate(d.getDate() + amount); + return d; +} +function addWeeks(date, amount) { + const d = new Date(date); + d.setDate(d.getDate() + amount * 7); + return d; +} +function addMonths(date, amount) { + const d = new Date(date); + d.setDate(1); + d.setMonth(d.getMonth() + amount); + return d; +} +function getYear(date) { + return date.getFullYear(); +} +function getMonth(date) { + return date.getMonth(); +} +function getDate(date) { + return date.getDate(); +} +function getNextMonth(date) { + return new Date(date.getFullYear(), date.getMonth() + 1, 1); +} +function getPreviousMonth(date) { + return new Date(date.getFullYear(), date.getMonth() - 1, 1); +} +function getHours(date) { + return date.getHours(); +} +function getMinutes(date) { + return date.getMinutes(); +} +function startOfYear(date) { + return new Date(date.getFullYear(), 0, 1); +} +function endOfYear(date) { + return new Date(date.getFullYear(), 11, 31); +} +function isWithinRange(date, range) { + return isAfter(date, range[0]) && isBefore(date, range[1]); +} +function isValid(date) { + const d = new Date(date); + return d instanceof Date && !isNaN(d.getTime()); +} +function isAfter(date, comparing) { + return date.getTime() > comparing.getTime(); +} +function isAfterDay(date, comparing) { + return isAfter(startOfDay(date), startOfDay(comparing)); +} +function isBefore(date, comparing) { + return date.getTime() < comparing.getTime(); +} +function isEqual(date, comparing) { + return date.getTime() === comparing.getTime(); +} +function isSameDay(date, comparing) { + return date.getDate() === comparing.getDate() && date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear(); +} +function isSameMonth(date, comparing) { + return date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear(); +} +function isSameYear(date, comparing) { + return date.getFullYear() === comparing.getFullYear(); +} +function getDiff(date, comparing, unit) { + const d = new Date(date); + const c = new Date(comparing); + switch (unit) { + case 'years': + return d.getFullYear() - c.getFullYear(); + case 'quarters': + return Math.floor((d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12) / 4); + case 'months': + return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12; + case 'weeks': + return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24 * 7)); + case 'days': + return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24)); + case 'hours': + return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60)); + case 'minutes': + return Math.floor((d.getTime() - c.getTime()) / (1000 * 60)); + case 'seconds': + return Math.floor((d.getTime() - c.getTime()) / 1000); + default: + { + return d.getTime() - c.getTime(); + } + } +} +function setHours(date, count) { + const d = new Date(date); + d.setHours(count); + return d; +} +function setMinutes(date, count) { + const d = new Date(date); + d.setMinutes(count); + return d; +} +function setMonth(date, count) { + const d = new Date(date); + d.setMonth(count); + return d; +} +function setDate(date, day) { + const d = new Date(date); + d.setDate(day); + return d; +} +function setYear(date, year) { + const d = new Date(date); + d.setFullYear(year); + return d; +} +function startOfDay(date) { + return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0); +} +function endOfDay(date) { + return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999); +} +class VuetifyDateAdapter { + constructor(options) { + this.locale = options.locale; + this.formats = options.formats; + } + date(value) { + return date(value); + } + toJsDate(date) { + return date; + } + toISO(date) { + return toISO(this, date); + } + parseISO(date) { + return parseISO(date); + } + addMinutes(date, amount) { + return addMinutes(date, amount); + } + addHours(date, amount) { + return addHours(date, amount); + } + addDays(date, amount) { + return addDays(date, amount); + } + addWeeks(date, amount) { + return addWeeks(date, amount); + } + addMonths(date, amount) { + return addMonths(date, amount); + } + getWeekArray(date, firstDayOfWeek) { + return getWeekArray(date, this.locale, firstDayOfWeek ? Number(firstDayOfWeek) : undefined); + } + startOfWeek(date, firstDayOfWeek) { + return startOfWeek(date, this.locale, firstDayOfWeek ? Number(firstDayOfWeek) : undefined); + } + endOfWeek(date) { + return endOfWeek(date, this.locale); + } + startOfMonth(date) { + return startOfMonth(date); + } + endOfMonth(date) { + return endOfMonth(date); + } + format(date, formatString) { + return format(date, formatString, this.locale, this.formats); + } + isEqual(date, comparing) { + return isEqual(date, comparing); + } + isValid(date) { + return isValid(date); + } + isWithinRange(date, range) { + return isWithinRange(date, range); + } + isAfter(date, comparing) { + return isAfter(date, comparing); + } + isAfterDay(date, comparing) { + return isAfterDay(date, comparing); + } + isBefore(date, comparing) { + return !isAfter(date, comparing) && !isEqual(date, comparing); + } + isSameDay(date, comparing) { + return isSameDay(date, comparing); + } + isSameMonth(date, comparing) { + return isSameMonth(date, comparing); + } + isSameYear(date, comparing) { + return isSameYear(date, comparing); + } + setMinutes(date, count) { + return setMinutes(date, count); + } + setHours(date, count) { + return setHours(date, count); + } + setMonth(date, count) { + return setMonth(date, count); + } + setDate(date, day) { + return setDate(date, day); + } + setYear(date, year) { + return setYear(date, year); + } + getDiff(date, comparing, unit) { + return getDiff(date, comparing, unit); + } + getWeekdays(firstDayOfWeek) { + return getWeekdays(this.locale, firstDayOfWeek ? Number(firstDayOfWeek) : undefined); + } + getYear(date) { + return getYear(date); + } + getMonth(date) { + return getMonth(date); + } + getDate(date) { + return getDate(date); + } + getNextMonth(date) { + return getNextMonth(date); + } + getPreviousMonth(date) { + return getPreviousMonth(date); + } + getHours(date) { + return getHours(date); + } + getMinutes(date) { + return getMinutes(date); + } + startOfDay(date) { + return startOfDay(date); + } + endOfDay(date) { + return endOfDay(date); + } + startOfYear(date) { + return startOfYear(date); + } + endOfYear(date) { + return endOfYear(date); + } +} + +const {inject,reactive,watch} = await importShared('vue'); +const DateOptionsSymbol = Symbol.for('vuetify:date-options'); +const DateAdapterSymbol = Symbol.for('vuetify:date-adapter'); +function createDate(options, locale) { + const _options = mergeDeep({ + adapter: VuetifyDateAdapter, + locale: { + af: 'af-ZA', + // ar: '', # not the same value for all variants + bg: 'bg-BG', + ca: 'ca-ES', + ckb: '', + cs: 'cs-CZ', + de: 'de-DE', + el: 'el-GR', + en: 'en-US', + // es: '', # not the same value for all variants + et: 'et-EE', + fa: 'fa-IR', + fi: 'fi-FI', + // fr: '', #not the same value for all variants + hr: 'hr-HR', + hu: 'hu-HU', + he: 'he-IL', + id: 'id-ID', + it: 'it-IT', + ja: 'ja-JP', + ko: 'ko-KR', + lv: 'lv-LV', + lt: 'lt-LT', + nl: 'nl-NL', + no: 'no-NO', + pl: 'pl-PL', + pt: 'pt-PT', + ro: 'ro-RO', + ru: 'ru-RU', + sk: 'sk-SK', + sl: 'sl-SI', + srCyrl: 'sr-SP', + srLatn: 'sr-SP', + sv: 'sv-SE', + th: 'th-TH', + tr: 'tr-TR', + az: 'az-AZ', + uk: 'uk-UA', + vi: 'vi-VN', + zhHans: 'zh-CN', + zhHant: 'zh-TW' + } + }, options); + return { + options: _options, + instance: createInstance(_options, locale) + }; +} +function createInstance(options, locale) { + const instance = reactive(typeof options.adapter === 'function' + // eslint-disable-next-line new-cap + ? new options.adapter({ + locale: options.locale[locale.current.value] ?? locale.current.value, + formats: options.formats + }) : options.adapter); + watch(locale.current, value => { + instance.locale = options.locale[value] ?? value ?? instance.locale; + }); + return instance; +} +function useDate() { + const options = inject(DateOptionsSymbol); + if (!options) throw new Error('[Vuetify] Could not find injected date options'); + const locale = useLocale(); + return createInstance(options, locale); +} + +// https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024 +function getWeek(adapter, value) { + const date = adapter.toJsDate(value); + let year = date.getFullYear(); + let d1w1 = new Date(year, 0, 1); + if (date < d1w1) { + year = year - 1; + d1w1 = new Date(year, 0, 1); + } else { + const tv = new Date(year + 1, 0, 1); + if (date >= tv) { + year = year + 1; + d1w1 = tv; + } + } + const diffTime = Math.abs(date.getTime() - d1w1.getTime()); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + return Math.floor(diffDays / 7) + 1; +} + +export { defer as $, deepEqual as A, wrapInArray as B, findChildrenWithProvide as C, useIcon as D, flattenFragments as E, useResizeObserver as F, IN_BROWSER as G, hasEvent as H, IconValue as I, isObject as J, keyCodes as K, useLocale as L, EventProp as M, filterInputAttrs as N, matchesSelector as O, omit as P, only as Q, useDisplay as R, SUPPORTS_INTERSECTION as S, useGoTo as T, makeDisplayProps as U, focusableChildren as V, consoleError as W, defineComponent as X, deprecate as Y, getPropertyFromItem as Z, focusChild as _, isOn as a, templateRef as a0, isClickInsideElement as a1, getNextElement as a2, pick as a3, callEvent as a4, debounce as a5, ensureValidVNode as a6, checkPrintable as a7, noop as a8, useTheme as a9, useLayout as aA, CircularBuffer as aB, VuetifyLayoutKey as aC, refElement as aD, VClassIcon as aE, VComponentIcon as aF, VLigatureIcon as aG, VSvgIcon as aH, mergeDeep as aI, createDefaults as aJ, createDisplay as aK, createTheme as aL, createIcons as aM, createLocale as aN, createDate as aO, createGoTo as aP, DefaultsSymbol as aQ, DisplaySymbol as aR, ThemeSymbol as aS, IconSymbol as aT, LocaleSymbol as aU, DateOptionsSymbol as aV, DateAdapterSymbol as aW, GoToSymbol as aX, useDefaults as aY, pickWithRest as aa, keys as ab, getEventCoordinates as ac, HexToHSV as ad, HSVtoHex as ae, HSLtoHSV as af, HSVtoHSL as ag, RGBtoHSV as ah, HSVtoRGB as ai, has as aj, getDecimals as ak, createRange as al, keyValues as am, SUPPORTS_EYE_DROPPER as an, HSVtoCSS as ao, RGBtoCSS as ap, getContrast as aq, isComposingIgnoreKey as ar, getObjectValueByPath as as, isEmpty as at, defineFunctionalComponent as au, breakpoints as av, useDate as aw, getWeek as ax, humanReadableFileSize as ay, provideLocale as az, getCurrentInstance as b, provideTheme as c, createLayout as d, eventName as e, makeLayoutProps as f, genericComponent as g, provideDefaults as h, includes as i, convertToUnit as j, destructComputed as k, isCssColor as l, makeThemeProps as m, isParsableColor as n, parseColor as o, propsFactory as p, getForeground as q, getCurrentInstanceName as r, clamp as s, consoleWarn as t, useRtl as u, useProxiedModel as v, useToggleScope as w, useLayoutItem as x, makeLayoutItemProps as y, getUid as z }; diff --git a/plugins.v2/clashruleprovider/dist/assets/index-B8APBpoy.css b/plugins.v2/clashruleprovider/dist/assets/index-B8APBpoy.css new file mode 100644 index 0000000..7397ecf --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/index-B8APBpoy.css @@ -0,0 +1,458 @@ + +/* 为了使测试应用更美观 */ +.app-container[data-v-422baab7] { + block-size: 100vh; + inline-size: 100vw; +} +.component-preview[data-v-422baab7] { + overflow: hidden; + border: 1px solid #e0e0e0; + border-radius: 8px; +} +@supports not selector(:focus-visible) { +} +@supports not selector(:focus-visible) { +} +@supports selector(:focus-visible) { +}@supports not selector(:focus-visible) { +}@keyframes progress-circular-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0px; + } + 50% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -15px; + } + 100% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -124px; + } +} +@keyframes progress-circular-rotate { + 100% { + transform: rotate(270deg); + } +}@media (forced-colors: active) { +} + +@media (forced-colors: active) { +} +@media (forced-colors: active) { +} + +@keyframes indeterminate-ltr { + 0% { + left: -90%; + right: 100%; + } + 60% { + left: -90%; + right: 100%; + } + 100% { + left: 100%; + right: -35%; + } +} +@keyframes indeterminate-rtl { + 0% { + left: 100%; + right: -90%; + } + 60% { + left: 100%; + right: -90%; + } + 100% { + left: -35%; + right: 100%; + } +} +@keyframes indeterminate-short-ltr { + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } +} +@keyframes indeterminate-short-rtl { + 0% { + left: 100%; + right: -200%; + } + 60% { + left: -8%; + right: 107%; + } + 100% { + left: -8%; + right: 107%; + } +} +@keyframes stream { + to { + transform: translateX(var(--v-progress-linear-stream-to)); + } +} +@keyframes progress-linear-stripes { + 0% { + background-position-x: var(--v-progress-linear-height); + } +}@supports not selector(:focus-visible) { +} +@supports not selector(:focus-visible) { +}@supports not selector(:focus-visible) { +} +@supports not selector(:focus-visible) { +} +@supports selector(:focus-visible) { +}/* region BLOCK */ + +/* endregion */ +/* region ELEMENTS */ + +/* endregion *//* region INPUT */ + +/* endregion */ +/* region MODIFIERS */ + +/* endregion */ +/* region ELEMENTS */ + +/* endregion */ +/* region AFFIXES */ +@media (hover: hover) { +} +@media (hover: none) { +} + +/* endregion */ +/* region LABEL */ + +/* endregion */ +/* region OUTLINE */ +@media (hover: hover) { +} + +/* endregion */ +/* region LOADER */ + +/* endregion */ +/* region OVERLAY */ +@media (hover: hover) { +} +@media (hover: hover) { +} +@media (hover: hover) { +} + +/* endregion */ +/* region MODIFIERS */ + +/* endregion */.bottom-sheet-transition-enter-from { + transform: translateY(100%); +} +.bottom-sheet-transition-leave-to { + transform: translateY(100%); +} +@media (min-width: 600px) { +}@supports not selector(:focus-visible) { +} +@supports not selector(:focus-visible) { +}@media (forced-colors: active) { +} + +@media (hover: hover) { +}@media (forced-colors: active) { +} +@media (forced-colors: active) { +} +@media (forced-colors: active) { +}@media (min-width: 960px) { +} +@media (min-width: 1280px) { +} +@media (min-width: 1920px) { +} +@media (min-width: 2560px) { +} + +.offset-1 { + margin-inline-start: 8.3333333333%; +} + +.offset-2 { + margin-inline-start: 16.6666666667%; +} + +.offset-3 { + margin-inline-start: 25%; +} + +.offset-4 { + margin-inline-start: 33.3333333333%; +} + +.offset-5 { + margin-inline-start: 41.6666666667%; +} + +.offset-6 { + margin-inline-start: 50%; +} + +.offset-7 { + margin-inline-start: 58.3333333333%; +} + +.offset-8 { + margin-inline-start: 66.6666666667%; +} + +.offset-9 { + margin-inline-start: 75%; +} + +.offset-10 { + margin-inline-start: 83.3333333333%; +} + +.offset-11 { + margin-inline-start: 91.6666666667%; +} + +@media (min-width: 600px) { + .offset-sm-0 { + margin-inline-start: 0; + } + .offset-sm-1 { + margin-inline-start: 8.3333333333%; + } + .offset-sm-2 { + margin-inline-start: 16.6666666667%; + } + .offset-sm-3 { + margin-inline-start: 25%; + } + .offset-sm-4 { + margin-inline-start: 33.3333333333%; + } + .offset-sm-5 { + margin-inline-start: 41.6666666667%; + } + .offset-sm-6 { + margin-inline-start: 50%; + } + .offset-sm-7 { + margin-inline-start: 58.3333333333%; + } + .offset-sm-8 { + margin-inline-start: 66.6666666667%; + } + .offset-sm-9 { + margin-inline-start: 75%; + } + .offset-sm-10 { + margin-inline-start: 83.3333333333%; + } + .offset-sm-11 { + margin-inline-start: 91.6666666667%; + } +} +@media (min-width: 960px) { + .offset-md-0 { + margin-inline-start: 0; + } + .offset-md-1 { + margin-inline-start: 8.3333333333%; + } + .offset-md-2 { + margin-inline-start: 16.6666666667%; + } + .offset-md-3 { + margin-inline-start: 25%; + } + .offset-md-4 { + margin-inline-start: 33.3333333333%; + } + .offset-md-5 { + margin-inline-start: 41.6666666667%; + } + .offset-md-6 { + margin-inline-start: 50%; + } + .offset-md-7 { + margin-inline-start: 58.3333333333%; + } + .offset-md-8 { + margin-inline-start: 66.6666666667%; + } + .offset-md-9 { + margin-inline-start: 75%; + } + .offset-md-10 { + margin-inline-start: 83.3333333333%; + } + .offset-md-11 { + margin-inline-start: 91.6666666667%; + } +} +@media (min-width: 1280px) { + .offset-lg-0 { + margin-inline-start: 0; + } + .offset-lg-1 { + margin-inline-start: 8.3333333333%; + } + .offset-lg-2 { + margin-inline-start: 16.6666666667%; + } + .offset-lg-3 { + margin-inline-start: 25%; + } + .offset-lg-4 { + margin-inline-start: 33.3333333333%; + } + .offset-lg-5 { + margin-inline-start: 41.6666666667%; + } + .offset-lg-6 { + margin-inline-start: 50%; + } + .offset-lg-7 { + margin-inline-start: 58.3333333333%; + } + .offset-lg-8 { + margin-inline-start: 66.6666666667%; + } + .offset-lg-9 { + margin-inline-start: 75%; + } + .offset-lg-10 { + margin-inline-start: 83.3333333333%; + } + .offset-lg-11 { + margin-inline-start: 91.6666666667%; + } +} +@media (min-width: 1920px) { + .offset-xl-0 { + margin-inline-start: 0; + } + .offset-xl-1 { + margin-inline-start: 8.3333333333%; + } + .offset-xl-2 { + margin-inline-start: 16.6666666667%; + } + .offset-xl-3 { + margin-inline-start: 25%; + } + .offset-xl-4 { + margin-inline-start: 33.3333333333%; + } + .offset-xl-5 { + margin-inline-start: 41.6666666667%; + } + .offset-xl-6 { + margin-inline-start: 50%; + } + .offset-xl-7 { + margin-inline-start: 58.3333333333%; + } + .offset-xl-8 { + margin-inline-start: 66.6666666667%; + } + .offset-xl-9 { + margin-inline-start: 75%; + } + .offset-xl-10 { + margin-inline-start: 83.3333333333%; + } + .offset-xl-11 { + margin-inline-start: 91.6666666667%; + } +} +@media (min-width: 2560px) { + .offset-xxl-0 { + margin-inline-start: 0; + } + .offset-xxl-1 { + margin-inline-start: 8.3333333333%; + } + .offset-xxl-2 { + margin-inline-start: 16.6666666667%; + } + .offset-xxl-3 { + margin-inline-start: 25%; + } + .offset-xxl-4 { + margin-inline-start: 33.3333333333%; + } + .offset-xxl-5 { + margin-inline-start: 41.6666666667%; + } + .offset-xxl-6 { + margin-inline-start: 50%; + } + .offset-xxl-7 { + margin-inline-start: 58.3333333333%; + } + .offset-xxl-8 { + margin-inline-start: 66.6666666667%; + } + .offset-xxl-9 { + margin-inline-start: 75%; + } + .offset-xxl-10 { + margin-inline-start: 83.3333333333%; + } + .offset-xxl-11 { + margin-inline-start: 91.6666666667%; + } +}.date-picker-header-transition-enter-active, +.date-picker-header-reverse-transition-enter-active { + transition-duration: 0.3s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.date-picker-header-transition-leave-active, +.date-picker-header-reverse-transition-leave-active { + transition-duration: 0.3s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.date-picker-header-transition-enter-from { + transform: translate(0, 100%); +} +.date-picker-header-transition-leave-to { + opacity: 0; + transform: translate(0, -100%); +} + +.date-picker-header-reverse-transition-enter-from { + transform: translate(0, -100%); +} +.date-picker-header-reverse-transition-leave-to { + opacity: 0; + transform: translate(0, 100%); +}@supports not selector(:focus-visible) { +} +@supports not selector(:focus-visible) { +}@keyframes loading { + 100% { + transform: translateX(100%); + } +}@supports not selector(:focus-visible) { +} +@supports not selector(:focus-visible) { +}@media (forced-colors: active) { +}@media (max-width: 1279.98px) { +}/** Modifiers **/ \ No newline at end of file diff --git a/plugins.v2/clashruleprovider/dist/assets/index-Bff29tuV.js b/plugins.v2/clashruleprovider/dist/assets/index-Bff29tuV.js new file mode 100644 index 0000000..803a61b --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/index-Bff29tuV.js @@ -0,0 +1,24938 @@ +import { importShared } from './__federation_fn_import-JrT3xvdd.js'; +import PageComponent from './__federation_expose_Page-DlQgf7u6.js'; +import ConfigComponent from './__federation_expose_Config-C3BpNVeC.js'; +import _sfc_main$1 from './__federation_expose_Dashboard-BkyO-3pr.js'; +import { _ as _export_sfc } from './_plugin-vue_export-helper-pcqpp-6-.js'; +import { p as propsFactory, i as includes, a as isOn, e as eventName, g as genericComponent, b as getCurrentInstance, c as provideTheme, d as createLayout, u as useRtl, m as makeThemeProps, f as makeLayoutProps, h as provideDefaults, j as convertToUnit, k as destructComputed, l as isCssColor, n as isParsableColor, o as parseColor, q as getForeground, r as getCurrentInstanceName, S as SUPPORTS_INTERSECTION, s as clamp, t as consoleWarn, v as useProxiedModel, w as useToggleScope, x as useLayoutItem, y as makeLayoutItemProps, z as getUid, A as deepEqual, B as wrapInArray, C as findChildrenWithProvide, D as useIcon, I as IconValue, E as flattenFragments, F as useResizeObserver, G as IN_BROWSER, H as hasEvent, J as isObject, K as keyCodes, L as useLocale, M as EventProp, N as filterInputAttrs, O as matchesSelector, P as omit, Q as only, R as useDisplay, T as useGoTo, U as makeDisplayProps, V as focusableChildren, W as consoleError, X as defineComponent, Y as deprecate, Z as getPropertyFromItem, _ as focusChild, $ as defer, a0 as templateRef, a1 as isClickInsideElement, a2 as getNextElement, a3 as pick, a4 as callEvent, a5 as debounce, a6 as ensureValidVNode, a7 as checkPrintable, a8 as noop, a9 as useTheme, aa as pickWithRest, ab as keys, ac as getEventCoordinates, ad as HexToHSV, ae as HSVtoHex, af as HSLtoHSV, ag as HSVtoHSL, ah as RGBtoHSV, ai as HSVtoRGB, aj as has, ak as getDecimals, al as createRange, am as keyValues, an as SUPPORTS_EYE_DROPPER, ao as HSVtoCSS, ap as RGBtoCSS, aq as getContrast, ar as isComposingIgnoreKey, as as getObjectValueByPath, at as isEmpty, au as defineFunctionalComponent, av as breakpoints, aw as useDate, ax as getWeek, ay as humanReadableFileSize, az as provideLocale, aA as useLayout, aB as CircularBuffer, aC as VuetifyLayoutKey, aD as refElement, aE as VClassIcon, aF as VComponentIcon, aG as VLigatureIcon, aH as VSvgIcon } from './date--mM7W7--.js'; + +true&&(function polyfill() { + const relList = document.createElement("link").relList; + if (relList && relList.supports && relList.supports("modulepreload")) { + return; + } + for (const link of document.querySelectorAll('link[rel="modulepreload"]')) { + processPreload(link); + } + new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.type !== "childList") { + continue; + } + for (const node of mutation.addedNodes) { + if (node.tagName === "LINK" && node.rel === "modulepreload") + processPreload(node); + } + } + }).observe(document, { childList: true, subtree: true }); + function getFetchOpts(link) { + const fetchOpts = {}; + if (link.integrity) fetchOpts.integrity = link.integrity; + if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy; + if (link.crossOrigin === "use-credentials") + fetchOpts.credentials = "include"; + else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit"; + else fetchOpts.credentials = "same-origin"; + return fetchOpts; + } + function processPreload(link) { + if (link.ep) + return; + link.ep = true; + const fetchOpts = getFetchOpts(link); + fetch(link.href, fetchOpts); + } +}()); + +const {createTextVNode:_createTextVNode$7,resolveComponent:_resolveComponent,withCtx:_withCtx,createVNode:_createVNode$2h,createElementVNode:_createElementVNode,toDisplayString:_toDisplayString,openBlock:_openBlock,createElementBlock:_createElementBlock} = await importShared('vue'); + + +const _hoisted_1 = { class: "app-container" }; +const _hoisted_2 = { class: "component-preview" }; +const _hoisted_3 = { class: "component-preview" }; +const _hoisted_4 = { class: "component-preview" }; +const _hoisted_5 = { class: "text-white" }; + +const {ref: ref$Q,reactive: reactive$3} = await importShared('vue'); + +// 活动标签页 + +const _sfc_main = { + __name: 'App', + setup(__props) { + +const activeTab = ref$Q('page'); + +// 配置初始值 +const initialConfig = { + name: '测试插件', + description: '这是一个测试配置', + enable_notifications: true, + update_interval: 30, + api_url: 'https://api.example.com', + api_key: 'test_api_key_123', + concurrent_tasks: 2, + tags: ['电影', '测试'], +}; + +// 仪表板配置 +const dashboardConfig = reactive$3({ + id: 'test_plugin', + name: '测试插件', + attrs: { + title: '仪表板示例', + subtitle: '插件数据展示', + border: true, + }, +}); + +// 通知状态 +const snackbar = reactive$3({ + show: false, + text: '', + color: 'success', + timeout: 3000, +}); + +// 显示通知 +function showNotification(text, color = 'success') { + snackbar.text = text; + snackbar.color = color; + snackbar.show = true; +} + +// 处理详情页面操作 +function handleAction() { + showNotification('Page组件触发了action事件'); +} + +// 处理配置保存 +function handleConfigSave(config) { + console.log('配置已保存:', config); + showNotification('配置已保存'); +} + +return (_ctx, _cache) => { + const _component_v_app_bar_title = _resolveComponent("v-app-bar-title"); + const _component_v_app_bar = _resolveComponent("v-app-bar"); + const _component_v_tab = _resolveComponent("v-tab"); + const _component_v_tabs = _resolveComponent("v-tabs"); + const _component_v_window_item = _resolveComponent("v-window-item"); + const _component_v_switch = _resolveComponent("v-switch"); + const _component_v_window = _resolveComponent("v-window"); + const _component_v_container = _resolveComponent("v-container"); + const _component_v_main = _resolveComponent("v-main"); + const _component_v_footer = _resolveComponent("v-footer"); + const _component_v_app = _resolveComponent("v-app"); + const _component_v_btn = _resolveComponent("v-btn"); + const _component_v_snackbar = _resolveComponent("v-snackbar"); + + return (_openBlock(), _createElementBlock("div", _hoisted_1, [ + _createVNode$2h(_component_v_app, null, { + default: _withCtx(() => [ + _createVNode$2h(_component_v_app_bar, { + color: "primary", + app: "" + }, { + default: _withCtx(() => [ + _createVNode$2h(_component_v_app_bar_title, null, { + default: _withCtx(() => _cache[5] || (_cache[5] = [ + _createTextVNode$7("MoviePilot插件组件示例") + ])), + _: 1 + }) + ]), + _: 1 + }), + _createVNode$2h(_component_v_main, null, { + default: _withCtx(() => [ + _createVNode$2h(_component_v_container, null, { + default: _withCtx(() => [ + _createVNode$2h(_component_v_tabs, { + modelValue: activeTab.value, + "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => ((activeTab).value = $event)), + "bg-color": "primary" + }, { + default: _withCtx(() => [ + _createVNode$2h(_component_v_tab, { value: "page" }, { + default: _withCtx(() => _cache[6] || (_cache[6] = [ + _createTextVNode$7("详情页面") + ])), + _: 1 + }), + _createVNode$2h(_component_v_tab, { value: "config" }, { + default: _withCtx(() => _cache[7] || (_cache[7] = [ + _createTextVNode$7("配置页面") + ])), + _: 1 + }), + _createVNode$2h(_component_v_tab, { value: "dashboard" }, { + default: _withCtx(() => _cache[8] || (_cache[8] = [ + _createTextVNode$7("仪表板") + ])), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue"]), + _createVNode$2h(_component_v_window, { + modelValue: activeTab.value, + "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => ((activeTab).value = $event)), + class: "mt-4" + }, { + default: _withCtx(() => [ + _createVNode$2h(_component_v_window_item, { value: "page" }, { + default: _withCtx(() => [ + _cache[9] || (_cache[9] = _createElementVNode("h2", { class: "text-h5 mb-4" }, "Page组件", -1)), + _createElementVNode("div", _hoisted_2, [ + _createVNode$2h(PageComponent, { onAction: handleAction }) + ]) + ]), + _: 1 + }), + _createVNode$2h(_component_v_window_item, { value: "config" }, { + default: _withCtx(() => [ + _cache[10] || (_cache[10] = _createElementVNode("h2", { class: "text-h5 mb-4" }, "Config组件", -1)), + _createElementVNode("div", _hoisted_3, [ + _createVNode$2h(ConfigComponent, { + "initial-config": initialConfig, + onSave: handleConfigSave + }) + ]) + ]), + _: 1 + }), + _createVNode$2h(_component_v_window_item, { value: "dashboard" }, { + default: _withCtx(() => [ + _cache[11] || (_cache[11] = _createElementVNode("h2", { class: "text-h5 mb-4" }, "Dashboard组件", -1)), + _createVNode$2h(_component_v_switch, { + modelValue: dashboardConfig.attrs.border, + "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => ((dashboardConfig.attrs.border) = $event)), + label: "显示边框", + color: "primary", + class: "mb-4" + }, null, 8, ["modelValue"]), + _createElementVNode("div", _hoisted_4, [ + _createVNode$2h(_sfc_main$1, { + config: dashboardConfig, + "allow-refresh": true + }, null, 8, ["config"]) + ]) + ]), + _: 1 + }) + ]), + _: 1 + }, 8, ["modelValue"]) + ]), + _: 1 + }) + ]), + _: 1 + }), + _createVNode$2h(_component_v_footer, { + app: "", + color: "primary", + class: "text-center d-flex justify-center" + }, { + default: _withCtx(() => [ + _createElementVNode("span", _hoisted_5, "MoviePilot 模块联邦示例 ©" + _toDisplayString(new Date().getFullYear()), 1) + ]), + _: 1 + }) + ]), + _: 1 + }), + _createVNode$2h(_component_v_snackbar, { + modelValue: snackbar.show, + "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => ((snackbar.show) = $event)), + color: snackbar.color, + timeout: snackbar.timeout + }, { + actions: _withCtx(() => [ + _createVNode$2h(_component_v_btn, { + variant: "text", + onClick: _cache[3] || (_cache[3] = $event => (snackbar.show = false)) + }, { + default: _withCtx(() => _cache[12] || (_cache[12] = [ + _createTextVNode$7(" 关闭 ") + ])), + _: 1 + }) + ]), + default: _withCtx(() => [ + _createTextVNode$7(_toDisplayString(snackbar.text) + " ", 1) + ]), + _: 1 + }, 8, ["modelValue", "color", "timeout"]) + ])) +} +} + +}; +const App = /*#__PURE__*/_export_sfc(_sfc_main, [['__scopeId',"data-v-422baab7"]]); + +// Utilities +// Composables +const makeComponentProps = propsFactory({ + class: [String, Array, Object], + style: { + type: [String, Array, Object], + default: null + } +}, 'component'); + +// Utilities +const block = ['top', 'bottom']; +const inline = ['start', 'end', 'left', 'right']; +/** Parse a raw anchor string into an object */ +function parseAnchor(anchor, isRtl) { + let [side, align] = anchor.split(' '); + if (!align) { + align = includes(block, side) ? 'start' : includes(inline, side) ? 'top' : 'center'; + } + return { + side: toPhysical(side, isRtl), + align: toPhysical(align, isRtl) + }; +} +function toPhysical(str, isRtl) { + if (str === 'start') return isRtl ? 'right' : 'left'; + if (str === 'end') return isRtl ? 'left' : 'right'; + return str; +} +function flipSide(anchor) { + return { + side: { + center: 'center', + top: 'bottom', + bottom: 'top', + left: 'right', + right: 'left' + }[anchor.side], + align: anchor.align + }; +} +function flipAlign(anchor) { + return { + side: anchor.side, + align: { + center: 'center', + top: 'bottom', + bottom: 'top', + left: 'right', + right: 'left' + }[anchor.align] + }; +} +function flipCorner(anchor) { + return { + side: anchor.align, + align: anchor.side + }; +} +function getAxis(anchor) { + return includes(block, anchor.side) ? 'y' : 'x'; +} + +class Box { + constructor(_ref) { + let { + x, + y, + width, + height + } = _ref; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + get top() { + return this.y; + } + get bottom() { + return this.y + this.height; + } + get left() { + return this.x; + } + get right() { + return this.x + this.width; + } +} +function getOverflow(a, b) { + return { + x: { + before: Math.max(0, b.left - a.left), + after: Math.max(0, a.right - b.right) + }, + y: { + before: Math.max(0, b.top - a.top), + after: Math.max(0, a.bottom - b.bottom) + } + }; +} +function getTargetBox(target) { + if (Array.isArray(target)) { + return new Box({ + x: target[0], + y: target[1], + width: 0, + height: 0 + }); + } else { + return target.getBoundingClientRect(); + } +} + +// Utilities +/** @see https://stackoverflow.com/a/57876601/2074736 */ +function nullifyTransforms(el) { + const rect = el.getBoundingClientRect(); + const style = getComputedStyle(el); + const tx = style.transform; + if (tx) { + let ta, sx, sy, dx, dy; + if (tx.startsWith('matrix3d(')) { + ta = tx.slice(9, -1).split(/, /); + sx = +ta[0]; + sy = +ta[5]; + dx = +ta[12]; + dy = +ta[13]; + } else if (tx.startsWith('matrix(')) { + ta = tx.slice(7, -1).split(/, /); + sx = +ta[0]; + sy = +ta[3]; + dx = +ta[4]; + dy = +ta[5]; + } else { + return new Box(rect); + } + const to = style.transformOrigin; + const x = rect.x - dx - (1 - sx) * parseFloat(to); + const y = rect.y - dy - (1 - sy) * parseFloat(to.slice(to.indexOf(' ') + 1)); + const w = sx ? rect.width / sx : el.offsetWidth + 1; + const h = sy ? rect.height / sy : el.offsetHeight + 1; + return new Box({ + x, + y, + width: w, + height: h + }); + } else { + return new Box(rect); + } +} +function animate(el, keyframes, options) { + if (typeof el.animate === 'undefined') return { + finished: Promise.resolve() + }; + let animation; + try { + animation = el.animate(keyframes, options); + } catch (err) { + return { + finished: Promise.resolve() + }; + } + if (typeof animation.finished === 'undefined') { + animation.finished = new Promise(resolve => { + animation.onfinish = () => { + resolve(animation); + }; + }); + } + return animation; +} + +// Utilities +const handlers = new WeakMap(); +function bindProps(el, props) { + Object.keys(props).forEach(k => { + if (isOn(k)) { + const name = eventName(k); + const handler = handlers.get(el); + if (props[k] == null) { + handler?.forEach(v => { + const [n, fn] = v; + if (n === name) { + el.removeEventListener(name, fn); + handler.delete(v); + } + }); + } else if (!handler || ![...handler]?.some(v => v[0] === name && v[1] === props[k])) { + el.addEventListener(name, props[k]); + const _handler = handler || new Set(); + _handler.add([name, props[k]]); + if (!handlers.has(el)) handlers.set(el, _handler); + } + } else { + if (props[k] == null) { + el.removeAttribute(k); + } else { + el.setAttribute(k, props[k]); + } + } + }); +} +function unbindProps(el, props) { + Object.keys(props).forEach(k => { + if (isOn(k)) { + const name = eventName(k); + const handler = handlers.get(el); + handler?.forEach(v => { + const [n, fn] = v; + if (n === name) { + el.removeEventListener(name, fn); + handler.delete(v); + } + }); + } else { + el.removeAttribute(k); + } + }); +} + +const {camelize: camelize$1,capitalize: capitalize$3,h: h$5} = await importShared('vue'); +function createSimpleFunctional(klass) { + let tag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'div'; + let name = arguments.length > 2 ? arguments[2] : undefined; + return genericComponent()({ + name: name ?? capitalize$3(camelize$1(klass.replace(/__/g, '-'))), + props: { + tag: { + type: String, + default: tag + }, + ...makeComponentProps() + }, + setup(props, _ref) { + let { + slots + } = _ref; + return () => { + return h$5(props.tag, { + class: [klass, props.class], + style: props.style + }, slots.default?.()); + }; + } + }); +} + +/** + * Returns: + * - 'null' if the node is not attached to the DOM + * - the root node (HTMLDocument | ShadowRoot) otherwise + */ +function attachedRoot(node) { + /* istanbul ignore next */ + if (typeof node.getRootNode !== 'function') { + // Shadow DOM not supported (IE11), lets find the root of this node + while (node.parentNode) node = node.parentNode; + + // The root parent is the document if the node is attached to the DOM + if (node !== document) return null; + return document; + } + const root = node.getRootNode(); + + // The composed root node is the document if the node is attached to the DOM + if (root !== document && root.getRootNode({ + composed: true + }) !== document) return null; + return root; +} + +const standardEasing = 'cubic-bezier(0.4, 0, 0.2, 1)'; +const deceleratedEasing = 'cubic-bezier(0.0, 0, 0.2, 1)'; // Entering +const acceleratedEasing = 'cubic-bezier(0.4, 0, 1, 1)'; // Leaving + +// Utilities +function getPrefixedEventHandlers(attrs, suffix, getData) { + return Object.keys(attrs).filter(key => isOn(key) && key.endsWith(suffix)).reduce((acc, key) => { + acc[key.slice(0, -suffix.length)] = event => attrs[key](event, getData(event)); + return acc; + }, {}); +} + +function getScrollParent(el) { + let includeHidden = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + while (el) { + if (includeHidden ? isPotentiallyScrollable(el) : hasScrollbar(el)) return el; + el = el.parentElement; + } + return document.scrollingElement; +} +function getScrollParents(el, stopAt) { + const elements = []; + if (stopAt && el && !stopAt.contains(el)) return elements; + while (el) { + if (hasScrollbar(el)) elements.push(el); + if (el === stopAt) break; + el = el.parentElement; + } + return elements; +} +function hasScrollbar(el) { + if (!el || el.nodeType !== Node.ELEMENT_NODE) return false; + const style = window.getComputedStyle(el); + return style.overflowY === 'scroll' || style.overflowY === 'auto' && el.scrollHeight > el.clientHeight; +} +function isPotentiallyScrollable(el) { + if (!el || el.nodeType !== Node.ELEMENT_NODE) return false; + const style = window.getComputedStyle(el); + return ['scroll', 'auto'].includes(style.overflowY); +} + +function isFixedPosition(el) { + while (el) { + if (window.getComputedStyle(el).position === 'fixed') { + return true; + } + el = el.offsetParent; + } + return false; +} + +// Utilities +function useRender(render) { + const vm = getCurrentInstance('useRender'); + vm.render = render; +} + +const {createVNode:_createVNode$2g} = await importShared('vue'); +const makeVAppProps = propsFactory({ + ...makeComponentProps(), + ...makeLayoutProps({ + fullHeight: true + }), + ...makeThemeProps() +}, 'VApp'); +const VApp = genericComponent()({ + name: 'VApp', + props: makeVAppProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const theme = provideTheme(props); + const { + layoutClasses, + getLayoutItem, + items, + layoutRef + } = createLayout(props); + const { + rtlClasses + } = useRtl(); + useRender(() => _createVNode$2g("div", { + "ref": layoutRef, + "class": ['v-application', theme.themeClasses.value, layoutClasses.value, rtlClasses.value, props.class], + "style": [props.style] + }, [_createVNode$2g("div", { + "class": "v-application__wrap" + }, [slots.default?.()])])); + return { + getLayoutItem, + items, + theme + }; + } +}); + +// Utilities +// Composables +const makeTagProps = propsFactory({ + tag: { + type: String, + default: 'div' + } +}, 'tag'); + +const {createVNode:_createVNode$2f} = await importShared('vue'); +const makeVToolbarTitleProps = propsFactory({ + text: String, + ...makeComponentProps(), + ...makeTagProps() +}, 'VToolbarTitle'); +const VToolbarTitle = genericComponent()({ + name: 'VToolbarTitle', + props: makeVToolbarTitleProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => { + const hasText = !!(slots.default || slots.text || props.text); + return _createVNode$2f(props.tag, { + "class": ['v-toolbar-title', props.class], + "style": props.style + }, { + default: () => [hasText && _createVNode$2f("div", { + "class": "v-toolbar-title__placeholder" + }, [slots.text ? slots.text() : props.text, slots.default?.()])] + }); + }); + return {}; + } +}); + +// Utilities +const {h: h$4,Transition: Transition$5,TransitionGroup: TransitionGroup$1} = await importShared('vue'); +const makeTransitionProps$1 = propsFactory({ + disabled: Boolean, + group: Boolean, + hideOnLeave: Boolean, + leaveAbsolute: Boolean, + mode: String, + origin: String +}, 'transition'); +function createCssTransition(name, origin, mode) { + return genericComponent()({ + name, + props: makeTransitionProps$1({ + mode, + origin + }), + setup(props, _ref) { + let { + slots + } = _ref; + const functions = { + onBeforeEnter(el) { + if (props.origin) { + el.style.transformOrigin = props.origin; + } + }, + onLeave(el) { + if (props.leaveAbsolute) { + const { + offsetTop, + offsetLeft, + offsetWidth, + offsetHeight + } = el; + el._transitionInitialStyles = { + position: el.style.position, + top: el.style.top, + left: el.style.left, + width: el.style.width, + height: el.style.height + }; + el.style.position = 'absolute'; + el.style.top = `${offsetTop}px`; + el.style.left = `${offsetLeft}px`; + el.style.width = `${offsetWidth}px`; + el.style.height = `${offsetHeight}px`; + } + if (props.hideOnLeave) { + el.style.setProperty('display', 'none', 'important'); + } + }, + onAfterLeave(el) { + if (props.leaveAbsolute && el?._transitionInitialStyles) { + const { + position, + top, + left, + width, + height + } = el._transitionInitialStyles; + delete el._transitionInitialStyles; + el.style.position = position || ''; + el.style.top = top || ''; + el.style.left = left || ''; + el.style.width = width || ''; + el.style.height = height || ''; + } + } + }; + return () => { + const tag = props.group ? TransitionGroup$1 : Transition$5; + return h$4(tag, { + name: props.disabled ? '' : name, + css: !props.disabled, + ...(props.group ? undefined : { + mode: props.mode + }), + ...(props.disabled ? {} : functions) + }, slots.default); + }; + } + }); +} +function createJavascriptTransition(name, functions) { + let mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'in-out'; + return genericComponent()({ + name, + props: { + mode: { + type: String, + default: mode + }, + disabled: Boolean, + group: Boolean + }, + setup(props, _ref2) { + let { + slots + } = _ref2; + const tag = props.group ? TransitionGroup$1 : Transition$5; + return () => { + return h$4(tag, { + name: props.disabled ? '' : name, + css: !props.disabled, + // mode: props.mode, // TODO: vuejs/vue-next#3104 + ...(props.disabled ? {} : functions) + }, slots.default); + }; + } + }); +} + +// Utilities +const {camelize} = await importShared('vue'); + +function ExpandTransitionGenerator () { + let expandedParentClass = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + let x = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + const sizeProperty = x ? 'width' : 'height'; + const offsetProperty = camelize(`offset-${sizeProperty}`); + return { + onBeforeEnter(el) { + el._parent = el.parentNode; + el._initialStyle = { + transition: el.style.transition, + overflow: el.style.overflow, + [sizeProperty]: el.style[sizeProperty] + }; + }, + onEnter(el) { + const initialStyle = el._initialStyle; + el.style.setProperty('transition', 'none', 'important'); + // Hide overflow to account for collapsed margins in the calculated height + el.style.overflow = 'hidden'; + const offset = `${el[offsetProperty]}px`; + el.style[sizeProperty] = '0'; + void el.offsetHeight; // force reflow + + el.style.transition = initialStyle.transition; + if (expandedParentClass && el._parent) { + el._parent.classList.add(expandedParentClass); + } + requestAnimationFrame(() => { + el.style[sizeProperty] = offset; + }); + }, + onAfterEnter: resetStyles, + onEnterCancelled: resetStyles, + onLeave(el) { + el._initialStyle = { + transition: '', + overflow: el.style.overflow, + [sizeProperty]: el.style[sizeProperty] + }; + el.style.overflow = 'hidden'; + el.style[sizeProperty] = `${el[offsetProperty]}px`; + void el.offsetHeight; // force reflow + + requestAnimationFrame(() => el.style[sizeProperty] = '0'); + }, + onAfterLeave, + onLeaveCancelled: onAfterLeave + }; + function onAfterLeave(el) { + if (expandedParentClass && el._parent) { + el._parent.classList.remove(expandedParentClass); + } + resetStyles(el); + } + function resetStyles(el) { + const size = el._initialStyle[sizeProperty]; + el.style.overflow = el._initialStyle.overflow; + if (size != null) el.style[sizeProperty] = size; + delete el._initialStyle; + } +} + +const {createVNode:_createVNode$2e,mergeProps:_mergeProps$12,resolveDirective:_resolveDirective$10} = await importShared('vue'); + +// Utilities +const {Transition: Transition$4} = await importShared('vue'); +const makeVDialogTransitionProps = propsFactory({ + target: [Object, Array] +}, 'v-dialog-transition'); +const VDialogTransition = genericComponent()({ + name: 'VDialogTransition', + props: makeVDialogTransitionProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const functions = { + onBeforeEnter(el) { + el.style.pointerEvents = 'none'; + el.style.visibility = 'hidden'; + }, + async onEnter(el, done) { + await new Promise(resolve => requestAnimationFrame(resolve)); + await new Promise(resolve => requestAnimationFrame(resolve)); + el.style.visibility = ''; + const { + x, + y, + sx, + sy, + speed + } = getDimensions(props.target, el); + const animation = animate(el, [{ + transform: `translate(${x}px, ${y}px) scale(${sx}, ${sy})`, + opacity: 0 + }, {}], { + duration: 225 * speed, + easing: deceleratedEasing + }); + getChildren(el)?.forEach(el => { + animate(el, [{ + opacity: 0 + }, { + opacity: 0, + offset: 0.33 + }, {}], { + duration: 225 * 2 * speed, + easing: standardEasing + }); + }); + animation.finished.then(() => done()); + }, + onAfterEnter(el) { + el.style.removeProperty('pointer-events'); + }, + onBeforeLeave(el) { + el.style.pointerEvents = 'none'; + }, + async onLeave(el, done) { + await new Promise(resolve => requestAnimationFrame(resolve)); + const { + x, + y, + sx, + sy, + speed + } = getDimensions(props.target, el); + const animation = animate(el, [{}, { + transform: `translate(${x}px, ${y}px) scale(${sx}, ${sy})`, + opacity: 0 + }], { + duration: 125 * speed, + easing: acceleratedEasing + }); + animation.finished.then(() => done()); + getChildren(el)?.forEach(el => { + animate(el, [{}, { + opacity: 0, + offset: 0.2 + }, { + opacity: 0 + }], { + duration: 125 * 2 * speed, + easing: standardEasing + }); + }); + }, + onAfterLeave(el) { + el.style.removeProperty('pointer-events'); + } + }; + return () => { + return props.target ? _createVNode$2e(Transition$4, _mergeProps$12({ + "name": "dialog-transition" + }, functions, { + "css": false + }), slots) : _createVNode$2e(Transition$4, { + "name": "dialog-transition" + }, slots); + }; + } +}); + +/** Animatable children (card, sheet, list) */ +function getChildren(el) { + const els = el.querySelector(':scope > .v-card, :scope > .v-sheet, :scope > .v-list')?.children; + return els && [...els]; +} +function getDimensions(target, el) { + const targetBox = getTargetBox(target); + const elBox = nullifyTransforms(el); + const [originX, originY] = getComputedStyle(el).transformOrigin.split(' ').map(v => parseFloat(v)); + const [anchorSide, anchorOffset] = getComputedStyle(el).getPropertyValue('--v-overlay-anchor-origin').split(' '); + let offsetX = targetBox.left + targetBox.width / 2; + if (anchorSide === 'left' || anchorOffset === 'left') { + offsetX -= targetBox.width / 2; + } else if (anchorSide === 'right' || anchorOffset === 'right') { + offsetX += targetBox.width / 2; + } + let offsetY = targetBox.top + targetBox.height / 2; + if (anchorSide === 'top' || anchorOffset === 'top') { + offsetY -= targetBox.height / 2; + } else if (anchorSide === 'bottom' || anchorOffset === 'bottom') { + offsetY += targetBox.height / 2; + } + const tsx = targetBox.width / elBox.width; + const tsy = targetBox.height / elBox.height; + const maxs = Math.max(1, tsx, tsy); + const sx = tsx / maxs || 0; + const sy = tsy / maxs || 0; + + // Animate elements larger than 12% of the screen area up to 1.5x slower + const asa = elBox.width * elBox.height / (window.innerWidth * window.innerHeight); + const speed = asa > 0.12 ? Math.min(1.5, (asa - 0.12) * 10 + 1) : 1; + return { + x: offsetX - (originX + elBox.left), + y: offsetY - (originY + elBox.top), + sx, + sy, + speed + }; +} + +const VFabTransition = createCssTransition('fab-transition', 'center center', 'out-in'); + +// Generic transitions +const VDialogBottomTransition = createCssTransition('dialog-bottom-transition'); +const VDialogTopTransition = createCssTransition('dialog-top-transition'); +const VFadeTransition = createCssTransition('fade-transition'); +const VScaleTransition = createCssTransition('scale-transition'); +const VScrollXTransition = createCssTransition('scroll-x-transition'); +const VScrollXReverseTransition = createCssTransition('scroll-x-reverse-transition'); +const VScrollYTransition = createCssTransition('scroll-y-transition'); +const VScrollYReverseTransition = createCssTransition('scroll-y-reverse-transition'); +const VSlideXTransition = createCssTransition('slide-x-transition'); +const VSlideXReverseTransition = createCssTransition('slide-x-reverse-transition'); +const VSlideYTransition = createCssTransition('slide-y-transition'); +const VSlideYReverseTransition = createCssTransition('slide-y-reverse-transition'); + +// Javascript transitions +const VExpandTransition = createJavascriptTransition('expand-transition', ExpandTransitionGenerator()); +const VExpandXTransition = createJavascriptTransition('expand-x-transition', ExpandTransitionGenerator('', true)); + +const {toRefs: toRefs$4} = await importShared('vue'); +const makeVDefaultsProviderProps = propsFactory({ + defaults: Object, + disabled: Boolean, + reset: [Number, String], + root: [Boolean, String], + scoped: Boolean +}, 'VDefaultsProvider'); +const VDefaultsProvider = genericComponent(false)({ + name: 'VDefaultsProvider', + props: makeVDefaultsProviderProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + defaults, + disabled, + reset, + root, + scoped + } = toRefs$4(props); + provideDefaults(defaults, { + reset, + root, + scoped, + disabled + }); + return () => slots.default?.(); + } +}); + +// Utilities +const {computed: computed$1Z} = await importShared('vue'); +// Composables +const makeDimensionProps = propsFactory({ + height: [Number, String], + maxHeight: [Number, String], + maxWidth: [Number, String], + minHeight: [Number, String], + minWidth: [Number, String], + width: [Number, String] +}, 'dimension'); +function useDimension(props) { + const dimensionStyles = computed$1Z(() => { + const styles = {}; + const height = convertToUnit(props.height); + const maxHeight = convertToUnit(props.maxHeight); + const maxWidth = convertToUnit(props.maxWidth); + const minHeight = convertToUnit(props.minHeight); + const minWidth = convertToUnit(props.minWidth); + const width = convertToUnit(props.width); + if (height != null) styles.height = height; + if (maxHeight != null) styles.maxHeight = maxHeight; + if (maxWidth != null) styles.maxWidth = maxWidth; + if (minHeight != null) styles.minHeight = minHeight; + if (minWidth != null) styles.minWidth = minWidth; + if (width != null) styles.width = width; + return styles; + }); + return { + dimensionStyles + }; +} + +const {createVNode:_createVNode$2d} = await importShared('vue'); +const {computed: computed$1Y} = await importShared('vue'); +function useAspectStyles(props) { + return { + aspectStyles: computed$1Y(() => { + const ratio = Number(props.aspectRatio); + return ratio ? { + paddingBottom: String(1 / ratio * 100) + '%' + } : undefined; + }) + }; +} +const makeVResponsiveProps = propsFactory({ + aspectRatio: [String, Number], + contentClass: null, + inline: Boolean, + ...makeComponentProps(), + ...makeDimensionProps() +}, 'VResponsive'); +const VResponsive = genericComponent()({ + name: 'VResponsive', + props: makeVResponsiveProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + aspectStyles + } = useAspectStyles(props); + const { + dimensionStyles + } = useDimension(props); + useRender(() => _createVNode$2d("div", { + "class": ['v-responsive', { + 'v-responsive--inline': props.inline + }, props.class], + "style": [dimensionStyles.value, props.style] + }, [_createVNode$2d("div", { + "class": "v-responsive__sizer", + "style": aspectStyles.value + }, null), slots.additional?.(), slots.default && _createVNode$2d("div", { + "class": ['v-responsive__content', props.contentClass] + }, [slots.default()])])); + return {}; + } +}); + +// Utilities +const {computed: computed$1X,isRef: isRef$3} = await importShared('vue'); +// Composables +function useColor(colors) { + return destructComputed(() => { + const classes = []; + const styles = {}; + if (colors.value.background) { + if (isCssColor(colors.value.background)) { + styles.backgroundColor = colors.value.background; + if (!colors.value.text && isParsableColor(colors.value.background)) { + const backgroundColor = parseColor(colors.value.background); + if (backgroundColor.a == null || backgroundColor.a === 1) { + const textColor = getForeground(backgroundColor); + styles.color = textColor; + styles.caretColor = textColor; + } + } + } else { + classes.push(`bg-${colors.value.background}`); + } + } + if (colors.value.text) { + if (isCssColor(colors.value.text)) { + styles.color = colors.value.text; + styles.caretColor = colors.value.text; + } else { + classes.push(`text-${colors.value.text}`); + } + } + return { + colorClasses: classes, + colorStyles: styles + }; + }); +} +function useTextColor(props, name) { + const colors = computed$1X(() => ({ + text: isRef$3(props) ? props.value : name ? props[name] : null + })); + const { + colorClasses: textColorClasses, + colorStyles: textColorStyles + } = useColor(colors); + return { + textColorClasses, + textColorStyles + }; +} +function useBackgroundColor(props, name) { + const colors = computed$1X(() => ({ + background: isRef$3(props) ? props.value : name ? props[name] : null + })); + const { + colorClasses: backgroundColorClasses, + colorStyles: backgroundColorStyles + } = useColor(colors); + return { + backgroundColorClasses, + backgroundColorStyles + }; +} + +// Utilities +const {computed: computed$1W,isRef: isRef$2} = await importShared('vue'); +// Composables +const makeRoundedProps = propsFactory({ + rounded: { + type: [Boolean, Number, String], + default: undefined + }, + tile: Boolean +}, 'rounded'); +function useRounded(props) { + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + const roundedClasses = computed$1W(() => { + const rounded = isRef$2(props) ? props.value : props.rounded; + const tile = isRef$2(props) ? props.value : props.tile; + const classes = []; + if (rounded === true || rounded === '') { + classes.push(`${name}--rounded`); + } else if (typeof rounded === 'string' || rounded === 0) { + for (const value of String(rounded).split(' ')) { + classes.push(`rounded-${value}`); + } + } else if (tile || rounded === false) { + classes.push('rounded-0'); + } + return classes; + }); + return { + roundedClasses + }; +} + +// Utilities +const {h: h$3,mergeProps: mergeProps$c,Transition: Transition$3,TransitionGroup} = await importShared('vue'); +const makeTransitionProps = propsFactory({ + transition: { + type: [Boolean, String, Object], + default: 'fade-transition', + validator: val => val !== true + } +}, 'transition'); +const MaybeTransition = (props, _ref) => { + let { + slots + } = _ref; + const { + transition, + disabled, + group, + ...rest + } = props; + const { + component = group ? TransitionGroup : Transition$3, + ...customProps + } = typeof transition === 'object' ? transition : {}; + return h$3(component, mergeProps$c(typeof transition === 'string' ? { + name: disabled ? '' : transition + } : customProps, typeof transition === 'string' ? {} : Object.fromEntries(Object.entries({ + disabled, + group + }).filter(_ref2 => { + let [_, v] = _ref2; + return v !== undefined; + })), rest), slots); +}; + +// Utilities +function mounted$5(el, binding) { + if (!SUPPORTS_INTERSECTION) return; + const modifiers = binding.modifiers || {}; + const value = binding.value; + const { + handler, + options + } = typeof value === 'object' ? value : { + handler: value, + options: {} + }; + const observer = new IntersectionObserver(function () { + let entries = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let observer = arguments.length > 1 ? arguments[1] : undefined; + const _observe = el._observe?.[binding.instance.$.uid]; + if (!_observe) return; // Just in case, should never fire + + const isIntersecting = entries.some(entry => entry.isIntersecting); + + // If is not quiet or has already been + // initted, invoke the user callback + if (handler && (!modifiers.quiet || _observe.init) && (!modifiers.once || isIntersecting || _observe.init)) { + handler(isIntersecting, entries, observer); + } + if (isIntersecting && modifiers.once) unmounted$5(el, binding);else _observe.init = true; + }, options); + el._observe = Object(el._observe); + el._observe[binding.instance.$.uid] = { + init: false, + observer + }; + observer.observe(el); +} +function unmounted$5(el, binding) { + const observe = el._observe?.[binding.instance.$.uid]; + if (!observe) return; + observe.observer.unobserve(el); + delete el._observe[binding.instance.$.uid]; +} +const Intersect = { + mounted: mounted$5, + unmounted: unmounted$5 +}; + +const {withDirectives:_withDirectives$j,mergeProps:_mergeProps$11,resolveDirective:_resolveDirective$$,Fragment:_Fragment$A,createVNode:_createVNode$2c} = await importShared('vue'); +const {computed: computed$1V,nextTick: nextTick$n,onBeforeMount: onBeforeMount$2,onBeforeUnmount: onBeforeUnmount$b,ref: ref$P,shallowRef: shallowRef$E,toRef: toRef$K,vShow,watch: watch$D,withDirectives: withDirectives$1} = await importShared('vue'); +// not intended for public use, this is passed in by vuetify-loader +const makeVImgProps = propsFactory({ + absolute: Boolean, + alt: String, + cover: Boolean, + color: String, + draggable: { + type: [Boolean, String], + default: undefined + }, + eager: Boolean, + gradient: String, + lazySrc: String, + options: { + type: Object, + // For more information on types, navigate to: + // https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API + default: () => ({ + root: undefined, + rootMargin: undefined, + threshold: undefined + }) + }, + sizes: String, + src: { + type: [String, Object], + default: '' + }, + crossorigin: String, + referrerpolicy: String, + srcset: String, + position: String, + ...makeVResponsiveProps(), + ...makeComponentProps(), + ...makeRoundedProps(), + ...makeTransitionProps() +}, 'VImg'); +const VImg = genericComponent()({ + name: 'VImg', + directives: { + intersect: Intersect + }, + props: makeVImgProps(), + emits: { + loadstart: value => true, + load: value => true, + error: value => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$K(props, 'color')); + const { + roundedClasses + } = useRounded(props); + const vm = getCurrentInstance('VImg'); + const currentSrc = shallowRef$E(''); // Set from srcset + const image = ref$P(); + const state = shallowRef$E(props.eager ? 'loading' : 'idle'); + const naturalWidth = shallowRef$E(); + const naturalHeight = shallowRef$E(); + const normalisedSrc = computed$1V(() => { + return props.src && typeof props.src === 'object' ? { + src: props.src.src, + srcset: props.srcset || props.src.srcset, + lazySrc: props.lazySrc || props.src.lazySrc, + aspect: Number(props.aspectRatio || props.src.aspect || 0) + } : { + src: props.src, + srcset: props.srcset, + lazySrc: props.lazySrc, + aspect: Number(props.aspectRatio || 0) + }; + }); + const aspectRatio = computed$1V(() => { + return normalisedSrc.value.aspect || naturalWidth.value / naturalHeight.value || 0; + }); + watch$D(() => props.src, () => { + init(state.value !== 'idle'); + }); + watch$D(aspectRatio, (val, oldVal) => { + if (!val && oldVal && image.value) { + pollForSize(image.value); + } + }); + + // TODO: getSrc when window width changes + + onBeforeMount$2(() => init()); + function init(isIntersecting) { + if (props.eager && isIntersecting) return; + if (SUPPORTS_INTERSECTION && !isIntersecting && !props.eager) return; + state.value = 'loading'; + if (normalisedSrc.value.lazySrc) { + const lazyImg = new Image(); + lazyImg.src = normalisedSrc.value.lazySrc; + pollForSize(lazyImg, null); + } + if (!normalisedSrc.value.src) return; + nextTick$n(() => { + emit('loadstart', image.value?.currentSrc || normalisedSrc.value.src); + setTimeout(() => { + if (vm.isUnmounted) return; + if (image.value?.complete) { + if (!image.value.naturalWidth) { + onError(); + } + if (state.value === 'error') return; + if (!aspectRatio.value) pollForSize(image.value, null); + if (state.value === 'loading') onLoad(); + } else { + if (!aspectRatio.value) pollForSize(image.value); + getSrc(); + } + }); + }); + } + function onLoad() { + if (vm.isUnmounted) return; + getSrc(); + pollForSize(image.value); + state.value = 'loaded'; + emit('load', image.value?.currentSrc || normalisedSrc.value.src); + } + function onError() { + if (vm.isUnmounted) return; + state.value = 'error'; + emit('error', image.value?.currentSrc || normalisedSrc.value.src); + } + function getSrc() { + const img = image.value; + if (img) currentSrc.value = img.currentSrc || img.src; + } + let timer = -1; + onBeforeUnmount$b(() => { + clearTimeout(timer); + }); + function pollForSize(img) { + let timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100; + const poll = () => { + clearTimeout(timer); + if (vm.isUnmounted) return; + const { + naturalHeight: imgHeight, + naturalWidth: imgWidth + } = img; + if (imgHeight || imgWidth) { + naturalWidth.value = imgWidth; + naturalHeight.value = imgHeight; + } else if (!img.complete && state.value === 'loading' && timeout != null) { + timer = window.setTimeout(poll, timeout); + } else if (img.currentSrc.endsWith('.svg') || img.currentSrc.startsWith('data:image/svg+xml')) { + naturalWidth.value = 1; + naturalHeight.value = 1; + } + }; + poll(); + } + const containClasses = computed$1V(() => ({ + 'v-img__img--cover': props.cover, + 'v-img__img--contain': !props.cover + })); + const __image = () => { + if (!normalisedSrc.value.src || state.value === 'idle') return null; + const img = _createVNode$2c("img", { + "class": ['v-img__img', containClasses.value], + "style": { + objectPosition: props.position + }, + "src": normalisedSrc.value.src, + "srcset": normalisedSrc.value.srcset, + "alt": props.alt, + "crossorigin": props.crossorigin, + "referrerpolicy": props.referrerpolicy, + "draggable": props.draggable, + "sizes": props.sizes, + "ref": image, + "onLoad": onLoad, + "onError": onError + }, null); + const sources = slots.sources?.(); + return _createVNode$2c(MaybeTransition, { + "transition": props.transition, + "appear": true + }, { + default: () => [withDirectives$1(sources ? _createVNode$2c("picture", { + "class": "v-img__picture" + }, [sources, img]) : img, [[vShow, state.value === 'loaded']])] + }); + }; + const __preloadImage = () => _createVNode$2c(MaybeTransition, { + "transition": props.transition + }, { + default: () => [normalisedSrc.value.lazySrc && state.value !== 'loaded' && _createVNode$2c("img", { + "class": ['v-img__img', 'v-img__img--preload', containClasses.value], + "style": { + objectPosition: props.position + }, + "src": normalisedSrc.value.lazySrc, + "alt": props.alt, + "crossorigin": props.crossorigin, + "referrerpolicy": props.referrerpolicy, + "draggable": props.draggable + }, null)] + }); + const __placeholder = () => { + if (!slots.placeholder) return null; + return _createVNode$2c(MaybeTransition, { + "transition": props.transition, + "appear": true + }, { + default: () => [(state.value === 'loading' || state.value === 'error' && !slots.error) && _createVNode$2c("div", { + "class": "v-img__placeholder" + }, [slots.placeholder()])] + }); + }; + const __error = () => { + if (!slots.error) return null; + return _createVNode$2c(MaybeTransition, { + "transition": props.transition, + "appear": true + }, { + default: () => [state.value === 'error' && _createVNode$2c("div", { + "class": "v-img__error" + }, [slots.error()])] + }); + }; + const __gradient = () => { + if (!props.gradient) return null; + return _createVNode$2c("div", { + "class": "v-img__gradient", + "style": { + backgroundImage: `linear-gradient(${props.gradient})` + } + }, null); + }; + const isBooted = shallowRef$E(false); + { + const stop = watch$D(aspectRatio, val => { + if (val) { + // Doesn't work with nextTick, idk why + requestAnimationFrame(() => { + requestAnimationFrame(() => { + isBooted.value = true; + }); + }); + stop(); + } + }); + } + useRender(() => { + const responsiveProps = VResponsive.filterProps(props); + return _withDirectives$j(_createVNode$2c(VResponsive, _mergeProps$11({ + "class": ['v-img', { + 'v-img--absolute': props.absolute, + 'v-img--booting': !isBooted.value + }, backgroundColorClasses.value, roundedClasses.value, props.class], + "style": [{ + width: convertToUnit(props.width === 'auto' ? naturalWidth.value : props.width) + }, backgroundColorStyles.value, props.style] + }, responsiveProps, { + "aspectRatio": aspectRatio.value, + "aria-label": props.alt, + "role": props.alt ? 'img' : undefined + }), { + additional: () => _createVNode$2c(_Fragment$A, null, [_createVNode$2c(__image, null, null), _createVNode$2c(__preloadImage, null, null), _createVNode$2c(__gradient, null, null), _createVNode$2c(__placeholder, null, null), _createVNode$2c(__error, null, null)]), + default: slots.default + }), [[_resolveDirective$$("intersect"), { + handler: init, + options: props.options + }, null, { + once: true + }]]); + }); + return { + currentSrc, + image, + state, + naturalWidth, + naturalHeight + }; + } +}); + +// Utilities +const {computed: computed$1U,isRef: isRef$1} = await importShared('vue'); +// Composables +const makeBorderProps = propsFactory({ + border: [Boolean, Number, String] +}, 'border'); +function useBorder(props) { + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + const borderClasses = computed$1U(() => { + const border = isRef$1(props) ? props.value : props.border; + const classes = []; + if (border === true || border === '') { + classes.push(`${name}--border`); + } else if (typeof border === 'string' || border === 0) { + for (const value of String(border).split(' ')) { + classes.push(`border-${value}`); + } + } + return classes; + }); + return { + borderClasses + }; +} + +// Utilities +const {computed: computed$1T,isRef} = await importShared('vue'); +// Composables +const makeElevationProps = propsFactory({ + elevation: { + type: [Number, String], + validator(v) { + const value = parseInt(v); + return !isNaN(value) && value >= 0 && + // Material Design has a maximum elevation of 24 + // https://material.io/design/environment/elevation.html#default-elevations + value <= 24; + } + } +}, 'elevation'); +function useElevation(props) { + const elevationClasses = computed$1T(() => { + const elevation = isRef(props) ? props.value : props.elevation; + const classes = []; + if (elevation == null) return classes; + classes.push(`elevation-${elevation}`); + return classes; + }); + return { + elevationClasses + }; +} + +const {resolveDirective:_resolveDirective$_,createVNode:_createVNode$2b} = await importShared('vue'); +const {computed: computed$1S,shallowRef: shallowRef$D,toRef: toRef$J} = await importShared('vue'); +const allowedDensities$1 = [null, 'prominent', 'default', 'comfortable', 'compact']; +const makeVToolbarProps = propsFactory({ + absolute: Boolean, + collapse: Boolean, + color: String, + density: { + type: String, + default: 'default', + validator: v => allowedDensities$1.includes(v) + }, + extended: Boolean, + extensionHeight: { + type: [Number, String], + default: 48 + }, + flat: Boolean, + floating: Boolean, + height: { + type: [Number, String], + default: 64 + }, + image: String, + title: String, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeElevationProps(), + ...makeRoundedProps(), + ...makeTagProps({ + tag: 'header' + }), + ...makeThemeProps() +}, 'VToolbar'); +const VToolbar = genericComponent()({ + name: 'VToolbar', + props: makeVToolbarProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$J(props, 'color')); + const { + borderClasses + } = useBorder(props); + const { + elevationClasses + } = useElevation(props); + const { + roundedClasses + } = useRounded(props); + const { + themeClasses + } = provideTheme(props); + const { + rtlClasses + } = useRtl(); + const isExtended = shallowRef$D(!!(props.extended || slots.extension?.())); + const contentHeight = computed$1S(() => parseInt(Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0), 10)); + const extensionHeight = computed$1S(() => isExtended.value ? parseInt(Number(props.extensionHeight) + (props.density === 'prominent' ? Number(props.extensionHeight) : 0) - (props.density === 'comfortable' ? 4 : 0) - (props.density === 'compact' ? 8 : 0), 10) : 0); + provideDefaults({ + VBtn: { + variant: 'text' + } + }); + useRender(() => { + const hasTitle = !!(props.title || slots.title); + const hasImage = !!(slots.image || props.image); + const extension = slots.extension?.(); + isExtended.value = !!(props.extended || extension); + return _createVNode$2b(props.tag, { + "class": ['v-toolbar', { + 'v-toolbar--absolute': props.absolute, + 'v-toolbar--collapse': props.collapse, + 'v-toolbar--flat': props.flat, + 'v-toolbar--floating': props.floating, + [`v-toolbar--density-${props.density}`]: true + }, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, themeClasses.value, rtlClasses.value, props.class], + "style": [backgroundColorStyles.value, props.style] + }, { + default: () => [hasImage && _createVNode$2b("div", { + "key": "image", + "class": "v-toolbar__image" + }, [!slots.image ? _createVNode$2b(VImg, { + "key": "image-img", + "cover": true, + "src": props.image + }, null) : _createVNode$2b(VDefaultsProvider, { + "key": "image-defaults", + "disabled": !props.image, + "defaults": { + VImg: { + cover: true, + src: props.image + } + } + }, slots.image)]), _createVNode$2b(VDefaultsProvider, { + "defaults": { + VTabs: { + height: convertToUnit(contentHeight.value) + } + } + }, { + default: () => [_createVNode$2b("div", { + "class": "v-toolbar__content", + "style": { + height: convertToUnit(contentHeight.value) + } + }, [slots.prepend && _createVNode$2b("div", { + "class": "v-toolbar__prepend" + }, [slots.prepend?.()]), hasTitle && _createVNode$2b(VToolbarTitle, { + "key": "title", + "text": props.title + }, { + text: slots.title + }), slots.default?.(), slots.append && _createVNode$2b("div", { + "class": "v-toolbar__append" + }, [slots.append?.()])])] + }), _createVNode$2b(VDefaultsProvider, { + "defaults": { + VTabs: { + height: convertToUnit(extensionHeight.value) + } + } + }, { + default: () => [_createVNode$2b(VExpandTransition, null, { + default: () => [isExtended.value && _createVNode$2b("div", { + "class": "v-toolbar__extension", + "style": { + height: convertToUnit(extensionHeight.value) + } + }, [extension])] + })] + })] + }); + }); + return { + contentHeight, + extensionHeight + }; + } +}); + +// Utilities +const {computed: computed$1R,onBeforeUnmount: onBeforeUnmount$a,onMounted: onMounted$d,ref: ref$O,shallowRef: shallowRef$C,watch: watch$C} = await importShared('vue'); +// Composables +const makeScrollProps = propsFactory({ + scrollTarget: { + type: String + }, + scrollThreshold: { + type: [String, Number], + default: 300 + } +}, 'scroll'); +function useScroll(props) { + let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const { + canScroll + } = args; + let previousScroll = 0; + let previousScrollHeight = 0; + const target = ref$O(null); + const currentScroll = shallowRef$C(0); + const savedScroll = shallowRef$C(0); + const currentThreshold = shallowRef$C(0); + const isScrollActive = shallowRef$C(false); + const isScrollingUp = shallowRef$C(false); + const scrollThreshold = computed$1R(() => { + return Number(props.scrollThreshold); + }); + + /** + * 1: at top + * 0: at threshold + */ + const scrollRatio = computed$1R(() => { + return clamp((scrollThreshold.value - currentScroll.value) / scrollThreshold.value || 0); + }); + const onScroll = () => { + const targetEl = target.value; + if (!targetEl || canScroll && !canScroll.value) return; + previousScroll = currentScroll.value; + currentScroll.value = 'window' in targetEl ? targetEl.pageYOffset : targetEl.scrollTop; + const currentScrollHeight = targetEl instanceof Window ? document.documentElement.scrollHeight : targetEl.scrollHeight; + if (previousScrollHeight !== currentScrollHeight) { + previousScrollHeight = currentScrollHeight; + return; + } + isScrollingUp.value = currentScroll.value < previousScroll; + currentThreshold.value = Math.abs(currentScroll.value - scrollThreshold.value); + }; + watch$C(isScrollingUp, () => { + savedScroll.value = savedScroll.value || currentScroll.value; + }); + watch$C(isScrollActive, () => { + savedScroll.value = 0; + }); + onMounted$d(() => { + watch$C(() => props.scrollTarget, scrollTarget => { + const newTarget = scrollTarget ? document.querySelector(scrollTarget) : window; + if (!newTarget) { + consoleWarn(`Unable to locate element with identifier ${scrollTarget}`); + return; + } + if (newTarget === target.value) return; + target.value?.removeEventListener('scroll', onScroll); + target.value = newTarget; + target.value.addEventListener('scroll', onScroll, { + passive: true + }); + }, { + immediate: true + }); + }); + onBeforeUnmount$a(() => { + target.value?.removeEventListener('scroll', onScroll); + }); + + // Do we need this? If yes - seems that + // there's no need to expose onScroll + canScroll && watch$C(canScroll, onScroll, { + immediate: true + }); + return { + scrollThreshold, + currentScroll, + currentThreshold, + isScrollActive, + scrollRatio, + // required only for testing + // probably can be removed + // later (2 chars chlng) + isScrollingUp, + savedScroll + }; +} + +// Utilities +const {computed: computed$1Q,onMounted: onMounted$c,readonly: readonly$1,shallowRef: shallowRef$B} = await importShared('vue'); + + +// Composables +function useSsrBoot() { + const isBooted = shallowRef$B(false); + onMounted$c(() => { + window.requestAnimationFrame(() => { + isBooted.value = true; + }); + }); + const ssrBootStyles = computed$1Q(() => !isBooted.value ? { + transition: 'none !important' + } : undefined); + return { + ssrBootStyles, + isBooted: readonly$1(isBooted) + }; +} + +const {createVNode:_createVNode$2a,mergeProps:_mergeProps$10,resolveDirective:_resolveDirective$Z} = await importShared('vue'); +const {computed: computed$1P,ref: ref$N,shallowRef: shallowRef$A,toRef: toRef$I,watchEffect: watchEffect$g} = await importShared('vue'); +const makeVAppBarProps = propsFactory({ + scrollBehavior: String, + modelValue: { + type: Boolean, + default: true + }, + location: { + type: String, + default: 'top', + validator: value => ['top', 'bottom'].includes(value) + }, + ...makeVToolbarProps(), + ...makeLayoutItemProps(), + ...makeScrollProps(), + height: { + type: [Number, String], + default: 64 + } +}, 'VAppBar'); +const VAppBar = genericComponent()({ + name: 'VAppBar', + props: makeVAppBarProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const vToolbarRef = ref$N(); + const isActive = useProxiedModel(props, 'modelValue'); + const scrollBehavior = computed$1P(() => { + const behavior = new Set(props.scrollBehavior?.split(' ') ?? []); + return { + hide: behavior.has('hide'), + fullyHide: behavior.has('fully-hide'), + inverted: behavior.has('inverted'), + collapse: behavior.has('collapse'), + elevate: behavior.has('elevate'), + fadeImage: behavior.has('fade-image') + // shrink: behavior.has('shrink'), + }; + }); + const canScroll = computed$1P(() => { + const behavior = scrollBehavior.value; + return behavior.hide || behavior.fullyHide || behavior.inverted || behavior.collapse || behavior.elevate || behavior.fadeImage || + // behavior.shrink || + !isActive.value; + }); + const { + currentScroll, + scrollThreshold, + isScrollingUp, + scrollRatio + } = useScroll(props, { + canScroll + }); + const canHide = computed$1P(() => scrollBehavior.value.hide || scrollBehavior.value.fullyHide); + const isCollapsed = computed$1P(() => props.collapse || scrollBehavior.value.collapse && (scrollBehavior.value.inverted ? scrollRatio.value > 0 : scrollRatio.value === 0)); + const isFlat = computed$1P(() => props.flat || scrollBehavior.value.fullyHide && !isActive.value || scrollBehavior.value.elevate && (scrollBehavior.value.inverted ? currentScroll.value > 0 : currentScroll.value === 0)); + const opacity = computed$1P(() => scrollBehavior.value.fadeImage ? scrollBehavior.value.inverted ? 1 - scrollRatio.value : scrollRatio.value : undefined); + const height = computed$1P(() => { + if (scrollBehavior.value.hide && scrollBehavior.value.inverted) return 0; + const height = vToolbarRef.value?.contentHeight ?? 0; + const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0; + if (!canHide.value) return height + extensionHeight; + return currentScroll.value < scrollThreshold.value || scrollBehavior.value.fullyHide ? height + extensionHeight : height; + }); + useToggleScope(computed$1P(() => !!props.scrollBehavior), () => { + watchEffect$g(() => { + if (canHide.value) { + if (scrollBehavior.value.inverted) { + isActive.value = currentScroll.value > scrollThreshold.value; + } else { + isActive.value = isScrollingUp.value || currentScroll.value < scrollThreshold.value; + } + } else { + isActive.value = true; + } + }); + }); + const { + ssrBootStyles + } = useSsrBoot(); + const { + layoutItemStyles + } = useLayoutItem({ + id: props.name, + order: computed$1P(() => parseInt(props.order, 10)), + position: toRef$I(props, 'location'), + layoutSize: height, + elementSize: shallowRef$A(undefined), + active: isActive, + absolute: toRef$I(props, 'absolute') + }); + useRender(() => { + const toolbarProps = VToolbar.filterProps(props); + return _createVNode$2a(VToolbar, _mergeProps$10({ + "ref": vToolbarRef, + "class": ['v-app-bar', { + 'v-app-bar--bottom': props.location === 'bottom' + }, props.class], + "style": [{ + ...layoutItemStyles.value, + '--v-toolbar-image-opacity': opacity.value, + height: undefined, + ...ssrBootStyles.value + }, props.style] + }, toolbarProps, { + "collapse": isCollapsed.value, + "flat": isFlat.value + }), slots); + }); + return {}; + } +}); + +// Utilities +const {computed: computed$1O} = await importShared('vue'); +const allowedDensities = [null, 'default', 'comfortable', 'compact']; + +// typeof allowedDensities[number] evalutes to any +// when generating api types for whatever reason. + +// Composables +const makeDensityProps = propsFactory({ + density: { + type: String, + default: 'default', + validator: v => allowedDensities.includes(v) + } +}, 'density'); +function useDensity(props) { + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + const densityClasses = computed$1O(() => { + return `${name}--density-${props.density}`; + }); + return { + densityClasses + }; +} + +const {createVNode:_createVNode$29,Fragment:_Fragment$z} = await importShared('vue'); +const {computed: computed$1N,unref: unref$3} = await importShared('vue'); +const allowedVariants$2 = ['elevated', 'flat', 'tonal', 'outlined', 'text', 'plain']; +function genOverlays(isClickable, name) { + return _createVNode$29(_Fragment$z, null, [isClickable && _createVNode$29("span", { + "key": "overlay", + "class": `${name}__overlay` + }, null), _createVNode$29("span", { + "key": "underlay", + "class": `${name}__underlay` + }, null)]); +} +const makeVariantProps = propsFactory({ + color: String, + variant: { + type: String, + default: 'elevated', + validator: v => allowedVariants$2.includes(v) + } +}, 'variant'); +function useVariant(props) { + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + const variantClasses = computed$1N(() => { + const { + variant + } = unref$3(props); + return `${name}--variant-${variant}`; + }); + const { + colorClasses, + colorStyles + } = useColor(computed$1N(() => { + const { + variant, + color + } = unref$3(props); + return { + [['elevated', 'flat'].includes(variant) ? 'background' : 'text']: color + }; + })); + return { + colorClasses, + colorStyles, + variantClasses + }; +} + +const {createVNode:_createVNode$28,resolveDirective:_resolveDirective$Y} = await importShared('vue'); +const {toRef: toRef$H} = await importShared('vue'); +const makeVBtnGroupProps = propsFactory({ + baseColor: String, + divided: Boolean, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeElevationProps(), + ...makeRoundedProps(), + ...makeTagProps(), + ...makeThemeProps(), + ...makeVariantProps() +}, 'VBtnGroup'); +const VBtnGroup = genericComponent()({ + name: 'VBtnGroup', + props: makeVBtnGroupProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + densityClasses + } = useDensity(props); + const { + borderClasses + } = useBorder(props); + const { + elevationClasses + } = useElevation(props); + const { + roundedClasses + } = useRounded(props); + provideDefaults({ + VBtn: { + height: 'auto', + baseColor: toRef$H(props, 'baseColor'), + color: toRef$H(props, 'color'), + density: toRef$H(props, 'density'), + flat: true, + variant: toRef$H(props, 'variant') + } + }); + useRender(() => { + return _createVNode$28(props.tag, { + "class": ['v-btn-group', { + 'v-btn-group--divided': props.divided + }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class], + "style": props.style + }, slots); + }); + } +}); + +const {computed: computed$1M,inject: inject$l,onBeforeUnmount: onBeforeUnmount$9,onMounted: onMounted$b,onUpdated,provide: provide$g,reactive: reactive$2,toRef: toRef$G,unref: unref$2,watch: watch$B} = await importShared('vue'); +const makeGroupProps = propsFactory({ + modelValue: { + type: null, + default: undefined + }, + multiple: Boolean, + mandatory: [Boolean, String], + max: Number, + selectedClass: String, + disabled: Boolean +}, 'group'); +const makeGroupItemProps = propsFactory({ + value: null, + disabled: Boolean, + selectedClass: String +}, 'group-item'); + +// Composables + +function useGroupItem(props, injectKey) { + let required = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + const vm = getCurrentInstance('useGroupItem'); + if (!vm) { + throw new Error('[Vuetify] useGroupItem composable must be used inside a component setup function'); + } + const id = getUid(); + provide$g(Symbol.for(`${injectKey.description}:id`), id); + const group = inject$l(injectKey, null); + if (!group) { + if (!required) return group; + throw new Error(`[Vuetify] Could not find useGroup injection with symbol ${injectKey.description}`); + } + const value = toRef$G(props, 'value'); + const disabled = computed$1M(() => !!(group.disabled.value || props.disabled)); + group.register({ + id, + value, + disabled + }, vm); + onBeforeUnmount$9(() => { + group.unregister(id); + }); + const isSelected = computed$1M(() => { + return group.isSelected(id); + }); + const isFirst = computed$1M(() => { + return group.items.value[0].id === id; + }); + const isLast = computed$1M(() => { + return group.items.value[group.items.value.length - 1].id === id; + }); + const selectedClass = computed$1M(() => isSelected.value && [group.selectedClass.value, props.selectedClass]); + watch$B(isSelected, value => { + vm.emit('group:selected', { + value + }); + }, { + flush: 'sync' + }); + return { + id, + isSelected, + isFirst, + isLast, + toggle: () => group.select(id, !isSelected.value), + select: value => group.select(id, value), + selectedClass, + value, + disabled, + group + }; +} +function useGroup(props, injectKey) { + let isUnmounted = false; + const items = reactive$2([]); + const selected = useProxiedModel(props, 'modelValue', [], v => { + if (v == null) return []; + return getIds(items, wrapInArray(v)); + }, v => { + const arr = getValues(items, v); + return props.multiple ? arr : arr[0]; + }); + const groupVm = getCurrentInstance('useGroup'); + function register(item, vm) { + // Is there a better way to fix this typing? + const unwrapped = item; + const key = Symbol.for(`${injectKey.description}:id`); + const children = findChildrenWithProvide(key, groupVm?.vnode); + const index = children.indexOf(vm); + if (unref$2(unwrapped.value) == null) { + unwrapped.value = index; + unwrapped.useIndexAsValue = true; + } + if (index > -1) { + items.splice(index, 0, unwrapped); + } else { + items.push(unwrapped); + } + } + function unregister(id) { + if (isUnmounted) return; + + // TODO: re-evaluate this line's importance in the future + // should we only modify the model if mandatory is set. + // selected.value = selected.value.filter(v => v !== id) + + forceMandatoryValue(); + const index = items.findIndex(item => item.id === id); + items.splice(index, 1); + } + + // If mandatory and nothing is selected, then select first non-disabled item + function forceMandatoryValue() { + const item = items.find(item => !item.disabled); + if (item && props.mandatory === 'force' && !selected.value.length) { + selected.value = [item.id]; + } + } + onMounted$b(() => { + forceMandatoryValue(); + }); + onBeforeUnmount$9(() => { + isUnmounted = true; + }); + onUpdated(() => { + // #19655 update the items that use the index as the value. + for (let i = 0; i < items.length; i++) { + if (items[i].useIndexAsValue) { + items[i].value = i; + } + } + }); + function select(id, value) { + const item = items.find(item => item.id === id); + if (value && item?.disabled) return; + if (props.multiple) { + const internalValue = selected.value.slice(); + const index = internalValue.findIndex(v => v === id); + const isSelected = ~index; + value = value ?? !isSelected; + + // We can't remove value if group is + // mandatory, value already exists, + // and it is the only value + if (isSelected && props.mandatory && internalValue.length <= 1) return; + + // We can't add value if it would + // cause max limit to be exceeded + if (!isSelected && props.max != null && internalValue.length + 1 > props.max) return; + if (index < 0 && value) internalValue.push(id);else if (index >= 0 && !value) internalValue.splice(index, 1); + selected.value = internalValue; + } else { + const isSelected = selected.value.includes(id); + if (props.mandatory && isSelected) return; + selected.value = value ?? !isSelected ? [id] : []; + } + } + function step(offset) { + // getting an offset from selected value obviously won't work with multiple values + if (props.multiple) consoleWarn('This method is not supported when using "multiple" prop'); + if (!selected.value.length) { + const item = items.find(item => !item.disabled); + item && (selected.value = [item.id]); + } else { + const currentId = selected.value[0]; + const currentIndex = items.findIndex(i => i.id === currentId); + let newIndex = (currentIndex + offset) % items.length; + let newItem = items[newIndex]; + while (newItem.disabled && newIndex !== currentIndex) { + newIndex = (newIndex + offset) % items.length; + newItem = items[newIndex]; + } + if (newItem.disabled) return; + selected.value = [items[newIndex].id]; + } + } + const state = { + register, + unregister, + selected, + select, + disabled: toRef$G(props, 'disabled'), + prev: () => step(items.length - 1), + next: () => step(1), + isSelected: id => selected.value.includes(id), + selectedClass: computed$1M(() => props.selectedClass), + items: computed$1M(() => items), + getItemIndex: value => getItemIndex(items, value) + }; + provide$g(injectKey, state); + return state; +} +function getItemIndex(items, value) { + const ids = getIds(items, [value]); + if (!ids.length) return -1; + return items.findIndex(item => item.id === ids[0]); +} +function getIds(items, modelValue) { + const ids = []; + modelValue.forEach(value => { + const item = items.find(item => deepEqual(value, item.value)); + const itemByIndex = items[value]; + if (item?.value != null) { + ids.push(item.id); + } else if (itemByIndex != null) { + ids.push(itemByIndex.id); + } + }); + return ids; +} +function getValues(items, ids) { + const values = []; + ids.forEach(id => { + const itemIndex = items.findIndex(item => item.id === id); + if (~itemIndex) { + const item = items[itemIndex]; + values.push(item.value != null ? item.value : itemIndex); + } + }); + return values; +} + +const {createVNode:_createVNode$27,mergeProps:_mergeProps$$} = await importShared('vue'); +const VBtnToggleSymbol = Symbol.for('vuetify:v-btn-toggle'); +const makeVBtnToggleProps = propsFactory({ + ...makeVBtnGroupProps(), + ...makeGroupProps() +}, 'VBtnToggle'); +const VBtnToggle = genericComponent()({ + name: 'VBtnToggle', + props: makeVBtnToggleProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + isSelected, + next, + prev, + select, + selected + } = useGroup(props, VBtnToggleSymbol); + useRender(() => { + const btnGroupProps = VBtnGroup.filterProps(props); + return _createVNode$27(VBtnGroup, _mergeProps$$({ + "class": ['v-btn-toggle', props.class] + }, btnGroupProps, { + "style": props.style + }), { + default: () => [slots.default?.({ + isSelected, + next, + prev, + select, + selected + })] + }); + }); + return { + next, + prev, + select + }; + } +}); + +// Utilities +const predefinedSizes = ['x-small', 'small', 'default', 'large', 'x-large']; +// Composables +const makeSizeProps = propsFactory({ + size: { + type: [String, Number], + default: 'default' + } +}, 'size'); +function useSize(props) { + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + return destructComputed(() => { + let sizeClasses; + let sizeStyles; + if (includes(predefinedSizes, props.size)) { + sizeClasses = `${name}--size-${props.size}`; + } else if (props.size) { + sizeStyles = { + width: convertToUnit(props.size), + height: convertToUnit(props.size) + }; + } + return { + sizeClasses, + sizeStyles + }; + }); +} + +const {createVNode:_createVNode$26} = await importShared('vue'); +const {computed: computed$1L,ref: ref$M,Text,toRef: toRef$F} = await importShared('vue'); +const makeVIconProps = propsFactory({ + color: String, + disabled: Boolean, + start: Boolean, + end: Boolean, + icon: IconValue, + ...makeComponentProps(), + ...makeSizeProps(), + ...makeTagProps({ + tag: 'i' + }), + ...makeThemeProps() +}, 'VIcon'); +const VIcon = genericComponent()({ + name: 'VIcon', + props: makeVIconProps(), + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const slotIcon = ref$M(); + const { + themeClasses + } = provideTheme(props); + const { + iconData + } = useIcon(computed$1L(() => slotIcon.value || props.icon)); + const { + sizeClasses + } = useSize(props); + const { + textColorClasses, + textColorStyles + } = useTextColor(toRef$F(props, 'color')); + useRender(() => { + const slotValue = slots.default?.(); + if (slotValue) { + slotIcon.value = flattenFragments(slotValue).filter(node => node.type === Text && node.children && typeof node.children === 'string')[0]?.children; + } + const hasClick = !!(attrs.onClick || attrs.onClickOnce); + return _createVNode$26(iconData.value.component, { + "tag": props.tag, + "icon": iconData.value.icon, + "class": ['v-icon', 'notranslate', themeClasses.value, sizeClasses.value, textColorClasses.value, { + 'v-icon--clickable': hasClick, + 'v-icon--disabled': props.disabled, + 'v-icon--start': props.start, + 'v-icon--end': props.end + }, props.class], + "style": [!sizeClasses.value ? { + fontSize: convertToUnit(props.size), + height: convertToUnit(props.size), + width: convertToUnit(props.size) + } : undefined, textColorStyles.value, props.style], + "role": hasClick ? 'button' : undefined, + "aria-hidden": !hasClick, + "tabindex": hasClick ? props.disabled ? -1 : 0 : undefined + }, { + default: () => [slotValue] + }); + }); + return {}; + } +}); + +// Utilities +const {onBeforeUnmount: onBeforeUnmount$8,ref: ref$L,shallowRef: shallowRef$z,watch: watch$A} = await importShared('vue'); +function useIntersectionObserver(callback, options) { + const intersectionRef = ref$L(); + const isIntersecting = shallowRef$z(false); + if (SUPPORTS_INTERSECTION) { + const observer = new IntersectionObserver(entries => { + isIntersecting.value = !!entries.find(entry => entry.isIntersecting); + }, options); + onBeforeUnmount$8(() => { + observer.disconnect(); + }); + watch$A(intersectionRef, (newValue, oldValue) => { + if (oldValue) { + observer.unobserve(oldValue); + isIntersecting.value = false; + } + if (newValue) observer.observe(newValue); + }, { + flush: 'post' + }); + } + return { + intersectionRef, + isIntersecting + }; +} + +const {createVNode:_createVNode$25} = await importShared('vue'); +const {computed: computed$1K,ref: ref$K,toRef: toRef$E,watchEffect: watchEffect$f} = await importShared('vue'); +const makeVProgressCircularProps = propsFactory({ + bgColor: String, + color: String, + indeterminate: [Boolean, String], + modelValue: { + type: [Number, String], + default: 0 + }, + rotate: { + type: [Number, String], + default: 0 + }, + width: { + type: [Number, String], + default: 4 + }, + ...makeComponentProps(), + ...makeSizeProps(), + ...makeTagProps({ + tag: 'div' + }), + ...makeThemeProps() +}, 'VProgressCircular'); +const VProgressCircular = genericComponent()({ + name: 'VProgressCircular', + props: makeVProgressCircularProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const MAGIC_RADIUS_CONSTANT = 20; + const CIRCUMFERENCE = 2 * Math.PI * MAGIC_RADIUS_CONSTANT; + const root = ref$K(); + const { + themeClasses + } = provideTheme(props); + const { + sizeClasses, + sizeStyles + } = useSize(props); + const { + textColorClasses, + textColorStyles + } = useTextColor(toRef$E(props, 'color')); + const { + textColorClasses: underlayColorClasses, + textColorStyles: underlayColorStyles + } = useTextColor(toRef$E(props, 'bgColor')); + const { + intersectionRef, + isIntersecting + } = useIntersectionObserver(); + const { + resizeRef, + contentRect + } = useResizeObserver(); + const normalizedValue = computed$1K(() => Math.max(0, Math.min(100, parseFloat(props.modelValue)))); + const width = computed$1K(() => Number(props.width)); + const size = computed$1K(() => { + // Get size from element if size prop value is small, large etc + return sizeStyles.value ? Number(props.size) : contentRect.value ? contentRect.value.width : Math.max(width.value, 32); + }); + const diameter = computed$1K(() => MAGIC_RADIUS_CONSTANT / (1 - width.value / size.value) * 2); + const strokeWidth = computed$1K(() => width.value / size.value * diameter.value); + const strokeDashOffset = computed$1K(() => convertToUnit((100 - normalizedValue.value) / 100 * CIRCUMFERENCE)); + watchEffect$f(() => { + intersectionRef.value = root.value; + resizeRef.value = root.value; + }); + useRender(() => _createVNode$25(props.tag, { + "ref": root, + "class": ['v-progress-circular', { + 'v-progress-circular--indeterminate': !!props.indeterminate, + 'v-progress-circular--visible': isIntersecting.value, + 'v-progress-circular--disable-shrink': props.indeterminate === 'disable-shrink' + }, themeClasses.value, sizeClasses.value, textColorClasses.value, props.class], + "style": [sizeStyles.value, textColorStyles.value, props.style], + "role": "progressbar", + "aria-valuemin": "0", + "aria-valuemax": "100", + "aria-valuenow": props.indeterminate ? undefined : normalizedValue.value + }, { + default: () => [_createVNode$25("svg", { + "style": { + transform: `rotate(calc(-90deg + ${Number(props.rotate)}deg))` + }, + "xmlns": "http://www.w3.org/2000/svg", + "viewBox": `0 0 ${diameter.value} ${diameter.value}` + }, [_createVNode$25("circle", { + "class": ['v-progress-circular__underlay', underlayColorClasses.value], + "style": underlayColorStyles.value, + "fill": "transparent", + "cx": "50%", + "cy": "50%", + "r": MAGIC_RADIUS_CONSTANT, + "stroke-width": strokeWidth.value, + "stroke-dasharray": CIRCUMFERENCE, + "stroke-dashoffset": 0 + }, null), _createVNode$25("circle", { + "class": "v-progress-circular__overlay", + "fill": "transparent", + "cx": "50%", + "cy": "50%", + "r": MAGIC_RADIUS_CONSTANT, + "stroke-width": strokeWidth.value, + "stroke-dasharray": CIRCUMFERENCE, + "stroke-dashoffset": strokeDashOffset.value + }, null)]), slots.default && _createVNode$25("div", { + "class": "v-progress-circular__content" + }, [slots.default({ + value: normalizedValue.value + })])] + })); + return {}; + } +}); + +const {computed: computed$1J} = await importShared('vue'); +const oppositeMap = { + center: 'center', + top: 'bottom', + bottom: 'top', + left: 'right', + right: 'left' +}; +const makeLocationProps = propsFactory({ + location: String +}, 'location'); +function useLocation(props) { + let opposite = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + let offset = arguments.length > 2 ? arguments[2] : undefined; + const { + isRtl + } = useRtl(); + const locationStyles = computed$1J(() => { + if (!props.location) return {}; + const { + side, + align + } = parseAnchor(props.location.split(' ').length > 1 ? props.location : `${props.location} center`, isRtl.value); + function getOffset(side) { + return offset ? offset(side) : 0; + } + const styles = {}; + if (side !== 'center') { + if (opposite) styles[oppositeMap[side]] = `calc(100% - ${getOffset(side)}px)`;else styles[side] = 0; + } + if (align !== 'center') { + if (opposite) styles[oppositeMap[align]] = `calc(100% - ${getOffset(align)}px)`;else styles[align] = 0; + } else { + if (side === 'center') styles.top = styles.left = '50%';else { + styles[{ + top: 'left', + bottom: 'left', + left: 'top', + right: 'top' + }[side]] = '50%'; + } + styles.transform = { + top: 'translateX(-50%)', + bottom: 'translateX(-50%)', + left: 'translateY(-50%)', + right: 'translateY(-50%)', + center: 'translate(-50%, -50%)' + }[side]; + } + return styles; + }); + return { + locationStyles + }; +} + +const {createVNode:_createVNode$24} = await importShared('vue'); +const {computed: computed$1I,Transition: Transition$2} = await importShared('vue'); +const makeVProgressLinearProps = propsFactory({ + absolute: Boolean, + active: { + type: Boolean, + default: true + }, + bgColor: String, + bgOpacity: [Number, String], + bufferValue: { + type: [Number, String], + default: 0 + }, + bufferColor: String, + bufferOpacity: [Number, String], + clickable: Boolean, + color: String, + height: { + type: [Number, String], + default: 4 + }, + indeterminate: Boolean, + max: { + type: [Number, String], + default: 100 + }, + modelValue: { + type: [Number, String], + default: 0 + }, + opacity: [Number, String], + reverse: Boolean, + stream: Boolean, + striped: Boolean, + roundedBar: Boolean, + ...makeComponentProps(), + ...makeLocationProps({ + location: 'top' + }), + ...makeRoundedProps(), + ...makeTagProps(), + ...makeThemeProps() +}, 'VProgressLinear'); +const VProgressLinear = genericComponent()({ + name: 'VProgressLinear', + props: makeVProgressLinearProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const progress = useProxiedModel(props, 'modelValue'); + const { + isRtl, + rtlClasses + } = useRtl(); + const { + themeClasses + } = provideTheme(props); + const { + locationStyles + } = useLocation(props); + const { + textColorClasses, + textColorStyles + } = useTextColor(props, 'color'); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(computed$1I(() => props.bgColor || props.color)); + const { + backgroundColorClasses: bufferColorClasses, + backgroundColorStyles: bufferColorStyles + } = useBackgroundColor(computed$1I(() => props.bufferColor || props.bgColor || props.color)); + const { + backgroundColorClasses: barColorClasses, + backgroundColorStyles: barColorStyles + } = useBackgroundColor(props, 'color'); + const { + roundedClasses + } = useRounded(props); + const { + intersectionRef, + isIntersecting + } = useIntersectionObserver(); + const max = computed$1I(() => parseFloat(props.max)); + const height = computed$1I(() => parseFloat(props.height)); + const normalizedBuffer = computed$1I(() => clamp(parseFloat(props.bufferValue) / max.value * 100, 0, 100)); + const normalizedValue = computed$1I(() => clamp(parseFloat(progress.value) / max.value * 100, 0, 100)); + const isReversed = computed$1I(() => isRtl.value !== props.reverse); + const transition = computed$1I(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition'); + const isForcedColorsModeActive = IN_BROWSER && window.matchMedia?.('(forced-colors: active)').matches; + function handleClick(e) { + if (!intersectionRef.value) return; + const { + left, + right, + width + } = intersectionRef.value.getBoundingClientRect(); + const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left; + progress.value = Math.round(value / width * max.value); + } + useRender(() => _createVNode$24(props.tag, { + "ref": intersectionRef, + "class": ['v-progress-linear', { + 'v-progress-linear--absolute': props.absolute, + 'v-progress-linear--active': props.active && isIntersecting.value, + 'v-progress-linear--reverse': isReversed.value, + 'v-progress-linear--rounded': props.rounded, + 'v-progress-linear--rounded-bar': props.roundedBar, + 'v-progress-linear--striped': props.striped + }, roundedClasses.value, themeClasses.value, rtlClasses.value, props.class], + "style": [{ + bottom: props.location === 'bottom' ? 0 : undefined, + top: props.location === 'top' ? 0 : undefined, + height: props.active ? convertToUnit(height.value) : 0, + '--v-progress-linear-height': convertToUnit(height.value), + ...(props.absolute ? locationStyles.value : {}) + }, props.style], + "role": "progressbar", + "aria-hidden": props.active ? 'false' : 'true', + "aria-valuemin": "0", + "aria-valuemax": props.max, + "aria-valuenow": props.indeterminate ? undefined : normalizedValue.value, + "onClick": props.clickable && handleClick + }, { + default: () => [props.stream && _createVNode$24("div", { + "key": "stream", + "class": ['v-progress-linear__stream', textColorClasses.value], + "style": { + ...textColorStyles.value, + [isReversed.value ? 'left' : 'right']: convertToUnit(-height.value), + borderTop: `${convertToUnit(height.value / 2)} dotted`, + opacity: parseFloat(props.bufferOpacity), + top: `calc(50% - ${convertToUnit(height.value / 4)})`, + width: convertToUnit(100 - normalizedBuffer.value, '%'), + '--v-progress-linear-stream-to': convertToUnit(height.value * (isReversed.value ? 1 : -1)) + } + }, null), _createVNode$24("div", { + "class": ['v-progress-linear__background', !isForcedColorsModeActive ? backgroundColorClasses.value : undefined], + "style": [backgroundColorStyles.value, { + opacity: parseFloat(props.bgOpacity), + width: props.stream ? 0 : undefined + }] + }, null), _createVNode$24("div", { + "class": ['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined], + "style": [bufferColorStyles.value, { + opacity: parseFloat(props.bufferOpacity), + width: convertToUnit(normalizedBuffer.value, '%') + }] + }, null), _createVNode$24(Transition$2, { + "name": transition.value + }, { + default: () => [!props.indeterminate ? _createVNode$24("div", { + "class": ['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined], + "style": [barColorStyles.value, { + width: convertToUnit(normalizedValue.value, '%') + }] + }, null) : _createVNode$24("div", { + "class": "v-progress-linear__indeterminate" + }, [['long', 'short'].map(bar => _createVNode$24("div", { + "key": bar, + "class": ['v-progress-linear__indeterminate', bar, !isForcedColorsModeActive ? barColorClasses.value : undefined], + "style": barColorStyles.value + }, null))])] + }), slots.default && _createVNode$24("div", { + "class": "v-progress-linear__content" + }, [slots.default({ + value: normalizedValue.value, + buffer: normalizedBuffer.value + })])] + })); + return {}; + } +}); + +const {createVNode:_createVNode$23} = await importShared('vue'); +const {computed: computed$1H} = await importShared('vue'); +// Composables +const makeLoaderProps = propsFactory({ + loading: [Boolean, String] +}, 'loader'); +function useLoader(props) { + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + const loaderClasses = computed$1H(() => ({ + [`${name}--loading`]: props.loading + })); + return { + loaderClasses + }; +} +function LoaderSlot(props, _ref) { + let { + slots + } = _ref; + return _createVNode$23("div", { + "class": `${props.name}__loader` + }, [slots.default?.({ + color: props.color, + isActive: props.active + }) || _createVNode$23(VProgressLinear, { + "absolute": props.absolute, + "active": props.active, + "color": props.color, + "height": "2", + "indeterminate": true + }, null)]); +} + +// Utilities +const {computed: computed$1G} = await importShared('vue'); +const positionValues = ['static', 'relative', 'fixed', 'absolute', 'sticky']; +// Composables +const makePositionProps = propsFactory({ + position: { + type: String, + validator: /* istanbul ignore next */v => positionValues.includes(v) + } +}, 'position'); +function usePosition(props) { + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + const positionClasses = computed$1G(() => { + return props.position ? `${name}--${props.position}` : undefined; + }); + return { + positionClasses + }; +} + +// Utilities +const {computed: computed$1F,nextTick: nextTick$m,onScopeDispose: onScopeDispose$9,reactive: reactive$1,resolveDynamicComponent,toRef: toRef$D} = await importShared('vue'); +function useRoute() { + const vm = getCurrentInstance('useRoute'); + return computed$1F(() => vm?.proxy?.$route); +} +function useRouter() { + return getCurrentInstance('useRouter')?.proxy?.$router; +} +function useLink(props, attrs) { + const RouterLink = resolveDynamicComponent('RouterLink'); + const isLink = computed$1F(() => !!(props.href || props.to)); + const isClickable = computed$1F(() => { + return isLink?.value || hasEvent(attrs, 'click') || hasEvent(props, 'click'); + }); + if (typeof RouterLink === 'string' || !('useLink' in RouterLink)) { + const href = toRef$D(props, 'href'); + return { + isLink, + isClickable, + href, + linkProps: reactive$1({ + href + }) + }; + } + // vue-router useLink `to` prop needs to be reactive and useLink will crash if undefined + const linkProps = computed$1F(() => ({ + ...props, + to: toRef$D(() => props.to || '') + })); + const routerLink = RouterLink.useLink(linkProps.value); + // Actual link needs to be undefined when to prop is not used + const link = computed$1F(() => props.to ? routerLink : undefined); + const route = useRoute(); + const isActive = computed$1F(() => { + if (!link.value) return false; + if (!props.exact) return link.value.isActive?.value ?? false; + if (!route.value) return link.value.isExactActive?.value ?? false; + return link.value.isExactActive?.value && deepEqual(link.value.route.value.query, route.value.query); + }); + const href = computed$1F(() => props.to ? link.value?.route.value.href : props.href); + return { + isLink, + isClickable, + isActive, + route: link.value?.route, + navigate: link.value?.navigate, + href, + linkProps: reactive$1({ + href, + 'aria-current': computed$1F(() => isActive.value ? 'page' : undefined) + }) + }; +} +const makeRouterProps = propsFactory({ + href: String, + replace: Boolean, + to: [String, Object], + exact: Boolean +}, 'router'); +let inTransition = false; +function useBackButton(router, cb) { + let popped = false; + let removeBefore; + let removeAfter; + if (IN_BROWSER) { + nextTick$m(() => { + window.addEventListener('popstate', onPopstate); + removeBefore = router?.beforeEach((to, from, next) => { + if (!inTransition) { + setTimeout(() => popped ? cb(next) : next()); + } else { + popped ? cb(next) : next(); + } + inTransition = true; + }); + removeAfter = router?.afterEach(() => { + inTransition = false; + }); + }); + onScopeDispose$9(() => { + window.removeEventListener('popstate', onPopstate); + removeBefore?.(); + removeAfter?.(); + }); + } + function onPopstate(e) { + if (e.state?.replaced) return; + popped = true; + setTimeout(() => popped = false); + } +} + +// Utilities +const {nextTick: nextTick$l,watch: watch$z} = await importShared('vue'); + + +// Types + +function useSelectLink(link, select) { + watch$z(() => link.isActive?.value, isActive => { + if (link.isLink.value && isActive && select) { + nextTick$l(() => { + select(true); + }); + } + }, { + immediate: true + }); +} + +// Styles +const stopSymbol = Symbol('rippleStop'); +const DELAY_RIPPLE = 80; +function transform(el, value) { + el.style.transform = value; + el.style.webkitTransform = value; +} +function isTouchEvent(e) { + return e.constructor.name === 'TouchEvent'; +} +function isKeyboardEvent(e) { + return e.constructor.name === 'KeyboardEvent'; +} +const calculate = function (e, el) { + let value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let localX = 0; + let localY = 0; + if (!isKeyboardEvent(e)) { + const offset = el.getBoundingClientRect(); + const target = isTouchEvent(e) ? e.touches[e.touches.length - 1] : e; + localX = target.clientX - offset.left; + localY = target.clientY - offset.top; + } + let radius = 0; + let scale = 0.3; + if (el._ripple?.circle) { + scale = 0.15; + radius = el.clientWidth / 2; + radius = value.center ? radius : radius + Math.sqrt((localX - radius) ** 2 + (localY - radius) ** 2) / 4; + } else { + radius = Math.sqrt(el.clientWidth ** 2 + el.clientHeight ** 2) / 2; + } + const centerX = `${(el.clientWidth - radius * 2) / 2}px`; + const centerY = `${(el.clientHeight - radius * 2) / 2}px`; + const x = value.center ? centerX : `${localX - radius}px`; + const y = value.center ? centerY : `${localY - radius}px`; + return { + radius, + scale, + x, + y, + centerX, + centerY + }; +}; +const ripples = { + /* eslint-disable max-statements */ + show(e, el) { + let value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + if (!el?._ripple?.enabled) { + return; + } + const container = document.createElement('span'); + const animation = document.createElement('span'); + container.appendChild(animation); + container.className = 'v-ripple__container'; + if (value.class) { + container.className += ` ${value.class}`; + } + const { + radius, + scale, + x, + y, + centerX, + centerY + } = calculate(e, el, value); + const size = `${radius * 2}px`; + animation.className = 'v-ripple__animation'; + animation.style.width = size; + animation.style.height = size; + el.appendChild(container); + const computed = window.getComputedStyle(el); + if (computed && computed.position === 'static') { + el.style.position = 'relative'; + el.dataset.previousPosition = 'static'; + } + animation.classList.add('v-ripple__animation--enter'); + animation.classList.add('v-ripple__animation--visible'); + transform(animation, `translate(${x}, ${y}) scale3d(${scale},${scale},${scale})`); + animation.dataset.activated = String(performance.now()); + setTimeout(() => { + animation.classList.remove('v-ripple__animation--enter'); + animation.classList.add('v-ripple__animation--in'); + transform(animation, `translate(${centerX}, ${centerY}) scale3d(1,1,1)`); + }, 0); + }, + hide(el) { + if (!el?._ripple?.enabled) return; + const ripples = el.getElementsByClassName('v-ripple__animation'); + if (ripples.length === 0) return; + const animation = ripples[ripples.length - 1]; + if (animation.dataset.isHiding) return;else animation.dataset.isHiding = 'true'; + const diff = performance.now() - Number(animation.dataset.activated); + const delay = Math.max(250 - diff, 0); + setTimeout(() => { + animation.classList.remove('v-ripple__animation--in'); + animation.classList.add('v-ripple__animation--out'); + setTimeout(() => { + const ripples = el.getElementsByClassName('v-ripple__animation'); + if (ripples.length === 1 && el.dataset.previousPosition) { + el.style.position = el.dataset.previousPosition; + delete el.dataset.previousPosition; + } + if (animation.parentNode?.parentNode === el) el.removeChild(animation.parentNode); + }, 300); + }, delay); + } +}; +function isRippleEnabled(value) { + return typeof value === 'undefined' || !!value; +} +function rippleShow(e) { + const value = {}; + const element = e.currentTarget; + if (!element?._ripple || element._ripple.touched || e[stopSymbol]) return; + + // Don't allow the event to trigger ripples on any other elements + e[stopSymbol] = true; + if (isTouchEvent(e)) { + element._ripple.touched = true; + element._ripple.isTouch = true; + } else { + // It's possible for touch events to fire + // as mouse events on Android/iOS, this + // will skip the event call if it has + // already been registered as touch + if (element._ripple.isTouch) return; + } + value.center = element._ripple.centered || isKeyboardEvent(e); + if (element._ripple.class) { + value.class = element._ripple.class; + } + if (isTouchEvent(e)) { + // already queued that shows or hides the ripple + if (element._ripple.showTimerCommit) return; + element._ripple.showTimerCommit = () => { + ripples.show(e, element, value); + }; + element._ripple.showTimer = window.setTimeout(() => { + if (element?._ripple?.showTimerCommit) { + element._ripple.showTimerCommit(); + element._ripple.showTimerCommit = null; + } + }, DELAY_RIPPLE); + } else { + ripples.show(e, element, value); + } +} +function rippleStop(e) { + e[stopSymbol] = true; +} +function rippleHide(e) { + const element = e.currentTarget; + if (!element?._ripple) return; + window.clearTimeout(element._ripple.showTimer); + + // The touch interaction occurs before the show timer is triggered. + // We still want to show ripple effect. + if (e.type === 'touchend' && element._ripple.showTimerCommit) { + element._ripple.showTimerCommit(); + element._ripple.showTimerCommit = null; + + // re-queue ripple hiding + element._ripple.showTimer = window.setTimeout(() => { + rippleHide(e); + }); + return; + } + window.setTimeout(() => { + if (element._ripple) { + element._ripple.touched = false; + } + }); + ripples.hide(element); +} +function rippleCancelShow(e) { + const element = e.currentTarget; + if (!element?._ripple) return; + if (element._ripple.showTimerCommit) { + element._ripple.showTimerCommit = null; + } + window.clearTimeout(element._ripple.showTimer); +} +let keyboardRipple = false; +function keyboardRippleShow(e) { + if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) { + keyboardRipple = true; + rippleShow(e); + } +} +function keyboardRippleHide(e) { + keyboardRipple = false; + rippleHide(e); +} +function focusRippleHide(e) { + if (keyboardRipple) { + keyboardRipple = false; + rippleHide(e); + } +} +function updateRipple(el, binding, wasEnabled) { + const { + value, + modifiers + } = binding; + const enabled = isRippleEnabled(value); + if (!enabled) { + ripples.hide(el); + } + el._ripple = el._ripple ?? {}; + el._ripple.enabled = enabled; + el._ripple.centered = modifiers.center; + el._ripple.circle = modifiers.circle; + if (isObject(value) && value.class) { + el._ripple.class = value.class; + } + if (enabled && !wasEnabled) { + if (modifiers.stop) { + el.addEventListener('touchstart', rippleStop, { + passive: true + }); + el.addEventListener('mousedown', rippleStop); + return; + } + el.addEventListener('touchstart', rippleShow, { + passive: true + }); + el.addEventListener('touchend', rippleHide, { + passive: true + }); + el.addEventListener('touchmove', rippleCancelShow, { + passive: true + }); + el.addEventListener('touchcancel', rippleHide); + el.addEventListener('mousedown', rippleShow); + el.addEventListener('mouseup', rippleHide); + el.addEventListener('mouseleave', rippleHide); + el.addEventListener('keydown', keyboardRippleShow); + el.addEventListener('keyup', keyboardRippleHide); + el.addEventListener('blur', focusRippleHide); + + // Anchor tags can be dragged, causes other hides to fail - #1537 + el.addEventListener('dragstart', rippleHide, { + passive: true + }); + } else if (!enabled && wasEnabled) { + removeListeners(el); + } +} +function removeListeners(el) { + el.removeEventListener('mousedown', rippleShow); + el.removeEventListener('touchstart', rippleShow); + el.removeEventListener('touchend', rippleHide); + el.removeEventListener('touchmove', rippleCancelShow); + el.removeEventListener('touchcancel', rippleHide); + el.removeEventListener('mouseup', rippleHide); + el.removeEventListener('mouseleave', rippleHide); + el.removeEventListener('keydown', keyboardRippleShow); + el.removeEventListener('keyup', keyboardRippleHide); + el.removeEventListener('dragstart', rippleHide); + el.removeEventListener('blur', focusRippleHide); +} +function mounted$4(el, binding) { + updateRipple(el, binding, false); +} +function unmounted$4(el) { + delete el._ripple; + removeListeners(el); +} +function updated$1(el, binding) { + if (binding.value === binding.oldValue) { + return; + } + const wasEnabled = isRippleEnabled(binding.oldValue); + updateRipple(el, binding, wasEnabled); +} +const Ripple = { + mounted: mounted$4, + unmounted: unmounted$4, + updated: updated$1 +}; + +const {mergeProps:_mergeProps$_,resolveDirective:_resolveDirective$X,createVNode:_createVNode$22} = await importShared('vue'); +const {computed: computed$1E,withDirectives} = await importShared('vue'); +const makeVBtnProps = propsFactory({ + active: { + type: Boolean, + default: undefined + }, + activeColor: String, + baseColor: String, + symbol: { + type: null, + default: VBtnToggleSymbol + }, + flat: Boolean, + icon: [Boolean, String, Function, Object], + prependIcon: IconValue, + appendIcon: IconValue, + block: Boolean, + readonly: Boolean, + slim: Boolean, + stacked: Boolean, + ripple: { + type: [Boolean, Object], + default: true + }, + text: String, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeDimensionProps(), + ...makeElevationProps(), + ...makeGroupItemProps(), + ...makeLoaderProps(), + ...makeLocationProps(), + ...makePositionProps(), + ...makeRoundedProps(), + ...makeRouterProps(), + ...makeSizeProps(), + ...makeTagProps({ + tag: 'button' + }), + ...makeThemeProps(), + ...makeVariantProps({ + variant: 'elevated' + }) +}, 'VBtn'); +const VBtn = genericComponent()({ + name: 'VBtn', + props: makeVBtnProps(), + emits: { + 'group:selected': val => true + }, + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + borderClasses + } = useBorder(props); + const { + densityClasses + } = useDensity(props); + const { + dimensionStyles + } = useDimension(props); + const { + elevationClasses + } = useElevation(props); + const { + loaderClasses + } = useLoader(props); + const { + locationStyles + } = useLocation(props); + const { + positionClasses + } = usePosition(props); + const { + roundedClasses + } = useRounded(props); + const { + sizeClasses, + sizeStyles + } = useSize(props); + const group = useGroupItem(props, props.symbol, false); + const link = useLink(props, attrs); + const isActive = computed$1E(() => { + if (props.active !== undefined) { + return props.active; + } + if (link.isLink.value) { + return link.isActive?.value; + } + return group?.isSelected.value; + }); + const color = computed$1E(() => isActive.value ? props.activeColor ?? props.color : props.color); + const variantProps = computed$1E(() => { + const showColor = group?.isSelected.value && (!link.isLink.value || link.isActive?.value) || !group || link.isActive?.value; + return { + color: showColor ? color.value ?? props.baseColor : props.baseColor, + variant: props.variant + }; + }); + const { + colorClasses, + colorStyles, + variantClasses + } = useVariant(variantProps); + const isDisabled = computed$1E(() => group?.disabled.value || props.disabled); + const isElevated = computed$1E(() => { + return props.variant === 'elevated' && !(props.disabled || props.flat || props.border); + }); + const valueAttr = computed$1E(() => { + if (props.value === undefined || typeof props.value === 'symbol') return undefined; + return Object(props.value) === props.value ? JSON.stringify(props.value, null, 0) : props.value; + }); + function onClick(e) { + if (isDisabled.value || link.isLink.value && (e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0 || attrs.target === '_blank')) return; + link.navigate?.(e); + group?.toggle(); + } + useSelectLink(link, group?.select); + useRender(() => { + const Tag = link.isLink.value ? 'a' : props.tag; + const hasPrepend = !!(props.prependIcon || slots.prepend); + const hasAppend = !!(props.appendIcon || slots.append); + const hasIcon = !!(props.icon && props.icon !== true); + return withDirectives(_createVNode$22(Tag, _mergeProps$_({ + "type": Tag === 'a' ? undefined : 'button', + "class": ['v-btn', group?.selectedClass.value, { + 'v-btn--active': isActive.value, + 'v-btn--block': props.block, + 'v-btn--disabled': isDisabled.value, + 'v-btn--elevated': isElevated.value, + 'v-btn--flat': props.flat, + 'v-btn--icon': !!props.icon, + 'v-btn--loading': props.loading, + 'v-btn--readonly': props.readonly, + 'v-btn--slim': props.slim, + 'v-btn--stacked': props.stacked + }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, loaderClasses.value, positionClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, props.class], + "style": [colorStyles.value, dimensionStyles.value, locationStyles.value, sizeStyles.value, props.style], + "aria-busy": props.loading ? true : undefined, + "disabled": isDisabled.value || undefined, + "tabindex": props.loading || props.readonly ? -1 : undefined, + "onClick": onClick, + "value": valueAttr.value + }, link.linkProps), { + default: () => [genOverlays(true, 'v-btn'), !props.icon && hasPrepend && _createVNode$22("span", { + "key": "prepend", + "class": "v-btn__prepend" + }, [!slots.prepend ? _createVNode$22(VIcon, { + "key": "prepend-icon", + "icon": props.prependIcon + }, null) : _createVNode$22(VDefaultsProvider, { + "key": "prepend-defaults", + "disabled": !props.prependIcon, + "defaults": { + VIcon: { + icon: props.prependIcon + } + } + }, slots.prepend)]), _createVNode$22("span", { + "class": "v-btn__content", + "data-no-activator": "" + }, [!slots.default && hasIcon ? _createVNode$22(VIcon, { + "key": "content-icon", + "icon": props.icon + }, null) : _createVNode$22(VDefaultsProvider, { + "key": "content-defaults", + "disabled": !hasIcon, + "defaults": { + VIcon: { + icon: props.icon + } + } + }, { + default: () => [slots.default?.() ?? props.text] + })]), !props.icon && hasAppend && _createVNode$22("span", { + "key": "append", + "class": "v-btn__append" + }, [!slots.append ? _createVNode$22(VIcon, { + "key": "append-icon", + "icon": props.appendIcon + }, null) : _createVNode$22(VDefaultsProvider, { + "key": "append-defaults", + "disabled": !props.appendIcon, + "defaults": { + VIcon: { + icon: props.appendIcon + } + } + }, slots.append)]), !!props.loading && _createVNode$22("span", { + "key": "loader", + "class": "v-btn__loader" + }, [slots.loader?.() ?? _createVNode$22(VProgressCircular, { + "color": typeof props.loading === 'boolean' ? undefined : props.loading, + "indeterminate": true, + "width": "2" + }, null)])] + }), [[Ripple, !isDisabled.value && props.ripple, '', { + center: !!props.icon + }]]); + }); + return { + group + }; + } +}); + +const {createVNode:_createVNode$21,mergeProps:_mergeProps$Z,resolveDirective:_resolveDirective$W} = await importShared('vue'); +const makeVAppBarNavIconProps = propsFactory({ + ...makeVBtnProps({ + icon: '$menu', + variant: 'text' + }) +}, 'VAppBarNavIcon'); +const VAppBarNavIcon = genericComponent()({ + name: 'VAppBarNavIcon', + props: makeVAppBarNavIconProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => _createVNode$21(VBtn, _mergeProps$Z(props, { + "class": ['v-app-bar-nav-icon'] + }), slots)); + return {}; + } +}); + +const {createVNode:_createVNode$20,mergeProps:_mergeProps$Y,resolveDirective:_resolveDirective$V} = await importShared('vue'); +const VAppBarTitle = genericComponent()({ + name: 'VAppBarTitle', + props: makeVToolbarTitleProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => _createVNode$20(VToolbarTitle, _mergeProps$Y(props, { + "class": "v-app-bar-title" + }), slots)); + return {}; + } +}); + +// Utilities +const VAlertTitle = createSimpleFunctional('v-alert-title'); + +const {mergeProps:_mergeProps$X,resolveDirective:_resolveDirective$U,createVNode:_createVNode$1$} = await importShared('vue'); +const {computed: computed$1D,toRef: toRef$C} = await importShared('vue'); +const allowedTypes = ['success', 'info', 'warning', 'error']; +const makeVAlertProps = propsFactory({ + border: { + type: [Boolean, String], + validator: val => { + return typeof val === 'boolean' || ['top', 'end', 'bottom', 'start'].includes(val); + } + }, + borderColor: String, + closable: Boolean, + closeIcon: { + type: IconValue, + default: '$close' + }, + closeLabel: { + type: String, + default: '$vuetify.close' + }, + icon: { + type: [Boolean, String, Function, Object], + default: null + }, + modelValue: { + type: Boolean, + default: true + }, + prominent: Boolean, + title: String, + text: String, + type: { + type: String, + validator: val => allowedTypes.includes(val) + }, + ...makeComponentProps(), + ...makeDensityProps(), + ...makeDimensionProps(), + ...makeElevationProps(), + ...makeLocationProps(), + ...makePositionProps(), + ...makeRoundedProps(), + ...makeTagProps(), + ...makeThemeProps(), + ...makeVariantProps({ + variant: 'flat' + }) +}, 'VAlert'); +const VAlert = genericComponent()({ + name: 'VAlert', + props: makeVAlertProps(), + emits: { + 'click:close': e => true, + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const isActive = useProxiedModel(props, 'modelValue'); + const icon = computed$1D(() => { + if (props.icon === false) return undefined; + if (!props.type) return props.icon; + return props.icon ?? `$${props.type}`; + }); + const variantProps = computed$1D(() => ({ + color: props.color ?? props.type, + variant: props.variant + })); + const { + themeClasses + } = provideTheme(props); + const { + colorClasses, + colorStyles, + variantClasses + } = useVariant(variantProps); + const { + densityClasses + } = useDensity(props); + const { + dimensionStyles + } = useDimension(props); + const { + elevationClasses + } = useElevation(props); + const { + locationStyles + } = useLocation(props); + const { + positionClasses + } = usePosition(props); + const { + roundedClasses + } = useRounded(props); + const { + textColorClasses, + textColorStyles + } = useTextColor(toRef$C(props, 'borderColor')); + const { + t + } = useLocale(); + const closeProps = computed$1D(() => ({ + 'aria-label': t(props.closeLabel), + onClick(e) { + isActive.value = false; + emit('click:close', e); + } + })); + return () => { + const hasPrepend = !!(slots.prepend || icon.value); + const hasTitle = !!(slots.title || props.title); + const hasClose = !!(slots.close || props.closable); + return isActive.value && _createVNode$1$(props.tag, { + "class": ['v-alert', props.border && { + 'v-alert--border': !!props.border, + [`v-alert--border-${props.border === true ? 'start' : props.border}`]: true + }, { + 'v-alert--prominent': props.prominent + }, themeClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, variantClasses.value, props.class], + "style": [colorStyles.value, dimensionStyles.value, locationStyles.value, props.style], + "role": "alert" + }, { + default: () => [genOverlays(false, 'v-alert'), props.border && _createVNode$1$("div", { + "key": "border", + "class": ['v-alert__border', textColorClasses.value], + "style": textColorStyles.value + }, null), hasPrepend && _createVNode$1$("div", { + "key": "prepend", + "class": "v-alert__prepend" + }, [!slots.prepend ? _createVNode$1$(VIcon, { + "key": "prepend-icon", + "density": props.density, + "icon": icon.value, + "size": props.prominent ? 44 : 28 + }, null) : _createVNode$1$(VDefaultsProvider, { + "key": "prepend-defaults", + "disabled": !icon.value, + "defaults": { + VIcon: { + density: props.density, + icon: icon.value, + size: props.prominent ? 44 : 28 + } + } + }, slots.prepend)]), _createVNode$1$("div", { + "class": "v-alert__content" + }, [hasTitle && _createVNode$1$(VAlertTitle, { + "key": "title" + }, { + default: () => [slots.title?.() ?? props.title] + }), slots.text?.() ?? props.text, slots.default?.()]), slots.append && _createVNode$1$("div", { + "key": "append", + "class": "v-alert__append" + }, [slots.append()]), hasClose && _createVNode$1$("div", { + "key": "close", + "class": "v-alert__close" + }, [!slots.close ? _createVNode$1$(VBtn, _mergeProps$X({ + "key": "close-btn", + "icon": props.closeIcon, + "size": "x-small", + "variant": "text" + }, closeProps.value), null) : _createVNode$1$(VDefaultsProvider, { + "key": "close-defaults", + "defaults": { + VBtn: { + icon: props.closeIcon, + size: 'x-small', + variant: 'text' + } + } + }, { + default: () => [slots.close?.({ + props: closeProps.value + })] + })])] + }); + }; + } +}); + +const {createVNode:_createVNode$1_} = await importShared('vue'); +const makeVAvatarProps = propsFactory({ + start: Boolean, + end: Boolean, + icon: IconValue, + image: String, + text: String, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeRoundedProps(), + ...makeSizeProps(), + ...makeTagProps(), + ...makeThemeProps(), + ...makeVariantProps({ + variant: 'flat' + }) +}, 'VAvatar'); +const VAvatar = genericComponent()({ + name: 'VAvatar', + props: makeVAvatarProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + borderClasses + } = useBorder(props); + const { + colorClasses, + colorStyles, + variantClasses + } = useVariant(props); + const { + densityClasses + } = useDensity(props); + const { + roundedClasses + } = useRounded(props); + const { + sizeClasses, + sizeStyles + } = useSize(props); + useRender(() => _createVNode$1_(props.tag, { + "class": ['v-avatar', { + 'v-avatar--start': props.start, + 'v-avatar--end': props.end + }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, props.class], + "style": [colorStyles.value, sizeStyles.value, props.style] + }, { + default: () => [!slots.default ? props.image ? _createVNode$1_(VImg, { + "key": "image", + "src": props.image, + "alt": "", + "cover": true + }, null) : props.icon ? _createVNode$1_(VIcon, { + "key": "icon", + "icon": props.icon + }, null) : props.text : _createVNode$1_(VDefaultsProvider, { + "key": "content-defaults", + "defaults": { + VImg: { + cover: true, + src: props.image + }, + VIcon: { + icon: props.icon + } + } + }, { + default: () => [slots.default()] + }), genOverlays(false, 'v-avatar')] + })); + return {}; + } +}); + +const {createVNode:_createVNode$1Z} = await importShared('vue'); +const makeVLabelProps = propsFactory({ + text: String, + onClick: EventProp(), + ...makeComponentProps(), + ...makeThemeProps() +}, 'VLabel'); +const VLabel = genericComponent()({ + name: 'VLabel', + props: makeVLabelProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => _createVNode$1Z("label", { + "class": ['v-label', { + 'v-label--clickable': !!props.onClick + }, props.class], + "style": props.style, + "onClick": props.onClick + }, [props.text, slots.default?.()])); + return {}; + } +}); + +const {createVNode:_createVNode$1Y} = await importShared('vue'); +const {computed: computed$1C,onScopeDispose: onScopeDispose$8,provide: provide$f,toRef: toRef$B} = await importShared('vue'); +const VSelectionControlGroupSymbol = Symbol.for('vuetify:selection-control-group'); +const makeSelectionControlGroupProps = propsFactory({ + color: String, + disabled: { + type: Boolean, + default: null + }, + defaultsTarget: String, + error: Boolean, + id: String, + inline: Boolean, + falseIcon: IconValue, + trueIcon: IconValue, + ripple: { + type: [Boolean, Object], + default: true + }, + multiple: { + type: Boolean, + default: null + }, + name: String, + readonly: { + type: Boolean, + default: null + }, + modelValue: null, + type: String, + valueComparator: { + type: Function, + default: deepEqual + }, + ...makeComponentProps(), + ...makeDensityProps(), + ...makeThemeProps() +}, 'SelectionControlGroup'); +const makeVSelectionControlGroupProps = propsFactory({ + ...makeSelectionControlGroupProps({ + defaultsTarget: 'VSelectionControl' + }) +}, 'VSelectionControlGroup'); +const VSelectionControlGroup = genericComponent()({ + name: 'VSelectionControlGroup', + props: makeVSelectionControlGroupProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const modelValue = useProxiedModel(props, 'modelValue'); + const uid = getUid(); + const id = computed$1C(() => props.id || `v-selection-control-group-${uid}`); + const name = computed$1C(() => props.name || id.value); + const updateHandlers = new Set(); + provide$f(VSelectionControlGroupSymbol, { + modelValue, + forceUpdate: () => { + updateHandlers.forEach(fn => fn()); + }, + onForceUpdate: cb => { + updateHandlers.add(cb); + onScopeDispose$8(() => { + updateHandlers.delete(cb); + }); + } + }); + provideDefaults({ + [props.defaultsTarget]: { + color: toRef$B(props, 'color'), + disabled: toRef$B(props, 'disabled'), + density: toRef$B(props, 'density'), + error: toRef$B(props, 'error'), + inline: toRef$B(props, 'inline'), + modelValue, + multiple: computed$1C(() => !!props.multiple || props.multiple == null && Array.isArray(modelValue.value)), + name, + falseIcon: toRef$B(props, 'falseIcon'), + trueIcon: toRef$B(props, 'trueIcon'), + readonly: toRef$B(props, 'readonly'), + ripple: toRef$B(props, 'ripple'), + type: toRef$B(props, 'type'), + valueComparator: toRef$B(props, 'valueComparator') + } + }); + useRender(() => _createVNode$1Y("div", { + "class": ['v-selection-control-group', { + 'v-selection-control-group--inline': props.inline + }, props.class], + "style": props.style, + "role": props.type === 'radio' ? 'radiogroup' : undefined + }, [slots.default?.()])); + return {}; + } +}); + +const {withDirectives:_withDirectives$i,resolveDirective:_resolveDirective$T,Fragment:_Fragment$y,createVNode:_createVNode$1X,mergeProps:_mergeProps$W} = await importShared('vue'); +const {computed: computed$1B,inject: inject$k,nextTick: nextTick$k,ref: ref$J,shallowRef: shallowRef$y} = await importShared('vue'); +const makeVSelectionControlProps = propsFactory({ + label: String, + baseColor: String, + trueValue: null, + falseValue: null, + value: null, + ...makeComponentProps(), + ...makeSelectionControlGroupProps() +}, 'VSelectionControl'); +function useSelectionControl(props) { + const group = inject$k(VSelectionControlGroupSymbol, undefined); + const { + densityClasses + } = useDensity(props); + const modelValue = useProxiedModel(props, 'modelValue'); + const trueValue = computed$1B(() => props.trueValue !== undefined ? props.trueValue : props.value !== undefined ? props.value : true); + const falseValue = computed$1B(() => props.falseValue !== undefined ? props.falseValue : false); + const isMultiple = computed$1B(() => !!props.multiple || props.multiple == null && Array.isArray(modelValue.value)); + const model = computed$1B({ + get() { + const val = group ? group.modelValue.value : modelValue.value; + return isMultiple.value ? wrapInArray(val).some(v => props.valueComparator(v, trueValue.value)) : props.valueComparator(val, trueValue.value); + }, + set(val) { + if (props.readonly) return; + const currentValue = val ? trueValue.value : falseValue.value; + let newVal = currentValue; + if (isMultiple.value) { + newVal = val ? [...wrapInArray(modelValue.value), currentValue] : wrapInArray(modelValue.value).filter(item => !props.valueComparator(item, trueValue.value)); + } + if (group) { + group.modelValue.value = newVal; + } else { + modelValue.value = newVal; + } + } + }); + const { + textColorClasses, + textColorStyles + } = useTextColor(computed$1B(() => { + if (props.error || props.disabled) return undefined; + return model.value ? props.color : props.baseColor; + })); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(computed$1B(() => { + return model.value && !props.error && !props.disabled ? props.color : props.baseColor; + })); + const icon = computed$1B(() => model.value ? props.trueIcon : props.falseIcon); + return { + group, + densityClasses, + trueValue, + falseValue, + model, + textColorClasses, + textColorStyles, + backgroundColorClasses, + backgroundColorStyles, + icon + }; +} +const VSelectionControl = genericComponent()({ + name: 'VSelectionControl', + directives: { + Ripple + }, + inheritAttrs: false, + props: makeVSelectionControlProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const { + group, + densityClasses, + icon, + model, + textColorClasses, + textColorStyles, + backgroundColorClasses, + backgroundColorStyles, + trueValue + } = useSelectionControl(props); + const uid = getUid(); + const isFocused = shallowRef$y(false); + const isFocusVisible = shallowRef$y(false); + const input = ref$J(); + const id = computed$1B(() => props.id || `input-${uid}`); + const isInteractive = computed$1B(() => !props.disabled && !props.readonly); + group?.onForceUpdate(() => { + if (input.value) { + input.value.checked = model.value; + } + }); + function onFocus(e) { + if (!isInteractive.value) return; + isFocused.value = true; + if (matchesSelector(e.target, ':focus-visible') !== false) { + isFocusVisible.value = true; + } + } + function onBlur() { + isFocused.value = false; + isFocusVisible.value = false; + } + function onClickLabel(e) { + e.stopPropagation(); + } + function onInput(e) { + if (!isInteractive.value) { + if (input.value) { + // model value is not updated when input is not interactive + // but the internal checked state of the input is still updated, + // so here it's value is restored + input.value.checked = model.value; + } + return; + } + if (props.readonly && group) { + nextTick$k(() => group.forceUpdate()); + } + model.value = e.target.checked; + } + useRender(() => { + const label = slots.label ? slots.label({ + label: props.label, + props: { + for: id.value + } + }) : props.label; + const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); + const inputNode = _createVNode$1X("input", _mergeProps$W({ + "ref": input, + "checked": model.value, + "disabled": !!props.disabled, + "id": id.value, + "onBlur": onBlur, + "onFocus": onFocus, + "onInput": onInput, + "aria-disabled": !!props.disabled, + "aria-label": props.label, + "type": props.type, + "value": trueValue.value, + "name": props.name, + "aria-checked": props.type === 'checkbox' ? model.value : undefined + }, inputAttrs), null); + return _createVNode$1X("div", _mergeProps$W({ + "class": ['v-selection-control', { + 'v-selection-control--dirty': model.value, + 'v-selection-control--disabled': props.disabled, + 'v-selection-control--error': props.error, + 'v-selection-control--focused': isFocused.value, + 'v-selection-control--focus-visible': isFocusVisible.value, + 'v-selection-control--inline': props.inline + }, densityClasses.value, props.class] + }, rootAttrs, { + "style": props.style + }), [_createVNode$1X("div", { + "class": ['v-selection-control__wrapper', textColorClasses.value], + "style": textColorStyles.value + }, [slots.default?.({ + backgroundColorClasses, + backgroundColorStyles + }), _withDirectives$i(_createVNode$1X("div", { + "class": ['v-selection-control__input'] + }, [slots.input?.({ + model, + textColorClasses, + textColorStyles, + backgroundColorClasses, + backgroundColorStyles, + inputNode, + icon: icon.value, + props: { + onFocus, + onBlur, + id: id.value + } + }) ?? _createVNode$1X(_Fragment$y, null, [icon.value && _createVNode$1X(VIcon, { + "key": "icon", + "icon": icon.value + }, null), inputNode])]), [[_resolveDirective$T("ripple"), props.ripple && [!props.disabled && !props.readonly, null, ['center', 'circle']]]])]), label && _createVNode$1X(VLabel, { + "for": id.value, + "onClick": onClickLabel + }, { + default: () => [label] + })]); + }); + return { + isFocused, + input + }; + } +}); + +const {createVNode:_createVNode$1W,mergeProps:_mergeProps$V,resolveDirective:_resolveDirective$S} = await importShared('vue'); +const {computed: computed$1A} = await importShared('vue'); +const makeVCheckboxBtnProps = propsFactory({ + indeterminate: Boolean, + indeterminateIcon: { + type: IconValue, + default: '$checkboxIndeterminate' + }, + ...makeVSelectionControlProps({ + falseIcon: '$checkboxOff', + trueIcon: '$checkboxOn' + }) +}, 'VCheckboxBtn'); +const VCheckboxBtn = genericComponent()({ + name: 'VCheckboxBtn', + props: makeVCheckboxBtnProps(), + emits: { + 'update:modelValue': value => true, + 'update:indeterminate': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const indeterminate = useProxiedModel(props, 'indeterminate'); + const model = useProxiedModel(props, 'modelValue'); + function onChange(v) { + if (indeterminate.value) { + indeterminate.value = false; + } + } + const falseIcon = computed$1A(() => { + return indeterminate.value ? props.indeterminateIcon : props.falseIcon; + }); + const trueIcon = computed$1A(() => { + return indeterminate.value ? props.indeterminateIcon : props.trueIcon; + }); + useRender(() => { + const controlProps = omit(VSelectionControl.filterProps(props), ['modelValue']); + return _createVNode$1W(VSelectionControl, _mergeProps$V(controlProps, { + "modelValue": model.value, + "onUpdate:modelValue": [$event => model.value = $event, onChange], + "class": ['v-checkbox-btn', props.class], + "style": props.style, + "type": "checkbox", + "falseIcon": falseIcon.value, + "trueIcon": trueIcon.value, + "aria-checked": indeterminate.value ? 'mixed' : undefined + }), slots); + }); + return {}; + } +}); + +const {createVNode:_createVNode$1V} = await importShared('vue'); +function useInputIcon(props) { + const { + t + } = useLocale(); + function InputIcon(_ref) { + let { + name + } = _ref; + const localeKey = { + prepend: 'prependAction', + prependInner: 'prependAction', + append: 'appendAction', + appendInner: 'appendAction', + clear: 'clear' + }[name]; + const listener = props[`onClick:${name}`]; + const label = listener && localeKey ? t(`$vuetify.input.${localeKey}`, props.label ?? '') : undefined; + return _createVNode$1V(VIcon, { + "icon": props[`${name}Icon`], + "aria-label": label, + "onClick": listener + }, null); + } + return { + InputIcon + }; +} + +const {createVNode:_createVNode$1U} = await importShared('vue'); +const {computed: computed$1z} = await importShared('vue'); +const makeVMessagesProps = propsFactory({ + active: Boolean, + color: String, + messages: { + type: [Array, String], + default: () => [] + }, + ...makeComponentProps(), + ...makeTransitionProps({ + transition: { + component: VSlideYTransition, + leaveAbsolute: true, + group: true + } + }) +}, 'VMessages'); +const VMessages = genericComponent()({ + name: 'VMessages', + props: makeVMessagesProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const messages = computed$1z(() => wrapInArray(props.messages)); + const { + textColorClasses, + textColorStyles + } = useTextColor(computed$1z(() => props.color)); + useRender(() => _createVNode$1U(MaybeTransition, { + "transition": props.transition, + "tag": "div", + "class": ['v-messages', textColorClasses.value, props.class], + "style": [textColorStyles.value, props.style], + "role": "alert", + "aria-live": "polite" + }, { + default: () => [props.active && messages.value.map((message, i) => _createVNode$1U("div", { + "class": "v-messages__message", + "key": `${i}-${messages.value}` + }, [slots.message ? slots.message({ + message + }) : message]))] + })); + return {}; + } +}); + +const {computed: computed$1y} = await importShared('vue'); +// Composables +const makeFocusProps = propsFactory({ + focused: Boolean, + 'onUpdate:focused': EventProp() +}, 'focus'); +function useFocus(props) { + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + const isFocused = useProxiedModel(props, 'focused'); + const focusClasses = computed$1y(() => { + return { + [`${name}--focused`]: isFocused.value + }; + }); + function focus() { + isFocused.value = true; + } + function blur() { + isFocused.value = false; + } + return { + focusClasses, + isFocused, + focus, + blur + }; +} + +const {computed: computed$1x,inject: inject$j,markRaw,provide: provide$e,ref: ref$I,shallowRef: shallowRef$x,toRef: toRef$A,watch: watch$y} = await importShared('vue'); +const FormKey = Symbol.for('vuetify:form'); +const makeFormProps = propsFactory({ + disabled: Boolean, + fastFail: Boolean, + readonly: Boolean, + modelValue: { + type: Boolean, + default: null + }, + validateOn: { + type: String, + default: 'input' + } +}, 'form'); +function createForm(props) { + const model = useProxiedModel(props, 'modelValue'); + const isDisabled = computed$1x(() => props.disabled); + const isReadonly = computed$1x(() => props.readonly); + const isValidating = shallowRef$x(false); + const items = ref$I([]); + const errors = ref$I([]); + async function validate() { + const results = []; + let valid = true; + errors.value = []; + isValidating.value = true; + for (const item of items.value) { + const itemErrorMessages = await item.validate(); + if (itemErrorMessages.length > 0) { + valid = false; + results.push({ + id: item.id, + errorMessages: itemErrorMessages + }); + } + if (!valid && props.fastFail) break; + } + errors.value = results; + isValidating.value = false; + return { + valid, + errors: errors.value + }; + } + function reset() { + items.value.forEach(item => item.reset()); + } + function resetValidation() { + items.value.forEach(item => item.resetValidation()); + } + watch$y(items, () => { + let valid = 0; + let invalid = 0; + const results = []; + for (const item of items.value) { + if (item.isValid === false) { + invalid++; + results.push({ + id: item.id, + errorMessages: item.errorMessages + }); + } else if (item.isValid === true) valid++; + } + errors.value = results; + model.value = invalid > 0 ? false : valid === items.value.length ? true : null; + }, { + deep: true, + flush: 'post' + }); + provide$e(FormKey, { + register: _ref => { + let { + id, + vm, + validate, + reset, + resetValidation + } = _ref; + if (items.value.some(item => item.id === id)) { + consoleWarn(`Duplicate input name "${id}"`); + } + items.value.push({ + id, + validate, + reset, + resetValidation, + vm: markRaw(vm), + isValid: null, + errorMessages: [] + }); + }, + unregister: id => { + items.value = items.value.filter(item => { + return item.id !== id; + }); + }, + update: (id, isValid, errorMessages) => { + const found = items.value.find(item => item.id === id); + if (!found) return; + found.isValid = isValid; + found.errorMessages = errorMessages; + }, + isDisabled, + isReadonly, + isValidating, + isValid: model, + items, + validateOn: toRef$A(props, 'validateOn') + }); + return { + errors, + isDisabled, + isReadonly, + isValidating, + isValid: model, + items, + validate, + reset, + resetValidation + }; +} +function useForm() { + return inject$j(FormKey, null); +} + +const {computed: computed$1w,nextTick: nextTick$j,onBeforeMount: onBeforeMount$1,onBeforeUnmount: onBeforeUnmount$7,onMounted: onMounted$a,ref: ref$H,shallowRef: shallowRef$w,unref: unref$1,watch: watch$x} = await importShared('vue'); +const makeValidationProps = propsFactory({ + disabled: { + type: Boolean, + default: null + }, + error: Boolean, + errorMessages: { + type: [Array, String], + default: () => [] + }, + maxErrors: { + type: [Number, String], + default: 1 + }, + name: String, + label: String, + readonly: { + type: Boolean, + default: null + }, + rules: { + type: Array, + default: () => [] + }, + modelValue: null, + validateOn: String, + validationValue: null, + ...makeFocusProps() +}, 'validation'); +function useValidation(props) { + let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName(); + let id = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : getUid(); + const model = useProxiedModel(props, 'modelValue'); + const validationModel = computed$1w(() => props.validationValue === undefined ? model.value : props.validationValue); + const form = useForm(); + const internalErrorMessages = ref$H([]); + const isPristine = shallowRef$w(true); + const isDirty = computed$1w(() => !!(wrapInArray(model.value === '' ? null : model.value).length || wrapInArray(validationModel.value === '' ? null : validationModel.value).length)); + const isDisabled = computed$1w(() => !!(props.disabled ?? form?.isDisabled.value)); + const isReadonly = computed$1w(() => !!(props.readonly ?? form?.isReadonly.value)); + const errorMessages = computed$1w(() => { + return props.errorMessages?.length ? wrapInArray(props.errorMessages).concat(internalErrorMessages.value).slice(0, Math.max(0, +props.maxErrors)) : internalErrorMessages.value; + }); + const validateOn = computed$1w(() => { + let value = (props.validateOn ?? form?.validateOn.value) || 'input'; + if (value === 'lazy') value = 'input lazy'; + if (value === 'eager') value = 'input eager'; + const set = new Set(value?.split(' ') ?? []); + return { + input: set.has('input'), + blur: set.has('blur') || set.has('input') || set.has('invalid-input'), + invalidInput: set.has('invalid-input'), + lazy: set.has('lazy'), + eager: set.has('eager') + }; + }); + const isValid = computed$1w(() => { + if (props.error || props.errorMessages?.length) return false; + if (!props.rules.length) return true; + if (isPristine.value) { + return internalErrorMessages.value.length || validateOn.value.lazy ? null : true; + } else { + return !internalErrorMessages.value.length; + } + }); + const isValidating = shallowRef$w(false); + const validationClasses = computed$1w(() => { + return { + [`${name}--error`]: isValid.value === false, + [`${name}--dirty`]: isDirty.value, + [`${name}--disabled`]: isDisabled.value, + [`${name}--readonly`]: isReadonly.value + }; + }); + const vm = getCurrentInstance('validation'); + const uid = computed$1w(() => props.name ?? unref$1(id)); + onBeforeMount$1(() => { + form?.register({ + id: uid.value, + vm, + validate, + reset, + resetValidation + }); + }); + onBeforeUnmount$7(() => { + form?.unregister(uid.value); + }); + onMounted$a(async () => { + if (!validateOn.value.lazy) { + await validate(!validateOn.value.eager); + } + form?.update(uid.value, isValid.value, errorMessages.value); + }); + useToggleScope(() => validateOn.value.input || validateOn.value.invalidInput && isValid.value === false, () => { + watch$x(validationModel, () => { + if (validationModel.value != null) { + validate(); + } else if (props.focused) { + const unwatch = watch$x(() => props.focused, val => { + if (!val) validate(); + unwatch(); + }); + } + }); + }); + useToggleScope(() => validateOn.value.blur, () => { + watch$x(() => props.focused, val => { + if (!val) validate(); + }); + }); + watch$x([isValid, errorMessages], () => { + form?.update(uid.value, isValid.value, errorMessages.value); + }); + async function reset() { + model.value = null; + await nextTick$j(); + await resetValidation(); + } + async function resetValidation() { + isPristine.value = true; + if (!validateOn.value.lazy) { + await validate(!validateOn.value.eager); + } else { + internalErrorMessages.value = []; + } + } + async function validate() { + let silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const results = []; + isValidating.value = true; + for (const rule of props.rules) { + if (results.length >= +(props.maxErrors ?? 1)) { + break; + } + const handler = typeof rule === 'function' ? rule : () => rule; + const result = await handler(validationModel.value); + if (result === true) continue; + if (result !== false && typeof result !== 'string') { + // eslint-disable-next-line no-console + console.warn(`${result} is not a valid value. Rule functions must return boolean true or a string.`); + continue; + } + results.push(result || ''); + } + internalErrorMessages.value = results; + isValidating.value = false; + isPristine.value = silent; + return internalErrorMessages.value; + } + return { + errorMessages, + isDirty, + isDisabled, + isReadonly, + isPristine, + isValid, + isValidating, + reset, + resetValidation, + validate, + validationClasses + }; +} + +const {resolveDirective:_resolveDirective$R,createVNode:_createVNode$1T} = await importShared('vue'); +const {computed: computed$1v} = await importShared('vue'); +const makeVInputProps = propsFactory({ + id: String, + appendIcon: IconValue, + centerAffix: { + type: Boolean, + default: true + }, + prependIcon: IconValue, + hideDetails: [Boolean, String], + hideSpinButtons: Boolean, + hint: String, + persistentHint: Boolean, + messages: { + type: [Array, String], + default: () => [] + }, + direction: { + type: String, + default: 'horizontal', + validator: v => ['horizontal', 'vertical'].includes(v) + }, + 'onClick:prepend': EventProp(), + 'onClick:append': EventProp(), + ...makeComponentProps(), + ...makeDensityProps(), + ...only(makeDimensionProps(), ['maxWidth', 'minWidth', 'width']), + ...makeThemeProps(), + ...makeValidationProps() +}, 'VInput'); +const VInput = genericComponent()({ + name: 'VInput', + props: { + ...makeVInputProps() + }, + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + attrs, + slots, + emit + } = _ref; + const { + densityClasses + } = useDensity(props); + const { + dimensionStyles + } = useDimension(props); + const { + themeClasses + } = provideTheme(props); + const { + rtlClasses + } = useRtl(); + const { + InputIcon + } = useInputIcon(props); + const uid = getUid(); + const id = computed$1v(() => props.id || `input-${uid}`); + const messagesId = computed$1v(() => `${id.value}-messages`); + const { + errorMessages, + isDirty, + isDisabled, + isReadonly, + isPristine, + isValid, + isValidating, + reset, + resetValidation, + validate, + validationClasses + } = useValidation(props, 'v-input', id); + const slotProps = computed$1v(() => ({ + id, + messagesId, + isDirty, + isDisabled, + isReadonly, + isPristine, + isValid, + isValidating, + reset, + resetValidation, + validate + })); + const messages = computed$1v(() => { + if (props.errorMessages?.length || !isPristine.value && errorMessages.value.length) { + return errorMessages.value; + } else if (props.hint && (props.persistentHint || props.focused)) { + return props.hint; + } else { + return props.messages; + } + }); + useRender(() => { + const hasPrepend = !!(slots.prepend || props.prependIcon); + const hasAppend = !!(slots.append || props.appendIcon); + const hasMessages = messages.value.length > 0; + const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details); + return _createVNode$1T("div", { + "class": ['v-input', `v-input--${props.direction}`, { + 'v-input--center-affix': props.centerAffix, + 'v-input--hide-spin-buttons': props.hideSpinButtons + }, densityClasses.value, themeClasses.value, rtlClasses.value, validationClasses.value, props.class], + "style": [dimensionStyles.value, props.style] + }, [hasPrepend && _createVNode$1T("div", { + "key": "prepend", + "class": "v-input__prepend" + }, [slots.prepend?.(slotProps.value), props.prependIcon && _createVNode$1T(InputIcon, { + "key": "prepend-icon", + "name": "prepend" + }, null)]), slots.default && _createVNode$1T("div", { + "class": "v-input__control" + }, [slots.default?.(slotProps.value)]), hasAppend && _createVNode$1T("div", { + "key": "append", + "class": "v-input__append" + }, [props.appendIcon && _createVNode$1T(InputIcon, { + "key": "append-icon", + "name": "append" + }, null), slots.append?.(slotProps.value)]), hasDetails && _createVNode$1T("div", { + "class": "v-input__details" + }, [_createVNode$1T(VMessages, { + "id": messagesId.value, + "active": hasMessages, + "messages": messages.value + }, { + message: slots.message + }), slots.details?.(slotProps.value)])]); + }); + return { + reset, + resetValidation, + validate, + isValid, + errorMessages + }; + } +}); + +const {createVNode:_createVNode$1S,mergeProps:_mergeProps$U,resolveDirective:_resolveDirective$Q} = await importShared('vue'); +const {computed: computed$1u} = await importShared('vue'); +const makeVCheckboxProps = propsFactory({ + ...makeVInputProps(), + ...omit(makeVCheckboxBtnProps(), ['inline']) +}, 'VCheckbox'); +const VCheckbox = genericComponent()({ + name: 'VCheckbox', + inheritAttrs: false, + props: makeVCheckboxProps(), + emits: { + 'update:modelValue': value => true, + 'update:focused': focused => true + }, + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const model = useProxiedModel(props, 'modelValue'); + const { + isFocused, + focus, + blur + } = useFocus(props); + const uid = getUid(); + const id = computed$1u(() => props.id || `checkbox-${uid}`); + useRender(() => { + const [rootAttrs, controlAttrs] = filterInputAttrs(attrs); + const inputProps = VInput.filterProps(props); + const checkboxProps = VCheckboxBtn.filterProps(props); + return _createVNode$1S(VInput, _mergeProps$U({ + "class": ['v-checkbox', props.class] + }, rootAttrs, inputProps, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "id": id.value, + "focused": isFocused.value, + "style": props.style + }), { + ...slots, + default: _ref2 => { + let { + id, + messagesId, + isDisabled, + isReadonly, + isValid + } = _ref2; + return _createVNode$1S(VCheckboxBtn, _mergeProps$U(checkboxProps, { + "id": id.value, + "aria-describedby": messagesId.value, + "disabled": isDisabled.value, + "readonly": isReadonly.value + }, controlAttrs, { + "error": isValid.value === false, + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "onFocus": focus, + "onBlur": blur + }), slots); + } + }); + }); + return {}; + } +}); + +function calculateUpdatedTarget(_ref) { + let { + selectedElement, + containerElement, + isRtl, + isHorizontal + } = _ref; + const containerSize = getOffsetSize(isHorizontal, containerElement); + const scrollPosition = getScrollPosition(isHorizontal, isRtl, containerElement); + const childrenSize = getOffsetSize(isHorizontal, selectedElement); + const childrenStartPosition = getOffsetPosition(isHorizontal, selectedElement); + const additionalOffset = childrenSize * 0.4; + if (scrollPosition > childrenStartPosition) { + return childrenStartPosition - additionalOffset; + } else if (scrollPosition + containerSize < childrenStartPosition + childrenSize) { + return childrenStartPosition - containerSize + childrenSize + additionalOffset; + } + return scrollPosition; +} +function calculateCenteredTarget(_ref2) { + let { + selectedElement, + containerElement, + isHorizontal + } = _ref2; + const containerOffsetSize = getOffsetSize(isHorizontal, containerElement); + const childrenOffsetPosition = getOffsetPosition(isHorizontal, selectedElement); + const childrenOffsetSize = getOffsetSize(isHorizontal, selectedElement); + return childrenOffsetPosition - containerOffsetSize / 2 + childrenOffsetSize / 2; +} +function getScrollSize(isHorizontal, element) { + const key = isHorizontal ? 'scrollWidth' : 'scrollHeight'; + return element?.[key] || 0; +} +function getClientSize(isHorizontal, element) { + const key = isHorizontal ? 'clientWidth' : 'clientHeight'; + return element?.[key] || 0; +} +function getScrollPosition(isHorizontal, rtl, element) { + if (!element) { + return 0; + } + const { + scrollLeft, + offsetWidth, + scrollWidth + } = element; + if (isHorizontal) { + return rtl ? scrollWidth - offsetWidth + scrollLeft : scrollLeft; + } + return element.scrollTop; +} +function getOffsetSize(isHorizontal, element) { + const key = isHorizontal ? 'offsetWidth' : 'offsetHeight'; + return element?.[key] || 0; +} +function getOffsetPosition(isHorizontal, element) { + const key = isHorizontal ? 'offsetLeft' : 'offsetTop'; + return element?.[key] || 0; +} + +const {createVNode:_createVNode$1R} = await importShared('vue'); +const {computed: computed$1t,shallowRef: shallowRef$v,watch: watch$w} = await importShared('vue'); +const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group'); +const makeVSlideGroupProps = propsFactory({ + centerActive: Boolean, + direction: { + type: String, + default: 'horizontal' + }, + symbol: { + type: null, + default: VSlideGroupSymbol + }, + nextIcon: { + type: IconValue, + default: '$next' + }, + prevIcon: { + type: IconValue, + default: '$prev' + }, + showArrows: { + type: [Boolean, String], + validator: v => typeof v === 'boolean' || ['always', 'desktop', 'mobile'].includes(v) + }, + ...makeComponentProps(), + ...makeDisplayProps({ + mobile: null + }), + ...makeTagProps(), + ...makeGroupProps({ + selectedClass: 'v-slide-group-item--active' + }) +}, 'VSlideGroup'); +const VSlideGroup = genericComponent()({ + name: 'VSlideGroup', + props: makeVSlideGroupProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + isRtl + } = useRtl(); + const { + displayClasses, + mobile + } = useDisplay(props); + const group = useGroup(props, props.symbol); + const isOverflowing = shallowRef$v(false); + const scrollOffset = shallowRef$v(0); + const containerSize = shallowRef$v(0); + const contentSize = shallowRef$v(0); + const isHorizontal = computed$1t(() => props.direction === 'horizontal'); + const { + resizeRef: containerRef, + contentRect: containerRect + } = useResizeObserver(); + const { + resizeRef: contentRef, + contentRect + } = useResizeObserver(); + const goTo = useGoTo(); + const goToOptions = computed$1t(() => { + return { + container: containerRef.el, + duration: 200, + easing: 'easeOutQuart' + }; + }); + const firstSelectedIndex = computed$1t(() => { + if (!group.selected.value.length) return -1; + return group.items.value.findIndex(item => item.id === group.selected.value[0]); + }); + const lastSelectedIndex = computed$1t(() => { + if (!group.selected.value.length) return -1; + return group.items.value.findIndex(item => item.id === group.selected.value[group.selected.value.length - 1]); + }); + if (IN_BROWSER) { + let frame = -1; + watch$w(() => [group.selected.value, containerRect.value, contentRect.value, isHorizontal.value], () => { + cancelAnimationFrame(frame); + frame = requestAnimationFrame(() => { + if (containerRect.value && contentRect.value) { + const sizeProperty = isHorizontal.value ? 'width' : 'height'; + containerSize.value = containerRect.value[sizeProperty]; + contentSize.value = contentRect.value[sizeProperty]; + isOverflowing.value = containerSize.value + 1 < contentSize.value; + } + if (firstSelectedIndex.value >= 0 && contentRef.el) { + // TODO: Is this too naive? Should we store element references in group composable? + const selectedElement = contentRef.el.children[lastSelectedIndex.value]; + scrollToChildren(selectedElement, props.centerActive); + } + }); + }); + } + const isFocused = shallowRef$v(false); + function scrollToChildren(children, center) { + let target = 0; + if (center) { + target = calculateCenteredTarget({ + containerElement: containerRef.el, + isHorizontal: isHorizontal.value, + selectedElement: children + }); + } else { + target = calculateUpdatedTarget({ + containerElement: containerRef.el, + isHorizontal: isHorizontal.value, + isRtl: isRtl.value, + selectedElement: children + }); + } + scrollToPosition(target); + } + function scrollToPosition(newPosition) { + if (!IN_BROWSER || !containerRef.el) return; + const offsetSize = getOffsetSize(isHorizontal.value, containerRef.el); + const scrollPosition = getScrollPosition(isHorizontal.value, isRtl.value, containerRef.el); + const scrollSize = getScrollSize(isHorizontal.value, containerRef.el); + if (scrollSize <= offsetSize || + // Prevent scrolling by only a couple of pixels, which doesn't look smooth + Math.abs(newPosition - scrollPosition) < 16) return; + if (isHorizontal.value && isRtl.value && containerRef.el) { + const { + scrollWidth, + offsetWidth: containerWidth + } = containerRef.el; + newPosition = scrollWidth - containerWidth - newPosition; + } + if (isHorizontal.value) { + goTo.horizontal(newPosition, goToOptions.value); + } else { + goTo(newPosition, goToOptions.value); + } + } + function onScroll(e) { + const { + scrollTop, + scrollLeft + } = e.target; + scrollOffset.value = isHorizontal.value ? scrollLeft : scrollTop; + } + function onFocusin(e) { + isFocused.value = true; + if (!isOverflowing.value || !contentRef.el) return; + + // Focused element is likely to be the root of an item, so a + // breadth-first search will probably find it in the first iteration + for (const el of e.composedPath()) { + for (const item of contentRef.el.children) { + if (item === el) { + scrollToChildren(item); + return; + } + } + } + } + function onFocusout(e) { + isFocused.value = false; + } + + // Affix clicks produce onFocus that we have to ignore to avoid extra scrollToChildren + let ignoreFocusEvent = false; + function onFocus(e) { + if (!ignoreFocusEvent && !isFocused.value && !(e.relatedTarget && contentRef.el?.contains(e.relatedTarget))) focus(); + ignoreFocusEvent = false; + } + function onFocusAffixes() { + ignoreFocusEvent = true; + } + function onKeydown(e) { + if (!contentRef.el) return; + function toFocus(location) { + e.preventDefault(); + focus(location); + } + if (isHorizontal.value) { + if (e.key === 'ArrowRight') { + toFocus(isRtl.value ? 'prev' : 'next'); + } else if (e.key === 'ArrowLeft') { + toFocus(isRtl.value ? 'next' : 'prev'); + } + } else { + if (e.key === 'ArrowDown') { + toFocus('next'); + } else if (e.key === 'ArrowUp') { + toFocus('prev'); + } + } + if (e.key === 'Home') { + toFocus('first'); + } else if (e.key === 'End') { + toFocus('last'); + } + } + function focus(location) { + if (!contentRef.el) return; + let el; + if (!location) { + const focusable = focusableChildren(contentRef.el); + el = focusable[0]; + } else if (location === 'next') { + el = contentRef.el.querySelector(':focus')?.nextElementSibling; + if (!el) return focus('first'); + } else if (location === 'prev') { + el = contentRef.el.querySelector(':focus')?.previousElementSibling; + if (!el) return focus('last'); + } else if (location === 'first') { + el = contentRef.el.firstElementChild; + } else if (location === 'last') { + el = contentRef.el.lastElementChild; + } + if (el) { + el.focus({ + preventScroll: true + }); + } + } + function scrollTo(location) { + const direction = isHorizontal.value && isRtl.value ? -1 : 1; + const offsetStep = (location === 'prev' ? -direction : direction) * containerSize.value; + let newPosition = scrollOffset.value + offsetStep; + + // TODO: improve it + if (isHorizontal.value && isRtl.value && containerRef.el) { + const { + scrollWidth, + offsetWidth: containerWidth + } = containerRef.el; + newPosition += scrollWidth - containerWidth; + } + scrollToPosition(newPosition); + } + const slotProps = computed$1t(() => ({ + next: group.next, + prev: group.prev, + select: group.select, + isSelected: group.isSelected + })); + const hasAffixes = computed$1t(() => { + switch (props.showArrows) { + // Always show arrows on desktop & mobile + case 'always': + return true; + + // Always show arrows on desktop + case 'desktop': + return !mobile.value; + + // Show arrows on mobile when overflowing. + // This matches the default 2.2 behavior + case true: + return isOverflowing.value || Math.abs(scrollOffset.value) > 0; + + // Always show on mobile + case 'mobile': + return mobile.value || isOverflowing.value || Math.abs(scrollOffset.value) > 0; + + // https://material.io/components/tabs#scrollable-tabs + // Always show arrows when + // overflowed on desktop + default: + return !mobile.value && (isOverflowing.value || Math.abs(scrollOffset.value) > 0); + } + }); + const hasPrev = computed$1t(() => { + // 1 pixel in reserve, may be lost after rounding + return Math.abs(scrollOffset.value) > 1; + }); + const hasNext = computed$1t(() => { + if (!containerRef.value) return false; + const scrollSize = getScrollSize(isHorizontal.value, containerRef.el); + const clientSize = getClientSize(isHorizontal.value, containerRef.el); + const scrollSizeMax = scrollSize - clientSize; + + // 1 pixel in reserve, may be lost after rounding + return scrollSizeMax - Math.abs(scrollOffset.value) > 1; + }); + useRender(() => _createVNode$1R(props.tag, { + "class": ['v-slide-group', { + 'v-slide-group--vertical': !isHorizontal.value, + 'v-slide-group--has-affixes': hasAffixes.value, + 'v-slide-group--is-overflowing': isOverflowing.value + }, displayClasses.value, props.class], + "style": props.style, + "tabindex": isFocused.value || group.selected.value.length ? -1 : 0, + "onFocus": onFocus + }, { + default: () => [hasAffixes.value && _createVNode$1R("div", { + "key": "prev", + "class": ['v-slide-group__prev', { + 'v-slide-group__prev--disabled': !hasPrev.value + }], + "onMousedown": onFocusAffixes, + "onClick": () => hasPrev.value && scrollTo('prev') + }, [slots.prev?.(slotProps.value) ?? _createVNode$1R(VFadeTransition, null, { + default: () => [_createVNode$1R(VIcon, { + "icon": isRtl.value ? props.nextIcon : props.prevIcon + }, null)] + })]), _createVNode$1R("div", { + "key": "container", + "ref": containerRef, + "class": "v-slide-group__container", + "onScroll": onScroll + }, [_createVNode$1R("div", { + "ref": contentRef, + "class": "v-slide-group__content", + "onFocusin": onFocusin, + "onFocusout": onFocusout, + "onKeydown": onKeydown + }, [slots.default?.(slotProps.value)])]), hasAffixes.value && _createVNode$1R("div", { + "key": "next", + "class": ['v-slide-group__next', { + 'v-slide-group__next--disabled': !hasNext.value + }], + "onMousedown": onFocusAffixes, + "onClick": () => hasNext.value && scrollTo('next') + }, [slots.next?.(slotProps.value) ?? _createVNode$1R(VFadeTransition, null, { + default: () => [_createVNode$1R(VIcon, { + "icon": isRtl.value ? props.prevIcon : props.nextIcon + }, null)] + })])] + })); + return { + selected: group.selected, + scrollTo, + scrollOffset, + focus, + hasPrev, + hasNext + }; + } +}); + +const {createVNode:_createVNode$1Q,mergeProps:_mergeProps$T} = await importShared('vue'); +const {toRef: toRef$z} = await importShared('vue'); +const VChipGroupSymbol = Symbol.for('vuetify:v-chip-group'); +const makeVChipGroupProps = propsFactory({ + column: Boolean, + filter: Boolean, + valueComparator: { + type: Function, + default: deepEqual + }, + ...makeVSlideGroupProps(), + ...makeComponentProps(), + ...makeGroupProps({ + selectedClass: 'v-chip--selected' + }), + ...makeTagProps(), + ...makeThemeProps(), + ...makeVariantProps({ + variant: 'tonal' + }) +}, 'VChipGroup'); +const VChipGroup = genericComponent()({ + name: 'VChipGroup', + props: makeVChipGroupProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + isSelected, + select, + next, + prev, + selected + } = useGroup(props, VChipGroupSymbol); + provideDefaults({ + VChip: { + color: toRef$z(props, 'color'), + disabled: toRef$z(props, 'disabled'), + filter: toRef$z(props, 'filter'), + variant: toRef$z(props, 'variant') + } + }); + useRender(() => { + const slideGroupProps = VSlideGroup.filterProps(props); + return _createVNode$1Q(VSlideGroup, _mergeProps$T(slideGroupProps, { + "class": ['v-chip-group', { + 'v-chip-group--column': props.column + }, themeClasses.value, props.class], + "style": props.style + }), { + default: () => [slots.default?.({ + isSelected, + select, + next, + prev, + selected: selected.value + })] + }); + }); + return {}; + } +}); + +const {mergeProps:_mergeProps$S,Fragment:_Fragment$x,withDirectives:_withDirectives$h,vShow:_vShow$9,resolveDirective:_resolveDirective$P,createVNode:_createVNode$1P} = await importShared('vue'); +const {computed: computed$1s} = await importShared('vue'); +const makeVChipProps = propsFactory({ + activeClass: String, + appendAvatar: String, + appendIcon: IconValue, + closable: Boolean, + closeIcon: { + type: IconValue, + default: '$delete' + }, + closeLabel: { + type: String, + default: '$vuetify.close' + }, + draggable: Boolean, + filter: Boolean, + filterIcon: { + type: String, + default: '$complete' + }, + label: Boolean, + link: { + type: Boolean, + default: undefined + }, + pill: Boolean, + prependAvatar: String, + prependIcon: IconValue, + ripple: { + type: [Boolean, Object], + default: true + }, + text: String, + modelValue: { + type: Boolean, + default: true + }, + onClick: EventProp(), + onClickOnce: EventProp(), + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeElevationProps(), + ...makeGroupItemProps(), + ...makeRoundedProps(), + ...makeRouterProps(), + ...makeSizeProps(), + ...makeTagProps({ + tag: 'span' + }), + ...makeThemeProps(), + ...makeVariantProps({ + variant: 'tonal' + }) +}, 'VChip'); +const VChip = genericComponent()({ + name: 'VChip', + directives: { + Ripple + }, + props: makeVChipProps(), + emits: { + 'click:close': e => true, + 'update:modelValue': value => true, + 'group:selected': val => true, + click: e => true + }, + setup(props, _ref) { + let { + attrs, + emit, + slots + } = _ref; + const { + t + } = useLocale(); + const { + borderClasses + } = useBorder(props); + const { + colorClasses, + colorStyles, + variantClasses + } = useVariant(props); + const { + densityClasses + } = useDensity(props); + const { + elevationClasses + } = useElevation(props); + const { + roundedClasses + } = useRounded(props); + const { + sizeClasses + } = useSize(props); + const { + themeClasses + } = provideTheme(props); + const isActive = useProxiedModel(props, 'modelValue'); + const group = useGroupItem(props, VChipGroupSymbol, false); + const link = useLink(props, attrs); + const isLink = computed$1s(() => props.link !== false && link.isLink.value); + const isClickable = computed$1s(() => !props.disabled && props.link !== false && (!!group || props.link || link.isClickable.value)); + const closeProps = computed$1s(() => ({ + 'aria-label': t(props.closeLabel), + onClick(e) { + e.preventDefault(); + e.stopPropagation(); + isActive.value = false; + emit('click:close', e); + } + })); + function onClick(e) { + emit('click', e); + if (!isClickable.value) return; + link.navigate?.(e); + group?.toggle(); + } + function onKeyDown(e) { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + onClick(e); + } + } + return () => { + const Tag = link.isLink.value ? 'a' : props.tag; + const hasAppendMedia = !!(props.appendIcon || props.appendAvatar); + const hasAppend = !!(hasAppendMedia || slots.append); + const hasClose = !!(slots.close || props.closable); + const hasFilter = !!(slots.filter || props.filter) && group; + const hasPrependMedia = !!(props.prependIcon || props.prependAvatar); + const hasPrepend = !!(hasPrependMedia || slots.prepend); + const hasColor = !group || group.isSelected.value; + return isActive.value && _withDirectives$h(_createVNode$1P(Tag, _mergeProps$S({ + "class": ['v-chip', { + 'v-chip--disabled': props.disabled, + 'v-chip--label': props.label, + 'v-chip--link': isClickable.value, + 'v-chip--filter': hasFilter, + 'v-chip--pill': props.pill + }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, group?.selectedClass.value, props.class], + "style": [hasColor ? colorStyles.value : undefined, props.style], + "disabled": props.disabled || undefined, + "draggable": props.draggable, + "tabindex": isClickable.value ? 0 : undefined, + "onClick": onClick, + "onKeydown": isClickable.value && !isLink.value && onKeyDown + }, link.linkProps), { + default: () => [genOverlays(isClickable.value, 'v-chip'), hasFilter && _createVNode$1P(VExpandXTransition, { + "key": "filter" + }, { + default: () => [_withDirectives$h(_createVNode$1P("div", { + "class": "v-chip__filter" + }, [!slots.filter ? _createVNode$1P(VIcon, { + "key": "filter-icon", + "icon": props.filterIcon + }, null) : _createVNode$1P(VDefaultsProvider, { + "key": "filter-defaults", + "disabled": !props.filterIcon, + "defaults": { + VIcon: { + icon: props.filterIcon + } + } + }, slots.filter)]), [[_vShow$9, group.isSelected.value]])] + }), hasPrepend && _createVNode$1P("div", { + "key": "prepend", + "class": "v-chip__prepend" + }, [!slots.prepend ? _createVNode$1P(_Fragment$x, null, [props.prependIcon && _createVNode$1P(VIcon, { + "key": "prepend-icon", + "icon": props.prependIcon, + "start": true + }, null), props.prependAvatar && _createVNode$1P(VAvatar, { + "key": "prepend-avatar", + "image": props.prependAvatar, + "start": true + }, null)]) : _createVNode$1P(VDefaultsProvider, { + "key": "prepend-defaults", + "disabled": !hasPrependMedia, + "defaults": { + VAvatar: { + image: props.prependAvatar, + start: true + }, + VIcon: { + icon: props.prependIcon, + start: true + } + } + }, slots.prepend)]), _createVNode$1P("div", { + "class": "v-chip__content", + "data-no-activator": "" + }, [slots.default?.({ + isSelected: group?.isSelected.value, + selectedClass: group?.selectedClass.value, + select: group?.select, + toggle: group?.toggle, + value: group?.value.value, + disabled: props.disabled + }) ?? props.text]), hasAppend && _createVNode$1P("div", { + "key": "append", + "class": "v-chip__append" + }, [!slots.append ? _createVNode$1P(_Fragment$x, null, [props.appendIcon && _createVNode$1P(VIcon, { + "key": "append-icon", + "end": true, + "icon": props.appendIcon + }, null), props.appendAvatar && _createVNode$1P(VAvatar, { + "key": "append-avatar", + "end": true, + "image": props.appendAvatar + }, null)]) : _createVNode$1P(VDefaultsProvider, { + "key": "append-defaults", + "disabled": !hasAppendMedia, + "defaults": { + VAvatar: { + end: true, + image: props.appendAvatar + }, + VIcon: { + end: true, + icon: props.appendIcon + } + } + }, slots.append)]), hasClose && _createVNode$1P("button", _mergeProps$S({ + "key": "close", + "class": "v-chip__close", + "type": "button", + "data-testid": "close-chip" + }, closeProps.value), [!slots.close ? _createVNode$1P(VIcon, { + "key": "close-icon", + "icon": props.closeIcon, + "size": "x-small" + }, null) : _createVNode$1P(VDefaultsProvider, { + "key": "close-defaults", + "defaults": { + VIcon: { + icon: props.closeIcon, + size: 'x-small' + } + } + }, slots.close)])] + }), [[_resolveDirective$P("ripple"), isClickable.value && props.ripple, null]]); + }; + } +}); + +// Utilities +const {computed: computed$1r,inject: inject$i,provide: provide$d,shallowRef: shallowRef$u} = await importShared('vue'); + +// List +const ListKey = Symbol.for('vuetify:list'); +function createList() { + const parent = inject$i(ListKey, { + hasPrepend: shallowRef$u(false), + updateHasPrepend: () => null + }); + const data = { + hasPrepend: shallowRef$u(false), + updateHasPrepend: value => { + if (value) data.hasPrepend.value = value; + } + }; + provide$d(ListKey, data); + return parent; +} +function useList() { + return inject$i(ListKey, null); +} + +/* eslint-disable sonarjs/no-identical-functions */ +// Utilities +const {toRaw: toRaw$4} = await importShared('vue'); +const independentActiveStrategy = mandatory => { + const strategy = { + activate: _ref => { + let { + id, + value, + activated + } = _ref; + id = toRaw$4(id); + + // When mandatory and we're trying to deselect when id + // is the only currently selected item then do nothing + if (mandatory && !value && activated.size === 1 && activated.has(id)) return activated; + if (value) { + activated.add(id); + } else { + activated.delete(id); + } + return activated; + }, + in: (v, children, parents) => { + let set = new Set(); + if (v != null) { + for (const id of wrapInArray(v)) { + set = strategy.activate({ + id, + value: true, + activated: new Set(set), + children, + parents + }); + } + } + return set; + }, + out: v => { + return Array.from(v); + } + }; + return strategy; +}; +const independentSingleActiveStrategy = mandatory => { + const parentStrategy = independentActiveStrategy(mandatory); + const strategy = { + activate: _ref2 => { + let { + activated, + id, + ...rest + } = _ref2; + id = toRaw$4(id); + const singleSelected = activated.has(id) ? new Set([id]) : new Set(); + return parentStrategy.activate({ + ...rest, + id, + activated: singleSelected + }); + }, + in: (v, children, parents) => { + let set = new Set(); + if (v != null) { + const arr = wrapInArray(v); + if (arr.length) { + set = parentStrategy.in(arr.slice(0, 1), children, parents); + } + } + return set; + }, + out: (v, children, parents) => { + return parentStrategy.out(v, children, parents); + } + }; + return strategy; +}; +const leafActiveStrategy = mandatory => { + const parentStrategy = independentActiveStrategy(mandatory); + const strategy = { + activate: _ref3 => { + let { + id, + activated, + children, + ...rest + } = _ref3; + id = toRaw$4(id); + if (children.has(id)) return activated; + return parentStrategy.activate({ + id, + activated, + children, + ...rest + }); + }, + in: parentStrategy.in, + out: parentStrategy.out + }; + return strategy; +}; +const leafSingleActiveStrategy = mandatory => { + const parentStrategy = independentSingleActiveStrategy(mandatory); + const strategy = { + activate: _ref4 => { + let { + id, + activated, + children, + ...rest + } = _ref4; + id = toRaw$4(id); + if (children.has(id)) return activated; + return parentStrategy.activate({ + id, + activated, + children, + ...rest + }); + }, + in: parentStrategy.in, + out: parentStrategy.out + }; + return strategy; +}; + +const singleOpenStrategy = { + open: _ref => { + let { + id, + value, + opened, + parents + } = _ref; + if (value) { + const newOpened = new Set(); + newOpened.add(id); + let parent = parents.get(id); + while (parent != null) { + newOpened.add(parent); + parent = parents.get(parent); + } + return newOpened; + } else { + opened.delete(id); + return opened; + } + }, + select: () => null +}; +const multipleOpenStrategy = { + open: _ref2 => { + let { + id, + value, + opened, + parents + } = _ref2; + if (value) { + let parent = parents.get(id); + opened.add(id); + while (parent != null && parent !== id) { + opened.add(parent); + parent = parents.get(parent); + } + return opened; + } else { + opened.delete(id); + } + return opened; + }, + select: () => null +}; +const listOpenStrategy = { + open: multipleOpenStrategy.open, + select: _ref3 => { + let { + id, + value, + opened, + parents + } = _ref3; + if (!value) return opened; + const path = []; + let parent = parents.get(id); + while (parent != null) { + path.push(parent); + parent = parents.get(parent); + } + return new Set(path); + } +}; + +/* eslint-disable sonarjs/no-identical-functions */ +// Utilities +const {toRaw: toRaw$3} = await importShared('vue'); + +const independentSelectStrategy = mandatory => { + const strategy = { + select: _ref => { + let { + id, + value, + selected + } = _ref; + id = toRaw$3(id); + + // When mandatory and we're trying to deselect when id + // is the only currently selected item then do nothing + if (mandatory && !value) { + const on = Array.from(selected.entries()).reduce((arr, _ref2) => { + let [key, value] = _ref2; + if (value === 'on') arr.push(key); + return arr; + }, []); + if (on.length === 1 && on[0] === id) return selected; + } + selected.set(id, value ? 'on' : 'off'); + return selected; + }, + in: (v, children, parents) => { + let map = new Map(); + for (const id of v || []) { + map = strategy.select({ + id, + value: true, + selected: new Map(map), + children, + parents + }); + } + return map; + }, + out: v => { + const arr = []; + for (const [key, value] of v.entries()) { + if (value === 'on') arr.push(key); + } + return arr; + } + }; + return strategy; +}; +const independentSingleSelectStrategy = mandatory => { + const parentStrategy = independentSelectStrategy(mandatory); + const strategy = { + select: _ref3 => { + let { + selected, + id, + ...rest + } = _ref3; + id = toRaw$3(id); + const singleSelected = selected.has(id) ? new Map([[id, selected.get(id)]]) : new Map(); + return parentStrategy.select({ + ...rest, + id, + selected: singleSelected + }); + }, + in: (v, children, parents) => { + let map = new Map(); + if (v?.length) { + map = parentStrategy.in(v.slice(0, 1), children, parents); + } + return map; + }, + out: (v, children, parents) => { + return parentStrategy.out(v, children, parents); + } + }; + return strategy; +}; +const leafSelectStrategy = mandatory => { + const parentStrategy = independentSelectStrategy(mandatory); + const strategy = { + select: _ref4 => { + let { + id, + selected, + children, + ...rest + } = _ref4; + id = toRaw$3(id); + if (children.has(id)) return selected; + return parentStrategy.select({ + id, + selected, + children, + ...rest + }); + }, + in: parentStrategy.in, + out: parentStrategy.out + }; + return strategy; +}; +const leafSingleSelectStrategy = mandatory => { + const parentStrategy = independentSingleSelectStrategy(mandatory); + const strategy = { + select: _ref5 => { + let { + id, + selected, + children, + ...rest + } = _ref5; + id = toRaw$3(id); + if (children.has(id)) return selected; + return parentStrategy.select({ + id, + selected, + children, + ...rest + }); + }, + in: parentStrategy.in, + out: parentStrategy.out + }; + return strategy; +}; +const classicSelectStrategy = mandatory => { + const strategy = { + select: _ref6 => { + let { + id, + value, + selected, + children, + parents + } = _ref6; + id = toRaw$3(id); + const original = new Map(selected); + const items = [id]; + while (items.length) { + const item = items.shift(); + selected.set(toRaw$3(item), value ? 'on' : 'off'); + if (children.has(item)) { + items.push(...children.get(item)); + } + } + let parent = toRaw$3(parents.get(id)); + while (parent) { + const childrenIds = children.get(parent); + const everySelected = childrenIds.every(cid => selected.get(toRaw$3(cid)) === 'on'); + const noneSelected = childrenIds.every(cid => !selected.has(toRaw$3(cid)) || selected.get(toRaw$3(cid)) === 'off'); + selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate'); + parent = toRaw$3(parents.get(parent)); + } + + // If mandatory and planned deselect results in no selected + // items then we can't do it, so return original state + if (mandatory && !value) { + const on = Array.from(selected.entries()).reduce((arr, _ref7) => { + let [key, value] = _ref7; + if (value === 'on') arr.push(key); + return arr; + }, []); + if (on.length === 0) return original; + } + return selected; + }, + in: (v, children, parents) => { + let map = new Map(); + for (const id of v || []) { + map = strategy.select({ + id, + value: true, + selected: new Map(map), + children, + parents + }); + } + return map; + }, + out: (v, children) => { + const arr = []; + for (const [key, value] of v.entries()) { + if (value === 'on' && !children.has(key)) arr.push(key); + } + return arr; + } + }; + return strategy; +}; + +const {computed: computed$1q,inject: inject$h,onBeforeUnmount: onBeforeUnmount$6,provide: provide$c,ref: ref$G,shallowRef: shallowRef$t,toRaw: toRaw$2,toRef: toRef$y} = await importShared('vue'); +const VNestedSymbol = Symbol.for('vuetify:nested'); +const emptyNested = { + id: shallowRef$t(), + root: { + register: () => null, + unregister: () => null, + parents: ref$G(new Map()), + children: ref$G(new Map()), + open: () => null, + openOnSelect: () => null, + activate: () => null, + select: () => null, + activatable: ref$G(false), + selectable: ref$G(false), + opened: ref$G(new Set()), + activated: ref$G(new Set()), + selected: ref$G(new Map()), + selectedValues: ref$G([]), + getPath: () => [] + } +}; +const makeNestedProps = propsFactory({ + activatable: Boolean, + selectable: Boolean, + activeStrategy: [String, Function, Object], + selectStrategy: [String, Function, Object], + openStrategy: [String, Object], + opened: null, + activated: null, + selected: null, + mandatory: Boolean +}, 'nested'); +const useNested = props => { + let isUnmounted = false; + const children = ref$G(new Map()); + const parents = ref$G(new Map()); + const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(v), v => [...v.values()]); + const activeStrategy = computed$1q(() => { + if (typeof props.activeStrategy === 'object') return props.activeStrategy; + if (typeof props.activeStrategy === 'function') return props.activeStrategy(props.mandatory); + switch (props.activeStrategy) { + case 'leaf': + return leafActiveStrategy(props.mandatory); + case 'single-leaf': + return leafSingleActiveStrategy(props.mandatory); + case 'independent': + return independentActiveStrategy(props.mandatory); + case 'single-independent': + default: + return independentSingleActiveStrategy(props.mandatory); + } + }); + const selectStrategy = computed$1q(() => { + if (typeof props.selectStrategy === 'object') return props.selectStrategy; + if (typeof props.selectStrategy === 'function') return props.selectStrategy(props.mandatory); + switch (props.selectStrategy) { + case 'single-leaf': + return leafSingleSelectStrategy(props.mandatory); + case 'leaf': + return leafSelectStrategy(props.mandatory); + case 'independent': + return independentSelectStrategy(props.mandatory); + case 'single-independent': + return independentSingleSelectStrategy(props.mandatory); + case 'classic': + default: + return classicSelectStrategy(props.mandatory); + } + }); + const openStrategy = computed$1q(() => { + if (typeof props.openStrategy === 'object') return props.openStrategy; + switch (props.openStrategy) { + case 'list': + return listOpenStrategy; + case 'single': + return singleOpenStrategy; + case 'multiple': + default: + return multipleOpenStrategy; + } + }); + const activated = useProxiedModel(props, 'activated', props.activated, v => activeStrategy.value.in(v, children.value, parents.value), v => activeStrategy.value.out(v, children.value, parents.value)); + const selected = useProxiedModel(props, 'selected', props.selected, v => selectStrategy.value.in(v, children.value, parents.value), v => selectStrategy.value.out(v, children.value, parents.value)); + onBeforeUnmount$6(() => { + isUnmounted = true; + }); + function getPath(id) { + const path = []; + let parent = id; + while (parent != null) { + path.unshift(parent); + parent = parents.value.get(parent); + } + return path; + } + const vm = getCurrentInstance('nested'); + const nodeIds = new Set(); + const nested = { + id: shallowRef$t(), + root: { + opened, + activatable: toRef$y(props, 'activatable'), + selectable: toRef$y(props, 'selectable'), + activated, + selected, + selectedValues: computed$1q(() => { + const arr = []; + for (const [key, value] of selected.value.entries()) { + if (value === 'on') arr.push(key); + } + return arr; + }), + register: (id, parentId, isGroup) => { + if (nodeIds.has(id)) { + const path = getPath(id).map(String).join(' -> '); + const newPath = getPath(parentId).concat(id).map(String).join(' -> '); + consoleError(`Multiple nodes with the same ID\n\t${path}\n\t${newPath}`); + return; + } else { + nodeIds.add(id); + } + parentId && id !== parentId && parents.value.set(id, parentId); + isGroup && children.value.set(id, []); + if (parentId != null) { + children.value.set(parentId, [...(children.value.get(parentId) || []), id]); + } + }, + unregister: id => { + if (isUnmounted) return; + nodeIds.delete(id); + children.value.delete(id); + const parent = parents.value.get(id); + if (parent) { + const list = children.value.get(parent) ?? []; + children.value.set(parent, list.filter(child => child !== id)); + } + parents.value.delete(id); + }, + open: (id, value, event) => { + vm.emit('click:open', { + id, + value, + path: getPath(id), + event + }); + const newOpened = openStrategy.value.open({ + id, + value, + opened: new Set(opened.value), + children: children.value, + parents: parents.value, + event + }); + newOpened && (opened.value = newOpened); + }, + openOnSelect: (id, value, event) => { + const newOpened = openStrategy.value.select({ + id, + value, + selected: new Map(selected.value), + opened: new Set(opened.value), + children: children.value, + parents: parents.value, + event + }); + newOpened && (opened.value = newOpened); + }, + select: (id, value, event) => { + vm.emit('click:select', { + id, + value, + path: getPath(id), + event + }); + const newSelected = selectStrategy.value.select({ + id, + value, + selected: new Map(selected.value), + children: children.value, + parents: parents.value, + event + }); + newSelected && (selected.value = newSelected); + nested.root.openOnSelect(id, value, event); + }, + activate: (id, value, event) => { + if (!props.activatable) { + return nested.root.select(id, true, event); + } + vm.emit('click:activate', { + id, + value, + path: getPath(id), + event + }); + const newActivated = activeStrategy.value.activate({ + id, + value, + activated: new Set(activated.value), + children: children.value, + parents: parents.value, + event + }); + newActivated && (activated.value = newActivated); + }, + children, + parents, + getPath + } + }; + provide$c(VNestedSymbol, nested); + return nested.root; +}; +const useNestedItem = (id, isGroup) => { + const parent = inject$h(VNestedSymbol, emptyNested); + const uidSymbol = Symbol(getUid()); + const computedId = computed$1q(() => id.value !== undefined ? id.value : uidSymbol); + const item = { + ...parent, + id: computedId, + open: (open, e) => parent.root.open(computedId.value, open, e), + openOnSelect: (open, e) => parent.root.openOnSelect(computedId.value, open, e), + isOpen: computed$1q(() => parent.root.opened.value.has(computedId.value)), + parent: computed$1q(() => parent.root.parents.value.get(computedId.value)), + activate: (activated, e) => parent.root.activate(computedId.value, activated, e), + isActivated: computed$1q(() => parent.root.activated.value.has(toRaw$2(computedId.value))), + select: (selected, e) => parent.root.select(computedId.value, selected, e), + isSelected: computed$1q(() => parent.root.selected.value.get(toRaw$2(computedId.value)) === 'on'), + isIndeterminate: computed$1q(() => parent.root.selected.value.get(computedId.value) === 'indeterminate'), + isLeaf: computed$1q(() => !parent.root.children.value.get(computedId.value)), + isGroupActivator: parent.isGroupActivator + }; + !parent.isGroupActivator && parent.root.register(computedId.value, parent.id.value, isGroup); + onBeforeUnmount$6(() => { + !parent.isGroupActivator && parent.root.unregister(computedId.value); + }); + isGroup && provide$c(VNestedSymbol, item); + return item; +}; +const useNestedGroupActivator = () => { + const parent = inject$h(VNestedSymbol, emptyNested); + provide$c(VNestedSymbol, { + ...parent, + isGroupActivator: true + }); +}; + +const {withDirectives:_withDirectives$g,vShow:_vShow$8,createVNode:_createVNode$1O} = await importShared('vue'); +const {computed: computed$1p,toRef: toRef$x} = await importShared('vue'); +const VListGroupActivator = defineComponent({ + name: 'VListGroupActivator', + setup(_, _ref) { + let { + slots + } = _ref; + useNestedGroupActivator(); + return () => slots.default?.(); + } +}); +const makeVListGroupProps = propsFactory({ + /* @deprecated */ + activeColor: String, + baseColor: String, + color: String, + collapseIcon: { + type: IconValue, + default: '$collapse' + }, + expandIcon: { + type: IconValue, + default: '$expand' + }, + prependIcon: IconValue, + appendIcon: IconValue, + fluid: Boolean, + subgroup: Boolean, + title: String, + value: null, + ...makeComponentProps(), + ...makeTagProps() +}, 'VListGroup'); +const VListGroup = genericComponent()({ + name: 'VListGroup', + props: makeVListGroupProps(), + setup(props, _ref2) { + let { + slots + } = _ref2; + const { + isOpen, + open, + id: _id + } = useNestedItem(toRef$x(props, 'value'), true); + const id = computed$1p(() => `v-list-group--id-${String(_id.value)}`); + const list = useList(); + const { + isBooted + } = useSsrBoot(); + function onClick(e) { + e.stopPropagation(); + open(!isOpen.value, e); + } + const activatorProps = computed$1p(() => ({ + onClick, + class: 'v-list-group__header', + id: id.value + })); + const toggleIcon = computed$1p(() => isOpen.value ? props.collapseIcon : props.expandIcon); + const activatorDefaults = computed$1p(() => ({ + VListItem: { + active: isOpen.value, + activeColor: props.activeColor, + baseColor: props.baseColor, + color: props.color, + prependIcon: props.prependIcon || props.subgroup && toggleIcon.value, + appendIcon: props.appendIcon || !props.subgroup && toggleIcon.value, + title: props.title, + value: props.value + } + })); + useRender(() => _createVNode$1O(props.tag, { + "class": ['v-list-group', { + 'v-list-group--prepend': list?.hasPrepend.value, + 'v-list-group--fluid': props.fluid, + 'v-list-group--subgroup': props.subgroup, + 'v-list-group--open': isOpen.value + }, props.class], + "style": props.style + }, { + default: () => [slots.activator && _createVNode$1O(VDefaultsProvider, { + "defaults": activatorDefaults.value + }, { + default: () => [_createVNode$1O(VListGroupActivator, null, { + default: () => [slots.activator({ + props: activatorProps.value, + isOpen: isOpen.value + })] + })] + }), _createVNode$1O(MaybeTransition, { + "transition": { + component: VExpandTransition + }, + "disabled": !isBooted.value + }, { + default: () => [_withDirectives$g(_createVNode$1O("div", { + "class": "v-list-group__items", + "role": "group", + "aria-labelledby": id.value + }, [slots.default?.()]), [[_vShow$8, isOpen.value]])] + })] + })); + return { + isOpen + }; + } +}); + +const {createVNode:_createVNode$1N,resolveDirective:_resolveDirective$O} = await importShared('vue'); +const makeVListItemSubtitleProps = propsFactory({ + opacity: [Number, String], + ...makeComponentProps(), + ...makeTagProps() +}, 'VListItemSubtitle'); +const VListItemSubtitle = genericComponent()({ + name: 'VListItemSubtitle', + props: makeVListItemSubtitleProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => _createVNode$1N(props.tag, { + "class": ['v-list-item-subtitle', props.class], + "style": [{ + '--v-list-item-subtitle-opacity': props.opacity + }, props.style] + }, slots)); + return {}; + } +}); + +// Utilities +const VListItemTitle = createSimpleFunctional('v-list-item-title'); + +const {withDirectives:_withDirectives$f,mergeProps:_mergeProps$R,resolveDirective:_resolveDirective$N,createVNode:_createVNode$1M,Fragment:_Fragment$w} = await importShared('vue'); +const {computed: computed$1o,watch: watch$v} = await importShared('vue'); +const makeVListItemProps = propsFactory({ + active: { + type: Boolean, + default: undefined + }, + activeClass: String, + /* @deprecated */ + activeColor: String, + appendAvatar: String, + appendIcon: IconValue, + baseColor: String, + disabled: Boolean, + lines: [Boolean, String], + link: { + type: Boolean, + default: undefined + }, + nav: Boolean, + prependAvatar: String, + prependIcon: IconValue, + ripple: { + type: [Boolean, Object], + default: true + }, + slim: Boolean, + subtitle: [String, Number], + title: [String, Number], + value: null, + onClick: EventProp(), + onClickOnce: EventProp(), + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeDimensionProps(), + ...makeElevationProps(), + ...makeRoundedProps(), + ...makeRouterProps(), + ...makeTagProps(), + ...makeThemeProps(), + ...makeVariantProps({ + variant: 'text' + }) +}, 'VListItem'); +const VListItem = genericComponent()({ + name: 'VListItem', + directives: { + Ripple + }, + props: makeVListItemProps(), + emits: { + click: e => true + }, + setup(props, _ref) { + let { + attrs, + slots, + emit + } = _ref; + const link = useLink(props, attrs); + const id = computed$1o(() => props.value === undefined ? link.href.value : props.value); + const { + activate, + isActivated, + select, + isOpen, + isSelected, + isIndeterminate, + isGroupActivator, + root, + parent, + openOnSelect, + id: uid + } = useNestedItem(id, false); + const list = useList(); + const isActive = computed$1o(() => props.active !== false && (props.active || link.isActive?.value || (root.activatable.value ? isActivated.value : isSelected.value))); + const isLink = computed$1o(() => props.link !== false && link.isLink.value); + const isClickable = computed$1o(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || !!list && (root.selectable.value || root.activatable.value || props.value != null))); + const roundedProps = computed$1o(() => props.rounded || props.nav); + const color = computed$1o(() => props.color ?? props.activeColor); + const variantProps = computed$1o(() => ({ + color: isActive.value ? color.value ?? props.baseColor : props.baseColor, + variant: props.variant + })); + watch$v(() => link.isActive?.value, val => { + if (val && parent.value != null) { + root.open(parent.value, true); + } + if (val) { + openOnSelect(val); + } + }, { + immediate: true + }); + const { + themeClasses + } = provideTheme(props); + const { + borderClasses + } = useBorder(props); + const { + colorClasses, + colorStyles, + variantClasses + } = useVariant(variantProps); + const { + densityClasses + } = useDensity(props); + const { + dimensionStyles + } = useDimension(props); + const { + elevationClasses + } = useElevation(props); + const { + roundedClasses + } = useRounded(roundedProps); + const lineClasses = computed$1o(() => props.lines ? `v-list-item--${props.lines}-line` : undefined); + const slotProps = computed$1o(() => ({ + isActive: isActive.value, + select, + isOpen: isOpen.value, + isSelected: isSelected.value, + isIndeterminate: isIndeterminate.value + })); + function onClick(e) { + emit('click', e); + if (!isClickable.value) return; + link.navigate?.(e); + if (isGroupActivator) return; + if (root.activatable.value) { + activate(!isActivated.value, e); + } else if (root.selectable.value) { + select(!isSelected.value, e); + } else if (props.value != null) { + select(!isSelected.value, e); + } + } + function onKeyDown(e) { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + e.target.dispatchEvent(new MouseEvent('click', e)); + } + } + useRender(() => { + const Tag = isLink.value ? 'a' : props.tag; + const hasTitle = slots.title || props.title != null; + const hasSubtitle = slots.subtitle || props.subtitle != null; + const hasAppendMedia = !!(props.appendAvatar || props.appendIcon); + const hasAppend = !!(hasAppendMedia || slots.append); + const hasPrependMedia = !!(props.prependAvatar || props.prependIcon); + const hasPrepend = !!(hasPrependMedia || slots.prepend); + list?.updateHasPrepend(hasPrepend); + if (props.activeColor) { + deprecate('active-color', ['color', 'base-color']); + } + return _withDirectives$f(_createVNode$1M(Tag, _mergeProps$R({ + "class": ['v-list-item', { + 'v-list-item--active': isActive.value, + 'v-list-item--disabled': props.disabled, + 'v-list-item--link': isClickable.value, + 'v-list-item--nav': props.nav, + 'v-list-item--prepend': !hasPrepend && list?.hasPrepend.value, + 'v-list-item--slim': props.slim, + [`${props.activeClass}`]: props.activeClass && isActive.value + }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class], + "style": [colorStyles.value, dimensionStyles.value, props.style], + "tabindex": isClickable.value ? list ? -2 : 0 : undefined, + "aria-selected": root.activatable.value ? isActivated.value : isSelected.value, + "onClick": onClick, + "onKeydown": isClickable.value && !isLink.value && onKeyDown + }, link.linkProps), { + default: () => [genOverlays(isClickable.value || isActive.value, 'v-list-item'), hasPrepend && _createVNode$1M("div", { + "key": "prepend", + "class": "v-list-item__prepend" + }, [!slots.prepend ? _createVNode$1M(_Fragment$w, null, [props.prependAvatar && _createVNode$1M(VAvatar, { + "key": "prepend-avatar", + "density": props.density, + "image": props.prependAvatar + }, null), props.prependIcon && _createVNode$1M(VIcon, { + "key": "prepend-icon", + "density": props.density, + "icon": props.prependIcon + }, null)]) : _createVNode$1M(VDefaultsProvider, { + "key": "prepend-defaults", + "disabled": !hasPrependMedia, + "defaults": { + VAvatar: { + density: props.density, + image: props.prependAvatar + }, + VIcon: { + density: props.density, + icon: props.prependIcon + }, + VListItemAction: { + start: true + } + } + }, { + default: () => [slots.prepend?.(slotProps.value)] + }), _createVNode$1M("div", { + "class": "v-list-item__spacer" + }, null)]), _createVNode$1M("div", { + "class": "v-list-item__content", + "data-no-activator": "" + }, [hasTitle && _createVNode$1M(VListItemTitle, { + "key": "title" + }, { + default: () => [slots.title?.({ + title: props.title + }) ?? props.title] + }), hasSubtitle && _createVNode$1M(VListItemSubtitle, { + "key": "subtitle" + }, { + default: () => [slots.subtitle?.({ + subtitle: props.subtitle + }) ?? props.subtitle] + }), slots.default?.(slotProps.value)]), hasAppend && _createVNode$1M("div", { + "key": "append", + "class": "v-list-item__append" + }, [!slots.append ? _createVNode$1M(_Fragment$w, null, [props.appendIcon && _createVNode$1M(VIcon, { + "key": "append-icon", + "density": props.density, + "icon": props.appendIcon + }, null), props.appendAvatar && _createVNode$1M(VAvatar, { + "key": "append-avatar", + "density": props.density, + "image": props.appendAvatar + }, null)]) : _createVNode$1M(VDefaultsProvider, { + "key": "append-defaults", + "disabled": !hasAppendMedia, + "defaults": { + VAvatar: { + density: props.density, + image: props.appendAvatar + }, + VIcon: { + density: props.density, + icon: props.appendIcon + }, + VListItemAction: { + end: true + } + } + }, { + default: () => [slots.append?.(slotProps.value)] + }), _createVNode$1M("div", { + "class": "v-list-item__spacer" + }, null)])] + }), [[_resolveDirective$N("ripple"), isClickable.value && props.ripple]]); + }); + return { + activate, + isActivated, + isGroupActivator, + isSelected, + list, + select, + root, + id: uid + }; + } +}); + +const {createVNode:_createVNode$1L} = await importShared('vue'); +const {toRef: toRef$w} = await importShared('vue'); +const makeVListSubheaderProps = propsFactory({ + color: String, + inset: Boolean, + sticky: Boolean, + title: String, + ...makeComponentProps(), + ...makeTagProps() +}, 'VListSubheader'); +const VListSubheader = genericComponent()({ + name: 'VListSubheader', + props: makeVListSubheaderProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + textColorClasses, + textColorStyles + } = useTextColor(toRef$w(props, 'color')); + useRender(() => { + const hasText = !!(slots.default || props.title); + return _createVNode$1L(props.tag, { + "class": ['v-list-subheader', { + 'v-list-subheader--inset': props.inset, + 'v-list-subheader--sticky': props.sticky + }, textColorClasses.value, props.class], + "style": [{ + textColorStyles + }, props.style] + }, { + default: () => [hasText && _createVNode$1L("div", { + "class": "v-list-subheader__text" + }, [slots.default?.() ?? props.title])] + }); + }); + return {}; + } +}); + +const {createVNode:_createVNode$1K} = await importShared('vue'); +const {computed: computed$1n,toRef: toRef$v} = await importShared('vue'); +const makeVDividerProps = propsFactory({ + color: String, + inset: Boolean, + length: [Number, String], + opacity: [Number, String], + thickness: [Number, String], + vertical: Boolean, + ...makeComponentProps(), + ...makeThemeProps() +}, 'VDivider'); +const VDivider = genericComponent()({ + name: 'VDivider', + props: makeVDividerProps(), + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + textColorClasses, + textColorStyles + } = useTextColor(toRef$v(props, 'color')); + const dividerStyles = computed$1n(() => { + const styles = {}; + if (props.length) { + styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length); + } + if (props.thickness) { + styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness); + } + return styles; + }); + useRender(() => { + const divider = _createVNode$1K("hr", { + "class": [{ + 'v-divider': true, + 'v-divider--inset': props.inset, + 'v-divider--vertical': props.vertical + }, themeClasses.value, textColorClasses.value, props.class], + "style": [dividerStyles.value, textColorStyles.value, { + '--v-border-opacity': props.opacity + }, props.style], + "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined, + "role": `${attrs.role || 'separator'}` + }, null); + if (!slots.default) return divider; + return _createVNode$1K("div", { + "class": ['v-divider__wrapper', { + 'v-divider__wrapper--vertical': props.vertical, + 'v-divider__wrapper--inset': props.inset + }] + }, [divider, _createVNode$1K("div", { + "class": "v-divider__content" + }, [slots.default()]), divider]); + }); + return {}; + } +}); + +const {mergeProps:_mergeProps$Q,resolveDirective:_resolveDirective$M,createVNode:_createVNode$1J} = await importShared('vue'); +const makeVListChildrenProps = propsFactory({ + items: Array, + returnObject: Boolean +}, 'VListChildren'); +const VListChildren = genericComponent()({ + name: 'VListChildren', + props: makeVListChildrenProps(), + setup(props, _ref) { + let { + slots + } = _ref; + createList(); + return () => slots.default?.() ?? props.items?.map(_ref2 => { + let { + children, + props: itemProps, + type, + raw: item + } = _ref2; + if (type === 'divider') { + return slots.divider?.({ + props: itemProps + }) ?? _createVNode$1J(VDivider, itemProps, null); + } + if (type === 'subheader') { + return slots.subheader?.({ + props: itemProps + }) ?? _createVNode$1J(VListSubheader, itemProps, null); + } + const slotsWithItem = { + subtitle: slots.subtitle ? slotProps => slots.subtitle?.({ + ...slotProps, + item + }) : undefined, + prepend: slots.prepend ? slotProps => slots.prepend?.({ + ...slotProps, + item + }) : undefined, + append: slots.append ? slotProps => slots.append?.({ + ...slotProps, + item + }) : undefined, + title: slots.title ? slotProps => slots.title?.({ + ...slotProps, + item + }) : undefined + }; + const listGroupProps = VListGroup.filterProps(itemProps); + return children ? _createVNode$1J(VListGroup, _mergeProps$Q({ + "value": itemProps?.value + }, listGroupProps), { + activator: _ref3 => { + let { + props: activatorProps + } = _ref3; + const listItemProps = { + ...itemProps, + ...activatorProps, + value: props.returnObject ? item : itemProps.value + }; + return slots.header ? slots.header({ + props: listItemProps + }) : _createVNode$1J(VListItem, listItemProps, slotsWithItem); + }, + default: () => _createVNode$1J(VListChildren, { + "items": children, + "returnObject": props.returnObject + }, slots) + }) : slots.item ? slots.item({ + props: itemProps + }) : _createVNode$1J(VListItem, _mergeProps$Q(itemProps, { + "value": props.returnObject ? item : itemProps.value + }), slotsWithItem); + }); + } +}); + +// Utilities +const {computed: computed$1m} = await importShared('vue'); +// Composables +const makeItemsProps = propsFactory({ + items: { + type: Array, + default: () => [] + }, + itemTitle: { + type: [String, Array, Function], + default: 'title' + }, + itemValue: { + type: [String, Array, Function], + default: 'value' + }, + itemChildren: { + type: [Boolean, String, Array, Function], + default: 'children' + }, + itemProps: { + type: [Boolean, String, Array, Function], + default: 'props' + }, + returnObject: Boolean, + valueComparator: { + type: Function, + default: deepEqual + } +}, 'list-items'); +function transformItem$3(props, item) { + const title = getPropertyFromItem(item, props.itemTitle, item); + const value = getPropertyFromItem(item, props.itemValue, title); + const children = getPropertyFromItem(item, props.itemChildren); + const itemProps = props.itemProps === true ? typeof item === 'object' && item != null && !Array.isArray(item) ? 'children' in item ? omit(item, ['children']) : item : undefined : getPropertyFromItem(item, props.itemProps); + const _props = { + title, + value, + ...itemProps + }; + return { + title: String(_props.title ?? ''), + value: _props.value, + props: _props, + children: Array.isArray(children) ? transformItems$3(props, children) : undefined, + raw: item + }; +} +function transformItems$3(props, items) { + const array = []; + for (const item of items) { + array.push(transformItem$3(props, item)); + } + return array; +} +function useItems(props) { + const items = computed$1m(() => transformItems$3(props, props.items)); + const hasNullItem = computed$1m(() => items.value.some(item => item.value === null)); + function transformIn(value) { + if (!hasNullItem.value) { + // When the model value is null, return an InternalItem + // based on null only if null is one of the items + value = value.filter(v => v !== null); + } + return value.map(v => { + if (props.returnObject && typeof v === 'string') { + // String model value means value is a custom input value from combobox + // Don't look up existing items if the model value is a string + return transformItem$3(props, v); + } + return items.value.find(item => props.valueComparator(v, item.value)) || transformItem$3(props, v); + }); + } + function transformOut(value) { + return props.returnObject ? value.map(_ref => { + let { + raw + } = _ref; + return raw; + }) : value.map(_ref2 => { + let { + value + } = _ref2; + return value; + }); + } + return { + items, + transformIn, + transformOut + }; +} + +const {createVNode:_createVNode$1I,resolveDirective:_resolveDirective$L} = await importShared('vue'); +const {computed: computed$1l,ref: ref$F,shallowRef: shallowRef$s,toRef: toRef$u} = await importShared('vue'); +function isPrimitive(value) { + return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'; +} +function transformItem$2(props, item) { + const type = getPropertyFromItem(item, props.itemType, 'item'); + const title = isPrimitive(item) ? item : getPropertyFromItem(item, props.itemTitle); + const value = getPropertyFromItem(item, props.itemValue, undefined); + const children = getPropertyFromItem(item, props.itemChildren); + const itemProps = props.itemProps === true ? omit(item, ['children']) : getPropertyFromItem(item, props.itemProps); + const _props = { + title, + value, + ...itemProps + }; + return { + type, + title: _props.title, + value: _props.value, + props: _props, + children: type === 'item' && children ? transformItems$2(props, children) : undefined, + raw: item + }; +} +function transformItems$2(props, items) { + const array = []; + for (const item of items) { + array.push(transformItem$2(props, item)); + } + return array; +} +function useListItems(props) { + const items = computed$1l(() => transformItems$2(props, props.items)); + return { + items + }; +} +const makeVListProps = propsFactory({ + baseColor: String, + /* @deprecated */ + activeColor: String, + activeClass: String, + bgColor: String, + disabled: Boolean, + expandIcon: String, + collapseIcon: String, + lines: { + type: [Boolean, String], + default: 'one' + }, + slim: Boolean, + nav: Boolean, + 'onClick:open': EventProp(), + 'onClick:select': EventProp(), + 'onUpdate:opened': EventProp(), + ...makeNestedProps({ + selectStrategy: 'single-leaf', + openStrategy: 'list' + }), + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeDimensionProps(), + ...makeElevationProps(), + itemType: { + type: String, + default: 'type' + }, + ...makeItemsProps(), + ...makeRoundedProps(), + ...makeTagProps(), + ...makeThemeProps(), + ...makeVariantProps({ + variant: 'text' + }) +}, 'VList'); +const VList = genericComponent()({ + name: 'VList', + props: makeVListProps(), + emits: { + 'update:selected': value => true, + 'update:activated': value => true, + 'update:opened': value => true, + 'click:open': value => true, + 'click:activate': value => true, + 'click:select': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + items + } = useListItems(props); + const { + themeClasses + } = provideTheme(props); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$u(props, 'bgColor')); + const { + borderClasses + } = useBorder(props); + const { + densityClasses + } = useDensity(props); + const { + dimensionStyles + } = useDimension(props); + const { + elevationClasses + } = useElevation(props); + const { + roundedClasses + } = useRounded(props); + const { + children, + open, + parents, + select, + getPath + } = useNested(props); + const lineClasses = computed$1l(() => props.lines ? `v-list--${props.lines}-line` : undefined); + const activeColor = toRef$u(props, 'activeColor'); + const baseColor = toRef$u(props, 'baseColor'); + const color = toRef$u(props, 'color'); + createList(); + provideDefaults({ + VListGroup: { + activeColor, + baseColor, + color, + expandIcon: toRef$u(props, 'expandIcon'), + collapseIcon: toRef$u(props, 'collapseIcon') + }, + VListItem: { + activeClass: toRef$u(props, 'activeClass'), + activeColor, + baseColor, + color, + density: toRef$u(props, 'density'), + disabled: toRef$u(props, 'disabled'), + lines: toRef$u(props, 'lines'), + nav: toRef$u(props, 'nav'), + slim: toRef$u(props, 'slim'), + variant: toRef$u(props, 'variant') + } + }); + const isFocused = shallowRef$s(false); + const contentRef = ref$F(); + function onFocusin(e) { + isFocused.value = true; + } + function onFocusout(e) { + isFocused.value = false; + } + function onFocus(e) { + if (!isFocused.value && !(e.relatedTarget && contentRef.value?.contains(e.relatedTarget))) focus(); + } + function onKeydown(e) { + const target = e.target; + if (!contentRef.value || ['INPUT', 'TEXTAREA'].includes(target.tagName)) return; + if (e.key === 'ArrowDown') { + focus('next'); + } else if (e.key === 'ArrowUp') { + focus('prev'); + } else if (e.key === 'Home') { + focus('first'); + } else if (e.key === 'End') { + focus('last'); + } else { + return; + } + e.preventDefault(); + } + function onMousedown(e) { + isFocused.value = true; + } + function focus(location) { + if (contentRef.value) { + return focusChild(contentRef.value, location); + } + } + useRender(() => { + return _createVNode$1I(props.tag, { + "ref": contentRef, + "class": ['v-list', { + 'v-list--disabled': props.disabled, + 'v-list--nav': props.nav, + 'v-list--slim': props.slim + }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class], + "style": [backgroundColorStyles.value, dimensionStyles.value, props.style], + "tabindex": props.disabled || isFocused.value ? -1 : 0, + "role": "listbox", + "aria-activedescendant": undefined, + "onFocusin": onFocusin, + "onFocusout": onFocusout, + "onFocus": onFocus, + "onKeydown": onKeydown, + "onMousedown": onMousedown + }, { + default: () => [_createVNode$1I(VListChildren, { + "items": items.value, + "returnObject": props.returnObject + }, slots)] + }); + }); + return { + open, + select, + focus, + children, + parents, + getPath + }; + } +}); + +// Utilities +const VListImg = createSimpleFunctional('v-list-img'); + +const {createVNode:_createVNode$1H,resolveDirective:_resolveDirective$K} = await importShared('vue'); +const makeVListItemActionProps = propsFactory({ + start: Boolean, + end: Boolean, + ...makeComponentProps(), + ...makeTagProps() +}, 'VListItemAction'); +const VListItemAction = genericComponent()({ + name: 'VListItemAction', + props: makeVListItemActionProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => _createVNode$1H(props.tag, { + "class": ['v-list-item-action', { + 'v-list-item-action--start': props.start, + 'v-list-item-action--end': props.end + }, props.class], + "style": props.style + }, slots)); + return {}; + } +}); + +const {createVNode:_createVNode$1G,resolveDirective:_resolveDirective$J} = await importShared('vue'); +const makeVListItemMediaProps = propsFactory({ + start: Boolean, + end: Boolean, + ...makeComponentProps(), + ...makeTagProps() +}, 'VListItemMedia'); +const VListItemMedia = genericComponent()({ + name: 'VListItemMedia', + props: makeVListItemMediaProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => { + return _createVNode$1G(props.tag, { + "class": ['v-list-item-media', { + 'v-list-item-media--start': props.start, + 'v-list-item-media--end': props.end + }, props.class], + "style": props.style + }, slots); + }); + return {}; + } +}); + +// Types + +/** Convert a point in local space to viewport space */ +function elementToViewport(point, offset) { + return { + x: point.x + offset.x, + y: point.y + offset.y + }; +} + +/** Get the difference between two points */ +function getOffset$1(a, b) { + return { + x: a.x - b.x, + y: a.y - b.y + }; +} + +/** Convert an anchor object to a point in local space */ +function anchorToPoint(anchor, box) { + if (anchor.side === 'top' || anchor.side === 'bottom') { + const { + side, + align + } = anchor; + const x = align === 'left' ? 0 : align === 'center' ? box.width / 2 : align === 'right' ? box.width : align; + const y = side === 'top' ? 0 : side === 'bottom' ? box.height : side; + return elementToViewport({ + x, + y + }, box); + } else if (anchor.side === 'left' || anchor.side === 'right') { + const { + side, + align + } = anchor; + const x = side === 'left' ? 0 : side === 'right' ? box.width : side; + const y = align === 'top' ? 0 : align === 'center' ? box.height / 2 : align === 'bottom' ? box.height : align; + return elementToViewport({ + x, + y + }, box); + } + return elementToViewport({ + x: box.width / 2, + y: box.height / 2 + }, box); +} + +const {computed: computed$1k,nextTick: nextTick$i,onScopeDispose: onScopeDispose$7,ref: ref$E,watch: watch$u} = await importShared('vue'); +const locationStrategies = { + static: staticLocationStrategy, + // specific viewport position, usually centered + connected: connectedLocationStrategy // connected to a certain element +}; +const makeLocationStrategyProps = propsFactory({ + locationStrategy: { + type: [String, Function], + default: 'static', + validator: val => typeof val === 'function' || val in locationStrategies + }, + location: { + type: String, + default: 'bottom' + }, + origin: { + type: String, + default: 'auto' + }, + offset: [Number, String, Array] +}, 'VOverlay-location-strategies'); +function useLocationStrategies(props, data) { + const contentStyles = ref$E({}); + const updateLocation = ref$E(); + if (IN_BROWSER) { + useToggleScope(() => !!(data.isActive.value && props.locationStrategy), reset => { + watch$u(() => props.locationStrategy, reset); + onScopeDispose$7(() => { + window.removeEventListener('resize', onResize); + updateLocation.value = undefined; + }); + window.addEventListener('resize', onResize, { + passive: true + }); + if (typeof props.locationStrategy === 'function') { + updateLocation.value = props.locationStrategy(data, props, contentStyles)?.updateLocation; + } else { + updateLocation.value = locationStrategies[props.locationStrategy](data, props, contentStyles)?.updateLocation; + } + }); + } + function onResize(e) { + updateLocation.value?.(e); + } + return { + contentStyles, + updateLocation + }; +} +function staticLocationStrategy() { + // TODO +} + +/** Get size of element ignoring max-width/max-height */ +function getIntrinsicSize(el, isRtl) { + // const scrollables = new Map() + // el.querySelectorAll('*').forEach(el => { + // const x = el.scrollLeft + // const y = el.scrollTop + // if (x || y) { + // scrollables.set(el, [x, y]) + // } + // }) + + // const initialMaxWidth = el.style.maxWidth + // const initialMaxHeight = el.style.maxHeight + // el.style.removeProperty('max-width') + // el.style.removeProperty('max-height') + + /* eslint-disable-next-line sonarjs/prefer-immediate-return */ + const contentBox = nullifyTransforms(el); + if (isRtl) { + contentBox.x += parseFloat(el.style.right || 0); + } else { + contentBox.x -= parseFloat(el.style.left || 0); + } + contentBox.y -= parseFloat(el.style.top || 0); + + // el.style.maxWidth = initialMaxWidth + // el.style.maxHeight = initialMaxHeight + // scrollables.forEach((position, el) => { + // el.scrollTo(...position) + // }) + + return contentBox; +} +function connectedLocationStrategy(data, props, contentStyles) { + const activatorFixed = Array.isArray(data.target.value) || isFixedPosition(data.target.value); + if (activatorFixed) { + Object.assign(contentStyles.value, { + position: 'fixed', + top: 0, + [data.isRtl.value ? 'right' : 'left']: 0 + }); + } + const { + preferredAnchor, + preferredOrigin + } = destructComputed(() => { + const parsedAnchor = parseAnchor(props.location, data.isRtl.value); + const parsedOrigin = props.origin === 'overlap' ? parsedAnchor : props.origin === 'auto' ? flipSide(parsedAnchor) : parseAnchor(props.origin, data.isRtl.value); + + // Some combinations of props may produce an invalid origin + if (parsedAnchor.side === parsedOrigin.side && parsedAnchor.align === flipAlign(parsedOrigin).align) { + return { + preferredAnchor: flipCorner(parsedAnchor), + preferredOrigin: flipCorner(parsedOrigin) + }; + } else { + return { + preferredAnchor: parsedAnchor, + preferredOrigin: parsedOrigin + }; + } + }); + const [minWidth, minHeight, maxWidth, maxHeight] = ['minWidth', 'minHeight', 'maxWidth', 'maxHeight'].map(key => { + return computed$1k(() => { + const val = parseFloat(props[key]); + return isNaN(val) ? Infinity : val; + }); + }); + const offset = computed$1k(() => { + if (Array.isArray(props.offset)) { + return props.offset; + } + if (typeof props.offset === 'string') { + const offset = props.offset.split(' ').map(parseFloat); + if (offset.length < 2) offset.push(0); + return offset; + } + return typeof props.offset === 'number' ? [props.offset, 0] : [0, 0]; + }); + let observe = false; + const observer = new ResizeObserver(() => { + if (observe) updateLocation(); + }); + watch$u([data.target, data.contentEl], (_ref, _ref2) => { + let [newTarget, newContentEl] = _ref; + let [oldTarget, oldContentEl] = _ref2; + if (oldTarget && !Array.isArray(oldTarget)) observer.unobserve(oldTarget); + if (newTarget && !Array.isArray(newTarget)) observer.observe(newTarget); + if (oldContentEl) observer.unobserve(oldContentEl); + if (newContentEl) observer.observe(newContentEl); + }, { + immediate: true + }); + onScopeDispose$7(() => { + observer.disconnect(); + }); + + // eslint-disable-next-line max-statements + function updateLocation() { + observe = false; + requestAnimationFrame(() => observe = true); + if (!data.target.value || !data.contentEl.value) return; + const targetBox = getTargetBox(data.target.value); + const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value); + const scrollParents = getScrollParents(data.contentEl.value); + const viewportMargin = 12; + if (!scrollParents.length) { + scrollParents.push(document.documentElement); + if (!(data.contentEl.value.style.top && data.contentEl.value.style.left)) { + contentBox.x -= parseFloat(document.documentElement.style.getPropertyValue('--v-body-scroll-x') || 0); + contentBox.y -= parseFloat(document.documentElement.style.getPropertyValue('--v-body-scroll-y') || 0); + } + } + const viewport = scrollParents.reduce((box, el) => { + const rect = el.getBoundingClientRect(); + const scrollBox = new Box({ + x: el === document.documentElement ? 0 : rect.x, + y: el === document.documentElement ? 0 : rect.y, + width: el.clientWidth, + height: el.clientHeight + }); + if (box) { + return new Box({ + x: Math.max(box.left, scrollBox.left), + y: Math.max(box.top, scrollBox.top), + width: Math.min(box.right, scrollBox.right) - Math.max(box.left, scrollBox.left), + height: Math.min(box.bottom, scrollBox.bottom) - Math.max(box.top, scrollBox.top) + }); + } + return scrollBox; + }, undefined); + viewport.x += viewportMargin; + viewport.y += viewportMargin; + viewport.width -= viewportMargin * 2; + viewport.height -= viewportMargin * 2; + let placement = { + anchor: preferredAnchor.value, + origin: preferredOrigin.value + }; + function checkOverflow(_placement) { + const box = new Box(contentBox); + const targetPoint = anchorToPoint(_placement.anchor, targetBox); + const contentPoint = anchorToPoint(_placement.origin, box); + let { + x, + y + } = getOffset$1(targetPoint, contentPoint); + switch (_placement.anchor.side) { + case 'top': + y -= offset.value[0]; + break; + case 'bottom': + y += offset.value[0]; + break; + case 'left': + x -= offset.value[0]; + break; + case 'right': + x += offset.value[0]; + break; + } + switch (_placement.anchor.align) { + case 'top': + y -= offset.value[1]; + break; + case 'bottom': + y += offset.value[1]; + break; + case 'left': + x -= offset.value[1]; + break; + case 'right': + x += offset.value[1]; + break; + } + box.x += x; + box.y += y; + box.width = Math.min(box.width, maxWidth.value); + box.height = Math.min(box.height, maxHeight.value); + const overflows = getOverflow(box, viewport); + return { + overflows, + x, + y + }; + } + let x = 0; + let y = 0; + const available = { + x: 0, + y: 0 + }; + const flipped = { + x: false, + y: false + }; + let resets = -1; + while (true) { + if (resets++ > 10) { + consoleError('Infinite loop detected in connectedLocationStrategy'); + break; + } + const { + x: _x, + y: _y, + overflows + } = checkOverflow(placement); + x += _x; + y += _y; + contentBox.x += _x; + contentBox.y += _y; + + // flip + { + const axis = getAxis(placement.anchor); + const hasOverflowX = overflows.x.before || overflows.x.after; + const hasOverflowY = overflows.y.before || overflows.y.after; + let reset = false; + ['x', 'y'].forEach(key => { + if (key === 'x' && hasOverflowX && !flipped.x || key === 'y' && hasOverflowY && !flipped.y) { + const newPlacement = { + anchor: { + ...placement.anchor + }, + origin: { + ...placement.origin + } + }; + const flip = key === 'x' ? axis === 'y' ? flipAlign : flipSide : axis === 'y' ? flipSide : flipAlign; + newPlacement.anchor = flip(newPlacement.anchor); + newPlacement.origin = flip(newPlacement.origin); + const { + overflows: newOverflows + } = checkOverflow(newPlacement); + if (newOverflows[key].before <= overflows[key].before && newOverflows[key].after <= overflows[key].after || newOverflows[key].before + newOverflows[key].after < (overflows[key].before + overflows[key].after) / 2) { + placement = newPlacement; + reset = flipped[key] = true; + } + } + }); + if (reset) continue; + } + + // shift + if (overflows.x.before) { + x += overflows.x.before; + contentBox.x += overflows.x.before; + } + if (overflows.x.after) { + x -= overflows.x.after; + contentBox.x -= overflows.x.after; + } + if (overflows.y.before) { + y += overflows.y.before; + contentBox.y += overflows.y.before; + } + if (overflows.y.after) { + y -= overflows.y.after; + contentBox.y -= overflows.y.after; + } + + // size + { + const overflows = getOverflow(contentBox, viewport); + available.x = viewport.width - overflows.x.before - overflows.x.after; + available.y = viewport.height - overflows.y.before - overflows.y.after; + x += overflows.x.before; + contentBox.x += overflows.x.before; + y += overflows.y.before; + contentBox.y += overflows.y.before; + } + break; + } + const axis = getAxis(placement.anchor); + Object.assign(contentStyles.value, { + '--v-overlay-anchor-origin': `${placement.anchor.side} ${placement.anchor.align}`, + transformOrigin: `${placement.origin.side} ${placement.origin.align}`, + // transform: `translate(${pixelRound(x)}px, ${pixelRound(y)}px)`, + top: convertToUnit(pixelRound(y)), + left: data.isRtl.value ? undefined : convertToUnit(pixelRound(x)), + right: data.isRtl.value ? convertToUnit(pixelRound(-x)) : undefined, + minWidth: convertToUnit(axis === 'y' ? Math.min(minWidth.value, targetBox.width) : minWidth.value), + maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))), + maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value))) + }); + return { + available, + contentBox + }; + } + watch$u(() => [preferredAnchor.value, preferredOrigin.value, props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateLocation()); + nextTick$i(() => { + const result = updateLocation(); + + // TODO: overflowing content should only require a single updateLocation call + // Icky hack to make sure the content is positioned consistently + if (!result) return; + const { + available, + contentBox + } = result; + if (contentBox.height > available.y) { + requestAnimationFrame(() => { + updateLocation(); + requestAnimationFrame(() => { + updateLocation(); + }); + }); + } + }); + return { + updateLocation + }; +} +function pixelRound(val) { + return Math.round(val * devicePixelRatio) / devicePixelRatio; +} +function pixelCeil(val) { + return Math.ceil(val * devicePixelRatio) / devicePixelRatio; +} + +let clean = true; +const frames = []; + +/** + * Schedule a task to run in an animation frame on its own + * This is useful for heavy tasks that may cause jank if all ran together + */ +function requestNewFrame(cb) { + if (!clean || frames.length) { + frames.push(cb); + run(); + } else { + clean = false; + cb(); + run(); + } +} +let raf = -1; +function run() { + cancelAnimationFrame(raf); + raf = requestAnimationFrame(() => { + const frame = frames.shift(); + if (frame) frame(); + if (frames.length) run();else clean = true; + }); +} + +// Utilities +const {effectScope: effectScope$1,onScopeDispose: onScopeDispose$6,watchEffect: watchEffect$e} = await importShared('vue'); +const scrollStrategies = { + none: null, + close: closeScrollStrategy, + block: blockScrollStrategy, + reposition: repositionScrollStrategy +}; +const makeScrollStrategyProps = propsFactory({ + scrollStrategy: { + type: [String, Function], + default: 'block', + validator: val => typeof val === 'function' || val in scrollStrategies + } +}, 'VOverlay-scroll-strategies'); +function useScrollStrategies(props, data) { + if (!IN_BROWSER) return; + let scope; + watchEffect$e(async () => { + scope?.stop(); + if (!(data.isActive.value && props.scrollStrategy)) return; + scope = effectScope$1(); + await new Promise(resolve => setTimeout(resolve)); + scope.active && scope.run(() => { + if (typeof props.scrollStrategy === 'function') { + props.scrollStrategy(data, props, scope); + } else { + scrollStrategies[props.scrollStrategy]?.(data, props, scope); + } + }); + }); + onScopeDispose$6(() => { + scope?.stop(); + }); +} +function closeScrollStrategy(data) { + function onScroll(e) { + data.isActive.value = false; + } + bindScroll(data.targetEl.value ?? data.contentEl.value, onScroll); +} +function blockScrollStrategy(data, props) { + const offsetParent = data.root.value?.offsetParent; + const scrollElements = [...new Set([...getScrollParents(data.targetEl.value, props.contained ? offsetParent : undefined), ...getScrollParents(data.contentEl.value, props.contained ? offsetParent : undefined)])].filter(el => !el.classList.contains('v-overlay-scroll-blocked')); + const scrollbarWidth = window.innerWidth - document.documentElement.offsetWidth; + const scrollableParent = (el => hasScrollbar(el) && el)(offsetParent || document.documentElement); + if (scrollableParent) { + data.root.value.classList.add('v-overlay--scroll-blocked'); + } + scrollElements.forEach((el, i) => { + el.style.setProperty('--v-body-scroll-x', convertToUnit(-el.scrollLeft)); + el.style.setProperty('--v-body-scroll-y', convertToUnit(-el.scrollTop)); + if (el !== document.documentElement) { + el.style.setProperty('--v-scrollbar-offset', convertToUnit(scrollbarWidth)); + } + el.classList.add('v-overlay-scroll-blocked'); + }); + onScopeDispose$6(() => { + scrollElements.forEach((el, i) => { + const x = parseFloat(el.style.getPropertyValue('--v-body-scroll-x')); + const y = parseFloat(el.style.getPropertyValue('--v-body-scroll-y')); + const scrollBehavior = el.style.scrollBehavior; + el.style.scrollBehavior = 'auto'; + el.style.removeProperty('--v-body-scroll-x'); + el.style.removeProperty('--v-body-scroll-y'); + el.style.removeProperty('--v-scrollbar-offset'); + el.classList.remove('v-overlay-scroll-blocked'); + el.scrollLeft = -x; + el.scrollTop = -y; + el.style.scrollBehavior = scrollBehavior; + }); + if (scrollableParent) { + data.root.value.classList.remove('v-overlay--scroll-blocked'); + } + }); +} +function repositionScrollStrategy(data, props, scope) { + let slow = false; + let raf = -1; + let ric = -1; + function update(e) { + requestNewFrame(() => { + const start = performance.now(); + data.updateLocation.value?.(e); + const time = performance.now() - start; + slow = time / (1000 / 60) > 2; + }); + } + ric = (typeof requestIdleCallback === 'undefined' ? cb => cb() : requestIdleCallback)(() => { + scope.run(() => { + bindScroll(data.targetEl.value ?? data.contentEl.value, e => { + if (slow) { + // If the position calculation is slow, + // defer updates until scrolling is finished. + // Browsers usually fire one scroll event per frame so + // we just wait until we've got two frames without an event + cancelAnimationFrame(raf); + raf = requestAnimationFrame(() => { + raf = requestAnimationFrame(() => { + update(e); + }); + }); + } else { + update(e); + } + }); + }); + }); + onScopeDispose$6(() => { + typeof cancelIdleCallback !== 'undefined' && cancelIdleCallback(ric); + cancelAnimationFrame(raf); + }); +} + +/** @private */ +function bindScroll(el, onScroll) { + const scrollElements = [document, ...getScrollParents(el)]; + scrollElements.forEach(el => { + el.addEventListener('scroll', onScroll, { + passive: true + }); + }); + onScopeDispose$6(() => { + scrollElements.forEach(el => { + el.removeEventListener('scroll', onScroll); + }); + }); +} + +// Types + +const VMenuSymbol = Symbol.for('vuetify:v-menu'); + +// Utilities +// Composables +const makeDelayProps = propsFactory({ + closeDelay: [Number, String], + openDelay: [Number, String] +}, 'delay'); +function useDelay(props, cb) { + let clearDelay = () => {}; + function runDelay(isOpening) { + clearDelay?.(); + const delay = Number(isOpening ? props.openDelay : props.closeDelay); + return new Promise(resolve => { + clearDelay = defer(delay, () => { + cb?.(isOpening); + resolve(isOpening); + }); + }); + } + function runOpenDelay() { + return runDelay(true); + } + function runCloseDelay() { + return runDelay(false); + } + return { + clearDelay, + runOpenDelay, + runCloseDelay + }; +} + +const {computed: computed$1j,effectScope,inject: inject$g,mergeProps: mergeProps$b,nextTick: nextTick$h,onScopeDispose: onScopeDispose$5,ref: ref$D,watch: watch$t,watchEffect: watchEffect$d} = await importShared('vue'); +const makeActivatorProps = propsFactory({ + target: [String, Object], + activator: [String, Object], + activatorProps: { + type: Object, + default: () => ({}) + }, + openOnClick: { + type: Boolean, + default: undefined + }, + openOnHover: Boolean, + openOnFocus: { + type: Boolean, + default: undefined + }, + closeOnContentClick: Boolean, + ...makeDelayProps() +}, 'VOverlay-activator'); +function useActivator(props, _ref) { + let { + isActive, + isTop, + contentEl + } = _ref; + const vm = getCurrentInstance('useActivator'); + const activatorEl = ref$D(); + let isHovered = false; + let isFocused = false; + let firstEnter = true; + const openOnFocus = computed$1j(() => props.openOnFocus || props.openOnFocus == null && props.openOnHover); + const openOnClick = computed$1j(() => props.openOnClick || props.openOnClick == null && !props.openOnHover && !openOnFocus.value); + const { + runOpenDelay, + runCloseDelay + } = useDelay(props, value => { + if (value === (props.openOnHover && isHovered || openOnFocus.value && isFocused) && !(props.openOnHover && isActive.value && !isTop.value)) { + if (isActive.value !== value) { + firstEnter = true; + } + isActive.value = value; + } + }); + const cursorTarget = ref$D(); + const availableEvents = { + onClick: e => { + e.stopPropagation(); + activatorEl.value = e.currentTarget || e.target; + if (!isActive.value) { + cursorTarget.value = [e.clientX, e.clientY]; + } + isActive.value = !isActive.value; + }, + onMouseenter: e => { + if (e.sourceCapabilities?.firesTouchEvents) return; + isHovered = true; + activatorEl.value = e.currentTarget || e.target; + runOpenDelay(); + }, + onMouseleave: e => { + isHovered = false; + runCloseDelay(); + }, + onFocus: e => { + if (matchesSelector(e.target, ':focus-visible') === false) return; + isFocused = true; + e.stopPropagation(); + activatorEl.value = e.currentTarget || e.target; + runOpenDelay(); + }, + onBlur: e => { + isFocused = false; + e.stopPropagation(); + runCloseDelay(); + } + }; + const activatorEvents = computed$1j(() => { + const events = {}; + if (openOnClick.value) { + events.onClick = availableEvents.onClick; + } + if (props.openOnHover) { + events.onMouseenter = availableEvents.onMouseenter; + events.onMouseleave = availableEvents.onMouseleave; + } + if (openOnFocus.value) { + events.onFocus = availableEvents.onFocus; + events.onBlur = availableEvents.onBlur; + } + return events; + }); + const contentEvents = computed$1j(() => { + const events = {}; + if (props.openOnHover) { + events.onMouseenter = () => { + isHovered = true; + runOpenDelay(); + }; + events.onMouseleave = () => { + isHovered = false; + runCloseDelay(); + }; + } + if (openOnFocus.value) { + events.onFocusin = () => { + isFocused = true; + runOpenDelay(); + }; + events.onFocusout = () => { + isFocused = false; + runCloseDelay(); + }; + } + if (props.closeOnContentClick) { + const menu = inject$g(VMenuSymbol, null); + events.onClick = () => { + isActive.value = false; + menu?.closeParents(); + }; + } + return events; + }); + const scrimEvents = computed$1j(() => { + const events = {}; + if (props.openOnHover) { + events.onMouseenter = () => { + if (firstEnter) { + isHovered = true; + firstEnter = false; + runOpenDelay(); + } + }; + events.onMouseleave = () => { + isHovered = false; + runCloseDelay(); + }; + } + return events; + }); + watch$t(isTop, val => { + if (val && (props.openOnHover && !isHovered && (!openOnFocus.value || !isFocused) || openOnFocus.value && !isFocused && (!props.openOnHover || !isHovered)) && !contentEl.value?.contains(document.activeElement)) { + isActive.value = false; + } + }); + watch$t(isActive, val => { + if (!val) { + setTimeout(() => { + cursorTarget.value = undefined; + }); + } + }, { + flush: 'post' + }); + const activatorRef = templateRef(); + watchEffect$d(() => { + if (!activatorRef.value) return; + nextTick$h(() => { + activatorEl.value = activatorRef.el; + }); + }); + const targetRef = templateRef(); + const target = computed$1j(() => { + if (props.target === 'cursor' && cursorTarget.value) return cursorTarget.value; + if (targetRef.value) return targetRef.el; + return getTarget(props.target, vm) || activatorEl.value; + }); + const targetEl = computed$1j(() => { + return Array.isArray(target.value) ? undefined : target.value; + }); + let scope; + watch$t(() => !!props.activator, val => { + if (val && IN_BROWSER) { + scope = effectScope(); + scope.run(() => { + _useActivator(props, vm, { + activatorEl, + activatorEvents + }); + }); + } else if (scope) { + scope.stop(); + } + }, { + flush: 'post', + immediate: true + }); + onScopeDispose$5(() => { + scope?.stop(); + }); + return { + activatorEl, + activatorRef, + target, + targetEl, + targetRef, + activatorEvents, + contentEvents, + scrimEvents + }; +} +function _useActivator(props, vm, _ref2) { + let { + activatorEl, + activatorEvents + } = _ref2; + watch$t(() => props.activator, (val, oldVal) => { + if (oldVal && val !== oldVal) { + const activator = getActivator(oldVal); + activator && unbindActivatorProps(activator); + } + if (val) { + nextTick$h(() => bindActivatorProps()); + } + }, { + immediate: true + }); + watch$t(() => props.activatorProps, () => { + bindActivatorProps(); + }); + onScopeDispose$5(() => { + unbindActivatorProps(); + }); + function bindActivatorProps() { + let el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getActivator(); + let _props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.activatorProps; + if (!el) return; + bindProps(el, mergeProps$b(activatorEvents.value, _props)); + } + function unbindActivatorProps() { + let el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getActivator(); + let _props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.activatorProps; + if (!el) return; + unbindProps(el, mergeProps$b(activatorEvents.value, _props)); + } + function getActivator() { + let selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : props.activator; + const activator = getTarget(selector, vm); + + // The activator should only be a valid element (Ignore comments and text nodes) + activatorEl.value = activator?.nodeType === Node.ELEMENT_NODE ? activator : undefined; + return activatorEl.value; + } +} +function getTarget(selector, vm) { + if (!selector) return; + let target; + if (selector === 'parent') { + let el = vm?.proxy?.$el?.parentNode; + while (el?.hasAttribute('data-no-activator')) { + el = el.parentNode; + } + target = el; + } else if (typeof selector === 'string') { + // Selector + target = document.querySelector(selector); + } else if ('$el' in selector) { + // Component (ref) + target = selector.$el; + } else { + // HTMLElement | Element | [x, y] + target = selector; + } + return target; +} + +const {onMounted: onMounted$9,shallowRef: shallowRef$r} = await importShared('vue'); +function useHydration() { + if (!IN_BROWSER) return shallowRef$r(false); + const { + ssr + } = useDisplay(); + if (ssr) { + const isMounted = shallowRef$r(false); + onMounted$9(() => { + isMounted.value = true; + }); + return isMounted; + } else { + return shallowRef$r(true); + } +} + +// Utilities +const {computed: computed$1i,shallowRef: shallowRef$q,watch: watch$s} = await importShared('vue'); +const makeLazyProps = propsFactory({ + eager: Boolean +}, 'lazy'); +function useLazy(props, active) { + const isBooted = shallowRef$q(false); + const hasContent = computed$1i(() => isBooted.value || props.eager || active.value); + watch$s(active, () => isBooted.value = true); + function onAfterLeave() { + if (!props.eager) isBooted.value = false; + } + return { + isBooted, + hasContent, + onAfterLeave + }; +} + +// Utilities +function useScopeId() { + const vm = getCurrentInstance('useScopeId'); + const scopeId = vm.vnode.scopeId; + return { + scopeId: scopeId ? { + [scopeId]: '' + } : undefined + }; +} + +const {computed: computed$1h,inject: inject$f,onScopeDispose: onScopeDispose$4,provide: provide$b,reactive,readonly,shallowRef: shallowRef$p,toRaw: toRaw$1,watchEffect: watchEffect$c} = await importShared('vue'); +const StackSymbol = Symbol.for('vuetify:stack'); +const globalStack = reactive([]); +function useStack(isActive, zIndex, disableGlobalStack) { + const vm = getCurrentInstance('useStack'); + const createStackEntry = !disableGlobalStack; + const parent = inject$f(StackSymbol, undefined); + const stack = reactive({ + activeChildren: new Set() + }); + provide$b(StackSymbol, stack); + const _zIndex = shallowRef$p(+zIndex.value); + useToggleScope(isActive, () => { + const lastZIndex = globalStack.at(-1)?.[1]; + _zIndex.value = lastZIndex ? lastZIndex + 10 : +zIndex.value; + if (createStackEntry) { + globalStack.push([vm.uid, _zIndex.value]); + } + parent?.activeChildren.add(vm.uid); + onScopeDispose$4(() => { + if (createStackEntry) { + const idx = toRaw$1(globalStack).findIndex(v => v[0] === vm.uid); + globalStack.splice(idx, 1); + } + parent?.activeChildren.delete(vm.uid); + }); + }); + const globalTop = shallowRef$p(true); + if (createStackEntry) { + watchEffect$c(() => { + const _isTop = globalStack.at(-1)?.[0] === vm.uid; + setTimeout(() => globalTop.value = _isTop); + }); + } + const localTop = computed$1h(() => !stack.activeChildren.size); + return { + globalTop: readonly(globalTop), + localTop, + stackStyles: computed$1h(() => ({ + zIndex: _zIndex.value + })) + }; +} + +// Utilities +const {computed: computed$1g,warn} = await importShared('vue'); +function useTeleport(target) { + const teleportTarget = computed$1g(() => { + const _target = target(); + if (_target === true || !IN_BROWSER) return undefined; + const targetElement = _target === false ? document.body : typeof _target === 'string' ? document.querySelector(_target) : _target; + if (targetElement == null) { + warn(`Unable to locate target ${_target}`); + return undefined; + } + let container = [...targetElement.children].find(el => el.matches('.v-overlay-container')); + if (!container) { + container = document.createElement('div'); + container.className = 'v-overlay-container'; + targetElement.appendChild(container); + } + return container; + }); + return { + teleportTarget + }; +} + +// Utilities +function defaultConditional() { + return true; +} +function checkEvent(e, el, binding) { + // The include element callbacks below can be expensive + // so we should avoid calling them when we're not active. + // Explicitly check for false to allow fallback compatibility + // with non-toggleable components + if (!e || checkIsActive(e, binding) === false) return false; + + // If we're clicking inside the shadowroot, then the app root doesn't get the same + // level of introspection as to _what_ we're clicking. We want to check to see if + // our target is the shadowroot parent container, and if it is, ignore. + const root = attachedRoot(el); + if (typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot && root.host === e.target) return false; + + // Check if additional elements were passed to be included in check + // (click must be outside all included elements, if any) + const elements = (typeof binding.value === 'object' && binding.value.include || (() => []))(); + // Add the root element for the component this directive was defined on + elements.push(el); + + // Check if it's a click outside our elements, and then if our callback returns true. + // Non-toggleable components should take action in their callback and return falsy. + // Toggleable can return true if it wants to deactivate. + // Note that, because we're in the capture phase, this callback will occur before + // the bubbling click event on any outside elements. + return !elements.some(el => el?.contains(e.target)); +} +function checkIsActive(e, binding) { + const isActive = typeof binding.value === 'object' && binding.value.closeConditional || defaultConditional; + return isActive(e); +} +function directive(e, el, binding) { + const handler = typeof binding.value === 'function' ? binding.value : binding.value.handler; + + // Clicks in the Shadow DOM change their target while using setTimeout, so the original target is saved here + e.shadowTarget = e.target; + el._clickOutside.lastMousedownWasOutside && checkEvent(e, el, binding) && setTimeout(() => { + checkIsActive(e, binding) && handler && handler(e); + }, 0); +} +function handleShadow(el, callback) { + const root = attachedRoot(el); + callback(document); + if (typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot) { + callback(root); + } +} +const ClickOutside = { + // [data-app] may not be found + // if using bind, inserted makes + // sure that the root element is + // available, iOS does not support + // clicks on body + mounted(el, binding) { + const onClick = e => directive(e, el, binding); + const onMousedown = e => { + el._clickOutside.lastMousedownWasOutside = checkEvent(e, el, binding); + }; + handleShadow(el, app => { + app.addEventListener('click', onClick, true); + app.addEventListener('mousedown', onMousedown, true); + }); + if (!el._clickOutside) { + el._clickOutside = { + lastMousedownWasOutside: false + }; + } + el._clickOutside[binding.instance.$.uid] = { + onClick, + onMousedown + }; + }, + beforeUnmount(el, binding) { + if (!el._clickOutside) return; + handleShadow(el, app => { + if (!app || !el._clickOutside?.[binding.instance.$.uid]) return; + const { + onClick, + onMousedown + } = el._clickOutside[binding.instance.$.uid]; + app.removeEventListener('click', onClick, true); + app.removeEventListener('mousedown', onMousedown, true); + }); + delete el._clickOutside[binding.instance.$.uid]; + } +}; + +const {withDirectives:_withDirectives$e,resolveDirective:_resolveDirective$I,vShow:_vShow$7,Fragment:_Fragment$v,createVNode:_createVNode$1F,mergeProps:_mergeProps$P} = await importShared('vue'); +const {computed: computed$1f,mergeProps: mergeProps$a,onBeforeUnmount: onBeforeUnmount$5,ref: ref$C,Teleport,toRef: toRef$t,Transition: Transition$1,watch: watch$r} = await importShared('vue'); +function Scrim(props) { + const { + modelValue, + color, + ...rest + } = props; + return _createVNode$1F(Transition$1, { + "name": "fade-transition", + "appear": true + }, { + default: () => [props.modelValue && _createVNode$1F("div", _mergeProps$P({ + "class": ['v-overlay__scrim', props.color.backgroundColorClasses.value], + "style": props.color.backgroundColorStyles.value + }, rest), null)] + }); +} +const makeVOverlayProps = propsFactory({ + absolute: Boolean, + attach: [Boolean, String, Object], + closeOnBack: { + type: Boolean, + default: true + }, + contained: Boolean, + contentClass: null, + contentProps: null, + disabled: Boolean, + opacity: [Number, String], + noClickAnimation: Boolean, + modelValue: Boolean, + persistent: Boolean, + scrim: { + type: [Boolean, String], + default: true + }, + zIndex: { + type: [Number, String], + default: 2000 + }, + ...makeActivatorProps(), + ...makeComponentProps(), + ...makeDimensionProps(), + ...makeLazyProps(), + ...makeLocationStrategyProps(), + ...makeScrollStrategyProps(), + ...makeThemeProps(), + ...makeTransitionProps() +}, 'VOverlay'); +const VOverlay = genericComponent()({ + name: 'VOverlay', + directives: { + ClickOutside + }, + inheritAttrs: false, + props: { + _disableGlobalStack: Boolean, + ...makeVOverlayProps() + }, + emits: { + 'click:outside': e => true, + 'update:modelValue': value => true, + afterEnter: () => true, + afterLeave: () => true + }, + setup(props, _ref) { + let { + slots, + attrs, + emit + } = _ref; + const vm = getCurrentInstance('VOverlay'); + const root = ref$C(); + const scrimEl = ref$C(); + const contentEl = ref$C(); + const model = useProxiedModel(props, 'modelValue'); + const isActive = computed$1f({ + get: () => model.value, + set: v => { + if (!(v && props.disabled)) model.value = v; + } + }); + const { + themeClasses + } = provideTheme(props); + const { + rtlClasses, + isRtl + } = useRtl(); + const { + hasContent, + onAfterLeave: _onAfterLeave + } = useLazy(props, isActive); + const scrimColor = useBackgroundColor(computed$1f(() => { + return typeof props.scrim === 'string' ? props.scrim : null; + })); + const { + globalTop, + localTop, + stackStyles + } = useStack(isActive, toRef$t(props, 'zIndex'), props._disableGlobalStack); + const { + activatorEl, + activatorRef, + target, + targetEl, + targetRef, + activatorEvents, + contentEvents, + scrimEvents + } = useActivator(props, { + isActive, + isTop: localTop, + contentEl + }); + const { + teleportTarget + } = useTeleport(() => { + const target = props.attach || props.contained; + if (target) return target; + const rootNode = activatorEl?.value?.getRootNode() || vm.proxy?.$el?.getRootNode(); + if (rootNode instanceof ShadowRoot) return rootNode; + return false; + }); + const { + dimensionStyles + } = useDimension(props); + const isMounted = useHydration(); + const { + scopeId + } = useScopeId(); + watch$r(() => props.disabled, v => { + if (v) isActive.value = false; + }); + const { + contentStyles, + updateLocation + } = useLocationStrategies(props, { + isRtl, + contentEl, + target, + isActive + }); + useScrollStrategies(props, { + root, + contentEl, + targetEl, + isActive, + updateLocation + }); + function onClickOutside(e) { + emit('click:outside', e); + if (!props.persistent) isActive.value = false;else animateClick(); + } + function closeConditional(e) { + return isActive.value && globalTop.value && ( + // If using scrim, only close if clicking on it rather than anything opened on top + !props.scrim || e.target === scrimEl.value || e instanceof MouseEvent && e.shadowTarget === scrimEl.value); + } + IN_BROWSER && watch$r(isActive, val => { + if (val) { + window.addEventListener('keydown', onKeydown); + } else { + window.removeEventListener('keydown', onKeydown); + } + }, { + immediate: true + }); + onBeforeUnmount$5(() => { + if (!IN_BROWSER) return; + window.removeEventListener('keydown', onKeydown); + }); + function onKeydown(e) { + if (e.key === 'Escape' && globalTop.value) { + if (!props.persistent) { + isActive.value = false; + if (contentEl.value?.contains(document.activeElement)) { + activatorEl.value?.focus(); + } + } else animateClick(); + } + } + const router = useRouter(); + useToggleScope(() => props.closeOnBack, () => { + useBackButton(router, next => { + if (globalTop.value && isActive.value) { + next(false); + if (!props.persistent) isActive.value = false;else animateClick(); + } else { + next(); + } + }); + }); + const top = ref$C(); + watch$r(() => isActive.value && (props.absolute || props.contained) && teleportTarget.value == null, val => { + if (val) { + const scrollParent = getScrollParent(root.value); + if (scrollParent && scrollParent !== document.scrollingElement) { + top.value = scrollParent.scrollTop; + } + } + }); + + // Add a quick "bounce" animation to the content + function animateClick() { + if (props.noClickAnimation) return; + contentEl.value && animate(contentEl.value, [{ + transformOrigin: 'center' + }, { + transform: 'scale(1.03)' + }, { + transformOrigin: 'center' + }], { + duration: 150, + easing: standardEasing + }); + } + function onAfterEnter() { + emit('afterEnter'); + } + function onAfterLeave() { + _onAfterLeave(); + emit('afterLeave'); + } + useRender(() => _createVNode$1F(_Fragment$v, null, [slots.activator?.({ + isActive: isActive.value, + targetRef, + props: mergeProps$a({ + ref: activatorRef + }, activatorEvents.value, props.activatorProps) + }), isMounted.value && hasContent.value && _createVNode$1F(Teleport, { + "disabled": !teleportTarget.value, + "to": teleportTarget.value + }, { + default: () => [_createVNode$1F("div", _mergeProps$P({ + "class": ['v-overlay', { + 'v-overlay--absolute': props.absolute || props.contained, + 'v-overlay--active': isActive.value, + 'v-overlay--contained': props.contained + }, themeClasses.value, rtlClasses.value, props.class], + "style": [stackStyles.value, { + '--v-overlay-opacity': props.opacity, + top: convertToUnit(top.value) + }, props.style], + "ref": root + }, scopeId, attrs), [_createVNode$1F(Scrim, _mergeProps$P({ + "color": scrimColor, + "modelValue": isActive.value && !!props.scrim, + "ref": scrimEl + }, scrimEvents.value), null), _createVNode$1F(MaybeTransition, { + "appear": true, + "persisted": true, + "transition": props.transition, + "target": target.value, + "onAfterEnter": onAfterEnter, + "onAfterLeave": onAfterLeave + }, { + default: () => [_withDirectives$e(_createVNode$1F("div", _mergeProps$P({ + "ref": contentEl, + "class": ['v-overlay__content', props.contentClass], + "style": [dimensionStyles.value, contentStyles.value] + }, contentEvents.value, props.contentProps), [slots.default?.({ + isActive + })]), [[_vShow$7, isActive.value], [_resolveDirective$I("click-outside"), { + handler: onClickOutside, + closeConditional, + include: () => [activatorEl.value] + }]])] + })])] + })])); + return { + activatorEl, + scrimEl, + target, + animateClick, + contentEl, + globalTop, + localTop, + updateLocation + }; + } +}); + +// Types + +const Refs = Symbol('Forwarded refs'); + +/** Omit properties starting with P */ + +/** Omit keyof $props from T */ + +function getDescriptor(obj, key) { + let currentObj = obj; + while (currentObj) { + const descriptor = Reflect.getOwnPropertyDescriptor(currentObj, key); + if (descriptor) return descriptor; + currentObj = Object.getPrototypeOf(currentObj); + } + return undefined; +} +function forwardRefs(target) { + for (var _len = arguments.length, refs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + refs[_key - 1] = arguments[_key]; + } + target[Refs] = refs; + return new Proxy(target, { + get(target, key) { + if (Reflect.has(target, key)) { + return Reflect.get(target, key); + } + + // Skip internal properties + if (typeof key === 'symbol' || key.startsWith('$') || key.startsWith('__')) return; + for (const ref of refs) { + if (ref.value && Reflect.has(ref.value, key)) { + const val = Reflect.get(ref.value, key); + return typeof val === 'function' ? val.bind(ref.value) : val; + } + } + }, + has(target, key) { + if (Reflect.has(target, key)) { + return true; + } + + // Skip internal properties + if (typeof key === 'symbol' || key.startsWith('$') || key.startsWith('__')) return false; + for (const ref of refs) { + if (ref.value && Reflect.has(ref.value, key)) { + return true; + } + } + return false; + }, + set(target, key, value) { + if (Reflect.has(target, key)) { + return Reflect.set(target, key, value); + } + + // Skip internal properties + if (typeof key === 'symbol' || key.startsWith('$') || key.startsWith('__')) return false; + for (const ref of refs) { + if (ref.value && Reflect.has(ref.value, key)) { + return Reflect.set(ref.value, key, value); + } + } + return false; + }, + getOwnPropertyDescriptor(target, key) { + const descriptor = Reflect.getOwnPropertyDescriptor(target, key); + if (descriptor) return descriptor; + + // Skip internal properties + if (typeof key === 'symbol' || key.startsWith('$') || key.startsWith('__')) return; + + // Check each ref's own properties + for (const ref of refs) { + if (!ref.value) continue; + const descriptor = getDescriptor(ref.value, key) ?? ('_' in ref.value ? getDescriptor(ref.value._?.setupState, key) : undefined); + if (descriptor) return descriptor; + } + + // Recursive search up each ref's prototype + for (const ref of refs) { + const childRefs = ref.value && ref.value[Refs]; + if (!childRefs) continue; + const queue = childRefs.slice(); + while (queue.length) { + const ref = queue.shift(); + const descriptor = getDescriptor(ref.value, key); + if (descriptor) return descriptor; + const childRefs = ref.value && ref.value[Refs]; + if (childRefs) queue.push(...childRefs); + } + } + return undefined; + } + }); +} + +const {mergeProps:_mergeProps$O,createVNode:_createVNode$1E} = await importShared('vue'); +const {computed: computed$1e,inject: inject$e,mergeProps: mergeProps$9,nextTick: nextTick$g,onBeforeUnmount: onBeforeUnmount$4,onDeactivated,provide: provide$a,ref: ref$B,shallowRef: shallowRef$o,watch: watch$q} = await importShared('vue'); +const makeVMenuProps = propsFactory({ + // TODO + // disableKeys: Boolean, + id: String, + submenu: Boolean, + ...omit(makeVOverlayProps({ + closeDelay: 250, + closeOnContentClick: true, + locationStrategy: 'connected', + location: undefined, + openDelay: 300, + scrim: false, + scrollStrategy: 'reposition', + transition: { + component: VDialogTransition + } + }), ['absolute']) +}, 'VMenu'); +const VMenu = genericComponent()({ + name: 'VMenu', + props: makeVMenuProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const isActive = useProxiedModel(props, 'modelValue'); + const { + scopeId + } = useScopeId(); + const { + isRtl + } = useRtl(); + const uid = getUid(); + const id = computed$1e(() => props.id || `v-menu-${uid}`); + const overlay = ref$B(); + const parent = inject$e(VMenuSymbol, null); + const openChildren = shallowRef$o(new Set()); + provide$a(VMenuSymbol, { + register() { + openChildren.value.add(uid); + }, + unregister() { + openChildren.value.delete(uid); + }, + closeParents(e) { + setTimeout(() => { + if (!openChildren.value.size && !props.persistent && (e == null || overlay.value?.contentEl && !isClickInsideElement(e, overlay.value.contentEl))) { + isActive.value = false; + parent?.closeParents(); + } + }, 40); + } + }); + onBeforeUnmount$4(() => parent?.unregister()); + onDeactivated(() => isActive.value = false); + async function onFocusIn(e) { + const before = e.relatedTarget; + const after = e.target; + await nextTick$g(); + if (isActive.value && before !== after && overlay.value?.contentEl && + // We're the topmost menu + overlay.value?.globalTop && + // It isn't the document or the menu body + ![document, overlay.value.contentEl].includes(after) && + // It isn't inside the menu body + !overlay.value.contentEl.contains(after)) { + const focusable = focusableChildren(overlay.value.contentEl); + focusable[0]?.focus(); + } + } + watch$q(isActive, val => { + if (val) { + parent?.register(); + document.addEventListener('focusin', onFocusIn, { + once: true + }); + } else { + parent?.unregister(); + document.removeEventListener('focusin', onFocusIn); + } + }); + function onClickOutside(e) { + parent?.closeParents(e); + } + function onKeydown(e) { + if (props.disabled) return; + if (e.key === 'Tab' || e.key === 'Enter' && !props.closeOnContentClick) { + if (e.key === 'Enter' && (e.target instanceof HTMLTextAreaElement || e.target instanceof HTMLInputElement && !!e.target.closest('form'))) return; + if (e.key === 'Enter') e.preventDefault(); + const nextElement = getNextElement(focusableChildren(overlay.value?.contentEl, false), e.shiftKey ? 'prev' : 'next', el => el.tabIndex >= 0); + if (!nextElement) { + isActive.value = false; + overlay.value?.activatorEl?.focus(); + } + } else if (props.submenu && e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) { + isActive.value = false; + overlay.value?.activatorEl?.focus(); + } + } + function onActivatorKeydown(e) { + if (props.disabled) return; + const el = overlay.value?.contentEl; + if (el && isActive.value) { + if (e.key === 'ArrowDown') { + e.preventDefault(); + e.stopImmediatePropagation(); + focusChild(el, 'next'); + } else if (e.key === 'ArrowUp') { + e.preventDefault(); + e.stopImmediatePropagation(); + focusChild(el, 'prev'); + } else if (props.submenu) { + if (e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) { + isActive.value = false; + } else if (e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight')) { + e.preventDefault(); + focusChild(el, 'first'); + } + } + } else if (props.submenu ? e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight') : ['ArrowDown', 'ArrowUp'].includes(e.key)) { + isActive.value = true; + e.preventDefault(); + setTimeout(() => setTimeout(() => onActivatorKeydown(e))); + } + } + const activatorProps = computed$1e(() => mergeProps$9({ + 'aria-haspopup': 'menu', + 'aria-expanded': String(isActive.value), + 'aria-owns': id.value, + onKeydown: onActivatorKeydown + }, props.activatorProps)); + useRender(() => { + const overlayProps = VOverlay.filterProps(props); + return _createVNode$1E(VOverlay, _mergeProps$O({ + "ref": overlay, + "id": id.value, + "class": ['v-menu', props.class], + "style": props.style + }, overlayProps, { + "modelValue": isActive.value, + "onUpdate:modelValue": $event => isActive.value = $event, + "absolute": true, + "activatorProps": activatorProps.value, + "location": props.location ?? (props.submenu ? 'end' : 'bottom'), + "onClick:outside": onClickOutside, + "onKeydown": onKeydown + }, scopeId), { + activator: slots.activator, + default: function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return _createVNode$1E(VDefaultsProvider, { + "root": "VMenu" + }, { + default: () => [slots.default?.(...args)] + }); + } + }); + }); + return forwardRefs({ + id, + ΨopenChildren: openChildren + }, overlay); + } +}); + +const {withDirectives:_withDirectives$d,createVNode:_createVNode$1D,vShow:_vShow$6} = await importShared('vue'); +const {computed: computed$1d} = await importShared('vue'); +const makeVCounterProps = propsFactory({ + active: Boolean, + disabled: Boolean, + max: [Number, String], + value: { + type: [Number, String], + default: 0 + }, + ...makeComponentProps(), + ...makeTransitionProps({ + transition: { + component: VSlideYTransition + } + }) +}, 'VCounter'); +const VCounter = genericComponent()({ + name: 'VCounter', + functional: true, + props: makeVCounterProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const counter = computed$1d(() => { + return props.max ? `${props.value} / ${props.max}` : String(props.value); + }); + useRender(() => _createVNode$1D(MaybeTransition, { + "transition": props.transition + }, { + default: () => [_withDirectives$d(_createVNode$1D("div", { + "class": ['v-counter', { + 'text-error': props.max && !props.disabled && parseFloat(props.value) > parseFloat(props.max) + }, props.class], + "style": props.style + }, [slots.default ? slots.default({ + counter: counter.value, + max: props.max, + value: props.value + }) : counter.value]), [[_vShow$6, props.active]])] + })); + return {}; + } +}); + +const {createVNode:_createVNode$1C,resolveDirective:_resolveDirective$H} = await importShared('vue'); +const makeVFieldLabelProps = propsFactory({ + floating: Boolean, + ...makeComponentProps() +}, 'VFieldLabel'); +const VFieldLabel = genericComponent()({ + name: 'VFieldLabel', + props: makeVFieldLabelProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => _createVNode$1C(VLabel, { + "class": ['v-field-label', { + 'v-field-label--floating': props.floating + }, props.class], + "style": props.style, + "aria-hidden": props.floating || undefined + }, slots)); + return {}; + } +}); + +const {mergeProps:_mergeProps$N,Fragment:_Fragment$u,withDirectives:_withDirectives$c,vShow:_vShow$5,resolveDirective:_resolveDirective$G,createVNode:_createVNode$1B} = await importShared('vue'); +const {computed: computed$1c,ref: ref$A,toRef: toRef$s,watch: watch$p} = await importShared('vue'); +const allowedVariants$1 = ['underlined', 'outlined', 'filled', 'solo', 'solo-inverted', 'solo-filled', 'plain']; +const makeVFieldProps = propsFactory({ + appendInnerIcon: IconValue, + bgColor: String, + clearable: Boolean, + clearIcon: { + type: IconValue, + default: '$clear' + }, + active: Boolean, + centerAffix: { + type: Boolean, + default: undefined + }, + color: String, + baseColor: String, + dirty: Boolean, + disabled: { + type: Boolean, + default: null + }, + error: Boolean, + flat: Boolean, + label: String, + persistentClear: Boolean, + prependInnerIcon: IconValue, + reverse: Boolean, + singleLine: Boolean, + variant: { + type: String, + default: 'filled', + validator: v => allowedVariants$1.includes(v) + }, + 'onClick:clear': EventProp(), + 'onClick:appendInner': EventProp(), + 'onClick:prependInner': EventProp(), + ...makeComponentProps(), + ...makeLoaderProps(), + ...makeRoundedProps(), + ...makeThemeProps() +}, 'VField'); +const VField = genericComponent()({ + name: 'VField', + inheritAttrs: false, + props: { + id: String, + ...makeFocusProps(), + ...makeVFieldProps() + }, + emits: { + 'update:focused': focused => true, + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + attrs, + emit, + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + loaderClasses + } = useLoader(props); + const { + focusClasses, + isFocused, + focus, + blur + } = useFocus(props); + const { + InputIcon + } = useInputIcon(props); + const { + roundedClasses + } = useRounded(props); + const { + rtlClasses + } = useRtl(); + const isActive = computed$1c(() => props.dirty || props.active); + const hasLabel = computed$1c(() => !props.singleLine && !!(props.label || slots.label)); + const uid = getUid(); + const id = computed$1c(() => props.id || `input-${uid}`); + const messagesId = computed$1c(() => `${id.value}-messages`); + const labelRef = ref$A(); + const floatingLabelRef = ref$A(); + const controlRef = ref$A(); + const isPlainOrUnderlined = computed$1c(() => ['plain', 'underlined'].includes(props.variant)); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$s(props, 'bgColor')); + const { + textColorClasses, + textColorStyles + } = useTextColor(computed$1c(() => { + return props.error || props.disabled ? undefined : isActive.value && isFocused.value ? props.color : props.baseColor; + })); + watch$p(isActive, val => { + if (hasLabel.value) { + const el = labelRef.value.$el; + const targetEl = floatingLabelRef.value.$el; + requestAnimationFrame(() => { + const rect = nullifyTransforms(el); + const targetRect = targetEl.getBoundingClientRect(); + const x = targetRect.x - rect.x; + const y = targetRect.y - rect.y - (rect.height / 2 - targetRect.height / 2); + const targetWidth = targetRect.width / 0.75; + const width = Math.abs(targetWidth - rect.width) > 1 ? { + maxWidth: convertToUnit(targetWidth) + } : undefined; + const style = getComputedStyle(el); + const targetStyle = getComputedStyle(targetEl); + const duration = parseFloat(style.transitionDuration) * 1000 || 150; + const scale = parseFloat(targetStyle.getPropertyValue('--v-field-label-scale')); + const color = targetStyle.getPropertyValue('color'); + el.style.visibility = 'visible'; + targetEl.style.visibility = 'hidden'; + animate(el, { + transform: `translate(${x}px, ${y}px) scale(${scale})`, + color, + ...width + }, { + duration, + easing: standardEasing, + direction: val ? 'normal' : 'reverse' + }).finished.then(() => { + el.style.removeProperty('visibility'); + targetEl.style.removeProperty('visibility'); + }); + }); + } + }, { + flush: 'post' + }); + const slotProps = computed$1c(() => ({ + isActive, + isFocused, + controlRef, + blur, + focus + })); + function onClick(e) { + if (e.target !== document.activeElement) { + e.preventDefault(); + } + } + function onKeydownClear(e) { + if (e.key !== 'Enter' && e.key !== ' ') return; + e.preventDefault(); + e.stopPropagation(); + props['onClick:clear']?.(new MouseEvent('click')); + } + useRender(() => { + const isOutlined = props.variant === 'outlined'; + const hasPrepend = !!(slots['prepend-inner'] || props.prependInnerIcon); + const hasClear = !!(props.clearable || slots.clear); + const hasAppend = !!(slots['append-inner'] || props.appendInnerIcon || hasClear); + const label = () => slots.label ? slots.label({ + ...slotProps.value, + label: props.label, + props: { + for: id.value + } + }) : props.label; + return _createVNode$1B("div", _mergeProps$N({ + "class": ['v-field', { + 'v-field--active': isActive.value, + 'v-field--appended': hasAppend, + 'v-field--center-affix': props.centerAffix ?? !isPlainOrUnderlined.value, + 'v-field--disabled': props.disabled, + 'v-field--dirty': props.dirty, + 'v-field--error': props.error, + 'v-field--flat': props.flat, + 'v-field--has-background': !!props.bgColor, + 'v-field--persistent-clear': props.persistentClear, + 'v-field--prepended': hasPrepend, + 'v-field--reverse': props.reverse, + 'v-field--single-line': props.singleLine, + 'v-field--no-label': !label(), + [`v-field--variant-${props.variant}`]: true + }, themeClasses.value, backgroundColorClasses.value, focusClasses.value, loaderClasses.value, roundedClasses.value, rtlClasses.value, props.class], + "style": [backgroundColorStyles.value, props.style], + "onClick": onClick + }, attrs), [_createVNode$1B("div", { + "class": "v-field__overlay" + }, null), _createVNode$1B(LoaderSlot, { + "name": "v-field", + "active": !!props.loading, + "color": props.error ? 'error' : typeof props.loading === 'string' ? props.loading : props.color + }, { + default: slots.loader + }), hasPrepend && _createVNode$1B("div", { + "key": "prepend", + "class": "v-field__prepend-inner" + }, [props.prependInnerIcon && _createVNode$1B(InputIcon, { + "key": "prepend-icon", + "name": "prependInner" + }, null), slots['prepend-inner']?.(slotProps.value)]), _createVNode$1B("div", { + "class": "v-field__field", + "data-no-activator": "" + }, [['filled', 'solo', 'solo-inverted', 'solo-filled'].includes(props.variant) && hasLabel.value && _createVNode$1B(VFieldLabel, { + "key": "floating-label", + "ref": floatingLabelRef, + "class": [textColorClasses.value], + "floating": true, + "for": id.value, + "style": textColorStyles.value + }, { + default: () => [label()] + }), _createVNode$1B(VFieldLabel, { + "ref": labelRef, + "for": id.value + }, { + default: () => [label()] + }), slots.default?.({ + ...slotProps.value, + props: { + id: id.value, + class: 'v-field__input', + 'aria-describedby': messagesId.value + }, + focus, + blur + })]), hasClear && _createVNode$1B(VExpandXTransition, { + "key": "clear" + }, { + default: () => [_withDirectives$c(_createVNode$1B("div", { + "class": "v-field__clearable", + "onMousedown": e => { + e.preventDefault(); + e.stopPropagation(); + } + }, [_createVNode$1B(VDefaultsProvider, { + "defaults": { + VIcon: { + icon: props.clearIcon + } + } + }, { + default: () => [slots.clear ? slots.clear({ + ...slotProps.value, + props: { + onKeydown: onKeydownClear, + onFocus: focus, + onBlur: blur, + onClick: props['onClick:clear'] + } + }) : _createVNode$1B(InputIcon, { + "name": "clear", + "onKeydown": onKeydownClear, + "onFocus": focus, + "onBlur": blur + }, null)] + })]), [[_vShow$5, props.dirty]])] + }), hasAppend && _createVNode$1B("div", { + "key": "append", + "class": "v-field__append-inner" + }, [slots['append-inner']?.(slotProps.value), props.appendInnerIcon && _createVNode$1B(InputIcon, { + "key": "append-icon", + "name": "appendInner" + }, null)]), _createVNode$1B("div", { + "class": ['v-field__outline', textColorClasses.value], + "style": textColorStyles.value + }, [isOutlined && _createVNode$1B(_Fragment$u, null, [_createVNode$1B("div", { + "class": "v-field__outline__start" + }, null), hasLabel.value && _createVNode$1B("div", { + "class": "v-field__outline__notch" + }, [_createVNode$1B(VFieldLabel, { + "ref": floatingLabelRef, + "floating": true, + "for": id.value + }, { + default: () => [label()] + })]), _createVNode$1B("div", { + "class": "v-field__outline__end" + }, null)]), isPlainOrUnderlined.value && hasLabel.value && _createVNode$1B(VFieldLabel, { + "ref": floatingLabelRef, + "floating": true, + "for": id.value + }, { + default: () => [label()] + })])]); + }); + return { + controlRef + }; + } +}); +// TODO: this is kinda slow, might be better to implicitly inherit props instead +function filterFieldProps(attrs) { + const keys = Object.keys(VField.props).filter(k => !isOn(k) && k !== 'class' && k !== 'style'); + return pick(attrs, keys); +} + +const {Fragment:_Fragment$t,withDirectives:_withDirectives$b,createVNode:_createVNode$1A,mergeProps:_mergeProps$M,resolveDirective:_resolveDirective$F} = await importShared('vue'); +const {cloneVNode,computed: computed$1b,nextTick: nextTick$f,ref: ref$z} = await importShared('vue'); +const activeTypes = ['color', 'file', 'time', 'date', 'datetime-local', 'week', 'month']; +const makeVTextFieldProps = propsFactory({ + autofocus: Boolean, + counter: [Boolean, Number, String], + counterValue: [Number, Function], + prefix: String, + placeholder: String, + persistentPlaceholder: Boolean, + persistentCounter: Boolean, + suffix: String, + role: String, + type: { + type: String, + default: 'text' + }, + modelModifiers: Object, + ...makeVInputProps(), + ...makeVFieldProps() +}, 'VTextField'); +const VTextField = genericComponent()({ + name: 'VTextField', + directives: { + Intersect + }, + inheritAttrs: false, + props: makeVTextFieldProps(), + emits: { + 'click:control': e => true, + 'mousedown:control': e => true, + 'update:focused': focused => true, + 'update:modelValue': val => true + }, + setup(props, _ref) { + let { + attrs, + emit, + slots + } = _ref; + const model = useProxiedModel(props, 'modelValue'); + const { + isFocused, + focus, + blur + } = useFocus(props); + const counterValue = computed$1b(() => { + return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : (model.value ?? '').toString().length; + }); + const max = computed$1b(() => { + if (attrs.maxlength) return attrs.maxlength; + if (!props.counter || typeof props.counter !== 'number' && typeof props.counter !== 'string') return undefined; + return props.counter; + }); + const isPlainOrUnderlined = computed$1b(() => ['plain', 'underlined'].includes(props.variant)); + function onIntersect(isIntersecting, entries) { + if (!props.autofocus || !isIntersecting) return; + entries[0].target?.focus?.(); + } + const vInputRef = ref$z(); + const vFieldRef = ref$z(); + const inputRef = ref$z(); + const isActive = computed$1b(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value || props.active); + function onFocus() { + if (inputRef.value !== document.activeElement) { + inputRef.value?.focus(); + } + if (!isFocused.value) focus(); + } + function onControlMousedown(e) { + emit('mousedown:control', e); + if (e.target === inputRef.value) return; + onFocus(); + e.preventDefault(); + } + function onControlClick(e) { + onFocus(); + emit('click:control', e); + } + function onClear(e) { + e.stopPropagation(); + onFocus(); + nextTick$f(() => { + model.value = null; + callEvent(props['onClick:clear'], e); + }); + } + function onInput(e) { + const el = e.target; + model.value = el.value; + if (props.modelModifiers?.trim && ['text', 'search', 'password', 'tel', 'url'].includes(props.type)) { + const caretPosition = [el.selectionStart, el.selectionEnd]; + nextTick$f(() => { + el.selectionStart = caretPosition[0]; + el.selectionEnd = caretPosition[1]; + }); + } + } + useRender(() => { + const hasCounter = !!(slots.counter || props.counter !== false && props.counter != null); + const hasDetails = !!(hasCounter || slots.details); + const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); + const { + modelValue: _, + ...inputProps + } = VInput.filterProps(props); + const fieldProps = filterFieldProps(props); + return _createVNode$1A(VInput, _mergeProps$M({ + "ref": vInputRef, + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "class": ['v-text-field', { + 'v-text-field--prefixed': props.prefix, + 'v-text-field--suffixed': props.suffix, + 'v-input--plain-underlined': isPlainOrUnderlined.value + }, props.class], + "style": props.style + }, rootAttrs, inputProps, { + "centerAffix": !isPlainOrUnderlined.value, + "focused": isFocused.value + }), { + ...slots, + default: _ref2 => { + let { + id, + isDisabled, + isDirty, + isReadonly, + isValid + } = _ref2; + return _createVNode$1A(VField, _mergeProps$M({ + "ref": vFieldRef, + "onMousedown": onControlMousedown, + "onClick": onControlClick, + "onClick:clear": onClear, + "onClick:prependInner": props['onClick:prependInner'], + "onClick:appendInner": props['onClick:appendInner'], + "role": props.role + }, fieldProps, { + "id": id.value, + "active": isActive.value || isDirty.value, + "dirty": isDirty.value || props.dirty, + "disabled": isDisabled.value, + "focused": isFocused.value, + "error": isValid.value === false + }), { + ...slots, + default: _ref3 => { + let { + props: { + class: fieldClass, + ...slotProps + } + } = _ref3; + const inputNode = _withDirectives$b(_createVNode$1A("input", _mergeProps$M({ + "ref": inputRef, + "value": model.value, + "onInput": onInput, + "autofocus": props.autofocus, + "readonly": isReadonly.value, + "disabled": isDisabled.value, + "name": props.name, + "placeholder": props.placeholder, + "size": 1, + "type": props.type, + "onFocus": onFocus, + "onBlur": blur + }, slotProps, inputAttrs), null), [[_resolveDirective$F("intersect"), { + handler: onIntersect + }, null, { + once: true + }]]); + return _createVNode$1A(_Fragment$t, null, [props.prefix && _createVNode$1A("span", { + "class": "v-text-field__prefix" + }, [_createVNode$1A("span", { + "class": "v-text-field__prefix__text" + }, [props.prefix])]), slots.default ? _createVNode$1A("div", { + "class": fieldClass, + "data-no-activator": "" + }, [slots.default(), inputNode]) : cloneVNode(inputNode, { + class: fieldClass + }), props.suffix && _createVNode$1A("span", { + "class": "v-text-field__suffix" + }, [_createVNode$1A("span", { + "class": "v-text-field__suffix__text" + }, [props.suffix])])]); + } + }); + }, + details: hasDetails ? slotProps => _createVNode$1A(_Fragment$t, null, [slots.details?.(slotProps), hasCounter && _createVNode$1A(_Fragment$t, null, [_createVNode$1A("span", null, null), _createVNode$1A(VCounter, { + "active": props.persistentCounter || isFocused.value, + "value": counterValue.value, + "max": max.value, + "disabled": props.disabled + }, slots.counter)])]) : undefined + }); + }); + return forwardRefs({}, vInputRef, vFieldRef, inputRef); + } +}); + +const {mergeProps:_mergeProps$L,createVNode:_createVNode$1z,Fragment:_Fragment$s} = await importShared('vue'); +const {watch: watch$o} = await importShared('vue'); +const makeVVirtualScrollItemProps = propsFactory({ + renderless: Boolean, + ...makeComponentProps() +}, 'VVirtualScrollItem'); +const VVirtualScrollItem = genericComponent()({ + name: 'VVirtualScrollItem', + inheritAttrs: false, + props: makeVVirtualScrollItemProps(), + emits: { + 'update:height': height => true + }, + setup(props, _ref) { + let { + attrs, + emit, + slots + } = _ref; + const { + resizeRef, + contentRect + } = useResizeObserver(undefined, 'border'); + watch$o(() => contentRect.value?.height, height => { + if (height != null) emit('update:height', height); + }); + useRender(() => props.renderless ? _createVNode$1z(_Fragment$s, null, [slots.default?.({ + itemRef: resizeRef + })]) : _createVNode$1z("div", _mergeProps$L({ + "ref": resizeRef, + "class": ['v-virtual-scroll__item', props.class], + "style": props.style + }, attrs), [slots.default?.()])); + } +}); + +const {computed: computed$1a,nextTick: nextTick$e,onScopeDispose: onScopeDispose$3,ref: ref$y,shallowRef: shallowRef$n,watch: watch$n,watchEffect: watchEffect$b} = await importShared('vue'); +const UP = -1; +const DOWN = 1; + +/** Determines how large each batch of items should be */ +const BUFFER_PX = 100; +const makeVirtualProps = propsFactory({ + itemHeight: { + type: [Number, String], + default: null + }, + height: [Number, String] +}, 'virtual'); +function useVirtual(props, items) { + const display = useDisplay(); + const itemHeight = shallowRef$n(0); + watchEffect$b(() => { + itemHeight.value = parseFloat(props.itemHeight || 0); + }); + const first = shallowRef$n(0); + const last = shallowRef$n(Math.ceil( + // Assume 16px items filling the entire screen height if + // not provided. This is probably incorrect but it minimises + // the chance of ending up with empty space at the bottom. + // The default value is set here to avoid poisoning getSize() + (parseInt(props.height) || display.height.value) / (itemHeight.value || 16)) || 1); + const paddingTop = shallowRef$n(0); + const paddingBottom = shallowRef$n(0); + + /** The scrollable element */ + const containerRef = ref$y(); + /** An element marking the top of the scrollable area, + * used to add an offset if there's padding or other elements above the virtual list */ + const markerRef = ref$y(); + /** markerRef's offsetTop, lazily evaluated */ + let markerOffset = 0; + const { + resizeRef, + contentRect + } = useResizeObserver(); + watchEffect$b(() => { + resizeRef.value = containerRef.value; + }); + const viewportHeight = computed$1a(() => { + return containerRef.value === document.documentElement ? display.height.value : contentRect.value?.height || parseInt(props.height) || 0; + }); + /** All static elements have been rendered and we have an assumed item height */ + const hasInitialRender = computed$1a(() => { + return !!(containerRef.value && markerRef.value && viewportHeight.value && itemHeight.value); + }); + let sizes = Array.from({ + length: items.value.length + }); + let offsets = Array.from({ + length: items.value.length + }); + const updateTime = shallowRef$n(0); + let targetScrollIndex = -1; + function getSize(index) { + return sizes[index] || itemHeight.value; + } + const updateOffsets = debounce(() => { + const start = performance.now(); + offsets[0] = 0; + const length = items.value.length; + for (let i = 1; i <= length - 1; i++) { + offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1); + } + updateTime.value = Math.max(updateTime.value, performance.now() - start); + }, updateTime); + const unwatch = watch$n(hasInitialRender, v => { + if (!v) return; + // First render is complete, update offsets and visible + // items in case our assumed item height was incorrect + + unwatch(); + markerOffset = markerRef.value.offsetTop; + updateOffsets.immediate(); + calculateVisibleItems(); + if (!~targetScrollIndex) return; + nextTick$e(() => { + IN_BROWSER && window.requestAnimationFrame(() => { + scrollToIndex(targetScrollIndex); + targetScrollIndex = -1; + }); + }); + }); + onScopeDispose$3(() => { + updateOffsets.clear(); + }); + function handleItemResize(index, height) { + const prevHeight = sizes[index]; + const prevMinHeight = itemHeight.value; + itemHeight.value = prevMinHeight ? Math.min(itemHeight.value, height) : height; + if (prevHeight !== height || prevMinHeight !== itemHeight.value) { + sizes[index] = height; + updateOffsets(); + } + } + function calculateOffset(index) { + index = clamp(index, 0, items.value.length - 1); + return offsets[index] || 0; + } + function calculateIndex(scrollTop) { + return binaryClosest(offsets, scrollTop); + } + let lastScrollTop = 0; + let scrollVelocity = 0; + let lastScrollTime = 0; + watch$n(viewportHeight, (val, oldVal) => { + if (oldVal) { + calculateVisibleItems(); + if (val < oldVal) { + requestAnimationFrame(() => { + scrollVelocity = 0; + calculateVisibleItems(); + }); + } + } + }); + function handleScroll() { + if (!containerRef.value || !markerRef.value) return; + const scrollTop = containerRef.value.scrollTop; + const scrollTime = performance.now(); + const scrollDeltaT = scrollTime - lastScrollTime; + if (scrollDeltaT > 500) { + scrollVelocity = Math.sign(scrollTop - lastScrollTop); + + // Not super important, only update at the + // start of a scroll sequence to avoid reflows + markerOffset = markerRef.value.offsetTop; + } else { + scrollVelocity = scrollTop - lastScrollTop; + } + lastScrollTop = scrollTop; + lastScrollTime = scrollTime; + calculateVisibleItems(); + } + function handleScrollend() { + if (!containerRef.value || !markerRef.value) return; + scrollVelocity = 0; + lastScrollTime = 0; + calculateVisibleItems(); + } + let raf = -1; + function calculateVisibleItems() { + cancelAnimationFrame(raf); + raf = requestAnimationFrame(_calculateVisibleItems); + } + function _calculateVisibleItems() { + if (!containerRef.value || !viewportHeight.value) return; + const scrollTop = lastScrollTop - markerOffset; + const direction = Math.sign(scrollVelocity); + const startPx = Math.max(0, scrollTop - BUFFER_PX); + const start = clamp(calculateIndex(startPx), 0, items.value.length); + const endPx = scrollTop + viewportHeight.value + BUFFER_PX; + const end = clamp(calculateIndex(endPx) + 1, start + 1, items.value.length); + if ( + // Only update the side we're scrolling towards, + // the other side will be updated incidentally + (direction !== UP || start < first.value) && (direction !== DOWN || end > last.value)) { + const topOverflow = calculateOffset(first.value) - calculateOffset(start); + const bottomOverflow = calculateOffset(end) - calculateOffset(last.value); + const bufferOverflow = Math.max(topOverflow, bottomOverflow); + if (bufferOverflow > BUFFER_PX) { + first.value = start; + last.value = end; + } else { + // Only update the side that's reached its limit if there's still buffer left + if (start <= 0) first.value = start; + if (end >= items.value.length) last.value = end; + } + } + paddingTop.value = calculateOffset(first.value); + paddingBottom.value = calculateOffset(items.value.length) - calculateOffset(last.value); + } + function scrollToIndex(index) { + const offset = calculateOffset(index); + if (!containerRef.value || index && !offset) { + targetScrollIndex = index; + } else { + containerRef.value.scrollTop = offset; + } + } + const computedItems = computed$1a(() => { + return items.value.slice(first.value, last.value).map((item, index) => ({ + raw: item, + index: index + first.value + })); + }); + watch$n(items, () => { + sizes = Array.from({ + length: items.value.length + }); + offsets = Array.from({ + length: items.value.length + }); + updateOffsets.immediate(); + calculateVisibleItems(); + }, { + deep: true + }); + return { + calculateVisibleItems, + containerRef, + markerRef, + computedItems, + paddingTop, + paddingBottom, + scrollToIndex, + handleScroll, + handleScrollend, + handleItemResize + }; +} + +// https://gist.github.com/robertleeplummerjr/1cc657191d34ecd0a324 +function binaryClosest(arr, val) { + let high = arr.length - 1; + let low = 0; + let mid = 0; + let item = null; + let target = -1; + if (arr[high] < val) { + return high; + } + while (low <= high) { + mid = low + high >> 1; + item = arr[mid]; + if (item > val) { + high = mid - 1; + } else if (item < val) { + target = mid; + low = mid + 1; + } else if (item === val) { + return mid; + } else { + return low; + } + } + return target; +} + +const {Fragment:_Fragment$r,createVNode:_createVNode$1y} = await importShared('vue'); +const {onMounted: onMounted$8,onScopeDispose: onScopeDispose$2,toRef: toRef$r} = await importShared('vue'); +const makeVVirtualScrollProps = propsFactory({ + items: { + type: Array, + default: () => [] + }, + renderless: Boolean, + ...makeVirtualProps(), + ...makeComponentProps(), + ...makeDimensionProps() +}, 'VVirtualScroll'); +const VVirtualScroll = genericComponent()({ + name: 'VVirtualScroll', + props: makeVVirtualScrollProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const vm = getCurrentInstance('VVirtualScroll'); + const { + dimensionStyles + } = useDimension(props); + const { + calculateVisibleItems, + containerRef, + markerRef, + handleScroll, + handleScrollend, + handleItemResize, + scrollToIndex, + paddingTop, + paddingBottom, + computedItems + } = useVirtual(props, toRef$r(props, 'items')); + useToggleScope(() => props.renderless, () => { + function handleListeners() { + let add = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const method = add ? 'addEventListener' : 'removeEventListener'; + if (containerRef.value === document.documentElement) { + document[method]('scroll', handleScroll, { + passive: true + }); + document[method]('scrollend', handleScrollend); + } else { + containerRef.value?.[method]('scroll', handleScroll, { + passive: true + }); + containerRef.value?.[method]('scrollend', handleScrollend); + } + } + onMounted$8(() => { + containerRef.value = getScrollParent(vm.vnode.el, true); + handleListeners(true); + }); + onScopeDispose$2(handleListeners); + }); + useRender(() => { + const children = computedItems.value.map(item => _createVNode$1y(VVirtualScrollItem, { + "key": item.index, + "renderless": props.renderless, + "onUpdate:height": height => handleItemResize(item.index, height) + }, { + default: slotProps => slots.default?.({ + item: item.raw, + index: item.index, + ...slotProps + }) + })); + return props.renderless ? _createVNode$1y(_Fragment$r, null, [_createVNode$1y("div", { + "ref": markerRef, + "class": "v-virtual-scroll__spacer", + "style": { + paddingTop: convertToUnit(paddingTop.value) + } + }, null), children, _createVNode$1y("div", { + "class": "v-virtual-scroll__spacer", + "style": { + paddingBottom: convertToUnit(paddingBottom.value) + } + }, null)]) : _createVNode$1y("div", { + "ref": containerRef, + "class": ['v-virtual-scroll', props.class], + "onScrollPassive": handleScroll, + "onScrollend": handleScrollend, + "style": [dimensionStyles.value, props.style] + }, [_createVNode$1y("div", { + "ref": markerRef, + "class": "v-virtual-scroll__container", + "style": { + paddingTop: convertToUnit(paddingTop.value), + paddingBottom: convertToUnit(paddingBottom.value) + } + }, [children])]); + }); + return { + calculateVisibleItems, + scrollToIndex + }; + } +}); + +// Utilities +const {shallowRef: shallowRef$m,watch: watch$m} = await importShared('vue'); + + +// Types + +function useScrolling(listRef, textFieldRef) { + const isScrolling = shallowRef$m(false); + let scrollTimeout; + function onListScroll(e) { + cancelAnimationFrame(scrollTimeout); + isScrolling.value = true; + scrollTimeout = requestAnimationFrame(() => { + scrollTimeout = requestAnimationFrame(() => { + isScrolling.value = false; + }); + }); + } + async function finishScrolling() { + await new Promise(resolve => requestAnimationFrame(resolve)); + await new Promise(resolve => requestAnimationFrame(resolve)); + await new Promise(resolve => requestAnimationFrame(resolve)); + await new Promise(resolve => { + if (isScrolling.value) { + const stop = watch$m(isScrolling, () => { + stop(); + resolve(); + }); + } else resolve(); + }); + } + async function onListKeydown(e) { + if (e.key === 'Tab') { + textFieldRef.value?.focus(); + } + if (!['PageDown', 'PageUp', 'Home', 'End'].includes(e.key)) return; + const el = listRef.value?.$el; + if (!el) return; + if (e.key === 'Home' || e.key === 'End') { + el.scrollTo({ + top: e.key === 'Home' ? 0 : el.scrollHeight, + behavior: 'smooth' + }); + } + await finishScrolling(); + const children = el.querySelectorAll(':scope > :not(.v-virtual-scroll__spacer)'); + if (e.key === 'PageDown' || e.key === 'Home') { + const top = el.getBoundingClientRect().top; + for (const child of children) { + if (child.getBoundingClientRect().top >= top) { + child.focus(); + break; + } + } + } else { + const bottom = el.getBoundingClientRect().bottom; + for (const child of [...children].reverse()) { + if (child.getBoundingClientRect().bottom <= bottom) { + child.focus(); + break; + } + } + } + } + return { + onScrollPassive: onListScroll, + onKeydown: onListKeydown + }; // typescript doesn't know about vue's event merging +} + +const {createTextVNode:_createTextVNode$6,mergeProps:_mergeProps$K,createVNode:_createVNode$1x,Fragment:_Fragment$q} = await importShared('vue'); +const {computed: computed$19,mergeProps: mergeProps$8,nextTick: nextTick$d,ref: ref$x,shallowRef: shallowRef$l,watch: watch$l} = await importShared('vue'); +const makeSelectProps = propsFactory({ + chips: Boolean, + closableChips: Boolean, + closeText: { + type: String, + default: '$vuetify.close' + }, + openText: { + type: String, + default: '$vuetify.open' + }, + eager: Boolean, + hideNoData: Boolean, + hideSelected: Boolean, + listProps: { + type: Object + }, + menu: Boolean, + menuIcon: { + type: IconValue, + default: '$dropdown' + }, + menuProps: { + type: Object + }, + multiple: Boolean, + noDataText: { + type: String, + default: '$vuetify.noDataText' + }, + openOnClear: Boolean, + itemColor: String, + ...makeItemsProps({ + itemChildren: false + }) +}, 'Select'); +const makeVSelectProps = propsFactory({ + ...makeSelectProps(), + ...omit(makeVTextFieldProps({ + modelValue: null, + role: 'combobox' + }), ['validationValue', 'dirty', 'appendInnerIcon']), + ...makeTransitionProps({ + transition: { + component: VDialogTransition + } + }) +}, 'VSelect'); +const VSelect = genericComponent()({ + name: 'VSelect', + props: makeVSelectProps(), + emits: { + 'update:focused': focused => true, + 'update:modelValue': value => true, + 'update:menu': ue => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + t + } = useLocale(); + const vTextFieldRef = ref$x(); + const vMenuRef = ref$x(); + const vVirtualScrollRef = ref$x(); + const _menu = useProxiedModel(props, 'menu'); + const menu = computed$19({ + get: () => _menu.value, + set: v => { + if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return; + _menu.value = v; + } + }); + const { + items, + transformIn, + transformOut + } = useItems(props); + const model = useProxiedModel(props, 'modelValue', [], v => transformIn(v === null ? [null] : wrapInArray(v)), v => { + const transformed = transformOut(v); + return props.multiple ? transformed : transformed[0] ?? null; + }); + const counterValue = computed$19(() => { + return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : model.value.length; + }); + const form = useForm(); + const selectedValues = computed$19(() => model.value.map(selection => selection.value)); + const isFocused = shallowRef$l(false); + const label = computed$19(() => menu.value ? props.closeText : props.openText); + let keyboardLookupPrefix = ''; + let keyboardLookupLastTime; + const displayItems = computed$19(() => { + if (props.hideSelected) { + return items.value.filter(item => !model.value.some(s => props.valueComparator(s, item))); + } + return items.value; + }); + const menuDisabled = computed$19(() => props.hideNoData && !displayItems.value.length || props.readonly || form?.isReadonly.value); + const computedMenuProps = computed$19(() => { + return { + ...props.menuProps, + activatorProps: { + ...(props.menuProps?.activatorProps || {}), + 'aria-haspopup': 'listbox' // Set aria-haspopup to 'listbox' + } + }; + }); + const listRef = ref$x(); + const listEvents = useScrolling(listRef, vTextFieldRef); + function onClear(e) { + if (props.openOnClear) { + menu.value = true; + } + } + function onMousedownControl() { + if (menuDisabled.value) return; + menu.value = !menu.value; + } + function onListKeydown(e) { + if (checkPrintable(e)) { + onKeydown(e); + } + } + function onKeydown(e) { + if (!e.key || props.readonly || form?.isReadonly.value) return; + if (['Enter', ' ', 'ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key)) { + e.preventDefault(); + } + if (['Enter', 'ArrowDown', ' '].includes(e.key)) { + menu.value = true; + } + if (['Escape', 'Tab'].includes(e.key)) { + menu.value = false; + } + if (e.key === 'Home') { + listRef.value?.focus('first'); + } else if (e.key === 'End') { + listRef.value?.focus('last'); + } + + // html select hotkeys + const KEYBOARD_LOOKUP_THRESHOLD = 1000; // milliseconds + + if (props.multiple || !checkPrintable(e)) return; + const now = performance.now(); + if (now - keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) { + keyboardLookupPrefix = ''; + } + keyboardLookupPrefix += e.key.toLowerCase(); + keyboardLookupLastTime = now; + const item = items.value.find(item => item.title.toLowerCase().startsWith(keyboardLookupPrefix)); + if (item !== undefined) { + model.value = [item]; + const index = displayItems.value.indexOf(item); + IN_BROWSER && window.requestAnimationFrame(() => { + index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index); + }); + } + } + + /** @param set - null means toggle */ + function select(item) { + let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + if (item.props.disabled) return; + if (props.multiple) { + const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value)); + const add = set == null ? !~index : set; + if (~index) { + const value = add ? [...model.value, item] : [...model.value]; + value.splice(index, 1); + model.value = value; + } else if (add) { + model.value = [...model.value, item]; + } + } else { + const add = set !== false; + model.value = add ? [item] : []; + nextTick$d(() => { + menu.value = false; + }); + } + } + function onBlur(e) { + if (!listRef.value?.$el.contains(e.relatedTarget)) { + menu.value = false; + } + } + function onAfterEnter() { + if (props.eager) { + vVirtualScrollRef.value?.calculateVisibleItems(); + } + } + function onAfterLeave() { + if (isFocused.value) { + vTextFieldRef.value?.focus(); + } + } + function onFocusin(e) { + isFocused.value = true; + } + function onModelUpdate(v) { + if (v == null) model.value = [];else if (matchesSelector(vTextFieldRef.value, ':autofill') || matchesSelector(vTextFieldRef.value, ':-webkit-autofill')) { + const item = items.value.find(item => item.title === v); + if (item) { + select(item); + } + } else if (vTextFieldRef.value) { + vTextFieldRef.value.value = ''; + } + } + watch$l(menu, () => { + if (!props.hideSelected && menu.value && model.value.length) { + const index = displayItems.value.findIndex(item => model.value.some(s => props.valueComparator(s.value, item.value))); + IN_BROWSER && window.requestAnimationFrame(() => { + index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index); + }); + } + }); + watch$l(() => props.items, (newVal, oldVal) => { + if (menu.value) return; + if (isFocused.value && !oldVal.length && newVal.length) { + menu.value = true; + } + }); + useRender(() => { + const hasChips = !!(props.chips || slots.chip); + const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']); + const isDirty = model.value.length > 0; + const textFieldProps = VTextField.filterProps(props); + const placeholder = isDirty || !isFocused.value && props.label && !props.persistentPlaceholder ? undefined : props.placeholder; + return _createVNode$1x(VTextField, _mergeProps$K({ + "ref": vTextFieldRef + }, textFieldProps, { + "modelValue": model.value.map(v => v.props.value).join(', '), + "onUpdate:modelValue": onModelUpdate, + "focused": isFocused.value, + "onUpdate:focused": $event => isFocused.value = $event, + "validationValue": model.externalValue, + "counterValue": counterValue.value, + "dirty": isDirty, + "class": ['v-select', { + 'v-select--active-menu': menu.value, + 'v-select--chips': !!props.chips, + [`v-select--${props.multiple ? 'multiple' : 'single'}`]: true, + 'v-select--selected': model.value.length, + 'v-select--selection-slot': !!slots.selection + }, props.class], + "style": props.style, + "inputmode": "none", + "placeholder": placeholder, + "onClick:clear": onClear, + "onMousedown:control": onMousedownControl, + "onBlur": onBlur, + "onKeydown": onKeydown, + "aria-label": t(label.value), + "title": t(label.value) + }), { + ...slots, + default: () => _createVNode$1x(_Fragment$q, null, [_createVNode$1x(VMenu, _mergeProps$K({ + "ref": vMenuRef, + "modelValue": menu.value, + "onUpdate:modelValue": $event => menu.value = $event, + "activator": "parent", + "contentClass": "v-select__content", + "disabled": menuDisabled.value, + "eager": props.eager, + "maxHeight": 310, + "openOnClick": false, + "closeOnContentClick": false, + "transition": props.transition, + "onAfterEnter": onAfterEnter, + "onAfterLeave": onAfterLeave + }, computedMenuProps.value), { + default: () => [hasList && _createVNode$1x(VList, _mergeProps$K({ + "ref": listRef, + "selected": selectedValues.value, + "selectStrategy": props.multiple ? 'independent' : 'single-independent', + "onMousedown": e => e.preventDefault(), + "onKeydown": onListKeydown, + "onFocusin": onFocusin, + "tabindex": "-1", + "aria-live": "polite", + "color": props.itemColor ?? props.color + }, listEvents, props.listProps), { + default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? _createVNode$1x(VListItem, { + "title": t(props.noDataText) + }, null)), _createVNode$1x(VVirtualScroll, { + "ref": vVirtualScrollRef, + "renderless": true, + "items": displayItems.value + }, { + default: _ref2 => { + let { + item, + index, + itemRef + } = _ref2; + const itemProps = mergeProps$8(item.props, { + ref: itemRef, + key: index, + onClick: () => select(item, null) + }); + return slots.item?.({ + item, + index, + props: itemProps + }) ?? _createVNode$1x(VListItem, _mergeProps$K(itemProps, { + "role": "option" + }), { + prepend: _ref3 => { + let { + isSelected + } = _ref3; + return _createVNode$1x(_Fragment$q, null, [props.multiple && !props.hideSelected ? _createVNode$1x(VCheckboxBtn, { + "key": item.value, + "modelValue": isSelected, + "ripple": false, + "tabindex": "-1" + }, null) : undefined, item.props.prependAvatar && _createVNode$1x(VAvatar, { + "image": item.props.prependAvatar + }, null), item.props.prependIcon && _createVNode$1x(VIcon, { + "icon": item.props.prependIcon + }, null)]); + } + }); + } + }), slots['append-item']?.()] + })] + }), model.value.map((item, index) => { + function onChipClose(e) { + e.stopPropagation(); + e.preventDefault(); + select(item, false); + } + const slotProps = { + 'onClick:close': onChipClose, + onKeydown(e) { + if (e.key !== 'Enter' && e.key !== ' ') return; + e.preventDefault(); + e.stopPropagation(); + onChipClose(e); + }, + onMousedown(e) { + e.preventDefault(); + e.stopPropagation(); + }, + modelValue: true, + 'onUpdate:modelValue': undefined + }; + const hasSlot = hasChips ? !!slots.chip : !!slots.selection; + const slotContent = hasSlot ? ensureValidVNode(hasChips ? slots.chip({ + item, + index, + props: slotProps + }) : slots.selection({ + item, + index + })) : undefined; + if (hasSlot && !slotContent) return undefined; + return _createVNode$1x("div", { + "key": item.value, + "class": "v-select__selection" + }, [hasChips ? !slots.chip ? _createVNode$1x(VChip, _mergeProps$K({ + "key": "chip", + "closable": props.closableChips, + "size": "small", + "text": item.title, + "disabled": item.props.disabled + }, slotProps), null) : _createVNode$1x(VDefaultsProvider, { + "key": "chip-defaults", + "defaults": { + VChip: { + closable: props.closableChips, + size: 'small', + text: item.title + } + } + }, { + default: () => [slotContent] + }) : slotContent ?? _createVNode$1x("span", { + "class": "v-select__selection-text" + }, [item.title, props.multiple && index < model.value.length - 1 && _createVNode$1x("span", { + "class": "v-select__selection-comma" + }, [_createTextVNode$6(",")])])]); + })]), + 'append-inner': function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return _createVNode$1x(_Fragment$q, null, [slots['append-inner']?.(...args), props.menuIcon ? _createVNode$1x(VIcon, { + "class": "v-select__menu-icon", + "icon": props.menuIcon + }, null) : undefined]); + } + }); + }); + return forwardRefs({ + isFocused, + menu, + select + }, vTextFieldRef); + } +}); + +/* eslint-disable max-statements */ +/* eslint-disable no-labels */ + +// Utilities +const {computed: computed$18,ref: ref$w,unref,watchEffect: watchEffect$a} = await importShared('vue'); +/** + * - match without highlight + * - single match (index), length already known + * - single match (start, end) + * - multiple matches (start, end), probably shouldn't overlap + */ +// Composables +const defaultFilter = (value, query, item) => { + if (value == null || query == null) return -1; + return value.toString().toLocaleLowerCase().indexOf(query.toString().toLocaleLowerCase()); +}; +const makeFilterProps = propsFactory({ + customFilter: Function, + customKeyFilter: Object, + filterKeys: [Array, String], + filterMode: { + type: String, + default: 'intersection' + }, + noFilter: Boolean +}, 'filter'); +function filterItems(items, query, options) { + const array = []; + // always ensure we fall back to a functioning filter + const filter = options?.default ?? defaultFilter; + const keys = options?.filterKeys ? wrapInArray(options.filterKeys) : false; + const customFiltersLength = Object.keys(options?.customKeyFilter ?? {}).length; + if (!items?.length) return array; + loop: for (let i = 0; i < items.length; i++) { + const [item, transformed = item] = wrapInArray(items[i]); + const customMatches = {}; + const defaultMatches = {}; + let match = -1; + if ((query || customFiltersLength > 0) && !options?.noFilter) { + if (typeof item === 'object') { + const filterKeys = keys || Object.keys(transformed); + for (const key of filterKeys) { + const value = getPropertyFromItem(transformed, key); + const keyFilter = options?.customKeyFilter?.[key]; + match = keyFilter ? keyFilter(value, query, item) : filter(value, query, item); + if (match !== -1 && match !== false) { + if (keyFilter) customMatches[key] = match;else defaultMatches[key] = match; + } else if (options?.filterMode === 'every') { + continue loop; + } + } + } else { + match = filter(item, query, item); + if (match !== -1 && match !== false) { + defaultMatches.title = match; + } + } + const defaultMatchesLength = Object.keys(defaultMatches).length; + const customMatchesLength = Object.keys(customMatches).length; + if (!defaultMatchesLength && !customMatchesLength) continue; + if (options?.filterMode === 'union' && customMatchesLength !== customFiltersLength && !defaultMatchesLength) continue; + if (options?.filterMode === 'intersection' && (customMatchesLength !== customFiltersLength || !defaultMatchesLength)) continue; + } + array.push({ + index: i, + matches: { + ...defaultMatches, + ...customMatches + } + }); + } + return array; +} +function useFilter(props, items, query, options) { + const filteredItems = ref$w([]); + const filteredMatches = ref$w(new Map()); + const transformedItems = computed$18(() => options?.transform ? unref(items).map(item => [item, options.transform(item)]) : unref(items)); + watchEffect$a(() => { + const _query = typeof query === 'function' ? query() : unref(query); + const strQuery = typeof _query !== 'string' && typeof _query !== 'number' ? '' : String(_query); + const results = filterItems(transformedItems.value, strQuery, { + customKeyFilter: { + ...props.customKeyFilter, + ...unref(options?.customKeyFilter) + }, + default: props.customFilter, + filterKeys: props.filterKeys, + filterMode: props.filterMode, + noFilter: props.noFilter + }); + const originalItems = unref(items); + const _filteredItems = []; + const _filteredMatches = new Map(); + results.forEach(_ref => { + let { + index, + matches + } = _ref; + const item = originalItems[index]; + _filteredItems.push(item); + _filteredMatches.set(item.value, matches); + }); + filteredItems.value = _filteredItems; + filteredMatches.value = _filteredMatches; + }); + function getMatches(item) { + return filteredMatches.value.get(item.value); + } + return { + filteredItems, + filteredMatches, + getMatches + }; +} + +const {createTextVNode:_createTextVNode$5,mergeProps:_mergeProps$J,createVNode:_createVNode$1w,Fragment:_Fragment$p} = await importShared('vue'); +const {computed: computed$17,mergeProps: mergeProps$7,nextTick: nextTick$c,ref: ref$v,shallowRef: shallowRef$k,watch: watch$k} = await importShared('vue'); +function highlightResult$1(text, matches, length) { + if (matches == null) return text; + if (Array.isArray(matches)) throw new Error('Multiple matches is not implemented'); + return typeof matches === 'number' && ~matches ? _createVNode$1w(_Fragment$p, null, [_createVNode$1w("span", { + "class": "v-autocomplete__unmask" + }, [text.substr(0, matches)]), _createVNode$1w("span", { + "class": "v-autocomplete__mask" + }, [text.substr(matches, length)]), _createVNode$1w("span", { + "class": "v-autocomplete__unmask" + }, [text.substr(matches + length)])]) : text; +} +const makeVAutocompleteProps = propsFactory({ + autoSelectFirst: { + type: [Boolean, String] + }, + clearOnSelect: Boolean, + search: String, + ...makeFilterProps({ + filterKeys: ['title'] + }), + ...makeSelectProps(), + ...omit(makeVTextFieldProps({ + modelValue: null, + role: 'combobox' + }), ['validationValue', 'dirty', 'appendInnerIcon']), + ...makeTransitionProps({ + transition: false + }) +}, 'VAutocomplete'); +const VAutocomplete = genericComponent()({ + name: 'VAutocomplete', + props: makeVAutocompleteProps(), + emits: { + 'update:focused': focused => true, + 'update:search': value => true, + 'update:modelValue': value => true, + 'update:menu': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + t + } = useLocale(); + const vTextFieldRef = ref$v(); + const isFocused = shallowRef$k(false); + const isPristine = shallowRef$k(true); + const listHasFocus = shallowRef$k(false); + const vMenuRef = ref$v(); + const vVirtualScrollRef = ref$v(); + const _menu = useProxiedModel(props, 'menu'); + const menu = computed$17({ + get: () => _menu.value, + set: v => { + if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return; + _menu.value = v; + } + }); + const selectionIndex = shallowRef$k(-1); + const color = computed$17(() => vTextFieldRef.value?.color); + const label = computed$17(() => menu.value ? props.closeText : props.openText); + const { + items, + transformIn, + transformOut + } = useItems(props); + const { + textColorClasses, + textColorStyles + } = useTextColor(color); + const search = useProxiedModel(props, 'search', ''); + const model = useProxiedModel(props, 'modelValue', [], v => transformIn(v === null ? [null] : wrapInArray(v)), v => { + const transformed = transformOut(v); + return props.multiple ? transformed : transformed[0] ?? null; + }); + const counterValue = computed$17(() => { + return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : model.value.length; + }); + const form = useForm(); + const { + filteredItems, + getMatches + } = useFilter(props, items, () => isPristine.value ? '' : search.value); + const displayItems = computed$17(() => { + if (props.hideSelected) { + return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value)); + } + return filteredItems.value; + }); + const hasChips = computed$17(() => !!(props.chips || slots.chip)); + const hasSelectionSlot = computed$17(() => hasChips.value || !!slots.selection); + const selectedValues = computed$17(() => model.value.map(selection => selection.props.value)); + const highlightFirst = computed$17(() => { + const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title; + return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value; + }); + const menuDisabled = computed$17(() => props.hideNoData && !displayItems.value.length || props.readonly || form?.isReadonly.value); + const listRef = ref$v(); + const listEvents = useScrolling(listRef, vTextFieldRef); + function onClear(e) { + if (props.openOnClear) { + menu.value = true; + } + search.value = ''; + } + function onMousedownControl() { + if (menuDisabled.value) return; + menu.value = true; + } + function onMousedownMenuIcon(e) { + if (menuDisabled.value) return; + if (isFocused.value) { + e.preventDefault(); + e.stopPropagation(); + } + menu.value = !menu.value; + } + function onListKeydown(e) { + if (checkPrintable(e)) { + vTextFieldRef.value?.focus(); + } + } + function onKeydown(e) { + if (props.readonly || form?.isReadonly.value) return; + const selectionStart = vTextFieldRef.value.selectionStart; + const length = model.value.length; + if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) { + e.preventDefault(); + } + if (['Enter', 'ArrowDown'].includes(e.key)) { + menu.value = true; + } + if (['Escape'].includes(e.key)) { + menu.value = false; + } + if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => { + let { + value + } = _ref2; + return value === displayItems.value[0].value; + })) { + select(displayItems.value[0]); + } + if (e.key === 'ArrowDown' && highlightFirst.value) { + listRef.value?.focus('next'); + } + if (['Backspace', 'Delete'].includes(e.key)) { + if (!props.multiple && hasSelectionSlot.value && model.value.length > 0 && !search.value) return select(model.value[0], false); + if (~selectionIndex.value) { + const originalSelectionIndex = selectionIndex.value; + select(model.value[selectionIndex.value], false); + selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex; + } else if (e.key === 'Backspace' && !search.value) { + selectionIndex.value = length - 1; + } + } + if (!props.multiple) return; + if (e.key === 'ArrowLeft') { + if (selectionIndex.value < 0 && selectionStart > 0) return; + const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1; + if (model.value[prev]) { + selectionIndex.value = prev; + } else { + selectionIndex.value = -1; + vTextFieldRef.value.setSelectionRange(search.value?.length, search.value?.length); + } + } + if (e.key === 'ArrowRight') { + if (selectionIndex.value < 0) return; + const next = selectionIndex.value + 1; + if (model.value[next]) { + selectionIndex.value = next; + } else { + selectionIndex.value = -1; + vTextFieldRef.value.setSelectionRange(0, 0); + } + } + } + function onChange(e) { + if (matchesSelector(vTextFieldRef.value, ':autofill') || matchesSelector(vTextFieldRef.value, ':-webkit-autofill')) { + const item = items.value.find(item => item.title === e.target.value); + if (item) { + select(item); + } + } + } + function onAfterEnter() { + if (props.eager) { + vVirtualScrollRef.value?.calculateVisibleItems(); + } + } + function onAfterLeave() { + if (isFocused.value) { + isPristine.value = true; + vTextFieldRef.value?.focus(); + } + } + function onFocusin(e) { + isFocused.value = true; + setTimeout(() => { + listHasFocus.value = true; + }); + } + function onFocusout(e) { + listHasFocus.value = false; + } + function onUpdateModelValue(v) { + if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = []; + } + const isSelecting = shallowRef$k(false); + + /** @param set - null means toggle */ + function select(item) { + let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + if (!item || item.props.disabled) return; + if (props.multiple) { + const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value)); + const add = set == null ? !~index : set; + if (~index) { + const value = add ? [...model.value, item] : [...model.value]; + value.splice(index, 1); + model.value = value; + } else if (add) { + model.value = [...model.value, item]; + } + if (props.clearOnSelect) { + search.value = ''; + } + } else { + const add = set !== false; + model.value = add ? [item] : []; + search.value = add && !hasSelectionSlot.value ? item.title : ''; + + // watch for search watcher to trigger + nextTick$c(() => { + menu.value = false; + isPristine.value = true; + }); + } + } + watch$k(isFocused, (val, oldVal) => { + if (val === oldVal) return; + if (val) { + isSelecting.value = true; + search.value = props.multiple || hasSelectionSlot.value ? '' : String(model.value.at(-1)?.props.title ?? ''); + isPristine.value = true; + nextTick$c(() => isSelecting.value = false); + } else { + if (!props.multiple && search.value == null) model.value = []; + menu.value = false; + if (!model.value.some(_ref3 => { + let { + title + } = _ref3; + return title === search.value; + })) search.value = ''; + selectionIndex.value = -1; + } + }); + watch$k(search, val => { + if (!isFocused.value || isSelecting.value) return; + if (val) menu.value = true; + isPristine.value = !val; + }); + watch$k(menu, () => { + if (!props.hideSelected && menu.value && model.value.length) { + const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value)); + IN_BROWSER && window.requestAnimationFrame(() => { + index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index); + }); + } + }); + watch$k(() => props.items, (newVal, oldVal) => { + if (menu.value) return; + if (isFocused.value && !oldVal.length && newVal.length) { + menu.value = true; + } + }); + useRender(() => { + const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']); + const isDirty = model.value.length > 0; + const textFieldProps = VTextField.filterProps(props); + return _createVNode$1w(VTextField, _mergeProps$J({ + "ref": vTextFieldRef + }, textFieldProps, { + "modelValue": search.value, + "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue], + "focused": isFocused.value, + "onUpdate:focused": $event => isFocused.value = $event, + "validationValue": model.externalValue, + "counterValue": counterValue.value, + "dirty": isDirty, + "onChange": onChange, + "class": ['v-autocomplete', `v-autocomplete--${props.multiple ? 'multiple' : 'single'}`, { + 'v-autocomplete--active-menu': menu.value, + 'v-autocomplete--chips': !!props.chips, + 'v-autocomplete--selection-slot': !!hasSelectionSlot.value, + 'v-autocomplete--selecting-index': selectionIndex.value > -1 + }, props.class], + "style": props.style, + "readonly": props.readonly, + "placeholder": isDirty ? undefined : props.placeholder, + "onClick:clear": onClear, + "onMousedown:control": onMousedownControl, + "onKeydown": onKeydown + }), { + ...slots, + default: () => _createVNode$1w(_Fragment$p, null, [_createVNode$1w(VMenu, _mergeProps$J({ + "ref": vMenuRef, + "modelValue": menu.value, + "onUpdate:modelValue": $event => menu.value = $event, + "activator": "parent", + "contentClass": "v-autocomplete__content", + "disabled": menuDisabled.value, + "eager": props.eager, + "maxHeight": 310, + "openOnClick": false, + "closeOnContentClick": false, + "transition": props.transition, + "onAfterEnter": onAfterEnter, + "onAfterLeave": onAfterLeave + }, props.menuProps), { + default: () => [hasList && _createVNode$1w(VList, _mergeProps$J({ + "ref": listRef, + "selected": selectedValues.value, + "selectStrategy": props.multiple ? 'independent' : 'single-independent', + "onMousedown": e => e.preventDefault(), + "onKeydown": onListKeydown, + "onFocusin": onFocusin, + "onFocusout": onFocusout, + "tabindex": "-1", + "aria-live": "polite", + "color": props.itemColor ?? props.color + }, listEvents, props.listProps), { + default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? _createVNode$1w(VListItem, { + "title": t(props.noDataText) + }, null)), _createVNode$1w(VVirtualScroll, { + "ref": vVirtualScrollRef, + "renderless": true, + "items": displayItems.value + }, { + default: _ref4 => { + let { + item, + index, + itemRef + } = _ref4; + const itemProps = mergeProps$7(item.props, { + ref: itemRef, + key: index, + active: highlightFirst.value && index === 0 ? true : undefined, + onClick: () => select(item, null) + }); + return slots.item?.({ + item, + index, + props: itemProps + }) ?? _createVNode$1w(VListItem, _mergeProps$J(itemProps, { + "role": "option" + }), { + prepend: _ref5 => { + let { + isSelected + } = _ref5; + return _createVNode$1w(_Fragment$p, null, [props.multiple && !props.hideSelected ? _createVNode$1w(VCheckboxBtn, { + "key": item.value, + "modelValue": isSelected, + "ripple": false, + "tabindex": "-1" + }, null) : undefined, item.props.prependAvatar && _createVNode$1w(VAvatar, { + "image": item.props.prependAvatar + }, null), item.props.prependIcon && _createVNode$1w(VIcon, { + "icon": item.props.prependIcon + }, null)]); + }, + title: () => { + return isPristine.value ? item.title : highlightResult$1(item.title, getMatches(item)?.title, search.value?.length ?? 0); + } + }); + } + }), slots['append-item']?.()] + })] + }), model.value.map((item, index) => { + function onChipClose(e) { + e.stopPropagation(); + e.preventDefault(); + select(item, false); + } + const slotProps = { + 'onClick:close': onChipClose, + onKeydown(e) { + if (e.key !== 'Enter' && e.key !== ' ') return; + e.preventDefault(); + e.stopPropagation(); + onChipClose(e); + }, + onMousedown(e) { + e.preventDefault(); + e.stopPropagation(); + }, + modelValue: true, + 'onUpdate:modelValue': undefined + }; + const hasSlot = hasChips.value ? !!slots.chip : !!slots.selection; + const slotContent = hasSlot ? ensureValidVNode(hasChips.value ? slots.chip({ + item, + index, + props: slotProps + }) : slots.selection({ + item, + index + })) : undefined; + if (hasSlot && !slotContent) return undefined; + return _createVNode$1w("div", { + "key": item.value, + "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]], + "style": index === selectionIndex.value ? textColorStyles.value : {} + }, [hasChips.value ? !slots.chip ? _createVNode$1w(VChip, _mergeProps$J({ + "key": "chip", + "closable": props.closableChips, + "size": "small", + "text": item.title, + "disabled": item.props.disabled + }, slotProps), null) : _createVNode$1w(VDefaultsProvider, { + "key": "chip-defaults", + "defaults": { + VChip: { + closable: props.closableChips, + size: 'small', + text: item.title + } + } + }, { + default: () => [slotContent] + }) : slotContent ?? _createVNode$1w("span", { + "class": "v-autocomplete__selection-text" + }, [item.title, props.multiple && index < model.value.length - 1 && _createVNode$1w("span", { + "class": "v-autocomplete__selection-comma" + }, [_createTextVNode$5(",")])])]); + })]), + 'append-inner': function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return _createVNode$1w(_Fragment$p, null, [slots['append-inner']?.(...args), props.menuIcon ? _createVNode$1w(VIcon, { + "class": "v-autocomplete__menu-icon", + "icon": props.menuIcon, + "onMousedown": onMousedownMenuIcon, + "onClick": noop, + "aria-label": t(label.value), + "title": t(label.value), + "tabindex": "-1" + }, null) : undefined]); + } + }); + }); + return forwardRefs({ + isFocused, + isPristine, + menu, + search, + filteredItems, + select + }, vTextFieldRef); + } +}); + +const {withDirectives:_withDirectives$a,mergeProps:_mergeProps$I,vShow:_vShow$4,createVNode:_createVNode$1v} = await importShared('vue'); +const {toRef: toRef$q} = await importShared('vue'); +const makeVBadgeProps = propsFactory({ + bordered: Boolean, + color: String, + content: [Number, String], + dot: Boolean, + floating: Boolean, + icon: IconValue, + inline: Boolean, + label: { + type: String, + default: '$vuetify.badge' + }, + max: [Number, String], + modelValue: { + type: Boolean, + default: true + }, + offsetX: [Number, String], + offsetY: [Number, String], + textColor: String, + ...makeComponentProps(), + ...makeLocationProps({ + location: 'top end' + }), + ...makeRoundedProps(), + ...makeTagProps(), + ...makeThemeProps(), + ...makeTransitionProps({ + transition: 'scale-rotate-transition' + }) +}, 'VBadge'); +const VBadge = genericComponent()({ + name: 'VBadge', + inheritAttrs: false, + props: makeVBadgeProps(), + setup(props, ctx) { + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$q(props, 'color')); + const { + roundedClasses + } = useRounded(props); + const { + t + } = useLocale(); + const { + textColorClasses, + textColorStyles + } = useTextColor(toRef$q(props, 'textColor')); + const { + themeClasses + } = useTheme(); + const { + locationStyles + } = useLocation(props, true, side => { + const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12; + return base + (['top', 'bottom'].includes(side) ? +(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? +(props.offsetX ?? 0) : 0); + }); + useRender(() => { + const value = Number(props.content); + const content = !props.max || isNaN(value) ? props.content : value <= +props.max ? value : `${props.max}+`; + const [badgeAttrs, attrs] = pickWithRest(ctx.attrs, ['aria-atomic', 'aria-label', 'aria-live', 'role', 'title']); + return _createVNode$1v(props.tag, _mergeProps$I({ + "class": ['v-badge', { + 'v-badge--bordered': props.bordered, + 'v-badge--dot': props.dot, + 'v-badge--floating': props.floating, + 'v-badge--inline': props.inline + }, props.class] + }, attrs, { + "style": props.style + }), { + default: () => [_createVNode$1v("div", { + "class": "v-badge__wrapper" + }, [ctx.slots.default?.(), _createVNode$1v(MaybeTransition, { + "transition": props.transition + }, { + default: () => [_withDirectives$a(_createVNode$1v("span", _mergeProps$I({ + "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value], + "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value], + "aria-atomic": "true", + "aria-label": t(props.label, value), + "aria-live": "polite", + "role": "status" + }, badgeAttrs), [props.dot ? undefined : ctx.slots.badge ? ctx.slots.badge?.() : props.icon ? _createVNode$1v(VIcon, { + "icon": props.icon + }, null) : content]), [[_vShow$4, props.modelValue]])] + })])] + }); + }); + return {}; + } +}); + +const {createVNode:_createVNode$1u} = await importShared('vue'); +const makeVBannerActionsProps = propsFactory({ + color: String, + density: String, + ...makeComponentProps() +}, 'VBannerActions'); +const VBannerActions = genericComponent()({ + name: 'VBannerActions', + props: makeVBannerActionsProps(), + setup(props, _ref) { + let { + slots + } = _ref; + provideDefaults({ + VBtn: { + color: props.color, + density: props.density, + slim: true, + variant: 'text' + } + }); + useRender(() => _createVNode$1u("div", { + "class": ['v-banner-actions', props.class], + "style": props.style + }, [slots.default?.()])); + return {}; + } +}); + +// Utilities +const VBannerText = createSimpleFunctional('v-banner-text'); + +const {resolveDirective:_resolveDirective$E,createVNode:_createVNode$1t} = await importShared('vue'); +const {toRef: toRef$p} = await importShared('vue'); +const makeVBannerProps = propsFactory({ + avatar: String, + bgColor: String, + color: String, + icon: IconValue, + lines: String, + stacked: Boolean, + sticky: Boolean, + text: String, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeDimensionProps(), + ...makeDisplayProps({ + mobile: null + }), + ...makeElevationProps(), + ...makeLocationProps(), + ...makePositionProps(), + ...makeRoundedProps(), + ...makeTagProps(), + ...makeThemeProps() +}, 'VBanner'); +const VBanner = genericComponent()({ + name: 'VBanner', + props: makeVBannerProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(props, 'bgColor'); + const { + borderClasses + } = useBorder(props); + const { + densityClasses + } = useDensity(props); + const { + displayClasses, + mobile + } = useDisplay(props); + const { + dimensionStyles + } = useDimension(props); + const { + elevationClasses + } = useElevation(props); + const { + locationStyles + } = useLocation(props); + const { + positionClasses + } = usePosition(props); + const { + roundedClasses + } = useRounded(props); + const { + themeClasses + } = provideTheme(props); + const color = toRef$p(props, 'color'); + const density = toRef$p(props, 'density'); + provideDefaults({ + VBannerActions: { + color, + density + } + }); + useRender(() => { + const hasText = !!(props.text || slots.text); + const hasPrependMedia = !!(props.avatar || props.icon); + const hasPrepend = !!(hasPrependMedia || slots.prepend); + return _createVNode$1t(props.tag, { + "class": ['v-banner', { + 'v-banner--stacked': props.stacked || mobile.value, + 'v-banner--sticky': props.sticky, + [`v-banner--${props.lines}-line`]: !!props.lines + }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, displayClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, props.class], + "style": [backgroundColorStyles.value, dimensionStyles.value, locationStyles.value, props.style], + "role": "banner" + }, { + default: () => [hasPrepend && _createVNode$1t("div", { + "key": "prepend", + "class": "v-banner__prepend" + }, [!slots.prepend ? _createVNode$1t(VAvatar, { + "key": "prepend-avatar", + "color": color.value, + "density": density.value, + "icon": props.icon, + "image": props.avatar + }, null) : _createVNode$1t(VDefaultsProvider, { + "key": "prepend-defaults", + "disabled": !hasPrependMedia, + "defaults": { + VAvatar: { + color: color.value, + density: density.value, + icon: props.icon, + image: props.avatar + } + } + }, slots.prepend)]), _createVNode$1t("div", { + "class": "v-banner__content" + }, [hasText && _createVNode$1t(VBannerText, { + "key": "text" + }, { + default: () => [slots.text?.() ?? props.text] + }), slots.default?.()]), slots.actions && _createVNode$1t(VBannerActions, { + "key": "actions" + }, slots.actions)] + }); + }); + } +}); + +const {createVNode:_createVNode$1s} = await importShared('vue'); +const {computed: computed$16,toRef: toRef$o} = await importShared('vue'); +const makeVBottomNavigationProps = propsFactory({ + baseColor: String, + bgColor: String, + color: String, + grow: Boolean, + mode: { + type: String, + validator: v => !v || ['horizontal', 'shift'].includes(v) + }, + height: { + type: [Number, String], + default: 56 + }, + active: { + type: Boolean, + default: true + }, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeElevationProps(), + ...makeRoundedProps(), + ...makeLayoutItemProps({ + name: 'bottom-navigation' + }), + ...makeTagProps({ + tag: 'header' + }), + ...makeGroupProps({ + selectedClass: 'v-btn--selected' + }), + ...makeThemeProps() +}, 'VBottomNavigation'); +const VBottomNavigation = genericComponent()({ + name: 'VBottomNavigation', + props: makeVBottomNavigationProps(), + emits: { + 'update:active': value => true, + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = useTheme(); + const { + borderClasses + } = useBorder(props); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$o(props, 'bgColor')); + const { + densityClasses + } = useDensity(props); + const { + elevationClasses + } = useElevation(props); + const { + roundedClasses + } = useRounded(props); + const { + ssrBootStyles + } = useSsrBoot(); + const height = computed$16(() => Number(props.height) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0)); + const isActive = useProxiedModel(props, 'active', props.active); + const { + layoutItemStyles + } = useLayoutItem({ + id: props.name, + order: computed$16(() => parseInt(props.order, 10)), + position: computed$16(() => 'bottom'), + layoutSize: computed$16(() => isActive.value ? height.value : 0), + elementSize: height, + active: isActive, + absolute: toRef$o(props, 'absolute') + }); + useGroup(props, VBtnToggleSymbol); + provideDefaults({ + VBtn: { + baseColor: toRef$o(props, 'baseColor'), + color: toRef$o(props, 'color'), + density: toRef$o(props, 'density'), + stacked: computed$16(() => props.mode !== 'horizontal'), + variant: 'text' + } + }, { + scoped: true + }); + useRender(() => { + return _createVNode$1s(props.tag, { + "class": ['v-bottom-navigation', { + 'v-bottom-navigation--active': isActive.value, + 'v-bottom-navigation--grow': props.grow, + 'v-bottom-navigation--shift': props.mode === 'shift' + }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class], + "style": [backgroundColorStyles.value, layoutItemStyles.value, { + height: convertToUnit(height.value) + }, ssrBootStyles.value, props.style] + }, { + default: () => [slots.default && _createVNode$1s("div", { + "class": "v-bottom-navigation__content" + }, [slots.default()])] + }); + }); + return {}; + } +}); + +const {mergeProps:_mergeProps$H,createVNode:_createVNode$1r} = await importShared('vue'); +const {mergeProps: mergeProps$6,nextTick: nextTick$b,ref: ref$u,watch: watch$j} = await importShared('vue'); +const makeVDialogProps = propsFactory({ + fullscreen: Boolean, + retainFocus: { + type: Boolean, + default: true + }, + scrollable: Boolean, + ...makeVOverlayProps({ + origin: 'center center', + scrollStrategy: 'block', + transition: { + component: VDialogTransition + }, + zIndex: 2400 + }) +}, 'VDialog'); +const VDialog = genericComponent()({ + name: 'VDialog', + props: makeVDialogProps(), + emits: { + 'update:modelValue': value => true, + afterEnter: () => true, + afterLeave: () => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const isActive = useProxiedModel(props, 'modelValue'); + const { + scopeId + } = useScopeId(); + const overlay = ref$u(); + function onFocusin(e) { + const before = e.relatedTarget; + const after = e.target; + if (before !== after && overlay.value?.contentEl && + // We're the topmost dialog + overlay.value?.globalTop && + // It isn't the document or the dialog body + ![document, overlay.value.contentEl].includes(after) && + // It isn't inside the dialog body + !overlay.value.contentEl.contains(after)) { + const focusable = focusableChildren(overlay.value.contentEl); + if (!focusable.length) return; + const firstElement = focusable[0]; + const lastElement = focusable[focusable.length - 1]; + if (before === firstElement) { + lastElement.focus(); + } else { + firstElement.focus(); + } + } + } + if (IN_BROWSER) { + watch$j(() => isActive.value && props.retainFocus, val => { + val ? document.addEventListener('focusin', onFocusin) : document.removeEventListener('focusin', onFocusin); + }, { + immediate: true + }); + } + function onAfterEnter() { + emit('afterEnter'); + if (overlay.value?.contentEl && !overlay.value.contentEl.contains(document.activeElement)) { + overlay.value.contentEl.focus({ + preventScroll: true + }); + } + } + function onAfterLeave() { + emit('afterLeave'); + } + watch$j(isActive, async val => { + if (!val) { + await nextTick$b(); + overlay.value.activatorEl?.focus({ + preventScroll: true + }); + } + }); + useRender(() => { + const overlayProps = VOverlay.filterProps(props); + const activatorProps = mergeProps$6({ + 'aria-haspopup': 'dialog' + }, props.activatorProps); + const contentProps = mergeProps$6({ + tabindex: -1 + }, props.contentProps); + return _createVNode$1r(VOverlay, _mergeProps$H({ + "ref": overlay, + "class": ['v-dialog', { + 'v-dialog--fullscreen': props.fullscreen, + 'v-dialog--scrollable': props.scrollable + }, props.class], + "style": props.style + }, overlayProps, { + "modelValue": isActive.value, + "onUpdate:modelValue": $event => isActive.value = $event, + "aria-modal": "true", + "activatorProps": activatorProps, + "contentProps": contentProps, + "role": "dialog", + "onAfterEnter": onAfterEnter, + "onAfterLeave": onAfterLeave + }, scopeId), { + activator: slots.activator, + default: function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return _createVNode$1r(VDefaultsProvider, { + "root": "VDialog" + }, { + default: () => [slots.default?.(...args)] + }); + } + }); + }); + return forwardRefs({}, overlay); + } +}); + +const {createVNode:_createVNode$1q,mergeProps:_mergeProps$G,resolveDirective:_resolveDirective$D} = await importShared('vue'); +const makeVBottomSheetProps = propsFactory({ + inset: Boolean, + ...makeVDialogProps({ + transition: 'bottom-sheet-transition' + }) +}, 'VBottomSheet'); +const VBottomSheet = genericComponent()({ + name: 'VBottomSheet', + props: makeVBottomSheetProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const isActive = useProxiedModel(props, 'modelValue'); + useRender(() => { + const dialogProps = VDialog.filterProps(props); + return _createVNode$1q(VDialog, _mergeProps$G(dialogProps, { + "contentClass": ['v-bottom-sheet__content', props.contentClass], + "modelValue": isActive.value, + "onUpdate:modelValue": $event => isActive.value = $event, + "class": ['v-bottom-sheet', { + 'v-bottom-sheet--inset': props.inset + }, props.class], + "style": props.style + }), slots); + }); + return {}; + } +}); + +const {createVNode:_createVNode$1p} = await importShared('vue'); +const makeVBreadcrumbsDividerProps = propsFactory({ + divider: [Number, String], + ...makeComponentProps() +}, 'VBreadcrumbsDivider'); +const VBreadcrumbsDivider = genericComponent()({ + name: 'VBreadcrumbsDivider', + props: makeVBreadcrumbsDividerProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => _createVNode$1p("li", { + "class": ['v-breadcrumbs-divider', props.class], + "style": props.style + }, [slots?.default?.() ?? props.divider])); + return {}; + } +}); + +const {createVNode:_createVNode$1o,mergeProps:_mergeProps$F} = await importShared('vue'); +const {computed: computed$15} = await importShared('vue'); +const makeVBreadcrumbsItemProps = propsFactory({ + active: Boolean, + activeClass: String, + activeColor: String, + color: String, + disabled: Boolean, + title: String, + ...makeComponentProps(), + ...makeRouterProps(), + ...makeTagProps({ + tag: 'li' + }) +}, 'VBreadcrumbsItem'); +const VBreadcrumbsItem = genericComponent()({ + name: 'VBreadcrumbsItem', + props: makeVBreadcrumbsItemProps(), + setup(props, _ref) { + let { + slots, + attrs + } = _ref; + const link = useLink(props, attrs); + const isActive = computed$15(() => props.active || link.isActive?.value); + const color = computed$15(() => isActive.value ? props.activeColor : props.color); + const { + textColorClasses, + textColorStyles + } = useTextColor(color); + useRender(() => { + return _createVNode$1o(props.tag, { + "class": ['v-breadcrumbs-item', { + 'v-breadcrumbs-item--active': isActive.value, + 'v-breadcrumbs-item--disabled': props.disabled, + [`${props.activeClass}`]: isActive.value && props.activeClass + }, textColorClasses.value, props.class], + "style": [textColorStyles.value, props.style], + "aria-current": isActive.value ? 'page' : undefined + }, { + default: () => [!link.isLink.value ? slots.default?.() ?? props.title : _createVNode$1o("a", _mergeProps$F({ + "class": "v-breadcrumbs-item--link", + "onClick": link.navigate + }, link.linkProps), [slots.default?.() ?? props.title])] + }); + }); + return {}; + } +}); + +const {mergeProps:_mergeProps$E,Fragment:_Fragment$o,resolveDirective:_resolveDirective$C,createVNode:_createVNode$1n} = await importShared('vue'); +const {computed: computed$14,toRef: toRef$n} = await importShared('vue'); +const makeVBreadcrumbsProps = propsFactory({ + activeClass: String, + activeColor: String, + bgColor: String, + color: String, + disabled: Boolean, + divider: { + type: String, + default: '/' + }, + icon: IconValue, + items: { + type: Array, + default: () => [] + }, + ...makeComponentProps(), + ...makeDensityProps(), + ...makeRoundedProps(), + ...makeTagProps({ + tag: 'ul' + }) +}, 'VBreadcrumbs'); +const VBreadcrumbs = genericComponent()({ + name: 'VBreadcrumbs', + props: makeVBreadcrumbsProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$n(props, 'bgColor')); + const { + densityClasses + } = useDensity(props); + const { + roundedClasses + } = useRounded(props); + provideDefaults({ + VBreadcrumbsDivider: { + divider: toRef$n(props, 'divider') + }, + VBreadcrumbsItem: { + activeClass: toRef$n(props, 'activeClass'), + activeColor: toRef$n(props, 'activeColor'), + color: toRef$n(props, 'color'), + disabled: toRef$n(props, 'disabled') + } + }); + const items = computed$14(() => props.items.map(item => { + return typeof item === 'string' ? { + item: { + title: item + }, + raw: item + } : { + item, + raw: item + }; + })); + useRender(() => { + const hasPrepend = !!(slots.prepend || props.icon); + return _createVNode$1n(props.tag, { + "class": ['v-breadcrumbs', backgroundColorClasses.value, densityClasses.value, roundedClasses.value, props.class], + "style": [backgroundColorStyles.value, props.style] + }, { + default: () => [hasPrepend && _createVNode$1n("li", { + "key": "prepend", + "class": "v-breadcrumbs__prepend" + }, [!slots.prepend ? _createVNode$1n(VIcon, { + "key": "prepend-icon", + "start": true, + "icon": props.icon + }, null) : _createVNode$1n(VDefaultsProvider, { + "key": "prepend-defaults", + "disabled": !props.icon, + "defaults": { + VIcon: { + icon: props.icon, + start: true + } + } + }, slots.prepend)]), items.value.map((_ref2, index, array) => { + let { + item, + raw + } = _ref2; + return _createVNode$1n(_Fragment$o, null, [slots.item?.({ + item, + index + }) ?? _createVNode$1n(VBreadcrumbsItem, _mergeProps$E({ + "key": index, + "disabled": index >= array.length - 1 + }, typeof item === 'string' ? { + title: item + } : item), { + default: slots.title ? () => slots.title?.({ + item, + index + }) : undefined + }), index < array.length - 1 && _createVNode$1n(VBreadcrumbsDivider, null, { + default: slots.divider ? () => slots.divider?.({ + item: raw, + index + }) : undefined + })]); + }), slots.default?.()] + }); + }); + return {}; + } +}); + +const {createVNode:_createVNode$1m} = await importShared('vue'); +const VCardActions = genericComponent()({ + name: 'VCardActions', + props: makeComponentProps(), + setup(props, _ref) { + let { + slots + } = _ref; + provideDefaults({ + VBtn: { + slim: true, + variant: 'text' + } + }); + useRender(() => _createVNode$1m("div", { + "class": ['v-card-actions', props.class], + "style": props.style + }, [slots.default?.()])); + return {}; + } +}); + +const {createVNode:_createVNode$1l,resolveDirective:_resolveDirective$B} = await importShared('vue'); +const makeVCardSubtitleProps = propsFactory({ + opacity: [Number, String], + ...makeComponentProps(), + ...makeTagProps() +}, 'VCardSubtitle'); +const VCardSubtitle = genericComponent()({ + name: 'VCardSubtitle', + props: makeVCardSubtitleProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => _createVNode$1l(props.tag, { + "class": ['v-card-subtitle', props.class], + "style": [{ + '--v-card-subtitle-opacity': props.opacity + }, props.style] + }, slots)); + return {}; + } +}); + +// Utilities +const VCardTitle = createSimpleFunctional('v-card-title'); + +const {resolveDirective:_resolveDirective$A,createVNode:_createVNode$1k,Fragment:_Fragment$n} = await importShared('vue'); +const makeCardItemProps = propsFactory({ + appendAvatar: String, + appendIcon: IconValue, + prependAvatar: String, + prependIcon: IconValue, + subtitle: [String, Number], + title: [String, Number], + ...makeComponentProps(), + ...makeDensityProps() +}, 'VCardItem'); +const VCardItem = genericComponent()({ + name: 'VCardItem', + props: makeCardItemProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => { + const hasPrependMedia = !!(props.prependAvatar || props.prependIcon); + const hasPrepend = !!(hasPrependMedia || slots.prepend); + const hasAppendMedia = !!(props.appendAvatar || props.appendIcon); + const hasAppend = !!(hasAppendMedia || slots.append); + const hasTitle = !!(props.title != null || slots.title); + const hasSubtitle = !!(props.subtitle != null || slots.subtitle); + return _createVNode$1k("div", { + "class": ['v-card-item', props.class], + "style": props.style + }, [hasPrepend && _createVNode$1k("div", { + "key": "prepend", + "class": "v-card-item__prepend" + }, [!slots.prepend ? _createVNode$1k(_Fragment$n, null, [props.prependAvatar && _createVNode$1k(VAvatar, { + "key": "prepend-avatar", + "density": props.density, + "image": props.prependAvatar + }, null), props.prependIcon && _createVNode$1k(VIcon, { + "key": "prepend-icon", + "density": props.density, + "icon": props.prependIcon + }, null)]) : _createVNode$1k(VDefaultsProvider, { + "key": "prepend-defaults", + "disabled": !hasPrependMedia, + "defaults": { + VAvatar: { + density: props.density, + image: props.prependAvatar + }, + VIcon: { + density: props.density, + icon: props.prependIcon + } + } + }, slots.prepend)]), _createVNode$1k("div", { + "class": "v-card-item__content" + }, [hasTitle && _createVNode$1k(VCardTitle, { + "key": "title" + }, { + default: () => [slots.title?.() ?? props.title] + }), hasSubtitle && _createVNode$1k(VCardSubtitle, { + "key": "subtitle" + }, { + default: () => [slots.subtitle?.() ?? props.subtitle] + }), slots.default?.()]), hasAppend && _createVNode$1k("div", { + "key": "append", + "class": "v-card-item__append" + }, [!slots.append ? _createVNode$1k(_Fragment$n, null, [props.appendIcon && _createVNode$1k(VIcon, { + "key": "append-icon", + "density": props.density, + "icon": props.appendIcon + }, null), props.appendAvatar && _createVNode$1k(VAvatar, { + "key": "append-avatar", + "density": props.density, + "image": props.appendAvatar + }, null)]) : _createVNode$1k(VDefaultsProvider, { + "key": "append-defaults", + "disabled": !hasAppendMedia, + "defaults": { + VAvatar: { + density: props.density, + image: props.appendAvatar + }, + VIcon: { + density: props.density, + icon: props.appendIcon + } + } + }, slots.append)])]); + }); + return {}; + } +}); + +const {createVNode:_createVNode$1j,resolveDirective:_resolveDirective$z} = await importShared('vue'); +const makeVCardTextProps = propsFactory({ + opacity: [Number, String], + ...makeComponentProps(), + ...makeTagProps() +}, 'VCardText'); +const VCardText = genericComponent()({ + name: 'VCardText', + props: makeVCardTextProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => _createVNode$1j(props.tag, { + "class": ['v-card-text', props.class], + "style": [{ + '--v-card-text-opacity': props.opacity + }, props.style] + }, slots)); + return {}; + } +}); + +const {withDirectives:_withDirectives$9,mergeProps:_mergeProps$D,resolveDirective:_resolveDirective$y,createVNode:_createVNode$1i} = await importShared('vue'); +const {computed: computed$13} = await importShared('vue'); +const makeVCardProps = propsFactory({ + appendAvatar: String, + appendIcon: IconValue, + disabled: Boolean, + flat: Boolean, + hover: Boolean, + image: String, + link: { + type: Boolean, + default: undefined + }, + prependAvatar: String, + prependIcon: IconValue, + ripple: { + type: [Boolean, Object], + default: true + }, + subtitle: [String, Number], + text: [String, Number], + title: [String, Number], + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeDimensionProps(), + ...makeElevationProps(), + ...makeLoaderProps(), + ...makeLocationProps(), + ...makePositionProps(), + ...makeRoundedProps(), + ...makeRouterProps(), + ...makeTagProps(), + ...makeThemeProps(), + ...makeVariantProps({ + variant: 'elevated' + }) +}, 'VCard'); +const VCard = genericComponent()({ + name: 'VCard', + directives: { + Ripple + }, + props: makeVCardProps(), + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + borderClasses + } = useBorder(props); + const { + colorClasses, + colorStyles, + variantClasses + } = useVariant(props); + const { + densityClasses + } = useDensity(props); + const { + dimensionStyles + } = useDimension(props); + const { + elevationClasses + } = useElevation(props); + const { + loaderClasses + } = useLoader(props); + const { + locationStyles + } = useLocation(props); + const { + positionClasses + } = usePosition(props); + const { + roundedClasses + } = useRounded(props); + const link = useLink(props, attrs); + const isLink = computed$13(() => props.link !== false && link.isLink.value); + const isClickable = computed$13(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value)); + useRender(() => { + const Tag = isLink.value ? 'a' : props.tag; + const hasTitle = !!(slots.title || props.title != null); + const hasSubtitle = !!(slots.subtitle || props.subtitle != null); + const hasHeader = hasTitle || hasSubtitle; + const hasAppend = !!(slots.append || props.appendAvatar || props.appendIcon); + const hasPrepend = !!(slots.prepend || props.prependAvatar || props.prependIcon); + const hasImage = !!(slots.image || props.image); + const hasCardItem = hasHeader || hasPrepend || hasAppend; + const hasText = !!(slots.text || props.text != null); + return _withDirectives$9(_createVNode$1i(Tag, _mergeProps$D({ + "class": ['v-card', { + 'v-card--disabled': props.disabled, + 'v-card--flat': props.flat, + 'v-card--hover': props.hover && !(props.disabled || props.flat), + 'v-card--link': isClickable.value + }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, loaderClasses.value, positionClasses.value, roundedClasses.value, variantClasses.value, props.class], + "style": [colorStyles.value, dimensionStyles.value, locationStyles.value, props.style], + "onClick": isClickable.value && link.navigate, + "tabindex": props.disabled ? -1 : undefined + }, link.linkProps), { + default: () => [hasImage && _createVNode$1i("div", { + "key": "image", + "class": "v-card__image" + }, [!slots.image ? _createVNode$1i(VImg, { + "key": "image-img", + "cover": true, + "src": props.image + }, null) : _createVNode$1i(VDefaultsProvider, { + "key": "image-defaults", + "disabled": !props.image, + "defaults": { + VImg: { + cover: true, + src: props.image + } + } + }, slots.image)]), _createVNode$1i(LoaderSlot, { + "name": "v-card", + "active": !!props.loading, + "color": typeof props.loading === 'boolean' ? undefined : props.loading + }, { + default: slots.loader + }), hasCardItem && _createVNode$1i(VCardItem, { + "key": "item", + "prependAvatar": props.prependAvatar, + "prependIcon": props.prependIcon, + "title": props.title, + "subtitle": props.subtitle, + "appendAvatar": props.appendAvatar, + "appendIcon": props.appendIcon + }, { + default: slots.item, + prepend: slots.prepend, + title: slots.title, + subtitle: slots.subtitle, + append: slots.append + }), hasText && _createVNode$1i(VCardText, { + "key": "text" + }, { + default: () => [slots.text?.() ?? props.text] + }), slots.default?.(), slots.actions && _createVNode$1i(VCardActions, null, { + default: slots.actions + }), genOverlays(isClickable.value, 'v-card')] + }), [[_resolveDirective$y("ripple"), isClickable.value && props.ripple]]); + }); + return {}; + } +}); + +// Utilities +const handleGesture = wrapper => { + const { + touchstartX, + touchendX, + touchstartY, + touchendY + } = wrapper; + const dirRatio = 0.5; + const minDistance = 16; + wrapper.offsetX = touchendX - touchstartX; + wrapper.offsetY = touchendY - touchstartY; + if (Math.abs(wrapper.offsetY) < dirRatio * Math.abs(wrapper.offsetX)) { + wrapper.left && touchendX < touchstartX - minDistance && wrapper.left(wrapper); + wrapper.right && touchendX > touchstartX + minDistance && wrapper.right(wrapper); + } + if (Math.abs(wrapper.offsetX) < dirRatio * Math.abs(wrapper.offsetY)) { + wrapper.up && touchendY < touchstartY - minDistance && wrapper.up(wrapper); + wrapper.down && touchendY > touchstartY + minDistance && wrapper.down(wrapper); + } +}; +function touchstart(event, wrapper) { + const touch = event.changedTouches[0]; + wrapper.touchstartX = touch.clientX; + wrapper.touchstartY = touch.clientY; + wrapper.start?.({ + originalEvent: event, + ...wrapper + }); +} +function touchend(event, wrapper) { + const touch = event.changedTouches[0]; + wrapper.touchendX = touch.clientX; + wrapper.touchendY = touch.clientY; + wrapper.end?.({ + originalEvent: event, + ...wrapper + }); + handleGesture(wrapper); +} +function touchmove(event, wrapper) { + const touch = event.changedTouches[0]; + wrapper.touchmoveX = touch.clientX; + wrapper.touchmoveY = touch.clientY; + wrapper.move?.({ + originalEvent: event, + ...wrapper + }); +} +function createHandlers() { + let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const wrapper = { + touchstartX: 0, + touchstartY: 0, + touchendX: 0, + touchendY: 0, + touchmoveX: 0, + touchmoveY: 0, + offsetX: 0, + offsetY: 0, + left: value.left, + right: value.right, + up: value.up, + down: value.down, + start: value.start, + move: value.move, + end: value.end + }; + return { + touchstart: e => touchstart(e, wrapper), + touchend: e => touchend(e, wrapper), + touchmove: e => touchmove(e, wrapper) + }; +} +function mounted$3(el, binding) { + const value = binding.value; + const target = value?.parent ? el.parentElement : el; + const options = value?.options ?? { + passive: true + }; + const uid = binding.instance?.$.uid; // TODO: use custom uid generator + + if (!target || !uid) return; + const handlers = createHandlers(binding.value); + target._touchHandlers = target._touchHandlers ?? Object.create(null); + target._touchHandlers[uid] = handlers; + keys(handlers).forEach(eventName => { + target.addEventListener(eventName, handlers[eventName], options); + }); +} +function unmounted$3(el, binding) { + const target = binding.value?.parent ? el.parentElement : el; + const uid = binding.instance?.$.uid; + if (!target?._touchHandlers || !uid) return; + const handlers = target._touchHandlers[uid]; + keys(handlers).forEach(eventName => { + target.removeEventListener(eventName, handlers[eventName]); + }); + delete target._touchHandlers[uid]; +} +const Touch = { + mounted: mounted$3, + unmounted: unmounted$3 +}; + +const {withDirectives:_withDirectives$8,resolveDirective:_resolveDirective$x,createVNode:_createVNode$1h} = await importShared('vue'); +const {computed: computed$12,provide: provide$9,ref: ref$t,shallowRef: shallowRef$j,watch: watch$i} = await importShared('vue'); +const VWindowSymbol = Symbol.for('vuetify:v-window'); +const VWindowGroupSymbol = Symbol.for('vuetify:v-window-group'); +const makeVWindowProps = propsFactory({ + continuous: Boolean, + nextIcon: { + type: [Boolean, String, Function, Object], + default: '$next' + }, + prevIcon: { + type: [Boolean, String, Function, Object], + default: '$prev' + }, + reverse: Boolean, + showArrows: { + type: [Boolean, String], + validator: v => typeof v === 'boolean' || v === 'hover' + }, + touch: { + type: [Object, Boolean], + default: undefined + }, + direction: { + type: String, + default: 'horizontal' + }, + modelValue: null, + disabled: Boolean, + selectedClass: { + type: String, + default: 'v-window-item--active' + }, + // TODO: mandatory should probably not be exposed but do this for now + mandatory: { + type: [Boolean, String], + default: 'force' + }, + ...makeComponentProps(), + ...makeTagProps(), + ...makeThemeProps() +}, 'VWindow'); +const VWindow = genericComponent()({ + name: 'VWindow', + directives: { + Touch + }, + props: makeVWindowProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + isRtl + } = useRtl(); + const { + t + } = useLocale(); + const group = useGroup(props, VWindowGroupSymbol); + const rootRef = ref$t(); + const isRtlReverse = computed$12(() => isRtl.value ? !props.reverse : props.reverse); + const isReversed = shallowRef$j(false); + const transition = computed$12(() => { + const axis = props.direction === 'vertical' ? 'y' : 'x'; + const reverse = isRtlReverse.value ? !isReversed.value : isReversed.value; + const direction = reverse ? '-reverse' : ''; + return `v-window-${axis}${direction}-transition`; + }); + const transitionCount = shallowRef$j(0); + const transitionHeight = ref$t(undefined); + const activeIndex = computed$12(() => { + return group.items.value.findIndex(item => group.selected.value.includes(item.id)); + }); + watch$i(activeIndex, (newVal, oldVal) => { + const itemsLength = group.items.value.length; + const lastIndex = itemsLength - 1; + if (itemsLength <= 2) { + isReversed.value = newVal < oldVal; + } else if (newVal === lastIndex && oldVal === 0) { + isReversed.value = true; + } else if (newVal === 0 && oldVal === lastIndex) { + isReversed.value = false; + } else { + isReversed.value = newVal < oldVal; + } + }); + provide$9(VWindowSymbol, { + transition, + isReversed, + transitionCount, + transitionHeight, + rootRef + }); + const canMoveBack = computed$12(() => props.continuous || activeIndex.value !== 0); + const canMoveForward = computed$12(() => props.continuous || activeIndex.value !== group.items.value.length - 1); + function prev() { + canMoveBack.value && group.prev(); + } + function next() { + canMoveForward.value && group.next(); + } + const arrows = computed$12(() => { + const arrows = []; + const prevProps = { + icon: isRtl.value ? props.nextIcon : props.prevIcon, + class: `v-window__${isRtlReverse.value ? 'right' : 'left'}`, + onClick: group.prev, + 'aria-label': t('$vuetify.carousel.prev') + }; + arrows.push(canMoveBack.value ? slots.prev ? slots.prev({ + props: prevProps + }) : _createVNode$1h(VBtn, prevProps, null) : _createVNode$1h("div", null, null)); + const nextProps = { + icon: isRtl.value ? props.prevIcon : props.nextIcon, + class: `v-window__${isRtlReverse.value ? 'left' : 'right'}`, + onClick: group.next, + 'aria-label': t('$vuetify.carousel.next') + }; + arrows.push(canMoveForward.value ? slots.next ? slots.next({ + props: nextProps + }) : _createVNode$1h(VBtn, nextProps, null) : _createVNode$1h("div", null, null)); + return arrows; + }); + const touchOptions = computed$12(() => { + if (props.touch === false) return props.touch; + const options = { + left: () => { + isRtlReverse.value ? prev() : next(); + }, + right: () => { + isRtlReverse.value ? next() : prev(); + }, + start: _ref2 => { + let { + originalEvent + } = _ref2; + originalEvent.stopPropagation(); + } + }; + return { + ...options, + ...(props.touch === true ? {} : props.touch) + }; + }); + useRender(() => _withDirectives$8(_createVNode$1h(props.tag, { + "ref": rootRef, + "class": ['v-window', { + 'v-window--show-arrows-on-hover': props.showArrows === 'hover' + }, themeClasses.value, props.class], + "style": props.style + }, { + default: () => [_createVNode$1h("div", { + "class": "v-window__container", + "style": { + height: transitionHeight.value + } + }, [slots.default?.({ + group + }), props.showArrows !== false && _createVNode$1h("div", { + "class": "v-window__controls" + }, [arrows.value])]), slots.additional?.({ + group + })] + }), [[_resolveDirective$x("touch"), touchOptions.value]])); + return { + group + }; + } +}); + +const {createVNode:_createVNode$1g,mergeProps:_mergeProps$C,Fragment:_Fragment$m} = await importShared('vue'); +const {onMounted: onMounted$7,ref: ref$s,watch: watch$h} = await importShared('vue'); +const makeVCarouselProps = propsFactory({ + color: String, + cycle: Boolean, + delimiterIcon: { + type: IconValue, + default: '$delimiter' + }, + height: { + type: [Number, String], + default: 500 + }, + hideDelimiters: Boolean, + hideDelimiterBackground: Boolean, + interval: { + type: [Number, String], + default: 6000, + validator: value => Number(value) > 0 + }, + progress: [Boolean, String], + verticalDelimiters: [Boolean, String], + ...makeVWindowProps({ + continuous: true, + mandatory: 'force', + showArrows: true + }) +}, 'VCarousel'); +const VCarousel = genericComponent()({ + name: 'VCarousel', + props: makeVCarouselProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const model = useProxiedModel(props, 'modelValue'); + const { + t + } = useLocale(); + const windowRef = ref$s(); + let slideTimeout = -1; + watch$h(model, restartTimeout); + watch$h(() => props.interval, restartTimeout); + watch$h(() => props.cycle, val => { + if (val) restartTimeout();else window.clearTimeout(slideTimeout); + }); + onMounted$7(startTimeout); + function startTimeout() { + if (!props.cycle || !windowRef.value) return; + slideTimeout = window.setTimeout(windowRef.value.group.next, +props.interval > 0 ? +props.interval : 6000); + } + function restartTimeout() { + window.clearTimeout(slideTimeout); + window.requestAnimationFrame(startTimeout); + } + useRender(() => { + const windowProps = VWindow.filterProps(props); + return _createVNode$1g(VWindow, _mergeProps$C({ + "ref": windowRef + }, windowProps, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "class": ['v-carousel', { + 'v-carousel--hide-delimiter-background': props.hideDelimiterBackground, + 'v-carousel--vertical-delimiters': props.verticalDelimiters + }, props.class], + "style": [{ + height: convertToUnit(props.height) + }, props.style] + }), { + default: slots.default, + additional: _ref2 => { + let { + group + } = _ref2; + return _createVNode$1g(_Fragment$m, null, [!props.hideDelimiters && _createVNode$1g("div", { + "class": "v-carousel__controls", + "style": { + left: props.verticalDelimiters === 'left' && props.verticalDelimiters ? 0 : 'auto', + right: props.verticalDelimiters === 'right' ? 0 : 'auto' + } + }, [group.items.value.length > 0 && _createVNode$1g(VDefaultsProvider, { + "defaults": { + VBtn: { + color: props.color, + icon: props.delimiterIcon, + size: 'x-small', + variant: 'text' + } + }, + "scoped": true + }, { + default: () => [group.items.value.map((item, index) => { + const props = { + id: `carousel-item-${item.id}`, + 'aria-label': t('$vuetify.carousel.ariaLabel.delimiter', index + 1, group.items.value.length), + class: ['v-carousel__controls__item', group.isSelected(item.id) && 'v-btn--active'], + onClick: () => group.select(item.id, true) + }; + return slots.item ? slots.item({ + props, + item + }) : _createVNode$1g(VBtn, _mergeProps$C(item, props), null); + })] + })]), props.progress && _createVNode$1g(VProgressLinear, { + "class": "v-carousel__progress", + "color": typeof props.progress === 'string' ? props.progress : undefined, + "modelValue": (group.getItemIndex(model.value) + 1) / group.items.value.length * 100 + }, null)]); + }, + prev: slots.prev, + next: slots.next + }); + }); + return {}; + } +}); + +const {withDirectives:_withDirectives$7,createVNode:_createVNode$1f,vShow:_vShow$3} = await importShared('vue'); +const {computed: computed$11,inject: inject$d,nextTick: nextTick$a,shallowRef: shallowRef$i} = await importShared('vue'); +const makeVWindowItemProps = propsFactory({ + reverseTransition: { + type: [Boolean, String], + default: undefined + }, + transition: { + type: [Boolean, String], + default: undefined + }, + ...makeComponentProps(), + ...makeGroupItemProps(), + ...makeLazyProps() +}, 'VWindowItem'); +const VWindowItem = genericComponent()({ + name: 'VWindowItem', + directives: { + Touch + }, + props: makeVWindowItemProps(), + emits: { + 'group:selected': val => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const window = inject$d(VWindowSymbol); + const groupItem = useGroupItem(props, VWindowGroupSymbol); + const { + isBooted + } = useSsrBoot(); + if (!window || !groupItem) throw new Error('[Vuetify] VWindowItem must be used inside VWindow'); + const isTransitioning = shallowRef$i(false); + const hasTransition = computed$11(() => isBooted.value && (window.isReversed.value ? props.reverseTransition !== false : props.transition !== false)); + function onAfterTransition() { + if (!isTransitioning.value || !window) { + return; + } + + // Finalize transition state. + isTransitioning.value = false; + if (window.transitionCount.value > 0) { + window.transitionCount.value -= 1; + + // Remove container height if we are out of transition. + if (window.transitionCount.value === 0) { + window.transitionHeight.value = undefined; + } + } + } + function onBeforeTransition() { + if (isTransitioning.value || !window) { + return; + } + + // Initialize transition state here. + isTransitioning.value = true; + if (window.transitionCount.value === 0) { + // Set initial height for height transition. + window.transitionHeight.value = convertToUnit(window.rootRef.value?.clientHeight); + } + window.transitionCount.value += 1; + } + function onTransitionCancelled() { + onAfterTransition(); // This should have the same path as normal transition end. + } + function onEnterTransition(el) { + if (!isTransitioning.value) { + return; + } + nextTick$a(() => { + // Do not set height if no transition or cancelled. + if (!hasTransition.value || !isTransitioning.value || !window) { + return; + } + + // Set transition target height. + window.transitionHeight.value = convertToUnit(el.clientHeight); + }); + } + const transition = computed$11(() => { + const name = window.isReversed.value ? props.reverseTransition : props.transition; + return !hasTransition.value ? false : { + name: typeof name !== 'string' ? window.transition.value : name, + onBeforeEnter: onBeforeTransition, + onAfterEnter: onAfterTransition, + onEnterCancelled: onTransitionCancelled, + onBeforeLeave: onBeforeTransition, + onAfterLeave: onAfterTransition, + onLeaveCancelled: onTransitionCancelled, + onEnter: onEnterTransition + }; + }); + const { + hasContent + } = useLazy(props, groupItem.isSelected); + useRender(() => _createVNode$1f(MaybeTransition, { + "transition": transition.value, + "disabled": !isBooted.value + }, { + default: () => [_withDirectives$7(_createVNode$1f("div", { + "class": ['v-window-item', groupItem.selectedClass.value, props.class], + "style": props.style + }, [hasContent.value && slots.default?.()]), [[_vShow$3, groupItem.isSelected.value]])] + })); + return { + groupItem + }; + } +}); + +const {createVNode:_createVNode$1e,mergeProps:_mergeProps$B,resolveDirective:_resolveDirective$w} = await importShared('vue'); +const makeVCarouselItemProps = propsFactory({ + ...makeVImgProps(), + ...makeVWindowItemProps() +}, 'VCarouselItem'); +const VCarouselItem = genericComponent()({ + name: 'VCarouselItem', + inheritAttrs: false, + props: makeVCarouselItemProps(), + setup(props, _ref) { + let { + slots, + attrs + } = _ref; + useRender(() => { + const imgProps = VImg.filterProps(props); + const windowItemProps = VWindowItem.filterProps(props); + return _createVNode$1e(VWindowItem, _mergeProps$B({ + "class": ['v-carousel-item', props.class] + }, windowItemProps), { + default: () => [_createVNode$1e(VImg, _mergeProps$B(attrs, imgProps), slots)] + }); + }); + } +}); + +// Styles +const VCode = createSimpleFunctional('v-code'); + +const {createVNode:_createVNode$1d} = await importShared('vue'); +const {computed: computed$10,onMounted: onMounted$6,ref: ref$r,shallowRef: shallowRef$h,watch: watch$g} = await importShared('vue'); +const makeVColorPickerCanvasProps = propsFactory({ + color: { + type: Object + }, + disabled: Boolean, + dotSize: { + type: [Number, String], + default: 10 + }, + height: { + type: [Number, String], + default: 150 + }, + width: { + type: [Number, String], + default: 300 + }, + ...makeComponentProps() +}, 'VColorPickerCanvas'); +const VColorPickerCanvas = defineComponent({ + name: 'VColorPickerCanvas', + props: makeVColorPickerCanvasProps(), + emits: { + 'update:color': color => true, + 'update:position': hue => true + }, + setup(props, _ref) { + let { + emit + } = _ref; + const isInteracting = shallowRef$h(false); + const canvasRef = ref$r(); + const canvasWidth = shallowRef$h(parseFloat(props.width)); + const canvasHeight = shallowRef$h(parseFloat(props.height)); + const _dotPosition = ref$r({ + x: 0, + y: 0 + }); + const dotPosition = computed$10({ + get: () => _dotPosition.value, + set(val) { + if (!canvasRef.value) return; + const { + x, + y + } = val; + _dotPosition.value = val; + emit('update:color', { + h: props.color?.h ?? 0, + s: clamp(x, 0, canvasWidth.value) / canvasWidth.value, + v: 1 - clamp(y, 0, canvasHeight.value) / canvasHeight.value, + a: props.color?.a ?? 1 + }); + } + }); + const dotStyles = computed$10(() => { + const { + x, + y + } = dotPosition.value; + const radius = parseInt(props.dotSize, 10) / 2; + return { + width: convertToUnit(props.dotSize), + height: convertToUnit(props.dotSize), + transform: `translate(${convertToUnit(x - radius)}, ${convertToUnit(y - radius)})` + }; + }); + const { + resizeRef + } = useResizeObserver(entries => { + if (!resizeRef.el?.offsetParent) return; + const { + width, + height + } = entries[0].contentRect; + canvasWidth.value = width; + canvasHeight.value = height; + }); + function updateDotPosition(x, y, rect) { + const { + left, + top, + width, + height + } = rect; + dotPosition.value = { + x: clamp(x - left, 0, width), + y: clamp(y - top, 0, height) + }; + } + function handleMouseDown(e) { + if (e.type === 'mousedown') { + // Prevent text selection while dragging + e.preventDefault(); + } + if (props.disabled) return; + handleMouseMove(e); + window.addEventListener('mousemove', handleMouseMove); + window.addEventListener('mouseup', handleMouseUp); + window.addEventListener('touchmove', handleMouseMove); + window.addEventListener('touchend', handleMouseUp); + } + function handleMouseMove(e) { + if (props.disabled || !canvasRef.value) return; + isInteracting.value = true; + const coords = getEventCoordinates(e); + updateDotPosition(coords.clientX, coords.clientY, canvasRef.value.getBoundingClientRect()); + } + function handleMouseUp() { + window.removeEventListener('mousemove', handleMouseMove); + window.removeEventListener('mouseup', handleMouseUp); + window.removeEventListener('touchmove', handleMouseMove); + window.removeEventListener('touchend', handleMouseUp); + } + function updateCanvas() { + if (!canvasRef.value) return; + const canvas = canvasRef.value; + const ctx = canvas.getContext('2d'); + if (!ctx) return; + const saturationGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); + saturationGradient.addColorStop(0, 'hsla(0, 0%, 100%, 1)'); // white + saturationGradient.addColorStop(1, `hsla(${props.color?.h ?? 0}, 100%, 50%, 1)`); + ctx.fillStyle = saturationGradient; + ctx.fillRect(0, 0, canvas.width, canvas.height); + const valueGradient = ctx.createLinearGradient(0, 0, 0, canvas.height); + valueGradient.addColorStop(0, 'hsla(0, 0%, 0%, 0)'); // transparent + valueGradient.addColorStop(1, 'hsla(0, 0%, 0%, 1)'); // black + ctx.fillStyle = valueGradient; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + watch$g(() => props.color?.h, updateCanvas, { + immediate: true + }); + watch$g(() => [canvasWidth.value, canvasHeight.value], (newVal, oldVal) => { + updateCanvas(); + _dotPosition.value = { + x: dotPosition.value.x * newVal[0] / oldVal[0], + y: dotPosition.value.y * newVal[1] / oldVal[1] + }; + }, { + flush: 'post' + }); + watch$g(() => props.color, () => { + if (isInteracting.value) { + isInteracting.value = false; + return; + } + _dotPosition.value = props.color ? { + x: props.color.s * canvasWidth.value, + y: (1 - props.color.v) * canvasHeight.value + } : { + x: 0, + y: 0 + }; + }, { + deep: true, + immediate: true + }); + onMounted$6(() => updateCanvas()); + useRender(() => _createVNode$1d("div", { + "ref": resizeRef, + "class": ['v-color-picker-canvas', props.class], + "style": props.style, + "onMousedown": handleMouseDown, + "onTouchstartPassive": handleMouseDown + }, [_createVNode$1d("canvas", { + "ref": canvasRef, + "width": canvasWidth.value, + "height": canvasHeight.value + }, null), props.color && _createVNode$1d("div", { + "class": ['v-color-picker-canvas__dot', { + 'v-color-picker-canvas__dot--disabled': props.disabled + }], + "style": dotStyles.value + }, null)])); + return {}; + } +}); + +// Utilities +function stripAlpha(color, stripAlpha) { + if (stripAlpha) { + const { + a, + ...rest + } = color; + return rest; + } + return color; +} +function extractColor(color, input) { + if (input == null || typeof input === 'string') { + const hex = HSVtoHex(color); + if (color.a === 1) return hex.slice(0, 7);else return hex; + } + if (typeof input === 'object') { + let converted; + if (has(input, ['r', 'g', 'b'])) converted = HSVtoRGB(color);else if (has(input, ['h', 's', 'l'])) converted = HSVtoHSL(color);else if (has(input, ['h', 's', 'v'])) converted = color; + return stripAlpha(converted, !has(input, ['a']) && color.a === 1); + } + return color; +} +const nullColor = { + h: 0, + s: 0, + v: 0, + a: 1 +}; +const rgba = { + inputProps: { + type: 'number', + min: 0 + }, + inputs: [{ + label: 'R', + max: 255, + step: 1, + getValue: c => Math.round(c.r), + getColor: (c, v) => ({ + ...c, + r: Number(v) + }) + }, { + label: 'G', + max: 255, + step: 1, + getValue: c => Math.round(c.g), + getColor: (c, v) => ({ + ...c, + g: Number(v) + }) + }, { + label: 'B', + max: 255, + step: 1, + getValue: c => Math.round(c.b), + getColor: (c, v) => ({ + ...c, + b: Number(v) + }) + }, { + label: 'A', + max: 1, + step: 0.01, + getValue: _ref => { + let { + a + } = _ref; + return a != null ? Math.round(a * 100) / 100 : 1; + }, + getColor: (c, v) => ({ + ...c, + a: Number(v) + }) + }], + to: HSVtoRGB, + from: RGBtoHSV +}; +const rgb = { + ...rgba, + inputs: rgba.inputs?.slice(0, 3) +}; +const hsla = { + inputProps: { + type: 'number', + min: 0 + }, + inputs: [{ + label: 'H', + max: 360, + step: 1, + getValue: c => Math.round(c.h), + getColor: (c, v) => ({ + ...c, + h: Number(v) + }) + }, { + label: 'S', + max: 1, + step: 0.01, + getValue: c => Math.round(c.s * 100) / 100, + getColor: (c, v) => ({ + ...c, + s: Number(v) + }) + }, { + label: 'L', + max: 1, + step: 0.01, + getValue: c => Math.round(c.l * 100) / 100, + getColor: (c, v) => ({ + ...c, + l: Number(v) + }) + }, { + label: 'A', + max: 1, + step: 0.01, + getValue: _ref2 => { + let { + a + } = _ref2; + return a != null ? Math.round(a * 100) / 100 : 1; + }, + getColor: (c, v) => ({ + ...c, + a: Number(v) + }) + }], + to: HSVtoHSL, + from: HSLtoHSV +}; +const hsl = { + ...hsla, + inputs: hsla.inputs.slice(0, 3) +}; +const hexa = { + inputProps: { + type: 'text' + }, + inputs: [{ + label: 'HEXA', + getValue: c => c, + getColor: (c, v) => v + }], + to: HSVtoHex, + from: HexToHSV +}; +const hex = { + ...hexa, + inputs: [{ + label: 'HEX', + getValue: c => c.slice(0, 7), + getColor: (c, v) => v + }] +}; +const modes = { + rgb, + rgba, + hsl, + hsla, + hex, + hexa +}; + +const {createVNode:_createVNode$1c} = await importShared('vue'); +const {computed: computed$$} = await importShared('vue'); +const VColorPickerInput = _ref => { + let { + label, + ...rest + } = _ref; + return _createVNode$1c("div", { + "class": "v-color-picker-edit__input" + }, [_createVNode$1c("input", rest, null), _createVNode$1c("span", null, [label])]); +}; +const makeVColorPickerEditProps = propsFactory({ + color: Object, + disabled: Boolean, + mode: { + type: String, + default: 'rgba', + validator: v => Object.keys(modes).includes(v) + }, + modes: { + type: Array, + default: () => Object.keys(modes), + validator: v => Array.isArray(v) && v.every(m => Object.keys(modes).includes(m)) + }, + ...makeComponentProps() +}, 'VColorPickerEdit'); +const VColorPickerEdit = defineComponent({ + name: 'VColorPickerEdit', + props: makeVColorPickerEditProps(), + emits: { + 'update:color': color => true, + 'update:mode': mode => true + }, + setup(props, _ref2) { + let { + emit + } = _ref2; + const enabledModes = computed$$(() => { + return props.modes.map(key => ({ + ...modes[key], + name: key + })); + }); + const inputs = computed$$(() => { + const mode = enabledModes.value.find(m => m.name === props.mode); + if (!mode) return []; + const color = props.color ? mode.to(props.color) : null; + return mode.inputs?.map(_ref3 => { + let { + getValue, + getColor, + ...inputProps + } = _ref3; + return { + ...mode.inputProps, + ...inputProps, + disabled: props.disabled, + value: color && getValue(color), + onChange: e => { + const target = e.target; + if (!target) return; + emit('update:color', mode.from(getColor(color ?? mode.to(nullColor), target.value))); + } + }; + }); + }); + useRender(() => _createVNode$1c("div", { + "class": ['v-color-picker-edit', props.class], + "style": props.style + }, [inputs.value?.map(props => _createVNode$1c(VColorPickerInput, props, null)), enabledModes.value.length > 1 && _createVNode$1c(VBtn, { + "icon": "$unfold", + "size": "x-small", + "variant": "plain", + "onClick": () => { + const mi = enabledModes.value.findIndex(m => m.name === props.mode); + emit('update:mode', enabledModes.value[(mi + 1) % enabledModes.value.length].name); + } + }, null)])); + return {}; + } +}); + +const {computed: computed$_,provide: provide$8,ref: ref$q,shallowRef: shallowRef$g,toRef: toRef$m} = await importShared('vue'); +const VSliderSymbol = Symbol.for('vuetify:v-slider'); +function getOffset(e, el, direction) { + const vertical = direction === 'vertical'; + const rect = el.getBoundingClientRect(); + const touch = 'touches' in e ? e.touches[0] : e; + return vertical ? touch.clientY - (rect.top + rect.height / 2) : touch.clientX - (rect.left + rect.width / 2); +} +function getPosition(e, position) { + if ('touches' in e && e.touches.length) return e.touches[0][position];else if ('changedTouches' in e && e.changedTouches.length) return e.changedTouches[0][position];else return e[position]; +} +const makeSliderProps = propsFactory({ + disabled: { + type: Boolean, + default: null + }, + error: Boolean, + readonly: { + type: Boolean, + default: null + }, + max: { + type: [Number, String], + default: 100 + }, + min: { + type: [Number, String], + default: 0 + }, + step: { + type: [Number, String], + default: 0 + }, + thumbColor: String, + thumbLabel: { + type: [Boolean, String], + default: undefined, + validator: v => typeof v === 'boolean' || v === 'always' + }, + thumbSize: { + type: [Number, String], + default: 20 + }, + showTicks: { + type: [Boolean, String], + default: false, + validator: v => typeof v === 'boolean' || v === 'always' + }, + ticks: { + type: [Array, Object] + }, + tickSize: { + type: [Number, String], + default: 2 + }, + color: String, + trackColor: String, + trackFillColor: String, + trackSize: { + type: [Number, String], + default: 4 + }, + direction: { + type: String, + default: 'horizontal', + validator: v => ['vertical', 'horizontal'].includes(v) + }, + reverse: Boolean, + ...makeRoundedProps(), + ...makeElevationProps({ + elevation: 2 + }), + ripple: { + type: Boolean, + default: true + } +}, 'Slider'); +const useSteps = props => { + const min = computed$_(() => parseFloat(props.min)); + const max = computed$_(() => parseFloat(props.max)); + const step = computed$_(() => +props.step > 0 ? parseFloat(props.step) : 0); + const decimals = computed$_(() => Math.max(getDecimals(step.value), getDecimals(min.value))); + function roundValue(value) { + value = parseFloat(value); + if (step.value <= 0) return value; + const clamped = clamp(value, min.value, max.value); + const offset = min.value % step.value; + const newValue = Math.round((clamped - offset) / step.value) * step.value + offset; + return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value)); + } + return { + min, + max, + step, + decimals, + roundValue + }; +}; +const useSlider = _ref => { + let { + props, + steps, + onSliderStart, + onSliderMove, + onSliderEnd, + getActiveThumb + } = _ref; + const { + isRtl + } = useRtl(); + const isReversed = toRef$m(props, 'reverse'); + const vertical = computed$_(() => props.direction === 'vertical'); + const indexFromEnd = computed$_(() => vertical.value !== isReversed.value); + const { + min, + max, + step, + decimals, + roundValue + } = steps; + const thumbSize = computed$_(() => parseInt(props.thumbSize, 10)); + const tickSize = computed$_(() => parseInt(props.tickSize, 10)); + const trackSize = computed$_(() => parseInt(props.trackSize, 10)); + const numTicks = computed$_(() => (max.value - min.value) / step.value); + const disabled = toRef$m(props, 'disabled'); + const thumbColor = computed$_(() => props.error || props.disabled ? undefined : props.thumbColor ?? props.color); + const trackColor = computed$_(() => props.error || props.disabled ? undefined : props.trackColor ?? props.color); + const trackFillColor = computed$_(() => props.error || props.disabled ? undefined : props.trackFillColor ?? props.color); + const mousePressed = shallowRef$g(false); + const startOffset = shallowRef$g(0); + const trackContainerRef = ref$q(); + const activeThumbRef = ref$q(); + function parseMouseMove(e) { + const vertical = props.direction === 'vertical'; + const start = vertical ? 'top' : 'left'; + const length = vertical ? 'height' : 'width'; + const position = vertical ? 'clientY' : 'clientX'; + const { + [start]: trackStart, + [length]: trackLength + } = trackContainerRef.value?.$el.getBoundingClientRect(); + const clickOffset = getPosition(e, position); + + // It is possible for left to be NaN, force to number + let clickPos = Math.min(Math.max((clickOffset - trackStart - startOffset.value) / trackLength, 0), 1) || 0; + if (vertical ? indexFromEnd.value : indexFromEnd.value !== isRtl.value) clickPos = 1 - clickPos; + return roundValue(min.value + clickPos * (max.value - min.value)); + } + const handleStop = e => { + onSliderEnd({ + value: parseMouseMove(e) + }); + mousePressed.value = false; + startOffset.value = 0; + }; + const handleStart = e => { + activeThumbRef.value = getActiveThumb(e); + if (!activeThumbRef.value) return; + activeThumbRef.value.focus(); + mousePressed.value = true; + if (activeThumbRef.value.contains(e.target)) { + startOffset.value = getOffset(e, activeThumbRef.value, props.direction); + } else { + startOffset.value = 0; + onSliderMove({ + value: parseMouseMove(e) + }); + } + onSliderStart({ + value: parseMouseMove(e) + }); + }; + const moveListenerOptions = { + passive: true, + capture: true + }; + function onMouseMove(e) { + onSliderMove({ + value: parseMouseMove(e) + }); + } + function onSliderMouseUp(e) { + e.stopPropagation(); + e.preventDefault(); + handleStop(e); + window.removeEventListener('mousemove', onMouseMove, moveListenerOptions); + window.removeEventListener('mouseup', onSliderMouseUp); + } + function onSliderTouchend(e) { + handleStop(e); + window.removeEventListener('touchmove', onMouseMove, moveListenerOptions); + e.target?.removeEventListener('touchend', onSliderTouchend); + } + function onSliderTouchstart(e) { + handleStart(e); + window.addEventListener('touchmove', onMouseMove, moveListenerOptions); + e.target?.addEventListener('touchend', onSliderTouchend, { + passive: false + }); + } + function onSliderMousedown(e) { + e.preventDefault(); + handleStart(e); + window.addEventListener('mousemove', onMouseMove, moveListenerOptions); + window.addEventListener('mouseup', onSliderMouseUp, { + passive: false + }); + } + const position = val => { + const percentage = (val - min.value) / (max.value - min.value) * 100; + return clamp(isNaN(percentage) ? 0 : percentage, 0, 100); + }; + const showTicks = toRef$m(props, 'showTicks'); + const parsedTicks = computed$_(() => { + if (!showTicks.value) return []; + if (!props.ticks) { + return numTicks.value !== Infinity ? createRange(numTicks.value + 1).map(t => { + const value = min.value + t * step.value; + return { + value, + position: position(value) + }; + }) : []; + } + if (Array.isArray(props.ticks)) return props.ticks.map(t => ({ + value: t, + position: position(t), + label: t.toString() + })); + return Object.keys(props.ticks).map(key => ({ + value: parseFloat(key), + position: position(parseFloat(key)), + label: props.ticks[key] + })); + }); + const hasLabels = computed$_(() => parsedTicks.value.some(_ref2 => { + let { + label + } = _ref2; + return !!label; + })); + const data = { + activeThumbRef, + color: toRef$m(props, 'color'), + decimals, + disabled, + direction: toRef$m(props, 'direction'), + elevation: toRef$m(props, 'elevation'), + hasLabels, + isReversed, + indexFromEnd, + min, + max, + mousePressed, + numTicks, + onSliderMousedown, + onSliderTouchstart, + parsedTicks, + parseMouseMove, + position, + readonly: toRef$m(props, 'readonly'), + rounded: toRef$m(props, 'rounded'), + roundValue, + showTicks, + startOffset, + step, + thumbSize, + thumbColor, + thumbLabel: toRef$m(props, 'thumbLabel'), + ticks: toRef$m(props, 'ticks'), + tickSize, + trackColor, + trackContainerRef, + trackFillColor, + trackSize, + vertical + }; + provide$8(VSliderSymbol, data); + return data; +}; + +const {vShow:_vShow$2,withDirectives:_withDirectives$6,resolveDirective:_resolveDirective$v,createVNode:_createVNode$1b} = await importShared('vue'); +const {computed: computed$Z,inject: inject$c} = await importShared('vue'); +const makeVSliderThumbProps = propsFactory({ + focused: Boolean, + max: { + type: Number, + required: true + }, + min: { + type: Number, + required: true + }, + modelValue: { + type: Number, + required: true + }, + position: { + type: Number, + required: true + }, + ripple: { + type: [Boolean, Object], + default: true + }, + name: String, + ...makeComponentProps() +}, 'VSliderThumb'); +const VSliderThumb = genericComponent()({ + name: 'VSliderThumb', + directives: { + Ripple + }, + props: makeVSliderThumbProps(), + emits: { + 'update:modelValue': v => true + }, + setup(props, _ref) { + let { + slots, + emit + } = _ref; + const slider = inject$c(VSliderSymbol); + const { + isRtl, + rtlClasses + } = useRtl(); + if (!slider) throw new Error('[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider'); + const { + thumbColor, + step, + disabled, + thumbSize, + thumbLabel, + direction, + isReversed, + vertical, + readonly, + elevation, + mousePressed, + decimals, + indexFromEnd + } = slider; + const elevationProps = computed$Z(() => !disabled.value ? elevation.value : undefined); + const { + elevationClasses + } = useElevation(elevationProps); + const { + textColorClasses, + textColorStyles + } = useTextColor(thumbColor); + const { + pageup, + pagedown, + end, + home, + left, + right, + down, + up + } = keyValues; + const relevantKeys = [pageup, pagedown, end, home, left, right, down, up]; + const multipliers = computed$Z(() => { + if (step.value) return [1, 2, 3];else return [1, 5, 10]; + }); + function parseKeydown(e, value) { + if (!relevantKeys.includes(e.key)) return; + e.preventDefault(); + const _step = step.value || 0.1; + const steps = (props.max - props.min) / _step; + if ([left, right, down, up].includes(e.key)) { + const increase = vertical.value ? [isRtl.value ? left : right, isReversed.value ? down : up] : indexFromEnd.value !== isRtl.value ? [left, up] : [right, up]; + const direction = increase.includes(e.key) ? 1 : -1; + const multiplier = e.shiftKey ? 2 : e.ctrlKey ? 1 : 0; + value = value + direction * _step * multipliers.value[multiplier]; + } else if (e.key === home) { + value = props.min; + } else if (e.key === end) { + value = props.max; + } else { + const direction = e.key === pagedown ? 1 : -1; + value = value - direction * _step * (steps > 100 ? steps / 10 : 10); + } + return Math.max(props.min, Math.min(props.max, value)); + } + function onKeydown(e) { + const newValue = parseKeydown(e, props.modelValue); + newValue != null && emit('update:modelValue', newValue); + } + useRender(() => { + const positionPercentage = convertToUnit(indexFromEnd.value ? 100 - props.position : props.position, '%'); + return _createVNode$1b("div", { + "class": ['v-slider-thumb', { + 'v-slider-thumb--focused': props.focused, + 'v-slider-thumb--pressed': props.focused && mousePressed.value + }, props.class, rtlClasses.value], + "style": [{ + '--v-slider-thumb-position': positionPercentage, + '--v-slider-thumb-size': convertToUnit(thumbSize.value) + }, props.style], + "role": "slider", + "tabindex": disabled.value ? -1 : 0, + "aria-label": props.name, + "aria-valuemin": props.min, + "aria-valuemax": props.max, + "aria-valuenow": props.modelValue, + "aria-readonly": !!readonly.value, + "aria-orientation": direction.value, + "onKeydown": !readonly.value ? onKeydown : undefined + }, [_createVNode$1b("div", { + "class": ['v-slider-thumb__surface', textColorClasses.value, elevationClasses.value], + "style": { + ...textColorStyles.value + } + }, null), _withDirectives$6(_createVNode$1b("div", { + "class": ['v-slider-thumb__ripple', textColorClasses.value], + "style": textColorStyles.value + }, null), [[_resolveDirective$v("ripple"), props.ripple, null, { + circle: true, + center: true + }]]), _createVNode$1b(VScaleTransition, { + "origin": "bottom center" + }, { + default: () => [_withDirectives$6(_createVNode$1b("div", { + "class": "v-slider-thumb__label-container" + }, [_createVNode$1b("div", { + "class": ['v-slider-thumb__label'] + }, [_createVNode$1b("div", null, [slots['thumb-label']?.({ + modelValue: props.modelValue + }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[_vShow$2, thumbLabel.value && props.focused || thumbLabel.value === 'always']])] + })]); + }); + return {}; + } +}); + +const {createVNode:_createVNode$1a} = await importShared('vue'); +const {computed: computed$Y,inject: inject$b} = await importShared('vue'); +const makeVSliderTrackProps = propsFactory({ + start: { + type: Number, + required: true + }, + stop: { + type: Number, + required: true + }, + ...makeComponentProps() +}, 'VSliderTrack'); +const VSliderTrack = genericComponent()({ + name: 'VSliderTrack', + props: makeVSliderTrackProps(), + emits: {}, + setup(props, _ref) { + let { + slots + } = _ref; + const slider = inject$b(VSliderSymbol); + if (!slider) throw new Error('[Vuetify] v-slider-track must be inside v-slider or v-range-slider'); + const { + color, + parsedTicks, + rounded, + showTicks, + tickSize, + trackColor, + trackFillColor, + trackSize, + vertical, + min, + max, + indexFromEnd + } = slider; + const { + roundedClasses + } = useRounded(rounded); + const { + backgroundColorClasses: trackFillColorClasses, + backgroundColorStyles: trackFillColorStyles + } = useBackgroundColor(trackFillColor); + const { + backgroundColorClasses: trackColorClasses, + backgroundColorStyles: trackColorStyles + } = useBackgroundColor(trackColor); + const startDir = computed$Y(() => `inset-${vertical.value ? 'block' : 'inline'}-${indexFromEnd.value ? 'end' : 'start'}`); + const endDir = computed$Y(() => vertical.value ? 'height' : 'width'); + const backgroundStyles = computed$Y(() => { + return { + [startDir.value]: '0%', + [endDir.value]: '100%' + }; + }); + const trackFillWidth = computed$Y(() => props.stop - props.start); + const trackFillStyles = computed$Y(() => { + return { + [startDir.value]: convertToUnit(props.start, '%'), + [endDir.value]: convertToUnit(trackFillWidth.value, '%') + }; + }); + const computedTicks = computed$Y(() => { + if (!showTicks.value) return []; + const ticks = vertical.value ? parsedTicks.value.slice().reverse() : parsedTicks.value; + return ticks.map((tick, index) => { + const directionValue = tick.value !== min.value && tick.value !== max.value ? convertToUnit(tick.position, '%') : undefined; + return _createVNode$1a("div", { + "key": tick.value, + "class": ['v-slider-track__tick', { + 'v-slider-track__tick--filled': tick.position >= props.start && tick.position <= props.stop, + 'v-slider-track__tick--first': tick.value === min.value, + 'v-slider-track__tick--last': tick.value === max.value + }], + "style": { + [startDir.value]: directionValue + } + }, [(tick.label || slots['tick-label']) && _createVNode$1a("div", { + "class": "v-slider-track__tick-label" + }, [slots['tick-label']?.({ + tick, + index + }) ?? tick.label])]); + }); + }); + useRender(() => { + return _createVNode$1a("div", { + "class": ['v-slider-track', roundedClasses.value, props.class], + "style": [{ + '--v-slider-track-size': convertToUnit(trackSize.value), + '--v-slider-tick-size': convertToUnit(tickSize.value) + }, props.style] + }, [_createVNode$1a("div", { + "class": ['v-slider-track__background', trackColorClasses.value, { + 'v-slider-track__background--opacity': !!color.value || !trackFillColor.value + }], + "style": { + ...backgroundStyles.value, + ...trackColorStyles.value + } + }, null), _createVNode$1a("div", { + "class": ['v-slider-track__fill', trackFillColorClasses.value], + "style": { + ...trackFillStyles.value, + ...trackFillColorStyles.value + } + }, null), showTicks.value && _createVNode$1a("div", { + "class": ['v-slider-track__ticks', { + 'v-slider-track__ticks--always-show': showTicks.value === 'always' + }] + }, [computedTicks.value])]); + }); + return {}; + } +}); + +const {mergeProps:_mergeProps$A,createVNode:_createVNode$19,Fragment:_Fragment$l} = await importShared('vue'); +const {computed: computed$X,ref: ref$p} = await importShared('vue'); +const makeVSliderProps = propsFactory({ + ...makeFocusProps(), + ...makeSliderProps(), + ...makeVInputProps(), + modelValue: { + type: [Number, String], + default: 0 + } +}, 'VSlider'); +const VSlider = genericComponent()({ + name: 'VSlider', + props: makeVSliderProps(), + emits: { + 'update:focused': value => true, + 'update:modelValue': v => true, + start: value => true, + end: value => true + }, + setup(props, _ref) { + let { + slots, + emit + } = _ref; + const thumbContainerRef = ref$p(); + const { + rtlClasses + } = useRtl(); + const steps = useSteps(props); + const model = useProxiedModel(props, 'modelValue', undefined, value => { + return steps.roundValue(value == null ? steps.min.value : value); + }); + const { + min, + max, + mousePressed, + roundValue, + onSliderMousedown, + onSliderTouchstart, + trackContainerRef, + position, + hasLabels, + readonly + } = useSlider({ + props, + steps, + onSliderStart: () => { + emit('start', model.value); + }, + onSliderEnd: _ref2 => { + let { + value + } = _ref2; + const roundedValue = roundValue(value); + model.value = roundedValue; + emit('end', roundedValue); + }, + onSliderMove: _ref3 => { + let { + value + } = _ref3; + return model.value = roundValue(value); + }, + getActiveThumb: () => thumbContainerRef.value?.$el + }); + const { + isFocused, + focus, + blur + } = useFocus(props); + const trackStop = computed$X(() => position(model.value)); + useRender(() => { + const inputProps = VInput.filterProps(props); + const hasPrepend = !!(props.label || slots.label || slots.prepend); + return _createVNode$19(VInput, _mergeProps$A({ + "class": ['v-slider', { + 'v-slider--has-labels': !!slots['tick-label'] || hasLabels.value, + 'v-slider--focused': isFocused.value, + 'v-slider--pressed': mousePressed.value, + 'v-slider--disabled': props.disabled + }, rtlClasses.value, props.class], + "style": props.style + }, inputProps, { + "focused": isFocused.value + }), { + ...slots, + prepend: hasPrepend ? slotProps => _createVNode$19(_Fragment$l, null, [slots.label?.(slotProps) ?? (props.label ? _createVNode$19(VLabel, { + "id": slotProps.id.value, + "class": "v-slider__label", + "text": props.label + }, null) : undefined), slots.prepend?.(slotProps)]) : undefined, + default: _ref4 => { + let { + id, + messagesId + } = _ref4; + return _createVNode$19("div", { + "class": "v-slider__container", + "onMousedown": !readonly.value ? onSliderMousedown : undefined, + "onTouchstartPassive": !readonly.value ? onSliderTouchstart : undefined + }, [_createVNode$19("input", { + "id": id.value, + "name": props.name || id.value, + "disabled": !!props.disabled, + "readonly": !!props.readonly, + "tabindex": "-1", + "value": model.value + }, null), _createVNode$19(VSliderTrack, { + "ref": trackContainerRef, + "start": 0, + "stop": trackStop.value + }, { + 'tick-label': slots['tick-label'] + }), _createVNode$19(VSliderThumb, { + "ref": thumbContainerRef, + "aria-describedby": messagesId.value, + "focused": isFocused.value, + "min": min.value, + "max": max.value, + "modelValue": model.value, + "onUpdate:modelValue": v => model.value = v, + "position": trackStop.value, + "elevation": props.elevation, + "onFocus": focus, + "onBlur": blur, + "ripple": props.ripple, + "name": props.name + }, { + 'thumb-label': slots['thumb-label'] + })]); + } + }); + }); + return {}; + } +}); + +const {createVNode:_createVNode$18} = await importShared('vue'); +const {onUnmounted} = await importShared('vue'); +const makeVColorPickerPreviewProps = propsFactory({ + color: { + type: Object + }, + disabled: Boolean, + hideAlpha: Boolean, + ...makeComponentProps() +}, 'VColorPickerPreview'); +const VColorPickerPreview = defineComponent({ + name: 'VColorPickerPreview', + props: makeVColorPickerPreviewProps(), + emits: { + 'update:color': color => true + }, + setup(props, _ref) { + let { + emit + } = _ref; + const abortController = new AbortController(); + onUnmounted(() => abortController.abort()); + async function openEyeDropper() { + if (!SUPPORTS_EYE_DROPPER) return; + const eyeDropper = new window.EyeDropper(); + try { + const result = await eyeDropper.open({ + signal: abortController.signal + }); + const colorHexValue = HexToHSV(result.sRGBHex); + emit('update:color', { + ...(props.color ?? nullColor), + ...colorHexValue + }); + } catch (e) {} + } + useRender(() => _createVNode$18("div", { + "class": ['v-color-picker-preview', { + 'v-color-picker-preview--hide-alpha': props.hideAlpha + }, props.class], + "style": props.style + }, [SUPPORTS_EYE_DROPPER && _createVNode$18("div", { + "class": "v-color-picker-preview__eye-dropper", + "key": "eyeDropper" + }, [_createVNode$18(VBtn, { + "onClick": openEyeDropper, + "icon": "$eyeDropper", + "variant": "plain", + "density": "comfortable" + }, null)]), _createVNode$18("div", { + "class": "v-color-picker-preview__dot" + }, [_createVNode$18("div", { + "style": { + background: HSVtoCSS(props.color ?? nullColor) + } + }, null)]), _createVNode$18("div", { + "class": "v-color-picker-preview__sliders" + }, [_createVNode$18(VSlider, { + "class": "v-color-picker-preview__track v-color-picker-preview__hue", + "modelValue": props.color?.h, + "onUpdate:modelValue": h => emit('update:color', { + ...(props.color ?? nullColor), + h + }), + "step": 0, + "min": 0, + "max": 360, + "disabled": props.disabled, + "thumbSize": 14, + "trackSize": 8, + "trackFillColor": "white", + "hideDetails": true + }, null), !props.hideAlpha && _createVNode$18(VSlider, { + "class": "v-color-picker-preview__track v-color-picker-preview__alpha", + "modelValue": props.color?.a ?? 1, + "onUpdate:modelValue": a => emit('update:color', { + ...(props.color ?? nullColor), + a + }), + "step": 1 / 256, + "min": 0, + "max": 1, + "disabled": props.disabled, + "thumbSize": 14, + "trackSize": 8, + "trackFillColor": "white", + "hideDetails": true + }, null)])])); + return {}; + } +}); + +const red = { + base: '#f44336', + lighten5: '#ffebee', + lighten4: '#ffcdd2', + lighten3: '#ef9a9a', + lighten2: '#e57373', + lighten1: '#ef5350', + darken1: '#e53935', + darken2: '#d32f2f', + darken3: '#c62828', + darken4: '#b71c1c', + accent1: '#ff8a80', + accent2: '#ff5252', + accent3: '#ff1744', + accent4: '#d50000' +}; +const pink = { + base: '#e91e63', + lighten5: '#fce4ec', + lighten4: '#f8bbd0', + lighten3: '#f48fb1', + lighten2: '#f06292', + lighten1: '#ec407a', + darken1: '#d81b60', + darken2: '#c2185b', + darken3: '#ad1457', + darken4: '#880e4f', + accent1: '#ff80ab', + accent2: '#ff4081', + accent3: '#f50057', + accent4: '#c51162' +}; +const purple = { + base: '#9c27b0', + lighten5: '#f3e5f5', + lighten4: '#e1bee7', + lighten3: '#ce93d8', + lighten2: '#ba68c8', + lighten1: '#ab47bc', + darken1: '#8e24aa', + darken2: '#7b1fa2', + darken3: '#6a1b9a', + darken4: '#4a148c', + accent1: '#ea80fc', + accent2: '#e040fb', + accent3: '#d500f9', + accent4: '#aa00ff' +}; +const deepPurple = { + base: '#673ab7', + lighten5: '#ede7f6', + lighten4: '#d1c4e9', + lighten3: '#b39ddb', + lighten2: '#9575cd', + lighten1: '#7e57c2', + darken1: '#5e35b1', + darken2: '#512da8', + darken3: '#4527a0', + darken4: '#311b92', + accent1: '#b388ff', + accent2: '#7c4dff', + accent3: '#651fff', + accent4: '#6200ea' +}; +const indigo = { + base: '#3f51b5', + lighten5: '#e8eaf6', + lighten4: '#c5cae9', + lighten3: '#9fa8da', + lighten2: '#7986cb', + lighten1: '#5c6bc0', + darken1: '#3949ab', + darken2: '#303f9f', + darken3: '#283593', + darken4: '#1a237e', + accent1: '#8c9eff', + accent2: '#536dfe', + accent3: '#3d5afe', + accent4: '#304ffe' +}; +const blue = { + base: '#2196f3', + lighten5: '#e3f2fd', + lighten4: '#bbdefb', + lighten3: '#90caf9', + lighten2: '#64b5f6', + lighten1: '#42a5f5', + darken1: '#1e88e5', + darken2: '#1976d2', + darken3: '#1565c0', + darken4: '#0d47a1', + accent1: '#82b1ff', + accent2: '#448aff', + accent3: '#2979ff', + accent4: '#2962ff' +}; +const lightBlue = { + base: '#03a9f4', + lighten5: '#e1f5fe', + lighten4: '#b3e5fc', + lighten3: '#81d4fa', + lighten2: '#4fc3f7', + lighten1: '#29b6f6', + darken1: '#039be5', + darken2: '#0288d1', + darken3: '#0277bd', + darken4: '#01579b', + accent1: '#80d8ff', + accent2: '#40c4ff', + accent3: '#00b0ff', + accent4: '#0091ea' +}; +const cyan = { + base: '#00bcd4', + lighten5: '#e0f7fa', + lighten4: '#b2ebf2', + lighten3: '#80deea', + lighten2: '#4dd0e1', + lighten1: '#26c6da', + darken1: '#00acc1', + darken2: '#0097a7', + darken3: '#00838f', + darken4: '#006064', + accent1: '#84ffff', + accent2: '#18ffff', + accent3: '#00e5ff', + accent4: '#00b8d4' +}; +const teal = { + base: '#009688', + lighten5: '#e0f2f1', + lighten4: '#b2dfdb', + lighten3: '#80cbc4', + lighten2: '#4db6ac', + lighten1: '#26a69a', + darken1: '#00897b', + darken2: '#00796b', + darken3: '#00695c', + darken4: '#004d40', + accent1: '#a7ffeb', + accent2: '#64ffda', + accent3: '#1de9b6', + accent4: '#00bfa5' +}; +const green = { + base: '#4caf50', + lighten5: '#e8f5e9', + lighten4: '#c8e6c9', + lighten3: '#a5d6a7', + lighten2: '#81c784', + lighten1: '#66bb6a', + darken1: '#43a047', + darken2: '#388e3c', + darken3: '#2e7d32', + darken4: '#1b5e20', + accent1: '#b9f6ca', + accent2: '#69f0ae', + accent3: '#00e676', + accent4: '#00c853' +}; +const lightGreen = { + base: '#8bc34a', + lighten5: '#f1f8e9', + lighten4: '#dcedc8', + lighten3: '#c5e1a5', + lighten2: '#aed581', + lighten1: '#9ccc65', + darken1: '#7cb342', + darken2: '#689f38', + darken3: '#558b2f', + darken4: '#33691e', + accent1: '#ccff90', + accent2: '#b2ff59', + accent3: '#76ff03', + accent4: '#64dd17' +}; +const lime = { + base: '#cddc39', + lighten5: '#f9fbe7', + lighten4: '#f0f4c3', + lighten3: '#e6ee9c', + lighten2: '#dce775', + lighten1: '#d4e157', + darken1: '#c0ca33', + darken2: '#afb42b', + darken3: '#9e9d24', + darken4: '#827717', + accent1: '#f4ff81', + accent2: '#eeff41', + accent3: '#c6ff00', + accent4: '#aeea00' +}; +const yellow = { + base: '#ffeb3b', + lighten5: '#fffde7', + lighten4: '#fff9c4', + lighten3: '#fff59d', + lighten2: '#fff176', + lighten1: '#ffee58', + darken1: '#fdd835', + darken2: '#fbc02d', + darken3: '#f9a825', + darken4: '#f57f17', + accent1: '#ffff8d', + accent2: '#ffff00', + accent3: '#ffea00', + accent4: '#ffd600' +}; +const amber = { + base: '#ffc107', + lighten5: '#fff8e1', + lighten4: '#ffecb3', + lighten3: '#ffe082', + lighten2: '#ffd54f', + lighten1: '#ffca28', + darken1: '#ffb300', + darken2: '#ffa000', + darken3: '#ff8f00', + darken4: '#ff6f00', + accent1: '#ffe57f', + accent2: '#ffd740', + accent3: '#ffc400', + accent4: '#ffab00' +}; +const orange = { + base: '#ff9800', + lighten5: '#fff3e0', + lighten4: '#ffe0b2', + lighten3: '#ffcc80', + lighten2: '#ffb74d', + lighten1: '#ffa726', + darken1: '#fb8c00', + darken2: '#f57c00', + darken3: '#ef6c00', + darken4: '#e65100', + accent1: '#ffd180', + accent2: '#ffab40', + accent3: '#ff9100', + accent4: '#ff6d00' +}; +const deepOrange = { + base: '#ff5722', + lighten5: '#fbe9e7', + lighten4: '#ffccbc', + lighten3: '#ffab91', + lighten2: '#ff8a65', + lighten1: '#ff7043', + darken1: '#f4511e', + darken2: '#e64a19', + darken3: '#d84315', + darken4: '#bf360c', + accent1: '#ff9e80', + accent2: '#ff6e40', + accent3: '#ff3d00', + accent4: '#dd2c00' +}; +const brown = { + base: '#795548', + lighten5: '#efebe9', + lighten4: '#d7ccc8', + lighten3: '#bcaaa4', + lighten2: '#a1887f', + lighten1: '#8d6e63', + darken1: '#6d4c41', + darken2: '#5d4037', + darken3: '#4e342e', + darken4: '#3e2723' +}; +const blueGrey = { + base: '#607d8b', + lighten5: '#eceff1', + lighten4: '#cfd8dc', + lighten3: '#b0bec5', + lighten2: '#90a4ae', + lighten1: '#78909c', + darken1: '#546e7a', + darken2: '#455a64', + darken3: '#37474f', + darken4: '#263238' +}; +const grey = { + base: '#9e9e9e', + lighten5: '#fafafa', + lighten4: '#f5f5f5', + lighten3: '#eeeeee', + lighten2: '#e0e0e0', + lighten1: '#bdbdbd', + darken1: '#757575', + darken2: '#616161', + darken3: '#424242', + darken4: '#212121' +}; +const shades = { + black: '#000000', + white: '#ffffff', + transparent: '#ffffff00' +}; +const colors = { + red, + pink, + purple, + deepPurple, + indigo, + blue, + lightBlue, + cyan, + teal, + green, + lightGreen, + lime, + yellow, + amber, + orange, + deepOrange, + brown, + blueGrey, + grey, + shades +}; + +const {createVNode:_createVNode$17} = await importShared('vue'); +const makeVColorPickerSwatchesProps = propsFactory({ + swatches: { + type: Array, + default: () => parseDefaultColors(colors) + }, + disabled: Boolean, + color: Object, + maxHeight: [Number, String], + ...makeComponentProps() +}, 'VColorPickerSwatches'); +function parseDefaultColors(colors) { + return Object.keys(colors).map(key => { + const color = colors[key]; + return color.base ? [color.base, color.darken4, color.darken3, color.darken2, color.darken1, color.lighten1, color.lighten2, color.lighten3, color.lighten4, color.lighten5] : [color.black, color.white, color.transparent]; + }); +} +const VColorPickerSwatches = defineComponent({ + name: 'VColorPickerSwatches', + props: makeVColorPickerSwatchesProps(), + emits: { + 'update:color': color => true + }, + setup(props, _ref) { + let { + emit + } = _ref; + useRender(() => _createVNode$17("div", { + "class": ['v-color-picker-swatches', props.class], + "style": [{ + maxHeight: convertToUnit(props.maxHeight) + }, props.style] + }, [_createVNode$17("div", null, [props.swatches.map(swatch => _createVNode$17("div", { + "class": "v-color-picker-swatches__swatch" + }, [swatch.map(color => { + const rgba = parseColor(color); + const hsva = RGBtoHSV(rgba); + const background = RGBtoCSS(rgba); + return _createVNode$17("div", { + "class": "v-color-picker-swatches__color", + "onClick": () => hsva && emit('update:color', hsva) + }, [_createVNode$17("div", { + "style": { + background + } + }, [props.color && deepEqual(props.color, hsva) ? _createVNode$17(VIcon, { + "size": "x-small", + "icon": "$success", + "color": getContrast(color, '#FFFFFF') > 2 ? 'white' : 'black' + }, null) : undefined])]); + })]))])])); + return {}; + } +}); + +const {createVNode:_createVNode$16,resolveDirective:_resolveDirective$u} = await importShared('vue'); +const {toRef: toRef$l} = await importShared('vue'); +const makeVSheetProps = propsFactory({ + color: String, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDimensionProps(), + ...makeElevationProps(), + ...makeLocationProps(), + ...makePositionProps(), + ...makeRoundedProps(), + ...makeTagProps(), + ...makeThemeProps() +}, 'VSheet'); +const VSheet = genericComponent()({ + name: 'VSheet', + props: makeVSheetProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$l(props, 'color')); + const { + borderClasses + } = useBorder(props); + const { + dimensionStyles + } = useDimension(props); + const { + elevationClasses + } = useElevation(props); + const { + locationStyles + } = useLocation(props); + const { + positionClasses + } = usePosition(props); + const { + roundedClasses + } = useRounded(props); + useRender(() => _createVNode$16(props.tag, { + "class": ['v-sheet', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, props.class], + "style": [backgroundColorStyles.value, dimensionStyles.value, locationStyles.value, props.style] + }, slots)); + return {}; + } +}); + +const {mergeProps:_mergeProps$z,createVNode:_createVNode$15} = await importShared('vue'); +const {computed: computed$W,onBeforeMount,ref: ref$o,watch: watch$f} = await importShared('vue'); +const makeVColorPickerProps = propsFactory({ + canvasHeight: { + type: [String, Number], + default: 150 + }, + disabled: Boolean, + dotSize: { + type: [Number, String], + default: 10 + }, + hideCanvas: Boolean, + hideSliders: Boolean, + hideInputs: Boolean, + mode: { + type: String, + default: 'rgba', + validator: v => Object.keys(modes).includes(v) + }, + modes: { + type: Array, + default: () => Object.keys(modes), + validator: v => Array.isArray(v) && v.every(m => Object.keys(modes).includes(m)) + }, + showSwatches: Boolean, + swatches: Array, + swatchesMaxHeight: { + type: [Number, String], + default: 150 + }, + modelValue: { + type: [Object, String] + }, + ...omit(makeVSheetProps({ + width: 300 + }), ['height', 'location', 'minHeight', 'maxHeight', 'minWidth', 'maxWidth']) +}, 'VColorPicker'); +const VColorPicker = defineComponent({ + name: 'VColorPicker', + props: makeVColorPickerProps(), + emits: { + 'update:modelValue': color => true, + 'update:mode': mode => true + }, + setup(props) { + const mode = useProxiedModel(props, 'mode'); + const hue = ref$o(null); + const model = useProxiedModel(props, 'modelValue', undefined, v => { + if (v == null || v === '') return null; + let c; + try { + c = RGBtoHSV(parseColor(v)); + } catch (err) { + consoleWarn(err); + return null; + } + return c; + }, v => { + if (!v) return null; + return extractColor(v, props.modelValue); + }); + const currentColor = computed$W(() => { + return model.value ? { + ...model.value, + h: hue.value ?? model.value.h + } : null; + }); + const { + rtlClasses + } = useRtl(); + let externalChange = true; + watch$f(model, v => { + if (!externalChange) { + // prevent hue shift from rgb conversion inaccuracy + externalChange = true; + return; + } + if (!v) return; + hue.value = v.h; + }, { + immediate: true + }); + const updateColor = hsva => { + externalChange = false; + hue.value = hsva.h; + model.value = hsva; + }; + onBeforeMount(() => { + if (!props.modes.includes(mode.value)) mode.value = props.modes[0]; + }); + provideDefaults({ + VSlider: { + color: undefined, + trackColor: undefined, + trackFillColor: undefined + } + }); + useRender(() => { + const sheetProps = VSheet.filterProps(props); + return _createVNode$15(VSheet, _mergeProps$z({ + "rounded": props.rounded, + "elevation": props.elevation, + "theme": props.theme, + "class": ['v-color-picker', rtlClasses.value, props.class], + "style": [{ + '--v-color-picker-color-hsv': HSVtoCSS({ + ...(currentColor.value ?? nullColor), + a: 1 + }) + }, props.style] + }, sheetProps, { + "maxWidth": props.width + }), { + default: () => [!props.hideCanvas && _createVNode$15(VColorPickerCanvas, { + "key": "canvas", + "color": currentColor.value, + "onUpdate:color": updateColor, + "disabled": props.disabled, + "dotSize": props.dotSize, + "width": props.width, + "height": props.canvasHeight + }, null), (!props.hideSliders || !props.hideInputs) && _createVNode$15("div", { + "key": "controls", + "class": "v-color-picker__controls" + }, [!props.hideSliders && _createVNode$15(VColorPickerPreview, { + "key": "preview", + "color": currentColor.value, + "onUpdate:color": updateColor, + "hideAlpha": !mode.value.endsWith('a'), + "disabled": props.disabled + }, null), !props.hideInputs && _createVNode$15(VColorPickerEdit, { + "key": "edit", + "modes": props.modes, + "mode": mode.value, + "onUpdate:mode": m => mode.value = m, + "color": currentColor.value, + "onUpdate:color": updateColor, + "disabled": props.disabled + }, null)]), props.showSwatches && _createVNode$15(VColorPickerSwatches, { + "key": "swatches", + "color": currentColor.value, + "onUpdate:color": updateColor, + "maxHeight": props.swatchesMaxHeight, + "swatches": props.swatches, + "disabled": props.disabled + }, null)] + }); + }); + return {}; + } +}); + +const {createTextVNode:_createTextVNode$4,mergeProps:_mergeProps$y,createVNode:_createVNode$14,Fragment:_Fragment$k} = await importShared('vue'); +const {computed: computed$V,mergeProps: mergeProps$5,nextTick: nextTick$9,ref: ref$n,shallowRef: shallowRef$f,watch: watch$e} = await importShared('vue'); +function highlightResult(text, matches, length) { + if (matches == null) return text; + if (Array.isArray(matches)) throw new Error('Multiple matches is not implemented'); + return typeof matches === 'number' && ~matches ? _createVNode$14(_Fragment$k, null, [_createVNode$14("span", { + "class": "v-combobox__unmask" + }, [text.substr(0, matches)]), _createVNode$14("span", { + "class": "v-combobox__mask" + }, [text.substr(matches, length)]), _createVNode$14("span", { + "class": "v-combobox__unmask" + }, [text.substr(matches + length)])]) : text; +} +const makeVComboboxProps = propsFactory({ + autoSelectFirst: { + type: [Boolean, String] + }, + clearOnSelect: { + type: Boolean, + default: true + }, + delimiters: Array, + ...makeFilterProps({ + filterKeys: ['title'] + }), + ...makeSelectProps({ + hideNoData: true, + returnObject: true + }), + ...omit(makeVTextFieldProps({ + modelValue: null, + role: 'combobox' + }), ['validationValue', 'dirty', 'appendInnerIcon']), + ...makeTransitionProps({ + transition: false + }) +}, 'VCombobox'); +const VCombobox = genericComponent()({ + name: 'VCombobox', + props: makeVComboboxProps(), + emits: { + 'update:focused': focused => true, + 'update:modelValue': value => true, + 'update:search': value => true, + 'update:menu': value => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const { + t + } = useLocale(); + const vTextFieldRef = ref$n(); + const isFocused = shallowRef$f(false); + const isPristine = shallowRef$f(true); + const listHasFocus = shallowRef$f(false); + const vMenuRef = ref$n(); + const vVirtualScrollRef = ref$n(); + const _menu = useProxiedModel(props, 'menu'); + const menu = computed$V({ + get: () => _menu.value, + set: v => { + if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return; + _menu.value = v; + } + }); + const selectionIndex = shallowRef$f(-1); + let cleared = false; + const color = computed$V(() => vTextFieldRef.value?.color); + const label = computed$V(() => menu.value ? props.closeText : props.openText); + const { + items, + transformIn, + transformOut + } = useItems(props); + const { + textColorClasses, + textColorStyles + } = useTextColor(color); + const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => { + const transformed = transformOut(v); + return props.multiple ? transformed : transformed[0] ?? null; + }); + const form = useForm(); + const hasChips = computed$V(() => !!(props.chips || slots.chip)); + const hasSelectionSlot = computed$V(() => hasChips.value || !!slots.selection); + const _search = shallowRef$f(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : ''); + const search = computed$V({ + get: () => { + return _search.value; + }, + set: val => { + _search.value = val ?? ''; + if (!props.multiple && !hasSelectionSlot.value) { + model.value = [transformItem$3(props, val)]; + } + if (val && props.multiple && props.delimiters?.length) { + const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`)); + if (values.length > 1) { + values.forEach(v => { + v = v.trim(); + if (v) select(transformItem$3(props, v)); + }); + _search.value = ''; + } + } + if (!val) selectionIndex.value = -1; + isPristine.value = !val; + } + }); + const counterValue = computed$V(() => { + return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : props.multiple ? model.value.length : search.value.length; + }); + watch$e(_search, value => { + if (cleared) { + // wait for clear to finish, VTextField sets _search to null + // then search computed triggers and updates _search to '' + nextTick$9(() => cleared = false); + } else if (isFocused.value && !menu.value) { + menu.value = true; + } + emit('update:search', value); + }); + watch$e(model, value => { + if (!props.multiple && !hasSelectionSlot.value) { + _search.value = value[0]?.title ?? ''; + } + }); + const { + filteredItems, + getMatches + } = useFilter(props, items, () => isPristine.value ? '' : search.value); + const displayItems = computed$V(() => { + if (props.hideSelected) { + return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value)); + } + return filteredItems.value; + }); + const selectedValues = computed$V(() => model.value.map(selection => selection.value)); + const highlightFirst = computed$V(() => { + const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title; + return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value; + }); + const menuDisabled = computed$V(() => props.hideNoData && !displayItems.value.length || props.readonly || form?.isReadonly.value); + const listRef = ref$n(); + const listEvents = useScrolling(listRef, vTextFieldRef); + function onClear(e) { + cleared = true; + if (props.openOnClear) { + menu.value = true; + } + } + function onMousedownControl() { + if (menuDisabled.value) return; + menu.value = true; + } + function onMousedownMenuIcon(e) { + if (menuDisabled.value) return; + if (isFocused.value) { + e.preventDefault(); + e.stopPropagation(); + } + menu.value = !menu.value; + } + function onListKeydown(e) { + if (checkPrintable(e)) { + vTextFieldRef.value?.focus(); + } + } + // eslint-disable-next-line complexity + function onKeydown(e) { + if (isComposingIgnoreKey(e) || props.readonly || form?.isReadonly.value) return; + const selectionStart = vTextFieldRef.value.selectionStart; + const length = model.value.length; + if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) { + e.preventDefault(); + } + if (['Enter', 'ArrowDown'].includes(e.key)) { + menu.value = true; + } + if (['Escape'].includes(e.key)) { + menu.value = false; + } + if (['Enter', 'Escape', 'Tab'].includes(e.key)) { + if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => { + let { + value + } = _ref2; + return value === displayItems.value[0].value; + })) { + select(filteredItems.value[0]); + } + isPristine.value = true; + } + if (e.key === 'ArrowDown' && highlightFirst.value) { + listRef.value?.focus('next'); + } + if (e.key === 'Enter' && search.value) { + select(transformItem$3(props, search.value)); + if (hasSelectionSlot.value) _search.value = ''; + } + if (['Backspace', 'Delete'].includes(e.key)) { + if (!props.multiple && hasSelectionSlot.value && model.value.length > 0 && !search.value) return select(model.value[0], false); + if (~selectionIndex.value) { + const originalSelectionIndex = selectionIndex.value; + select(model.value[selectionIndex.value], false); + selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex; + } else if (e.key === 'Backspace' && !search.value) { + selectionIndex.value = length - 1; + } + } + if (!props.multiple) return; + if (e.key === 'ArrowLeft') { + if (selectionIndex.value < 0 && selectionStart > 0) return; + const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1; + if (model.value[prev]) { + selectionIndex.value = prev; + } else { + selectionIndex.value = -1; + vTextFieldRef.value.setSelectionRange(search.value.length, search.value.length); + } + } + if (e.key === 'ArrowRight') { + if (selectionIndex.value < 0) return; + const next = selectionIndex.value + 1; + if (model.value[next]) { + selectionIndex.value = next; + } else { + selectionIndex.value = -1; + vTextFieldRef.value.setSelectionRange(0, 0); + } + } + } + function onAfterEnter() { + if (props.eager) { + vVirtualScrollRef.value?.calculateVisibleItems(); + } + } + function onAfterLeave() { + if (isFocused.value) { + isPristine.value = true; + vTextFieldRef.value?.focus(); + } + } + /** @param set - null means toggle */ + function select(item) { + let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + if (!item || item.props.disabled) return; + if (props.multiple) { + const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value)); + const add = set == null ? !~index : set; + if (~index) { + const value = add ? [...model.value, item] : [...model.value]; + value.splice(index, 1); + model.value = value; + } else if (add) { + model.value = [...model.value, item]; + } + if (props.clearOnSelect) { + search.value = ''; + } + } else { + const add = set !== false; + model.value = add ? [item] : []; + _search.value = add && !hasSelectionSlot.value ? item.title : ''; + + // watch for search watcher to trigger + nextTick$9(() => { + menu.value = false; + isPristine.value = true; + }); + } + } + function onFocusin(e) { + isFocused.value = true; + setTimeout(() => { + listHasFocus.value = true; + }); + } + function onFocusout(e) { + listHasFocus.value = false; + } + function onUpdateModelValue(v) { + if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = []; + } + watch$e(isFocused, (val, oldVal) => { + if (val || val === oldVal) return; + selectionIndex.value = -1; + menu.value = false; + if (search.value) { + if (props.multiple) { + select(transformItem$3(props, search.value)); + return; + } + if (!hasSelectionSlot.value) return; + if (model.value.some(_ref3 => { + let { + title + } = _ref3; + return title === search.value; + })) { + _search.value = ''; + } else { + select(transformItem$3(props, search.value)); + } + } + }); + watch$e(menu, () => { + if (!props.hideSelected && menu.value && model.value.length) { + const index = displayItems.value.findIndex(item => model.value.some(s => props.valueComparator(s.value, item.value))); + IN_BROWSER && window.requestAnimationFrame(() => { + index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index); + }); + } + }); + watch$e(() => props.items, (newVal, oldVal) => { + if (menu.value) return; + if (isFocused.value && !oldVal.length && newVal.length) { + menu.value = true; + } + }); + useRender(() => { + const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']); + const isDirty = model.value.length > 0; + const textFieldProps = VTextField.filterProps(props); + return _createVNode$14(VTextField, _mergeProps$y({ + "ref": vTextFieldRef + }, textFieldProps, { + "modelValue": search.value, + "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue], + "focused": isFocused.value, + "onUpdate:focused": $event => isFocused.value = $event, + "validationValue": model.externalValue, + "counterValue": counterValue.value, + "dirty": isDirty, + "class": ['v-combobox', { + 'v-combobox--active-menu': menu.value, + 'v-combobox--chips': !!props.chips, + 'v-combobox--selection-slot': !!hasSelectionSlot.value, + 'v-combobox--selecting-index': selectionIndex.value > -1, + [`v-combobox--${props.multiple ? 'multiple' : 'single'}`]: true + }, props.class], + "style": props.style, + "readonly": props.readonly, + "placeholder": isDirty ? undefined : props.placeholder, + "onClick:clear": onClear, + "onMousedown:control": onMousedownControl, + "onKeydown": onKeydown + }), { + ...slots, + default: () => _createVNode$14(_Fragment$k, null, [_createVNode$14(VMenu, _mergeProps$y({ + "ref": vMenuRef, + "modelValue": menu.value, + "onUpdate:modelValue": $event => menu.value = $event, + "activator": "parent", + "contentClass": "v-combobox__content", + "disabled": menuDisabled.value, + "eager": props.eager, + "maxHeight": 310, + "openOnClick": false, + "closeOnContentClick": false, + "transition": props.transition, + "onAfterEnter": onAfterEnter, + "onAfterLeave": onAfterLeave + }, props.menuProps), { + default: () => [hasList && _createVNode$14(VList, _mergeProps$y({ + "ref": listRef, + "selected": selectedValues.value, + "selectStrategy": props.multiple ? 'independent' : 'single-independent', + "onMousedown": e => e.preventDefault(), + "onKeydown": onListKeydown, + "onFocusin": onFocusin, + "onFocusout": onFocusout, + "tabindex": "-1", + "aria-live": "polite", + "color": props.itemColor ?? props.color + }, listEvents, props.listProps), { + default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? _createVNode$14(VListItem, { + "title": t(props.noDataText) + }, null)), _createVNode$14(VVirtualScroll, { + "ref": vVirtualScrollRef, + "renderless": true, + "items": displayItems.value + }, { + default: _ref4 => { + let { + item, + index, + itemRef + } = _ref4; + const itemProps = mergeProps$5(item.props, { + ref: itemRef, + key: index, + active: highlightFirst.value && index === 0 ? true : undefined, + onClick: () => select(item, null) + }); + return slots.item?.({ + item, + index, + props: itemProps + }) ?? _createVNode$14(VListItem, _mergeProps$y(itemProps, { + "role": "option" + }), { + prepend: _ref5 => { + let { + isSelected + } = _ref5; + return _createVNode$14(_Fragment$k, null, [props.multiple && !props.hideSelected ? _createVNode$14(VCheckboxBtn, { + "key": item.value, + "modelValue": isSelected, + "ripple": false, + "tabindex": "-1" + }, null) : undefined, item.props.prependAvatar && _createVNode$14(VAvatar, { + "image": item.props.prependAvatar + }, null), item.props.prependIcon && _createVNode$14(VIcon, { + "icon": item.props.prependIcon + }, null)]); + }, + title: () => { + return isPristine.value ? item.title : highlightResult(item.title, getMatches(item)?.title, search.value?.length ?? 0); + } + }); + } + }), slots['append-item']?.()] + })] + }), model.value.map((item, index) => { + function onChipClose(e) { + e.stopPropagation(); + e.preventDefault(); + select(item, false); + } + const slotProps = { + 'onClick:close': onChipClose, + onKeydown(e) { + if (e.key !== 'Enter' && e.key !== ' ') return; + e.preventDefault(); + e.stopPropagation(); + onChipClose(e); + }, + onMousedown(e) { + e.preventDefault(); + e.stopPropagation(); + }, + modelValue: true, + 'onUpdate:modelValue': undefined + }; + const hasSlot = hasChips.value ? !!slots.chip : !!slots.selection; + const slotContent = hasSlot ? ensureValidVNode(hasChips.value ? slots.chip({ + item, + index, + props: slotProps + }) : slots.selection({ + item, + index + })) : undefined; + if (hasSlot && !slotContent) return undefined; + return _createVNode$14("div", { + "key": item.value, + "class": ['v-combobox__selection', index === selectionIndex.value && ['v-combobox__selection--selected', textColorClasses.value]], + "style": index === selectionIndex.value ? textColorStyles.value : {} + }, [hasChips.value ? !slots.chip ? _createVNode$14(VChip, _mergeProps$y({ + "key": "chip", + "closable": props.closableChips, + "size": "small", + "text": item.title, + "disabled": item.props.disabled + }, slotProps), null) : _createVNode$14(VDefaultsProvider, { + "key": "chip-defaults", + "defaults": { + VChip: { + closable: props.closableChips, + size: 'small', + text: item.title + } + } + }, { + default: () => [slotContent] + }) : slotContent ?? _createVNode$14("span", { + "class": "v-combobox__selection-text" + }, [item.title, props.multiple && index < model.value.length - 1 && _createVNode$14("span", { + "class": "v-combobox__selection-comma" + }, [_createTextVNode$4(",")])])]); + })]), + 'append-inner': function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return _createVNode$14(_Fragment$k, null, [slots['append-inner']?.(...args), (!props.hideNoData || props.items.length) && props.menuIcon ? _createVNode$14(VIcon, { + "class": "v-combobox__menu-icon", + "icon": props.menuIcon, + "onMousedown": onMousedownMenuIcon, + "onClick": noop, + "aria-label": t(label.value), + "title": t(label.value), + "tabindex": "-1" + }, null) : undefined]); + } + }); + }); + return forwardRefs({ + isFocused, + isPristine, + menu, + search, + selectionIndex, + filteredItems, + select + }, vTextFieldRef); + } +}); + +const {createVNode:_createVNode$13,Fragment:_Fragment$j} = await importShared('vue'); +const {computed: computed$U,ref: ref$m,toRaw,watchEffect: watchEffect$9} = await importShared('vue'); +const makeVConfirmEditProps = propsFactory({ + modelValue: null, + color: String, + cancelText: { + type: String, + default: '$vuetify.confirmEdit.cancel' + }, + okText: { + type: String, + default: '$vuetify.confirmEdit.ok' + } +}, 'VConfirmEdit'); +const VConfirmEdit = genericComponent()({ + name: 'VConfirmEdit', + props: makeVConfirmEditProps(), + emits: { + cancel: () => true, + save: value => true, + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const model = useProxiedModel(props, 'modelValue'); + const internalModel = ref$m(); + watchEffect$9(() => { + internalModel.value = structuredClone(toRaw(model.value)); + }); + const { + t + } = useLocale(); + const isPristine = computed$U(() => { + return deepEqual(model.value, internalModel.value); + }); + function save() { + model.value = internalModel.value; + emit('save', internalModel.value); + } + function cancel() { + internalModel.value = structuredClone(toRaw(model.value)); + emit('cancel'); + } + let actionsUsed = false; + useRender(() => { + const actions = _createVNode$13(_Fragment$j, null, [_createVNode$13(VBtn, { + "disabled": isPristine.value, + "variant": "text", + "color": props.color, + "onClick": cancel, + "text": t(props.cancelText) + }, null), _createVNode$13(VBtn, { + "disabled": isPristine.value, + "variant": "text", + "color": props.color, + "onClick": save, + "text": t(props.okText) + }, null)]); + return _createVNode$13(_Fragment$j, null, [slots.default?.({ + model: internalModel, + save, + cancel, + isPristine: isPristine.value, + get actions() { + actionsUsed = true; + return actions; + } + }), !actionsUsed && actions]); + }); + return { + save, + cancel, + isPristine + }; + } +}); + +const {inject: inject$a,provide: provide$7,toRef: toRef$k} = await importShared('vue'); +const makeDataTableExpandProps = propsFactory({ + expandOnClick: Boolean, + showExpand: Boolean, + expanded: { + type: Array, + default: () => [] + } +}, 'DataTable-expand'); +const VDataTableExpandedKey = Symbol.for('vuetify:datatable:expanded'); +function provideExpanded(props) { + const expandOnClick = toRef$k(props, 'expandOnClick'); + const expanded = useProxiedModel(props, 'expanded', props.expanded, v => { + return new Set(v); + }, v => { + return [...v.values()]; + }); + function expand(item, value) { + const newExpanded = new Set(expanded.value); + if (!value) { + newExpanded.delete(item.value); + } else { + newExpanded.add(item.value); + } + expanded.value = newExpanded; + } + function isExpanded(item) { + return expanded.value.has(item.value); + } + function toggleExpand(item) { + expand(item, !isExpanded(item)); + } + const data = { + expand, + expanded, + expandOnClick, + isExpanded, + toggleExpand + }; + provide$7(VDataTableExpandedKey, data); + return data; +} +function useExpanded() { + const data = inject$a(VDataTableExpandedKey); + if (!data) throw new Error('foo'); + return data; +} + +const {computed: computed$T,inject: inject$9,provide: provide$6,ref: ref$l} = await importShared('vue'); +const makeDataTableGroupProps = propsFactory({ + groupBy: { + type: Array, + default: () => [] + } +}, 'DataTable-group'); +const VDataTableGroupSymbol = Symbol.for('vuetify:data-table-group'); +function createGroupBy(props) { + const groupBy = useProxiedModel(props, 'groupBy'); + return { + groupBy + }; +} +function provideGroupBy(options) { + const { + disableSort, + groupBy, + sortBy + } = options; + const opened = ref$l(new Set()); + const sortByWithGroups = computed$T(() => { + return groupBy.value.map(val => ({ + ...val, + order: val.order ?? false + })).concat(disableSort?.value ? [] : sortBy.value); + }); + function isGroupOpen(group) { + return opened.value.has(group.id); + } + function toggleGroup(group) { + const newOpened = new Set(opened.value); + if (!isGroupOpen(group)) newOpened.add(group.id);else newOpened.delete(group.id); + opened.value = newOpened; + } + function extractRows(items) { + function dive(group) { + const arr = []; + for (const item of group.items) { + if ('type' in item && item.type === 'group') { + arr.push(...dive(item)); + } else { + arr.push(item); + } + } + return arr; + } + return dive({ + items}); + } + + // onBeforeMount(() => { + // for (const key of groupedItems.value.keys()) { + // opened.value.add(key) + // } + // }) + + const data = { + sortByWithGroups, + toggleGroup, + opened, + groupBy, + extractRows, + isGroupOpen + }; + provide$6(VDataTableGroupSymbol, data); + return data; +} +function useGroupBy() { + const data = inject$9(VDataTableGroupSymbol); + if (!data) throw new Error('Missing group!'); + return data; +} +function groupItemsByProperty(items, groupBy) { + if (!items.length) return []; + const groups = new Map(); + for (const item of items) { + const value = getObjectValueByPath(item.raw, groupBy); + if (!groups.has(value)) { + groups.set(value, []); + } + groups.get(value).push(item); + } + return groups; +} +function groupItems(items, groupBy) { + let depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + let prefix = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'root'; + if (!groupBy.length) return []; + const groupedItems = groupItemsByProperty(items, groupBy[0]); + const groups = []; + const rest = groupBy.slice(1); + groupedItems.forEach((items, value) => { + const key = groupBy[0]; + const id = `${prefix}_${key}_${value}`; + groups.push({ + depth, + id, + key, + value, + items: rest.length ? groupItems(items, rest, depth + 1, id) : items, + type: 'group' + }); + }); + return groups; +} +function flattenItems(items, opened) { + const flatItems = []; + for (const item of items) { + // TODO: make this better + if ('type' in item && item.type === 'group') { + if (item.value != null) { + flatItems.push(item); + } + if (opened.has(item.id) || item.value == null) { + flatItems.push(...flattenItems(item.items, opened)); + } + } else { + flatItems.push(item); + } + } + return flatItems; +} +function useGroupedItems(items, groupBy, opened) { + const flatItems = computed$T(() => { + if (!groupBy.value.length) return items.value; + const groupedItems = groupItems(items.value, groupBy.value.map(item => item.key)); + return flattenItems(groupedItems, opened.value); + }); + return { + flatItems + }; +} + +// Utilities +const {computed: computed$S,watch: watch$d} = await importShared('vue'); +function useOptions(_ref) { + let { + page, + itemsPerPage, + sortBy, + groupBy, + search + } = _ref; + const vm = getCurrentInstance('VDataTable'); + const options = computed$S(() => ({ + page: page.value, + itemsPerPage: itemsPerPage.value, + sortBy: sortBy.value, + groupBy: groupBy.value, + search: search.value + })); + let oldOptions = null; + watch$d(options, () => { + if (deepEqual(oldOptions, options.value)) return; + + // Reset page when searching + if (oldOptions && oldOptions.search !== options.value.search) { + page.value = 1; + } + vm.emit('update:options', options.value); + oldOptions = options.value; + }, { + deep: true, + immediate: true + }); +} + +const {computed: computed$R,inject: inject$8,provide: provide$5,watch: watch$c} = await importShared('vue'); +const makeDataTablePaginateProps = propsFactory({ + page: { + type: [Number, String], + default: 1 + }, + itemsPerPage: { + type: [Number, String], + default: 10 + } +}, 'DataTable-paginate'); +const VDataTablePaginationSymbol = Symbol.for('vuetify:data-table-pagination'); +function createPagination(props) { + const page = useProxiedModel(props, 'page', undefined, value => +(value ?? 1)); + const itemsPerPage = useProxiedModel(props, 'itemsPerPage', undefined, value => +(value ?? 10)); + return { + page, + itemsPerPage + }; +} +function providePagination(options) { + const { + page, + itemsPerPage, + itemsLength + } = options; + const startIndex = computed$R(() => { + if (itemsPerPage.value === -1) return 0; + return itemsPerPage.value * (page.value - 1); + }); + const stopIndex = computed$R(() => { + if (itemsPerPage.value === -1) return itemsLength.value; + return Math.min(itemsLength.value, startIndex.value + itemsPerPage.value); + }); + const pageCount = computed$R(() => { + if (itemsPerPage.value === -1 || itemsLength.value === 0) return 1; + return Math.ceil(itemsLength.value / itemsPerPage.value); + }); + + // Don't run immediately, items may not have been loaded yet: #17966 + watch$c([page, pageCount], () => { + if (page.value > pageCount.value) { + page.value = pageCount.value; + } + }); + function setItemsPerPage(value) { + itemsPerPage.value = value; + page.value = 1; + } + function nextPage() { + page.value = clamp(page.value + 1, 1, pageCount.value); + } + function prevPage() { + page.value = clamp(page.value - 1, 1, pageCount.value); + } + function setPage(value) { + page.value = clamp(value, 1, pageCount.value); + } + const data = { + page, + itemsPerPage, + startIndex, + stopIndex, + pageCount, + itemsLength, + nextPage, + prevPage, + setPage, + setItemsPerPage + }; + provide$5(VDataTablePaginationSymbol, data); + return data; +} +function usePagination() { + const data = inject$8(VDataTablePaginationSymbol); + if (!data) throw new Error('Missing pagination!'); + return data; +} +function usePaginatedItems(options) { + const vm = getCurrentInstance('usePaginatedItems'); + const { + items, + startIndex, + stopIndex, + itemsPerPage + } = options; + const paginatedItems = computed$R(() => { + if (itemsPerPage.value <= 0) return items.value; + return items.value.slice(startIndex.value, stopIndex.value); + }); + watch$c(paginatedItems, val => { + vm.emit('update:currentItems', val); + }); + return { + paginatedItems + }; +} + +const {computed: computed$Q,inject: inject$7,provide: provide$4} = await importShared('vue'); +const singleSelectStrategy = { + showSelectAll: false, + allSelected: () => [], + select: _ref => { + let { + items, + value + } = _ref; + return new Set(value ? [items[0]?.value] : []); + }, + selectAll: _ref2 => { + let { + selected + } = _ref2; + return selected; + } +}; +const pageSelectStrategy = { + showSelectAll: true, + allSelected: _ref3 => { + let { + currentPage + } = _ref3; + return currentPage; + }, + select: _ref4 => { + let { + items, + value, + selected + } = _ref4; + for (const item of items) { + if (value) selected.add(item.value);else selected.delete(item.value); + } + return selected; + }, + selectAll: _ref5 => { + let { + value, + currentPage, + selected + } = _ref5; + return pageSelectStrategy.select({ + items: currentPage, + value, + selected + }); + } +}; +const allSelectStrategy = { + showSelectAll: true, + allSelected: _ref6 => { + let { + allItems + } = _ref6; + return allItems; + }, + select: _ref7 => { + let { + items, + value, + selected + } = _ref7; + for (const item of items) { + if (value) selected.add(item.value);else selected.delete(item.value); + } + return selected; + }, + selectAll: _ref8 => { + let { + value, + allItems, + selected + } = _ref8; + return allSelectStrategy.select({ + items: allItems, + value, + selected + }); + } +}; +const makeDataTableSelectProps = propsFactory({ + showSelect: Boolean, + selectStrategy: { + type: [String, Object], + default: 'page' + }, + modelValue: { + type: Array, + default: () => [] + }, + valueComparator: { + type: Function, + default: deepEqual + } +}, 'DataTable-select'); +const VDataTableSelectionSymbol = Symbol.for('vuetify:data-table-selection'); +function provideSelection(props, _ref9) { + let { + allItems, + currentPage + } = _ref9; + const selected = useProxiedModel(props, 'modelValue', props.modelValue, v => { + return new Set(wrapInArray(v).map(v => { + return allItems.value.find(item => props.valueComparator(v, item.value))?.value ?? v; + })); + }, v => { + return [...v.values()]; + }); + const allSelectable = computed$Q(() => allItems.value.filter(item => item.selectable)); + const currentPageSelectable = computed$Q(() => currentPage.value.filter(item => item.selectable)); + const selectStrategy = computed$Q(() => { + if (typeof props.selectStrategy === 'object') return props.selectStrategy; + switch (props.selectStrategy) { + case 'single': + return singleSelectStrategy; + case 'all': + return allSelectStrategy; + case 'page': + default: + return pageSelectStrategy; + } + }); + function isSelected(items) { + return wrapInArray(items).every(item => selected.value.has(item.value)); + } + function isSomeSelected(items) { + return wrapInArray(items).some(item => selected.value.has(item.value)); + } + function select(items, value) { + const newSelected = selectStrategy.value.select({ + items, + value, + selected: new Set(selected.value) + }); + selected.value = newSelected; + } + function toggleSelect(item) { + select([item], !isSelected([item])); + } + function selectAll(value) { + const newSelected = selectStrategy.value.selectAll({ + value, + allItems: allSelectable.value, + currentPage: currentPageSelectable.value, + selected: new Set(selected.value) + }); + selected.value = newSelected; + } + const someSelected = computed$Q(() => selected.value.size > 0); + const allSelected = computed$Q(() => { + const items = selectStrategy.value.allSelected({ + allItems: allSelectable.value, + currentPage: currentPageSelectable.value + }); + return !!items.length && isSelected(items); + }); + const showSelectAll = computed$Q(() => selectStrategy.value.showSelectAll); + const data = { + toggleSelect, + select, + selectAll, + isSelected, + isSomeSelected, + someSelected, + allSelected, + showSelectAll + }; + provide$4(VDataTableSelectionSymbol, data); + return data; +} +function useSelection() { + const data = inject$7(VDataTableSelectionSymbol); + if (!data) throw new Error('Missing selection!'); + return data; +} + +const {computed: computed$P,inject: inject$6,provide: provide$3,toRef: toRef$j} = await importShared('vue'); +const makeDataTableSortProps = propsFactory({ + sortBy: { + type: Array, + default: () => [] + }, + customKeySort: Object, + multiSort: Boolean, + mustSort: Boolean +}, 'DataTable-sort'); +const VDataTableSortSymbol = Symbol.for('vuetify:data-table-sort'); +function createSort(props) { + const sortBy = useProxiedModel(props, 'sortBy'); + const mustSort = toRef$j(props, 'mustSort'); + const multiSort = toRef$j(props, 'multiSort'); + return { + sortBy, + mustSort, + multiSort + }; +} +function provideSort(options) { + const { + sortBy, + mustSort, + multiSort, + page + } = options; + const toggleSort = column => { + if (column.key == null) return; + let newSortBy = sortBy.value.map(x => ({ + ...x + })) ?? []; + const item = newSortBy.find(x => x.key === column.key); + if (!item) { + if (multiSort.value) newSortBy = [...newSortBy, { + key: column.key, + order: 'asc' + }];else newSortBy = [{ + key: column.key, + order: 'asc' + }]; + } else if (item.order === 'desc') { + if (mustSort.value) { + item.order = 'asc'; + } else { + newSortBy = newSortBy.filter(x => x.key !== column.key); + } + } else { + item.order = 'desc'; + } + sortBy.value = newSortBy; + if (page) page.value = 1; + }; + function isSorted(column) { + return !!sortBy.value.find(item => item.key === column.key); + } + const data = { + sortBy, + toggleSort, + isSorted + }; + provide$3(VDataTableSortSymbol, data); + return data; +} +function useSort() { + const data = inject$6(VDataTableSortSymbol); + if (!data) throw new Error('Missing sort!'); + return data; +} + +// TODO: abstract into project composable +function useSortedItems(props, items, sortBy, options) { + const locale = useLocale(); + const sortedItems = computed$P(() => { + if (!sortBy.value.length) return items.value; + return sortItems(items.value, sortBy.value, locale.current.value, { + transform: options?.transform, + sortFunctions: { + ...props.customKeySort, + ...options?.sortFunctions?.value + }, + sortRawFunctions: options?.sortRawFunctions?.value + }); + }); + return { + sortedItems + }; +} +function sortItems(items, sortByItems, locale, options) { + const stringCollator = new Intl.Collator(locale, { + sensitivity: 'accent', + usage: 'sort' + }); + const transformedItems = items.map(item => [item, options?.transform ? options.transform(item) : item]); + return transformedItems.sort((a, b) => { + for (let i = 0; i < sortByItems.length; i++) { + let hasCustomResult = false; + const sortKey = sortByItems[i].key; + const sortOrder = sortByItems[i].order ?? 'asc'; + if (sortOrder === false) continue; + let sortA = getObjectValueByPath(a[1], sortKey); + let sortB = getObjectValueByPath(b[1], sortKey); + let sortARaw = a[0].raw; + let sortBRaw = b[0].raw; + if (sortOrder === 'desc') { + [sortA, sortB] = [sortB, sortA]; + [sortARaw, sortBRaw] = [sortBRaw, sortARaw]; + } + if (options?.sortRawFunctions?.[sortKey]) { + const customResult = options.sortRawFunctions[sortKey](sortARaw, sortBRaw); + if (customResult == null) continue; + hasCustomResult = true; + if (customResult) return customResult; + } + if (options?.sortFunctions?.[sortKey]) { + const customResult = options.sortFunctions[sortKey](sortA, sortB); + if (customResult == null) continue; + hasCustomResult = true; + if (customResult) return customResult; + } + if (hasCustomResult) continue; + + // Dates should be compared numerically + if (sortA instanceof Date && sortB instanceof Date) { + return sortA.getTime() - sortB.getTime(); + } + [sortA, sortB] = [sortA, sortB].map(s => s != null ? s.toString().toLocaleLowerCase() : s); + if (sortA !== sortB) { + if (isEmpty(sortA) && isEmpty(sortB)) return 0; + if (isEmpty(sortA)) return -1; + if (isEmpty(sortB)) return 1; + if (!isNaN(sortA) && !isNaN(sortB)) return Number(sortA) - Number(sortB); + return stringCollator.compare(sortA, sortB); + } + } + return 0; + }).map(_ref => { + let [item] = _ref; + return item; + }); +} + +// Utilities +const {computed: computed$O} = await importShared('vue'); +// Composables +const makeDataIteratorItemsProps = propsFactory({ + items: { + type: Array, + default: () => [] + }, + itemValue: { + type: [String, Array, Function], + default: 'id' + }, + itemSelectable: { + type: [String, Array, Function], + default: null + }, + returnObject: Boolean +}, 'DataIterator-items'); +function transformItem$1(props, item) { + const value = props.returnObject ? item : getPropertyFromItem(item, props.itemValue); + const selectable = getPropertyFromItem(item, props.itemSelectable, true); + return { + type: 'item', + value, + selectable, + raw: item + }; +} +function transformItems$1(props, items) { + const array = []; + for (const item of items) { + array.push(transformItem$1(props, item)); + } + return array; +} +function useDataIteratorItems(props) { + const items = computed$O(() => transformItems$1(props, props.items)); + return { + items + }; +} + +const {createVNode:_createVNode$12} = await importShared('vue'); +const {computed: computed$N,toRef: toRef$i} = await importShared('vue'); +const makeVDataIteratorProps = propsFactory({ + search: String, + loading: Boolean, + ...makeComponentProps(), + ...makeDataIteratorItemsProps(), + ...makeDataTableSelectProps(), + ...makeDataTableSortProps(), + ...makeDataTablePaginateProps({ + itemsPerPage: 5 + }), + ...makeDataTableExpandProps(), + ...makeDataTableGroupProps(), + ...makeFilterProps(), + ...makeTagProps(), + ...makeTransitionProps({ + transition: { + component: VFadeTransition, + hideOnLeave: true + } + }) +}, 'VDataIterator'); +const VDataIterator = genericComponent()({ + name: 'VDataIterator', + props: makeVDataIteratorProps(), + emits: { + 'update:modelValue': value => true, + 'update:groupBy': value => true, + 'update:page': value => true, + 'update:itemsPerPage': value => true, + 'update:sortBy': value => true, + 'update:options': value => true, + 'update:expanded': value => true, + 'update:currentItems': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const groupBy = useProxiedModel(props, 'groupBy'); + const search = toRef$i(props, 'search'); + const { + items + } = useDataIteratorItems(props); + const { + filteredItems + } = useFilter(props, items, search, { + transform: item => item.raw + }); + const { + sortBy, + multiSort, + mustSort + } = createSort(props); + const { + page, + itemsPerPage + } = createPagination(props); + const { + toggleSort + } = provideSort({ + sortBy, + multiSort, + mustSort, + page + }); + const { + sortByWithGroups, + opened, + extractRows, + isGroupOpen, + toggleGroup + } = provideGroupBy({ + groupBy, + sortBy + }); + const { + sortedItems + } = useSortedItems(props, filteredItems, sortByWithGroups, { + transform: item => item.raw + }); + const { + flatItems + } = useGroupedItems(sortedItems, groupBy, opened); + const itemsLength = computed$N(() => flatItems.value.length); + const { + startIndex, + stopIndex, + pageCount, + prevPage, + nextPage, + setItemsPerPage, + setPage + } = providePagination({ + page, + itemsPerPage, + itemsLength + }); + const { + paginatedItems + } = usePaginatedItems({ + items: flatItems, + startIndex, + stopIndex, + itemsPerPage + }); + const paginatedItemsWithoutGroups = computed$N(() => extractRows(paginatedItems.value)); + const { + isSelected, + select, + selectAll, + toggleSelect + } = provideSelection(props, { + allItems: items, + currentPage: paginatedItemsWithoutGroups + }); + const { + isExpanded, + toggleExpand + } = provideExpanded(props); + useOptions({ + page, + itemsPerPage, + sortBy, + groupBy, + search + }); + const slotProps = computed$N(() => ({ + page: page.value, + itemsPerPage: itemsPerPage.value, + sortBy: sortBy.value, + pageCount: pageCount.value, + toggleSort, + prevPage, + nextPage, + setPage, + setItemsPerPage, + isSelected, + select, + selectAll, + toggleSelect, + isExpanded, + toggleExpand, + isGroupOpen, + toggleGroup, + items: paginatedItemsWithoutGroups.value, + groupedItems: paginatedItems.value + })); + useRender(() => _createVNode$12(props.tag, { + "class": ['v-data-iterator', { + 'v-data-iterator--loading': props.loading + }, props.class], + "style": props.style + }, { + default: () => [slots.header?.(slotProps.value), _createVNode$12(MaybeTransition, { + "transition": props.transition + }, { + default: () => [props.loading ? _createVNode$12(LoaderSlot, { + "key": "loader", + "name": "v-data-iterator", + "active": true + }, { + default: slotProps => slots.loader?.(slotProps) + }) : _createVNode$12("div", { + "key": "items" + }, [!paginatedItems.value.length ? slots['no-data']?.() : slots.default?.(slotProps.value)])] + }), slots.footer?.(slotProps.value)] + })); + return {}; + } +}); + +// Utilities +const {onBeforeUpdate,ref: ref$k} = await importShared('vue'); + + +// Types + +function useRefs() { + const refs = ref$k([]); + onBeforeUpdate(() => refs.value = []); + function updateRef(e, i) { + refs.value[i] = e; + } + return { + refs, + updateRef + }; +} + +const {createVNode:_createVNode$11,mergeProps:_mergeProps$x} = await importShared('vue'); +const {computed: computed$M,nextTick: nextTick$8,shallowRef: shallowRef$e,toRef: toRef$h} = await importShared('vue'); +const makeVPaginationProps = propsFactory({ + activeColor: String, + start: { + type: [Number, String], + default: 1 + }, + modelValue: { + type: Number, + default: props => props.start + }, + disabled: Boolean, + length: { + type: [Number, String], + default: 1, + validator: val => val % 1 === 0 + }, + totalVisible: [Number, String], + firstIcon: { + type: IconValue, + default: '$first' + }, + prevIcon: { + type: IconValue, + default: '$prev' + }, + nextIcon: { + type: IconValue, + default: '$next' + }, + lastIcon: { + type: IconValue, + default: '$last' + }, + ariaLabel: { + type: String, + default: '$vuetify.pagination.ariaLabel.root' + }, + pageAriaLabel: { + type: String, + default: '$vuetify.pagination.ariaLabel.page' + }, + currentPageAriaLabel: { + type: String, + default: '$vuetify.pagination.ariaLabel.currentPage' + }, + firstAriaLabel: { + type: String, + default: '$vuetify.pagination.ariaLabel.first' + }, + previousAriaLabel: { + type: String, + default: '$vuetify.pagination.ariaLabel.previous' + }, + nextAriaLabel: { + type: String, + default: '$vuetify.pagination.ariaLabel.next' + }, + lastAriaLabel: { + type: String, + default: '$vuetify.pagination.ariaLabel.last' + }, + ellipsis: { + type: String, + default: '...' + }, + showFirstLastPage: Boolean, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeElevationProps(), + ...makeRoundedProps(), + ...makeSizeProps(), + ...makeTagProps({ + tag: 'nav' + }), + ...makeThemeProps(), + ...makeVariantProps({ + variant: 'text' + }) +}, 'VPagination'); +const VPagination = genericComponent()({ + name: 'VPagination', + props: makeVPaginationProps(), + emits: { + 'update:modelValue': value => true, + first: value => true, + prev: value => true, + next: value => true, + last: value => true + }, + setup(props, _ref) { + let { + slots, + emit + } = _ref; + const page = useProxiedModel(props, 'modelValue'); + const { + t, + n + } = useLocale(); + const { + isRtl + } = useRtl(); + const { + themeClasses + } = provideTheme(props); + const { + width + } = useDisplay(); + const maxButtons = shallowRef$e(-1); + provideDefaults(undefined, { + scoped: true + }); + const { + resizeRef + } = useResizeObserver(entries => { + if (!entries.length) return; + const { + target, + contentRect + } = entries[0]; + const firstItem = target.querySelector('.v-pagination__list > *'); + if (!firstItem) return; + const totalWidth = contentRect.width; + const itemWidth = firstItem.offsetWidth + parseFloat(getComputedStyle(firstItem).marginRight) * 2; + maxButtons.value = getMax(totalWidth, itemWidth); + }); + const length = computed$M(() => parseInt(props.length, 10)); + const start = computed$M(() => parseInt(props.start, 10)); + const totalVisible = computed$M(() => { + if (props.totalVisible != null) return parseInt(props.totalVisible, 10);else if (maxButtons.value >= 0) return maxButtons.value; + return getMax(width.value, 58); + }); + function getMax(totalWidth, itemWidth) { + const minButtons = props.showFirstLastPage ? 5 : 3; + return Math.max(0, Math.floor( + // Round to two decimal places to avoid floating point errors + +((totalWidth - itemWidth * minButtons) / itemWidth).toFixed(2))); + } + const range = computed$M(() => { + if (length.value <= 0 || isNaN(length.value) || length.value > Number.MAX_SAFE_INTEGER) return []; + if (totalVisible.value <= 0) return [];else if (totalVisible.value === 1) return [page.value]; + if (length.value <= totalVisible.value) { + return createRange(length.value, start.value); + } + const even = totalVisible.value % 2 === 0; + const middle = even ? totalVisible.value / 2 : Math.floor(totalVisible.value / 2); + const left = even ? middle : middle + 1; + const right = length.value - middle; + if (left - page.value >= 0) { + return [...createRange(Math.max(1, totalVisible.value - 1), start.value), props.ellipsis, length.value]; + } else if (page.value - right >= (even ? 1 : 0)) { + const rangeLength = totalVisible.value - 1; + const rangeStart = length.value - rangeLength + start.value; + return [start.value, props.ellipsis, ...createRange(rangeLength, rangeStart)]; + } else { + const rangeLength = Math.max(1, totalVisible.value - 3); + const rangeStart = rangeLength === 1 ? page.value : page.value - Math.ceil(rangeLength / 2) + start.value; + return [start.value, props.ellipsis, ...createRange(rangeLength, rangeStart), props.ellipsis, length.value]; + } + }); + + // TODO: 'first' | 'prev' | 'next' | 'last' does not work here? + function setValue(e, value, event) { + e.preventDefault(); + page.value = value; + event && emit(event, value); + } + const { + refs, + updateRef + } = useRefs(); + provideDefaults({ + VPaginationBtn: { + color: toRef$h(props, 'color'), + border: toRef$h(props, 'border'), + density: toRef$h(props, 'density'), + size: toRef$h(props, 'size'), + variant: toRef$h(props, 'variant'), + rounded: toRef$h(props, 'rounded'), + elevation: toRef$h(props, 'elevation') + } + }); + const items = computed$M(() => { + return range.value.map((item, index) => { + const ref = e => updateRef(e, index); + if (typeof item === 'string') { + return { + isActive: false, + key: `ellipsis-${index}`, + page: item, + props: { + ref, + ellipsis: true, + icon: true, + disabled: true + } + }; + } else { + const isActive = item === page.value; + return { + isActive, + key: item, + page: n(item), + props: { + ref, + ellipsis: false, + icon: true, + disabled: !!props.disabled || +props.length < 2, + color: isActive ? props.activeColor : props.color, + 'aria-current': isActive, + 'aria-label': t(isActive ? props.currentPageAriaLabel : props.pageAriaLabel, item), + onClick: e => setValue(e, item) + } + }; + } + }); + }); + const controls = computed$M(() => { + const prevDisabled = !!props.disabled || page.value <= start.value; + const nextDisabled = !!props.disabled || page.value >= start.value + length.value - 1; + return { + first: props.showFirstLastPage ? { + icon: isRtl.value ? props.lastIcon : props.firstIcon, + onClick: e => setValue(e, start.value, 'first'), + disabled: prevDisabled, + 'aria-label': t(props.firstAriaLabel), + 'aria-disabled': prevDisabled + } : undefined, + prev: { + icon: isRtl.value ? props.nextIcon : props.prevIcon, + onClick: e => setValue(e, page.value - 1, 'prev'), + disabled: prevDisabled, + 'aria-label': t(props.previousAriaLabel), + 'aria-disabled': prevDisabled + }, + next: { + icon: isRtl.value ? props.prevIcon : props.nextIcon, + onClick: e => setValue(e, page.value + 1, 'next'), + disabled: nextDisabled, + 'aria-label': t(props.nextAriaLabel), + 'aria-disabled': nextDisabled + }, + last: props.showFirstLastPage ? { + icon: isRtl.value ? props.firstIcon : props.lastIcon, + onClick: e => setValue(e, start.value + length.value - 1, 'last'), + disabled: nextDisabled, + 'aria-label': t(props.lastAriaLabel), + 'aria-disabled': nextDisabled + } : undefined + }; + }); + function updateFocus() { + const currentIndex = page.value - start.value; + refs.value[currentIndex]?.$el.focus(); + } + function onKeydown(e) { + if (e.key === keyValues.left && !props.disabled && page.value > +props.start) { + page.value = page.value - 1; + nextTick$8(updateFocus); + } else if (e.key === keyValues.right && !props.disabled && page.value < start.value + length.value - 1) { + page.value = page.value + 1; + nextTick$8(updateFocus); + } + } + useRender(() => _createVNode$11(props.tag, { + "ref": resizeRef, + "class": ['v-pagination', themeClasses.value, props.class], + "style": props.style, + "role": "navigation", + "aria-label": t(props.ariaLabel), + "onKeydown": onKeydown, + "data-test": "v-pagination-root" + }, { + default: () => [_createVNode$11("ul", { + "class": "v-pagination__list" + }, [props.showFirstLastPage && _createVNode$11("li", { + "key": "first", + "class": "v-pagination__first", + "data-test": "v-pagination-first" + }, [slots.first ? slots.first(controls.value.first) : _createVNode$11(VBtn, _mergeProps$x({ + "_as": "VPaginationBtn" + }, controls.value.first), null)]), _createVNode$11("li", { + "key": "prev", + "class": "v-pagination__prev", + "data-test": "v-pagination-prev" + }, [slots.prev ? slots.prev(controls.value.prev) : _createVNode$11(VBtn, _mergeProps$x({ + "_as": "VPaginationBtn" + }, controls.value.prev), null)]), items.value.map((item, index) => _createVNode$11("li", { + "key": item.key, + "class": ['v-pagination__item', { + 'v-pagination__item--is-active': item.isActive + }], + "data-test": "v-pagination-item" + }, [slots.item ? slots.item(item) : _createVNode$11(VBtn, _mergeProps$x({ + "_as": "VPaginationBtn" + }, item.props), { + default: () => [item.page] + })])), _createVNode$11("li", { + "key": "next", + "class": "v-pagination__next", + "data-test": "v-pagination-next" + }, [slots.next ? slots.next(controls.value.next) : _createVNode$11(VBtn, _mergeProps$x({ + "_as": "VPaginationBtn" + }, controls.value.next), null)]), props.showFirstLastPage && _createVNode$11("li", { + "key": "last", + "class": "v-pagination__last", + "data-test": "v-pagination-last" + }, [slots.last ? slots.last(controls.value.last) : _createVNode$11(VBtn, _mergeProps$x({ + "_as": "VPaginationBtn" + }, controls.value.last), null)])])] + })); + return {}; + } +}); + +const {mergeProps:_mergeProps$w,createVNode:_createVNode$10} = await importShared('vue'); +const {computed: computed$L} = await importShared('vue'); +const makeVDataTableFooterProps = propsFactory({ + prevIcon: { + type: IconValue, + default: '$prev' + }, + nextIcon: { + type: IconValue, + default: '$next' + }, + firstIcon: { + type: IconValue, + default: '$first' + }, + lastIcon: { + type: IconValue, + default: '$last' + }, + itemsPerPageText: { + type: String, + default: '$vuetify.dataFooter.itemsPerPageText' + }, + pageText: { + type: String, + default: '$vuetify.dataFooter.pageText' + }, + firstPageLabel: { + type: String, + default: '$vuetify.dataFooter.firstPage' + }, + prevPageLabel: { + type: String, + default: '$vuetify.dataFooter.prevPage' + }, + nextPageLabel: { + type: String, + default: '$vuetify.dataFooter.nextPage' + }, + lastPageLabel: { + type: String, + default: '$vuetify.dataFooter.lastPage' + }, + itemsPerPageOptions: { + type: Array, + default: () => [{ + value: 10, + title: '10' + }, { + value: 25, + title: '25' + }, { + value: 50, + title: '50' + }, { + value: 100, + title: '100' + }, { + value: -1, + title: '$vuetify.dataFooter.itemsPerPageAll' + }] + }, + showCurrentPage: Boolean +}, 'VDataTableFooter'); +const VDataTableFooter = genericComponent()({ + name: 'VDataTableFooter', + props: makeVDataTableFooterProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + t + } = useLocale(); + const { + page, + pageCount, + startIndex, + stopIndex, + itemsLength, + itemsPerPage, + setItemsPerPage + } = usePagination(); + const itemsPerPageOptions = computed$L(() => props.itemsPerPageOptions.map(option => { + if (typeof option === 'number') { + return { + value: option, + title: option === -1 ? t('$vuetify.dataFooter.itemsPerPageAll') : String(option) + }; + } + return { + ...option, + title: !isNaN(Number(option.title)) ? option.title : t(option.title) + }; + })); + useRender(() => { + const paginationProps = VPagination.filterProps(props); + return _createVNode$10("div", { + "class": "v-data-table-footer" + }, [slots.prepend?.(), _createVNode$10("div", { + "class": "v-data-table-footer__items-per-page" + }, [_createVNode$10("span", null, [t(props.itemsPerPageText)]), _createVNode$10(VSelect, { + "items": itemsPerPageOptions.value, + "modelValue": itemsPerPage.value, + "onUpdate:modelValue": v => setItemsPerPage(Number(v)), + "density": "compact", + "variant": "outlined", + "hide-details": true + }, null)]), _createVNode$10("div", { + "class": "v-data-table-footer__info" + }, [_createVNode$10("div", null, [t(props.pageText, !itemsLength.value ? 0 : startIndex.value + 1, stopIndex.value, itemsLength.value)])]), _createVNode$10("div", { + "class": "v-data-table-footer__pagination" + }, [_createVNode$10(VPagination, _mergeProps$w({ + "modelValue": page.value, + "onUpdate:modelValue": $event => page.value = $event, + "density": "comfortable", + "first-aria-label": props.firstPageLabel, + "last-aria-label": props.lastPageLabel, + "length": pageCount.value, + "next-aria-label": props.nextPageLabel, + "previous-aria-label": props.prevPageLabel, + "rounded": true, + "show-first-last-page": true, + "total-visible": props.showCurrentPage ? 1 : 0, + "variant": "plain" + }, paginationProps), null)])]); + }); + return {}; + } +}); + +const {createVNode:_createVNode$$} = await importShared('vue'); +const VDataTableColumn = defineFunctionalComponent({ + align: { + type: String, + default: 'start' + }, + fixed: Boolean, + fixedOffset: [Number, String], + height: [Number, String], + lastFixed: Boolean, + noPadding: Boolean, + tag: String, + width: [Number, String], + maxWidth: [Number, String], + nowrap: Boolean +}, (props, _ref) => { + let { + slots + } = _ref; + const Tag = props.tag ?? 'td'; + return _createVNode$$(Tag, { + "class": ['v-data-table__td', { + 'v-data-table-column--fixed': props.fixed, + 'v-data-table-column--last-fixed': props.lastFixed, + 'v-data-table-column--no-padding': props.noPadding, + 'v-data-table-column--nowrap': props.nowrap + }, `v-data-table-column--align-${props.align}`], + "style": { + height: convertToUnit(props.height), + width: convertToUnit(props.width), + maxWidth: convertToUnit(props.maxWidth), + left: convertToUnit(props.fixedOffset || null) + } + }, { + default: () => [slots.default?.()] + }); +}); + +// Utilities +const {capitalize: capitalize$2,inject: inject$5,provide: provide$2,ref: ref$j,watchEffect: watchEffect$8} = await importShared('vue'); +const makeDataTableHeaderProps = propsFactory({ + headers: Array +}, 'DataTable-header'); +const VDataTableHeadersSymbol = Symbol.for('vuetify:data-table-headers'); +const defaultHeader = { + title: '', + sortable: false +}; +const defaultActionHeader = { + ...defaultHeader, + width: 48 +}; +function priorityQueue() { + let arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + const queue = arr.map(element => ({ + element, + priority: 0 + })); + return { + enqueue: (element, priority) => { + let added = false; + for (let i = 0; i < queue.length; i++) { + const item = queue[i]; + if (item.priority > priority) { + queue.splice(i, 0, { + element, + priority + }); + added = true; + break; + } + } + if (!added) queue.push({ + element, + priority + }); + }, + size: () => queue.length, + count: () => { + let count = 0; + if (!queue.length) return 0; + const whole = Math.floor(queue[0].priority); + for (let i = 0; i < queue.length; i++) { + if (Math.floor(queue[i].priority) === whole) count += 1; + } + return count; + }, + dequeue: () => { + return queue.shift(); + } + }; +} +function extractLeaves(item) { + let columns = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + if (!item.children) { + columns.push(item); + } else { + for (const child of item.children) { + extractLeaves(child, columns); + } + } + return columns; +} +function extractKeys(headers) { + let keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set(); + for (const item of headers) { + if (item.key) keys.add(item.key); + if (item.children) { + extractKeys(item.children, keys); + } + } + return keys; +} +function getDefaultItem(item) { + if (!item.key) return undefined; + if (item.key === 'data-table-group') return defaultHeader; + if (['data-table-expand', 'data-table-select'].includes(item.key)) return defaultActionHeader; + return undefined; +} +function getDepth(item) { + let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + if (!item.children) return depth; + return Math.max(depth, ...item.children.map(child => getDepth(child, depth + 1))); +} +function parseFixedColumns(items) { + let seenFixed = false; + function setFixed(item) { + let parentFixed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (!item) return; + if (parentFixed) { + item.fixed = true; + } + if (item.fixed) { + if (item.children) { + for (let i = item.children.length - 1; i >= 0; i--) { + setFixed(item.children[i], true); + } + } else { + if (!seenFixed) { + item.lastFixed = true; + } else if (isNaN(+item.width)) { + consoleError(`Multiple fixed columns should have a static width (key: ${item.key})`); + } + seenFixed = true; + } + } else { + if (item.children) { + for (let i = item.children.length - 1; i >= 0; i--) { + setFixed(item.children[i]); + } + } else { + seenFixed = false; + } + } + } + for (let i = items.length - 1; i >= 0; i--) { + setFixed(items[i]); + } + function setFixedOffset(item) { + let fixedOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + if (!item) return fixedOffset; + if (item.children) { + item.fixedOffset = fixedOffset; + for (const child of item.children) { + fixedOffset = setFixedOffset(child, fixedOffset); + } + } else if (item.fixed) { + item.fixedOffset = fixedOffset; + fixedOffset += parseFloat(item.width || '0') || 0; + } + return fixedOffset; + } + let fixedOffset = 0; + for (const item of items) { + fixedOffset = setFixedOffset(item, fixedOffset); + } +} +function parse(items, maxDepth) { + const headers = []; + let currentDepth = 0; + const queue = priorityQueue(items); + while (queue.size() > 0) { + let rowSize = queue.count(); + const row = []; + let fraction = 1; + while (rowSize > 0) { + const { + element: item, + priority + } = queue.dequeue(); + const diff = maxDepth - currentDepth - getDepth(item); + row.push({ + ...item, + rowspan: diff ?? 1, + colspan: item.children ? extractLeaves(item).length : 1 + }); + if (item.children) { + for (const child of item.children) { + // This internally sorts items that are on the same priority "row" + const sort = priority % 1 + fraction / Math.pow(10, currentDepth + 2); + queue.enqueue(child, currentDepth + diff + sort); + } + } + fraction += 1; + rowSize -= 1; + } + currentDepth += 1; + headers.push(row); + } + const columns = items.map(item => extractLeaves(item)).flat(); + return { + columns, + headers + }; +} +function convertToInternalHeaders(items) { + const internalHeaders = []; + for (const item of items) { + const defaultItem = { + ...getDefaultItem(item), + ...item + }; + const key = defaultItem.key ?? (typeof defaultItem.value === 'string' ? defaultItem.value : null); + const value = defaultItem.value ?? key ?? null; + const internalItem = { + ...defaultItem, + key, + value, + sortable: defaultItem.sortable ?? (defaultItem.key != null || !!defaultItem.sort), + children: defaultItem.children ? convertToInternalHeaders(defaultItem.children) : undefined + }; + internalHeaders.push(internalItem); + } + return internalHeaders; +} +function createHeaders(props, options) { + const headers = ref$j([]); + const columns = ref$j([]); + const sortFunctions = ref$j({}); + const sortRawFunctions = ref$j({}); + const filterFunctions = ref$j({}); + watchEffect$8(() => { + const _headers = props.headers || Object.keys(props.items[0] ?? {}).map(key => ({ + key, + title: capitalize$2(key) + })); + const items = _headers.slice(); + const keys = extractKeys(items); + if (options?.groupBy?.value.length && !keys.has('data-table-group')) { + items.unshift({ + key: 'data-table-group', + title: 'Group' + }); + } + if (options?.showSelect?.value && !keys.has('data-table-select')) { + items.unshift({ + key: 'data-table-select' + }); + } + if (options?.showExpand?.value && !keys.has('data-table-expand')) { + items.push({ + key: 'data-table-expand' + }); + } + const internalHeaders = convertToInternalHeaders(items); + parseFixedColumns(internalHeaders); + const maxDepth = Math.max(...internalHeaders.map(item => getDepth(item))) + 1; + const parsed = parse(internalHeaders, maxDepth); + headers.value = parsed.headers; + columns.value = parsed.columns; + const flatHeaders = parsed.headers.flat(1); + for (const header of flatHeaders) { + if (!header.key) continue; + if (header.sortable) { + if (header.sort) { + sortFunctions.value[header.key] = header.sort; + } + if (header.sortRaw) { + sortRawFunctions.value[header.key] = header.sortRaw; + } + } + if (header.filter) { + filterFunctions.value[header.key] = header.filter; + } + } + }); + const data = { + headers, + columns, + sortFunctions, + sortRawFunctions, + filterFunctions + }; + provide$2(VDataTableHeadersSymbol, data); + return data; +} +function useHeaders() { + const data = inject$5(VDataTableHeadersSymbol); + if (!data) throw new Error('Missing headers!'); + return data; +} + +const {resolveDirective:_resolveDirective$t,Fragment:_Fragment$i,mergeProps:_mergeProps$v,createVNode:_createVNode$_} = await importShared('vue'); +const {computed: computed$K,mergeProps: mergeProps$4} = await importShared('vue'); +const makeVDataTableHeadersProps = propsFactory({ + color: String, + sticky: Boolean, + disableSort: Boolean, + multiSort: Boolean, + sortAscIcon: { + type: IconValue, + default: '$sortAsc' + }, + sortDescIcon: { + type: IconValue, + default: '$sortDesc' + }, + headerProps: { + type: Object + }, + ...makeDisplayProps(), + ...makeLoaderProps() +}, 'VDataTableHeaders'); +const VDataTableHeaders = genericComponent()({ + name: 'VDataTableHeaders', + props: makeVDataTableHeadersProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + t + } = useLocale(); + const { + toggleSort, + sortBy, + isSorted + } = useSort(); + const { + someSelected, + allSelected, + selectAll, + showSelectAll + } = useSelection(); + const { + columns, + headers + } = useHeaders(); + const { + loaderClasses + } = useLoader(props); + function getFixedStyles(column, y) { + if (!props.sticky && !column.fixed) return undefined; + return { + position: 'sticky', + left: column.fixed ? convertToUnit(column.fixedOffset) : undefined, + top: props.sticky ? `calc(var(--v-table-header-height) * ${y})` : undefined + }; + } + function getSortIcon(column) { + const item = sortBy.value.find(item => item.key === column.key); + if (!item) return props.sortAscIcon; + return item.order === 'asc' ? props.sortAscIcon : props.sortDescIcon; + } + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(props, 'color'); + const { + displayClasses, + mobile + } = useDisplay(props); + const slotProps = computed$K(() => ({ + headers: headers.value, + columns: columns.value, + toggleSort, + isSorted, + sortBy: sortBy.value, + someSelected: someSelected.value, + allSelected: allSelected.value, + selectAll, + getSortIcon + })); + const headerCellClasses = computed$K(() => ['v-data-table__th', { + 'v-data-table__th--sticky': props.sticky + }, displayClasses.value, loaderClasses.value]); + const VDataTableHeaderCell = _ref2 => { + let { + column, + x, + y + } = _ref2; + const noPadding = column.key === 'data-table-select' || column.key === 'data-table-expand'; + const headerProps = mergeProps$4(props.headerProps ?? {}, column.headerProps ?? {}); + return _createVNode$_(VDataTableColumn, _mergeProps$v({ + "tag": "th", + "align": column.align, + "class": [{ + 'v-data-table__th--sortable': column.sortable && !props.disableSort, + 'v-data-table__th--sorted': isSorted(column), + 'v-data-table__th--fixed': column.fixed + }, ...headerCellClasses.value], + "style": { + width: convertToUnit(column.width), + minWidth: convertToUnit(column.minWidth), + maxWidth: convertToUnit(column.maxWidth), + ...getFixedStyles(column, y) + }, + "colspan": column.colspan, + "rowspan": column.rowspan, + "onClick": column.sortable ? () => toggleSort(column) : undefined, + "fixed": column.fixed, + "nowrap": column.nowrap, + "lastFixed": column.lastFixed, + "noPadding": noPadding + }, headerProps), { + default: () => { + const columnSlotName = `header.${column.key}`; + const columnSlotProps = { + column, + selectAll, + isSorted, + toggleSort, + sortBy: sortBy.value, + someSelected: someSelected.value, + allSelected: allSelected.value, + getSortIcon + }; + if (slots[columnSlotName]) return slots[columnSlotName](columnSlotProps); + if (column.key === 'data-table-select') { + return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll.value && _createVNode$_(VCheckboxBtn, { + "modelValue": allSelected.value, + "indeterminate": someSelected.value && !allSelected.value, + "onUpdate:modelValue": selectAll + }, null)); + } + return _createVNode$_("div", { + "class": "v-data-table-header__content" + }, [_createVNode$_("span", null, [column.title]), column.sortable && !props.disableSort && _createVNode$_(VIcon, { + "key": "icon", + "class": "v-data-table-header__sort-icon", + "icon": getSortIcon(column) + }, null), props.multiSort && isSorted(column) && _createVNode$_("div", { + "key": "badge", + "class": ['v-data-table-header__sort-badge', ...backgroundColorClasses.value], + "style": backgroundColorStyles.value + }, [sortBy.value.findIndex(x => x.key === column.key) + 1])]); + } + }); + }; + const VDataTableMobileHeaderCell = () => { + const headerProps = mergeProps$4(props.headerProps ?? {} ?? {}); + const displayItems = computed$K(() => { + return columns.value.filter(column => column?.sortable && !props.disableSort); + }); + const appendIcon = computed$K(() => { + const showSelectColumn = columns.value.find(column => column.key === 'data-table-select'); + if (showSelectColumn == null) return; + return allSelected.value ? '$checkboxOn' : someSelected.value ? '$checkboxIndeterminate' : '$checkboxOff'; + }); + return _createVNode$_(VDataTableColumn, _mergeProps$v({ + "tag": "th", + "class": [...headerCellClasses.value], + "colspan": headers.value.length + 1 + }, headerProps), { + default: () => [_createVNode$_("div", { + "class": "v-data-table-header__content" + }, [_createVNode$_(VSelect, { + "chips": true, + "class": "v-data-table__td-sort-select", + "clearable": true, + "density": "default", + "items": displayItems.value, + "label": t('$vuetify.dataTable.sortBy'), + "multiple": props.multiSort, + "variant": "underlined", + "onClick:clear": () => sortBy.value = [], + "appendIcon": appendIcon.value, + "onClick:append": () => selectAll(!allSelected.value) + }, { + ...slots, + chip: props => _createVNode$_(VChip, { + "onClick": props.item.raw?.sortable ? () => toggleSort(props.item.raw) : undefined, + "onMousedown": e => { + e.preventDefault(); + e.stopPropagation(); + } + }, { + default: () => [props.item.title, _createVNode$_(VIcon, { + "class": ['v-data-table__td-sort-icon', isSorted(props.item.raw) && 'v-data-table__td-sort-icon-active'], + "icon": getSortIcon(props.item.raw), + "size": "small" + }, null)] + }) + })])] + }); + }; + useRender(() => { + return mobile.value ? _createVNode$_("tr", null, [_createVNode$_(VDataTableMobileHeaderCell, null, null)]) : _createVNode$_(_Fragment$i, null, [slots.headers ? slots.headers(slotProps.value) : headers.value.map((row, y) => _createVNode$_("tr", null, [row.map((column, x) => _createVNode$_(VDataTableHeaderCell, { + "column": column, + "x": x, + "y": y + }, null))])), props.loading && _createVNode$_("tr", { + "class": "v-data-table-progress" + }, [_createVNode$_("th", { + "colspan": columns.value.length + }, [_createVNode$_(LoaderSlot, { + "name": "v-data-table-progress", + "absolute": true, + "active": true, + "color": typeof props.loading === 'boolean' ? undefined : props.loading, + "indeterminate": true + }, { + default: slots.loader + })])])]); + }); + } +}); + +const {createTextVNode:_createTextVNode$3,createVNode:_createVNode$Z} = await importShared('vue'); +const {computed: computed$J} = await importShared('vue'); +const makeVDataTableGroupHeaderRowProps = propsFactory({ + item: { + type: Object, + required: true + } +}, 'VDataTableGroupHeaderRow'); +const VDataTableGroupHeaderRow = genericComponent()({ + name: 'VDataTableGroupHeaderRow', + props: makeVDataTableGroupHeaderRowProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + isGroupOpen, + toggleGroup, + extractRows + } = useGroupBy(); + const { + isSelected, + isSomeSelected, + select + } = useSelection(); + const { + columns + } = useHeaders(); + const rows = computed$J(() => { + return extractRows([props.item]); + }); + return () => _createVNode$Z("tr", { + "class": "v-data-table-group-header-row", + "style": { + '--v-data-table-group-header-row-depth': props.item.depth + } + }, [columns.value.map(column => { + if (column.key === 'data-table-group') { + const icon = isGroupOpen(props.item) ? '$expand' : '$next'; + const onClick = () => toggleGroup(props.item); + return slots['data-table-group']?.({ + item: props.item, + count: rows.value.length, + props: { + icon, + onClick + } + }) ?? _createVNode$Z(VDataTableColumn, { + "class": "v-data-table-group-header-row__column" + }, { + default: () => [_createVNode$Z(VBtn, { + "size": "small", + "variant": "text", + "icon": icon, + "onClick": onClick + }, null), _createVNode$Z("span", null, [props.item.value]), _createVNode$Z("span", null, [_createTextVNode$3("("), rows.value.length, _createTextVNode$3(")")])] + }); + } + if (column.key === 'data-table-select') { + const modelValue = isSelected(rows.value); + const indeterminate = isSomeSelected(rows.value) && !modelValue; + const selectGroup = v => select(rows.value, v); + return slots['data-table-select']?.({ + props: { + modelValue, + indeterminate, + 'onUpdate:modelValue': selectGroup + } + }) ?? _createVNode$Z("td", null, [_createVNode$Z(VCheckboxBtn, { + "modelValue": modelValue, + "indeterminate": indeterminate, + "onUpdate:modelValue": selectGroup + }, null)]); + } + return _createVNode$Z("td", null, null); + })]); + } +}); + +const {mergeProps:_mergeProps$u,Fragment:_Fragment$h,createVNode:_createVNode$Y} = await importShared('vue'); +const {toDisplayString,withModifiers} = await importShared('vue'); +const makeVDataTableRowProps = propsFactory({ + index: Number, + item: Object, + cellProps: [Object, Function], + onClick: EventProp(), + onContextmenu: EventProp(), + onDblclick: EventProp(), + ...makeDisplayProps() +}, 'VDataTableRow'); +const VDataTableRow = genericComponent()({ + name: 'VDataTableRow', + props: makeVDataTableRowProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + displayClasses, + mobile + } = useDisplay(props, 'v-data-table__tr'); + const { + isSelected, + toggleSelect, + someSelected, + allSelected, + selectAll + } = useSelection(); + const { + isExpanded, + toggleExpand + } = useExpanded(); + const { + toggleSort, + sortBy, + isSorted + } = useSort(); + const { + columns + } = useHeaders(); + useRender(() => _createVNode$Y("tr", { + "class": ['v-data-table__tr', { + 'v-data-table__tr--clickable': !!(props.onClick || props.onContextmenu || props.onDblclick) + }, displayClasses.value], + "onClick": props.onClick, + "onContextmenu": props.onContextmenu, + "onDblclick": props.onDblclick + }, [props.item && columns.value.map((column, i) => { + const item = props.item; + const slotName = `item.${column.key}`; + const headerSlotName = `header.${column.key}`; + const slotProps = { + index: props.index, + item: item.raw, + internalItem: item, + value: getObjectValueByPath(item.columns, column.key), + column, + isSelected, + toggleSelect, + isExpanded, + toggleExpand + }; + const columnSlotProps = { + column, + selectAll, + isSorted, + toggleSort, + sortBy: sortBy.value, + someSelected: someSelected.value, + allSelected: allSelected.value, + getSortIcon: () => '' + }; + const cellProps = typeof props.cellProps === 'function' ? props.cellProps({ + index: slotProps.index, + item: slotProps.item, + internalItem: slotProps.internalItem, + value: slotProps.value, + column + }) : props.cellProps; + const columnCellProps = typeof column.cellProps === 'function' ? column.cellProps({ + index: slotProps.index, + item: slotProps.item, + internalItem: slotProps.internalItem, + value: slotProps.value + }) : column.cellProps; + return _createVNode$Y(VDataTableColumn, _mergeProps$u({ + "align": column.align, + "class": { + 'v-data-table__td--expanded-row': column.key === 'data-table-expand', + 'v-data-table__td--select-row': column.key === 'data-table-select' + }, + "fixed": column.fixed, + "fixedOffset": column.fixedOffset, + "lastFixed": column.lastFixed, + "maxWidth": !mobile.value ? column.maxWidth : undefined, + "noPadding": column.key === 'data-table-select' || column.key === 'data-table-expand', + "nowrap": column.nowrap, + "width": !mobile.value ? column.width : undefined + }, cellProps, columnCellProps), { + default: () => { + if (slots[slotName] && !mobile.value) return slots[slotName]?.(slotProps); + if (column.key === 'data-table-select') { + return slots['item.data-table-select']?.(slotProps) ?? _createVNode$Y(VCheckboxBtn, { + "disabled": !item.selectable, + "modelValue": isSelected([item]), + "onClick": withModifiers(() => toggleSelect(item), ['stop']) + }, null); + } + if (column.key === 'data-table-expand') { + return slots['item.data-table-expand']?.(slotProps) ?? _createVNode$Y(VBtn, { + "icon": isExpanded(item) ? '$collapse' : '$expand', + "size": "small", + "variant": "text", + "onClick": withModifiers(() => toggleExpand(item), ['stop']) + }, null); + } + const displayValue = toDisplayString(slotProps.value); + return !mobile.value ? displayValue : _createVNode$Y(_Fragment$h, null, [_createVNode$Y("div", { + "class": "v-data-table__td-title" + }, [slots[headerSlotName]?.(columnSlotProps) ?? column.title]), _createVNode$Y("div", { + "class": "v-data-table__td-value" + }, [slots[slotName]?.(slotProps) ?? displayValue])]); + } + }); + })])); + } +}); + +const {mergeProps:_mergeProps$t,resolveDirective:_resolveDirective$s,Fragment:_Fragment$g,createVNode:_createVNode$X} = await importShared('vue'); +const {Fragment,mergeProps: mergeProps$3} = await importShared('vue'); +const makeVDataTableRowsProps = propsFactory({ + loading: [Boolean, String], + loadingText: { + type: String, + default: '$vuetify.dataIterator.loadingText' + }, + hideNoData: Boolean, + items: { + type: Array, + default: () => [] + }, + noDataText: { + type: String, + default: '$vuetify.noDataText' + }, + rowProps: [Object, Function], + cellProps: [Object, Function], + ...makeDisplayProps() +}, 'VDataTableRows'); +const VDataTableRows = genericComponent()({ + name: 'VDataTableRows', + inheritAttrs: false, + props: makeVDataTableRowsProps(), + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const { + columns + } = useHeaders(); + const { + expandOnClick, + toggleExpand, + isExpanded + } = useExpanded(); + const { + isSelected, + toggleSelect + } = useSelection(); + const { + toggleGroup, + isGroupOpen + } = useGroupBy(); + const { + t + } = useLocale(); + const { + mobile + } = useDisplay(props); + useRender(() => { + if (props.loading && (!props.items.length || slots.loading)) { + return _createVNode$X("tr", { + "class": "v-data-table-rows-loading", + "key": "loading" + }, [_createVNode$X("td", { + "colspan": columns.value.length + }, [slots.loading?.() ?? t(props.loadingText)])]); + } + if (!props.loading && !props.items.length && !props.hideNoData) { + return _createVNode$X("tr", { + "class": "v-data-table-rows-no-data", + "key": "no-data" + }, [_createVNode$X("td", { + "colspan": columns.value.length + }, [slots['no-data']?.() ?? t(props.noDataText)])]); + } + return _createVNode$X(_Fragment$g, null, [props.items.map((item, index) => { + if (item.type === 'group') { + const slotProps = { + index, + item, + columns: columns.value, + isExpanded, + toggleExpand, + isSelected, + toggleSelect, + toggleGroup, + isGroupOpen + }; + return slots['group-header'] ? slots['group-header'](slotProps) : _createVNode$X(VDataTableGroupHeaderRow, _mergeProps$t({ + "key": `group-header_${item.id}`, + "item": item + }, getPrefixedEventHandlers(attrs, ':group-header', () => slotProps)), slots); + } + const slotProps = { + index, + item: item.raw, + internalItem: item, + columns: columns.value, + isExpanded, + toggleExpand, + isSelected, + toggleSelect + }; + const itemSlotProps = { + ...slotProps, + props: mergeProps$3({ + key: `item_${item.key ?? item.index}`, + onClick: expandOnClick.value ? () => { + toggleExpand(item); + } : undefined, + index, + item, + cellProps: props.cellProps, + mobile: mobile.value + }, getPrefixedEventHandlers(attrs, ':row', () => slotProps), typeof props.rowProps === 'function' ? props.rowProps({ + item: slotProps.item, + index: slotProps.index, + internalItem: slotProps.internalItem + }) : props.rowProps) + }; + return _createVNode$X(_Fragment$g, { + "key": itemSlotProps.props.key + }, [slots.item ? slots.item(itemSlotProps) : _createVNode$X(VDataTableRow, itemSlotProps.props, slots), isExpanded(item) && slots['expanded-row']?.(slotProps)]); + })]); + }); + return {}; + } +}); + +const {createVNode:_createVNode$W} = await importShared('vue'); +const makeVTableProps = propsFactory({ + fixedHeader: Boolean, + fixedFooter: Boolean, + height: [Number, String], + hover: Boolean, + ...makeComponentProps(), + ...makeDensityProps(), + ...makeTagProps(), + ...makeThemeProps() +}, 'VTable'); +const VTable = genericComponent()({ + name: 'VTable', + props: makeVTableProps(), + setup(props, _ref) { + let { + slots, + emit + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + densityClasses + } = useDensity(props); + useRender(() => _createVNode$W(props.tag, { + "class": ['v-table', { + 'v-table--fixed-height': !!props.height, + 'v-table--fixed-header': props.fixedHeader, + 'v-table--fixed-footer': props.fixedFooter, + 'v-table--has-top': !!slots.top, + 'v-table--has-bottom': !!slots.bottom, + 'v-table--hover': props.hover + }, themeClasses.value, densityClasses.value, props.class], + "style": props.style + }, { + default: () => [slots.top?.(), slots.default ? _createVNode$W("div", { + "class": "v-table__wrapper", + "style": { + height: convertToUnit(props.height) + } + }, [_createVNode$W("table", null, [slots.default()])]) : slots.wrapper?.(), slots.bottom?.()] + })); + return {}; + } +}); + +// Utilities +const {computed: computed$I} = await importShared('vue'); +// Composables +const makeDataTableItemsProps = propsFactory({ + items: { + type: Array, + default: () => [] + }, + itemValue: { + type: [String, Array, Function], + default: 'id' + }, + itemSelectable: { + type: [String, Array, Function], + default: null + }, + rowProps: [Object, Function], + cellProps: [Object, Function], + returnObject: Boolean +}, 'DataTable-items'); +function transformItem(props, item, index, columns) { + const value = props.returnObject ? item : getPropertyFromItem(item, props.itemValue); + const selectable = getPropertyFromItem(item, props.itemSelectable, true); + const itemColumns = columns.reduce((obj, column) => { + if (column.key != null) obj[column.key] = getPropertyFromItem(item, column.value); + return obj; + }, {}); + return { + type: 'item', + key: props.returnObject ? getPropertyFromItem(item, props.itemValue) : value, + index, + value, + selectable, + columns: itemColumns, + raw: item + }; +} +function transformItems(props, items, columns) { + return items.map((item, index) => transformItem(props, item, index, columns)); +} +function useDataTableItems(props, columns) { + const items = computed$I(() => transformItems(props, props.items, columns.value)); + return { + items + }; +} + +const {mergeProps:_mergeProps$s,createVNode:_createVNode$V,resolveDirective:_resolveDirective$r,Fragment:_Fragment$f} = await importShared('vue'); +const {computed: computed$H,toRef: toRef$g,toRefs: toRefs$3} = await importShared('vue'); +const makeDataTableProps = propsFactory({ + ...makeVDataTableRowsProps(), + hideDefaultBody: Boolean, + hideDefaultFooter: Boolean, + hideDefaultHeader: Boolean, + width: [String, Number], + search: String, + ...makeDataTableExpandProps(), + ...makeDataTableGroupProps(), + ...makeDataTableHeaderProps(), + ...makeDataTableItemsProps(), + ...makeDataTableSelectProps(), + ...makeDataTableSortProps(), + ...makeVDataTableHeadersProps(), + ...makeVTableProps() +}, 'DataTable'); +const makeVDataTableProps = propsFactory({ + ...makeDataTablePaginateProps(), + ...makeDataTableProps(), + ...makeFilterProps(), + ...makeVDataTableFooterProps() +}, 'VDataTable'); +const VDataTable = genericComponent()({ + name: 'VDataTable', + props: makeVDataTableProps(), + emits: { + 'update:modelValue': value => true, + 'update:page': value => true, + 'update:itemsPerPage': value => true, + 'update:sortBy': value => true, + 'update:options': value => true, + 'update:groupBy': value => true, + 'update:expanded': value => true, + 'update:currentItems': value => true + }, + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const { + groupBy + } = createGroupBy(props); + const { + sortBy, + multiSort, + mustSort + } = createSort(props); + const { + page, + itemsPerPage + } = createPagination(props); + const { + disableSort + } = toRefs$3(props); + const { + columns, + headers, + sortFunctions, + sortRawFunctions, + filterFunctions + } = createHeaders(props, { + groupBy, + showSelect: toRef$g(props, 'showSelect'), + showExpand: toRef$g(props, 'showExpand') + }); + const { + items + } = useDataTableItems(props, columns); + const search = toRef$g(props, 'search'); + const { + filteredItems + } = useFilter(props, items, search, { + transform: item => item.columns, + customKeyFilter: filterFunctions + }); + const { + toggleSort + } = provideSort({ + sortBy, + multiSort, + mustSort, + page + }); + const { + sortByWithGroups, + opened, + extractRows, + isGroupOpen, + toggleGroup + } = provideGroupBy({ + groupBy, + sortBy, + disableSort + }); + const { + sortedItems + } = useSortedItems(props, filteredItems, sortByWithGroups, { + transform: item => ({ + ...item.raw, + ...item.columns + }), + sortFunctions, + sortRawFunctions + }); + const { + flatItems + } = useGroupedItems(sortedItems, groupBy, opened); + const itemsLength = computed$H(() => flatItems.value.length); + const { + startIndex, + stopIndex, + pageCount, + setItemsPerPage + } = providePagination({ + page, + itemsPerPage, + itemsLength + }); + const { + paginatedItems + } = usePaginatedItems({ + items: flatItems, + startIndex, + stopIndex, + itemsPerPage + }); + const paginatedItemsWithoutGroups = computed$H(() => extractRows(paginatedItems.value)); + const { + isSelected, + select, + selectAll, + toggleSelect, + someSelected, + allSelected + } = provideSelection(props, { + allItems: items, + currentPage: paginatedItemsWithoutGroups + }); + const { + isExpanded, + toggleExpand + } = provideExpanded(props); + useOptions({ + page, + itemsPerPage, + sortBy, + groupBy, + search + }); + provideDefaults({ + VDataTableRows: { + hideNoData: toRef$g(props, 'hideNoData'), + noDataText: toRef$g(props, 'noDataText'), + loading: toRef$g(props, 'loading'), + loadingText: toRef$g(props, 'loadingText') + } + }); + const slotProps = computed$H(() => ({ + page: page.value, + itemsPerPage: itemsPerPage.value, + sortBy: sortBy.value, + pageCount: pageCount.value, + toggleSort, + setItemsPerPage, + someSelected: someSelected.value, + allSelected: allSelected.value, + isSelected, + select, + selectAll, + toggleSelect, + isExpanded, + toggleExpand, + isGroupOpen, + toggleGroup, + items: paginatedItemsWithoutGroups.value.map(item => item.raw), + internalItems: paginatedItemsWithoutGroups.value, + groupedItems: paginatedItems.value, + columns: columns.value, + headers: headers.value + })); + useRender(() => { + const dataTableFooterProps = VDataTableFooter.filterProps(props); + const dataTableHeadersProps = VDataTableHeaders.filterProps(props); + const dataTableRowsProps = VDataTableRows.filterProps(props); + const tableProps = VTable.filterProps(props); + return _createVNode$V(VTable, _mergeProps$s({ + "class": ['v-data-table', { + 'v-data-table--show-select': props.showSelect, + 'v-data-table--loading': props.loading + }, props.class], + "style": props.style + }, tableProps), { + top: () => slots.top?.(slotProps.value), + default: () => slots.default ? slots.default(slotProps.value) : _createVNode$V(_Fragment$f, null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && _createVNode$V("thead", { + "key": "thead" + }, [_createVNode$V(VDataTableHeaders, dataTableHeadersProps, slots)]), slots.thead?.(slotProps.value), !props.hideDefaultBody && _createVNode$V("tbody", null, [slots['body.prepend']?.(slotProps.value), slots.body ? slots.body(slotProps.value) : _createVNode$V(VDataTableRows, _mergeProps$s(attrs, dataTableRowsProps, { + "items": paginatedItems.value + }), slots), slots['body.append']?.(slotProps.value)]), slots.tbody?.(slotProps.value), slots.tfoot?.(slotProps.value)]), + bottom: () => slots.bottom ? slots.bottom(slotProps.value) : !props.hideDefaultFooter && _createVNode$V(_Fragment$f, null, [_createVNode$V(VDivider, null, null), _createVNode$V(VDataTableFooter, dataTableFooterProps, { + prepend: slots['footer.prepend'] + })]) + }); + }); + return {}; + } +}); + +const {createVNode:_createVNode$U,mergeProps:_mergeProps$r,resolveDirective:_resolveDirective$q} = await importShared('vue'); +const {computed: computed$G,shallowRef: shallowRef$d,toRef: toRef$f,toRefs: toRefs$2} = await importShared('vue'); +const makeVDataTableVirtualProps = propsFactory({ + ...makeDataTableProps(), + ...makeDataTableGroupProps(), + ...makeVirtualProps(), + ...makeFilterProps() +}, 'VDataTableVirtual'); +const VDataTableVirtual = genericComponent()({ + name: 'VDataTableVirtual', + props: makeVDataTableVirtualProps(), + emits: { + 'update:modelValue': value => true, + 'update:sortBy': value => true, + 'update:options': value => true, + 'update:groupBy': value => true, + 'update:expanded': value => true + }, + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const { + groupBy + } = createGroupBy(props); + const { + sortBy, + multiSort, + mustSort + } = createSort(props); + const { + disableSort + } = toRefs$2(props); + const { + columns, + headers, + filterFunctions, + sortFunctions, + sortRawFunctions + } = createHeaders(props, { + groupBy, + showSelect: toRef$f(props, 'showSelect'), + showExpand: toRef$f(props, 'showExpand') + }); + const { + items + } = useDataTableItems(props, columns); + const search = toRef$f(props, 'search'); + const { + filteredItems + } = useFilter(props, items, search, { + transform: item => item.columns, + customKeyFilter: filterFunctions + }); + const { + toggleSort + } = provideSort({ + sortBy, + multiSort, + mustSort + }); + const { + sortByWithGroups, + opened, + extractRows, + isGroupOpen, + toggleGroup + } = provideGroupBy({ + groupBy, + sortBy, + disableSort + }); + const { + sortedItems + } = useSortedItems(props, filteredItems, sortByWithGroups, { + transform: item => ({ + ...item.raw, + ...item.columns + }), + sortFunctions, + sortRawFunctions + }); + const { + flatItems + } = useGroupedItems(sortedItems, groupBy, opened); + const allItems = computed$G(() => extractRows(flatItems.value)); + const { + isSelected, + select, + selectAll, + toggleSelect, + someSelected, + allSelected + } = provideSelection(props, { + allItems, + currentPage: allItems + }); + const { + isExpanded, + toggleExpand + } = provideExpanded(props); + const { + containerRef, + markerRef, + paddingTop, + paddingBottom, + computedItems, + handleItemResize, + handleScroll, + handleScrollend + } = useVirtual(props, flatItems); + const displayItems = computed$G(() => computedItems.value.map(item => item.raw)); + useOptions({ + sortBy, + page: shallowRef$d(1), + itemsPerPage: shallowRef$d(-1), + groupBy, + search + }); + provideDefaults({ + VDataTableRows: { + hideNoData: toRef$f(props, 'hideNoData'), + noDataText: toRef$f(props, 'noDataText'), + loading: toRef$f(props, 'loading'), + loadingText: toRef$f(props, 'loadingText') + } + }); + const slotProps = computed$G(() => ({ + sortBy: sortBy.value, + toggleSort, + someSelected: someSelected.value, + allSelected: allSelected.value, + isSelected, + select, + selectAll, + toggleSelect, + isExpanded, + toggleExpand, + isGroupOpen, + toggleGroup, + items: allItems.value.map(item => item.raw), + internalItems: allItems.value, + groupedItems: flatItems.value, + columns: columns.value, + headers: headers.value + })); + useRender(() => { + const dataTableHeadersProps = VDataTableHeaders.filterProps(props); + const dataTableRowsProps = VDataTableRows.filterProps(props); + const tableProps = VTable.filterProps(props); + return _createVNode$U(VTable, _mergeProps$r({ + "class": ['v-data-table', { + 'v-data-table--loading': props.loading + }, props.class], + "style": props.style + }, tableProps), { + top: () => slots.top?.(slotProps.value), + wrapper: () => _createVNode$U("div", { + "ref": containerRef, + "onScrollPassive": handleScroll, + "onScrollend": handleScrollend, + "class": "v-table__wrapper", + "style": { + height: convertToUnit(props.height) + } + }, [_createVNode$U("table", null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && _createVNode$U("thead", { + "key": "thead" + }, [_createVNode$U(VDataTableHeaders, _mergeProps$r(dataTableHeadersProps, { + "sticky": props.fixedHeader + }), slots)]), !props.hideDefaultBody && _createVNode$U("tbody", null, [_createVNode$U("tr", { + "ref": markerRef, + "style": { + height: convertToUnit(paddingTop.value), + border: 0 + } + }, [_createVNode$U("td", { + "colspan": columns.value.length, + "style": { + height: 0, + border: 0 + } + }, null)]), slots['body.prepend']?.(slotProps.value), _createVNode$U(VDataTableRows, _mergeProps$r(attrs, dataTableRowsProps, { + "items": displayItems.value + }), { + ...slots, + item: itemSlotProps => _createVNode$U(VVirtualScrollItem, { + "key": itemSlotProps.internalItem.index, + "renderless": true, + "onUpdate:height": height => handleItemResize(itemSlotProps.internalItem.index, height) + }, { + default: _ref2 => { + let { + itemRef + } = _ref2; + return slots.item?.({ + ...itemSlotProps, + itemRef + }) ?? _createVNode$U(VDataTableRow, _mergeProps$r(itemSlotProps.props, { + "ref": itemRef, + "key": itemSlotProps.internalItem.index, + "index": itemSlotProps.internalItem.index + }), slots); + } + }) + }), slots['body.append']?.(slotProps.value), _createVNode$U("tr", { + "style": { + height: convertToUnit(paddingBottom.value), + border: 0 + } + }, [_createVNode$U("td", { + "colspan": columns.value.length, + "style": { + height: 0, + border: 0 + } + }, null)])])])]), + bottom: () => slots.bottom?.(slotProps.value) + }); + }); + } +}); + +const {createVNode:_createVNode$T,mergeProps:_mergeProps$q,resolveDirective:_resolveDirective$p,Fragment:_Fragment$e} = await importShared('vue'); +const {computed: computed$F,provide: provide$1,toRef: toRef$e,toRefs: toRefs$1} = await importShared('vue'); +const makeVDataTableServerProps = propsFactory({ + itemsLength: { + type: [Number, String], + required: true + }, + ...makeDataTablePaginateProps(), + ...makeDataTableProps(), + ...makeVDataTableFooterProps() +}, 'VDataTableServer'); +const VDataTableServer = genericComponent()({ + name: 'VDataTableServer', + props: makeVDataTableServerProps(), + emits: { + 'update:modelValue': value => true, + 'update:page': page => true, + 'update:itemsPerPage': page => true, + 'update:sortBy': sortBy => true, + 'update:options': options => true, + 'update:expanded': options => true, + 'update:groupBy': value => true + }, + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const { + groupBy + } = createGroupBy(props); + const { + sortBy, + multiSort, + mustSort + } = createSort(props); + const { + page, + itemsPerPage + } = createPagination(props); + const { + disableSort + } = toRefs$1(props); + const itemsLength = computed$F(() => parseInt(props.itemsLength, 10)); + const { + columns, + headers + } = createHeaders(props, { + groupBy, + showSelect: toRef$e(props, 'showSelect'), + showExpand: toRef$e(props, 'showExpand') + }); + const { + items + } = useDataTableItems(props, columns); + const { + toggleSort + } = provideSort({ + sortBy, + multiSort, + mustSort, + page + }); + const { + opened, + isGroupOpen, + toggleGroup, + extractRows + } = provideGroupBy({ + groupBy, + sortBy, + disableSort + }); + const { + pageCount, + setItemsPerPage + } = providePagination({ + page, + itemsPerPage, + itemsLength + }); + const { + flatItems + } = useGroupedItems(items, groupBy, opened); + const { + isSelected, + select, + selectAll, + toggleSelect, + someSelected, + allSelected + } = provideSelection(props, { + allItems: items, + currentPage: items + }); + const { + isExpanded, + toggleExpand + } = provideExpanded(props); + const itemsWithoutGroups = computed$F(() => extractRows(items.value)); + useOptions({ + page, + itemsPerPage, + sortBy, + groupBy, + search: toRef$e(props, 'search') + }); + provide$1('v-data-table', { + toggleSort, + sortBy + }); + provideDefaults({ + VDataTableRows: { + hideNoData: toRef$e(props, 'hideNoData'), + noDataText: toRef$e(props, 'noDataText'), + loading: toRef$e(props, 'loading'), + loadingText: toRef$e(props, 'loadingText') + } + }); + const slotProps = computed$F(() => ({ + page: page.value, + itemsPerPage: itemsPerPage.value, + sortBy: sortBy.value, + pageCount: pageCount.value, + toggleSort, + setItemsPerPage, + someSelected: someSelected.value, + allSelected: allSelected.value, + isSelected, + select, + selectAll, + toggleSelect, + isExpanded, + toggleExpand, + isGroupOpen, + toggleGroup, + items: itemsWithoutGroups.value.map(item => item.raw), + internalItems: itemsWithoutGroups.value, + groupedItems: flatItems.value, + columns: columns.value, + headers: headers.value + })); + useRender(() => { + const dataTableFooterProps = VDataTableFooter.filterProps(props); + const dataTableHeadersProps = VDataTableHeaders.filterProps(props); + const dataTableRowsProps = VDataTableRows.filterProps(props); + const tableProps = VTable.filterProps(props); + return _createVNode$T(VTable, _mergeProps$q({ + "class": ['v-data-table', { + 'v-data-table--loading': props.loading + }, props.class], + "style": props.style + }, tableProps), { + top: () => slots.top?.(slotProps.value), + default: () => slots.default ? slots.default(slotProps.value) : _createVNode$T(_Fragment$e, null, [slots.colgroup?.(slotProps.value), !props.hideDefaultHeader && _createVNode$T("thead", { + "key": "thead", + "class": "v-data-table__thead", + "role": "rowgroup" + }, [_createVNode$T(VDataTableHeaders, _mergeProps$q(dataTableHeadersProps, { + "sticky": props.fixedHeader + }), slots)]), slots.thead?.(slotProps.value), !props.hideDefaultBody && _createVNode$T("tbody", { + "class": "v-data-table__tbody", + "role": "rowgroup" + }, [slots['body.prepend']?.(slotProps.value), slots.body ? slots.body(slotProps.value) : _createVNode$T(VDataTableRows, _mergeProps$q(attrs, dataTableRowsProps, { + "items": flatItems.value + }), slots), slots['body.append']?.(slotProps.value)]), slots.tbody?.(slotProps.value), slots.tfoot?.(slotProps.value)]), + bottom: () => slots.bottom ? slots.bottom(slotProps.value) : !props.hideDefaultFooter && _createVNode$T(_Fragment$e, null, [_createVNode$T(VDivider, null, null), _createVNode$T(VDataTableFooter, dataTableFooterProps, { + prepend: slots['footer.prepend'] + })]) + }); + }); + } +}); + +const {createVNode:_createVNode$S,resolveDirective:_resolveDirective$o} = await importShared('vue'); +const makeVContainerProps = propsFactory({ + fluid: { + type: Boolean, + default: false + }, + ...makeComponentProps(), + ...makeDimensionProps(), + ...makeTagProps() +}, 'VContainer'); +const VContainer = genericComponent()({ + name: 'VContainer', + props: makeVContainerProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + rtlClasses + } = useRtl(); + const { + dimensionStyles + } = useDimension(props); + useRender(() => _createVNode$S(props.tag, { + "class": ['v-container', { + 'v-container--fluid': props.fluid + }, rtlClasses.value, props.class], + "style": [dimensionStyles.value, props.style] + }, slots)); + return {}; + } +}); + +const {capitalize: capitalize$1,computed: computed$E,h: h$2} = await importShared('vue'); +const breakpointProps = (() => { + return breakpoints.reduce((props, val) => { + props[val] = { + type: [Boolean, String, Number], + default: false + }; + return props; + }, {}); +})(); +const offsetProps = (() => { + return breakpoints.reduce((props, val) => { + const offsetKey = 'offset' + capitalize$1(val); + props[offsetKey] = { + type: [String, Number], + default: null + }; + return props; + }, {}); +})(); +const orderProps = (() => { + return breakpoints.reduce((props, val) => { + const orderKey = 'order' + capitalize$1(val); + props[orderKey] = { + type: [String, Number], + default: null + }; + return props; + }, {}); +})(); +const propMap$1 = { + col: Object.keys(breakpointProps), + offset: Object.keys(offsetProps), + order: Object.keys(orderProps) +}; +function breakpointClass$1(type, prop, val) { + let className = type; + if (val == null || val === false) { + return undefined; + } + if (prop) { + const breakpoint = prop.replace(type, ''); + className += `-${breakpoint}`; + } + if (type === 'col') { + className = 'v-' + className; + } + // Handling the boolean style prop when accepting [Boolean, String, Number] + // means Vue will not convert to sm: true for us. + // Since the default is false, an empty string indicates the prop's presence. + if (type === 'col' && (val === '' || val === true)) { + // .v-col-md + return className.toLowerCase(); + } + // .order-md-6 + className += `-${val}`; + return className.toLowerCase(); +} +const ALIGN_SELF_VALUES = ['auto', 'start', 'end', 'center', 'baseline', 'stretch']; +const makeVColProps = propsFactory({ + cols: { + type: [Boolean, String, Number], + default: false + }, + ...breakpointProps, + offset: { + type: [String, Number], + default: null + }, + ...offsetProps, + order: { + type: [String, Number], + default: null + }, + ...orderProps, + alignSelf: { + type: String, + default: null, + validator: str => ALIGN_SELF_VALUES.includes(str) + }, + ...makeComponentProps(), + ...makeTagProps() +}, 'VCol'); +const VCol = genericComponent()({ + name: 'VCol', + props: makeVColProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const classes = computed$E(() => { + const classList = []; + + // Loop through `col`, `offset`, `order` breakpoint props + let type; + for (type in propMap$1) { + propMap$1[type].forEach(prop => { + const value = props[prop]; + const className = breakpointClass$1(type, prop, value); + if (className) classList.push(className); + }); + } + const hasColClasses = classList.some(className => className.startsWith('v-col-')); + classList.push({ + // Default to .v-col if no other col-{bp}-* classes generated nor `cols` specified. + 'v-col': !hasColClasses || !props.cols, + [`v-col-${props.cols}`]: props.cols, + [`offset-${props.offset}`]: props.offset, + [`order-${props.order}`]: props.order, + [`align-self-${props.alignSelf}`]: props.alignSelf + }); + return classList; + }); + return () => h$2(props.tag, { + class: [classes.value, props.class], + style: props.style + }, slots.default?.()); + } +}); + +const {capitalize,computed: computed$D,h: h$1} = await importShared('vue'); +const ALIGNMENT = ['start', 'end', 'center']; +const SPACE = ['space-between', 'space-around', 'space-evenly']; +function makeRowProps(prefix, def) { + return breakpoints.reduce((props, val) => { + const prefixKey = prefix + capitalize(val); + props[prefixKey] = def(); + return props; + }, {}); +} +const ALIGN_VALUES = [...ALIGNMENT, 'baseline', 'stretch']; +const alignValidator = str => ALIGN_VALUES.includes(str); +const alignProps = makeRowProps('align', () => ({ + type: String, + default: null, + validator: alignValidator +})); +const JUSTIFY_VALUES = [...ALIGNMENT, ...SPACE]; +const justifyValidator = str => JUSTIFY_VALUES.includes(str); +const justifyProps = makeRowProps('justify', () => ({ + type: String, + default: null, + validator: justifyValidator +})); +const ALIGN_CONTENT_VALUES = [...ALIGNMENT, ...SPACE, 'stretch']; +const alignContentValidator = str => ALIGN_CONTENT_VALUES.includes(str); +const alignContentProps = makeRowProps('alignContent', () => ({ + type: String, + default: null, + validator: alignContentValidator +})); +const propMap = { + align: Object.keys(alignProps), + justify: Object.keys(justifyProps), + alignContent: Object.keys(alignContentProps) +}; +const classMap = { + align: 'align', + justify: 'justify', + alignContent: 'align-content' +}; +function breakpointClass(type, prop, val) { + let className = classMap[type]; + if (val == null) { + return undefined; + } + if (prop) { + // alignSm -> Sm + const breakpoint = prop.replace(type, ''); + className += `-${breakpoint}`; + } + // .align-items-sm-center + className += `-${val}`; + return className.toLowerCase(); +} +const makeVRowProps = propsFactory({ + dense: Boolean, + noGutters: Boolean, + align: { + type: String, + default: null, + validator: alignValidator + }, + ...alignProps, + justify: { + type: String, + default: null, + validator: justifyValidator + }, + ...justifyProps, + alignContent: { + type: String, + default: null, + validator: alignContentValidator + }, + ...alignContentProps, + ...makeComponentProps(), + ...makeTagProps() +}, 'VRow'); +const VRow = genericComponent()({ + name: 'VRow', + props: makeVRowProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const classes = computed$D(() => { + const classList = []; + + // Loop through `align`, `justify`, `alignContent` breakpoint props + let type; + for (type in propMap) { + propMap[type].forEach(prop => { + const value = props[prop]; + const className = breakpointClass(type, prop, value); + if (className) classList.push(className); + }); + } + classList.push({ + 'v-row--no-gutters': props.noGutters, + 'v-row--dense': props.dense, + [`align-${props.align}`]: props.align, + [`justify-${props.justify}`]: props.justify, + [`align-content-${props.alignContent}`]: props.alignContent + }); + return classList; + }); + return () => h$1(props.tag, { + class: ['v-row', classes.value, props.class], + style: props.style + }, slots.default?.()); + } +}); + +// Styles +const VSpacer = createSimpleFunctional('v-spacer', 'div', 'VSpacer'); + +const {createVNode:_createVNode$R} = await importShared('vue'); +const {computed: computed$C} = await importShared('vue'); +const makeVDatePickerControlsProps = propsFactory({ + active: { + type: [String, Array], + default: undefined + }, + disabled: { + type: [Boolean, String, Array], + default: false + }, + nextIcon: { + type: IconValue, + default: '$next' + }, + prevIcon: { + type: IconValue, + default: '$prev' + }, + modeIcon: { + type: IconValue, + default: '$subgroup' + }, + text: String, + viewMode: { + type: String, + default: 'month' + } +}, 'VDatePickerControls'); +const VDatePickerControls = genericComponent()({ + name: 'VDatePickerControls', + props: makeVDatePickerControlsProps(), + emits: { + 'click:year': () => true, + 'click:month': () => true, + 'click:prev': () => true, + 'click:next': () => true, + 'click:text': () => true + }, + setup(props, _ref) { + let { + emit + } = _ref; + const disableMonth = computed$C(() => { + return Array.isArray(props.disabled) ? props.disabled.includes('text') : !!props.disabled; + }); + const disableYear = computed$C(() => { + return Array.isArray(props.disabled) ? props.disabled.includes('mode') : !!props.disabled; + }); + const disablePrev = computed$C(() => { + return Array.isArray(props.disabled) ? props.disabled.includes('prev') : !!props.disabled; + }); + const disableNext = computed$C(() => { + return Array.isArray(props.disabled) ? props.disabled.includes('next') : !!props.disabled; + }); + function onClickPrev() { + emit('click:prev'); + } + function onClickNext() { + emit('click:next'); + } + function onClickYear() { + emit('click:year'); + } + function onClickMonth() { + emit('click:month'); + } + useRender(() => { + // TODO: add slot support and scope defaults + return _createVNode$R("div", { + "class": ['v-date-picker-controls'] + }, [_createVNode$R(VBtn, { + "class": "v-date-picker-controls__month-btn", + "disabled": disableMonth.value, + "text": props.text, + "variant": "text", + "rounded": true, + "onClick": onClickMonth + }, null), _createVNode$R(VBtn, { + "key": "mode-btn", + "class": "v-date-picker-controls__mode-btn", + "disabled": disableYear.value, + "density": "comfortable", + "icon": props.modeIcon, + "variant": "text", + "onClick": onClickYear + }, null), _createVNode$R(VSpacer, { + "key": "mode-spacer" + }, null), _createVNode$R("div", { + "key": "month-buttons", + "class": "v-date-picker-controls__month" + }, [_createVNode$R(VBtn, { + "disabled": disablePrev.value, + "icon": props.prevIcon, + "variant": "text", + "onClick": onClickPrev + }, null), _createVNode$R(VBtn, { + "disabled": disableNext.value, + "icon": props.nextIcon, + "variant": "text", + "onClick": onClickNext + }, null)])]); + }); + return {}; + } +}); + +const {createVNode:_createVNode$Q} = await importShared('vue'); +const makeVDatePickerHeaderProps = propsFactory({ + appendIcon: String, + color: String, + header: String, + transition: String, + onClick: EventProp() +}, 'VDatePickerHeader'); +const VDatePickerHeader = genericComponent()({ + name: 'VDatePickerHeader', + props: makeVDatePickerHeaderProps(), + emits: { + click: () => true, + 'click:append': () => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(props, 'color'); + function onClick() { + emit('click'); + } + function onClickAppend() { + emit('click:append'); + } + useRender(() => { + const hasContent = !!(slots.default || props.header); + const hasAppend = !!(slots.append || props.appendIcon); + return _createVNode$Q("div", { + "class": ['v-date-picker-header', { + 'v-date-picker-header--clickable': !!props.onClick + }, backgroundColorClasses.value], + "style": backgroundColorStyles.value, + "onClick": onClick + }, [slots.prepend && _createVNode$Q("div", { + "key": "prepend", + "class": "v-date-picker-header__prepend" + }, [slots.prepend()]), hasContent && _createVNode$Q(MaybeTransition, { + "key": "content", + "name": props.transition + }, { + default: () => [_createVNode$Q("div", { + "key": props.header, + "class": "v-date-picker-header__content" + }, [slots.default?.() ?? props.header])] + }), hasAppend && _createVNode$Q("div", { + "class": "v-date-picker-header__append" + }, [!slots.append ? _createVNode$Q(VBtn, { + "key": "append-btn", + "icon": props.appendIcon, + "variant": "text", + "onClick": onClickAppend + }, null) : _createVNode$Q(VDefaultsProvider, { + "key": "append-defaults", + "disabled": !props.appendIcon, + "defaults": { + VBtn: { + icon: props.appendIcon, + variant: 'text' + } + } + }, { + default: () => [slots.append?.()] + })])]); + }); + return {}; + } +}); + +const {computed: computed$B} = await importShared('vue'); +// Types +// Composables +const makeCalendarProps = propsFactory({ + allowedDates: [Array, Function], + disabled: Boolean, + displayValue: null, + modelValue: Array, + month: [Number, String], + max: null, + min: null, + showAdjacentMonths: Boolean, + year: [Number, String], + weekdays: { + type: Array, + default: () => [0, 1, 2, 3, 4, 5, 6] + }, + weeksInMonth: { + type: String, + default: 'dynamic' + }, + firstDayOfWeek: [Number, String] +}, 'calendar'); +function useCalendar(props) { + const adapter = useDate(); + const model = useProxiedModel(props, 'modelValue', [], v => wrapInArray(v)); + const displayValue = computed$B(() => { + if (props.displayValue) return adapter.date(props.displayValue); + if (model.value.length > 0) return adapter.date(model.value[0]); + if (props.min) return adapter.date(props.min); + if (Array.isArray(props.allowedDates)) return adapter.date(props.allowedDates[0]); + return adapter.date(); + }); + const year = useProxiedModel(props, 'year', undefined, v => { + const value = v != null ? Number(v) : adapter.getYear(displayValue.value); + return adapter.startOfYear(adapter.setYear(adapter.date(), value)); + }, v => adapter.getYear(v)); + const month = useProxiedModel(props, 'month', undefined, v => { + const value = v != null ? Number(v) : adapter.getMonth(displayValue.value); + const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value)); + return adapter.setMonth(date, value); + }, v => adapter.getMonth(v)); + const weekDays = computed$B(() => { + const firstDayOfWeek = Number(props.firstDayOfWeek ?? 0); + return props.weekdays.map(day => (day + firstDayOfWeek) % 7); + }); + const weeksInMonth = computed$B(() => { + const weeks = adapter.getWeekArray(month.value, props.firstDayOfWeek); + const days = weeks.flat(); + + // Make sure there's always 6 weeks in month (6 * 7 days) + // if weeksInMonth is 'static' + const daysInMonth = 6 * 7; + if (props.weeksInMonth === 'static' && days.length < daysInMonth) { + const lastDay = days[days.length - 1]; + let week = []; + for (let day = 1; day <= daysInMonth - days.length; day++) { + week.push(adapter.addDays(lastDay, day)); + if (day % 7 === 0) { + weeks.push(week); + week = []; + } + } + } + return weeks; + }); + function genDays(days, today) { + return days.filter(date => { + return weekDays.value.includes(adapter.toJsDate(date).getDay()); + }).map((date, index) => { + const isoDate = adapter.toISO(date); + const isAdjacent = !adapter.isSameMonth(date, month.value); + const isStart = adapter.isSameDay(date, adapter.startOfMonth(month.value)); + const isEnd = adapter.isSameDay(date, adapter.endOfMonth(month.value)); + const isSame = adapter.isSameDay(date, month.value); + return { + date, + isoDate, + formatted: adapter.format(date, 'keyboardDate'), + year: adapter.getYear(date), + month: adapter.getMonth(date), + isDisabled: isDisabled(date), + isWeekStart: index % 7 === 0, + isWeekEnd: index % 7 === 6, + isToday: adapter.isSameDay(date, today), + isAdjacent, + isHidden: isAdjacent && !props.showAdjacentMonths, + isStart, + isSelected: model.value.some(value => adapter.isSameDay(date, value)), + isEnd, + isSame, + localized: adapter.format(date, 'dayOfMonth') + }; + }); + } + const daysInWeek = computed$B(() => { + const lastDay = adapter.startOfWeek(displayValue.value, props.firstDayOfWeek); + const week = []; + for (let day = 0; day <= 6; day++) { + week.push(adapter.addDays(lastDay, day)); + } + const today = adapter.date(); + return genDays(week, today); + }); + const daysInMonth = computed$B(() => { + const days = weeksInMonth.value.flat(); + const today = adapter.date(); + return genDays(days, today); + }); + const weekNumbers = computed$B(() => { + return weeksInMonth.value.map(week => { + return week.length ? getWeek(adapter, week[0]) : null; + }); + }); + function isDisabled(value) { + if (props.disabled) return true; + const date = adapter.date(value); + if (props.min && adapter.isAfter(adapter.date(props.min), date)) return true; + if (props.max && adapter.isAfter(date, adapter.date(props.max))) return true; + if (Array.isArray(props.allowedDates) && props.allowedDates.length > 0) { + return !props.allowedDates.some(d => adapter.isSameDay(adapter.date(d), date)); + } + if (typeof props.allowedDates === 'function') { + return !props.allowedDates(date); + } + return false; + } + return { + displayValue, + daysInMonth, + daysInWeek, + genDays, + model, + weeksInMonth, + weekDays, + weekNumbers + }; +} + +const {createVNode:_createVNode$P,createTextVNode:_createTextVNode$2} = await importShared('vue'); +const {computed: computed$A,ref: ref$i,shallowRef: shallowRef$c,watch: watch$b} = await importShared('vue'); +const makeVDatePickerMonthProps = propsFactory({ + color: String, + hideWeekdays: Boolean, + multiple: [Boolean, Number, String], + showWeek: Boolean, + transition: { + type: String, + default: 'picker-transition' + }, + reverseTransition: { + type: String, + default: 'picker-reverse-transition' + }, + ...makeCalendarProps() +}, 'VDatePickerMonth'); +const VDatePickerMonth = genericComponent()({ + name: 'VDatePickerMonth', + props: makeVDatePickerMonthProps(), + emits: { + 'update:modelValue': date => true, + 'update:month': date => true, + 'update:year': date => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const daysRef = ref$i(); + const { + daysInMonth, + model, + weekNumbers + } = useCalendar(props); + const adapter = useDate(); + const rangeStart = shallowRef$c(); + const rangeStop = shallowRef$c(); + const isReverse = shallowRef$c(false); + const transition = computed$A(() => { + return !isReverse.value ? props.transition : props.reverseTransition; + }); + if (props.multiple === 'range' && model.value.length > 0) { + rangeStart.value = model.value[0]; + if (model.value.length > 1) { + rangeStop.value = model.value[model.value.length - 1]; + } + } + const atMax = computed$A(() => { + const max = ['number', 'string'].includes(typeof props.multiple) ? Number(props.multiple) : Infinity; + return model.value.length >= max; + }); + watch$b(daysInMonth, (val, oldVal) => { + if (!oldVal) return; + isReverse.value = adapter.isBefore(val[0].date, oldVal[0].date); + }); + function onRangeClick(value) { + const _value = adapter.startOfDay(value); + if (model.value.length === 0) { + rangeStart.value = undefined; + } else if (model.value.length === 1) { + rangeStart.value = model.value[0]; + rangeStop.value = undefined; + } + if (!rangeStart.value) { + rangeStart.value = _value; + model.value = [rangeStart.value]; + } else if (!rangeStop.value) { + if (adapter.isSameDay(_value, rangeStart.value)) { + rangeStart.value = undefined; + model.value = []; + return; + } else if (adapter.isBefore(_value, rangeStart.value)) { + rangeStop.value = adapter.endOfDay(rangeStart.value); + rangeStart.value = _value; + } else { + rangeStop.value = adapter.endOfDay(_value); + } + const diff = adapter.getDiff(rangeStop.value, rangeStart.value, 'days'); + const datesInRange = [rangeStart.value]; + for (let i = 1; i < diff; i++) { + const nextDate = adapter.addDays(rangeStart.value, i); + datesInRange.push(nextDate); + } + datesInRange.push(rangeStop.value); + model.value = datesInRange; + } else { + rangeStart.value = value; + rangeStop.value = undefined; + model.value = [rangeStart.value]; + } + } + function onMultipleClick(value) { + const index = model.value.findIndex(selection => adapter.isSameDay(selection, value)); + if (index === -1) { + model.value = [...model.value, value]; + } else { + const value = [...model.value]; + value.splice(index, 1); + model.value = value; + } + } + function onClick(value) { + if (props.multiple === 'range') { + onRangeClick(value); + } else if (props.multiple) { + onMultipleClick(value); + } else { + model.value = [value]; + } + } + return () => _createVNode$P("div", { + "class": "v-date-picker-month" + }, [props.showWeek && _createVNode$P("div", { + "key": "weeks", + "class": "v-date-picker-month__weeks" + }, [!props.hideWeekdays && _createVNode$P("div", { + "key": "hide-week-days", + "class": "v-date-picker-month__day" + }, [_createTextVNode$2("\xA0")]), weekNumbers.value.map(week => _createVNode$P("div", { + "class": ['v-date-picker-month__day', 'v-date-picker-month__day--adjacent'] + }, [week]))]), _createVNode$P(MaybeTransition, { + "name": transition.value + }, { + default: () => [_createVNode$P("div", { + "ref": daysRef, + "key": daysInMonth.value[0].date?.toString(), + "class": "v-date-picker-month__days" + }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => _createVNode$P("div", { + "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday'] + }, [weekDay])), daysInMonth.value.map((item, i) => { + const slotProps = { + props: { + onClick: () => onClick(item.date) + }, + item, + i + }; + if (atMax.value && !item.isSelected) { + item.isDisabled = true; + } + return _createVNode$P("div", { + "class": ['v-date-picker-month__day', { + 'v-date-picker-month__day--adjacent': item.isAdjacent, + 'v-date-picker-month__day--hide-adjacent': item.isHidden, + 'v-date-picker-month__day--selected': item.isSelected, + 'v-date-picker-month__day--week-end': item.isWeekEnd, + 'v-date-picker-month__day--week-start': item.isWeekStart + }], + "data-v-date": !item.isDisabled ? item.isoDate : undefined + }, [(props.showAdjacentMonths || !item.isAdjacent) && _createVNode$P(VDefaultsProvider, { + "defaults": { + VBtn: { + class: 'v-date-picker-month__day-btn', + color: (item.isSelected || item.isToday) && !item.isDisabled ? props.color : undefined, + disabled: item.isDisabled, + icon: true, + ripple: false, + text: item.localized, + variant: item.isDisabled ? item.isToday ? 'outlined' : 'text' : item.isToday && !item.isSelected ? 'outlined' : 'flat', + onClick: () => onClick(item.date) + } + } + }, { + default: () => [slots.day?.(slotProps) ?? _createVNode$P(VBtn, slotProps.props, null)] + })]); + })])] + })]); + } +}); + +const {createVNode:_createVNode$O,mergeProps:_mergeProps$p} = await importShared('vue'); +const {computed: computed$z,watchEffect: watchEffect$7} = await importShared('vue'); +const makeVDatePickerMonthsProps = propsFactory({ + color: String, + height: [String, Number], + min: null, + max: null, + modelValue: Number, + year: Number +}, 'VDatePickerMonths'); +const VDatePickerMonths = genericComponent()({ + name: 'VDatePickerMonths', + props: makeVDatePickerMonthsProps(), + emits: { + 'update:modelValue': date => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const adapter = useDate(); + const model = useProxiedModel(props, 'modelValue'); + const months = computed$z(() => { + let date = adapter.startOfYear(adapter.date()); + if (props.year) { + date = adapter.setYear(date, props.year); + } + return createRange(12).map(i => { + const text = adapter.format(date, 'monthShort'); + const isDisabled = !!(props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max)))); + date = adapter.getNextMonth(date); + return { + isDisabled, + text, + value: i + }; + }); + }); + watchEffect$7(() => { + model.value = model.value ?? adapter.getMonth(adapter.date()); + }); + useRender(() => _createVNode$O("div", { + "class": "v-date-picker-months", + "style": { + height: convertToUnit(props.height) + } + }, [_createVNode$O("div", { + "class": "v-date-picker-months__content" + }, [months.value.map((month, i) => { + const btnProps = { + active: model.value === i, + color: model.value === i ? props.color : undefined, + disabled: month.isDisabled, + rounded: true, + text: month.text, + variant: model.value === month.value ? 'flat' : 'text', + onClick: () => onClick(i) + }; + function onClick(i) { + if (model.value === i) { + emit('update:modelValue', model.value); + return; + } + model.value = i; + } + return slots.month?.({ + month, + i, + props: btnProps + }) ?? _createVNode$O(VBtn, _mergeProps$p({ + "key": "month" + }, btnProps), null); + })])])); + return {}; + } +}); + +const {createVNode:_createVNode$N,mergeProps:_mergeProps$o} = await importShared('vue'); +const {computed: computed$y,nextTick: nextTick$7,onMounted: onMounted$5,watchEffect: watchEffect$6} = await importShared('vue'); +// Types +const makeVDatePickerYearsProps = propsFactory({ + color: String, + height: [String, Number], + min: null, + max: null, + modelValue: Number +}, 'VDatePickerYears'); +const VDatePickerYears = genericComponent()({ + name: 'VDatePickerYears', + props: makeVDatePickerYearsProps(), + emits: { + 'update:modelValue': year => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const adapter = useDate(); + const model = useProxiedModel(props, 'modelValue'); + const years = computed$y(() => { + const year = adapter.getYear(adapter.date()); + let min = year - 100; + let max = year + 52; + if (props.min) { + min = adapter.getYear(adapter.date(props.min)); + } + if (props.max) { + max = adapter.getYear(adapter.date(props.max)); + } + let date = adapter.startOfYear(adapter.date()); + date = adapter.setYear(date, min); + return createRange(max - min + 1, min).map(i => { + const text = adapter.format(date, 'year'); + date = adapter.setYear(date, adapter.getYear(date) + 1); + return { + text, + value: i + }; + }); + }); + watchEffect$6(() => { + model.value = model.value ?? adapter.getYear(adapter.date()); + }); + const yearRef = templateRef(); + onMounted$5(async () => { + await nextTick$7(); + yearRef.el?.scrollIntoView({ + block: 'center' + }); + }); + useRender(() => _createVNode$N("div", { + "class": "v-date-picker-years", + "style": { + height: convertToUnit(props.height) + } + }, [_createVNode$N("div", { + "class": "v-date-picker-years__content" + }, [years.value.map((year, i) => { + const btnProps = { + ref: model.value === year.value ? yearRef : undefined, + active: model.value === year.value, + color: model.value === year.value ? props.color : undefined, + rounded: true, + text: year.text, + variant: model.value === year.value ? 'flat' : 'text', + onClick: () => { + if (model.value === year.value) { + emit('update:modelValue', model.value); + return; + } + model.value = year.value; + } + }; + return slots.year?.({ + year, + i, + props: btnProps + }) ?? _createVNode$N(VBtn, _mergeProps$o({ + "key": "month" + }, btnProps), null); + })])])); + return {}; + } +}); + +// Utilities +const VPickerTitle = createSimpleFunctional('v-picker-title'); + +const {mergeProps:_mergeProps$n,createVNode:_createVNode$M} = await importShared('vue'); +const {toRef: toRef$d} = await importShared('vue'); +const makeVPickerProps = propsFactory({ + bgColor: String, + landscape: Boolean, + title: String, + hideHeader: Boolean, + ...makeVSheetProps() +}, 'VPicker'); +const VPicker = genericComponent()({ + name: 'VPicker', + props: makeVPickerProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$d(props, 'color')); + useRender(() => { + const sheetProps = VSheet.filterProps(props); + const hasTitle = !!(props.title || slots.title); + return _createVNode$M(VSheet, _mergeProps$n(sheetProps, { + "color": props.bgColor, + "class": ['v-picker', { + 'v-picker--landscape': props.landscape, + 'v-picker--with-actions': !!slots.actions + }, props.class], + "style": props.style + }), { + default: () => [!props.hideHeader && _createVNode$M("div", { + "key": "header", + "class": [backgroundColorClasses.value], + "style": [backgroundColorStyles.value] + }, [hasTitle && _createVNode$M(VPickerTitle, { + "key": "picker-title" + }, { + default: () => [slots.title?.() ?? props.title] + }), slots.header && _createVNode$M("div", { + "class": "v-picker__header" + }, [slots.header()])]), _createVNode$M("div", { + "class": "v-picker__body" + }, [slots.default?.()]), slots.actions && _createVNode$M(VDefaultsProvider, { + "defaults": { + VBtn: { + slim: true, + variant: 'text' + } + } + }, { + default: () => [_createVNode$M("div", { + "class": "v-picker__actions" + }, [slots.actions()])] + })] + }); + }); + return {}; + } +}); + +const {Fragment:_Fragment$d,mergeProps:_mergeProps$m,resolveDirective:_resolveDirective$n,createVNode:_createVNode$L} = await importShared('vue'); +const {computed: computed$x,ref: ref$h,shallowRef: shallowRef$b,watch: watch$a} = await importShared('vue'); +// Types +const makeVDatePickerProps = propsFactory({ + // TODO: implement in v3.5 + // calendarIcon: { + // type: String, + // default: '$calendar', + // }, + // keyboardIcon: { + // type: String, + // default: '$edit', + // }, + // inputMode: { + // type: String as PropType<'calendar' | 'keyboard'>, + // default: 'calendar', + // }, + // inputText: { + // type: String, + // default: '$vuetify.datePicker.input.placeholder', + // }, + // inputPlaceholder: { + // type: String, + // default: 'dd/mm/yyyy', + // }, + header: { + type: String, + default: '$vuetify.datePicker.header' + }, + ...makeVDatePickerControlsProps(), + ...makeVDatePickerMonthProps({ + weeksInMonth: 'static' + }), + ...omit(makeVDatePickerMonthsProps(), ['modelValue']), + ...omit(makeVDatePickerYearsProps(), ['modelValue']), + ...makeVPickerProps({ + title: '$vuetify.datePicker.title' + }), + modelValue: null +}, 'VDatePicker'); +const VDatePicker = genericComponent()({ + name: 'VDatePicker', + props: makeVDatePickerProps(), + emits: { + 'update:modelValue': date => true, + 'update:month': date => true, + 'update:year': date => true, + // 'update:inputMode': (date: any) => true, + 'update:viewMode': date => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const adapter = useDate(); + const { + t + } = useLocale(); + const model = useProxiedModel(props, 'modelValue', undefined, v => wrapInArray(v), v => props.multiple ? v : v[0]); + const viewMode = useProxiedModel(props, 'viewMode'); + // const inputMode = useProxiedModel(props, 'inputMode') + const internal = computed$x(() => { + const value = adapter.date(model.value?.[0]); + return value && adapter.isValid(value) ? value : adapter.date(); + }); + const month = ref$h(Number(props.month ?? adapter.getMonth(adapter.startOfMonth(internal.value)))); + const year = ref$h(Number(props.year ?? adapter.getYear(adapter.startOfYear(adapter.setMonth(internal.value, month.value))))); + const isReversing = shallowRef$b(false); + const header = computed$x(() => { + if (props.multiple && model.value.length > 1) { + return t('$vuetify.datePicker.itemsSelected', model.value.length); + } + return model.value[0] && adapter.isValid(model.value[0]) ? adapter.format(adapter.date(model.value[0]), 'normalDateWithWeekday') : t(props.header); + }); + const text = computed$x(() => { + let date = adapter.date(); + date = adapter.setDate(date, 1); + date = adapter.setMonth(date, month.value); + date = adapter.setYear(date, year.value); + return adapter.format(date, 'monthAndYear'); + }); + // const headerIcon = computed(() => props.inputMode === 'calendar' ? props.keyboardIcon : props.calendarIcon) + const headerTransition = computed$x(() => `date-picker-header${isReversing.value ? '-reverse' : ''}-transition`); + const minDate = computed$x(() => { + const date = adapter.date(props.min); + return props.min && adapter.isValid(date) ? date : null; + }); + const maxDate = computed$x(() => { + const date = adapter.date(props.max); + return props.max && adapter.isValid(date) ? date : null; + }); + const disabled = computed$x(() => { + if (props.disabled) return true; + const targets = []; + if (viewMode.value !== 'month') { + targets.push(...['prev', 'next']); + } else { + let _date = adapter.date(); + _date = adapter.setYear(_date, year.value); + _date = adapter.setMonth(_date, month.value); + if (minDate.value) { + const date = adapter.addDays(adapter.startOfMonth(_date), -1); + adapter.isAfter(minDate.value, date) && targets.push('prev'); + } + if (maxDate.value) { + const date = adapter.addDays(adapter.endOfMonth(_date), 1); + adapter.isAfter(date, maxDate.value) && targets.push('next'); + } + } + return targets; + }); + + // function onClickAppend () { + // inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar' + // } + + function onClickNext() { + if (month.value < 11) { + month.value++; + } else { + year.value++; + month.value = 0; + onUpdateYear(year.value); + } + onUpdateMonth(month.value); + } + function onClickPrev() { + if (month.value > 0) { + month.value--; + } else { + year.value--; + month.value = 11; + onUpdateYear(year.value); + } + onUpdateMonth(month.value); + } + function onClickDate() { + viewMode.value = 'month'; + } + function onClickMonth() { + viewMode.value = viewMode.value === 'months' ? 'month' : 'months'; + } + function onClickYear() { + viewMode.value = viewMode.value === 'year' ? 'month' : 'year'; + } + function onUpdateMonth(value) { + if (viewMode.value === 'months') onClickMonth(); + emit('update:month', value); + } + function onUpdateYear(value) { + if (viewMode.value === 'year') onClickYear(); + emit('update:year', value); + } + watch$a(model, (val, oldVal) => { + const arrBefore = wrapInArray(oldVal); + const arrAfter = wrapInArray(val); + if (!arrAfter.length) return; + const before = adapter.date(arrBefore[arrBefore.length - 1]); + const after = adapter.date(arrAfter[arrAfter.length - 1]); + const newMonth = adapter.getMonth(after); + const newYear = adapter.getYear(after); + if (newMonth !== month.value) { + month.value = newMonth; + onUpdateMonth(month.value); + } + if (newYear !== year.value) { + year.value = newYear; + onUpdateYear(year.value); + } + isReversing.value = adapter.isBefore(before, after); + }); + useRender(() => { + const pickerProps = VPicker.filterProps(props); + const datePickerControlsProps = VDatePickerControls.filterProps(props); + const datePickerHeaderProps = VDatePickerHeader.filterProps(props); + const datePickerMonthProps = VDatePickerMonth.filterProps(props); + const datePickerMonthsProps = omit(VDatePickerMonths.filterProps(props), ['modelValue']); + const datePickerYearsProps = omit(VDatePickerYears.filterProps(props), ['modelValue']); + const headerProps = { + header: header.value, + transition: headerTransition.value + }; + return _createVNode$L(VPicker, _mergeProps$m(pickerProps, { + "class": ['v-date-picker', `v-date-picker--${viewMode.value}`, { + 'v-date-picker--show-week': props.showWeek + }, props.class], + "style": props.style + }), { + title: () => slots.title?.() ?? _createVNode$L("div", { + "class": "v-date-picker__title" + }, [t(props.title)]), + header: () => slots.header ? _createVNode$L(VDefaultsProvider, { + "defaults": { + VDatePickerHeader: { + ...headerProps + } + } + }, { + default: () => [slots.header?.(headerProps)] + }) : _createVNode$L(VDatePickerHeader, _mergeProps$m({ + "key": "header" + }, datePickerHeaderProps, headerProps, { + "onClick": viewMode.value !== 'month' ? onClickDate : undefined + }), { + ...slots, + default: undefined + }), + default: () => _createVNode$L(_Fragment$d, null, [_createVNode$L(VDatePickerControls, _mergeProps$m(datePickerControlsProps, { + "disabled": disabled.value, + "text": text.value, + "onClick:next": onClickNext, + "onClick:prev": onClickPrev, + "onClick:month": onClickMonth, + "onClick:year": onClickYear + }), null), _createVNode$L(VFadeTransition, { + "hideOnLeave": true + }, { + default: () => [viewMode.value === 'months' ? _createVNode$L(VDatePickerMonths, _mergeProps$m({ + "key": "date-picker-months" + }, datePickerMonthsProps, { + "modelValue": month.value, + "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth], + "min": minDate.value, + "max": maxDate.value, + "year": year.value + }), null) : viewMode.value === 'year' ? _createVNode$L(VDatePickerYears, _mergeProps$m({ + "key": "date-picker-years" + }, datePickerYearsProps, { + "modelValue": year.value, + "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear], + "min": minDate.value, + "max": maxDate.value + }), null) : _createVNode$L(VDatePickerMonth, _mergeProps$m({ + "key": "date-picker-month" + }, datePickerMonthProps, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "month": month.value, + "onUpdate:month": [$event => month.value = $event, onUpdateMonth], + "year": year.value, + "onUpdate:year": [$event => year.value = $event, onUpdateYear], + "min": minDate.value, + "max": maxDate.value + }), null)] + })]), + actions: slots.actions + }); + }); + return {}; + } +}); + +const {createVNode:_createVNode$K,Fragment:_Fragment$c} = await importShared('vue'); +const {toRef: toRef$c} = await importShared('vue'); +// Types +const makeVEmptyStateProps = propsFactory({ + actionText: String, + bgColor: String, + color: String, + icon: IconValue, + image: String, + justify: { + type: String, + default: 'center' + }, + headline: String, + title: String, + text: String, + textWidth: { + type: [Number, String], + default: 500 + }, + href: String, + to: String, + ...makeComponentProps(), + ...makeDimensionProps(), + ...makeSizeProps({ + size: undefined + }), + ...makeThemeProps() +}, 'VEmptyState'); +const VEmptyState = genericComponent()({ + name: 'VEmptyState', + props: makeVEmptyStateProps(), + emits: { + 'click:action': e => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$c(props, 'bgColor')); + const { + dimensionStyles + } = useDimension(props); + const { + displayClasses + } = useDisplay(); + function onClickAction(e) { + emit('click:action', e); + } + useRender(() => { + const hasActions = !!(slots.actions || props.actionText); + const hasHeadline = !!(slots.headline || props.headline); + const hasTitle = !!(slots.title || props.title); + const hasText = !!(slots.text || props.text); + const hasMedia = !!(slots.media || props.image || props.icon); + const size = props.size || (props.image ? 200 : 96); + return _createVNode$K("div", { + "class": ['v-empty-state', { + [`v-empty-state--${props.justify}`]: true + }, themeClasses.value, backgroundColorClasses.value, displayClasses.value, props.class], + "style": [backgroundColorStyles.value, dimensionStyles.value, props.style] + }, [hasMedia && _createVNode$K("div", { + "key": "media", + "class": "v-empty-state__media" + }, [!slots.media ? _createVNode$K(_Fragment$c, null, [props.image ? _createVNode$K(VImg, { + "key": "image", + "src": props.image, + "height": size + }, null) : props.icon ? _createVNode$K(VIcon, { + "key": "icon", + "color": props.color, + "size": size, + "icon": props.icon + }, null) : undefined]) : _createVNode$K(VDefaultsProvider, { + "key": "media-defaults", + "defaults": { + VImg: { + src: props.image, + height: size + }, + VIcon: { + size, + icon: props.icon + } + } + }, { + default: () => [slots.media()] + })]), hasHeadline && _createVNode$K("div", { + "key": "headline", + "class": "v-empty-state__headline" + }, [slots.headline?.() ?? props.headline]), hasTitle && _createVNode$K("div", { + "key": "title", + "class": "v-empty-state__title" + }, [slots.title?.() ?? props.title]), hasText && _createVNode$K("div", { + "key": "text", + "class": "v-empty-state__text", + "style": { + maxWidth: convertToUnit(props.textWidth) + } + }, [slots.text?.() ?? props.text]), slots.default && _createVNode$K("div", { + "key": "content", + "class": "v-empty-state__content" + }, [slots.default()]), hasActions && _createVNode$K("div", { + "key": "actions", + "class": "v-empty-state__actions" + }, [_createVNode$K(VDefaultsProvider, { + "defaults": { + VBtn: { + class: 'v-empty-state__action-btn', + color: props.color ?? 'surface-variant', + text: props.actionText + } + } + }, { + default: () => [slots.actions?.({ + props: { + onClick: onClickAction + } + }) ?? _createVNode$K(VBtn, { + "onClick": onClickAction + }, null)] + })])]); + }); + return {}; + } +}); + +// Types + +const VExpansionPanelSymbol = Symbol.for('vuetify:v-expansion-panel'); + +const {withDirectives:_withDirectives$5,vShow:_vShow$1,createVNode:_createVNode$J} = await importShared('vue'); +const {inject: inject$4} = await importShared('vue'); +const makeVExpansionPanelTextProps = propsFactory({ + ...makeComponentProps(), + ...makeLazyProps() +}, 'VExpansionPanelText'); +const VExpansionPanelText = genericComponent()({ + name: 'VExpansionPanelText', + props: makeVExpansionPanelTextProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const expansionPanel = inject$4(VExpansionPanelSymbol); + if (!expansionPanel) throw new Error('[Vuetify] v-expansion-panel-text needs to be placed inside v-expansion-panel'); + const { + hasContent, + onAfterLeave + } = useLazy(props, expansionPanel.isSelected); + useRender(() => _createVNode$J(VExpandTransition, { + "onAfterLeave": onAfterLeave + }, { + default: () => [_withDirectives$5(_createVNode$J("div", { + "class": ['v-expansion-panel-text', props.class], + "style": props.style + }, [slots.default && hasContent.value && _createVNode$J("div", { + "class": "v-expansion-panel-text__wrapper" + }, [slots.default?.()])]), [[_vShow$1, expansionPanel.isSelected.value]])] + })); + return {}; + } +}); + +const {withDirectives:_withDirectives$4,resolveDirective:_resolveDirective$m,createVNode:_createVNode$I} = await importShared('vue'); +const {computed: computed$w,inject: inject$3} = await importShared('vue'); +const makeVExpansionPanelTitleProps = propsFactory({ + color: String, + expandIcon: { + type: IconValue, + default: '$expand' + }, + collapseIcon: { + type: IconValue, + default: '$collapse' + }, + hideActions: Boolean, + focusable: Boolean, + static: Boolean, + ripple: { + type: [Boolean, Object], + default: false + }, + readonly: Boolean, + ...makeComponentProps(), + ...makeDimensionProps() +}, 'VExpansionPanelTitle'); +const VExpansionPanelTitle = genericComponent()({ + name: 'VExpansionPanelTitle', + directives: { + Ripple + }, + props: makeVExpansionPanelTitleProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const expansionPanel = inject$3(VExpansionPanelSymbol); + if (!expansionPanel) throw new Error('[Vuetify] v-expansion-panel-title needs to be placed inside v-expansion-panel'); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(props, 'color'); + const { + dimensionStyles + } = useDimension(props); + const slotProps = computed$w(() => ({ + collapseIcon: props.collapseIcon, + disabled: expansionPanel.disabled.value, + expanded: expansionPanel.isSelected.value, + expandIcon: props.expandIcon, + readonly: props.readonly + })); + const icon = computed$w(() => expansionPanel.isSelected.value ? props.collapseIcon : props.expandIcon); + useRender(() => _withDirectives$4(_createVNode$I("button", { + "class": ['v-expansion-panel-title', { + 'v-expansion-panel-title--active': expansionPanel.isSelected.value, + 'v-expansion-panel-title--focusable': props.focusable, + 'v-expansion-panel-title--static': props.static + }, backgroundColorClasses.value, props.class], + "style": [backgroundColorStyles.value, dimensionStyles.value, props.style], + "type": "button", + "tabindex": expansionPanel.disabled.value ? -1 : undefined, + "disabled": expansionPanel.disabled.value, + "aria-expanded": expansionPanel.isSelected.value, + "onClick": !props.readonly ? expansionPanel.toggle : undefined + }, [_createVNode$I("span", { + "class": "v-expansion-panel-title__overlay" + }, null), slots.default?.(slotProps.value), !props.hideActions && _createVNode$I(VDefaultsProvider, { + "defaults": { + VIcon: { + icon: icon.value + } + } + }, { + default: () => [_createVNode$I("span", { + "class": "v-expansion-panel-title__icon" + }, [slots.actions?.(slotProps.value) ?? _createVNode$I(VIcon, null, null)])] + })]), [[_resolveDirective$m("ripple"), props.ripple]])); + return {}; + } +}); + +const {createVNode:_createVNode$H} = await importShared('vue'); +const {computed: computed$v,provide} = await importShared('vue'); +const makeVExpansionPanelProps = propsFactory({ + title: String, + text: String, + bgColor: String, + ...makeElevationProps(), + ...makeGroupItemProps(), + ...makeRoundedProps(), + ...makeTagProps(), + ...makeVExpansionPanelTitleProps(), + ...makeVExpansionPanelTextProps() +}, 'VExpansionPanel'); +const VExpansionPanel = genericComponent()({ + name: 'VExpansionPanel', + props: makeVExpansionPanelProps(), + emits: { + 'group:selected': val => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const groupItem = useGroupItem(props, VExpansionPanelSymbol); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(props, 'bgColor'); + const { + elevationClasses + } = useElevation(props); + const { + roundedClasses + } = useRounded(props); + const isDisabled = computed$v(() => groupItem?.disabled.value || props.disabled); + const selectedIndices = computed$v(() => groupItem.group.items.value.reduce((arr, item, index) => { + if (groupItem.group.selected.value.includes(item.id)) arr.push(index); + return arr; + }, [])); + const isBeforeSelected = computed$v(() => { + const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id); + return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === 1); + }); + const isAfterSelected = computed$v(() => { + const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id); + return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === -1); + }); + provide(VExpansionPanelSymbol, groupItem); + useRender(() => { + const hasText = !!(slots.text || props.text); + const hasTitle = !!(slots.title || props.title); + const expansionPanelTitleProps = VExpansionPanelTitle.filterProps(props); + const expansionPanelTextProps = VExpansionPanelText.filterProps(props); + return _createVNode$H(props.tag, { + "class": ['v-expansion-panel', { + 'v-expansion-panel--active': groupItem.isSelected.value, + 'v-expansion-panel--before-active': isBeforeSelected.value, + 'v-expansion-panel--after-active': isAfterSelected.value, + 'v-expansion-panel--disabled': isDisabled.value + }, roundedClasses.value, backgroundColorClasses.value, props.class], + "style": [backgroundColorStyles.value, props.style] + }, { + default: () => [_createVNode$H("div", { + "class": ['v-expansion-panel__shadow', ...elevationClasses.value] + }, null), _createVNode$H(VDefaultsProvider, { + "defaults": { + VExpansionPanelTitle: { + ...expansionPanelTitleProps + }, + VExpansionPanelText: { + ...expansionPanelTextProps + } + } + }, { + default: () => [hasTitle && _createVNode$H(VExpansionPanelTitle, { + "key": "title" + }, { + default: () => [slots.title ? slots.title() : props.title] + }), hasText && _createVNode$H(VExpansionPanelText, { + "key": "text" + }, { + default: () => [slots.text ? slots.text() : props.text] + }), slots.default?.()] + })] + }); + }); + return { + groupItem + }; + } +}); + +const {createVNode:_createVNode$G} = await importShared('vue'); +const {computed: computed$u,toRef: toRef$b} = await importShared('vue'); +const allowedVariants = ['default', 'accordion', 'inset', 'popout']; +const makeVExpansionPanelsProps = propsFactory({ + flat: Boolean, + ...makeGroupProps(), + ...pick(makeVExpansionPanelProps(), ['bgColor', 'collapseIcon', 'color', 'eager', 'elevation', 'expandIcon', 'focusable', 'hideActions', 'readonly', 'ripple', 'rounded', 'tile', 'static']), + ...makeThemeProps(), + ...makeComponentProps(), + ...makeTagProps(), + variant: { + type: String, + default: 'default', + validator: v => allowedVariants.includes(v) + } +}, 'VExpansionPanels'); +const VExpansionPanels = genericComponent()({ + name: 'VExpansionPanels', + props: makeVExpansionPanelsProps(), + emits: { + 'update:modelValue': val => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + next, + prev + } = useGroup(props, VExpansionPanelSymbol); + const { + themeClasses + } = provideTheme(props); + const variantClass = computed$u(() => props.variant && `v-expansion-panels--variant-${props.variant}`); + provideDefaults({ + VExpansionPanel: { + bgColor: toRef$b(props, 'bgColor'), + collapseIcon: toRef$b(props, 'collapseIcon'), + color: toRef$b(props, 'color'), + eager: toRef$b(props, 'eager'), + elevation: toRef$b(props, 'elevation'), + expandIcon: toRef$b(props, 'expandIcon'), + focusable: toRef$b(props, 'focusable'), + hideActions: toRef$b(props, 'hideActions'), + readonly: toRef$b(props, 'readonly'), + ripple: toRef$b(props, 'ripple'), + rounded: toRef$b(props, 'rounded'), + static: toRef$b(props, 'static') + } + }); + useRender(() => _createVNode$G(props.tag, { + "class": ['v-expansion-panels', { + 'v-expansion-panels--flat': props.flat, + 'v-expansion-panels--tile': props.tile + }, themeClasses.value, variantClass.value, props.class], + "style": props.style + }, { + default: () => [slots.default?.({ + prev, + next + })] + })); + return { + next, + prev + }; + } +}); + +const {withDirectives:_withDirectives$3,createVNode:_createVNode$F,mergeProps:_mergeProps$l,resolveDirective:_resolveDirective$l,vShow:_vShow} = await importShared('vue'); +const {computed: computed$t,ref: ref$g,shallowRef: shallowRef$a,toRef: toRef$a,watchEffect: watchEffect$5} = await importShared('vue'); +const makeVFabProps = propsFactory({ + app: Boolean, + appear: Boolean, + extended: Boolean, + layout: Boolean, + offset: Boolean, + modelValue: { + type: Boolean, + default: true + }, + ...omit(makeVBtnProps({ + active: true + }), ['location']), + ...makeLayoutItemProps(), + ...makeLocationProps(), + ...makeTransitionProps({ + transition: 'fab-transition' + }) +}, 'VFab'); +const VFab = genericComponent()({ + name: 'VFab', + props: makeVFabProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const model = useProxiedModel(props, 'modelValue'); + const height = shallowRef$a(56); + const layoutItemStyles = ref$g(); + const { + resizeRef + } = useResizeObserver(entries => { + if (!entries.length) return; + height.value = entries[0].target.clientHeight; + }); + const hasPosition = computed$t(() => props.app || props.absolute); + const position = computed$t(() => { + if (!hasPosition.value) return false; + return props.location?.split(' ').shift() ?? 'bottom'; + }); + const orientation = computed$t(() => { + if (!hasPosition.value) return false; + return props.location?.split(' ')[1] ?? 'end'; + }); + useToggleScope(() => props.app, () => { + const layout = useLayoutItem({ + id: props.name, + order: computed$t(() => parseInt(props.order, 10)), + position, + layoutSize: computed$t(() => props.layout ? height.value + 24 : 0), + elementSize: computed$t(() => height.value + 24), + active: computed$t(() => props.app && model.value), + absolute: toRef$a(props, 'absolute') + }); + watchEffect$5(() => { + layoutItemStyles.value = layout.layoutItemStyles.value; + }); + }); + const vFabRef = ref$g(); + useRender(() => { + const btnProps = VBtn.filterProps(props); + return _createVNode$F("div", { + "ref": vFabRef, + "class": ['v-fab', { + 'v-fab--absolute': props.absolute, + 'v-fab--app': !!props.app, + 'v-fab--extended': props.extended, + 'v-fab--offset': props.offset, + [`v-fab--${position.value}`]: hasPosition.value, + [`v-fab--${orientation.value}`]: hasPosition.value + }, props.class], + "style": [props.app ? { + ...layoutItemStyles.value + } : { + height: 'inherit', + width: undefined + }, props.style] + }, [_createVNode$F("div", { + "class": "v-fab__container" + }, [_createVNode$F(MaybeTransition, { + "appear": props.appear, + "transition": props.transition + }, { + default: () => [_withDirectives$3(_createVNode$F(VBtn, _mergeProps$l({ + "ref": resizeRef + }, btnProps, { + "active": undefined, + "location": undefined + }), slots), [[_vShow, props.active]])] + })])]); + }); + return {}; + } +}); + +const {resolveDirective:_resolveDirective$k,createVNode:_createVNode$E,mergeProps:_mergeProps$k,Fragment:_Fragment$b} = await importShared('vue'); +const {computed: computed$s,nextTick: nextTick$6,ref: ref$f,watch: watch$9} = await importShared('vue'); +const makeVFileInputProps = propsFactory({ + chips: Boolean, + counter: Boolean, + counterSizeString: { + type: String, + default: '$vuetify.fileInput.counterSize' + }, + counterString: { + type: String, + default: '$vuetify.fileInput.counter' + }, + hideInput: Boolean, + multiple: Boolean, + showSize: { + type: [Boolean, Number, String], + default: false, + validator: v => { + return typeof v === 'boolean' || [1000, 1024].includes(Number(v)); + } + }, + ...makeVInputProps({ + prependIcon: '$file' + }), + modelValue: { + type: [Array, Object], + default: props => props.multiple ? [] : null, + validator: val => { + return wrapInArray(val).every(v => v != null && typeof v === 'object'); + } + }, + ...makeVFieldProps({ + clearable: true + }) +}, 'VFileInput'); +const VFileInput = genericComponent()({ + name: 'VFileInput', + inheritAttrs: false, + props: makeVFileInputProps(), + emits: { + 'click:control': e => true, + 'mousedown:control': e => true, + 'update:focused': focused => true, + 'update:modelValue': files => true + }, + setup(props, _ref) { + let { + attrs, + emit, + slots + } = _ref; + const { + t + } = useLocale(); + const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val); + const { + isFocused, + focus, + blur + } = useFocus(props); + const base = computed$s(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined); + const totalBytes = computed$s(() => (model.value ?? []).reduce((bytes, _ref2) => { + let { + size = 0 + } = _ref2; + return bytes + size; + }, 0)); + const totalBytesReadable = computed$s(() => humanReadableFileSize(totalBytes.value, base.value)); + const fileNames = computed$s(() => (model.value ?? []).map(file => { + const { + name = '', + size = 0 + } = file; + return !props.showSize ? name : `${name} (${humanReadableFileSize(size, base.value)})`; + })); + const counterValue = computed$s(() => { + const fileCount = model.value?.length ?? 0; + if (props.showSize) return t(props.counterSizeString, fileCount, totalBytesReadable.value);else return t(props.counterString, fileCount); + }); + const vInputRef = ref$f(); + const vFieldRef = ref$f(); + const inputRef = ref$f(); + const isActive = computed$s(() => isFocused.value || props.active); + const isPlainOrUnderlined = computed$s(() => ['plain', 'underlined'].includes(props.variant)); + function onFocus() { + if (inputRef.value !== document.activeElement) { + inputRef.value?.focus(); + } + if (!isFocused.value) focus(); + } + function onClickPrepend(e) { + inputRef.value?.click(); + } + function onControlMousedown(e) { + emit('mousedown:control', e); + } + function onControlClick(e) { + inputRef.value?.click(); + emit('click:control', e); + } + function onClear(e) { + e.stopPropagation(); + onFocus(); + nextTick$6(() => { + model.value = []; + callEvent(props['onClick:clear'], e); + }); + } + watch$9(model, newValue => { + const hasModelReset = !Array.isArray(newValue) || !newValue.length; + if (hasModelReset && inputRef.value) { + inputRef.value.value = ''; + } + }); + useRender(() => { + const hasCounter = !!(slots.counter || props.counter); + const hasDetails = !!(hasCounter || slots.details); + const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); + const { + modelValue: _, + ...inputProps + } = VInput.filterProps(props); + const fieldProps = filterFieldProps(props); + return _createVNode$E(VInput, _mergeProps$k({ + "ref": vInputRef, + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "class": ['v-file-input', { + 'v-file-input--chips': !!props.chips, + 'v-file-input--hide': props.hideInput, + 'v-input--plain-underlined': isPlainOrUnderlined.value + }, props.class], + "style": props.style, + "onClick:prepend": onClickPrepend + }, rootAttrs, inputProps, { + "centerAffix": !isPlainOrUnderlined.value, + "focused": isFocused.value + }), { + ...slots, + default: _ref3 => { + let { + id, + isDisabled, + isDirty, + isReadonly, + isValid + } = _ref3; + return _createVNode$E(VField, _mergeProps$k({ + "ref": vFieldRef, + "prepend-icon": props.prependIcon, + "onMousedown": onControlMousedown, + "onClick": onControlClick, + "onClick:clear": onClear, + "onClick:prependInner": props['onClick:prependInner'], + "onClick:appendInner": props['onClick:appendInner'] + }, fieldProps, { + "id": id.value, + "active": isActive.value || isDirty.value, + "dirty": isDirty.value || props.dirty, + "disabled": isDisabled.value, + "focused": isFocused.value, + "error": isValid.value === false + }), { + ...slots, + default: _ref4 => { + let { + props: { + class: fieldClass, + ...slotProps + } + } = _ref4; + return _createVNode$E(_Fragment$b, null, [_createVNode$E("input", _mergeProps$k({ + "ref": inputRef, + "type": "file", + "readonly": isReadonly.value, + "disabled": isDisabled.value, + "multiple": props.multiple, + "name": props.name, + "onClick": e => { + e.stopPropagation(); + if (isReadonly.value) e.preventDefault(); + onFocus(); + }, + "onChange": e => { + if (!e.target) return; + const target = e.target; + model.value = [...(target.files ?? [])]; + }, + "onFocus": onFocus, + "onBlur": blur + }, slotProps, inputAttrs), null), _createVNode$E("div", { + "class": fieldClass + }, [!!model.value?.length && !props.hideInput && (slots.selection ? slots.selection({ + fileNames: fileNames.value, + totalBytes: totalBytes.value, + totalBytesReadable: totalBytesReadable.value + }) : props.chips ? fileNames.value.map(text => _createVNode$E(VChip, { + "key": text, + "size": "small", + "text": text + }, null)) : fileNames.value.join(', '))])]); + } + }); + }, + details: hasDetails ? slotProps => _createVNode$E(_Fragment$b, null, [slots.details?.(slotProps), hasCounter && _createVNode$E(_Fragment$b, null, [_createVNode$E("span", null, null), _createVNode$E(VCounter, { + "active": !!model.value?.length, + "value": counterValue.value, + "disabled": props.disabled + }, slots.counter)])]) : undefined + }); + }); + return forwardRefs({}, vInputRef, vFieldRef, inputRef); + } +}); + +const {createVNode:_createVNode$D,resolveDirective:_resolveDirective$j} = await importShared('vue'); +const {computed: computed$r,ref: ref$e,shallowRef: shallowRef$9,toRef: toRef$9,watchEffect: watchEffect$4} = await importShared('vue'); +const makeVFooterProps = propsFactory({ + app: Boolean, + color: String, + height: { + type: [Number, String], + default: 'auto' + }, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeElevationProps(), + ...makeLayoutItemProps(), + ...makeRoundedProps(), + ...makeTagProps({ + tag: 'footer' + }), + ...makeThemeProps() +}, 'VFooter'); +const VFooter = genericComponent()({ + name: 'VFooter', + props: makeVFooterProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const layoutItemStyles = ref$e(); + const { + themeClasses + } = provideTheme(props); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$9(props, 'color')); + const { + borderClasses + } = useBorder(props); + const { + elevationClasses + } = useElevation(props); + const { + roundedClasses + } = useRounded(props); + const autoHeight = shallowRef$9(32); + const { + resizeRef + } = useResizeObserver(entries => { + if (!entries.length) return; + autoHeight.value = entries[0].target.clientHeight; + }); + const height = computed$r(() => props.height === 'auto' ? autoHeight.value : parseInt(props.height, 10)); + useToggleScope(() => props.app, () => { + const layout = useLayoutItem({ + id: props.name, + order: computed$r(() => parseInt(props.order, 10)), + position: computed$r(() => 'bottom'), + layoutSize: height, + elementSize: computed$r(() => props.height === 'auto' ? undefined : height.value), + active: computed$r(() => props.app), + absolute: toRef$9(props, 'absolute') + }); + watchEffect$4(() => { + layoutItemStyles.value = layout.layoutItemStyles.value; + }); + }); + useRender(() => _createVNode$D(props.tag, { + "ref": resizeRef, + "class": ['v-footer', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class], + "style": [backgroundColorStyles.value, props.app ? layoutItemStyles.value : { + height: convertToUnit(props.height) + }, props.style] + }, slots)); + return {}; + } +}); + +const {createVNode:_createVNode$C} = await importShared('vue'); +const {ref: ref$d} = await importShared('vue'); +const makeVFormProps = propsFactory({ + ...makeComponentProps(), + ...makeFormProps() +}, 'VForm'); +const VForm = genericComponent()({ + name: 'VForm', + props: makeVFormProps(), + emits: { + 'update:modelValue': val => true, + submit: e => true + }, + setup(props, _ref) { + let { + slots, + emit + } = _ref; + const form = createForm(props); + const formRef = ref$d(); + function onReset(e) { + e.preventDefault(); + form.reset(); + } + function onSubmit(_e) { + const e = _e; + const ready = form.validate(); + e.then = ready.then.bind(ready); + e.catch = ready.catch.bind(ready); + e.finally = ready.finally.bind(ready); + emit('submit', e); + if (!e.defaultPrevented) { + ready.then(_ref2 => { + let { + valid + } = _ref2; + if (valid) { + formRef.value?.submit(); + } + }); + } + e.preventDefault(); + } + useRender(() => _createVNode$C("form", { + "ref": formRef, + "class": ['v-form', props.class], + "style": props.style, + "novalidate": true, + "onReset": onReset, + "onSubmit": onSubmit + }, [slots.default?.(form)])); + return forwardRefs(form, formRef); + } +}); + +// Composables +const makeVHoverProps = propsFactory({ + disabled: Boolean, + modelValue: { + type: Boolean, + default: null + }, + ...makeDelayProps() +}, 'VHover'); +const VHover = genericComponent()({ + name: 'VHover', + props: makeVHoverProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const isHovering = useProxiedModel(props, 'modelValue'); + const { + runOpenDelay, + runCloseDelay + } = useDelay(props, value => !props.disabled && (isHovering.value = value)); + return () => slots.default?.({ + isHovering: isHovering.value, + props: { + onMouseenter: runOpenDelay, + onMouseleave: runCloseDelay + } + }); + } +}); + +const {createVNode:_createVNode$B,createTextVNode:_createTextVNode$1} = await importShared('vue'); +const {computed: computed$q,nextTick: nextTick$5,onMounted: onMounted$4,ref: ref$c,shallowRef: shallowRef$8,watch: watch$8} = await importShared('vue'); +const makeVInfiniteScrollProps = propsFactory({ + color: String, + direction: { + type: String, + default: 'vertical', + validator: v => ['vertical', 'horizontal'].includes(v) + }, + side: { + type: String, + default: 'end', + validator: v => ['start', 'end', 'both'].includes(v) + }, + mode: { + type: String, + default: 'intersect', + validator: v => ['intersect', 'manual'].includes(v) + }, + margin: [Number, String], + loadMoreText: { + type: String, + default: '$vuetify.infiniteScroll.loadMore' + }, + emptyText: { + type: String, + default: '$vuetify.infiniteScroll.empty' + }, + ...makeDimensionProps(), + ...makeTagProps() +}, 'VInfiniteScroll'); +const VInfiniteScrollIntersect = defineComponent({ + name: 'VInfiniteScrollIntersect', + props: { + side: { + type: String, + required: true + }, + rootMargin: String + }, + emits: { + intersect: (side, isIntersecting) => true + }, + setup(props, _ref) { + let { + emit + } = _ref; + const { + intersectionRef, + isIntersecting + } = useIntersectionObserver(); + watch$8(isIntersecting, async val => { + emit('intersect', props.side, val); + }); + useRender(() => _createVNode$B("div", { + "class": "v-infinite-scroll-intersect", + "style": { + '--v-infinite-margin-size': props.rootMargin + }, + "ref": intersectionRef + }, [_createTextVNode$1("\xA0")])); + return {}; + } +}); +const VInfiniteScroll = genericComponent()({ + name: 'VInfiniteScroll', + props: makeVInfiniteScrollProps(), + emits: { + load: options => true + }, + setup(props, _ref2) { + let { + slots, + emit + } = _ref2; + const rootEl = ref$c(); + const startStatus = shallowRef$8('ok'); + const endStatus = shallowRef$8('ok'); + const margin = computed$q(() => convertToUnit(props.margin)); + const isIntersecting = shallowRef$8(false); + function setScrollAmount(amount) { + if (!rootEl.value) return; + const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft'; + rootEl.value[property] = amount; + } + function getScrollAmount() { + if (!rootEl.value) return 0; + const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft'; + return rootEl.value[property]; + } + function getScrollSize() { + if (!rootEl.value) return 0; + const property = props.direction === 'vertical' ? 'scrollHeight' : 'scrollWidth'; + return rootEl.value[property]; + } + function getContainerSize() { + if (!rootEl.value) return 0; + const property = props.direction === 'vertical' ? 'clientHeight' : 'clientWidth'; + return rootEl.value[property]; + } + onMounted$4(() => { + if (!rootEl.value) return; + if (props.side === 'start') { + setScrollAmount(getScrollSize()); + } else if (props.side === 'both') { + setScrollAmount(getScrollSize() / 2 - getContainerSize() / 2); + } + }); + function setStatus(side, status) { + if (side === 'start') { + startStatus.value = status; + } else if (side === 'end') { + endStatus.value = status; + } + } + function getStatus(side) { + return side === 'start' ? startStatus.value : endStatus.value; + } + let previousScrollSize = 0; + function handleIntersect(side, _isIntersecting) { + isIntersecting.value = _isIntersecting; + if (isIntersecting.value) { + intersecting(side); + } + } + function intersecting(side) { + if (props.mode !== 'manual' && !isIntersecting.value) return; + const status = getStatus(side); + if (!rootEl.value || ['empty', 'loading'].includes(status)) return; + previousScrollSize = getScrollSize(); + setStatus(side, 'loading'); + function done(status) { + setStatus(side, status); + nextTick$5(() => { + if (status === 'empty' || status === 'error') return; + if (status === 'ok' && side === 'start') { + setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount()); + } + if (props.mode !== 'manual') { + nextTick$5(() => { + window.requestAnimationFrame(() => { + window.requestAnimationFrame(() => { + window.requestAnimationFrame(() => { + intersecting(side); + }); + }); + }); + }); + } + }); + } + emit('load', { + side, + done + }); + } + const { + t + } = useLocale(); + function renderSide(side, status) { + if (props.side !== side && props.side !== 'both') return; + const onClick = () => intersecting(side); + const slotProps = { + side, + props: { + onClick, + color: props.color + } + }; + if (status === 'error') return slots.error?.(slotProps); + if (status === 'empty') return slots.empty?.(slotProps) ?? _createVNode$B("div", null, [t(props.emptyText)]); + if (props.mode === 'manual') { + if (status === 'loading') { + return slots.loading?.(slotProps) ?? _createVNode$B(VProgressCircular, { + "indeterminate": true, + "color": props.color + }, null); + } + return slots['load-more']?.(slotProps) ?? _createVNode$B(VBtn, { + "variant": "outlined", + "color": props.color, + "onClick": onClick + }, { + default: () => [t(props.loadMoreText)] + }); + } + return slots.loading?.(slotProps) ?? _createVNode$B(VProgressCircular, { + "indeterminate": true, + "color": props.color + }, null); + } + const { + dimensionStyles + } = useDimension(props); + useRender(() => { + const Tag = props.tag; + const hasStartIntersect = props.side === 'start' || props.side === 'both'; + const hasEndIntersect = props.side === 'end' || props.side === 'both'; + const intersectMode = props.mode === 'intersect'; + return _createVNode$B(Tag, { + "ref": rootEl, + "class": ['v-infinite-scroll', `v-infinite-scroll--${props.direction}`, { + 'v-infinite-scroll--start': hasStartIntersect, + 'v-infinite-scroll--end': hasEndIntersect + }], + "style": dimensionStyles.value + }, { + default: () => [_createVNode$B("div", { + "class": "v-infinite-scroll__side" + }, [renderSide('start', startStatus.value)]), hasStartIntersect && intersectMode && _createVNode$B(VInfiniteScrollIntersect, { + "key": "start", + "side": "start", + "onIntersect": handleIntersect, + "rootMargin": margin.value + }, null), slots.default?.(), hasEndIntersect && intersectMode && _createVNode$B(VInfiniteScrollIntersect, { + "key": "end", + "side": "end", + "onIntersect": handleIntersect, + "rootMargin": margin.value + }, null), _createVNode$B("div", { + "class": "v-infinite-scroll__side" + }, [renderSide('end', endStatus.value)])] + }); + }); + } +}); + +const {createVNode:_createVNode$A} = await importShared('vue'); +const VItemGroupSymbol = Symbol.for('vuetify:v-item-group'); +const makeVItemGroupProps = propsFactory({ + ...makeComponentProps(), + ...makeGroupProps({ + selectedClass: 'v-item--selected' + }), + ...makeTagProps(), + ...makeThemeProps() +}, 'VItemGroup'); +const VItemGroup = genericComponent()({ + name: 'VItemGroup', + props: makeVItemGroupProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + isSelected, + select, + next, + prev, + selected + } = useGroup(props, VItemGroupSymbol); + return () => _createVNode$A(props.tag, { + "class": ['v-item-group', themeClasses.value, props.class], + "style": props.style + }, { + default: () => [slots.default?.({ + isSelected, + select, + next, + prev, + selected: selected.value + })] + }); + } +}); + +// Composables +const VItem = genericComponent()({ + name: 'VItem', + props: makeGroupItemProps(), + emits: { + 'group:selected': val => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + isSelected, + select, + toggle, + selectedClass, + value, + disabled + } = useGroupItem(props, VItemGroupSymbol); + return () => slots.default?.({ + isSelected: isSelected.value, + selectedClass: selectedClass.value, + select, + toggle, + value: value.value, + disabled: disabled.value + }); + } +}); + +// Styles +const VKbd = createSimpleFunctional('v-kbd'); + +const {createVNode:_createVNode$z} = await importShared('vue'); +const makeVLayoutProps = propsFactory({ + ...makeComponentProps(), + ...makeDimensionProps(), + ...makeLayoutProps() +}, 'VLayout'); +const VLayout = genericComponent()({ + name: 'VLayout', + props: makeVLayoutProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + layoutClasses, + layoutStyles, + getLayoutItem, + items, + layoutRef + } = createLayout(props); + const { + dimensionStyles + } = useDimension(props); + useRender(() => _createVNode$z("div", { + "ref": layoutRef, + "class": [layoutClasses.value, props.class], + "style": [dimensionStyles.value, layoutStyles.value, props.style] + }, [slots.default?.()])); + return { + getLayoutItem, + items + }; + } +}); + +const {createVNode:_createVNode$y} = await importShared('vue'); +const {computed: computed$p,toRef: toRef$8} = await importShared('vue'); +const makeVLayoutItemProps = propsFactory({ + position: { + type: String, + required: true + }, + size: { + type: [Number, String], + default: 300 + }, + modelValue: Boolean, + ...makeComponentProps(), + ...makeLayoutItemProps() +}, 'VLayoutItem'); +const VLayoutItem = genericComponent()({ + name: 'VLayoutItem', + props: makeVLayoutItemProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + layoutItemStyles + } = useLayoutItem({ + id: props.name, + order: computed$p(() => parseInt(props.order, 10)), + position: toRef$8(props, 'position'), + elementSize: toRef$8(props, 'size'), + layoutSize: toRef$8(props, 'size'), + active: toRef$8(props, 'modelValue'), + absolute: toRef$8(props, 'absolute') + }); + return () => _createVNode$y("div", { + "class": ['v-layout-item', props.class], + "style": [layoutItemStyles.value, props.style] + }, [slots.default?.()]); + } +}); + +const {withDirectives:_withDirectives$2,resolveDirective:_resolveDirective$i,createVNode:_createVNode$x} = await importShared('vue'); +const makeVLazyProps = propsFactory({ + modelValue: Boolean, + options: { + type: Object, + // For more information on types, navigate to: + // https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API + default: () => ({ + root: undefined, + rootMargin: undefined, + threshold: undefined + }) + }, + ...makeComponentProps(), + ...makeDimensionProps(), + ...makeTagProps(), + ...makeTransitionProps({ + transition: 'fade-transition' + }) +}, 'VLazy'); +const VLazy = genericComponent()({ + name: 'VLazy', + directives: { + intersect: Intersect + }, + props: makeVLazyProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + dimensionStyles + } = useDimension(props); + const isActive = useProxiedModel(props, 'modelValue'); + function onIntersect(isIntersecting) { + if (isActive.value) return; + isActive.value = isIntersecting; + } + useRender(() => _withDirectives$2(_createVNode$x(props.tag, { + "class": ['v-lazy', props.class], + "style": [dimensionStyles.value, props.style] + }, { + default: () => [isActive.value && _createVNode$x(MaybeTransition, { + "transition": props.transition, + "appear": true + }, { + default: () => [slots.default?.()] + })] + }), [[_resolveDirective$i("intersect"), { + handler: onIntersect, + options: props.options + }, null]])); + return {}; + } +}); + +const {createVNode:_createVNode$w} = await importShared('vue'); +const makeVLocaleProviderProps = propsFactory({ + locale: String, + fallbackLocale: String, + messages: Object, + rtl: { + type: Boolean, + default: undefined + }, + ...makeComponentProps() +}, 'VLocaleProvider'); +const VLocaleProvider = genericComponent()({ + name: 'VLocaleProvider', + props: makeVLocaleProviderProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + rtlClasses + } = provideLocale(props); + useRender(() => _createVNode$w("div", { + "class": ['v-locale-provider', rtlClasses.value, props.class], + "style": props.style + }, [slots.default?.()])); + return {}; + } +}); + +const {createVNode:_createVNode$v} = await importShared('vue'); +const makeVMainProps = propsFactory({ + scrollable: Boolean, + ...makeComponentProps(), + ...makeDimensionProps(), + ...makeTagProps({ + tag: 'main' + }) +}, 'VMain'); +const VMain = genericComponent()({ + name: 'VMain', + props: makeVMainProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + dimensionStyles + } = useDimension(props); + const { + mainStyles + } = useLayout(); + const { + ssrBootStyles + } = useSsrBoot(); + useRender(() => _createVNode$v(props.tag, { + "class": ['v-main', { + 'v-main--scrollable': props.scrollable + }, props.class], + "style": [mainStyles.value, ssrBootStyles.value, dimensionStyles.value, props.style] + }, { + default: () => [props.scrollable ? _createVNode$v("div", { + "class": "v-main__scroller" + }, [slots.default?.()]) : slots.default?.()] + })); + return {}; + } +}); + +// Utilities +const {computed: computed$o,onBeforeUnmount: onBeforeUnmount$3,onMounted: onMounted$3,shallowRef: shallowRef$7,watch: watch$7} = await importShared('vue'); +function useSticky(_ref) { + let { + rootEl, + isSticky, + layoutItemStyles + } = _ref; + const isStuck = shallowRef$7(false); + const stuckPosition = shallowRef$7(0); + const stickyStyles = computed$o(() => { + const side = typeof isStuck.value === 'boolean' ? 'top' : isStuck.value; + return [isSticky.value ? { + top: 'auto', + bottom: 'auto', + height: undefined + } : undefined, isStuck.value ? { + [side]: convertToUnit(stuckPosition.value) + } : { + top: layoutItemStyles.value.top + }]; + }); + onMounted$3(() => { + watch$7(isSticky, val => { + if (val) { + window.addEventListener('scroll', onScroll, { + passive: true + }); + } else { + window.removeEventListener('scroll', onScroll); + } + }, { + immediate: true + }); + }); + onBeforeUnmount$3(() => { + window.removeEventListener('scroll', onScroll); + }); + let lastScrollTop = 0; + function onScroll() { + const direction = lastScrollTop > window.scrollY ? 'up' : 'down'; + const rect = rootEl.value.getBoundingClientRect(); + const layoutTop = parseFloat(layoutItemStyles.value.top ?? 0); + const top = window.scrollY - Math.max(0, stuckPosition.value - layoutTop); + const bottom = rect.height + Math.max(stuckPosition.value, layoutTop) - window.scrollY - window.innerHeight; + const bodyScroll = parseFloat(getComputedStyle(rootEl.value).getPropertyValue('--v-body-scroll-y')) || 0; + if (rect.height < window.innerHeight - layoutTop) { + isStuck.value = 'top'; + stuckPosition.value = layoutTop; + } else if (direction === 'up' && isStuck.value === 'bottom' || direction === 'down' && isStuck.value === 'top') { + stuckPosition.value = window.scrollY + rect.top - bodyScroll; + isStuck.value = true; + } else if (direction === 'down' && bottom <= 0) { + stuckPosition.value = 0; + isStuck.value = 'bottom'; + } else if (direction === 'up' && top <= 0) { + if (!bodyScroll) { + stuckPosition.value = rect.top + top; + isStuck.value = 'top'; + } else if (isStuck.value !== 'top') { + stuckPosition.value = -top + bodyScroll + layoutTop; + isStuck.value = 'top'; + } + } + lastScrollTop = window.scrollY; + } + return { + isStuck, + stickyStyles + }; +} + +// Utilities +const HORIZON = 100; // ms +const HISTORY = 20; // number of samples to keep + +/** @see https://android.googlesource.com/platform/frameworks/native/+/master/libs/input/VelocityTracker.cpp */ +function kineticEnergyToVelocity(work) { + const sqrt2 = 1.41421356237; + return (work < 0 ? -1 : 1.0) * Math.sqrt(Math.abs(work)) * sqrt2; +} + +/** + * Returns pointer velocity in px/s + */ +function calculateImpulseVelocity(samples) { + // The input should be in reversed time order (most recent sample at index i=0) + if (samples.length < 2) { + // if 0 or 1 points, velocity is zero + return 0; + } + // if (samples[1].t > samples[0].t) { + // // Algorithm will still work, but not perfectly + // consoleWarn('Samples provided to calculateImpulseVelocity in the wrong order') + // } + if (samples.length === 2) { + // if 2 points, basic linear calculation + if (samples[1].t === samples[0].t) { + // consoleWarn(`Events have identical time stamps t=${samples[0].t}, setting velocity = 0`) + return 0; + } + return (samples[1].d - samples[0].d) / (samples[1].t - samples[0].t); + } + // Guaranteed to have at least 3 points here + // start with the oldest sample and go forward in time + let work = 0; + for (let i = samples.length - 1; i > 0; i--) { + if (samples[i].t === samples[i - 1].t) { + // consoleWarn(`Events have identical time stamps t=${samples[i].t}, skipping sample`) + continue; + } + const vprev = kineticEnergyToVelocity(work); // v[i-1] + const vcurr = (samples[i].d - samples[i - 1].d) / (samples[i].t - samples[i - 1].t); // v[i] + work += (vcurr - vprev) * Math.abs(vcurr); + if (i === samples.length - 1) { + work *= 0.5; + } + } + return kineticEnergyToVelocity(work) * 1000; +} +function useVelocity() { + const touches = {}; + function addMovement(e) { + Array.from(e.changedTouches).forEach(touch => { + const samples = touches[touch.identifier] ?? (touches[touch.identifier] = new CircularBuffer(HISTORY)); + samples.push([e.timeStamp, touch]); + }); + } + function endTouch(e) { + Array.from(e.changedTouches).forEach(touch => { + delete touches[touch.identifier]; + }); + } + function getVelocity(id) { + const samples = touches[id]?.values().reverse(); + if (!samples) { + throw new Error(`No samples for touch id ${id}`); + } + const newest = samples[0]; + const x = []; + const y = []; + for (const val of samples) { + if (newest[0] - val[0] > HORIZON) break; + x.push({ + t: val[0], + d: val[1].clientX + }); + y.push({ + t: val[0], + d: val[1].clientY + }); + } + return { + x: calculateImpulseVelocity(x), + y: calculateImpulseVelocity(y), + get direction() { + const { + x, + y + } = this; + const [absX, absY] = [Math.abs(x), Math.abs(y)]; + return absX > absY && x >= 0 ? 'right' : absX > absY && x <= 0 ? 'left' : absY > absX && y >= 0 ? 'down' : absY > absX && y <= 0 ? 'up' : oops$1(); + } + }; + } + return { + addMovement, + endTouch, + getVelocity + }; +} +function oops$1() { + throw new Error(); +} + +const {computed: computed$n,onBeforeUnmount: onBeforeUnmount$2,onMounted: onMounted$2,onScopeDispose: onScopeDispose$1,shallowRef: shallowRef$6,watchEffect: watchEffect$3} = await importShared('vue'); + + +// Types + +function useTouch(_ref) { + let { + el, + isActive, + isTemporary, + width, + touchless, + position + } = _ref; + onMounted$2(() => { + window.addEventListener('touchstart', onTouchstart, { + passive: true + }); + window.addEventListener('touchmove', onTouchmove, { + passive: false + }); + window.addEventListener('touchend', onTouchend, { + passive: true + }); + }); + onBeforeUnmount$2(() => { + window.removeEventListener('touchstart', onTouchstart); + window.removeEventListener('touchmove', onTouchmove); + window.removeEventListener('touchend', onTouchend); + }); + const isHorizontal = computed$n(() => ['left', 'right'].includes(position.value)); + const { + addMovement, + endTouch, + getVelocity + } = useVelocity(); + let maybeDragging = false; + const isDragging = shallowRef$6(false); + const dragProgress = shallowRef$6(0); + const offset = shallowRef$6(0); + let start; + function getOffset(pos, active) { + return (position.value === 'left' ? pos : position.value === 'right' ? document.documentElement.clientWidth - pos : position.value === 'top' ? pos : position.value === 'bottom' ? document.documentElement.clientHeight - pos : oops()) - (active ? width.value : 0); + } + function getProgress(pos) { + let limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + const progress = position.value === 'left' ? (pos - offset.value) / width.value : position.value === 'right' ? (document.documentElement.clientWidth - pos - offset.value) / width.value : position.value === 'top' ? (pos - offset.value) / width.value : position.value === 'bottom' ? (document.documentElement.clientHeight - pos - offset.value) / width.value : oops(); + return limit ? Math.max(0, Math.min(1, progress)) : progress; + } + function onTouchstart(e) { + if (touchless.value) return; + const touchX = e.changedTouches[0].clientX; + const touchY = e.changedTouches[0].clientY; + const touchZone = 25; + const inTouchZone = position.value === 'left' ? touchX < touchZone : position.value === 'right' ? touchX > document.documentElement.clientWidth - touchZone : position.value === 'top' ? touchY < touchZone : position.value === 'bottom' ? touchY > document.documentElement.clientHeight - touchZone : oops(); + const inElement = isActive.value && (position.value === 'left' ? touchX < width.value : position.value === 'right' ? touchX > document.documentElement.clientWidth - width.value : position.value === 'top' ? touchY < width.value : position.value === 'bottom' ? touchY > document.documentElement.clientHeight - width.value : oops()); + if (inTouchZone || inElement || isActive.value && isTemporary.value) { + start = [touchX, touchY]; + offset.value = getOffset(isHorizontal.value ? touchX : touchY, isActive.value); + dragProgress.value = getProgress(isHorizontal.value ? touchX : touchY); + maybeDragging = offset.value > -20 && offset.value < 80; + endTouch(e); + addMovement(e); + } + } + function onTouchmove(e) { + const touchX = e.changedTouches[0].clientX; + const touchY = e.changedTouches[0].clientY; + if (maybeDragging) { + if (!e.cancelable) { + maybeDragging = false; + return; + } + const dx = Math.abs(touchX - start[0]); + const dy = Math.abs(touchY - start[1]); + const thresholdMet = isHorizontal.value ? dx > dy && dx > 3 : dy > dx && dy > 3; + if (thresholdMet) { + isDragging.value = true; + maybeDragging = false; + } else if ((isHorizontal.value ? dy : dx) > 3) { + maybeDragging = false; + } + } + if (!isDragging.value) return; + e.preventDefault(); + addMovement(e); + const progress = getProgress(isHorizontal.value ? touchX : touchY, false); + dragProgress.value = Math.max(0, Math.min(1, progress)); + if (progress > 1) { + offset.value = getOffset(isHorizontal.value ? touchX : touchY, true); + } else if (progress < 0) { + offset.value = getOffset(isHorizontal.value ? touchX : touchY, false); + } + } + function onTouchend(e) { + maybeDragging = false; + if (!isDragging.value) return; + addMovement(e); + isDragging.value = false; + const velocity = getVelocity(e.changedTouches[0].identifier); + const vx = Math.abs(velocity.x); + const vy = Math.abs(velocity.y); + const thresholdMet = isHorizontal.value ? vx > vy && vx > 400 : vy > vx && vy > 3; + if (thresholdMet) { + isActive.value = velocity.direction === ({ + left: 'right', + right: 'left', + top: 'down', + bottom: 'up' + }[position.value] || oops()); + } else { + isActive.value = dragProgress.value > 0.5; + } + } + const dragStyles = computed$n(() => { + return isDragging.value ? { + transform: position.value === 'left' ? `translateX(calc(-100% + ${dragProgress.value * width.value}px))` : position.value === 'right' ? `translateX(calc(100% - ${dragProgress.value * width.value}px))` : position.value === 'top' ? `translateY(calc(-100% + ${dragProgress.value * width.value}px))` : position.value === 'bottom' ? `translateY(calc(100% - ${dragProgress.value * width.value}px))` : oops(), + transition: 'none' + } : undefined; + }); + useToggleScope(isDragging, () => { + const transform = el.value?.style.transform ?? null; + const transition = el.value?.style.transition ?? null; + watchEffect$3(() => { + el.value?.style.setProperty('transform', dragStyles.value?.transform || 'none'); + el.value?.style.setProperty('transition', dragStyles.value?.transition || null); + }); + onScopeDispose$1(() => { + el.value?.style.setProperty('transform', transform); + el.value?.style.setProperty('transition', transition); + }); + }); + return { + isDragging, + dragProgress, + dragStyles + }; +} +function oops() { + throw new Error(); +} + +const {mergeProps:_mergeProps$j,resolveDirective:_resolveDirective$h,createVNode:_createVNode$u,Fragment:_Fragment$a} = await importShared('vue'); +const {computed: computed$m,nextTick: nextTick$4,ref: ref$b,shallowRef: shallowRef$5,toRef: toRef$7,Transition,watch: watch$6} = await importShared('vue'); +const locations = ['start', 'end', 'left', 'right', 'top', 'bottom']; +const makeVNavigationDrawerProps = propsFactory({ + color: String, + disableResizeWatcher: Boolean, + disableRouteWatcher: Boolean, + expandOnHover: Boolean, + floating: Boolean, + modelValue: { + type: Boolean, + default: null + }, + permanent: Boolean, + rail: { + type: Boolean, + default: null + }, + railWidth: { + type: [Number, String], + default: 56 + }, + scrim: { + type: [Boolean, String], + default: true + }, + image: String, + temporary: Boolean, + persistent: Boolean, + touchless: Boolean, + width: { + type: [Number, String], + default: 256 + }, + location: { + type: String, + default: 'start', + validator: value => locations.includes(value) + }, + sticky: Boolean, + ...makeBorderProps(), + ...makeComponentProps(), + ...makeDelayProps(), + ...makeDisplayProps({ + mobile: null + }), + ...makeElevationProps(), + ...makeLayoutItemProps(), + ...makeRoundedProps(), + ...makeTagProps({ + tag: 'nav' + }), + ...makeThemeProps() +}, 'VNavigationDrawer'); +const VNavigationDrawer = genericComponent()({ + name: 'VNavigationDrawer', + props: makeVNavigationDrawerProps(), + emits: { + 'update:modelValue': val => true, + 'update:rail': val => true + }, + setup(props, _ref) { + let { + attrs, + emit, + slots + } = _ref; + const { + isRtl + } = useRtl(); + const { + themeClasses + } = provideTheme(props); + const { + borderClasses + } = useBorder(props); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$7(props, 'color')); + const { + elevationClasses + } = useElevation(props); + const { + displayClasses, + mobile + } = useDisplay(props); + const { + roundedClasses + } = useRounded(props); + const router = useRouter(); + const isActive = useProxiedModel(props, 'modelValue', null, v => !!v); + const { + ssrBootStyles + } = useSsrBoot(); + const { + scopeId + } = useScopeId(); + const rootEl = ref$b(); + const isHovering = shallowRef$5(false); + const { + runOpenDelay, + runCloseDelay + } = useDelay(props, value => { + isHovering.value = value; + }); + const width = computed$m(() => { + return props.rail && props.expandOnHover && isHovering.value ? Number(props.width) : Number(props.rail ? props.railWidth : props.width); + }); + const location = computed$m(() => { + return toPhysical(props.location, isRtl.value); + }); + const isPersistent = computed$m(() => props.persistent); + const isTemporary = computed$m(() => !props.permanent && (mobile.value || props.temporary)); + const isSticky = computed$m(() => props.sticky && !isTemporary.value && location.value !== 'bottom'); + useToggleScope(() => props.expandOnHover && props.rail != null, () => { + watch$6(isHovering, val => emit('update:rail', !val)); + }); + useToggleScope(() => !props.disableResizeWatcher, () => { + watch$6(isTemporary, val => !props.permanent && nextTick$4(() => isActive.value = !val)); + }); + useToggleScope(() => !props.disableRouteWatcher && !!router, () => { + watch$6(router.currentRoute, () => isTemporary.value && (isActive.value = false)); + }); + watch$6(() => props.permanent, val => { + if (val) isActive.value = true; + }); + if (props.modelValue == null && !isTemporary.value) { + isActive.value = props.permanent || !mobile.value; + } + const { + isDragging, + dragProgress + } = useTouch({ + el: rootEl, + isActive, + isTemporary, + width, + touchless: toRef$7(props, 'touchless'), + position: location + }); + const layoutSize = computed$m(() => { + const size = isTemporary.value ? 0 : props.rail && props.expandOnHover ? Number(props.railWidth) : width.value; + return isDragging.value ? size * dragProgress.value : size; + }); + const elementSize = computed$m(() => ['top', 'bottom'].includes(props.location) ? 0 : width.value); + const { + layoutItemStyles, + layoutItemScrimStyles + } = useLayoutItem({ + id: props.name, + order: computed$m(() => parseInt(props.order, 10)), + position: location, + layoutSize, + elementSize, + active: computed$m(() => isActive.value || isDragging.value), + disableTransitions: computed$m(() => isDragging.value), + absolute: computed$m(() => + // eslint-disable-next-line @typescript-eslint/no-use-before-define + props.absolute || isSticky.value && typeof isStuck.value !== 'string') + }); + const { + isStuck, + stickyStyles + } = useSticky({ + rootEl, + isSticky, + layoutItemStyles + }); + const scrimColor = useBackgroundColor(computed$m(() => { + return typeof props.scrim === 'string' ? props.scrim : null; + })); + const scrimStyles = computed$m(() => ({ + ...(isDragging.value ? { + opacity: dragProgress.value * 0.2, + transition: 'none' + } : undefined), + ...layoutItemScrimStyles.value + })); + provideDefaults({ + VList: { + bgColor: 'transparent' + } + }); + useRender(() => { + const hasImage = slots.image || props.image; + return _createVNode$u(_Fragment$a, null, [_createVNode$u(props.tag, _mergeProps$j({ + "ref": rootEl, + "onMouseenter": runOpenDelay, + "onMouseleave": runCloseDelay, + "class": ['v-navigation-drawer', `v-navigation-drawer--${location.value}`, { + 'v-navigation-drawer--expand-on-hover': props.expandOnHover, + 'v-navigation-drawer--floating': props.floating, + 'v-navigation-drawer--is-hovering': isHovering.value, + 'v-navigation-drawer--rail': props.rail, + 'v-navigation-drawer--temporary': isTemporary.value, + 'v-navigation-drawer--persistent': isPersistent.value, + 'v-navigation-drawer--active': isActive.value, + 'v-navigation-drawer--sticky': isSticky.value + }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, displayClasses.value, elevationClasses.value, roundedClasses.value, props.class], + "style": [backgroundColorStyles.value, layoutItemStyles.value, ssrBootStyles.value, stickyStyles.value, props.style, ['top', 'bottom'].includes(location.value) ? { + height: 'auto' + } : {}] + }, scopeId, attrs), { + default: () => [hasImage && _createVNode$u("div", { + "key": "image", + "class": "v-navigation-drawer__img" + }, [!slots.image ? _createVNode$u(VImg, { + "key": "image-img", + "alt": "", + "cover": true, + "height": "inherit", + "src": props.image + }, null) : _createVNode$u(VDefaultsProvider, { + "key": "image-defaults", + "disabled": !props.image, + "defaults": { + VImg: { + alt: '', + cover: true, + height: 'inherit', + src: props.image + } + } + }, slots.image)]), slots.prepend && _createVNode$u("div", { + "class": "v-navigation-drawer__prepend" + }, [slots.prepend?.()]), _createVNode$u("div", { + "class": "v-navigation-drawer__content" + }, [slots.default?.()]), slots.append && _createVNode$u("div", { + "class": "v-navigation-drawer__append" + }, [slots.append?.()])] + }), _createVNode$u(Transition, { + "name": "fade-transition" + }, { + default: () => [isTemporary.value && (isDragging.value || isActive.value) && !!props.scrim && _createVNode$u("div", _mergeProps$j({ + "class": ['v-navigation-drawer__scrim', scrimColor.backgroundColorClasses.value], + "style": [scrimStyles.value, scrimColor.backgroundColorStyles.value], + "onClick": () => { + if (isPersistent.value) return; + isActive.value = false; + } + }, scopeId), null)] + })]); + }); + return { + isStuck + }; + } +}); + +// Composables +const VNoSsr = defineComponent({ + name: 'VNoSsr', + setup(_, _ref) { + let { + slots + } = _ref; + const show = useHydration(); + return () => show.value && slots.default?.(); + } +}); + +const {mergeProps:_mergeProps$i,createVNode:_createVNode$t,Fragment:_Fragment$9} = await importShared('vue'); +const {computed: computed$l,nextTick: nextTick$3,ref: ref$a,watch: watch$5} = await importShared('vue'); +// Types +const makeVOtpInputProps = propsFactory({ + autofocus: Boolean, + divider: String, + focusAll: Boolean, + label: { + type: String, + default: '$vuetify.input.otp' + }, + length: { + type: [Number, String], + default: 6 + }, + modelValue: { + type: [Number, String], + default: undefined + }, + placeholder: String, + type: { + type: String, + default: 'number' + }, + ...makeDimensionProps(), + ...makeFocusProps(), + ...only(makeVFieldProps({ + variant: 'outlined' + }), ['baseColor', 'bgColor', 'class', 'color', 'disabled', 'error', 'loading', 'rounded', 'style', 'theme', 'variant']) +}, 'VOtpInput'); +const VOtpInput = genericComponent()({ + name: 'VOtpInput', + props: makeVOtpInputProps(), + emits: { + finish: val => true, + 'update:focused': val => true, + 'update:modelValue': val => true + }, + setup(props, _ref) { + let { + attrs, + emit, + slots + } = _ref; + const { + dimensionStyles + } = useDimension(props); + const { + isFocused, + focus, + blur + } = useFocus(props); + const model = useProxiedModel(props, 'modelValue', '', val => val == null ? [] : String(val).split(''), val => val.join('')); + const { + t + } = useLocale(); + const length = computed$l(() => Number(props.length)); + const fields = computed$l(() => Array(length.value).fill(0)); + const focusIndex = ref$a(-1); + const contentRef = ref$a(); + const inputRef = ref$a([]); + const current = computed$l(() => inputRef.value[focusIndex.value]); + function onInput() { + // The maxlength attribute doesn't work for the number type input, so the text type is used. + // The following logic simulates the behavior of a number input. + if (isValidNumber(current.value.value)) { + current.value.value = ''; + return; + } + const array = model.value.slice(); + const value = current.value.value; + array[focusIndex.value] = value; + let target = null; + if (focusIndex.value > model.value.length) { + target = model.value.length + 1; + } else if (focusIndex.value + 1 !== length.value) { + target = 'next'; + } + model.value = array; + if (target) focusChild(contentRef.value, target); + } + function onKeydown(e) { + const array = model.value.slice(); + const index = focusIndex.value; + let target = null; + if (!['ArrowLeft', 'ArrowRight', 'Backspace', 'Delete'].includes(e.key)) return; + e.preventDefault(); + if (e.key === 'ArrowLeft') { + target = 'prev'; + } else if (e.key === 'ArrowRight') { + target = 'next'; + } else if (['Backspace', 'Delete'].includes(e.key)) { + array[focusIndex.value] = ''; + model.value = array; + if (focusIndex.value > 0 && e.key === 'Backspace') { + target = 'prev'; + } else { + requestAnimationFrame(() => { + inputRef.value[index]?.select(); + }); + } + } + requestAnimationFrame(() => { + if (target != null) { + focusChild(contentRef.value, target); + } + }); + } + function onPaste(index, e) { + e.preventDefault(); + e.stopPropagation(); + const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? ''; + if (isValidNumber(clipboardText)) return; + model.value = clipboardText.split(''); + inputRef.value?.[index].blur(); + } + function reset() { + model.value = []; + } + function onFocus(e, index) { + focus(); + focusIndex.value = index; + } + function onBlur() { + blur(); + focusIndex.value = -1; + } + function isValidNumber(value) { + return props.type === 'number' && /[^0-9]/g.test(value); + } + provideDefaults({ + VField: { + color: computed$l(() => props.color), + bgColor: computed$l(() => props.color), + baseColor: computed$l(() => props.baseColor), + disabled: computed$l(() => props.disabled), + error: computed$l(() => props.error), + variant: computed$l(() => props.variant) + } + }, { + scoped: true + }); + watch$5(model, val => { + if (val.length === length.value) emit('finish', val.join('')); + }, { + deep: true + }); + watch$5(focusIndex, val => { + if (val < 0) return; + nextTick$3(() => { + inputRef.value[val]?.select(); + }); + }); + useRender(() => { + const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); + return _createVNode$t("div", _mergeProps$i({ + "class": ['v-otp-input', { + 'v-otp-input--divided': !!props.divider + }, props.class], + "style": [props.style] + }, rootAttrs), [_createVNode$t("div", { + "ref": contentRef, + "class": "v-otp-input__content", + "style": [dimensionStyles.value] + }, [fields.value.map((_, i) => _createVNode$t(_Fragment$9, null, [props.divider && i !== 0 && _createVNode$t("span", { + "class": "v-otp-input__divider" + }, [props.divider]), _createVNode$t(VField, { + "focused": isFocused.value && props.focusAll || focusIndex.value === i, + "key": i + }, { + ...slots, + loader: undefined, + default: () => { + return _createVNode$t("input", { + "ref": val => inputRef.value[i] = val, + "aria-label": t(props.label, i + 1), + "autofocus": i === 0 && props.autofocus, + "autocomplete": "one-time-code", + "class": ['v-otp-input__field'], + "disabled": props.disabled, + "inputmode": props.type === 'number' ? 'numeric' : 'text', + "min": props.type === 'number' ? 0 : undefined, + "maxlength": "1", + "placeholder": props.placeholder, + "type": props.type === 'number' ? 'text' : props.type, + "value": model.value[i], + "onInput": onInput, + "onFocus": e => onFocus(e, i), + "onBlur": onBlur, + "onKeydown": onKeydown, + "onPaste": event => onPaste(i, event) + }, null); + } + })])), _createVNode$t("input", _mergeProps$i({ + "class": "v-otp-input-input", + "type": "hidden" + }, inputAttrs, { + "value": model.value.join('') + }), null), _createVNode$t(VOverlay, { + "contained": true, + "content-class": "v-otp-input__loader", + "model-value": !!props.loading, + "persistent": true + }, { + default: () => [slots.loader?.() ?? _createVNode$t(VProgressCircular, { + "color": typeof props.loading === 'boolean' ? undefined : props.loading, + "indeterminate": true, + "size": "24", + "width": "2" + }, null)] + }), slots.default?.()])]); + }); + return { + blur: () => { + inputRef.value?.some(input => input.blur()); + }, + focus: () => { + inputRef.value?.[0].focus(); + }, + reset, + isFocused + }; + } +}); + +const {createVNode:_createVNode$s,resolveDirective:_resolveDirective$g} = await importShared('vue'); +const {computed: computed$k,onBeforeUnmount: onBeforeUnmount$1,ref: ref$9,watch: watch$4,watchEffect: watchEffect$2} = await importShared('vue'); +function floor(val) { + return Math.floor(Math.abs(val)) * Math.sign(val); +} +const makeVParallaxProps = propsFactory({ + scale: { + type: [Number, String], + default: 0.5 + }, + ...makeComponentProps() +}, 'VParallax'); +const VParallax = genericComponent()({ + name: 'VParallax', + props: makeVParallaxProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + intersectionRef, + isIntersecting + } = useIntersectionObserver(); + const { + resizeRef, + contentRect + } = useResizeObserver(); + const { + height: displayHeight + } = useDisplay(); + const root = ref$9(); + watchEffect$2(() => { + intersectionRef.value = resizeRef.value = root.value?.$el; + }); + let scrollParent; + watch$4(isIntersecting, val => { + if (val) { + scrollParent = getScrollParent(intersectionRef.value); + scrollParent = scrollParent === document.scrollingElement ? document : scrollParent; + scrollParent.addEventListener('scroll', onScroll, { + passive: true + }); + onScroll(); + } else { + scrollParent.removeEventListener('scroll', onScroll); + } + }); + onBeforeUnmount$1(() => { + scrollParent?.removeEventListener('scroll', onScroll); + }); + watch$4(displayHeight, onScroll); + watch$4(() => contentRect.value?.height, onScroll); + const scale = computed$k(() => { + return 1 - clamp(+props.scale); + }); + let frame = -1; + function onScroll() { + if (!isIntersecting.value) return; + cancelAnimationFrame(frame); + frame = requestAnimationFrame(() => { + const el = (root.value?.$el).querySelector('.v-img__img'); + if (!el) return; + const scrollHeight = scrollParent instanceof Document ? document.documentElement.clientHeight : scrollParent.clientHeight; + const scrollPos = scrollParent instanceof Document ? window.scrollY : scrollParent.scrollTop; + const top = intersectionRef.value.getBoundingClientRect().top + scrollPos; + const height = contentRect.value.height; + const center = top + (height - scrollHeight) / 2; + const translate = floor((scrollPos - center) * scale.value); + const sizeScale = Math.max(1, (scale.value * (scrollHeight - height) + height) / height); + el.style.setProperty('transform', `translateY(${translate}px) scale(${sizeScale})`); + }); + } + useRender(() => _createVNode$s(VImg, { + "class": ['v-parallax', { + 'v-parallax--active': isIntersecting.value + }, props.class], + "style": props.style, + "ref": root, + "cover": true, + "onLoadstart": onScroll, + "onLoad": onScroll + }, slots)); + return {}; + } +}); + +const {createVNode:_createVNode$r,mergeProps:_mergeProps$h,resolveDirective:_resolveDirective$f} = await importShared('vue'); +const makeVRadioProps = propsFactory({ + ...makeVSelectionControlProps({ + falseIcon: '$radioOff', + trueIcon: '$radioOn' + }) +}, 'VRadio'); +const VRadio = genericComponent()({ + name: 'VRadio', + props: makeVRadioProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => { + const controlProps = VSelectionControl.filterProps(props); + return _createVNode$r(VSelectionControl, _mergeProps$h(controlProps, { + "class": ['v-radio', props.class], + "style": props.style, + "type": "radio" + }), slots); + }); + return {}; + } +}); + +const {mergeProps:_mergeProps$g,resolveDirective:_resolveDirective$e,createVNode:_createVNode$q,Fragment:_Fragment$8} = await importShared('vue'); +const {computed: computed$j} = await importShared('vue'); +const makeVRadioGroupProps = propsFactory({ + height: { + type: [Number, String], + default: 'auto' + }, + ...makeVInputProps(), + ...omit(makeSelectionControlGroupProps(), ['multiple']), + trueIcon: { + type: IconValue, + default: '$radioOn' + }, + falseIcon: { + type: IconValue, + default: '$radioOff' + }, + type: { + type: String, + default: 'radio' + } +}, 'VRadioGroup'); +const VRadioGroup = genericComponent()({ + name: 'VRadioGroup', + inheritAttrs: false, + props: makeVRadioGroupProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const uid = getUid(); + const id = computed$j(() => props.id || `radio-group-${uid}`); + const model = useProxiedModel(props, 'modelValue'); + useRender(() => { + const [rootAttrs, controlAttrs] = filterInputAttrs(attrs); + const inputProps = VInput.filterProps(props); + const controlProps = VSelectionControl.filterProps(props); + const label = slots.label ? slots.label({ + label: props.label, + props: { + for: id.value + } + }) : props.label; + return _createVNode$q(VInput, _mergeProps$g({ + "class": ['v-radio-group', props.class], + "style": props.style + }, rootAttrs, inputProps, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "id": id.value + }), { + ...slots, + default: _ref2 => { + let { + id, + messagesId, + isDisabled, + isReadonly + } = _ref2; + return _createVNode$q(_Fragment$8, null, [label && _createVNode$q(VLabel, { + "id": id.value + }, { + default: () => [label] + }), _createVNode$q(VSelectionControlGroup, _mergeProps$g(controlProps, { + "id": id.value, + "aria-describedby": messagesId.value, + "defaultsTarget": "VRadio", + "trueIcon": props.trueIcon, + "falseIcon": props.falseIcon, + "type": props.type, + "disabled": isDisabled.value, + "readonly": isReadonly.value, + "aria-labelledby": label ? id.value : undefined, + "multiple": false + }, controlAttrs, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event + }), slots)]); + } + }); + }); + return {}; + } +}); + +const {mergeProps:_mergeProps$f,createVNode:_createVNode$p,Fragment:_Fragment$7} = await importShared('vue'); +const {computed: computed$i,ref: ref$8} = await importShared('vue'); +const makeVRangeSliderProps = propsFactory({ + ...makeFocusProps(), + ...makeVInputProps(), + ...makeSliderProps(), + strict: Boolean, + modelValue: { + type: Array, + default: () => [0, 0] + } +}, 'VRangeSlider'); +const VRangeSlider = genericComponent()({ + name: 'VRangeSlider', + props: makeVRangeSliderProps(), + emits: { + 'update:focused': value => true, + 'update:modelValue': value => true, + end: value => true, + start: value => true + }, + setup(props, _ref) { + let { + slots, + emit + } = _ref; + const startThumbRef = ref$8(); + const stopThumbRef = ref$8(); + const inputRef = ref$8(); + const { + rtlClasses + } = useRtl(); + function getActiveThumb(e) { + if (!startThumbRef.value || !stopThumbRef.value) return; + const startOffset = getOffset(e, startThumbRef.value.$el, props.direction); + const stopOffset = getOffset(e, stopThumbRef.value.$el, props.direction); + const a = Math.abs(startOffset); + const b = Math.abs(stopOffset); + return a < b || a === b && startOffset < 0 ? startThumbRef.value.$el : stopThumbRef.value.$el; + } + const steps = useSteps(props); + const model = useProxiedModel(props, 'modelValue', undefined, arr => { + if (!arr?.length) return [0, 0]; + return arr.map(value => steps.roundValue(value)); + }); + const { + activeThumbRef, + hasLabels, + max, + min, + mousePressed, + onSliderMousedown, + onSliderTouchstart, + position, + trackContainerRef, + readonly + } = useSlider({ + props, + steps, + onSliderStart: () => { + emit('start', model.value); + }, + onSliderEnd: _ref2 => { + let { + value + } = _ref2; + const newValue = activeThumbRef.value === startThumbRef.value?.$el ? [value, model.value[1]] : [model.value[0], value]; + if (!props.strict && newValue[0] < newValue[1]) { + model.value = newValue; + } + emit('end', model.value); + }, + onSliderMove: _ref3 => { + let { + value + } = _ref3; + const [start, stop] = model.value; + if (!props.strict && start === stop && start !== min.value) { + activeThumbRef.value = value > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el; + activeThumbRef.value?.focus(); + } + if (activeThumbRef.value === startThumbRef.value?.$el) { + model.value = [Math.min(value, stop), stop]; + } else { + model.value = [start, Math.max(start, value)]; + } + }, + getActiveThumb + }); + const { + isFocused, + focus, + blur + } = useFocus(props); + const trackStart = computed$i(() => position(model.value[0])); + const trackStop = computed$i(() => position(model.value[1])); + useRender(() => { + const inputProps = VInput.filterProps(props); + const hasPrepend = !!(props.label || slots.label || slots.prepend); + return _createVNode$p(VInput, _mergeProps$f({ + "class": ['v-slider', 'v-range-slider', { + 'v-slider--has-labels': !!slots['tick-label'] || hasLabels.value, + 'v-slider--focused': isFocused.value, + 'v-slider--pressed': mousePressed.value, + 'v-slider--disabled': props.disabled + }, rtlClasses.value, props.class], + "style": props.style, + "ref": inputRef + }, inputProps, { + "focused": isFocused.value + }), { + ...slots, + prepend: hasPrepend ? slotProps => _createVNode$p(_Fragment$7, null, [slots.label?.(slotProps) ?? (props.label ? _createVNode$p(VLabel, { + "class": "v-slider__label", + "text": props.label + }, null) : undefined), slots.prepend?.(slotProps)]) : undefined, + default: _ref4 => { + let { + id, + messagesId + } = _ref4; + return _createVNode$p("div", { + "class": "v-slider__container", + "onMousedown": !readonly.value ? onSliderMousedown : undefined, + "onTouchstartPassive": !readonly.value ? onSliderTouchstart : undefined + }, [_createVNode$p("input", { + "id": `${id.value}_start`, + "name": props.name || id.value, + "disabled": !!props.disabled, + "readonly": !!props.readonly, + "tabindex": "-1", + "value": model.value[0] + }, null), _createVNode$p("input", { + "id": `${id.value}_stop`, + "name": props.name || id.value, + "disabled": !!props.disabled, + "readonly": !!props.readonly, + "tabindex": "-1", + "value": model.value[1] + }, null), _createVNode$p(VSliderTrack, { + "ref": trackContainerRef, + "start": trackStart.value, + "stop": trackStop.value + }, { + 'tick-label': slots['tick-label'] + }), _createVNode$p(VSliderThumb, { + "ref": startThumbRef, + "aria-describedby": messagesId.value, + "focused": isFocused && activeThumbRef.value === startThumbRef.value?.$el, + "modelValue": model.value[0], + "onUpdate:modelValue": v => model.value = [v, model.value[1]], + "onFocus": e => { + focus(); + activeThumbRef.value = startThumbRef.value?.$el; + + // Make sure second thumb is focused if + // the thumbs are on top of each other + // and they are both at minimum value + // but only if focused from outside. + if (model.value[0] === model.value[1] && model.value[1] === min.value && e.relatedTarget !== stopThumbRef.value?.$el) { + startThumbRef.value?.$el.blur(); + stopThumbRef.value?.$el.focus(); + } + }, + "onBlur": () => { + blur(); + activeThumbRef.value = undefined; + }, + "min": min.value, + "max": model.value[1], + "position": trackStart.value, + "ripple": props.ripple + }, { + 'thumb-label': slots['thumb-label'] + }), _createVNode$p(VSliderThumb, { + "ref": stopThumbRef, + "aria-describedby": messagesId.value, + "focused": isFocused && activeThumbRef.value === stopThumbRef.value?.$el, + "modelValue": model.value[1], + "onUpdate:modelValue": v => model.value = [model.value[0], v], + "onFocus": e => { + focus(); + activeThumbRef.value = stopThumbRef.value?.$el; + + // Make sure first thumb is focused if + // the thumbs are on top of each other + // and they are both at maximum value + // but only if focused from outside. + if (model.value[0] === model.value[1] && model.value[0] === max.value && e.relatedTarget !== startThumbRef.value?.$el) { + stopThumbRef.value?.$el.blur(); + startThumbRef.value?.$el.focus(); + } + }, + "onBlur": () => { + blur(); + activeThumbRef.value = undefined; + }, + "min": model.value[0], + "max": max.value, + "position": trackStop.value, + "ripple": props.ripple + }, { + 'thumb-label': slots['thumb-label'] + })]); + } + }); + }); + return {}; + } +}); + +const {createTextVNode:_createTextVNode,mergeProps:_mergeProps$e,createVNode:_createVNode$o,Fragment:_Fragment$6} = await importShared('vue'); +const {computed: computed$h,shallowRef: shallowRef$4} = await importShared('vue'); +const makeVRatingProps = propsFactory({ + name: String, + itemAriaLabel: { + type: String, + default: '$vuetify.rating.ariaLabel.item' + }, + activeColor: String, + color: String, + clearable: Boolean, + disabled: Boolean, + emptyIcon: { + type: IconValue, + default: '$ratingEmpty' + }, + fullIcon: { + type: IconValue, + default: '$ratingFull' + }, + halfIncrements: Boolean, + hover: Boolean, + length: { + type: [Number, String], + default: 5 + }, + readonly: Boolean, + modelValue: { + type: [Number, String], + default: 0 + }, + itemLabels: Array, + itemLabelPosition: { + type: String, + default: 'top', + validator: v => ['top', 'bottom'].includes(v) + }, + ripple: Boolean, + ...makeComponentProps(), + ...makeDensityProps(), + ...makeSizeProps(), + ...makeTagProps(), + ...makeThemeProps() +}, 'VRating'); +const VRating = genericComponent()({ + name: 'VRating', + props: makeVRatingProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + t + } = useLocale(); + const { + themeClasses + } = provideTheme(props); + const rating = useProxiedModel(props, 'modelValue'); + const normalizedValue = computed$h(() => clamp(parseFloat(rating.value), 0, +props.length)); + const range = computed$h(() => createRange(Number(props.length), 1)); + const increments = computed$h(() => range.value.flatMap(v => props.halfIncrements ? [v - 0.5, v] : [v])); + const hoverIndex = shallowRef$4(-1); + const itemState = computed$h(() => increments.value.map(value => { + const isHovering = props.hover && hoverIndex.value > -1; + const isFilled = normalizedValue.value >= value; + const isHovered = hoverIndex.value >= value; + const isFullIcon = isHovering ? isHovered : isFilled; + const icon = isFullIcon ? props.fullIcon : props.emptyIcon; + const activeColor = props.activeColor ?? props.color; + const color = isFilled || isHovered ? activeColor : props.color; + return { + isFilled, + isHovered, + icon, + color + }; + })); + const eventState = computed$h(() => [0, ...increments.value].map(value => { + function onMouseenter() { + hoverIndex.value = value; + } + function onMouseleave() { + hoverIndex.value = -1; + } + function onClick() { + if (props.disabled || props.readonly) return; + rating.value = normalizedValue.value === value && props.clearable ? 0 : value; + } + return { + onMouseenter: props.hover ? onMouseenter : undefined, + onMouseleave: props.hover ? onMouseleave : undefined, + onClick + }; + })); + const name = computed$h(() => props.name ?? `v-rating-${getUid()}`); + function VRatingItem(_ref2) { + let { + value, + index, + showStar = true + } = _ref2; + const { + onMouseenter, + onMouseleave, + onClick + } = eventState.value[index + 1]; + const id = `${name.value}-${String(value).replace('.', '-')}`; + const btnProps = { + color: itemState.value[index]?.color, + density: props.density, + disabled: props.disabled, + icon: itemState.value[index]?.icon, + ripple: props.ripple, + size: props.size, + variant: 'plain' + }; + return _createVNode$o(_Fragment$6, null, [_createVNode$o("label", { + "for": id, + "class": { + 'v-rating__item--half': props.halfIncrements && value % 1 > 0, + 'v-rating__item--full': props.halfIncrements && value % 1 === 0 + }, + "onMouseenter": onMouseenter, + "onMouseleave": onMouseleave, + "onClick": onClick + }, [_createVNode$o("span", { + "class": "v-rating__hidden" + }, [t(props.itemAriaLabel, value, props.length)]), !showStar ? undefined : slots.item ? slots.item({ + ...itemState.value[index], + props: btnProps, + value, + index, + rating: normalizedValue.value + }) : _createVNode$o(VBtn, _mergeProps$e({ + "aria-label": t(props.itemAriaLabel, value, props.length) + }, btnProps), null)]), _createVNode$o("input", { + "class": "v-rating__hidden", + "name": name.value, + "id": id, + "type": "radio", + "value": value, + "checked": normalizedValue.value === value, + "tabindex": -1, + "readonly": props.readonly, + "disabled": props.disabled + }, null)]); + } + function createLabel(labelProps) { + if (slots['item-label']) return slots['item-label'](labelProps); + if (labelProps.label) return _createVNode$o("span", null, [labelProps.label]); + return _createVNode$o("span", null, [_createTextVNode("\xA0")]); + } + useRender(() => { + const hasLabels = !!props.itemLabels?.length || slots['item-label']; + return _createVNode$o(props.tag, { + "class": ['v-rating', { + 'v-rating--hover': props.hover, + 'v-rating--readonly': props.readonly + }, themeClasses.value, props.class], + "style": props.style + }, { + default: () => [_createVNode$o(VRatingItem, { + "value": 0, + "index": -1, + "showStar": false + }, null), range.value.map((value, i) => _createVNode$o("div", { + "class": "v-rating__wrapper" + }, [hasLabels && props.itemLabelPosition === 'top' ? createLabel({ + value, + index: i, + label: props.itemLabels?.[i] + }) : undefined, _createVNode$o("div", { + "class": "v-rating__item" + }, [props.halfIncrements ? _createVNode$o(_Fragment$6, null, [_createVNode$o(VRatingItem, { + "value": value - 0.5, + "index": i * 2 + }, null), _createVNode$o(VRatingItem, { + "value": value, + "index": i * 2 + 1 + }, null)]) : _createVNode$o(VRatingItem, { + "value": value, + "index": i + }, null)]), hasLabels && props.itemLabelPosition === 'bottom' ? createLabel({ + value, + index: i, + label: props.itemLabels?.[i] + }) : undefined]))] + }); + }); + return {}; + } +}); + +const {mergeProps:_mergeProps$d,createVNode:_createVNode$n} = await importShared('vue'); +const {computed: computed$g,toRef: toRef$6} = await importShared('vue'); +const rootTypes = { + actions: 'button@2', + article: 'heading, paragraph', + avatar: 'avatar', + button: 'button', + card: 'image, heading', + 'card-avatar': 'image, list-item-avatar', + chip: 'chip', + 'date-picker': 'list-item, heading, divider, date-picker-options, date-picker-days, actions', + 'date-picker-options': 'text, avatar@2', + 'date-picker-days': 'avatar@28', + divider: 'divider', + heading: 'heading', + image: 'image', + 'list-item': 'text', + 'list-item-avatar': 'avatar, text', + 'list-item-two-line': 'sentences', + 'list-item-avatar-two-line': 'avatar, sentences', + 'list-item-three-line': 'paragraph', + 'list-item-avatar-three-line': 'avatar, paragraph', + ossein: 'ossein', + paragraph: 'text@3', + sentences: 'text@2', + subtitle: 'text', + table: 'table-heading, table-thead, table-tbody, table-tfoot', + 'table-heading': 'chip, text', + 'table-thead': 'heading@6', + 'table-tbody': 'table-row-divider@6', + 'table-row-divider': 'table-row, divider', + 'table-row': 'text@6', + 'table-tfoot': 'text@2, avatar@2', + text: 'text' +}; +function genBone(type) { + let children = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + return _createVNode$n("div", { + "class": ['v-skeleton-loader__bone', `v-skeleton-loader__${type}`] + }, [children]); +} +function genBones(bone) { + // e.g. 'text@3' + const [type, length] = bone.split('@'); + + // Generate a length array based upon + // value after @ in the bone string + return Array.from({ + length + }).map(() => genStructure(type)); +} +function genStructure(type) { + let children = []; + if (!type) return children; + + // TODO: figure out a better way to type this + const bone = rootTypes[type]; + + // End of recursion, do nothing + /* eslint-disable-next-line no-empty, brace-style */ + if (type === bone) ; + // Array of values - e.g. 'heading, paragraph, text@2' + else if (type.includes(',')) return mapBones(type); + // Array of values - e.g. 'paragraph@4' + else if (type.includes('@')) return genBones(type); + // Array of values - e.g. 'card@2' + else if (bone.includes(',')) children = mapBones(bone); + // Array of values - e.g. 'list-item@2' + else if (bone.includes('@')) children = genBones(bone); + // Single value - e.g. 'card-heading' + else if (bone) children.push(genStructure(bone)); + return [genBone(type, children)]; +} +function mapBones(bones) { + // Remove spaces and return array of structures + return bones.replace(/\s/g, '').split(',').map(genStructure); +} +const makeVSkeletonLoaderProps = propsFactory({ + boilerplate: Boolean, + color: String, + loading: Boolean, + loadingText: { + type: String, + default: '$vuetify.loading' + }, + type: { + type: [String, Array], + default: 'ossein' + }, + ...makeDimensionProps(), + ...makeElevationProps(), + ...makeThemeProps() +}, 'VSkeletonLoader'); +const VSkeletonLoader = genericComponent()({ + name: 'VSkeletonLoader', + props: makeVSkeletonLoaderProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$6(props, 'color')); + const { + dimensionStyles + } = useDimension(props); + const { + elevationClasses + } = useElevation(props); + const { + themeClasses + } = provideTheme(props); + const { + t + } = useLocale(); + const items = computed$g(() => genStructure(wrapInArray(props.type).join(','))); + useRender(() => { + const isLoading = !slots.default || props.loading; + const loadingProps = props.boilerplate || !isLoading ? {} : { + ariaLive: 'polite', + ariaLabel: t(props.loadingText), + role: 'alert' + }; + return _createVNode$n("div", _mergeProps$d({ + "class": ['v-skeleton-loader', { + 'v-skeleton-loader--boilerplate': props.boilerplate + }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value], + "style": [backgroundColorStyles.value, isLoading ? dimensionStyles.value : {}] + }, loadingProps), [isLoading ? items.value : slots.default?.()]); + }); + return {}; + } +}); + +// Composables +const VSlideGroupItem = genericComponent()({ + name: 'VSlideGroupItem', + props: makeGroupItemProps(), + emits: { + 'group:selected': val => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const slideGroupItem = useGroupItem(props, VSlideGroupSymbol); + return () => slots.default?.({ + isSelected: slideGroupItem.isSelected.value, + select: slideGroupItem.select, + toggle: slideGroupItem.toggle, + selectedClass: slideGroupItem.selectedClass.value + }); + } +}); + +const {mergeProps:_mergeProps$c,resolveDirective:_resolveDirective$d,createVNode:_createVNode$m} = await importShared('vue'); +const {computed: computed$f,inject: inject$2,mergeProps: mergeProps$2,nextTick: nextTick$2,onMounted: onMounted$1,onScopeDispose,ref: ref$7,shallowRef: shallowRef$3,watch: watch$3,watchEffect: watchEffect$1} = await importShared('vue'); +function useCountdown(milliseconds) { + const time = shallowRef$3(milliseconds()); + let timer = -1; + function clear() { + clearInterval(timer); + } + function reset() { + clear(); + nextTick$2(() => time.value = milliseconds()); + } + function start(el) { + const style = el ? getComputedStyle(el) : { + transitionDuration: 0.2 + }; + const interval = parseFloat(style.transitionDuration) * 1000 || 200; + clear(); + if (time.value <= 0) return; + const startTime = performance.now(); + timer = window.setInterval(() => { + const elapsed = performance.now() - startTime + interval; + time.value = Math.max(milliseconds() - elapsed, 0); + if (time.value <= 0) clear(); + }, interval); + } + onScopeDispose(clear); + return { + clear, + time, + start, + reset + }; +} +const makeVSnackbarProps = propsFactory({ + multiLine: Boolean, + text: String, + timer: [Boolean, String], + timeout: { + type: [Number, String], + default: 5000 + }, + vertical: Boolean, + ...makeLocationProps({ + location: 'bottom' + }), + ...makePositionProps(), + ...makeRoundedProps(), + ...makeVariantProps(), + ...makeThemeProps(), + ...omit(makeVOverlayProps({ + transition: 'v-snackbar-transition' + }), ['persistent', 'noClickAnimation', 'scrim', 'scrollStrategy']) +}, 'VSnackbar'); +const VSnackbar = genericComponent()({ + name: 'VSnackbar', + props: makeVSnackbarProps(), + emits: { + 'update:modelValue': v => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const isActive = useProxiedModel(props, 'modelValue'); + const { + positionClasses + } = usePosition(props); + const { + scopeId + } = useScopeId(); + const { + themeClasses + } = provideTheme(props); + const { + colorClasses, + colorStyles, + variantClasses + } = useVariant(props); + const { + roundedClasses + } = useRounded(props); + const countdown = useCountdown(() => Number(props.timeout)); + const overlay = ref$7(); + const timerRef = ref$7(); + const isHovering = shallowRef$3(false); + const startY = shallowRef$3(0); + const mainStyles = ref$7(); + const hasLayout = inject$2(VuetifyLayoutKey, undefined); + useToggleScope(() => !!hasLayout, () => { + const layout = useLayout(); + watchEffect$1(() => { + mainStyles.value = layout.mainStyles.value; + }); + }); + watch$3(isActive, startTimeout); + watch$3(() => props.timeout, startTimeout); + onMounted$1(() => { + if (isActive.value) startTimeout(); + }); + let activeTimeout = -1; + function startTimeout() { + countdown.reset(); + window.clearTimeout(activeTimeout); + const timeout = Number(props.timeout); + if (!isActive.value || timeout === -1) return; + const element = refElement(timerRef.value); + countdown.start(element); + activeTimeout = window.setTimeout(() => { + isActive.value = false; + }, timeout); + } + function clearTimeout() { + countdown.reset(); + window.clearTimeout(activeTimeout); + } + function onPointerenter() { + isHovering.value = true; + clearTimeout(); + } + function onPointerleave() { + isHovering.value = false; + startTimeout(); + } + function onTouchstart(event) { + startY.value = event.touches[0].clientY; + } + function onTouchend(event) { + if (Math.abs(startY.value - event.changedTouches[0].clientY) > 50) { + isActive.value = false; + } + } + function onAfterLeave() { + if (isHovering.value) onPointerleave(); + } + const locationClasses = computed$f(() => { + return props.location.split(' ').reduce((acc, loc) => { + acc[`v-snackbar--${loc}`] = true; + return acc; + }, {}); + }); + useRender(() => { + const overlayProps = VOverlay.filterProps(props); + const hasContent = !!(slots.default || slots.text || props.text); + return _createVNode$m(VOverlay, _mergeProps$c({ + "ref": overlay, + "class": ['v-snackbar', { + 'v-snackbar--active': isActive.value, + 'v-snackbar--multi-line': props.multiLine && !props.vertical, + 'v-snackbar--timer': !!props.timer, + 'v-snackbar--vertical': props.vertical + }, locationClasses.value, positionClasses.value, props.class], + "style": [mainStyles.value, props.style] + }, overlayProps, { + "modelValue": isActive.value, + "onUpdate:modelValue": $event => isActive.value = $event, + "contentProps": mergeProps$2({ + class: ['v-snackbar__wrapper', themeClasses.value, colorClasses.value, roundedClasses.value, variantClasses.value], + style: [colorStyles.value], + onPointerenter, + onPointerleave + }, overlayProps.contentProps), + "persistent": true, + "noClickAnimation": true, + "scrim": false, + "scrollStrategy": "none", + "_disableGlobalStack": true, + "onTouchstartPassive": onTouchstart, + "onTouchend": onTouchend, + "onAfterLeave": onAfterLeave + }, scopeId), { + default: () => [genOverlays(false, 'v-snackbar'), props.timer && !isHovering.value && _createVNode$m("div", { + "key": "timer", + "class": "v-snackbar__timer" + }, [_createVNode$m(VProgressLinear, { + "ref": timerRef, + "color": typeof props.timer === 'string' ? props.timer : 'info', + "max": props.timeout, + "model-value": countdown.time.value + }, null)]), hasContent && _createVNode$m("div", { + "key": "content", + "class": "v-snackbar__content", + "role": "status", + "aria-live": "polite" + }, [slots.text?.() ?? props.text, slots.default?.()]), slots.actions && _createVNode$m(VDefaultsProvider, { + "defaults": { + VBtn: { + variant: 'text', + ripple: false, + slim: true + } + } + }, { + default: () => [_createVNode$m("div", { + "class": "v-snackbar__actions" + }, [slots.actions({ + isActive + })])] + })], + activator: slots.activator + }); + }); + return forwardRefs({}, overlay); + } +}); + +// Utilities +const makeLineProps = propsFactory({ + autoDraw: Boolean, + autoDrawDuration: [Number, String], + autoDrawEasing: { + type: String, + default: 'ease' + }, + color: String, + gradient: { + type: Array, + default: () => [] + }, + gradientDirection: { + type: String, + validator: val => ['top', 'bottom', 'left', 'right'].includes(val), + default: 'top' + }, + height: { + type: [String, Number], + default: 75 + }, + labels: { + type: Array, + default: () => [] + }, + labelSize: { + type: [Number, String], + default: 7 + }, + lineWidth: { + type: [String, Number], + default: 4 + }, + id: String, + itemValue: { + type: String, + default: 'value' + }, + modelValue: { + type: Array, + default: () => [] + }, + min: [String, Number], + max: [String, Number], + padding: { + type: [String, Number], + default: 8 + }, + showLabels: Boolean, + smooth: Boolean, + width: { + type: [Number, String], + default: 300 + } +}, 'Line'); + +const {Fragment:_Fragment$5,createVNode:_createVNode$l} = await importShared('vue'); + +// Utilities +const {computed: computed$e} = await importShared('vue'); +const makeVBarlineProps = propsFactory({ + autoLineWidth: Boolean, + ...makeLineProps() +}, 'VBarline'); +const VBarline = genericComponent()({ + name: 'VBarline', + props: makeVBarlineProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const uid = getUid(); + const id = computed$e(() => props.id || `barline-${uid}`); + const autoDrawDuration = computed$e(() => Number(props.autoDrawDuration) || 500); + const hasLabels = computed$e(() => { + return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label); + }); + const lineWidth = computed$e(() => parseFloat(props.lineWidth) || 4); + const totalWidth = computed$e(() => Math.max(props.modelValue.length * lineWidth.value, Number(props.width))); + const boundary = computed$e(() => { + return { + minX: 0, + maxX: totalWidth.value, + minY: 0, + maxY: parseInt(props.height, 10) + }; + }); + const items = computed$e(() => props.modelValue.map(item => getPropertyFromItem(item, props.itemValue, item))); + function genBars(values, boundary) { + const { + minX, + maxX, + minY, + maxY + } = boundary; + const totalValues = values.length; + let maxValue = props.max != null ? Number(props.max) : Math.max(...values); + let minValue = props.min != null ? Number(props.min) : Math.min(...values); + if (minValue > 0 && props.min == null) minValue = 0; + if (maxValue < 0 && props.max == null) maxValue = 0; + const gridX = maxX / totalValues; + const gridY = (maxY - minY) / (maxValue - minValue || 1); + const horizonY = maxY - Math.abs(minValue * gridY); + return values.map((value, index) => { + const height = Math.abs(gridY * value); + return { + x: minX + index * gridX, + y: horizonY - height + +(value < 0) * height, + height, + value + }; + }); + } + const parsedLabels = computed$e(() => { + const labels = []; + const points = genBars(items.value, boundary.value); + const len = points.length; + for (let i = 0; labels.length < len; i++) { + const item = points[i]; + let value = props.labels[i]; + if (!value) { + value = typeof item === 'object' ? item.value : item; + } + labels.push({ + x: item.x, + value: String(value) + }); + } + return labels; + }); + const bars = computed$e(() => genBars(items.value, boundary.value)); + const offsetX = computed$e(() => (Math.abs(bars.value[0].x - bars.value[1].x) - lineWidth.value) / 2); + useRender(() => { + const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse(); + return _createVNode$l("svg", { + "display": "block" + }, [_createVNode$l("defs", null, [_createVNode$l("linearGradient", { + "id": id.value, + "gradientUnits": "userSpaceOnUse", + "x1": props.gradientDirection === 'left' ? '100%' : '0', + "y1": props.gradientDirection === 'top' ? '100%' : '0', + "x2": props.gradientDirection === 'right' ? '100%' : '0', + "y2": props.gradientDirection === 'bottom' ? '100%' : '0' + }, [gradientData.map((color, index) => _createVNode$l("stop", { + "offset": index / Math.max(gradientData.length - 1, 1), + "stop-color": color || 'currentColor' + }, null))])]), _createVNode$l("clipPath", { + "id": `${id.value}-clip` + }, [bars.value.map(item => _createVNode$l("rect", { + "x": item.x + offsetX.value, + "y": item.y, + "width": lineWidth.value, + "height": item.height, + "rx": typeof props.smooth === 'number' ? props.smooth : props.smooth ? 2 : 0, + "ry": typeof props.smooth === 'number' ? props.smooth : props.smooth ? 2 : 0 + }, [props.autoDraw && _createVNode$l(_Fragment$5, null, [_createVNode$l("animate", { + "attributeName": "y", + "from": item.y + item.height, + "to": item.y, + "dur": `${autoDrawDuration.value}ms`, + "fill": "freeze" + }, null), _createVNode$l("animate", { + "attributeName": "height", + "from": "0", + "to": item.height, + "dur": `${autoDrawDuration.value}ms`, + "fill": "freeze" + }, null)])]))]), hasLabels.value && _createVNode$l("g", { + "key": "labels", + "style": { + textAnchor: 'middle', + dominantBaseline: 'mathematical', + fill: 'currentColor' + } + }, [parsedLabels.value.map((item, i) => _createVNode$l("text", { + "x": item.x + offsetX.value + lineWidth.value / 2, + "y": parseInt(props.height, 10) - 2 + (parseInt(props.labelSize, 10) || 7 * 0.75), + "font-size": Number(props.labelSize) || 7 + }, [slots.label?.({ + index: i, + value: item.value + }) ?? item.value]))]), _createVNode$l("g", { + "clip-path": `url(#${id.value}-clip)`, + "fill": `url(#${id.value})` + }, [_createVNode$l("rect", { + "x": 0, + "y": 0, + "width": Math.max(props.modelValue.length * lineWidth.value, Number(props.width)), + "height": props.height + }, null)])]); + }); + } +}); + +// @ts-nocheck +/* eslint-disable */ + +// import { checkCollinear, getDistance, moveTo } from './math' + +/** + * From https://github.com/unsplash/react-trend/blob/master/src/helpers/DOM.helpers.js#L18 + */ +function genPath(points, radius) { + let fill = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + let height = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 75; + if (points.length === 0) return ''; + const start = points.shift(); + const end = points[points.length - 1]; + return (fill ? `M${start.x} ${height - start.x + 2} L${start.x} ${start.y}` : `M${start.x} ${start.y}`) + points.map((point, index) => { + const next = points[index + 1]; + const prev = points[index - 1] || start; + const isCollinear = next && checkCollinear(next, point, prev); + if (!next || isCollinear) { + return `L${point.x} ${point.y}`; + } + const threshold = Math.min(getDistance(prev, point), getDistance(next, point)); + const isTooCloseForRadius = threshold / 2 < radius; + const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius; + const before = moveTo(prev, point, radiusForPoint); + const after = moveTo(next, point, radiusForPoint); + return `L${before.x} ${before.y}S${point.x} ${point.y} ${after.x} ${after.y}`; + }).join('') + (fill ? `L${end.x} ${height - start.x + 2} Z` : ''); +} +function int(value) { + return parseInt(value, 10); +} + +/** + * https://en.wikipedia.org/wiki/Collinearity + * x=(x1+x2)/2 + * y=(y1+y2)/2 + */ +function checkCollinear(p0, p1, p2) { + return int(p0.x + p2.x) === int(2 * p1.x) && int(p0.y + p2.y) === int(2 * p1.y); +} +function getDistance(p1, p2) { + return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)); +} +function moveTo(to, from, radius) { + const vector = { + x: to.x - from.x, + y: to.y - from.y + }; + const length = Math.sqrt(vector.x * vector.x + vector.y * vector.y); + const unitVector = { + x: vector.x / length, + y: vector.y / length + }; + return { + x: from.x + unitVector.x * radius, + y: from.y + unitVector.y * radius + }; +} + +const {createVNode:_createVNode$k} = await importShared('vue'); + +// Utilities +const {computed: computed$d,nextTick: nextTick$1,ref: ref$6,watch: watch$2} = await importShared('vue'); +const makeVTrendlineProps = propsFactory({ + fill: Boolean, + ...makeLineProps() +}, 'VTrendline'); +const VTrendline = genericComponent()({ + name: 'VTrendline', + props: makeVTrendlineProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const uid = getUid(); + const id = computed$d(() => props.id || `trendline-${uid}`); + const autoDrawDuration = computed$d(() => Number(props.autoDrawDuration) || (props.fill ? 500 : 2000)); + const lastLength = ref$6(0); + const path = ref$6(null); + function genPoints(values, boundary) { + const { + minX, + maxX, + minY, + maxY + } = boundary; + const totalValues = values.length; + const maxValue = props.max != null ? Number(props.max) : Math.max(...values); + const minValue = props.min != null ? Number(props.min) : Math.min(...values); + const gridX = (maxX - minX) / (totalValues - 1); + const gridY = (maxY - minY) / (maxValue - minValue || 1); + return values.map((value, index) => { + return { + x: minX + index * gridX, + y: maxY - (value - minValue) * gridY, + value + }; + }); + } + const hasLabels = computed$d(() => { + return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label); + }); + const lineWidth = computed$d(() => { + return parseFloat(props.lineWidth) || 4; + }); + const totalWidth = computed$d(() => Number(props.width)); + const boundary = computed$d(() => { + const padding = Number(props.padding); + return { + minX: padding, + maxX: totalWidth.value - padding, + minY: padding, + maxY: parseInt(props.height, 10) - padding + }; + }); + const items = computed$d(() => props.modelValue.map(item => getPropertyFromItem(item, props.itemValue, item))); + const parsedLabels = computed$d(() => { + const labels = []; + const points = genPoints(items.value, boundary.value); + const len = points.length; + for (let i = 0; labels.length < len; i++) { + const item = points[i]; + let value = props.labels[i]; + if (!value) { + value = typeof item === 'object' ? item.value : item; + } + labels.push({ + x: item.x, + value: String(value) + }); + } + return labels; + }); + watch$2(() => props.modelValue, async () => { + await nextTick$1(); + if (!props.autoDraw || !path.value) return; + const pathRef = path.value; + const length = pathRef.getTotalLength(); + if (!props.fill) { + // Initial setup to "hide" the line by using the stroke dash array + pathRef.style.strokeDasharray = `${length}`; + pathRef.style.strokeDashoffset = `${length}`; + + // Force reflow to ensure the transition starts from this state + pathRef.getBoundingClientRect(); + + // Animate the stroke dash offset to "draw" the line + pathRef.style.transition = `stroke-dashoffset ${autoDrawDuration.value}ms ${props.autoDrawEasing}`; + pathRef.style.strokeDashoffset = '0'; + } else { + // Your existing logic for filled paths remains the same + pathRef.style.transformOrigin = 'bottom center'; + pathRef.style.transition = 'none'; + pathRef.style.transform = `scaleY(0)`; + pathRef.getBoundingClientRect(); + pathRef.style.transition = `transform ${autoDrawDuration.value}ms ${props.autoDrawEasing}`; + pathRef.style.transform = `scaleY(1)`; + } + lastLength.value = length; + }, { + immediate: true + }); + function genPath$1(fill) { + return genPath(genPoints(items.value, boundary.value), props.smooth ? 8 : Number(props.smooth), fill, parseInt(props.height, 10)); + } + useRender(() => { + const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse(); + return _createVNode$k("svg", { + "display": "block", + "stroke-width": parseFloat(props.lineWidth) ?? 4 + }, [_createVNode$k("defs", null, [_createVNode$k("linearGradient", { + "id": id.value, + "gradientUnits": "userSpaceOnUse", + "x1": props.gradientDirection === 'left' ? '100%' : '0', + "y1": props.gradientDirection === 'top' ? '100%' : '0', + "x2": props.gradientDirection === 'right' ? '100%' : '0', + "y2": props.gradientDirection === 'bottom' ? '100%' : '0' + }, [gradientData.map((color, index) => _createVNode$k("stop", { + "offset": index / Math.max(gradientData.length - 1, 1), + "stop-color": color || 'currentColor' + }, null))])]), hasLabels.value && _createVNode$k("g", { + "key": "labels", + "style": { + textAnchor: 'middle', + dominantBaseline: 'mathematical', + fill: 'currentColor' + } + }, [parsedLabels.value.map((item, i) => _createVNode$k("text", { + "x": item.x + lineWidth.value / 2 + lineWidth.value / 2, + "y": parseInt(props.height, 10) - 4 + (parseInt(props.labelSize, 10) || 7 * 0.75), + "font-size": Number(props.labelSize) || 7 + }, [slots.label?.({ + index: i, + value: item.value + }) ?? item.value]))]), _createVNode$k("path", { + "ref": path, + "d": genPath$1(props.fill), + "fill": props.fill ? `url(#${id.value})` : 'none', + "stroke": props.fill ? 'none' : `url(#${id.value})` + }, null), props.fill && _createVNode$k("path", { + "d": genPath$1(false), + "fill": "none", + "stroke": props.color ?? props.gradient?.[0] + }, null)]); + }); + } +}); + +const {createVNode:_createVNode$j,mergeProps:_mergeProps$b,resolveDirective:_resolveDirective$c} = await importShared('vue'); +const {computed: computed$c,toRef: toRef$5} = await importShared('vue'); +// Types + +const makeVSparklineProps = propsFactory({ + type: { + type: String, + default: 'trend' + }, + ...makeVBarlineProps(), + ...makeVTrendlineProps() +}, 'VSparkline'); +const VSparkline = genericComponent()({ + name: 'VSparkline', + props: makeVSparklineProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + textColorClasses, + textColorStyles + } = useTextColor(toRef$5(props, 'color')); + const hasLabels = computed$c(() => { + return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label); + }); + const totalHeight = computed$c(() => { + let height = parseInt(props.height, 10); + if (hasLabels.value) height += parseInt(props.labelSize, 10) * 1.5; + return height; + }); + useRender(() => { + const Tag = props.type === 'trend' ? VTrendline : VBarline; + const lineProps = props.type === 'trend' ? VTrendline.filterProps(props) : VBarline.filterProps(props); + return _createVNode$j(Tag, _mergeProps$b({ + "key": props.type, + "class": textColorClasses.value, + "style": textColorStyles.value, + "viewBox": `0 0 ${props.width} ${parseInt(totalHeight.value, 10)}` + }, lineProps), slots); + }); + } +}); + +const {mergeProps:_mergeProps$a,createVNode:_createVNode$i} = await importShared('vue'); +const {computed: computed$b,ref: ref$5} = await importShared('vue'); +const makeVSpeedDialProps = propsFactory({ + ...makeComponentProps(), + ...makeVMenuProps({ + offset: 8, + minWidth: 0, + openDelay: 0, + closeDelay: 100, + location: 'top center', + transition: 'scale-transition' + }) +}, 'VSpeedDial'); +const VSpeedDial = genericComponent()({ + name: 'VSpeedDial', + props: makeVSpeedDialProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const model = useProxiedModel(props, 'modelValue'); + const menuRef = ref$5(); + const location = computed$b(() => { + const [y, x = 'center'] = props.location?.split(' ') ?? []; + return `${y} ${x}`; + }); + const locationClasses = computed$b(() => ({ + [`v-speed-dial__content--${location.value.replace(' ', '-')}`]: true + })); + useRender(() => { + const menuProps = VMenu.filterProps(props); + return _createVNode$i(VMenu, _mergeProps$a(menuProps, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "class": props.class, + "style": props.style, + "contentClass": ['v-speed-dial__content', locationClasses.value, props.contentClass], + "location": location.value, + "ref": menuRef, + "transition": "fade-transition" + }), { + ...slots, + default: slotProps => _createVNode$i(VDefaultsProvider, { + "defaults": { + VBtn: { + size: 'small' + } + } + }, { + default: () => [_createVNode$i(MaybeTransition, { + "appear": true, + "group": true, + "transition": props.transition + }, { + default: () => [slots.default?.(slotProps)] + })] + }) + }); + }); + return {}; + } +}); + +// Types + +const VStepperSymbol = Symbol.for('vuetify:v-stepper'); + +const {createVNode:_createVNode$h} = await importShared('vue'); +const makeVStepperActionsProps = propsFactory({ + color: String, + disabled: { + type: [Boolean, String], + default: false + }, + prevText: { + type: String, + default: '$vuetify.stepper.prev' + }, + nextText: { + type: String, + default: '$vuetify.stepper.next' + } +}, 'VStepperActions'); +const VStepperActions = genericComponent()({ + name: 'VStepperActions', + props: makeVStepperActionsProps(), + emits: { + 'click:prev': () => true, + 'click:next': () => true + }, + setup(props, _ref) { + let { + emit, + slots + } = _ref; + const { + t + } = useLocale(); + function onClickPrev() { + emit('click:prev'); + } + function onClickNext() { + emit('click:next'); + } + useRender(() => { + const prevSlotProps = { + onClick: onClickPrev + }; + const nextSlotProps = { + onClick: onClickNext + }; + return _createVNode$h("div", { + "class": "v-stepper-actions" + }, [_createVNode$h(VDefaultsProvider, { + "defaults": { + VBtn: { + disabled: ['prev', true].includes(props.disabled), + text: t(props.prevText), + variant: 'text' + } + } + }, { + default: () => [slots.prev?.({ + props: prevSlotProps + }) ?? _createVNode$h(VBtn, prevSlotProps, null)] + }), _createVNode$h(VDefaultsProvider, { + "defaults": { + VBtn: { + color: props.color, + disabled: ['next', true].includes(props.disabled), + text: t(props.nextText), + variant: 'tonal' + } + } + }, { + default: () => [slots.next?.({ + props: nextSlotProps + }) ?? _createVNode$h(VBtn, nextSlotProps, null)] + })]); + }); + return {}; + } +}); + +// Utilities +const VStepperHeader = createSimpleFunctional('v-stepper-header'); + +const {withDirectives:_withDirectives$1,resolveDirective:_resolveDirective$b,createVNode:_createVNode$g} = await importShared('vue'); +const {computed: computed$a} = await importShared('vue'); +const makeStepperItemProps = propsFactory({ + color: String, + title: String, + subtitle: String, + complete: Boolean, + completeIcon: { + type: String, + default: '$complete' + }, + editable: Boolean, + editIcon: { + type: String, + default: '$edit' + }, + error: Boolean, + errorIcon: { + type: String, + default: '$error' + }, + icon: String, + ripple: { + type: [Boolean, Object], + default: true + }, + rules: { + type: Array, + default: () => [] + } +}, 'StepperItem'); +const makeVStepperItemProps = propsFactory({ + ...makeStepperItemProps(), + ...makeGroupItemProps() +}, 'VStepperItem'); +const VStepperItem = genericComponent()({ + name: 'VStepperItem', + directives: { + Ripple + }, + props: makeVStepperItemProps(), + emits: { + 'group:selected': val => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const group = useGroupItem(props, VStepperSymbol, true); + const step = computed$a(() => group?.value.value ?? props.value); + const isValid = computed$a(() => props.rules.every(handler => handler() === true)); + const isClickable = computed$a(() => !props.disabled && props.editable); + const canEdit = computed$a(() => !props.disabled && props.editable); + const hasError = computed$a(() => props.error || !isValid.value); + const hasCompleted = computed$a(() => props.complete || props.rules.length > 0 && isValid.value); + const icon = computed$a(() => { + if (hasError.value) return props.errorIcon; + if (hasCompleted.value) return props.completeIcon; + if (group.isSelected.value && props.editable) return props.editIcon; + return props.icon; + }); + const slotProps = computed$a(() => ({ + canEdit: canEdit.value, + hasError: hasError.value, + hasCompleted: hasCompleted.value, + title: props.title, + subtitle: props.subtitle, + step: step.value, + value: props.value + })); + useRender(() => { + const hasColor = (!group || group.isSelected.value || hasCompleted.value || canEdit.value) && !hasError.value && !props.disabled; + const hasTitle = !!(props.title != null || slots.title); + const hasSubtitle = !!(props.subtitle != null || slots.subtitle); + function onClick() { + group?.toggle(); + } + return _withDirectives$1(_createVNode$g("button", { + "class": ['v-stepper-item', { + 'v-stepper-item--complete': hasCompleted.value, + 'v-stepper-item--disabled': props.disabled, + 'v-stepper-item--error': hasError.value + }, group?.selectedClass.value], + "disabled": !props.editable, + "onClick": onClick + }, [isClickable.value && genOverlays(true, 'v-stepper-item'), _createVNode$g(VAvatar, { + "key": "stepper-avatar", + "class": "v-stepper-item__avatar", + "color": hasColor ? props.color : undefined, + "size": 24 + }, { + default: () => [slots.icon?.(slotProps.value) ?? (icon.value ? _createVNode$g(VIcon, { + "icon": icon.value + }, null) : step.value)] + }), _createVNode$g("div", { + "class": "v-stepper-item__content" + }, [hasTitle && _createVNode$g("div", { + "key": "title", + "class": "v-stepper-item__title" + }, [slots.title?.(slotProps.value) ?? props.title]), hasSubtitle && _createVNode$g("div", { + "key": "subtitle", + "class": "v-stepper-item__subtitle" + }, [slots.subtitle?.(slotProps.value) ?? props.subtitle]), slots.default?.(slotProps.value)])]), [[_resolveDirective$b("ripple"), props.ripple && props.editable, null]]); + }); + return {}; + } +}); + +const {createVNode:_createVNode$f,mergeProps:_mergeProps$9,resolveDirective:_resolveDirective$a} = await importShared('vue'); +const {computed: computed$9,inject: inject$1} = await importShared('vue'); +const makeVStepperWindowProps = propsFactory({ + ...omit(makeVWindowProps(), ['continuous', 'nextIcon', 'prevIcon', 'showArrows', 'touch', 'mandatory']) +}, 'VStepperWindow'); +const VStepperWindow = genericComponent()({ + name: 'VStepperWindow', + props: makeVStepperWindowProps(), + emits: { + 'update:modelValue': v => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const group = inject$1(VStepperSymbol, null); + const _model = useProxiedModel(props, 'modelValue'); + const model = computed$9({ + get() { + // Always return modelValue if defined + // or if not within a VStepper group + if (_model.value != null || !group) return _model.value; + + // If inside of a VStepper, find the currently selected + // item by id. Item value may be assigned by its index + return group.items.value.find(item => group.selected.value.includes(item.id))?.value; + }, + set(val) { + _model.value = val; + } + }); + useRender(() => { + const windowProps = VWindow.filterProps(props); + return _createVNode$f(VWindow, _mergeProps$9({ + "_as": "VStepperWindow" + }, windowProps, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "class": ['v-stepper-window', props.class], + "style": props.style, + "mandatory": false, + "touch": false + }), slots); + }); + return {}; + } +}); + +const {createVNode:_createVNode$e,mergeProps:_mergeProps$8,resolveDirective:_resolveDirective$9} = await importShared('vue'); +const makeVStepperWindowItemProps = propsFactory({ + ...makeVWindowItemProps() +}, 'VStepperWindowItem'); +const VStepperWindowItem = genericComponent()({ + name: 'VStepperWindowItem', + props: makeVStepperWindowItemProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => { + const windowItemProps = VWindowItem.filterProps(props); + return _createVNode$e(VWindowItem, _mergeProps$8({ + "_as": "VStepperWindowItem" + }, windowItemProps, { + "class": ['v-stepper-window-item', props.class], + "style": props.style + }), slots); + }); + return {}; + } +}); + +const {mergeProps:_mergeProps$7,resolveDirective:_resolveDirective$8,createVNode:_createVNode$d,Fragment:_Fragment$4} = await importShared('vue'); +const {computed: computed$8,toRefs} = await importShared('vue'); +const makeStepperProps = propsFactory({ + altLabels: Boolean, + bgColor: String, + completeIcon: String, + editIcon: String, + editable: Boolean, + errorIcon: String, + hideActions: Boolean, + items: { + type: Array, + default: () => [] + }, + itemTitle: { + type: String, + default: 'title' + }, + itemValue: { + type: String, + default: 'value' + }, + nonLinear: Boolean, + flat: Boolean, + ...makeDisplayProps() +}, 'Stepper'); +const makeVStepperProps = propsFactory({ + ...makeStepperProps(), + ...makeGroupProps({ + mandatory: 'force', + selectedClass: 'v-stepper-item--selected' + }), + ...makeVSheetProps(), + ...only(makeVStepperActionsProps(), ['prevText', 'nextText']) +}, 'VStepper'); +const VStepper = genericComponent()({ + name: 'VStepper', + props: makeVStepperProps(), + emits: { + 'update:modelValue': v => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const { + items: _items, + next, + prev, + selected + } = useGroup(props, VStepperSymbol); + const { + displayClasses, + mobile + } = useDisplay(props); + const { + completeIcon, + editIcon, + errorIcon, + color, + editable, + prevText, + nextText + } = toRefs(props); + const items = computed$8(() => props.items.map((item, index) => { + const title = getPropertyFromItem(item, props.itemTitle, item); + const value = getPropertyFromItem(item, props.itemValue, index + 1); + return { + title, + value, + raw: item + }; + })); + const activeIndex = computed$8(() => { + return _items.value.findIndex(item => selected.value.includes(item.id)); + }); + const disabled = computed$8(() => { + if (props.disabled) return props.disabled; + if (activeIndex.value === 0) return 'prev'; + if (activeIndex.value === _items.value.length - 1) return 'next'; + return false; + }); + provideDefaults({ + VStepperItem: { + editable, + errorIcon, + completeIcon, + editIcon, + prevText, + nextText + }, + VStepperActions: { + color, + disabled, + prevText, + nextText + } + }); + useRender(() => { + const sheetProps = VSheet.filterProps(props); + const hasHeader = !!(slots.header || props.items.length); + const hasWindow = props.items.length > 0; + const hasActions = !props.hideActions && !!(hasWindow || slots.actions); + return _createVNode$d(VSheet, _mergeProps$7(sheetProps, { + "color": props.bgColor, + "class": ['v-stepper', { + 'v-stepper--alt-labels': props.altLabels, + 'v-stepper--flat': props.flat, + 'v-stepper--non-linear': props.nonLinear, + 'v-stepper--mobile': mobile.value + }, displayClasses.value, props.class], + "style": props.style + }), { + default: () => [hasHeader && _createVNode$d(VStepperHeader, { + "key": "stepper-header" + }, { + default: () => [items.value.map((_ref2, index) => { + let { + raw, + ...item + } = _ref2; + return _createVNode$d(_Fragment$4, null, [!!index && _createVNode$d(VDivider, null, null), _createVNode$d(VStepperItem, item, { + default: slots[`header-item.${item.value}`] ?? slots.header, + icon: slots.icon, + title: slots.title, + subtitle: slots.subtitle + })]); + })] + }), hasWindow && _createVNode$d(VStepperWindow, { + "key": "stepper-window" + }, { + default: () => [items.value.map(item => _createVNode$d(VStepperWindowItem, { + "value": item.value + }, { + default: () => slots[`item.${item.value}`]?.(item) ?? slots.item?.(item) + }))] + }), slots.default?.({ + prev, + next + }), hasActions && (slots.actions?.({ + next, + prev + }) ?? _createVNode$d(VStepperActions, { + "key": "stepper-actions", + "onClick:prev": prev, + "onClick:next": next + }, slots))] + }); + }); + return { + prev, + next + }; + } +}); + +const {mergeProps:_mergeProps$6,Fragment:_Fragment$3,createVNode:_createVNode$c} = await importShared('vue'); +const {computed: computed$7,ref: ref$4} = await importShared('vue'); +const makeVSwitchProps = propsFactory({ + indeterminate: Boolean, + inset: Boolean, + flat: Boolean, + loading: { + type: [Boolean, String], + default: false + }, + ...makeVInputProps(), + ...makeVSelectionControlProps() +}, 'VSwitch'); +const VSwitch = genericComponent()({ + name: 'VSwitch', + inheritAttrs: false, + props: makeVSwitchProps(), + emits: { + 'update:focused': focused => true, + 'update:modelValue': value => true, + 'update:indeterminate': value => true + }, + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const indeterminate = useProxiedModel(props, 'indeterminate'); + const model = useProxiedModel(props, 'modelValue'); + const { + loaderClasses + } = useLoader(props); + const { + isFocused, + focus, + blur + } = useFocus(props); + const control = ref$4(); + const isForcedColorsModeActive = IN_BROWSER && window.matchMedia('(forced-colors: active)').matches; + const loaderColor = computed$7(() => { + return typeof props.loading === 'string' && props.loading !== '' ? props.loading : props.color; + }); + const uid = getUid(); + const id = computed$7(() => props.id || `switch-${uid}`); + function onChange() { + if (indeterminate.value) { + indeterminate.value = false; + } + } + function onTrackClick(e) { + e.stopPropagation(); + e.preventDefault(); + control.value?.input?.click(); + } + useRender(() => { + const [rootAttrs, controlAttrs] = filterInputAttrs(attrs); + const inputProps = VInput.filterProps(props); + const controlProps = VSelectionControl.filterProps(props); + return _createVNode$c(VInput, _mergeProps$6({ + "class": ['v-switch', { + 'v-switch--flat': props.flat + }, { + 'v-switch--inset': props.inset + }, { + 'v-switch--indeterminate': indeterminate.value + }, loaderClasses.value, props.class] + }, rootAttrs, inputProps, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "id": id.value, + "focused": isFocused.value, + "style": props.style + }), { + ...slots, + default: _ref2 => { + let { + id, + messagesId, + isDisabled, + isReadonly, + isValid + } = _ref2; + const slotProps = { + model, + isValid + }; + return _createVNode$c(VSelectionControl, _mergeProps$6({ + "ref": control + }, controlProps, { + "modelValue": model.value, + "onUpdate:modelValue": [$event => model.value = $event, onChange], + "id": id.value, + "aria-describedby": messagesId.value, + "type": "checkbox", + "aria-checked": indeterminate.value ? 'mixed' : undefined, + "disabled": isDisabled.value, + "readonly": isReadonly.value, + "onFocus": focus, + "onBlur": blur + }, controlAttrs), { + ...slots, + default: _ref3 => { + let { + backgroundColorClasses, + backgroundColorStyles + } = _ref3; + return _createVNode$c("div", { + "class": ['v-switch__track', !isForcedColorsModeActive ? backgroundColorClasses.value : undefined], + "style": backgroundColorStyles.value, + "onClick": onTrackClick + }, [slots['track-true'] && _createVNode$c("div", { + "key": "prepend", + "class": "v-switch__track-true" + }, [slots['track-true'](slotProps)]), slots['track-false'] && _createVNode$c("div", { + "key": "append", + "class": "v-switch__track-false" + }, [slots['track-false'](slotProps)])]); + }, + input: _ref4 => { + let { + inputNode, + icon, + backgroundColorClasses, + backgroundColorStyles + } = _ref4; + return _createVNode$c(_Fragment$3, null, [inputNode, _createVNode$c("div", { + "class": ['v-switch__thumb', { + 'v-switch__thumb--filled': icon || props.loading + }, props.inset || isForcedColorsModeActive ? undefined : backgroundColorClasses.value], + "style": props.inset ? undefined : backgroundColorStyles.value + }, [slots.thumb ? _createVNode$c(VDefaultsProvider, { + "defaults": { + VIcon: { + icon, + size: 'x-small' + } + } + }, { + default: () => [slots.thumb({ + ...slotProps, + icon + })] + }) : _createVNode$c(VScaleTransition, null, { + default: () => [!props.loading ? icon && _createVNode$c(VIcon, { + "key": String(icon), + "icon": icon, + "size": "x-small" + }, null) : _createVNode$c(LoaderSlot, { + "name": "v-switch", + "active": true, + "color": isValid.value === false ? undefined : loaderColor.value + }, { + default: slotProps => slots.loader ? slots.loader(slotProps) : _createVNode$c(VProgressCircular, { + "active": slotProps.isActive, + "color": slotProps.color, + "indeterminate": true, + "size": "16", + "width": "2" + }, null) + })] + })])]); + } + }); + } + }); + }); + return {}; + } +}); + +const {createVNode:_createVNode$b,resolveDirective:_resolveDirective$7} = await importShared('vue'); +const {computed: computed$6,shallowRef: shallowRef$2,toRef: toRef$4} = await importShared('vue'); +const makeVSystemBarProps = propsFactory({ + color: String, + height: [Number, String], + window: Boolean, + ...makeComponentProps(), + ...makeElevationProps(), + ...makeLayoutItemProps(), + ...makeRoundedProps(), + ...makeTagProps(), + ...makeThemeProps() +}, 'VSystemBar'); +const VSystemBar = genericComponent()({ + name: 'VSystemBar', + props: makeVSystemBarProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$4(props, 'color')); + const { + elevationClasses + } = useElevation(props); + const { + roundedClasses + } = useRounded(props); + const { + ssrBootStyles + } = useSsrBoot(); + const height = computed$6(() => props.height ?? (props.window ? 32 : 24)); + const { + layoutItemStyles + } = useLayoutItem({ + id: props.name, + order: computed$6(() => parseInt(props.order, 10)), + position: shallowRef$2('top'), + layoutSize: height, + elementSize: height, + active: computed$6(() => true), + absolute: toRef$4(props, 'absolute') + }); + useRender(() => _createVNode$b(props.tag, { + "class": ['v-system-bar', { + 'v-system-bar--window': props.window + }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value, roundedClasses.value, props.class], + "style": [backgroundColorStyles.value, layoutItemStyles.value, ssrBootStyles.value, props.style] + }, slots)); + return {}; + } +}); + +// Types + +const VTabsSymbol = Symbol.for('vuetify:v-tabs'); + +const {mergeProps:_mergeProps$5,createVNode:_createVNode$a,Fragment:_Fragment$2} = await importShared('vue'); +const {computed: computed$5,ref: ref$3} = await importShared('vue'); +const makeVTabProps = propsFactory({ + fixed: Boolean, + sliderColor: String, + hideSlider: Boolean, + direction: { + type: String, + default: 'horizontal' + }, + ...omit(makeVBtnProps({ + selectedClass: 'v-tab--selected', + variant: 'text' + }), ['active', 'block', 'flat', 'location', 'position', 'symbol']) +}, 'VTab'); +const VTab = genericComponent()({ + name: 'VTab', + props: makeVTabProps(), + setup(props, _ref) { + let { + slots, + attrs + } = _ref; + const { + textColorClasses: sliderColorClasses, + textColorStyles: sliderColorStyles + } = useTextColor(props, 'sliderColor'); + const rootEl = ref$3(); + const sliderEl = ref$3(); + const isHorizontal = computed$5(() => props.direction === 'horizontal'); + const isSelected = computed$5(() => rootEl.value?.group?.isSelected.value ?? false); + function updateSlider(_ref2) { + let { + value + } = _ref2; + if (value) { + const prevEl = rootEl.value?.$el.parentElement?.querySelector('.v-tab--selected .v-tab__slider'); + const nextEl = sliderEl.value; + if (!prevEl || !nextEl) return; + const color = getComputedStyle(prevEl).color; + const prevBox = prevEl.getBoundingClientRect(); + const nextBox = nextEl.getBoundingClientRect(); + const xy = isHorizontal.value ? 'x' : 'y'; + const XY = isHorizontal.value ? 'X' : 'Y'; + const rightBottom = isHorizontal.value ? 'right' : 'bottom'; + const widthHeight = isHorizontal.value ? 'width' : 'height'; + const prevPos = prevBox[xy]; + const nextPos = nextBox[xy]; + const delta = prevPos > nextPos ? prevBox[rightBottom] - nextBox[rightBottom] : prevBox[xy] - nextBox[xy]; + const origin = Math.sign(delta) > 0 ? isHorizontal.value ? 'right' : 'bottom' : Math.sign(delta) < 0 ? isHorizontal.value ? 'left' : 'top' : 'center'; + const size = Math.abs(delta) + (Math.sign(delta) < 0 ? prevBox[widthHeight] : nextBox[widthHeight]); + const scale = size / Math.max(prevBox[widthHeight], nextBox[widthHeight]) || 0; + const initialScale = prevBox[widthHeight] / nextBox[widthHeight] || 0; + const sigma = 1.5; + animate(nextEl, { + backgroundColor: [color, 'currentcolor'], + transform: [`translate${XY}(${delta}px) scale${XY}(${initialScale})`, `translate${XY}(${delta / sigma}px) scale${XY}(${(scale - 1) / sigma + 1})`, 'none'], + transformOrigin: Array(3).fill(origin) + }, { + duration: 225, + easing: standardEasing + }); + } + } + useRender(() => { + const btnProps = VBtn.filterProps(props); + return _createVNode$a(VBtn, _mergeProps$5({ + "symbol": VTabsSymbol, + "ref": rootEl, + "class": ['v-tab', props.class], + "style": props.style, + "tabindex": isSelected.value ? 0 : -1, + "role": "tab", + "aria-selected": String(isSelected.value), + "active": false + }, btnProps, attrs, { + "block": props.fixed, + "maxWidth": props.fixed ? 300 : undefined, + "onGroup:selected": updateSlider + }), { + ...slots, + default: () => _createVNode$a(_Fragment$2, null, [slots.default?.() ?? props.text, !props.hideSlider && _createVNode$a("div", { + "ref": sliderEl, + "class": ['v-tab__slider', sliderColorClasses.value], + "style": sliderColorStyles.value + }, null)]) + }); + }); + return forwardRefs({}, rootEl); + } +}); + +const {createVNode:_createVNode$9,mergeProps:_mergeProps$4,resolveDirective:_resolveDirective$6} = await importShared('vue'); +const {computed: computed$4,inject} = await importShared('vue'); +const makeVTabsWindowProps = propsFactory({ + ...omit(makeVWindowProps(), ['continuous', 'nextIcon', 'prevIcon', 'showArrows', 'touch', 'mandatory']) +}, 'VTabsWindow'); +const VTabsWindow = genericComponent()({ + name: 'VTabsWindow', + props: makeVTabsWindowProps(), + emits: { + 'update:modelValue': v => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const group = inject(VTabsSymbol, null); + const _model = useProxiedModel(props, 'modelValue'); + const model = computed$4({ + get() { + // Always return modelValue if defined + // or if not within a VTabs group + if (_model.value != null || !group) return _model.value; + + // If inside of a VTabs, find the currently selected + // item by id. Item value may be assigned by its index + return group.items.value.find(item => group.selected.value.includes(item.id))?.value; + }, + set(val) { + _model.value = val; + } + }); + useRender(() => { + const windowProps = VWindow.filterProps(props); + return _createVNode$9(VWindow, _mergeProps$4({ + "_as": "VTabsWindow" + }, windowProps, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "class": ['v-tabs-window', props.class], + "style": props.style, + "mandatory": false, + "touch": false + }), slots); + }); + return {}; + } +}); + +const {createVNode:_createVNode$8,mergeProps:_mergeProps$3,resolveDirective:_resolveDirective$5} = await importShared('vue'); +const makeVTabsWindowItemProps = propsFactory({ + ...makeVWindowItemProps() +}, 'VTabsWindowItem'); +const VTabsWindowItem = genericComponent()({ + name: 'VTabsWindowItem', + props: makeVTabsWindowItemProps(), + setup(props, _ref) { + let { + slots + } = _ref; + useRender(() => { + const windowItemProps = VWindowItem.filterProps(props); + return _createVNode$8(VWindowItem, _mergeProps$3({ + "_as": "VTabsWindowItem" + }, windowItemProps, { + "class": ['v-tabs-window-item', props.class], + "style": props.style + }), slots); + }); + return {}; + } +}); + +const {createVNode:_createVNode$7,mergeProps:_mergeProps$2,resolveDirective:_resolveDirective$4,Fragment:_Fragment$1} = await importShared('vue'); +const {computed: computed$3,toRef: toRef$3} = await importShared('vue'); +function parseItems(items) { + if (!items) return []; + return items.map(item => { + if (!isObject(item)) return { + text: item, + value: item + }; + return item; + }); +} +const makeVTabsProps = propsFactory({ + alignTabs: { + type: String, + default: 'start' + }, + color: String, + fixedTabs: Boolean, + items: { + type: Array, + default: () => [] + }, + stacked: Boolean, + bgColor: String, + grow: Boolean, + height: { + type: [Number, String], + default: undefined + }, + hideSlider: Boolean, + sliderColor: String, + ...makeVSlideGroupProps({ + mandatory: 'force', + selectedClass: 'v-tab-item--selected' + }), + ...makeDensityProps(), + ...makeTagProps() +}, 'VTabs'); +const VTabs = genericComponent()({ + name: 'VTabs', + props: makeVTabsProps(), + emits: { + 'update:modelValue': v => true + }, + setup(props, _ref) { + let { + attrs, + slots + } = _ref; + const model = useProxiedModel(props, 'modelValue'); + const items = computed$3(() => parseItems(props.items)); + const { + densityClasses + } = useDensity(props); + const { + backgroundColorClasses, + backgroundColorStyles + } = useBackgroundColor(toRef$3(props, 'bgColor')); + const { + scopeId + } = useScopeId(); + provideDefaults({ + VTab: { + color: toRef$3(props, 'color'), + direction: toRef$3(props, 'direction'), + stacked: toRef$3(props, 'stacked'), + fixed: toRef$3(props, 'fixedTabs'), + sliderColor: toRef$3(props, 'sliderColor'), + hideSlider: toRef$3(props, 'hideSlider') + } + }); + useRender(() => { + const slideGroupProps = VSlideGroup.filterProps(props); + const hasWindow = !!(slots.window || props.items.length > 0); + return _createVNode$7(_Fragment$1, null, [_createVNode$7(VSlideGroup, _mergeProps$2(slideGroupProps, { + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "class": ['v-tabs', `v-tabs--${props.direction}`, `v-tabs--align-tabs-${props.alignTabs}`, { + 'v-tabs--fixed-tabs': props.fixedTabs, + 'v-tabs--grow': props.grow, + 'v-tabs--stacked': props.stacked + }, densityClasses.value, backgroundColorClasses.value, props.class], + "style": [{ + '--v-tabs-height': convertToUnit(props.height) + }, backgroundColorStyles.value, props.style], + "role": "tablist", + "symbol": VTabsSymbol + }, scopeId, attrs), { + default: () => [slots.default?.() ?? items.value.map(item => slots.tab?.({ + item + }) ?? _createVNode$7(VTab, _mergeProps$2(item, { + "key": item.text, + "value": item.value + }), { + default: slots[`tab.${item.value}`] ? () => slots[`tab.${item.value}`]?.({ + item + }) : undefined + }))] + }), hasWindow && _createVNode$7(VTabsWindow, _mergeProps$2({ + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "key": "tabs-window" + }, scopeId), { + default: () => [items.value.map(item => slots.item?.({ + item + }) ?? _createVNode$7(VTabsWindowItem, { + "value": item.value + }, { + default: () => slots[`item.${item.value}`]?.({ + item + }) + })), slots.window?.()] + })]); + }); + return {}; + } +}); + +const {vModelText:_vModelText,withDirectives:_withDirectives,mergeProps:_mergeProps$1,resolveDirective:_resolveDirective$3,createVNode:_createVNode$6,Fragment:_Fragment} = await importShared('vue'); +const {computed: computed$2,nextTick,onBeforeUnmount,onMounted,ref: ref$2,shallowRef: shallowRef$1,watch: watch$1,watchEffect} = await importShared('vue'); +const makeVTextareaProps = propsFactory({ + autoGrow: Boolean, + autofocus: Boolean, + counter: [Boolean, Number, String], + counterValue: Function, + prefix: String, + placeholder: String, + persistentPlaceholder: Boolean, + persistentCounter: Boolean, + noResize: Boolean, + rows: { + type: [Number, String], + default: 5, + validator: v => !isNaN(parseFloat(v)) + }, + maxRows: { + type: [Number, String], + validator: v => !isNaN(parseFloat(v)) + }, + suffix: String, + modelModifiers: Object, + ...makeVInputProps(), + ...makeVFieldProps() +}, 'VTextarea'); +const VTextarea = genericComponent()({ + name: 'VTextarea', + directives: { + Intersect + }, + inheritAttrs: false, + props: makeVTextareaProps(), + emits: { + 'click:control': e => true, + 'mousedown:control': e => true, + 'update:focused': focused => true, + 'update:modelValue': val => true + }, + setup(props, _ref) { + let { + attrs, + emit, + slots + } = _ref; + const model = useProxiedModel(props, 'modelValue'); + const { + isFocused, + focus, + blur + } = useFocus(props); + const counterValue = computed$2(() => { + return typeof props.counterValue === 'function' ? props.counterValue(model.value) : (model.value || '').toString().length; + }); + const max = computed$2(() => { + if (attrs.maxlength) return attrs.maxlength; + if (!props.counter || typeof props.counter !== 'number' && typeof props.counter !== 'string') return undefined; + return props.counter; + }); + function onIntersect(isIntersecting, entries) { + if (!props.autofocus || !isIntersecting) return; + entries[0].target?.focus?.(); + } + const vInputRef = ref$2(); + const vFieldRef = ref$2(); + const controlHeight = shallowRef$1(''); + const textareaRef = ref$2(); + const isActive = computed$2(() => props.persistentPlaceholder || isFocused.value || props.active); + function onFocus() { + if (textareaRef.value !== document.activeElement) { + textareaRef.value?.focus(); + } + if (!isFocused.value) focus(); + } + function onControlClick(e) { + onFocus(); + emit('click:control', e); + } + function onControlMousedown(e) { + emit('mousedown:control', e); + } + function onClear(e) { + e.stopPropagation(); + onFocus(); + nextTick(() => { + model.value = ''; + callEvent(props['onClick:clear'], e); + }); + } + function onInput(e) { + const el = e.target; + model.value = el.value; + if (props.modelModifiers?.trim) { + const caretPosition = [el.selectionStart, el.selectionEnd]; + nextTick(() => { + el.selectionStart = caretPosition[0]; + el.selectionEnd = caretPosition[1]; + }); + } + } + const sizerRef = ref$2(); + const rows = ref$2(+props.rows); + const isPlainOrUnderlined = computed$2(() => ['plain', 'underlined'].includes(props.variant)); + watchEffect(() => { + if (!props.autoGrow) rows.value = +props.rows; + }); + function calculateInputHeight() { + if (!props.autoGrow) return; + nextTick(() => { + if (!sizerRef.value || !vFieldRef.value) return; + const style = getComputedStyle(sizerRef.value); + const fieldStyle = getComputedStyle(vFieldRef.value.$el); + const padding = parseFloat(style.getPropertyValue('--v-field-padding-top')) + parseFloat(style.getPropertyValue('--v-input-padding-top')) + parseFloat(style.getPropertyValue('--v-field-padding-bottom')); + const height = sizerRef.value.scrollHeight; + const lineHeight = parseFloat(style.lineHeight); + const minHeight = Math.max(parseFloat(props.rows) * lineHeight + padding, parseFloat(fieldStyle.getPropertyValue('--v-input-control-height'))); + const maxHeight = parseFloat(props.maxRows) * lineHeight + padding || Infinity; + const newHeight = clamp(height ?? 0, minHeight, maxHeight); + rows.value = Math.floor((newHeight - padding) / lineHeight); + controlHeight.value = convertToUnit(newHeight); + }); + } + onMounted(calculateInputHeight); + watch$1(model, calculateInputHeight); + watch$1(() => props.rows, calculateInputHeight); + watch$1(() => props.maxRows, calculateInputHeight); + watch$1(() => props.density, calculateInputHeight); + let observer; + watch$1(sizerRef, val => { + if (val) { + observer = new ResizeObserver(calculateInputHeight); + observer.observe(sizerRef.value); + } else { + observer?.disconnect(); + } + }); + onBeforeUnmount(() => { + observer?.disconnect(); + }); + useRender(() => { + const hasCounter = !!(slots.counter || props.counter || props.counterValue); + const hasDetails = !!(hasCounter || slots.details); + const [rootAttrs, inputAttrs] = filterInputAttrs(attrs); + const { + modelValue: _, + ...inputProps + } = VInput.filterProps(props); + const fieldProps = filterFieldProps(props); + return _createVNode$6(VInput, _mergeProps$1({ + "ref": vInputRef, + "modelValue": model.value, + "onUpdate:modelValue": $event => model.value = $event, + "class": ['v-textarea v-text-field', { + 'v-textarea--prefixed': props.prefix, + 'v-textarea--suffixed': props.suffix, + 'v-text-field--prefixed': props.prefix, + 'v-text-field--suffixed': props.suffix, + 'v-textarea--auto-grow': props.autoGrow, + 'v-textarea--no-resize': props.noResize || props.autoGrow, + 'v-input--plain-underlined': isPlainOrUnderlined.value + }, props.class], + "style": props.style + }, rootAttrs, inputProps, { + "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value, + "focused": isFocused.value + }), { + ...slots, + default: _ref2 => { + let { + id, + isDisabled, + isDirty, + isReadonly, + isValid + } = _ref2; + return _createVNode$6(VField, _mergeProps$1({ + "ref": vFieldRef, + "style": { + '--v-textarea-control-height': controlHeight.value + }, + "onClick": onControlClick, + "onMousedown": onControlMousedown, + "onClick:clear": onClear, + "onClick:prependInner": props['onClick:prependInner'], + "onClick:appendInner": props['onClick:appendInner'] + }, fieldProps, { + "id": id.value, + "active": isActive.value || isDirty.value, + "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value, + "dirty": isDirty.value || props.dirty, + "disabled": isDisabled.value, + "focused": isFocused.value, + "error": isValid.value === false + }), { + ...slots, + default: _ref3 => { + let { + props: { + class: fieldClass, + ...slotProps + } + } = _ref3; + return _createVNode$6(_Fragment, null, [props.prefix && _createVNode$6("span", { + "class": "v-text-field__prefix" + }, [props.prefix]), _withDirectives(_createVNode$6("textarea", _mergeProps$1({ + "ref": textareaRef, + "class": fieldClass, + "value": model.value, + "onInput": onInput, + "autofocus": props.autofocus, + "readonly": isReadonly.value, + "disabled": isDisabled.value, + "placeholder": props.placeholder, + "rows": props.rows, + "name": props.name, + "onFocus": onFocus, + "onBlur": blur + }, slotProps, inputAttrs), null), [[_resolveDirective$3("intersect"), { + handler: onIntersect + }, null, { + once: true + }]]), props.autoGrow && _withDirectives(_createVNode$6("textarea", { + "class": [fieldClass, 'v-textarea__sizer'], + "id": `${slotProps.id}-sizer`, + "onUpdate:modelValue": $event => model.value = $event, + "ref": sizerRef, + "readonly": true, + "aria-hidden": "true" + }, null), [[_vModelText, model.value]]), props.suffix && _createVNode$6("span", { + "class": "v-text-field__suffix" + }, [props.suffix])]); + } + }); + }, + details: hasDetails ? slotProps => _createVNode$6(_Fragment, null, [slots.details?.(slotProps), hasCounter && _createVNode$6(_Fragment, null, [_createVNode$6("span", null, null), _createVNode$6(VCounter, { + "active": props.persistentCounter || isFocused.value, + "value": counterValue.value, + "max": max.value, + "disabled": props.disabled + }, slots.counter)])]) : undefined + }); + }); + return forwardRefs({}, vInputRef, vFieldRef, textareaRef); + } +}); + +const {createVNode:_createVNode$5} = await importShared('vue'); +const makeVThemeProviderProps = propsFactory({ + withBackground: Boolean, + ...makeComponentProps(), + ...makeThemeProps(), + ...makeTagProps() +}, 'VThemeProvider'); +const VThemeProvider = genericComponent()({ + name: 'VThemeProvider', + props: makeVThemeProviderProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + return () => { + if (!props.withBackground) return slots.default?.(); + return _createVNode$5(props.tag, { + "class": ['v-theme-provider', themeClasses.value, props.class], + "style": props.style + }, { + default: () => [slots.default?.()] + }); + }; + } +}); + +const {resolveDirective:_resolveDirective$2,createVNode:_createVNode$4} = await importShared('vue'); +const {toRef: toRef$2} = await importShared('vue'); +const makeVTimelineDividerProps = propsFactory({ + dotColor: String, + fillDot: Boolean, + hideDot: Boolean, + icon: IconValue, + iconColor: String, + lineColor: String, + ...makeComponentProps(), + ...makeRoundedProps(), + ...makeSizeProps(), + ...makeElevationProps() +}, 'VTimelineDivider'); +const VTimelineDivider = genericComponent()({ + name: 'VTimelineDivider', + props: makeVTimelineDividerProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + sizeClasses, + sizeStyles + } = useSize(props, 'v-timeline-divider__dot'); + const { + backgroundColorStyles, + backgroundColorClasses + } = useBackgroundColor(toRef$2(props, 'dotColor')); + const { + roundedClasses + } = useRounded(props, 'v-timeline-divider__dot'); + const { + elevationClasses + } = useElevation(props); + const { + backgroundColorClasses: lineColorClasses, + backgroundColorStyles: lineColorStyles + } = useBackgroundColor(toRef$2(props, 'lineColor')); + useRender(() => _createVNode$4("div", { + "class": ['v-timeline-divider', { + 'v-timeline-divider--fill-dot': props.fillDot + }, props.class], + "style": props.style + }, [_createVNode$4("div", { + "class": ['v-timeline-divider__before', lineColorClasses.value], + "style": lineColorStyles.value + }, null), !props.hideDot && _createVNode$4("div", { + "key": "dot", + "class": ['v-timeline-divider__dot', elevationClasses.value, roundedClasses.value, sizeClasses.value], + "style": sizeStyles.value + }, [_createVNode$4("div", { + "class": ['v-timeline-divider__inner-dot', backgroundColorClasses.value, roundedClasses.value], + "style": backgroundColorStyles.value + }, [!slots.default ? _createVNode$4(VIcon, { + "key": "icon", + "color": props.iconColor, + "icon": props.icon, + "size": props.size + }, null) : _createVNode$4(VDefaultsProvider, { + "key": "icon-defaults", + "disabled": !props.icon, + "defaults": { + VIcon: { + color: props.iconColor, + icon: props.icon, + size: props.size + } + } + }, slots.default)])]), _createVNode$4("div", { + "class": ['v-timeline-divider__after', lineColorClasses.value], + "style": lineColorStyles.value + }, null)])); + return {}; + } +}); + +const {resolveDirective:_resolveDirective$1,createVNode:_createVNode$3} = await importShared('vue'); +const {ref: ref$1,shallowRef,watch} = await importShared('vue'); +// Types +const makeVTimelineItemProps = propsFactory({ + density: String, + dotColor: String, + fillDot: Boolean, + hideDot: Boolean, + hideOpposite: { + type: Boolean, + default: undefined + }, + icon: IconValue, + iconColor: String, + lineInset: [Number, String], + ...makeComponentProps(), + ...makeDimensionProps(), + ...makeElevationProps(), + ...makeRoundedProps(), + ...makeSizeProps(), + ...makeTagProps() +}, 'VTimelineItem'); +const VTimelineItem = genericComponent()({ + name: 'VTimelineItem', + props: makeVTimelineItemProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + dimensionStyles + } = useDimension(props); + const dotSize = shallowRef(0); + const dotRef = ref$1(); + watch(dotRef, newValue => { + if (!newValue) return; + dotSize.value = newValue.$el.querySelector('.v-timeline-divider__dot')?.getBoundingClientRect().width ?? 0; + }, { + flush: 'post' + }); + useRender(() => _createVNode$3("div", { + "class": ['v-timeline-item', { + 'v-timeline-item--fill-dot': props.fillDot + }, props.class], + "style": [{ + '--v-timeline-dot-size': convertToUnit(dotSize.value), + '--v-timeline-line-inset': props.lineInset ? `calc(var(--v-timeline-dot-size) / 2 + ${convertToUnit(props.lineInset)})` : convertToUnit(0) + }, props.style] + }, [_createVNode$3("div", { + "class": "v-timeline-item__body", + "style": dimensionStyles.value + }, [slots.default?.()]), _createVNode$3(VTimelineDivider, { + "ref": dotRef, + "hideDot": props.hideDot, + "icon": props.icon, + "iconColor": props.iconColor, + "size": props.size, + "elevation": props.elevation, + "dotColor": props.dotColor, + "fillDot": props.fillDot, + "rounded": props.rounded + }, { + default: slots.icon + }), props.density !== 'compact' && _createVNode$3("div", { + "class": "v-timeline-item__opposite" + }, [!props.hideOpposite && slots.opposite?.()])])); + return {}; + } +}); + +const {createVNode:_createVNode$2,resolveDirective:_resolveDirective} = await importShared('vue'); +const {computed: computed$1,toRef: toRef$1} = await importShared('vue'); +const makeVTimelineProps = propsFactory({ + align: { + type: String, + default: 'center', + validator: v => ['center', 'start'].includes(v) + }, + direction: { + type: String, + default: 'vertical', + validator: v => ['vertical', 'horizontal'].includes(v) + }, + justify: { + type: String, + default: 'auto', + validator: v => ['auto', 'center'].includes(v) + }, + side: { + type: String, + validator: v => v == null || ['start', 'end'].includes(v) + }, + lineThickness: { + type: [String, Number], + default: 2 + }, + lineColor: String, + truncateLine: { + type: String, + validator: v => ['start', 'end', 'both'].includes(v) + }, + ...only(makeVTimelineItemProps({ + lineInset: 0 + }), ['dotColor', 'fillDot', 'hideOpposite', 'iconColor', 'lineInset', 'size']), + ...makeComponentProps(), + ...makeDensityProps(), + ...makeTagProps(), + ...makeThemeProps() +}, 'VTimeline'); +const VTimeline = genericComponent()({ + name: 'VTimeline', + props: makeVTimelineProps(), + setup(props, _ref) { + let { + slots + } = _ref; + const { + themeClasses + } = provideTheme(props); + const { + densityClasses + } = useDensity(props); + const { + rtlClasses + } = useRtl(); + provideDefaults({ + VTimelineDivider: { + lineColor: toRef$1(props, 'lineColor') + }, + VTimelineItem: { + density: toRef$1(props, 'density'), + dotColor: toRef$1(props, 'dotColor'), + fillDot: toRef$1(props, 'fillDot'), + hideOpposite: toRef$1(props, 'hideOpposite'), + iconColor: toRef$1(props, 'iconColor'), + lineColor: toRef$1(props, 'lineColor'), + lineInset: toRef$1(props, 'lineInset'), + size: toRef$1(props, 'size') + } + }); + const sideClasses = computed$1(() => { + const side = props.side ? props.side : props.density !== 'default' ? 'end' : null; + return side && `v-timeline--side-${side}`; + }); + const truncateClasses = computed$1(() => { + const classes = ['v-timeline--truncate-line-start', 'v-timeline--truncate-line-end']; + switch (props.truncateLine) { + case 'both': + return classes; + case 'start': + return classes[0]; + case 'end': + return classes[1]; + default: + return null; + } + }); + useRender(() => _createVNode$2(props.tag, { + "class": ['v-timeline', `v-timeline--${props.direction}`, `v-timeline--align-${props.align}`, `v-timeline--justify-${props.justify}`, truncateClasses.value, { + 'v-timeline--inset-line': !!props.lineInset + }, themeClasses.value, densityClasses.value, sideClasses.value, rtlClasses.value, props.class], + "style": [{ + '--v-timeline-line-thickness': convertToUnit(props.lineThickness) + }, props.style] + }, slots)); + return {}; + } +}); + +const {createVNode:_createVNode$1} = await importShared('vue'); +const {toRef} = await importShared('vue'); +const makeVToolbarItemsProps = propsFactory({ + ...makeComponentProps(), + ...makeVariantProps({ + variant: 'text' + }) +}, 'VToolbarItems'); +const VToolbarItems = genericComponent()({ + name: 'VToolbarItems', + props: makeVToolbarItemsProps(), + setup(props, _ref) { + let { + slots + } = _ref; + provideDefaults({ + VBtn: { + color: toRef(props, 'color'), + height: 'inherit', + variant: toRef(props, 'variant') + } + }); + useRender(() => _createVNode$1("div", { + "class": ['v-toolbar-items', props.class], + "style": props.style + }, [slots.default?.()])); + return {}; + } +}); + +const {createVNode:_createVNode,mergeProps:_mergeProps} = await importShared('vue'); +const {computed,mergeProps: mergeProps$1,ref} = await importShared('vue'); +const makeVTooltipProps = propsFactory({ + id: String, + text: String, + ...omit(makeVOverlayProps({ + closeOnBack: false, + location: 'end', + locationStrategy: 'connected', + eager: true, + minWidth: 0, + offset: 10, + openOnClick: false, + openOnHover: true, + origin: 'auto', + scrim: false, + scrollStrategy: 'reposition', + transition: false + }), ['absolute', 'persistent']) +}, 'VTooltip'); +const VTooltip = genericComponent()({ + name: 'VTooltip', + props: makeVTooltipProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const isActive = useProxiedModel(props, 'modelValue'); + const { + scopeId + } = useScopeId(); + const uid = getUid(); + const id = computed(() => props.id || `v-tooltip-${uid}`); + const overlay = ref(); + const location = computed(() => { + return props.location.split(' ').length > 1 ? props.location : props.location + ' center'; + }); + const origin = computed(() => { + return props.origin === 'auto' || props.origin === 'overlap' || props.origin.split(' ').length > 1 || props.location.split(' ').length > 1 ? props.origin : props.origin + ' center'; + }); + const transition = computed(() => { + if (props.transition) return props.transition; + return isActive.value ? 'scale-transition' : 'fade-transition'; + }); + const activatorProps = computed(() => mergeProps$1({ + 'aria-describedby': id.value + }, props.activatorProps)); + useRender(() => { + const overlayProps = VOverlay.filterProps(props); + return _createVNode(VOverlay, _mergeProps({ + "ref": overlay, + "class": ['v-tooltip', props.class], + "style": props.style, + "id": id.value + }, overlayProps, { + "modelValue": isActive.value, + "onUpdate:modelValue": $event => isActive.value = $event, + "transition": transition.value, + "absolute": true, + "location": location.value, + "origin": origin.value, + "persistent": true, + "role": "tooltip", + "activatorProps": activatorProps.value, + "_disableGlobalStack": true + }, scopeId), { + activator: slots.activator, + default: function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return slots.default?.(...args) ?? props.text; + } + }); + }); + return forwardRefs({}, overlay); + } +}); + +// Composables +const VValidation = genericComponent()({ + name: 'VValidation', + props: makeValidationProps(), + emits: { + 'update:modelValue': value => true + }, + setup(props, _ref) { + let { + slots + } = _ref; + const validation = useValidation(props, 'validation'); + return () => slots.default?.(validation); + } +}); + +const components = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ + __proto__: null, + VAlert, + VAlertTitle, + VApp, + VAppBar, + VAppBarNavIcon, + VAppBarTitle, + VAutocomplete, + VAvatar, + VBadge, + VBanner, + VBannerActions, + VBannerText, + VBottomNavigation, + VBottomSheet, + VBreadcrumbs, + VBreadcrumbsDivider, + VBreadcrumbsItem, + VBtn, + VBtnGroup, + VBtnToggle, + VCard, + VCardActions, + VCardItem, + VCardSubtitle, + VCardText, + VCardTitle, + VCarousel, + VCarouselItem, + VCheckbox, + VCheckboxBtn, + VChip, + VChipGroup, + VClassIcon, + VCode, + VCol, + VColorPicker, + VCombobox, + VComponentIcon, + VConfirmEdit, + VContainer, + VCounter, + VDataIterator, + VDataTable, + VDataTableFooter, + VDataTableHeaders, + VDataTableRow, + VDataTableRows, + VDataTableServer, + VDataTableVirtual, + VDatePicker, + VDatePickerControls, + VDatePickerHeader, + VDatePickerMonth, + VDatePickerMonths, + VDatePickerYears, + VDefaultsProvider, + VDialog, + VDialogBottomTransition, + VDialogTopTransition, + VDialogTransition, + VDivider, + VEmptyState, + VExpandTransition, + VExpandXTransition, + VExpansionPanel, + VExpansionPanelText, + VExpansionPanelTitle, + VExpansionPanels, + VFab, + VFabTransition, + VFadeTransition, + VField, + VFieldLabel, + VFileInput, + VFooter, + VForm, + VHover, + VIcon, + VImg, + VInfiniteScroll, + VInput, + VItem, + VItemGroup, + VKbd, + VLabel, + VLayout, + VLayoutItem, + VLazy, + VLigatureIcon, + VList, + VListGroup, + VListImg, + VListItem, + VListItemAction, + VListItemMedia, + VListItemSubtitle, + VListItemTitle, + VListSubheader, + VLocaleProvider, + VMain, + VMenu, + VMessages, + VNavigationDrawer, + VNoSsr, + VOtpInput, + VOverlay, + VPagination, + VParallax, + VProgressCircular, + VProgressLinear, + VRadio, + VRadioGroup, + VRangeSlider, + VRating, + VResponsive, + VRow, + VScaleTransition, + VScrollXReverseTransition, + VScrollXTransition, + VScrollYReverseTransition, + VScrollYTransition, + VSelect, + VSelectionControl, + VSelectionControlGroup, + VSheet, + VSkeletonLoader, + VSlideGroup, + VSlideGroupItem, + VSlideXReverseTransition, + VSlideXTransition, + VSlideYReverseTransition, + VSlideYTransition, + VSlider, + VSnackbar, + VSpacer, + VSparkline, + VSpeedDial, + VStepper, + VStepperActions, + VStepperHeader, + VStepperItem, + VStepperWindow, + VStepperWindowItem, + VSvgIcon, + VSwitch, + VSystemBar, + VTab, + VTable, + VTabs, + VTabsWindow, + VTabsWindowItem, + VTextField, + VTextarea, + VThemeProvider, + VTimeline, + VTimelineItem, + VToolbar, + VToolbarItems, + VToolbarTitle, + VTooltip, + VValidation, + VVirtualScroll, + VWindow, + VWindowItem +}, Symbol.toStringTag, { value: 'Module' })); + +// Types + +function mounted$2(el, binding) { + const modifiers = binding.modifiers || {}; + const value = binding.value; + const { + once, + immediate, + ...modifierKeys + } = modifiers; + const defaultValue = !Object.keys(modifierKeys).length; + const { + handler, + options + } = typeof value === 'object' ? value : { + handler: value, + options: { + attributes: modifierKeys?.attr ?? defaultValue, + characterData: modifierKeys?.char ?? defaultValue, + childList: modifierKeys?.child ?? defaultValue, + subtree: modifierKeys?.sub ?? defaultValue + } + }; + const observer = new MutationObserver(function () { + let mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let observer = arguments.length > 1 ? arguments[1] : undefined; + handler?.(mutations, observer); + if (once) unmounted$2(el, binding); + }); + if (immediate) handler?.([], observer); + el._mutate = Object(el._mutate); + el._mutate[binding.instance.$.uid] = { + observer + }; + observer.observe(el, options); +} +function unmounted$2(el, binding) { + if (!el._mutate?.[binding.instance.$.uid]) return; + el._mutate[binding.instance.$.uid].observer.disconnect(); + delete el._mutate[binding.instance.$.uid]; +} +const Mutate = { + mounted: mounted$2, + unmounted: unmounted$2 +}; + +// Types + +function mounted$1(el, binding) { + const handler = binding.value; + const options = { + passive: !binding.modifiers?.active + }; + window.addEventListener('resize', handler, options); + el._onResize = Object(el._onResize); + el._onResize[binding.instance.$.uid] = { + handler, + options + }; + if (!binding.modifiers?.quiet) { + handler(); + } +} +function unmounted$1(el, binding) { + if (!el._onResize?.[binding.instance.$.uid]) return; + const { + handler, + options + } = el._onResize[binding.instance.$.uid]; + window.removeEventListener('resize', handler, options); + delete el._onResize[binding.instance.$.uid]; +} +const Resize = { + mounted: mounted$1, + unmounted: unmounted$1 +}; + +// Types + +function mounted(el, binding) { + const { + self = false + } = binding.modifiers ?? {}; + const value = binding.value; + const options = typeof value === 'object' && value.options || { + passive: true + }; + const handler = typeof value === 'function' || 'handleEvent' in value ? value : value.handler; + const target = self ? el : binding.arg ? document.querySelector(binding.arg) : window; + if (!target) return; + target.addEventListener('scroll', handler, options); + el._onScroll = Object(el._onScroll); + el._onScroll[binding.instance.$.uid] = { + handler, + options, + // Don't reference self + target: self ? undefined : target + }; +} +function unmounted(el, binding) { + if (!el._onScroll?.[binding.instance.$.uid]) return; + const { + handler, + options, + target = el + } = el._onScroll[binding.instance.$.uid]; + target.removeEventListener('scroll', handler, options); + delete el._onScroll[binding.instance.$.uid]; +} +function updated(el, binding) { + if (binding.value === binding.oldValue) return; + unmounted(el, binding); + mounted(el, binding); +} +const Scroll = { + mounted, + unmounted, + updated +}; + +// Utilities +const {h,mergeProps,render,resolveComponent} = await importShared('vue'); +function useDirectiveComponent(component, props) { + const concreteComponent = typeof component === 'string' ? resolveComponent(component) : component; + const hook = mountComponent(concreteComponent, props); + return { + mounted: hook, + updated: hook, + unmounted(el) { + render(null, el); + } + }; +} +function mountComponent(component, props) { + return function (el, binding, vnode) { + const _props = typeof props === 'function' ? props(binding) : props; + const text = binding.value?.text ?? binding.value ?? _props?.text; + const value = isObject(binding.value) ? binding.value : {}; + + // Get the children from the props or directive value, or the element's children + const children = () => text ?? el.textContent; + + // If vnode.ctx is the same as the instance, then we're bound to a plain element + // and need to find the nearest parent component instance to inherit provides from + const provides = (vnode.ctx === binding.instance.$ ? findComponentParent(vnode, binding.instance.$)?.provides : vnode.ctx?.provides) ?? binding.instance.$.provides; + const node = h(component, mergeProps(_props, value), children); + node.appContext = Object.assign(Object.create(null), binding.instance.$.appContext, { + provides + }); + render(node, el); + }; +} +function findComponentParent(vnode, root) { + // Walk the tree from root until we find the child vnode + const stack = new Set(); + const walk = children => { + for (const child of children) { + if (!child) continue; + if (child === vnode || child.el && vnode.el && child.el === vnode.el) { + return true; + } + stack.add(child); + let result; + if (child.suspense) { + result = walk([child.ssContent]); + } else if (Array.isArray(child.children)) { + result = walk(child.children); + } else if (child.component?.vnode) { + result = walk([child.component?.subTree]); + } + if (result) { + return result; + } + stack.delete(child); + } + return false; + }; + if (!walk([root.subTree])) { + consoleError('Could not find original vnode, component will not inherit provides'); + return root; + } + + // Return the first component parent + const result = Array.from(stack).reverse(); + for (const child of result) { + if (child.component) { + return child.component; + } + } + return root; +} + +// Components +const Tooltip = useDirectiveComponent(VTooltip, binding => { + return { + activator: 'parent', + location: binding.arg?.replace('-', ' '), + text: typeof binding.value === 'boolean' ? undefined : binding.value + }; +}); + +const directives = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ + __proto__: null, + ClickOutside, + Intersect, + Mutate, + Resize, + Ripple, + Scroll, + Tooltip, + Touch +}, Symbol.toStringTag, { value: 'Module' })); + +const defaults = { + IconBtn: { + icon: true, + color: "default", + variant: "text", + VIcon: { + size: 24 + } + }, + VAlert: { + VBtn: { + color: void 0 + } + }, + VAvatar: { + // ℹ️ Remove after next release + variant: "flat", + VIcon: { + size: 24 + } + }, + VBadge: { + // set v-badge default color to primary + color: "primary" + }, + VBtn: { + // set v-btn default color to primary + color: "primary", + elevation: 0 + }, + VCard: { + elevation: 0, + rounded: "lg" + }, + VMenu: { + elevation: 0 + }, + VChip: { + elevation: 0 + }, + VBottomSheet: { + elevation: 0 + }, + VDialog: { + elevation: 0, + rounded: "lg" + }, + VExpansionPanels: { + elevation: 0 + }, + VList: { + color: "primary", + elevation: 0 + }, + VListItem: { + rounded: "md" + }, + VPagination: { + activeColor: "primary" + }, + VTabs: { + // set v-tabs default color to primary + color: "primary", + VSlideGroup: { + showArrows: true + } + }, + VTooltip: { + // set v-tooltip default location to top + location: "top" + }, + VCheckboxBtn: { + color: "primary", + hideDetails: "auto" + }, + VCheckbox: { + // set v-checkbox default color to primary + color: "primary", + hideDetails: "auto" + }, + VRadioGroup: { + color: "primary", + hideDetails: "auto" + }, + VRadio: { + color: "primary", + hideDetails: "auto" + }, + VSelect: { + variant: "outlined", + color: "primary", + hideDetails: "auto", + menuProps: { elevation: 0 } + }, + VRangeSlider: { + // set v-range-slider default color to primary + color: "primary", + density: "comfortable", + thumbLabel: true, + hideDetails: "auto" + }, + VRating: { + // set v-rating default color to primary + color: "rgba(var(--v-theme-on-background),0.23)", + activeColor: "warning", + halfIncrements: true + }, + VProgressCircular: { + // set v-progress-circular default color to primary + color: "primary" + }, + VSlider: { + // set v-slider default color to primary + color: "primary", + hideDetails: "auto" + }, + VTextField: { + variant: "outlined", + color: "primary", + hideDetails: "auto" + }, + VAutocomplete: { + variant: "outlined", + color: "primary", + hideDetails: "auto" + }, + VCombobox: { + variant: "outlined", + color: "primary", + hideDetails: "auto", + menuProps: { elevation: 0 } + }, + VFileInput: { + variant: "outlined", + color: "primary", + hideDetails: "auto" + }, + VTextarea: { + variant: "outlined", + color: "primary", + hideDetails: "auto" + }, + VSwitch: { + // set v-switch default color to primary + color: "primary", + hideDetails: "auto" + } +}; + +const theme = { + defaultTheme: "light", + themes: { + light: { + dark: false, + colors: { + "primary": "#9155FD", + "secondary": "#8A8D93", + "on-secondary": "#FFFFFF", + "success": "#56CA00", + "info": "#16B1FF", + "warning": "#FFB400", + "error": "#FF4C51", + "on-primary": "#FFFFFF", + "on-success": "#FFFFFF", + "on-warning": "#FFFFFF", + "background": "#F4F5FA", + "on-background": "#3A3541", + "on-surface": "#3A3541", + "grey-50": "#FAFAFA", + "grey-100": "#F0F2F8", + "grey-200": "#EEEEEE", + "grey-300": "#E0E0E0", + "grey-400": "#BDBDBD", + "grey-500": "#9E9E9E", + "grey-600": "#757575", + "grey-700": "#616161", + "grey-800": "#424242", + "grey-900": "#212121", + "perfect-scrollbar-thumb": "#DBDADE", + "skin-bordered-background": "#FFFFFF", + "skin-bordered-surface": "#FFFFFF" + }, + variables: { + "code-color": "#D400FF", + "overlay-scrim-background": "#3A3541", + "overlay-scrim-opacity": 0.5, + "hover-opacity": 0.04, + "focus-opacity": 0.1, + "selected-opacity": 0.12, + "activated-opacity": 0.1, + "pressed-opacity": 0.14, + "dragged-opacity": 0.1, + "border-color": "#3A3541", + "table-header-background": "#F9FAFC", + "custom-background": "#F9F8F9", + // Shadows + "shadow-key-umbra-opacity": "rgba(var(--v-theme-on-surface), 0.08)", + "shadow-key-penumbra-opacity": "rgba(var(--v-theme-on-surface), 0.12)", + "shadow-key-ambient-opacity": "rgba(var(--v-theme-on-surface), 0.04)" + } + }, + dark: { + dark: true, + colors: { + "primary": "#6E66ED", + "secondary": "#8A8D93", + "on-secondary": "#FFFFFF", + "success": "#56CA00", + "info": "#16B1FF", + "warning": "#FFB400", + "error": "#FF4C51", + "on-primary": "#FFFFFF", + "on-success": "#FFFFFF", + "on-warning": "#FFFFFF", + "background": "#0E1116", + "on-background": "#E7E3FC", + "surface": "#14161F", + "on-surface": "#E7E3FC", + "grey-50": "#2A2E42", + "grey-100": "#474360", + "grey-200": "#4A5072", + "grey-300": "#5E6692", + "grey-400": "#7983BB", + "grey-500": "#8692D0", + "grey-600": "#AAB3DE", + "grey-700": "#B6BEE3", + "grey-800": "#CFD3EC", + "grey-900": "#E7E9F6", + "perfect-scrollbar-thumb": "#4A5072", + "skin-bordered-background": "#312d4b", + "skin-bordered-surface": "#312d4b" + }, + variables: { + "code-color": "#d400ff", + "overlay-scrim-background": "#191D21", + "overlay-scrim-opacity": 0.6, + "hover-opacity": 0.04, + "focus-opacity": 0.1, + "selected-opacity": 0.12, + "activated-opacity": 0.1, + "pressed-opacity": 0.14, + "dragged-opacity": 0.1, + "border-color": "#E7E3FC", + "table-header-background": "#14161F", + "custom-background": "#373452", + // Shadows + "shadow-key-umbra-opacity": "rgba(20, 18, 33, 0.08)", + "shadow-key-penumbra-opacity": "rgba(20, 18, 33, 0.12)", + "shadow-key-ambient-opacity": "rgba(20, 18, 33, 0.04)" + } + }, + purple: { + dark: true, + colors: { + "primary": "#9155FD", + "secondary": "#8A8D93", + "on-secondary": "#FFFFFF", + "success": "#56CA00", + "info": "#16B1FF", + "warning": "#FFB400", + "error": "#FF4C51", + "on-primary": "#FFFFFF", + "on-success": "#FFFFFF", + "on-warning": "#FFFFFF", + "background": "#28243D", + "on-background": "#E7E3FC", + "surface": "#312D4B", + "on-surface": "#E7E3FC", + "grey-50": "#2A2E42", + "grey-100": "#474360", + "grey-200": "#4A5072", + "grey-300": "#5E6692", + "grey-400": "#7983BB", + "grey-500": "#8692D0", + "grey-600": "#AAB3DE", + "grey-700": "#B6BEE3", + "grey-800": "#CFD3EC", + "grey-900": "#E7E9F6", + "perfect-scrollbar-thumb": "#4A5072", + "skin-bordered-background": "#312d4b", + "skin-bordered-surface": "#312d4b" + }, + variables: { + "code-color": "#d400ff", + "overlay-scrim-background": "#2C2942", + "overlay-scrim-opacity": 0.6, + "hover-opacity": 0.04, + "focus-opacity": 0.1, + "selected-opacity": 0.12, + "activated-opacity": 0.1, + "pressed-opacity": 0.14, + "dragged-opacity": 0.1, + "border-color": "#E7E3FC", + "table-header-background": "#3D3759", + "custom-background": "#373452", + // Shadows + "shadow-key-umbra-opacity": "rgba(20, 18, 33, 0.08)", + "shadow-key-penumbra-opacity": "rgba(20, 18, 33, 0.12)", + "shadow-key-ambient-opacity": "rgba(20, 18, 33, 0.04)" + } + }, + transparent: { + dark: true, + colors: { + "primary": "#A370F7", + "secondary": "#8A8D93", + "on-secondary": "#FFFFFF", + "success": "#66BB6A", + "info": "#42A5F5", + "warning": "#FFA726", + "error": "#EF5350", + "on-primary": "#FFFFFF", + "on-success": "#FFFFFF", + "on-warning": "#FFFFFF", + "background": "#000000", + "on-background": "#E7E3FC", + "surface": "rgba(30, 30, 30, 0.3)", + "on-surface": "#E7E3FC", + "surface-variant": "rgba(30, 30, 30, 0.2)", + "on-surface-variant": "rgba(255, 255, 255, 0.65)", + "grey-50": "rgba(42, 46, 66, 0.15)", + "grey-100": "rgba(71, 67, 96, 0.15)", + "grey-200": "rgba(74, 80, 114, 0.15)", + "grey-300": "rgba(94, 102, 146, 0.15)", + "grey-400": "rgba(121, 131, 187, 0.15)", + "grey-500": "rgba(134, 146, 208, 0.15)", + "grey-600": "rgba(170, 179, 222, 0.15)", + "grey-700": "rgba(182, 190, 227, 0.15)", + "grey-800": "rgba(207, 211, 236, 0.15)", + "grey-900": "rgba(231, 233, 246, 0.15)", + "perfect-scrollbar-thumb": "rgba(158, 158, 190, 0.4)", + "skin-bordered-background": "rgba(30, 30, 30, 0.3)", + "skin-bordered-surface": "rgba(30, 30, 30, 0.3)", + "card-background": "rgba(30, 30, 30, 0.3)" + }, + variables: { + "code-color": "#6D9EEB", + "overlay-scrim-background": "0, 0, 0", + "overlay-scrim-opacity": 0.7, + "hover-opacity": 0.1, + "focus-opacity": 0.15, + "selected-opacity": 0.2, + "activated-opacity": 0.15, + "pressed-opacity": 0.2, + "dragged-opacity": 0.15, + "border-color": "#E7E3FC", + "table-header-background": "rgba(30, 30, 30, 0.3)", + "custom-background": "rgba(30, 30, 30, 0.3)", + "card-background": "rgba(30, 30, 30, 0.3)", + // Shadows + "shadow-key-umbra-opacity": "rgba(0, 0, 0, 0.07)", + "shadow-key-penumbra-opacity": "rgba(0, 0, 0, 0.1)", + "shadow-key-ambient-opacity": "rgba(0, 0, 0, 0.05)" + } + } + } +}; + +const {createApp} = await importShared('vue'); +const {createVuetify} = await importShared('vuetify'); + + +// 创建Vuetify实例 +const vuetify = createVuetify({ + components, + directives, + theme, + defaults +}); + +// 创建应用 +const app = createApp(App); + +// 使用插件 +app.use(vuetify); + +// 挂载应用 +app.mount('#app'); diff --git a/plugins.v2/clashruleprovider/dist/assets/remoteEntry.js b/plugins.v2/clashruleprovider/dist/assets/remoteEntry.js new file mode 100644 index 0000000..015521f --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/remoteEntry.js @@ -0,0 +1,87 @@ +const currentImports = {}; + const exportSet = new Set(['Module', '__esModule', 'default', '_export_sfc']); + let moduleMap = { +"./Page":()=>{ + dynamicLoadingCss(["__federation_expose_Page-Bl7XNZ7k.css"], false, './Page'); + return __federation_import('./__federation_expose_Page-DlQgf7u6.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}, +"./Config":()=>{ + dynamicLoadingCss(["__federation_expose_Config-DXzIavcD.css"], false, './Config'); + return __federation_import('./__federation_expose_Config-C3BpNVeC.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}, +"./Dashboard":()=>{ + dynamicLoadingCss([], false, './Dashboard'); + return __federation_import('./__federation_expose_Dashboard-BkyO-3pr.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)},}; + const seen = {}; + const dynamicLoadingCss = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => { + const metaUrl = import.meta.url; + if (typeof metaUrl === 'undefined') { + console.warn('The remote style takes effect only when the build.target option in the vite.config.ts file is higher than that of "es2020".'); + return; + } + + const curUrl = metaUrl.substring(0, metaUrl.lastIndexOf('remoteEntry.js')); + const base = '/'; + 'assets'; + + cssFilePaths.forEach(cssPath => { + let href = ''; + const baseUrl = base || curUrl; + if (baseUrl) { + const trimmer = { + trailing: (path) => (path.endsWith('/') ? path.slice(0, -1) : path), + leading: (path) => (path.startsWith('/') ? path.slice(1) : path) + }; + const isAbsoluteUrl = (url) => url.startsWith('http') || url.startsWith('//'); + + const cleanBaseUrl = trimmer.trailing(baseUrl); + const cleanCssPath = trimmer.leading(cssPath); + const cleanCurUrl = trimmer.trailing(curUrl); + + if (isAbsoluteUrl(baseUrl)) { + href = [cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); + } else { + if (cleanCurUrl.includes(cleanBaseUrl)) { + href = [cleanCurUrl, cleanCssPath].filter(Boolean).join('/'); + } else { + href = [cleanCurUrl + cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); + } + } + } else { + href = cssPath; + } + + if (dontAppendStylesToHead) { + const key = 'css__ClashRuleProvider__' + exposeItemName; + window[key] = window[key] || []; + window[key].push(href); + return; + } + + if (href in seen) return; + seen[href] = true; + + const element = document.createElement('link'); + element.rel = 'stylesheet'; + element.href = href; + document.head.appendChild(element); + }); + }; + async function __federation_import(name) { + currentImports[name] ??= import(name); + return currentImports[name] + } const get =(module) => { + if(!moduleMap[module]) throw new Error('Can not find remote module ' + module) + return moduleMap[module](); + }; + const init =(shareScope) => { + globalThis.__federation_shared__= globalThis.__federation_shared__|| {}; + Object.entries(shareScope).forEach(([key, value]) => { + for (const [versionKey, versionValue] of Object.entries(value)) { + const scope = versionValue.scope || 'default'; + globalThis.__federation_shared__[scope] = globalThis.__federation_shared__[scope] || {}; + const shared= globalThis.__federation_shared__[scope]; + (shared[key] = shared[key]||{})[versionKey] = versionValue; + } + }); + }; + +export { dynamicLoadingCss, get, init }; diff --git a/plugins.v2/clashruleprovider/dist/assets/runtime-core.esm-bundler-BQhfUSSX.js b/plugins.v2/clashruleprovider/dist/assets/runtime-core.esm-bundler-BQhfUSSX.js new file mode 100644 index 0000000..a81a3cc --- /dev/null +++ b/plugins.v2/clashruleprovider/dist/assets/runtime-core.esm-bundler-BQhfUSSX.js @@ -0,0 +1,8546 @@ +/** +* @vue/shared v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function makeMap(str) { + const map = /* @__PURE__ */ Object.create(null); + for (const key of str.split(",")) map[key] = 1; + return (val) => val in map; +} +const EMPTY_OBJ = {}; +const EMPTY_ARR = []; +const NOOP = () => { +}; +const NO = () => false; +const isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter +(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97); +const isModelListener = (key) => key.startsWith("onUpdate:"); +const extend = Object.assign; +const remove = (arr, el) => { + const i = arr.indexOf(el); + if (i > -1) { + arr.splice(i, 1); + } +}; +const hasOwnProperty$1 = Object.prototype.hasOwnProperty; +const hasOwn = (val, key) => hasOwnProperty$1.call(val, key); +const isArray = Array.isArray; +const isMap = (val) => toTypeString(val) === "[object Map]"; +const isSet = (val) => toTypeString(val) === "[object Set]"; +const isDate = (val) => toTypeString(val) === "[object Date]"; +const isRegExp = (val) => toTypeString(val) === "[object RegExp]"; +const isFunction = (val) => typeof val === "function"; +const isString = (val) => typeof val === "string"; +const isSymbol = (val) => typeof val === "symbol"; +const isObject = (val) => val !== null && typeof val === "object"; +const isPromise = (val) => { + return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch); +}; +const objectToString = Object.prototype.toString; +const toTypeString = (value) => objectToString.call(value); +const toRawType = (value) => { + return toTypeString(value).slice(8, -1); +}; +const isPlainObject = (val) => toTypeString(val) === "[object Object]"; +const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; +const isReservedProp = /* @__PURE__ */ makeMap( + // the leading comma is intentional so empty string "" is also included + ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" +); +const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null); + return (str) => { + const hit = cache[str]; + return hit || (cache[str] = fn(str)); + }; +}; +const camelizeRE = /-(\w)/g; +const camelize = cacheStringFunction( + (str) => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); + } +); +const hyphenateRE = /\B([A-Z])/g; +const hyphenate = cacheStringFunction( + (str) => str.replace(hyphenateRE, "-$1").toLowerCase() +); +const capitalize = cacheStringFunction((str) => { + return str.charAt(0).toUpperCase() + str.slice(1); +}); +const toHandlerKey = cacheStringFunction( + (str) => { + const s = str ? `on${capitalize(str)}` : ``; + return s; + } +); +const hasChanged = (value, oldValue) => !Object.is(value, oldValue); +const invokeArrayFns = (fns, ...arg) => { + for (let i = 0; i < fns.length; i++) { + fns[i](...arg); + } +}; +const def = (obj, key, value, writable = false) => { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: false, + writable, + value + }); +}; +const looseToNumber = (val) => { + const n = parseFloat(val); + return isNaN(n) ? val : n; +}; +const toNumber = (val) => { + const n = isString(val) ? Number(val) : NaN; + return isNaN(n) ? val : n; +}; +let _globalThis; +const getGlobalThis = () => { + return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); +}; +const GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol"; +const isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED); +function normalizeStyle(value) { + if (isArray(value)) { + const res = {}; + for (let i = 0; i < value.length; i++) { + const item = value[i]; + const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item); + if (normalized) { + for (const key in normalized) { + res[key] = normalized[key]; + } + } + } + return res; + } else if (isString(value) || isObject(value)) { + return value; + } +} +const listDelimiterRE = /;(?![^(]*\))/g; +const propertyDelimiterRE = /:([^]+)/; +const styleCommentRE = /\/\*[^]*?\*\//g; +function parseStringStyle(cssText) { + const ret = {}; + cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { + if (item) { + const tmp = item.split(propertyDelimiterRE); + tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); + } + }); + return ret; +} +function normalizeClass(value) { + let res = ""; + if (isString(value)) { + res = value; + } else if (isArray(value)) { + for (let i = 0; i < value.length; i++) { + const normalized = normalizeClass(value[i]); + if (normalized) { + res += normalized + " "; + } + } + } else if (isObject(value)) { + for (const name in value) { + if (value[name]) { + res += name + " "; + } + } + } + return res.trim(); +} +function normalizeProps(props) { + if (!props) return null; + let { class: klass, style } = props; + if (klass && !isString(klass)) { + props.class = normalizeClass(klass); + } + if (style) { + props.style = normalizeStyle(style); + } + return props; +} +const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; +const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs); +function includeBooleanAttr(value) { + return !!value || value === ""; +} +function looseCompareArrays(a, b) { + if (a.length !== b.length) return false; + let equal = true; + for (let i = 0; equal && i < a.length; i++) { + equal = looseEqual(a[i], b[i]); + } + return equal; +} +function looseEqual(a, b) { + if (a === b) return true; + let aValidType = isDate(a); + let bValidType = isDate(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? a.getTime() === b.getTime() : false; + } + aValidType = isSymbol(a); + bValidType = isSymbol(b); + if (aValidType || bValidType) { + return a === b; + } + aValidType = isArray(a); + bValidType = isArray(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? looseCompareArrays(a, b) : false; + } + aValidType = isObject(a); + bValidType = isObject(b); + if (aValidType || bValidType) { + if (!aValidType || !bValidType) { + return false; + } + const aKeysCount = Object.keys(a).length; + const bKeysCount = Object.keys(b).length; + if (aKeysCount !== bKeysCount) { + return false; + } + for (const key in a) { + const aHasKey = a.hasOwnProperty(key); + const bHasKey = b.hasOwnProperty(key); + if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { + return false; + } + } + } + return String(a) === String(b); +} +function looseIndexOf(arr, val) { + return arr.findIndex((item) => looseEqual(item, val)); +} +const isRef$1 = (val) => { + return !!(val && val["__v_isRef"] === true); +}; +const toDisplayString = (val) => { + return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef$1(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val); +}; +const replacer = (_key, val) => { + if (isRef$1(val)) { + return replacer(_key, val.value); + } else if (isMap(val)) { + return { + [`Map(${val.size})`]: [...val.entries()].reduce( + (entries, [key, val2], i) => { + entries[stringifySymbol(key, i) + " =>"] = val2; + return entries; + }, + {} + ) + }; + } else if (isSet(val)) { + return { + [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) + }; + } else if (isSymbol(val)) { + return stringifySymbol(val); + } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { + return String(val); + } + return val; +}; +const stringifySymbol = (v, i = "") => { + var _a; + return ( + // Symbol.description in es2019+ so we need to cast here to pass + // the lib: es2016 check + isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v + ); +}; + +/** +* @vue/reactivity v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +let activeEffectScope; +class EffectScope { + constructor(detached = false) { + this.detached = detached; + this._active = true; + this.effects = []; + this.cleanups = []; + this._isPaused = false; + this.parent = activeEffectScope; + if (!detached && activeEffectScope) { + this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( + this + ) - 1; + } + } + get active() { + return this._active; + } + pause() { + if (this._active) { + this._isPaused = true; + let i, l; + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].pause(); + } + } + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].pause(); + } + } + } + /** + * Resumes the effect scope, including all child scopes and effects. + */ + resume() { + if (this._active) { + if (this._isPaused) { + this._isPaused = false; + let i, l; + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].resume(); + } + } + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].resume(); + } + } + } + } + run(fn) { + if (this._active) { + const currentEffectScope = activeEffectScope; + try { + activeEffectScope = this; + return fn(); + } finally { + activeEffectScope = currentEffectScope; + } + } + } + /** + * This should only be called on non-detached scopes + * @internal + */ + on() { + activeEffectScope = this; + } + /** + * This should only be called on non-detached scopes + * @internal + */ + off() { + activeEffectScope = this.parent; + } + stop(fromParent) { + if (this._active) { + this._active = false; + let i, l; + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].stop(); + } + this.effects.length = 0; + for (i = 0, l = this.cleanups.length; i < l; i++) { + this.cleanups[i](); + } + this.cleanups.length = 0; + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].stop(true); + } + this.scopes.length = 0; + } + if (!this.detached && this.parent && !fromParent) { + const last = this.parent.scopes.pop(); + if (last && last !== this) { + this.parent.scopes[this.index] = last; + last.index = this.index; + } + } + this.parent = void 0; + } + } +} +function effectScope(detached) { + return new EffectScope(detached); +} +function getCurrentScope() { + return activeEffectScope; +} +function onScopeDispose(fn, failSilently = false) { + if (activeEffectScope) { + activeEffectScope.cleanups.push(fn); + } +} +let activeSub; +const pausedQueueEffects = /* @__PURE__ */ new WeakSet(); +class ReactiveEffect { + constructor(fn) { + this.fn = fn; + this.deps = void 0; + this.depsTail = void 0; + this.flags = 1 | 4; + this.next = void 0; + this.cleanup = void 0; + this.scheduler = void 0; + if (activeEffectScope && activeEffectScope.active) { + activeEffectScope.effects.push(this); + } + } + pause() { + this.flags |= 64; + } + resume() { + if (this.flags & 64) { + this.flags &= -65; + if (pausedQueueEffects.has(this)) { + pausedQueueEffects.delete(this); + this.trigger(); + } + } + } + /** + * @internal + */ + notify() { + if (this.flags & 2 && !(this.flags & 32)) { + return; + } + if (!(this.flags & 8)) { + batch(this); + } + } + run() { + if (!(this.flags & 1)) { + return this.fn(); + } + this.flags |= 2; + cleanupEffect(this); + prepareDeps(this); + const prevEffect = activeSub; + const prevShouldTrack = shouldTrack; + activeSub = this; + shouldTrack = true; + try { + return this.fn(); + } finally { + cleanupDeps(this); + activeSub = prevEffect; + shouldTrack = prevShouldTrack; + this.flags &= -3; + } + } + stop() { + if (this.flags & 1) { + for (let link = this.deps; link; link = link.nextDep) { + removeSub(link); + } + this.deps = this.depsTail = void 0; + cleanupEffect(this); + this.onStop && this.onStop(); + this.flags &= -2; + } + } + trigger() { + if (this.flags & 64) { + pausedQueueEffects.add(this); + } else if (this.scheduler) { + this.scheduler(); + } else { + this.runIfDirty(); + } + } + /** + * @internal + */ + runIfDirty() { + if (isDirty(this)) { + this.run(); + } + } + get dirty() { + return isDirty(this); + } +} +let batchDepth = 0; +let batchedSub; +let batchedComputed; +function batch(sub, isComputed = false) { + sub.flags |= 8; + if (isComputed) { + sub.next = batchedComputed; + batchedComputed = sub; + return; + } + sub.next = batchedSub; + batchedSub = sub; +} +function startBatch() { + batchDepth++; +} +function endBatch() { + if (--batchDepth > 0) { + return; + } + if (batchedComputed) { + let e = batchedComputed; + batchedComputed = void 0; + while (e) { + const next = e.next; + e.next = void 0; + e.flags &= -9; + e = next; + } + } + let error; + while (batchedSub) { + let e = batchedSub; + batchedSub = void 0; + while (e) { + const next = e.next; + e.next = void 0; + e.flags &= -9; + if (e.flags & 1) { + try { + ; + e.trigger(); + } catch (err) { + if (!error) error = err; + } + } + e = next; + } + } + if (error) throw error; +} +function prepareDeps(sub) { + for (let link = sub.deps; link; link = link.nextDep) { + link.version = -1; + link.prevActiveLink = link.dep.activeLink; + link.dep.activeLink = link; + } +} +function cleanupDeps(sub) { + let head; + let tail = sub.depsTail; + let link = tail; + while (link) { + const prev = link.prevDep; + if (link.version === -1) { + if (link === tail) tail = prev; + removeSub(link); + removeDep(link); + } else { + head = link; + } + link.dep.activeLink = link.prevActiveLink; + link.prevActiveLink = void 0; + link = prev; + } + sub.deps = head; + sub.depsTail = tail; +} +function isDirty(sub) { + for (let link = sub.deps; link; link = link.nextDep) { + if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) { + return true; + } + } + if (sub._dirty) { + return true; + } + return false; +} +function refreshComputed(computed2) { + if (computed2.flags & 4 && !(computed2.flags & 16)) { + return; + } + computed2.flags &= -17; + if (computed2.globalVersion === globalVersion) { + return; + } + computed2.globalVersion = globalVersion; + const dep = computed2.dep; + computed2.flags |= 2; + if (dep.version > 0 && !computed2.isSSR && computed2.deps && !isDirty(computed2)) { + computed2.flags &= -3; + return; + } + const prevSub = activeSub; + const prevShouldTrack = shouldTrack; + activeSub = computed2; + shouldTrack = true; + try { + prepareDeps(computed2); + const value = computed2.fn(computed2._value); + if (dep.version === 0 || hasChanged(value, computed2._value)) { + computed2._value = value; + dep.version++; + } + } catch (err) { + dep.version++; + throw err; + } finally { + activeSub = prevSub; + shouldTrack = prevShouldTrack; + cleanupDeps(computed2); + computed2.flags &= -3; + } +} +function removeSub(link, soft = false) { + const { dep, prevSub, nextSub } = link; + if (prevSub) { + prevSub.nextSub = nextSub; + link.prevSub = void 0; + } + if (nextSub) { + nextSub.prevSub = prevSub; + link.nextSub = void 0; + } + if (dep.subs === link) { + dep.subs = prevSub; + if (!prevSub && dep.computed) { + dep.computed.flags &= -5; + for (let l = dep.computed.deps; l; l = l.nextDep) { + removeSub(l, true); + } + } + } + if (!soft && !--dep.sc && dep.map) { + dep.map.delete(dep.key); + } +} +function removeDep(link) { + const { prevDep, nextDep } = link; + if (prevDep) { + prevDep.nextDep = nextDep; + link.prevDep = void 0; + } + if (nextDep) { + nextDep.prevDep = prevDep; + link.nextDep = void 0; + } +} +function effect(fn, options) { + if (fn.effect instanceof ReactiveEffect) { + fn = fn.effect.fn; + } + const e = new ReactiveEffect(fn); + if (options) { + extend(e, options); + } + try { + e.run(); + } catch (err) { + e.stop(); + throw err; + } + const runner = e.run.bind(e); + runner.effect = e; + return runner; +} +function stop(runner) { + runner.effect.stop(); +} +let shouldTrack = true; +const trackStack = []; +function pauseTracking() { + trackStack.push(shouldTrack); + shouldTrack = false; +} +function resetTracking() { + const last = trackStack.pop(); + shouldTrack = last === void 0 ? true : last; +} +function cleanupEffect(e) { + const { cleanup } = e; + e.cleanup = void 0; + if (cleanup) { + const prevSub = activeSub; + activeSub = void 0; + try { + cleanup(); + } finally { + activeSub = prevSub; + } + } +} +let globalVersion = 0; +class Link { + constructor(sub, dep) { + this.sub = sub; + this.dep = dep; + this.version = dep.version; + this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; + } +} +class Dep { + constructor(computed2) { + this.computed = computed2; + this.version = 0; + this.activeLink = void 0; + this.subs = void 0; + this.map = void 0; + this.key = void 0; + this.sc = 0; + } + track(debugInfo) { + if (!activeSub || !shouldTrack || activeSub === this.computed) { + return; + } + let link = this.activeLink; + if (link === void 0 || link.sub !== activeSub) { + link = this.activeLink = new Link(activeSub, this); + if (!activeSub.deps) { + activeSub.deps = activeSub.depsTail = link; + } else { + link.prevDep = activeSub.depsTail; + activeSub.depsTail.nextDep = link; + activeSub.depsTail = link; + } + addSub(link); + } else if (link.version === -1) { + link.version = this.version; + if (link.nextDep) { + const next = link.nextDep; + next.prevDep = link.prevDep; + if (link.prevDep) { + link.prevDep.nextDep = next; + } + link.prevDep = activeSub.depsTail; + link.nextDep = void 0; + activeSub.depsTail.nextDep = link; + activeSub.depsTail = link; + if (activeSub.deps === link) { + activeSub.deps = next; + } + } + } + return link; + } + trigger(debugInfo) { + this.version++; + globalVersion++; + this.notify(debugInfo); + } + notify(debugInfo) { + startBatch(); + try { + if (false) ; + for (let link = this.subs; link; link = link.prevSub) { + if (link.sub.notify()) { + ; + link.sub.dep.notify(); + } + } + } finally { + endBatch(); + } + } +} +function addSub(link) { + link.dep.sc++; + if (link.sub.flags & 4) { + const computed2 = link.dep.computed; + if (computed2 && !link.dep.subs) { + computed2.flags |= 4 | 16; + for (let l = computed2.deps; l; l = l.nextDep) { + addSub(l); + } + } + const currentTail = link.dep.subs; + if (currentTail !== link) { + link.prevSub = currentTail; + if (currentTail) currentTail.nextSub = link; + } + link.dep.subs = link; + } +} +const targetMap = /* @__PURE__ */ new WeakMap(); +const ITERATE_KEY = Symbol( + "" +); +const MAP_KEY_ITERATE_KEY = Symbol( + "" +); +const ARRAY_ITERATE_KEY = Symbol( + "" +); +function track(target, type, key) { + if (shouldTrack && activeSub) { + let depsMap = targetMap.get(target); + if (!depsMap) { + targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); + } + let dep = depsMap.get(key); + if (!dep) { + depsMap.set(key, dep = new Dep()); + dep.map = depsMap; + dep.key = key; + } + { + dep.track(); + } + } +} +function trigger(target, type, key, newValue, oldValue, oldTarget) { + const depsMap = targetMap.get(target); + if (!depsMap) { + globalVersion++; + return; + } + const run = (dep) => { + if (dep) { + { + dep.trigger(); + } + } + }; + startBatch(); + if (type === "clear") { + depsMap.forEach(run); + } else { + const targetIsArray = isArray(target); + const isArrayIndex = targetIsArray && isIntegerKey(key); + if (targetIsArray && key === "length") { + const newLength = Number(newValue); + depsMap.forEach((dep, key2) => { + if (key2 === "length" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) { + run(dep); + } + }); + } else { + if (key !== void 0 || depsMap.has(void 0)) { + run(depsMap.get(key)); + } + if (isArrayIndex) { + run(depsMap.get(ARRAY_ITERATE_KEY)); + } + switch (type) { + case "add": + if (!targetIsArray) { + run(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + run(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } else if (isArrayIndex) { + run(depsMap.get("length")); + } + break; + case "delete": + if (!targetIsArray) { + run(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + run(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } + break; + case "set": + if (isMap(target)) { + run(depsMap.get(ITERATE_KEY)); + } + break; + } + } + } + endBatch(); +} +function getDepFromReactive(object, key) { + const depMap = targetMap.get(object); + return depMap && depMap.get(key); +} +function reactiveReadArray(array) { + const raw = toRaw(array); + if (raw === array) return raw; + track(raw, "iterate", ARRAY_ITERATE_KEY); + return isShallow(array) ? raw : raw.map(toReactive); +} +function shallowReadArray(arr) { + track(arr = toRaw(arr), "iterate", ARRAY_ITERATE_KEY); + return arr; +} +const arrayInstrumentations = { + __proto__: null, + [Symbol.iterator]() { + return iterator(this, Symbol.iterator, toReactive); + }, + concat(...args) { + return reactiveReadArray(this).concat( + ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x) + ); + }, + entries() { + return iterator(this, "entries", (value) => { + value[1] = toReactive(value[1]); + return value; + }); + }, + every(fn, thisArg) { + return apply(this, "every", fn, thisArg, void 0, arguments); + }, + filter(fn, thisArg) { + return apply(this, "filter", fn, thisArg, (v) => v.map(toReactive), arguments); + }, + find(fn, thisArg) { + return apply(this, "find", fn, thisArg, toReactive, arguments); + }, + findIndex(fn, thisArg) { + return apply(this, "findIndex", fn, thisArg, void 0, arguments); + }, + findLast(fn, thisArg) { + return apply(this, "findLast", fn, thisArg, toReactive, arguments); + }, + findLastIndex(fn, thisArg) { + return apply(this, "findLastIndex", fn, thisArg, void 0, arguments); + }, + // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement + forEach(fn, thisArg) { + return apply(this, "forEach", fn, thisArg, void 0, arguments); + }, + includes(...args) { + return searchProxy(this, "includes", args); + }, + indexOf(...args) { + return searchProxy(this, "indexOf", args); + }, + join(separator) { + return reactiveReadArray(this).join(separator); + }, + // keys() iterator only reads `length`, no optimisation required + lastIndexOf(...args) { + return searchProxy(this, "lastIndexOf", args); + }, + map(fn, thisArg) { + return apply(this, "map", fn, thisArg, void 0, arguments); + }, + pop() { + return noTracking(this, "pop"); + }, + push(...args) { + return noTracking(this, "push", args); + }, + reduce(fn, ...args) { + return reduce(this, "reduce", fn, args); + }, + reduceRight(fn, ...args) { + return reduce(this, "reduceRight", fn, args); + }, + shift() { + return noTracking(this, "shift"); + }, + // slice could use ARRAY_ITERATE but also seems to beg for range tracking + some(fn, thisArg) { + return apply(this, "some", fn, thisArg, void 0, arguments); + }, + splice(...args) { + return noTracking(this, "splice", args); + }, + toReversed() { + return reactiveReadArray(this).toReversed(); + }, + toSorted(comparer) { + return reactiveReadArray(this).toSorted(comparer); + }, + toSpliced(...args) { + return reactiveReadArray(this).toSpliced(...args); + }, + unshift(...args) { + return noTracking(this, "unshift", args); + }, + values() { + return iterator(this, "values", toReactive); + } +}; +function iterator(self, method, wrapValue) { + const arr = shallowReadArray(self); + const iter = arr[method](); + if (arr !== self && !isShallow(self)) { + iter._next = iter.next; + iter.next = () => { + const result = iter._next(); + if (result.value) { + result.value = wrapValue(result.value); + } + return result; + }; + } + return iter; +} +const arrayProto = Array.prototype; +function apply(self, method, fn, thisArg, wrappedRetFn, args) { + const arr = shallowReadArray(self); + const needsWrap = arr !== self && !isShallow(self); + const methodFn = arr[method]; + if (methodFn !== arrayProto[method]) { + const result2 = methodFn.apply(self, args); + return needsWrap ? toReactive(result2) : result2; + } + let wrappedFn = fn; + if (arr !== self) { + if (needsWrap) { + wrappedFn = function(item, index) { + return fn.call(this, toReactive(item), index, self); + }; + } else if (fn.length > 2) { + wrappedFn = function(item, index) { + return fn.call(this, item, index, self); + }; + } + } + const result = methodFn.call(arr, wrappedFn, thisArg); + return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result; +} +function reduce(self, method, fn, args) { + const arr = shallowReadArray(self); + let wrappedFn = fn; + if (arr !== self) { + if (!isShallow(self)) { + wrappedFn = function(acc, item, index) { + return fn.call(this, acc, toReactive(item), index, self); + }; + } else if (fn.length > 3) { + wrappedFn = function(acc, item, index) { + return fn.call(this, acc, item, index, self); + }; + } + } + return arr[method](wrappedFn, ...args); +} +function searchProxy(self, method, args) { + const arr = toRaw(self); + track(arr, "iterate", ARRAY_ITERATE_KEY); + const res = arr[method](...args); + if ((res === -1 || res === false) && isProxy(args[0])) { + args[0] = toRaw(args[0]); + return arr[method](...args); + } + return res; +} +function noTracking(self, method, args = []) { + pauseTracking(); + startBatch(); + const res = toRaw(self)[method].apply(self, args); + endBatch(); + resetTracking(); + return res; +} +const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`); +const builtInSymbols = new Set( + /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) +); +function hasOwnProperty(key) { + if (!isSymbol(key)) key = String(key); + const obj = toRaw(this); + track(obj, "has", key); + return obj.hasOwnProperty(key); +} +class BaseReactiveHandler { + constructor(_isReadonly = false, _isShallow = false) { + this._isReadonly = _isReadonly; + this._isShallow = _isShallow; + } + get(target, key, receiver) { + if (key === "__v_skip") return target["__v_skip"]; + const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_isShallow") { + return isShallow2; + } else if (key === "__v_raw") { + if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype + // this means the receiver is a user proxy of the reactive proxy + Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { + return target; + } + return; + } + const targetIsArray = isArray(target); + if (!isReadonly2) { + let fn; + if (targetIsArray && (fn = arrayInstrumentations[key])) { + return fn; + } + if (key === "hasOwnProperty") { + return hasOwnProperty; + } + } + const res = Reflect.get( + target, + key, + // if this is a proxy wrapping a ref, return methods using the raw ref + // as receiver so that we don't have to call `toRaw` on the ref in all + // its class methods + isRef(target) ? target : receiver + ); + if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { + return res; + } + if (!isReadonly2) { + track(target, "get", key); + } + if (isShallow2) { + return res; + } + if (isRef(res)) { + return targetIsArray && isIntegerKey(key) ? res : res.value; + } + if (isObject(res)) { + return isReadonly2 ? readonly(res) : reactive(res); + } + return res; + } +} +class MutableReactiveHandler extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(false, isShallow2); + } + set(target, key, value, receiver) { + let oldValue = target[key]; + if (!this._isShallow) { + const isOldValueReadonly = isReadonly(oldValue); + if (!isShallow(value) && !isReadonly(value)) { + oldValue = toRaw(oldValue); + value = toRaw(value); + } + if (!isArray(target) && isRef(oldValue) && !isRef(value)) { + if (isOldValueReadonly) { + return false; + } else { + oldValue.value = value; + return true; + } + } + } + const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); + const result = Reflect.set( + target, + key, + value, + isRef(target) ? target : receiver + ); + if (target === toRaw(receiver)) { + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value); + } + } + return result; + } + deleteProperty(target, key) { + const hadKey = hasOwn(target, key); + target[key]; + const result = Reflect.deleteProperty(target, key); + if (result && hadKey) { + trigger(target, "delete", key, void 0); + } + return result; + } + has(target, key) { + const result = Reflect.has(target, key); + if (!isSymbol(key) || !builtInSymbols.has(key)) { + track(target, "has", key); + } + return result; + } + ownKeys(target) { + track( + target, + "iterate", + isArray(target) ? "length" : ITERATE_KEY + ); + return Reflect.ownKeys(target); + } +} +class ReadonlyReactiveHandler extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(true, isShallow2); + } + set(target, key) { + return true; + } + deleteProperty(target, key) { + return true; + } +} +const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler(); +const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(); +const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true); +const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true); +const toShallow = (value) => value; +const getProto = (v) => Reflect.getPrototypeOf(v); +function createIterableMethod(method, isReadonly2, isShallow2) { + return function(...args) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const targetIsMap = isMap(rawTarget); + const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; + const isKeyOnly = method === "keys" && targetIsMap; + const innerIterator = target[method](...args); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track( + rawTarget, + "iterate", + isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY + ); + return { + // iterator protocol + next() { + const { value, done } = innerIterator.next(); + return done ? { value, done } : { + value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), + done + }; + }, + // iterable protocol + [Symbol.iterator]() { + return this; + } + }; + }; +} +function createReadonlyMethod(type) { + return function(...args) { + return type === "delete" ? false : type === "clear" ? void 0 : this; + }; +} +function createInstrumentations(readonly2, shallow) { + const instrumentations = { + get(key) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!readonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "get", key); + } + track(rawTarget, "get", rawKey); + } + const { has } = getProto(rawTarget); + const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; + if (has.call(rawTarget, key)) { + return wrap(target.get(key)); + } else if (has.call(rawTarget, rawKey)) { + return wrap(target.get(rawKey)); + } else if (target !== rawTarget) { + target.get(key); + } + }, + get size() { + const target = this["__v_raw"]; + !readonly2 && track(toRaw(target), "iterate", ITERATE_KEY); + return Reflect.get(target, "size", target); + }, + has(key) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!readonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "has", key); + } + track(rawTarget, "has", rawKey); + } + return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); + }, + forEach(callback, thisArg) { + const observed = this; + const target = observed["__v_raw"]; + const rawTarget = toRaw(target); + const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; + !readonly2 && track(rawTarget, "iterate", ITERATE_KEY); + return target.forEach((value, key) => { + return callback.call(thisArg, wrap(value), wrap(key), observed); + }); + } + }; + extend( + instrumentations, + readonly2 ? { + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear") + } : { + add(value) { + if (!shallow && !isShallow(value) && !isReadonly(value)) { + value = toRaw(value); + } + const target = toRaw(this); + const proto = getProto(target); + const hadKey = proto.has.call(target, value); + if (!hadKey) { + target.add(value); + trigger(target, "add", value, value); + } + return this; + }, + set(key, value) { + if (!shallow && !isShallow(value) && !isReadonly(value)) { + value = toRaw(value); + } + const target = toRaw(this); + const { has, get } = getProto(target); + let hadKey = has.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has.call(target, key); + } + const oldValue = get.call(target, key); + target.set(key, value); + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value); + } + return this; + }, + delete(key) { + const target = toRaw(this); + const { has, get } = getProto(target); + let hadKey = has.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has.call(target, key); + } + get ? get.call(target, key) : void 0; + const result = target.delete(key); + if (hadKey) { + trigger(target, "delete", key, void 0); + } + return result; + }, + clear() { + const target = toRaw(this); + const hadItems = target.size !== 0; + const result = target.clear(); + if (hadItems) { + trigger( + target, + "clear", + void 0, + void 0); + } + return result; + } + } + ); + const iteratorMethods = [ + "keys", + "values", + "entries", + Symbol.iterator + ]; + iteratorMethods.forEach((method) => { + instrumentations[method] = createIterableMethod(method, readonly2, shallow); + }); + return instrumentations; +} +function createInstrumentationGetter(isReadonly2, shallow) { + const instrumentations = createInstrumentations(isReadonly2, shallow); + return (target, key, receiver) => { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_raw") { + return target; + } + return Reflect.get( + hasOwn(instrumentations, key) && key in target ? instrumentations : target, + key, + receiver + ); + }; +} +const mutableCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, false) +}; +const shallowCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, true) +}; +const readonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, false) +}; +const shallowReadonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, true) +}; +const reactiveMap = /* @__PURE__ */ new WeakMap(); +const shallowReactiveMap = /* @__PURE__ */ new WeakMap(); +const readonlyMap = /* @__PURE__ */ new WeakMap(); +const shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); +function targetTypeMap(rawType) { + switch (rawType) { + case "Object": + case "Array": + return 1; + case "Map": + case "Set": + case "WeakMap": + case "WeakSet": + return 2; + default: + return 0; + } +} +function getTargetType(value) { + return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); +} +function reactive(target) { + if (isReadonly(target)) { + return target; + } + return createReactiveObject( + target, + false, + mutableHandlers, + mutableCollectionHandlers, + reactiveMap + ); +} +function shallowReactive(target) { + return createReactiveObject( + target, + false, + shallowReactiveHandlers, + shallowCollectionHandlers, + shallowReactiveMap + ); +} +function readonly(target) { + return createReactiveObject( + target, + true, + readonlyHandlers, + readonlyCollectionHandlers, + readonlyMap + ); +} +function shallowReadonly(target) { + return createReactiveObject( + target, + true, + shallowReadonlyHandlers, + shallowReadonlyCollectionHandlers, + shallowReadonlyMap + ); +} +function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { + if (!isObject(target)) { + return target; + } + if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { + return target; + } + const existingProxy = proxyMap.get(target); + if (existingProxy) { + return existingProxy; + } + const targetType = getTargetType(target); + if (targetType === 0) { + return target; + } + const proxy = new Proxy( + target, + targetType === 2 ? collectionHandlers : baseHandlers + ); + proxyMap.set(target, proxy); + return proxy; +} +function isReactive(value) { + if (isReadonly(value)) { + return isReactive(value["__v_raw"]); + } + return !!(value && value["__v_isReactive"]); +} +function isReadonly(value) { + return !!(value && value["__v_isReadonly"]); +} +function isShallow(value) { + return !!(value && value["__v_isShallow"]); +} +function isProxy(value) { + return value ? !!value["__v_raw"] : false; +} +function toRaw(observed) { + const raw = observed && observed["__v_raw"]; + return raw ? toRaw(raw) : observed; +} +function markRaw(value) { + if (!hasOwn(value, "__v_skip") && Object.isExtensible(value)) { + def(value, "__v_skip", true); + } + return value; +} +const toReactive = (value) => isObject(value) ? reactive(value) : value; +const toReadonly = (value) => isObject(value) ? readonly(value) : value; +function isRef(r) { + return r ? r["__v_isRef"] === true : false; +} +function ref(value) { + return createRef(value, false); +} +function shallowRef(value) { + return createRef(value, true); +} +function createRef(rawValue, shallow) { + if (isRef(rawValue)) { + return rawValue; + } + return new RefImpl(rawValue, shallow); +} +class RefImpl { + constructor(value, isShallow2) { + this.dep = new Dep(); + this["__v_isRef"] = true; + this["__v_isShallow"] = false; + this._rawValue = isShallow2 ? value : toRaw(value); + this._value = isShallow2 ? value : toReactive(value); + this["__v_isShallow"] = isShallow2; + } + get value() { + { + this.dep.track(); + } + return this._value; + } + set value(newValue) { + const oldValue = this._rawValue; + const useDirectValue = this["__v_isShallow"] || isShallow(newValue) || isReadonly(newValue); + newValue = useDirectValue ? newValue : toRaw(newValue); + if (hasChanged(newValue, oldValue)) { + this._rawValue = newValue; + this._value = useDirectValue ? newValue : toReactive(newValue); + { + this.dep.trigger(); + } + } + } +} +function triggerRef(ref2) { + if (ref2.dep) { + { + ref2.dep.trigger(); + } + } +} +function unref(ref2) { + return isRef(ref2) ? ref2.value : ref2; +} +function toValue(source) { + return isFunction(source) ? source() : unref(source); +} +const shallowUnwrapHandlers = { + get: (target, key, receiver) => key === "__v_raw" ? target : unref(Reflect.get(target, key, receiver)), + set: (target, key, value, receiver) => { + const oldValue = target[key]; + if (isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + return true; + } else { + return Reflect.set(target, key, value, receiver); + } + } +}; +function proxyRefs(objectWithRefs) { + return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); +} +class CustomRefImpl { + constructor(factory) { + this["__v_isRef"] = true; + this._value = void 0; + const dep = this.dep = new Dep(); + const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep)); + this._get = get; + this._set = set; + } + get value() { + return this._value = this._get(); + } + set value(newVal) { + this._set(newVal); + } +} +function customRef(factory) { + return new CustomRefImpl(factory); +} +function toRefs(object) { + const ret = isArray(object) ? new Array(object.length) : {}; + for (const key in object) { + ret[key] = propertyToRef(object, key); + } + return ret; +} +class ObjectRefImpl { + constructor(_object, _key, _defaultValue) { + this._object = _object; + this._key = _key; + this._defaultValue = _defaultValue; + this["__v_isRef"] = true; + this._value = void 0; + } + get value() { + const val = this._object[this._key]; + return this._value = val === void 0 ? this._defaultValue : val; + } + set value(newVal) { + this._object[this._key] = newVal; + } + get dep() { + return getDepFromReactive(toRaw(this._object), this._key); + } +} +class GetterRefImpl { + constructor(_getter) { + this._getter = _getter; + this["__v_isRef"] = true; + this["__v_isReadonly"] = true; + this._value = void 0; + } + get value() { + return this._value = this._getter(); + } +} +function toRef(source, key, defaultValue) { + if (isRef(source)) { + return source; + } else if (isFunction(source)) { + return new GetterRefImpl(source); + } else if (isObject(source) && arguments.length > 1) { + return propertyToRef(source, key, defaultValue); + } else { + return ref(source); + } +} +function propertyToRef(source, key, defaultValue) { + const val = source[key]; + return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue); +} +class ComputedRefImpl { + constructor(fn, setter, isSSR) { + this.fn = fn; + this.setter = setter; + this._value = void 0; + this.dep = new Dep(this); + this.__v_isRef = true; + this.deps = void 0; + this.depsTail = void 0; + this.flags = 16; + this.globalVersion = globalVersion - 1; + this.next = void 0; + this.effect = this; + this["__v_isReadonly"] = !setter; + this.isSSR = isSSR; + } + /** + * @internal + */ + notify() { + this.flags |= 16; + if (!(this.flags & 8) && // avoid infinite self recursion + activeSub !== this) { + batch(this, true); + return true; + } + } + get value() { + const link = this.dep.track(); + refreshComputed(this); + if (link) { + link.version = this.dep.version; + } + return this._value; + } + set value(newValue) { + if (this.setter) { + this.setter(newValue); + } + } +} +function computed$1(getterOrOptions, debugOptions, isSSR = false) { + let getter; + let setter; + if (isFunction(getterOrOptions)) { + getter = getterOrOptions; + } else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + const cRef = new ComputedRefImpl(getter, setter, isSSR); + return cRef; +} +const TrackOpTypes = { + "GET": "get", + "HAS": "has", + "ITERATE": "iterate" +}; +const TriggerOpTypes = { + "SET": "set", + "ADD": "add", + "DELETE": "delete", + "CLEAR": "clear" +}; +const INITIAL_WATCHER_VALUE = {}; +const cleanupMap = /* @__PURE__ */ new WeakMap(); +let activeWatcher = void 0; +function getCurrentWatcher() { + return activeWatcher; +} +function onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) { + if (owner) { + let cleanups = cleanupMap.get(owner); + if (!cleanups) cleanupMap.set(owner, cleanups = []); + cleanups.push(cleanupFn); + } +} +function watch$1(source, cb, options = EMPTY_OBJ) { + const { immediate, deep, once, scheduler, augmentJob, call } = options; + const reactiveGetter = (source2) => { + if (deep) return source2; + if (isShallow(source2) || deep === false || deep === 0) + return traverse(source2, 1); + return traverse(source2); + }; + let effect2; + let getter; + let cleanup; + let boundCleanup; + let forceTrigger = false; + let isMultiSource = false; + if (isRef(source)) { + getter = () => source.value; + forceTrigger = isShallow(source); + } else if (isReactive(source)) { + getter = () => reactiveGetter(source); + forceTrigger = true; + } else if (isArray(source)) { + isMultiSource = true; + forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); + getter = () => source.map((s) => { + if (isRef(s)) { + return s.value; + } else if (isReactive(s)) { + return reactiveGetter(s); + } else if (isFunction(s)) { + return call ? call(s, 2) : s(); + } else ; + }); + } else if (isFunction(source)) { + if (cb) { + getter = call ? () => call(source, 2) : source; + } else { + getter = () => { + if (cleanup) { + pauseTracking(); + try { + cleanup(); + } finally { + resetTracking(); + } + } + const currentEffect = activeWatcher; + activeWatcher = effect2; + try { + return call ? call(source, 3, [boundCleanup]) : source(boundCleanup); + } finally { + activeWatcher = currentEffect; + } + }; + } + } else { + getter = NOOP; + } + if (cb && deep) { + const baseGetter = getter; + const depth = deep === true ? Infinity : deep; + getter = () => traverse(baseGetter(), depth); + } + const scope = getCurrentScope(); + const watchHandle = () => { + effect2.stop(); + if (scope && scope.active) { + remove(scope.effects, effect2); + } + }; + if (once && cb) { + const _cb = cb; + cb = (...args) => { + _cb(...args); + watchHandle(); + }; + } + let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; + const job = (immediateFirstRun) => { + if (!(effect2.flags & 1) || !effect2.dirty && !immediateFirstRun) { + return; + } + if (cb) { + const newValue = effect2.run(); + if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) { + if (cleanup) { + cleanup(); + } + const currentWatcher = activeWatcher; + activeWatcher = effect2; + try { + const args = [ + newValue, + // pass undefined as the old value when it's changed for the first time + oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, + boundCleanup + ]; + call ? call(cb, 3, args) : ( + // @ts-expect-error + cb(...args) + ); + oldValue = newValue; + } finally { + activeWatcher = currentWatcher; + } + } + } else { + effect2.run(); + } + }; + if (augmentJob) { + augmentJob(job); + } + effect2 = new ReactiveEffect(getter); + effect2.scheduler = scheduler ? () => scheduler(job, false) : job; + boundCleanup = (fn) => onWatcherCleanup(fn, false, effect2); + cleanup = effect2.onStop = () => { + const cleanups = cleanupMap.get(effect2); + if (cleanups) { + if (call) { + call(cleanups, 4); + } else { + for (const cleanup2 of cleanups) cleanup2(); + } + cleanupMap.delete(effect2); + } + }; + if (cb) { + if (immediate) { + job(true); + } else { + oldValue = effect2.run(); + } + } else if (scheduler) { + scheduler(job.bind(null, true), true); + } else { + effect2.run(); + } + watchHandle.pause = effect2.pause.bind(effect2); + watchHandle.resume = effect2.resume.bind(effect2); + watchHandle.stop = watchHandle; + return watchHandle; +} +function traverse(value, depth = Infinity, seen) { + if (depth <= 0 || !isObject(value) || value["__v_skip"]) { + return value; + } + seen = seen || /* @__PURE__ */ new Set(); + if (seen.has(value)) { + return value; + } + seen.add(value); + depth--; + if (isRef(value)) { + traverse(value.value, depth, seen); + } else if (isArray(value)) { + for (let i = 0; i < value.length; i++) { + traverse(value[i], depth, seen); + } + } else if (isSet(value) || isMap(value)) { + value.forEach((v) => { + traverse(v, depth, seen); + }); + } else if (isPlainObject(value)) { + for (const key in value) { + traverse(value[key], depth, seen); + } + for (const key of Object.getOwnPropertySymbols(value)) { + if (Object.prototype.propertyIsEnumerable.call(value, key)) { + traverse(value[key], depth, seen); + } + } + } + return value; +} + +/** +* @vue/runtime-core v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +const stack = []; +function pushWarningContext(vnode) { + stack.push(vnode); +} +function popWarningContext() { + stack.pop(); +} +let isWarning = false; +function warn$1(msg, ...args) { + if (isWarning) return; + isWarning = true; + pauseTracking(); + const instance = stack.length ? stack[stack.length - 1].component : null; + const appWarnHandler = instance && instance.appContext.config.warnHandler; + const trace = getComponentTrace(); + if (appWarnHandler) { + callWithErrorHandling( + appWarnHandler, + instance, + 11, + [ + // eslint-disable-next-line no-restricted-syntax + msg + args.map((a) => { + var _a, _b; + return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a); + }).join(""), + instance && instance.proxy, + trace.map( + ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` + ).join("\n"), + trace + ] + ); + } else { + const warnArgs = [`[Vue warn]: ${msg}`, ...args]; + if (trace.length && // avoid spamming console during tests + true) { + warnArgs.push(` +`, ...formatTrace(trace)); + } + console.warn(...warnArgs); + } + resetTracking(); + isWarning = false; +} +function getComponentTrace() { + let currentVNode = stack[stack.length - 1]; + if (!currentVNode) { + return []; + } + const normalizedStack = []; + while (currentVNode) { + const last = normalizedStack[0]; + if (last && last.vnode === currentVNode) { + last.recurseCount++; + } else { + normalizedStack.push({ + vnode: currentVNode, + recurseCount: 0 + }); + } + const parentInstance = currentVNode.component && currentVNode.component.parent; + currentVNode = parentInstance && parentInstance.vnode; + } + return normalizedStack; +} +function formatTrace(trace) { + const logs = []; + trace.forEach((entry, i) => { + logs.push(...i === 0 ? [] : [` +`], ...formatTraceEntry(entry)); + }); + return logs; +} +function formatTraceEntry({ vnode, recurseCount }) { + const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; + const isRoot = vnode.component ? vnode.component.parent == null : false; + const open = ` at <${formatComponentName( + vnode.component, + vnode.type, + isRoot + )}`; + const close = `>` + postfix; + return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; +} +function formatProps(props) { + const res = []; + const keys = Object.keys(props); + keys.slice(0, 3).forEach((key) => { + res.push(...formatProp(key, props[key])); + }); + if (keys.length > 3) { + res.push(` ...`); + } + return res; +} +function formatProp(key, value, raw) { + if (isString(value)) { + value = JSON.stringify(value); + return raw ? value : [`${key}=${value}`]; + } else if (typeof value === "number" || typeof value === "boolean" || value == null) { + return raw ? value : [`${key}=${value}`]; + } else if (isRef(value)) { + value = formatProp(key, toRaw(value.value), true); + return raw ? value : [`${key}=Ref<`, value, `>`]; + } else if (isFunction(value)) { + return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; + } else { + value = toRaw(value); + return raw ? value : [`${key}=`, value]; + } +} +function assertNumber(val, type) { + return; +} +const ErrorCodes = { + "SETUP_FUNCTION": 0, + "0": "SETUP_FUNCTION", + "RENDER_FUNCTION": 1, + "1": "RENDER_FUNCTION", + "NATIVE_EVENT_HANDLER": 5, + "5": "NATIVE_EVENT_HANDLER", + "COMPONENT_EVENT_HANDLER": 6, + "6": "COMPONENT_EVENT_HANDLER", + "VNODE_HOOK": 7, + "7": "VNODE_HOOK", + "DIRECTIVE_HOOK": 8, + "8": "DIRECTIVE_HOOK", + "TRANSITION_HOOK": 9, + "9": "TRANSITION_HOOK", + "APP_ERROR_HANDLER": 10, + "10": "APP_ERROR_HANDLER", + "APP_WARN_HANDLER": 11, + "11": "APP_WARN_HANDLER", + "FUNCTION_REF": 12, + "12": "FUNCTION_REF", + "ASYNC_COMPONENT_LOADER": 13, + "13": "ASYNC_COMPONENT_LOADER", + "SCHEDULER": 14, + "14": "SCHEDULER", + "COMPONENT_UPDATE": 15, + "15": "COMPONENT_UPDATE", + "APP_UNMOUNT_CLEANUP": 16, + "16": "APP_UNMOUNT_CLEANUP" +}; +const ErrorTypeStrings$1 = { + ["sp"]: "serverPrefetch hook", + ["bc"]: "beforeCreate hook", + ["c"]: "created hook", + ["bm"]: "beforeMount hook", + ["m"]: "mounted hook", + ["bu"]: "beforeUpdate hook", + ["u"]: "updated", + ["bum"]: "beforeUnmount hook", + ["um"]: "unmounted hook", + ["a"]: "activated hook", + ["da"]: "deactivated hook", + ["ec"]: "errorCaptured hook", + ["rtc"]: "renderTracked hook", + ["rtg"]: "renderTriggered hook", + [0]: "setup function", + [1]: "render function", + [2]: "watcher getter", + [3]: "watcher callback", + [4]: "watcher cleanup function", + [5]: "native event handler", + [6]: "component event handler", + [7]: "vnode hook", + [8]: "directive hook", + [9]: "transition hook", + [10]: "app errorHandler", + [11]: "app warnHandler", + [12]: "ref function", + [13]: "async component loader", + [14]: "scheduler flush", + [15]: "component update", + [16]: "app unmount cleanup function" +}; +function callWithErrorHandling(fn, instance, type, args) { + try { + return args ? fn(...args) : fn(); + } catch (err) { + handleError(err, instance, type); + } +} +function callWithAsyncErrorHandling(fn, instance, type, args) { + if (isFunction(fn)) { + const res = callWithErrorHandling(fn, instance, type, args); + if (res && isPromise(res)) { + res.catch((err) => { + handleError(err, instance, type); + }); + } + return res; + } + if (isArray(fn)) { + const values = []; + for (let i = 0; i < fn.length; i++) { + values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); + } + return values; + } +} +function handleError(err, instance, type, throwInDev = true) { + const contextVNode = instance ? instance.vnode : null; + const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ; + if (instance) { + let cur = instance.parent; + const exposedInstance = instance.proxy; + const errorInfo = `https://vuejs.org/error-reference/#runtime-${type}`; + while (cur) { + const errorCapturedHooks = cur.ec; + if (errorCapturedHooks) { + for (let i = 0; i < errorCapturedHooks.length; i++) { + if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { + return; + } + } + } + cur = cur.parent; + } + if (errorHandler) { + pauseTracking(); + callWithErrorHandling(errorHandler, null, 10, [ + err, + exposedInstance, + errorInfo + ]); + resetTracking(); + return; + } + } + logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction); +} +function logError(err, type, contextVNode, throwInDev = true, throwInProd = false) { + if (throwInProd) { + throw err; + } else { + console.error(err); + } +} +const queue = []; +let flushIndex = -1; +const pendingPostFlushCbs = []; +let activePostFlushCbs = null; +let postFlushIndex = 0; +const resolvedPromise = /* @__PURE__ */ Promise.resolve(); +let currentFlushPromise = null; +function nextTick(fn) { + const p = currentFlushPromise || resolvedPromise; + return fn ? p.then(this ? fn.bind(this) : fn) : p; +} +function findInsertionIndex(id) { + let start = flushIndex + 1; + let end = queue.length; + while (start < end) { + const middle = start + end >>> 1; + const middleJob = queue[middle]; + const middleJobId = getId(middleJob); + if (middleJobId < id || middleJobId === id && middleJob.flags & 2) { + start = middle + 1; + } else { + end = middle; + } + } + return start; +} +function queueJob(job) { + if (!(job.flags & 1)) { + const jobId = getId(job); + const lastJob = queue[queue.length - 1]; + if (!lastJob || // fast path when the job id is larger than the tail + !(job.flags & 2) && jobId >= getId(lastJob)) { + queue.push(job); + } else { + queue.splice(findInsertionIndex(jobId), 0, job); + } + job.flags |= 1; + queueFlush(); + } +} +function queueFlush() { + if (!currentFlushPromise) { + currentFlushPromise = resolvedPromise.then(flushJobs); + } +} +function queuePostFlushCb(cb) { + if (!isArray(cb)) { + if (activePostFlushCbs && cb.id === -1) { + activePostFlushCbs.splice(postFlushIndex + 1, 0, cb); + } else if (!(cb.flags & 1)) { + pendingPostFlushCbs.push(cb); + cb.flags |= 1; + } + } else { + pendingPostFlushCbs.push(...cb); + } + queueFlush(); +} +function flushPreFlushCbs(instance, seen, i = flushIndex + 1) { + for (; i < queue.length; i++) { + const cb = queue[i]; + if (cb && cb.flags & 2) { + if (instance && cb.id !== instance.uid) { + continue; + } + queue.splice(i, 1); + i--; + if (cb.flags & 4) { + cb.flags &= -2; + } + cb(); + if (!(cb.flags & 4)) { + cb.flags &= -2; + } + } + } +} +function flushPostFlushCbs(seen) { + if (pendingPostFlushCbs.length) { + const deduped = [...new Set(pendingPostFlushCbs)].sort( + (a, b) => getId(a) - getId(b) + ); + pendingPostFlushCbs.length = 0; + if (activePostFlushCbs) { + activePostFlushCbs.push(...deduped); + return; + } + activePostFlushCbs = deduped; + for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { + const cb = activePostFlushCbs[postFlushIndex]; + if (cb.flags & 4) { + cb.flags &= -2; + } + if (!(cb.flags & 8)) cb(); + cb.flags &= -2; + } + activePostFlushCbs = null; + postFlushIndex = 0; + } +} +const getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id; +function flushJobs(seen) { + try { + for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { + const job = queue[flushIndex]; + if (job && !(job.flags & 8)) { + if (false) ; + if (job.flags & 4) { + job.flags &= ~1; + } + callWithErrorHandling( + job, + job.i, + job.i ? 15 : 14 + ); + if (!(job.flags & 4)) { + job.flags &= ~1; + } + } + } + } finally { + for (; flushIndex < queue.length; flushIndex++) { + const job = queue[flushIndex]; + if (job) { + job.flags &= -2; + } + } + flushIndex = -1; + queue.length = 0; + flushPostFlushCbs(); + currentFlushPromise = null; + if (queue.length || pendingPostFlushCbs.length) { + flushJobs(); + } + } +} +let devtools$1; +let buffer = []; +function setDevtoolsHook$1(hook, target) { + var _a, _b; + devtools$1 = hook; + if (devtools$1) { + devtools$1.enabled = true; + buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args)); + buffer = []; + } else if ( + // handle late devtools injection - only do this if we are in an actual + // browser environment to avoid the timer handle stalling test runner exit + // (#4815) + typeof window !== "undefined" && // some envs mock window but not fully + window.HTMLElement && // also exclude jsdom + // eslint-disable-next-line no-restricted-syntax + !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom")) + ) { + const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; + replay.push((newHook) => { + setDevtoolsHook$1(newHook, target); + }); + setTimeout(() => { + if (!devtools$1) { + target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; + buffer = []; + } + }, 3e3); + } else { + buffer = []; + } +} +let currentRenderingInstance = null; +let currentScopeId = null; +function setCurrentRenderingInstance(instance) { + const prev = currentRenderingInstance; + currentRenderingInstance = instance; + currentScopeId = instance && instance.type.__scopeId || null; + return prev; +} +function pushScopeId(id) { + currentScopeId = id; +} +function popScopeId() { + currentScopeId = null; +} +const withScopeId = (_id) => withCtx; +function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { + if (!ctx) return fn; + if (fn._n) { + return fn; + } + const renderFnWithContext = (...args) => { + if (renderFnWithContext._d) { + setBlockTracking(-1); + } + const prevInstance = setCurrentRenderingInstance(ctx); + let res; + try { + res = fn(...args); + } finally { + setCurrentRenderingInstance(prevInstance); + if (renderFnWithContext._d) { + setBlockTracking(1); + } + } + return res; + }; + renderFnWithContext._n = true; + renderFnWithContext._c = true; + renderFnWithContext._d = true; + return renderFnWithContext; +} +function withDirectives(vnode, directives) { + if (currentRenderingInstance === null) { + return vnode; + } + const instance = getComponentPublicInstance(currentRenderingInstance); + const bindings = vnode.dirs || (vnode.dirs = []); + for (let i = 0; i < directives.length; i++) { + let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]; + if (dir) { + if (isFunction(dir)) { + dir = { + mounted: dir, + updated: dir + }; + } + if (dir.deep) { + traverse(value); + } + bindings.push({ + dir, + instance, + value, + oldValue: void 0, + arg, + modifiers + }); + } + } + return vnode; +} +function invokeDirectiveHook(vnode, prevVNode, instance, name) { + const bindings = vnode.dirs; + const oldBindings = prevVNode && prevVNode.dirs; + for (let i = 0; i < bindings.length; i++) { + const binding = bindings[i]; + if (oldBindings) { + binding.oldValue = oldBindings[i].value; + } + let hook = binding.dir[name]; + if (hook) { + pauseTracking(); + callWithAsyncErrorHandling(hook, instance, 8, [ + vnode.el, + binding, + vnode, + prevVNode + ]); + resetTracking(); + } + } +} +const TeleportEndKey = Symbol("_vte"); +const isTeleport = (type) => type.__isTeleport; +const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === ""); +const isTeleportDeferred = (props) => props && (props.defer || props.defer === ""); +const isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement; +const isTargetMathML = (target) => typeof MathMLElement === "function" && target instanceof MathMLElement; +const resolveTarget = (props, select) => { + const targetSelector = props && props.to; + if (isString(targetSelector)) { + if (!select) { + return null; + } else { + const target = select(targetSelector); + return target; + } + } else { + return targetSelector; + } +}; +const TeleportImpl = { + name: "Teleport", + __isTeleport: true, + process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) { + const { + mc: mountChildren, + pc: patchChildren, + pbc: patchBlockChildren, + o: { insert, querySelector, createText, createComment } + } = internals; + const disabled = isTeleportDisabled(n2.props); + let { shapeFlag, children, dynamicChildren } = n2; + if (n1 == null) { + const placeholder = n2.el = createText(""); + const mainAnchor = n2.anchor = createText(""); + insert(placeholder, container, anchor); + insert(mainAnchor, container, anchor); + const mount = (container2, anchor2) => { + if (shapeFlag & 16) { + if (parentComponent && parentComponent.isCE) { + parentComponent.ce._teleportTarget = container2; + } + mountChildren( + children, + container2, + anchor2, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + }; + const mountToTarget = () => { + const target = n2.target = resolveTarget(n2.props, querySelector); + const targetAnchor = prepareAnchor(target, n2, createText, insert); + if (target) { + if (namespace !== "svg" && isTargetSVG(target)) { + namespace = "svg"; + } else if (namespace !== "mathml" && isTargetMathML(target)) { + namespace = "mathml"; + } + if (!disabled) { + mount(target, targetAnchor); + updateCssVars(n2, false); + } + } + }; + if (disabled) { + mount(container, mainAnchor); + updateCssVars(n2, true); + } + if (isTeleportDeferred(n2.props)) { + queuePostRenderEffect(() => { + mountToTarget(); + n2.el.__isMounted = true; + }, parentSuspense); + } else { + mountToTarget(); + } + } else { + if (isTeleportDeferred(n2.props) && !n1.el.__isMounted) { + queuePostRenderEffect(() => { + TeleportImpl.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + internals + ); + delete n1.el.__isMounted; + }, parentSuspense); + return; + } + n2.el = n1.el; + n2.targetStart = n1.targetStart; + const mainAnchor = n2.anchor = n1.anchor; + const target = n2.target = n1.target; + const targetAnchor = n2.targetAnchor = n1.targetAnchor; + const wasDisabled = isTeleportDisabled(n1.props); + const currentContainer = wasDisabled ? container : target; + const currentAnchor = wasDisabled ? mainAnchor : targetAnchor; + if (namespace === "svg" || isTargetSVG(target)) { + namespace = "svg"; + } else if (namespace === "mathml" || isTargetMathML(target)) { + namespace = "mathml"; + } + if (dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + currentContainer, + parentComponent, + parentSuspense, + namespace, + slotScopeIds + ); + traverseStaticChildren(n1, n2, true); + } else if (!optimized) { + patchChildren( + n1, + n2, + currentContainer, + currentAnchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + false + ); + } + if (disabled) { + if (!wasDisabled) { + moveTeleport( + n2, + container, + mainAnchor, + internals, + 1 + ); + } else { + if (n2.props && n1.props && n2.props.to !== n1.props.to) { + n2.props.to = n1.props.to; + } + } + } else { + if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) { + const nextTarget = n2.target = resolveTarget( + n2.props, + querySelector + ); + if (nextTarget) { + moveTeleport( + n2, + nextTarget, + null, + internals, + 0 + ); + } + } else if (wasDisabled) { + moveTeleport( + n2, + target, + targetAnchor, + internals, + 1 + ); + } + } + updateCssVars(n2, disabled); + } + }, + remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) { + const { + shapeFlag, + children, + anchor, + targetStart, + targetAnchor, + target, + props + } = vnode; + if (target) { + hostRemove(targetStart); + hostRemove(targetAnchor); + } + doRemove && hostRemove(anchor); + if (shapeFlag & 16) { + const shouldRemove = doRemove || !isTeleportDisabled(props); + for (let i = 0; i < children.length; i++) { + const child = children[i]; + unmount( + child, + parentComponent, + parentSuspense, + shouldRemove, + !!child.dynamicChildren + ); + } + } + }, + move: moveTeleport, + hydrate: hydrateTeleport +}; +function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) { + if (moveType === 0) { + insert(vnode.targetAnchor, container, parentAnchor); + } + const { el, anchor, shapeFlag, children, props } = vnode; + const isReorder = moveType === 2; + if (isReorder) { + insert(el, container, parentAnchor); + } + if (!isReorder || isTeleportDisabled(props)) { + if (shapeFlag & 16) { + for (let i = 0; i < children.length; i++) { + move( + children[i], + container, + parentAnchor, + 2 + ); + } + } + } + if (isReorder) { + insert(anchor, container, parentAnchor); + } +} +function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, { + o: { nextSibling, parentNode, querySelector, insert, createText } +}, hydrateChildren) { + const target = vnode.target = resolveTarget( + vnode.props, + querySelector + ); + if (target) { + const disabled = isTeleportDisabled(vnode.props); + const targetNode = target._lpa || target.firstChild; + if (vnode.shapeFlag & 16) { + if (disabled) { + vnode.anchor = hydrateChildren( + nextSibling(node), + vnode, + parentNode(node), + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + vnode.targetStart = targetNode; + vnode.targetAnchor = targetNode && nextSibling(targetNode); + } else { + vnode.anchor = nextSibling(node); + let targetAnchor = targetNode; + while (targetAnchor) { + if (targetAnchor && targetAnchor.nodeType === 8) { + if (targetAnchor.data === "teleport start anchor") { + vnode.targetStart = targetAnchor; + } else if (targetAnchor.data === "teleport anchor") { + vnode.targetAnchor = targetAnchor; + target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor); + break; + } + } + targetAnchor = nextSibling(targetAnchor); + } + if (!vnode.targetAnchor) { + prepareAnchor(target, vnode, createText, insert); + } + hydrateChildren( + targetNode && nextSibling(targetNode), + vnode, + target, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } + } + updateCssVars(vnode, disabled); + } + return vnode.anchor && nextSibling(vnode.anchor); +} +const Teleport = TeleportImpl; +function updateCssVars(vnode, isDisabled) { + const ctx = vnode.ctx; + if (ctx && ctx.ut) { + let node, anchor; + if (isDisabled) { + node = vnode.el; + anchor = vnode.anchor; + } else { + node = vnode.targetStart; + anchor = vnode.targetAnchor; + } + while (node && node !== anchor) { + if (node.nodeType === 1) node.setAttribute("data-v-owner", ctx.uid); + node = node.nextSibling; + } + ctx.ut(); + } +} +function prepareAnchor(target, vnode, createText, insert) { + const targetStart = vnode.targetStart = createText(""); + const targetAnchor = vnode.targetAnchor = createText(""); + targetStart[TeleportEndKey] = targetAnchor; + if (target) { + insert(targetStart, target); + insert(targetAnchor, target); + } + return targetAnchor; +} +const leaveCbKey = Symbol("_leaveCb"); +const enterCbKey = Symbol("_enterCb"); +function useTransitionState() { + const state = { + isMounted: false, + isLeaving: false, + isUnmounting: false, + leavingVNodes: /* @__PURE__ */ new Map() + }; + onMounted(() => { + state.isMounted = true; + }); + onBeforeUnmount(() => { + state.isUnmounting = true; + }); + return state; +} +const TransitionHookValidator = [Function, Array]; +const BaseTransitionPropsValidators = { + mode: String, + appear: Boolean, + persisted: Boolean, + // enter + onBeforeEnter: TransitionHookValidator, + onEnter: TransitionHookValidator, + onAfterEnter: TransitionHookValidator, + onEnterCancelled: TransitionHookValidator, + // leave + onBeforeLeave: TransitionHookValidator, + onLeave: TransitionHookValidator, + onAfterLeave: TransitionHookValidator, + onLeaveCancelled: TransitionHookValidator, + // appear + onBeforeAppear: TransitionHookValidator, + onAppear: TransitionHookValidator, + onAfterAppear: TransitionHookValidator, + onAppearCancelled: TransitionHookValidator +}; +const recursiveGetSubtree = (instance) => { + const subTree = instance.subTree; + return subTree.component ? recursiveGetSubtree(subTree.component) : subTree; +}; +const BaseTransitionImpl = { + name: `BaseTransition`, + props: BaseTransitionPropsValidators, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const state = useTransitionState(); + return () => { + const children = slots.default && getTransitionRawChildren(slots.default(), true); + if (!children || !children.length) { + return; + } + const child = findNonCommentChild(children); + const rawProps = toRaw(props); + const { mode } = rawProps; + if (state.isLeaving) { + return emptyPlaceholder(child); + } + const innerChild = getInnerChild$1(child); + if (!innerChild) { + return emptyPlaceholder(child); + } + let enterHooks = resolveTransitionHooks( + innerChild, + rawProps, + state, + instance, + // #11061, ensure enterHooks is fresh after clone + (hooks) => enterHooks = hooks + ); + if (innerChild.type !== Comment) { + setTransitionHooks(innerChild, enterHooks); + } + let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree); + if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) { + let leavingHooks = resolveTransitionHooks( + oldInnerChild, + rawProps, + state, + instance + ); + setTransitionHooks(oldInnerChild, leavingHooks); + if (mode === "out-in" && innerChild.type !== Comment) { + state.isLeaving = true; + leavingHooks.afterLeave = () => { + state.isLeaving = false; + if (!(instance.job.flags & 8)) { + instance.update(); + } + delete leavingHooks.afterLeave; + oldInnerChild = void 0; + }; + return emptyPlaceholder(child); + } else if (mode === "in-out" && innerChild.type !== Comment) { + leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { + const leavingVNodesCache = getLeavingNodesForType( + state, + oldInnerChild + ); + leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; + el[leaveCbKey] = () => { + earlyRemove(); + el[leaveCbKey] = void 0; + delete enterHooks.delayedLeave; + oldInnerChild = void 0; + }; + enterHooks.delayedLeave = () => { + delayedLeave(); + delete enterHooks.delayedLeave; + oldInnerChild = void 0; + }; + }; + } else { + oldInnerChild = void 0; + } + } else if (oldInnerChild) { + oldInnerChild = void 0; + } + return child; + }; + } +}; +function findNonCommentChild(children) { + let child = children[0]; + if (children.length > 1) { + for (const c of children) { + if (c.type !== Comment) { + child = c; + break; + } + } + } + return child; +} +const BaseTransition = BaseTransitionImpl; +function getLeavingNodesForType(state, vnode) { + const { leavingVNodes } = state; + let leavingVNodesCache = leavingVNodes.get(vnode.type); + if (!leavingVNodesCache) { + leavingVNodesCache = /* @__PURE__ */ Object.create(null); + leavingVNodes.set(vnode.type, leavingVNodesCache); + } + return leavingVNodesCache; +} +function resolveTransitionHooks(vnode, props, state, instance, postClone) { + const { + appear, + mode, + persisted = false, + onBeforeEnter, + onEnter, + onAfterEnter, + onEnterCancelled, + onBeforeLeave, + onLeave, + onAfterLeave, + onLeaveCancelled, + onBeforeAppear, + onAppear, + onAfterAppear, + onAppearCancelled + } = props; + const key = String(vnode.key); + const leavingVNodesCache = getLeavingNodesForType(state, vnode); + const callHook2 = (hook, args) => { + hook && callWithAsyncErrorHandling( + hook, + instance, + 9, + args + ); + }; + const callAsyncHook = (hook, args) => { + const done = args[1]; + callHook2(hook, args); + if (isArray(hook)) { + if (hook.every((hook2) => hook2.length <= 1)) done(); + } else if (hook.length <= 1) { + done(); + } + }; + const hooks = { + mode, + persisted, + beforeEnter(el) { + let hook = onBeforeEnter; + if (!state.isMounted) { + if (appear) { + hook = onBeforeAppear || onBeforeEnter; + } else { + return; + } + } + if (el[leaveCbKey]) { + el[leaveCbKey]( + true + /* cancelled */ + ); + } + const leavingVNode = leavingVNodesCache[key]; + if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) { + leavingVNode.el[leaveCbKey](); + } + callHook2(hook, [el]); + }, + enter(el) { + let hook = onEnter; + let afterHook = onAfterEnter; + let cancelHook = onEnterCancelled; + if (!state.isMounted) { + if (appear) { + hook = onAppear || onEnter; + afterHook = onAfterAppear || onAfterEnter; + cancelHook = onAppearCancelled || onEnterCancelled; + } else { + return; + } + } + let called = false; + const done = el[enterCbKey] = (cancelled) => { + if (called) return; + called = true; + if (cancelled) { + callHook2(cancelHook, [el]); + } else { + callHook2(afterHook, [el]); + } + if (hooks.delayedLeave) { + hooks.delayedLeave(); + } + el[enterCbKey] = void 0; + }; + if (hook) { + callAsyncHook(hook, [el, done]); + } else { + done(); + } + }, + leave(el, remove2) { + const key2 = String(vnode.key); + if (el[enterCbKey]) { + el[enterCbKey]( + true + /* cancelled */ + ); + } + if (state.isUnmounting) { + return remove2(); + } + callHook2(onBeforeLeave, [el]); + let called = false; + const done = el[leaveCbKey] = (cancelled) => { + if (called) return; + called = true; + remove2(); + if (cancelled) { + callHook2(onLeaveCancelled, [el]); + } else { + callHook2(onAfterLeave, [el]); + } + el[leaveCbKey] = void 0; + if (leavingVNodesCache[key2] === vnode) { + delete leavingVNodesCache[key2]; + } + }; + leavingVNodesCache[key2] = vnode; + if (onLeave) { + callAsyncHook(onLeave, [el, done]); + } else { + done(); + } + }, + clone(vnode2) { + const hooks2 = resolveTransitionHooks( + vnode2, + props, + state, + instance, + postClone + ); + if (postClone) postClone(hooks2); + return hooks2; + } + }; + return hooks; +} +function emptyPlaceholder(vnode) { + if (isKeepAlive(vnode)) { + vnode = cloneVNode(vnode); + vnode.children = null; + return vnode; + } +} +function getInnerChild$1(vnode) { + if (!isKeepAlive(vnode)) { + if (isTeleport(vnode.type) && vnode.children) { + return findNonCommentChild(vnode.children); + } + return vnode; + } + const { shapeFlag, children } = vnode; + if (children) { + if (shapeFlag & 16) { + return children[0]; + } + if (shapeFlag & 32 && isFunction(children.default)) { + return children.default(); + } + } +} +function setTransitionHooks(vnode, hooks) { + if (vnode.shapeFlag & 6 && vnode.component) { + vnode.transition = hooks; + setTransitionHooks(vnode.component.subTree, hooks); + } else if (vnode.shapeFlag & 128) { + vnode.ssContent.transition = hooks.clone(vnode.ssContent); + vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); + } else { + vnode.transition = hooks; + } +} +function getTransitionRawChildren(children, keepComment = false, parentKey) { + let ret = []; + let keyedFragmentCount = 0; + for (let i = 0; i < children.length; i++) { + let child = children[i]; + const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); + if (child.type === Fragment) { + if (child.patchFlag & 128) keyedFragmentCount++; + ret = ret.concat( + getTransitionRawChildren(child.children, keepComment, key) + ); + } else if (keepComment || child.type !== Comment) { + ret.push(key != null ? cloneVNode(child, { key }) : child); + } + } + if (keyedFragmentCount > 1) { + for (let i = 0; i < ret.length; i++) { + ret[i].patchFlag = -2; + } + } + return ret; +} +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function defineComponent(options, extraOptions) { + return isFunction(options) ? ( + // #8236: extend call and options.name access are considered side-effects + // by Rollup, so we have to wrap it in a pure-annotated IIFE. + /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))() + ) : options; +} +function useId() { + const i = getCurrentInstance(); + if (i) { + return (i.appContext.config.idPrefix || "v") + "-" + i.ids[0] + i.ids[1]++; + } + return ""; +} +function markAsyncBoundary(instance) { + instance.ids = [instance.ids[0] + instance.ids[2]++ + "-", 0, 0]; +} +function useTemplateRef(key) { + const i = getCurrentInstance(); + const r = shallowRef(null); + if (i) { + const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs; + { + Object.defineProperty(refs, key, { + enumerable: true, + get: () => r.value, + set: (val) => r.value = val + }); + } + } + const ret = r; + return ret; +} +function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { + if (isArray(rawRef)) { + rawRef.forEach( + (r, i) => setRef( + r, + oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef), + parentSuspense, + vnode, + isUnmount + ) + ); + return; + } + if (isAsyncWrapper(vnode) && !isUnmount) { + if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) { + setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree); + } + return; + } + const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el; + const value = isUnmount ? null : refValue; + const { i: owner, r: ref3 } = rawRef; + const oldRef = oldRawRef && oldRawRef.r; + const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs; + const setupState = owner.setupState; + const rawSetupState = toRaw(setupState); + const canSetSetupRef = setupState === EMPTY_OBJ ? () => false : (key) => { + return hasOwn(rawSetupState, key); + }; + if (oldRef != null && oldRef !== ref3) { + if (isString(oldRef)) { + refs[oldRef] = null; + if (canSetSetupRef(oldRef)) { + setupState[oldRef] = null; + } + } else if (isRef(oldRef)) { + oldRef.value = null; + } + } + if (isFunction(ref3)) { + callWithErrorHandling(ref3, owner, 12, [value, refs]); + } else { + const _isString = isString(ref3); + const _isRef = isRef(ref3); + if (_isString || _isRef) { + const doSet = () => { + if (rawRef.f) { + const existing = _isString ? canSetSetupRef(ref3) ? setupState[ref3] : refs[ref3] : ref3.value; + if (isUnmount) { + isArray(existing) && remove(existing, refValue); + } else { + if (!isArray(existing)) { + if (_isString) { + refs[ref3] = [refValue]; + if (canSetSetupRef(ref3)) { + setupState[ref3] = refs[ref3]; + } + } else { + ref3.value = [refValue]; + if (rawRef.k) refs[rawRef.k] = ref3.value; + } + } else if (!existing.includes(refValue)) { + existing.push(refValue); + } + } + } else if (_isString) { + refs[ref3] = value; + if (canSetSetupRef(ref3)) { + setupState[ref3] = value; + } + } else if (_isRef) { + ref3.value = value; + if (rawRef.k) refs[rawRef.k] = value; + } else ; + }; + if (value) { + doSet.id = -1; + queuePostRenderEffect(doSet, parentSuspense); + } else { + doSet(); + } + } + } +} +let hasLoggedMismatchError = false; +const logMismatchError = () => { + if (hasLoggedMismatchError) { + return; + } + console.error("Hydration completed but contains mismatches."); + hasLoggedMismatchError = true; +}; +const isSVGContainer = (container) => container.namespaceURI.includes("svg") && container.tagName !== "foreignObject"; +const isMathMLContainer = (container) => container.namespaceURI.includes("MathML"); +const getContainerType = (container) => { + if (container.nodeType !== 1) return void 0; + if (isSVGContainer(container)) return "svg"; + if (isMathMLContainer(container)) return "mathml"; + return void 0; +}; +const isComment = (node) => node.nodeType === 8; +function createHydrationFunctions(rendererInternals) { + const { + mt: mountComponent, + p: patch, + o: { + patchProp, + createText, + nextSibling, + parentNode, + remove: remove2, + insert, + createComment + } + } = rendererInternals; + const hydrate = (vnode, container) => { + if (!container.hasChildNodes()) { + patch(null, vnode, container); + flushPostFlushCbs(); + container._vnode = vnode; + return; + } + hydrateNode(container.firstChild, vnode, null, null, null); + flushPostFlushCbs(); + container._vnode = vnode; + }; + const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => { + optimized = optimized || !!vnode.dynamicChildren; + const isFragmentStart = isComment(node) && node.data === "["; + const onMismatch = () => handleMismatch( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + isFragmentStart + ); + const { type, ref: ref3, shapeFlag, patchFlag } = vnode; + let domType = node.nodeType; + vnode.el = node; + if (patchFlag === -2) { + optimized = false; + vnode.dynamicChildren = null; + } + let nextNode = null; + switch (type) { + case Text: + if (domType !== 3) { + if (vnode.children === "") { + insert(vnode.el = createText(""), parentNode(node), node); + nextNode = node; + } else { + nextNode = onMismatch(); + } + } else { + if (node.data !== vnode.children) { + logMismatchError(); + node.data = vnode.children; + } + nextNode = nextSibling(node); + } + break; + case Comment: + if (isTemplateNode(node)) { + nextNode = nextSibling(node); + replaceNode( + vnode.el = node.content.firstChild, + node, + parentComponent + ); + } else if (domType !== 8 || isFragmentStart) { + nextNode = onMismatch(); + } else { + nextNode = nextSibling(node); + } + break; + case Static: + if (isFragmentStart) { + node = nextSibling(node); + domType = node.nodeType; + } + if (domType === 1 || domType === 3) { + nextNode = node; + const needToAdoptContent = !vnode.children.length; + for (let i = 0; i < vnode.staticCount; i++) { + if (needToAdoptContent) + vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data; + if (i === vnode.staticCount - 1) { + vnode.anchor = nextNode; + } + nextNode = nextSibling(nextNode); + } + return isFragmentStart ? nextSibling(nextNode) : nextNode; + } else { + onMismatch(); + } + break; + case Fragment: + if (!isFragmentStart) { + nextNode = onMismatch(); + } else { + nextNode = hydrateFragment( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } + break; + default: + if (shapeFlag & 1) { + if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) { + nextNode = onMismatch(); + } else { + nextNode = hydrateElement( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } + } else if (shapeFlag & 6) { + vnode.slotScopeIds = slotScopeIds; + const container = parentNode(node); + if (isFragmentStart) { + nextNode = locateClosingAnchor(node); + } else if (isComment(node) && node.data === "teleport start") { + nextNode = locateClosingAnchor(node, node.data, "teleport end"); + } else { + nextNode = nextSibling(node); + } + mountComponent( + vnode, + container, + null, + parentComponent, + parentSuspense, + getContainerType(container), + optimized + ); + if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) { + let subTree; + if (isFragmentStart) { + subTree = createVNode(Fragment); + subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild; + } else { + subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div"); + } + subTree.el = node; + vnode.component.subTree = subTree; + } + } else if (shapeFlag & 64) { + if (domType !== 8) { + nextNode = onMismatch(); + } else { + nextNode = vnode.type.hydrate( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized, + rendererInternals, + hydrateChildren + ); + } + } else if (shapeFlag & 128) { + nextNode = vnode.type.hydrate( + node, + vnode, + parentComponent, + parentSuspense, + getContainerType(parentNode(node)), + slotScopeIds, + optimized, + rendererInternals, + hydrateNode + ); + } else ; + } + if (ref3 != null) { + setRef(ref3, null, parentSuspense, vnode); + } + return nextNode; + }; + const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { + optimized = optimized || !!vnode.dynamicChildren; + const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode; + const forcePatch = type === "input" || type === "option"; + if (forcePatch || patchFlag !== -1) { + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "created"); + } + let needCallTransitionHooks = false; + if (isTemplateNode(el)) { + needCallTransitionHooks = needTransition( + null, + // no need check parentSuspense in hydration + transition + ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear; + const content = el.content.firstChild; + if (needCallTransitionHooks) { + transition.beforeEnter(content); + } + replaceNode(content, el, parentComponent); + vnode.el = el = content; + } + if (shapeFlag & 16 && // skip if element has innerHTML / textContent + !(props && (props.innerHTML || props.textContent))) { + let next = hydrateChildren( + el.firstChild, + vnode, + el, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + while (next) { + if (!isMismatchAllowed( + el, + 1 + /* CHILDREN */ + )) { + logMismatchError(); + } + const cur = next; + next = next.nextSibling; + remove2(cur); + } + } else if (shapeFlag & 8) { + let clientText = vnode.children; + if (clientText[0] === "\n" && (el.tagName === "PRE" || el.tagName === "TEXTAREA")) { + clientText = clientText.slice(1); + } + if (el.textContent !== clientText) { + if (!isMismatchAllowed( + el, + 0 + /* TEXT */ + )) { + logMismatchError(); + } + el.textContent = vnode.children; + } + } + if (props) { + if (forcePatch || !optimized || patchFlag & (16 | 32)) { + const isCustomElement = el.tagName.includes("-"); + for (const key in props) { + if (forcePatch && (key.endsWith("value") || key === "indeterminate") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers + key[0] === "." || isCustomElement) { + patchProp(el, key, null, props[key], void 0, parentComponent); + } + } + } else if (props.onClick) { + patchProp( + el, + "onClick", + null, + props.onClick, + void 0, + parentComponent + ); + } else if (patchFlag & 4 && isReactive(props.style)) { + for (const key in props.style) props.style[key]; + } + } + let vnodeHooks; + if (vnodeHooks = props && props.onVnodeBeforeMount) { + invokeVNodeHook(vnodeHooks, parentComponent, vnode); + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); + } + if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) { + queueEffectWithSuspense(() => { + vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode); + needCallTransitionHooks && transition.enter(el); + dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); + }, parentSuspense); + } + } + return el.nextSibling; + }; + const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => { + optimized = optimized || !!parentVNode.dynamicChildren; + const children = parentVNode.children; + const l = children.length; + for (let i = 0; i < l; i++) { + const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]); + const isText = vnode.type === Text; + if (node) { + if (isText && !optimized) { + if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) { + insert( + createText( + node.data.slice(vnode.children.length) + ), + container, + nextSibling(node) + ); + node.data = vnode.children; + } + } + node = hydrateNode( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } else if (isText && !vnode.children) { + insert(vnode.el = createText(""), container); + } else { + if (!isMismatchAllowed( + container, + 1 + /* CHILDREN */ + )) { + logMismatchError(); + } + patch( + null, + vnode, + container, + null, + parentComponent, + parentSuspense, + getContainerType(container), + slotScopeIds + ); + } + } + return node; + }; + const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { + const { slotScopeIds: fragmentSlotScopeIds } = vnode; + if (fragmentSlotScopeIds) { + slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; + } + const container = parentNode(node); + const next = hydrateChildren( + nextSibling(node), + vnode, + container, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + if (next && isComment(next) && next.data === "]") { + return nextSibling(vnode.anchor = next); + } else { + logMismatchError(); + insert(vnode.anchor = createComment(`]`), container, next); + return next; + } + }; + const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => { + if (!isMismatchAllowed( + node.parentElement, + 1 + /* CHILDREN */ + )) { + logMismatchError(); + } + vnode.el = null; + if (isFragment) { + const end = locateClosingAnchor(node); + while (true) { + const next2 = nextSibling(node); + if (next2 && next2 !== end) { + remove2(next2); + } else { + break; + } + } + } + const next = nextSibling(node); + const container = parentNode(node); + remove2(node); + patch( + null, + vnode, + container, + next, + parentComponent, + parentSuspense, + getContainerType(container), + slotScopeIds + ); + if (parentComponent) { + parentComponent.vnode.el = vnode.el; + updateHOCHostEl(parentComponent, vnode.el); + } + return next; + }; + const locateClosingAnchor = (node, open = "[", close = "]") => { + let match = 0; + while (node) { + node = nextSibling(node); + if (node && isComment(node)) { + if (node.data === open) match++; + if (node.data === close) { + if (match === 0) { + return nextSibling(node); + } else { + match--; + } + } + } + } + return node; + }; + const replaceNode = (newNode, oldNode, parentComponent) => { + const parentNode2 = oldNode.parentNode; + if (parentNode2) { + parentNode2.replaceChild(newNode, oldNode); + } + let parent = parentComponent; + while (parent) { + if (parent.vnode.el === oldNode) { + parent.vnode.el = parent.subTree.el = newNode; + } + parent = parent.parent; + } + }; + const isTemplateNode = (node) => { + return node.nodeType === 1 && node.tagName === "TEMPLATE"; + }; + return [hydrate, hydrateNode]; +} +const allowMismatchAttr = "data-allow-mismatch"; +const MismatchTypeString = { + [ + 0 + /* TEXT */ + ]: "text", + [ + 1 + /* CHILDREN */ + ]: "children", + [ + 2 + /* CLASS */ + ]: "class", + [ + 3 + /* STYLE */ + ]: "style", + [ + 4 + /* ATTRIBUTE */ + ]: "attribute" +}; +function isMismatchAllowed(el, allowedType) { + if (allowedType === 0 || allowedType === 1) { + while (el && !el.hasAttribute(allowMismatchAttr)) { + el = el.parentElement; + } + } + const allowedAttr = el && el.getAttribute(allowMismatchAttr); + if (allowedAttr == null) { + return false; + } else if (allowedAttr === "") { + return true; + } else { + const list = allowedAttr.split(","); + if (allowedType === 0 && list.includes("children")) { + return true; + } + return allowedAttr.split(",").includes(MismatchTypeString[allowedType]); + } +} +const requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1)); +const cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id)); +const hydrateOnIdle = (timeout = 1e4) => (hydrate) => { + const id = requestIdleCallback(hydrate, { timeout }); + return () => cancelIdleCallback(id); +}; +function elementIsVisibleInViewport(el) { + const { top, left, bottom, right } = el.getBoundingClientRect(); + const { innerHeight, innerWidth } = window; + return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth); +} +const hydrateOnVisible = (opts) => (hydrate, forEach) => { + const ob = new IntersectionObserver((entries) => { + for (const e of entries) { + if (!e.isIntersecting) continue; + ob.disconnect(); + hydrate(); + break; + } + }, opts); + forEach((el) => { + if (!(el instanceof Element)) return; + if (elementIsVisibleInViewport(el)) { + hydrate(); + ob.disconnect(); + return false; + } + ob.observe(el); + }); + return () => ob.disconnect(); +}; +const hydrateOnMediaQuery = (query) => (hydrate) => { + if (query) { + const mql = matchMedia(query); + if (mql.matches) { + hydrate(); + } else { + mql.addEventListener("change", hydrate, { once: true }); + return () => mql.removeEventListener("change", hydrate); + } + } +}; +const hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => { + if (isString(interactions)) interactions = [interactions]; + let hasHydrated = false; + const doHydrate = (e) => { + if (!hasHydrated) { + hasHydrated = true; + teardown(); + hydrate(); + e.target.dispatchEvent(new e.constructor(e.type, e)); + } + }; + const teardown = () => { + forEach((el) => { + for (const i of interactions) { + el.removeEventListener(i, doHydrate); + } + }); + }; + forEach((el) => { + for (const i of interactions) { + el.addEventListener(i, doHydrate, { once: true }); + } + }); + return teardown; +}; +function forEachElement(node, cb) { + if (isComment(node) && node.data === "[") { + let depth = 1; + let next = node.nextSibling; + while (next) { + if (next.nodeType === 1) { + const result = cb(next); + if (result === false) { + break; + } + } else if (isComment(next)) { + if (next.data === "]") { + if (--depth === 0) break; + } else if (next.data === "[") { + depth++; + } + } + next = next.nextSibling; + } + } else { + cb(node); + } +} +const isAsyncWrapper = (i) => !!i.type.__asyncLoader; +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function defineAsyncComponent(source) { + if (isFunction(source)) { + source = { loader: source }; + } + const { + loader, + loadingComponent, + errorComponent, + delay = 200, + hydrate: hydrateStrategy, + timeout, + // undefined = never times out + suspensible = true, + onError: userOnError + } = source; + let pendingRequest = null; + let resolvedComp; + let retries = 0; + const retry = () => { + retries++; + pendingRequest = null; + return load(); + }; + const load = () => { + let thisRequest; + return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => { + err = err instanceof Error ? err : new Error(String(err)); + if (userOnError) { + return new Promise((resolve2, reject) => { + const userRetry = () => resolve2(retry()); + const userFail = () => reject(err); + userOnError(err, userRetry, userFail, retries + 1); + }); + } else { + throw err; + } + }).then((comp) => { + if (thisRequest !== pendingRequest && pendingRequest) { + return pendingRequest; + } + if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) { + comp = comp.default; + } + resolvedComp = comp; + return comp; + })); + }; + return /* @__PURE__ */ defineComponent({ + name: "AsyncComponentWrapper", + __asyncLoader: load, + __asyncHydrate(el, instance, hydrate) { + const doHydrate = hydrateStrategy ? () => { + const teardown = hydrateStrategy( + hydrate, + (cb) => forEachElement(el, cb) + ); + if (teardown) { + (instance.bum || (instance.bum = [])).push(teardown); + } + } : hydrate; + if (resolvedComp) { + doHydrate(); + } else { + load().then(() => !instance.isUnmounted && doHydrate()); + } + }, + get __asyncResolved() { + return resolvedComp; + }, + setup() { + const instance = currentInstance; + markAsyncBoundary(instance); + if (resolvedComp) { + return () => createInnerComp(resolvedComp, instance); + } + const onError = (err) => { + pendingRequest = null; + handleError( + err, + instance, + 13, + !errorComponent + ); + }; + if (suspensible && instance.suspense || isInSSRComponentSetup) { + return load().then((comp) => { + return () => createInnerComp(comp, instance); + }).catch((err) => { + onError(err); + return () => errorComponent ? createVNode(errorComponent, { + error: err + }) : null; + }); + } + const loaded = ref(false); + const error = ref(); + const delayed = ref(!!delay); + if (delay) { + setTimeout(() => { + delayed.value = false; + }, delay); + } + if (timeout != null) { + setTimeout(() => { + if (!loaded.value && !error.value) { + const err = new Error( + `Async component timed out after ${timeout}ms.` + ); + onError(err); + error.value = err; + } + }, timeout); + } + load().then(() => { + loaded.value = true; + if (instance.parent && isKeepAlive(instance.parent.vnode)) { + instance.parent.update(); + } + }).catch((err) => { + onError(err); + error.value = err; + }); + return () => { + if (loaded.value && resolvedComp) { + return createInnerComp(resolvedComp, instance); + } else if (error.value && errorComponent) { + return createVNode(errorComponent, { + error: error.value + }); + } else if (loadingComponent && !delayed.value) { + return createVNode(loadingComponent); + } + }; + } + }); +} +function createInnerComp(comp, parent) { + const { ref: ref22, props, children, ce } = parent.vnode; + const vnode = createVNode(comp, props, children); + vnode.ref = ref22; + vnode.ce = ce; + delete parent.vnode.ce; + return vnode; +} +const isKeepAlive = (vnode) => vnode.type.__isKeepAlive; +const KeepAliveImpl = { + name: `KeepAlive`, + // Marker for special handling inside the renderer. We are not using a === + // check directly on KeepAlive in the renderer, because importing it directly + // would prevent it from being tree-shaken. + __isKeepAlive: true, + props: { + include: [String, RegExp, Array], + exclude: [String, RegExp, Array], + max: [String, Number] + }, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const sharedContext = instance.ctx; + if (!sharedContext.renderer) { + return () => { + const children = slots.default && slots.default(); + return children && children.length === 1 ? children[0] : children; + }; + } + const cache = /* @__PURE__ */ new Map(); + const keys = /* @__PURE__ */ new Set(); + let current = null; + const parentSuspense = instance.suspense; + const { + renderer: { + p: patch, + m: move, + um: _unmount, + o: { createElement } + } + } = sharedContext; + const storageContainer = createElement("div"); + sharedContext.activate = (vnode, container, anchor, namespace, optimized) => { + const instance2 = vnode.component; + move(vnode, container, anchor, 0, parentSuspense); + patch( + instance2.vnode, + vnode, + container, + anchor, + instance2, + parentSuspense, + namespace, + vnode.slotScopeIds, + optimized + ); + queuePostRenderEffect(() => { + instance2.isDeactivated = false; + if (instance2.a) { + invokeArrayFns(instance2.a); + } + const vnodeHook = vnode.props && vnode.props.onVnodeMounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + }, parentSuspense); + }; + sharedContext.deactivate = (vnode) => { + const instance2 = vnode.component; + invalidateMount(instance2.m); + invalidateMount(instance2.a); + move(vnode, storageContainer, null, 1, parentSuspense); + queuePostRenderEffect(() => { + if (instance2.da) { + invokeArrayFns(instance2.da); + } + const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + instance2.isDeactivated = true; + }, parentSuspense); + }; + function unmount(vnode) { + resetShapeFlag(vnode); + _unmount(vnode, instance, parentSuspense, true); + } + function pruneCache(filter) { + cache.forEach((vnode, key) => { + const name = getComponentName(vnode.type); + if (name && !filter(name)) { + pruneCacheEntry(key); + } + }); + } + function pruneCacheEntry(key) { + const cached = cache.get(key); + if (cached && (!current || !isSameVNodeType(cached, current))) { + unmount(cached); + } else if (current) { + resetShapeFlag(current); + } + cache.delete(key); + keys.delete(key); + } + watch( + () => [props.include, props.exclude], + ([include, exclude]) => { + include && pruneCache((name) => matches(include, name)); + exclude && pruneCache((name) => !matches(exclude, name)); + }, + // prune post-render after `current` has been updated + { flush: "post", deep: true } + ); + let pendingCacheKey = null; + const cacheSubtree = () => { + if (pendingCacheKey != null) { + if (isSuspense(instance.subTree.type)) { + queuePostRenderEffect(() => { + cache.set(pendingCacheKey, getInnerChild(instance.subTree)); + }, instance.subTree.suspense); + } else { + cache.set(pendingCacheKey, getInnerChild(instance.subTree)); + } + } + }; + onMounted(cacheSubtree); + onUpdated(cacheSubtree); + onBeforeUnmount(() => { + cache.forEach((cached) => { + const { subTree, suspense } = instance; + const vnode = getInnerChild(subTree); + if (cached.type === vnode.type && cached.key === vnode.key) { + resetShapeFlag(vnode); + const da = vnode.component.da; + da && queuePostRenderEffect(da, suspense); + return; + } + unmount(cached); + }); + }); + return () => { + pendingCacheKey = null; + if (!slots.default) { + return current = null; + } + const children = slots.default(); + const rawVNode = children[0]; + if (children.length > 1) { + current = null; + return children; + } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) { + current = null; + return rawVNode; + } + let vnode = getInnerChild(rawVNode); + if (vnode.type === Comment) { + current = null; + return vnode; + } + const comp = vnode.type; + const name = getComponentName( + isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp + ); + const { include, exclude, max } = props; + if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) { + vnode.shapeFlag &= -257; + current = vnode; + return rawVNode; + } + const key = vnode.key == null ? comp : vnode.key; + const cachedVNode = cache.get(key); + if (vnode.el) { + vnode = cloneVNode(vnode); + if (rawVNode.shapeFlag & 128) { + rawVNode.ssContent = vnode; + } + } + pendingCacheKey = key; + if (cachedVNode) { + vnode.el = cachedVNode.el; + vnode.component = cachedVNode.component; + if (vnode.transition) { + setTransitionHooks(vnode, vnode.transition); + } + vnode.shapeFlag |= 512; + keys.delete(key); + keys.add(key); + } else { + keys.add(key); + if (max && keys.size > parseInt(max, 10)) { + pruneCacheEntry(keys.values().next().value); + } + } + vnode.shapeFlag |= 256; + current = vnode; + return isSuspense(rawVNode.type) ? rawVNode : vnode; + }; + } +}; +const KeepAlive = KeepAliveImpl; +function matches(pattern, name) { + if (isArray(pattern)) { + return pattern.some((p) => matches(p, name)); + } else if (isString(pattern)) { + return pattern.split(",").includes(name); + } else if (isRegExp(pattern)) { + pattern.lastIndex = 0; + return pattern.test(name); + } + return false; +} +function onActivated(hook, target) { + registerKeepAliveHook(hook, "a", target); +} +function onDeactivated(hook, target) { + registerKeepAliveHook(hook, "da", target); +} +function registerKeepAliveHook(hook, type, target = currentInstance) { + const wrappedHook = hook.__wdc || (hook.__wdc = () => { + let current = target; + while (current) { + if (current.isDeactivated) { + return; + } + current = current.parent; + } + return hook(); + }); + injectHook(type, wrappedHook, target); + if (target) { + let current = target.parent; + while (current && current.parent) { + if (isKeepAlive(current.parent.vnode)) { + injectToKeepAliveRoot(wrappedHook, type, target, current); + } + current = current.parent; + } + } +} +function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { + const injected = injectHook( + type, + hook, + keepAliveRoot, + true + /* prepend */ + ); + onUnmounted(() => { + remove(keepAliveRoot[type], injected); + }, target); +} +function resetShapeFlag(vnode) { + vnode.shapeFlag &= -257; + vnode.shapeFlag &= -513; +} +function getInnerChild(vnode) { + return vnode.shapeFlag & 128 ? vnode.ssContent : vnode; +} +function injectHook(type, hook, target = currentInstance, prepend = false) { + if (target) { + const hooks = target[type] || (target[type] = []); + const wrappedHook = hook.__weh || (hook.__weh = (...args) => { + pauseTracking(); + const reset = setCurrentInstance(target); + const res = callWithAsyncErrorHandling(hook, target, type, args); + reset(); + resetTracking(); + return res; + }); + if (prepend) { + hooks.unshift(wrappedHook); + } else { + hooks.push(wrappedHook); + } + return wrappedHook; + } +} +const createHook = (lifecycle) => (hook, target = currentInstance) => { + if (!isInSSRComponentSetup || lifecycle === "sp") { + injectHook(lifecycle, (...args) => hook(...args), target); + } +}; +const onBeforeMount = createHook("bm"); +const onMounted = createHook("m"); +const onBeforeUpdate = createHook( + "bu" +); +const onUpdated = createHook("u"); +const onBeforeUnmount = createHook( + "bum" +); +const onUnmounted = createHook("um"); +const onServerPrefetch = createHook( + "sp" +); +const onRenderTriggered = createHook("rtg"); +const onRenderTracked = createHook("rtc"); +function onErrorCaptured(hook, target = currentInstance) { + injectHook("ec", hook, target); +} +const COMPONENTS = "components"; +const DIRECTIVES = "directives"; +function resolveComponent(name, maybeSelfReference) { + return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; +} +const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); +function resolveDynamicComponent(component) { + if (isString(component)) { + return resolveAsset(COMPONENTS, component, false) || component; + } else { + return component || NULL_DYNAMIC_COMPONENT; + } +} +function resolveDirective(name) { + return resolveAsset(DIRECTIVES, name); +} +function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { + const instance = currentRenderingInstance || currentInstance; + if (instance) { + const Component = instance.type; + if (type === COMPONENTS) { + const selfName = getComponentName( + Component, + false + ); + if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) { + return Component; + } + } + const res = ( + // local registration + // check instance[type] first which is resolved for options API + resolve(instance[type] || Component[type], name) || // global registration + resolve(instance.appContext[type], name) + ); + if (!res && maybeSelfReference) { + return Component; + } + return res; + } +} +function resolve(registry, name) { + return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]); +} +function renderList(source, renderItem, cache, index) { + let ret; + const cached = cache && cache[index]; + const sourceIsArray = isArray(source); + if (sourceIsArray || isString(source)) { + const sourceIsReactiveArray = sourceIsArray && isReactive(source); + let needsWrap = false; + if (sourceIsReactiveArray) { + needsWrap = !isShallow(source); + source = shallowReadArray(source); + } + ret = new Array(source.length); + for (let i = 0, l = source.length; i < l; i++) { + ret[i] = renderItem( + needsWrap ? toReactive(source[i]) : source[i], + i, + void 0, + cached && cached[i] + ); + } + } else if (typeof source === "number") { + ret = new Array(source); + for (let i = 0; i < source; i++) { + ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]); + } + } else if (isObject(source)) { + if (source[Symbol.iterator]) { + ret = Array.from( + source, + (item, i) => renderItem(item, i, void 0, cached && cached[i]) + ); + } else { + const keys = Object.keys(source); + ret = new Array(keys.length); + for (let i = 0, l = keys.length; i < l; i++) { + const key = keys[i]; + ret[i] = renderItem(source[key], key, i, cached && cached[i]); + } + } + } else { + ret = []; + } + if (cache) { + cache[index] = ret; + } + return ret; +} +function createSlots(slots, dynamicSlots) { + for (let i = 0; i < dynamicSlots.length; i++) { + const slot = dynamicSlots[i]; + if (isArray(slot)) { + for (let j = 0; j < slot.length; j++) { + slots[slot[j].name] = slot[j].fn; + } + } else if (slot) { + slots[slot.name] = slot.key ? (...args) => { + const res = slot.fn(...args); + if (res) res.key = slot.key; + return res; + } : slot.fn; + } + } + return slots; +} +function renderSlot(slots, name, props = {}, fallback, noSlotted) { + if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) { + if (name !== "default") props.name = name; + return openBlock(), createBlock( + Fragment, + null, + [createVNode("slot", props, fallback && fallback())], + 64 + ); + } + let slot = slots[name]; + if (slot && slot._c) { + slot._d = false; + } + openBlock(); + const validSlotContent = slot && ensureValidVNode(slot(props)); + const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch + // key attached in the `createSlots` helper, respect that + validSlotContent && validSlotContent.key; + const rendered = createBlock( + Fragment, + { + key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content + (!validSlotContent && fallback ? "_fb" : "") + }, + validSlotContent || (fallback ? fallback() : []), + validSlotContent && slots._ === 1 ? 64 : -2 + ); + if (!noSlotted && rendered.scopeId) { + rendered.slotScopeIds = [rendered.scopeId + "-s"]; + } + if (slot && slot._c) { + slot._d = true; + } + return rendered; +} +function ensureValidVNode(vnodes) { + return vnodes.some((child) => { + if (!isVNode(child)) return true; + if (child.type === Comment) return false; + if (child.type === Fragment && !ensureValidVNode(child.children)) + return false; + return true; + }) ? vnodes : null; +} +function toHandlers(obj, preserveCaseIfNecessary) { + const ret = {}; + for (const key in obj) { + ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key]; + } + return ret; +} +const getPublicInstance = (i) => { + if (!i) return null; + if (isStatefulComponent(i)) return getComponentPublicInstance(i); + return getPublicInstance(i.parent); +}; +const publicPropertiesMap = ( + // Move PURE marker to new line to workaround compiler discarding it + // due to type annotation + /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), { + $: (i) => i, + $el: (i) => i.vnode.el, + $data: (i) => i.data, + $props: (i) => i.props, + $attrs: (i) => i.attrs, + $slots: (i) => i.slots, + $refs: (i) => i.refs, + $parent: (i) => getPublicInstance(i.parent), + $root: (i) => getPublicInstance(i.root), + $host: (i) => i.ce, + $emit: (i) => i.emit, + $options: (i) => resolveMergedOptions(i) , + $forceUpdate: (i) => i.f || (i.f = () => { + queueJob(i.update); + }), + $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), + $watch: (i) => instanceWatch.bind(i) + }) +); +const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); +const PublicInstanceProxyHandlers = { + get({ _: instance }, key) { + if (key === "__v_skip") { + return true; + } + const { ctx, setupState, data, props, accessCache, type, appContext } = instance; + let normalizedProps; + if (key[0] !== "$") { + const n = accessCache[key]; + if (n !== void 0) { + switch (n) { + case 1: + return setupState[key]; + case 2: + return data[key]; + case 4: + return ctx[key]; + case 3: + return props[key]; + } + } else if (hasSetupBinding(setupState, key)) { + accessCache[key] = 1; + return setupState[key]; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + accessCache[key] = 2; + return data[key]; + } else if ( + // only cache other properties when instance has declared (thus stable) + // props + (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) + ) { + accessCache[key] = 3; + return props[key]; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if (shouldCacheAccess) { + accessCache[key] = 0; + } + } + const publicGetter = publicPropertiesMap[key]; + let cssModule, globalProperties; + if (publicGetter) { + if (key === "$attrs") { + track(instance.attrs, "get", ""); + } + return publicGetter(instance); + } else if ( + // css module (injected by vue-loader) + (cssModule = type.__cssModules) && (cssModule = cssModule[key]) + ) { + return cssModule; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if ( + // global properties + globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) + ) { + { + return globalProperties[key]; + } + } else ; + }, + set({ _: instance }, key, value) { + const { data, setupState, ctx } = instance; + if (hasSetupBinding(setupState, key)) { + setupState[key] = value; + return true; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + data[key] = value; + return true; + } else if (hasOwn(instance.props, key)) { + return false; + } + if (key[0] === "$" && key.slice(1) in instance) { + return false; + } else { + { + ctx[key] = value; + } + } + return true; + }, + has({ + _: { data, setupState, accessCache, ctx, appContext, propsOptions } + }, key) { + let normalizedProps; + return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key); + }, + defineProperty(target, key, descriptor) { + if (descriptor.get != null) { + target._.accessCache[key] = 0; + } else if (hasOwn(descriptor, "value")) { + this.set(target, key, descriptor.value, null); + } + return Reflect.defineProperty(target, key, descriptor); + } +}; +const RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend({}, PublicInstanceProxyHandlers, { + get(target, key) { + if (key === Symbol.unscopables) { + return; + } + return PublicInstanceProxyHandlers.get(target, key, target); + }, + has(_, key) { + const has = key[0] !== "_" && !isGloballyAllowed(key); + return has; + } +}); +function defineProps() { + return null; +} +function defineEmits() { + return null; +} +function defineExpose(exposed) { +} +function defineOptions(options) { +} +function defineSlots() { + return null; +} +function defineModel() { +} +function withDefaults(props, defaults) { + return null; +} +function useSlots() { + return getContext().slots; +} +function useAttrs() { + return getContext().attrs; +} +function getContext() { + const i = getCurrentInstance(); + return i.setupContext || (i.setupContext = createSetupContext(i)); +} +function normalizePropsOrEmits(props) { + return isArray(props) ? props.reduce( + (normalized, p) => (normalized[p] = null, normalized), + {} + ) : props; +} +function mergeDefaults(raw, defaults) { + const props = normalizePropsOrEmits(raw); + for (const key in defaults) { + if (key.startsWith("__skip")) continue; + let opt = props[key]; + if (opt) { + if (isArray(opt) || isFunction(opt)) { + opt = props[key] = { type: opt, default: defaults[key] }; + } else { + opt.default = defaults[key]; + } + } else if (opt === null) { + opt = props[key] = { default: defaults[key] }; + } else ; + if (opt && defaults[`__skip_${key}`]) { + opt.skipFactory = true; + } + } + return props; +} +function mergeModels(a, b) { + if (!a || !b) return a || b; + if (isArray(a) && isArray(b)) return a.concat(b); + return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b)); +} +function createPropsRestProxy(props, excludedKeys) { + const ret = {}; + for (const key in props) { + if (!excludedKeys.includes(key)) { + Object.defineProperty(ret, key, { + enumerable: true, + get: () => props[key] + }); + } + } + return ret; +} +function withAsyncContext(getAwaitable) { + const ctx = getCurrentInstance(); + let awaitable = getAwaitable(); + unsetCurrentInstance(); + if (isPromise(awaitable)) { + awaitable = awaitable.catch((e) => { + setCurrentInstance(ctx); + throw e; + }); + } + return [awaitable, () => setCurrentInstance(ctx)]; +} +let shouldCacheAccess = true; +function applyOptions(instance) { + const options = resolveMergedOptions(instance); + const publicThis = instance.proxy; + const ctx = instance.ctx; + shouldCacheAccess = false; + if (options.beforeCreate) { + callHook(options.beforeCreate, instance, "bc"); + } + const { + // state + data: dataOptions, + computed: computedOptions, + methods, + watch: watchOptions, + provide: provideOptions, + inject: injectOptions, + // lifecycle + created, + beforeMount, + mounted, + beforeUpdate, + updated, + activated, + deactivated, + beforeDestroy, + beforeUnmount, + destroyed, + unmounted, + render, + renderTracked, + renderTriggered, + errorCaptured, + serverPrefetch, + // public API + expose, + inheritAttrs, + // assets + components, + directives, + filters + } = options; + const checkDuplicateProperties = null; + if (injectOptions) { + resolveInjections(injectOptions, ctx, checkDuplicateProperties); + } + if (methods) { + for (const key in methods) { + const methodHandler = methods[key]; + if (isFunction(methodHandler)) { + { + ctx[key] = methodHandler.bind(publicThis); + } + } + } + } + if (dataOptions) { + const data = dataOptions.call(publicThis, publicThis); + if (!isObject(data)) ; else { + instance.data = reactive(data); + } + } + shouldCacheAccess = true; + if (computedOptions) { + for (const key in computedOptions) { + const opt = computedOptions[key]; + const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP; + const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : NOOP; + const c = computed({ + get, + set + }); + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => c.value, + set: (v) => c.value = v + }); + } + } + if (watchOptions) { + for (const key in watchOptions) { + createWatcher(watchOptions[key], ctx, publicThis, key); + } + } + if (provideOptions) { + const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions; + Reflect.ownKeys(provides).forEach((key) => { + provide(key, provides[key]); + }); + } + if (created) { + callHook(created, instance, "c"); + } + function registerLifecycleHook(register, hook) { + if (isArray(hook)) { + hook.forEach((_hook) => register(_hook.bind(publicThis))); + } else if (hook) { + register(hook.bind(publicThis)); + } + } + registerLifecycleHook(onBeforeMount, beforeMount); + registerLifecycleHook(onMounted, mounted); + registerLifecycleHook(onBeforeUpdate, beforeUpdate); + registerLifecycleHook(onUpdated, updated); + registerLifecycleHook(onActivated, activated); + registerLifecycleHook(onDeactivated, deactivated); + registerLifecycleHook(onErrorCaptured, errorCaptured); + registerLifecycleHook(onRenderTracked, renderTracked); + registerLifecycleHook(onRenderTriggered, renderTriggered); + registerLifecycleHook(onBeforeUnmount, beforeUnmount); + registerLifecycleHook(onUnmounted, unmounted); + registerLifecycleHook(onServerPrefetch, serverPrefetch); + if (isArray(expose)) { + if (expose.length) { + const exposed = instance.exposed || (instance.exposed = {}); + expose.forEach((key) => { + Object.defineProperty(exposed, key, { + get: () => publicThis[key], + set: (val) => publicThis[key] = val + }); + }); + } else if (!instance.exposed) { + instance.exposed = {}; + } + } + if (render && instance.render === NOOP) { + instance.render = render; + } + if (inheritAttrs != null) { + instance.inheritAttrs = inheritAttrs; + } + if (components) instance.components = components; + if (directives) instance.directives = directives; + if (serverPrefetch) { + markAsyncBoundary(instance); + } +} +function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) { + if (isArray(injectOptions)) { + injectOptions = normalizeInject(injectOptions); + } + for (const key in injectOptions) { + const opt = injectOptions[key]; + let injected; + if (isObject(opt)) { + if ("default" in opt) { + injected = inject( + opt.from || key, + opt.default, + true + ); + } else { + injected = inject(opt.from || key); + } + } else { + injected = inject(opt); + } + if (isRef(injected)) { + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => injected.value, + set: (v) => injected.value = v + }); + } else { + ctx[key] = injected; + } + } +} +function callHook(hook, instance, type) { + callWithAsyncErrorHandling( + isArray(hook) ? hook.map((h2) => h2.bind(instance.proxy)) : hook.bind(instance.proxy), + instance, + type + ); +} +function createWatcher(raw, ctx, publicThis, key) { + let getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key]; + if (isString(raw)) { + const handler = ctx[raw]; + if (isFunction(handler)) { + { + watch(getter, handler); + } + } + } else if (isFunction(raw)) { + { + watch(getter, raw.bind(publicThis)); + } + } else if (isObject(raw)) { + if (isArray(raw)) { + raw.forEach((r) => createWatcher(r, ctx, publicThis, key)); + } else { + const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler]; + if (isFunction(handler)) { + watch(getter, handler, raw); + } + } + } else ; +} +function resolveMergedOptions(instance) { + const base = instance.type; + const { mixins, extends: extendsOptions } = base; + const { + mixins: globalMixins, + optionsCache: cache, + config: { optionMergeStrategies } + } = instance.appContext; + const cached = cache.get(base); + let resolved; + if (cached) { + resolved = cached; + } else if (!globalMixins.length && !mixins && !extendsOptions) { + { + resolved = base; + } + } else { + resolved = {}; + if (globalMixins.length) { + globalMixins.forEach( + (m) => mergeOptions(resolved, m, optionMergeStrategies, true) + ); + } + mergeOptions(resolved, base, optionMergeStrategies); + } + if (isObject(base)) { + cache.set(base, resolved); + } + return resolved; +} +function mergeOptions(to, from, strats, asMixin = false) { + const { mixins, extends: extendsOptions } = from; + if (extendsOptions) { + mergeOptions(to, extendsOptions, strats, true); + } + if (mixins) { + mixins.forEach( + (m) => mergeOptions(to, m, strats, true) + ); + } + for (const key in from) { + if (asMixin && key === "expose") ; else { + const strat = internalOptionMergeStrats[key] || strats && strats[key]; + to[key] = strat ? strat(to[key], from[key]) : from[key]; + } + } + return to; +} +const internalOptionMergeStrats = { + data: mergeDataFn, + props: mergeEmitsOrPropsOptions, + emits: mergeEmitsOrPropsOptions, + // objects + methods: mergeObjectOptions, + computed: mergeObjectOptions, + // lifecycle + beforeCreate: mergeAsArray, + created: mergeAsArray, + beforeMount: mergeAsArray, + mounted: mergeAsArray, + beforeUpdate: mergeAsArray, + updated: mergeAsArray, + beforeDestroy: mergeAsArray, + beforeUnmount: mergeAsArray, + destroyed: mergeAsArray, + unmounted: mergeAsArray, + activated: mergeAsArray, + deactivated: mergeAsArray, + errorCaptured: mergeAsArray, + serverPrefetch: mergeAsArray, + // assets + components: mergeObjectOptions, + directives: mergeObjectOptions, + // watch + watch: mergeWatchOptions, + // provide / inject + provide: mergeDataFn, + inject: mergeInject +}; +function mergeDataFn(to, from) { + if (!from) { + return to; + } + if (!to) { + return from; + } + return function mergedDataFn() { + return extend( + isFunction(to) ? to.call(this, this) : to, + isFunction(from) ? from.call(this, this) : from + ); + }; +} +function mergeInject(to, from) { + return mergeObjectOptions(normalizeInject(to), normalizeInject(from)); +} +function normalizeInject(raw) { + if (isArray(raw)) { + const res = {}; + for (let i = 0; i < raw.length; i++) { + res[raw[i]] = raw[i]; + } + return res; + } + return raw; +} +function mergeAsArray(to, from) { + return to ? [...new Set([].concat(to, from))] : from; +} +function mergeObjectOptions(to, from) { + return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from; +} +function mergeEmitsOrPropsOptions(to, from) { + if (to) { + if (isArray(to) && isArray(from)) { + return [.../* @__PURE__ */ new Set([...to, ...from])]; + } + return extend( + /* @__PURE__ */ Object.create(null), + normalizePropsOrEmits(to), + normalizePropsOrEmits(from != null ? from : {}) + ); + } else { + return from; + } +} +function mergeWatchOptions(to, from) { + if (!to) return from; + if (!from) return to; + const merged = extend(/* @__PURE__ */ Object.create(null), to); + for (const key in from) { + merged[key] = mergeAsArray(to[key], from[key]); + } + return merged; +} +function createAppContext() { + return { + app: null, + config: { + isNativeTag: NO, + performance: false, + globalProperties: {}, + optionMergeStrategies: {}, + errorHandler: void 0, + warnHandler: void 0, + compilerOptions: {} + }, + mixins: [], + components: {}, + directives: {}, + provides: /* @__PURE__ */ Object.create(null), + optionsCache: /* @__PURE__ */ new WeakMap(), + propsCache: /* @__PURE__ */ new WeakMap(), + emitsCache: /* @__PURE__ */ new WeakMap() + }; +} +let uid$1 = 0; +function createAppAPI(render, hydrate) { + return function createApp(rootComponent, rootProps = null) { + if (!isFunction(rootComponent)) { + rootComponent = extend({}, rootComponent); + } + if (rootProps != null && !isObject(rootProps)) { + rootProps = null; + } + const context = createAppContext(); + const installedPlugins = /* @__PURE__ */ new WeakSet(); + const pluginCleanupFns = []; + let isMounted = false; + const app = context.app = { + _uid: uid$1++, + _component: rootComponent, + _props: rootProps, + _container: null, + _context: context, + _instance: null, + version, + get config() { + return context.config; + }, + set config(v) { + }, + use(plugin, ...options) { + if (installedPlugins.has(plugin)) ; else if (plugin && isFunction(plugin.install)) { + installedPlugins.add(plugin); + plugin.install(app, ...options); + } else if (isFunction(plugin)) { + installedPlugins.add(plugin); + plugin(app, ...options); + } else ; + return app; + }, + mixin(mixin) { + { + if (!context.mixins.includes(mixin)) { + context.mixins.push(mixin); + } + } + return app; + }, + component(name, component) { + if (!component) { + return context.components[name]; + } + context.components[name] = component; + return app; + }, + directive(name, directive) { + if (!directive) { + return context.directives[name]; + } + context.directives[name] = directive; + return app; + }, + mount(rootContainer, isHydrate, namespace) { + if (!isMounted) { + const vnode = app._ceVNode || createVNode(rootComponent, rootProps); + vnode.appContext = context; + if (namespace === true) { + namespace = "svg"; + } else if (namespace === false) { + namespace = void 0; + } + if (isHydrate && hydrate) { + hydrate(vnode, rootContainer); + } else { + render(vnode, rootContainer, namespace); + } + isMounted = true; + app._container = rootContainer; + rootContainer.__vue_app__ = app; + return getComponentPublicInstance(vnode.component); + } + }, + onUnmount(cleanupFn) { + pluginCleanupFns.push(cleanupFn); + }, + unmount() { + if (isMounted) { + callWithAsyncErrorHandling( + pluginCleanupFns, + app._instance, + 16 + ); + render(null, app._container); + delete app._container.__vue_app__; + } + }, + provide(key, value) { + context.provides[key] = value; + return app; + }, + runWithContext(fn) { + const lastApp = currentApp; + currentApp = app; + try { + return fn(); + } finally { + currentApp = lastApp; + } + } + }; + return app; + }; +} +let currentApp = null; +function provide(key, value) { + if (!currentInstance) ; else { + let provides = currentInstance.provides; + const parentProvides = currentInstance.parent && currentInstance.parent.provides; + if (parentProvides === provides) { + provides = currentInstance.provides = Object.create(parentProvides); + } + provides[key] = value; + } +} +function inject(key, defaultValue, treatDefaultAsFactory = false) { + const instance = currentInstance || currentRenderingInstance; + if (instance || currentApp) { + const provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0; + if (provides && key in provides) { + return provides[key]; + } else if (arguments.length > 1) { + return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue; + } else ; + } +} +function hasInjectionContext() { + return !!(currentInstance || currentRenderingInstance || currentApp); +} +const internalObjectProto = {}; +const createInternalObject = () => Object.create(internalObjectProto); +const isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto; +function initProps(instance, rawProps, isStateful, isSSR = false) { + const props = {}; + const attrs = createInternalObject(); + instance.propsDefaults = /* @__PURE__ */ Object.create(null); + setFullProps(instance, rawProps, props, attrs); + for (const key in instance.propsOptions[0]) { + if (!(key in props)) { + props[key] = void 0; + } + } + if (isStateful) { + instance.props = isSSR ? props : shallowReactive(props); + } else { + if (!instance.type.props) { + instance.props = attrs; + } else { + instance.props = props; + } + } + instance.attrs = attrs; +} +function updateProps(instance, rawProps, rawPrevProps, optimized) { + const { + props, + attrs, + vnode: { patchFlag } + } = instance; + const rawCurrentProps = toRaw(props); + const [options] = instance.propsOptions; + let hasAttrsChanged = false; + if ( + // always force full diff in dev + // - #1942 if hmr is enabled with sfc component + // - vite#872 non-sfc component used by sfc component + (optimized || patchFlag > 0) && !(patchFlag & 16) + ) { + if (patchFlag & 8) { + const propsToUpdate = instance.vnode.dynamicProps; + for (let i = 0; i < propsToUpdate.length; i++) { + let key = propsToUpdate[i]; + if (isEmitListener(instance.emitsOptions, key)) { + continue; + } + const value = rawProps[key]; + if (options) { + if (hasOwn(attrs, key)) { + if (value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } else { + const camelizedKey = camelize(key); + props[camelizedKey] = resolvePropValue( + options, + rawCurrentProps, + camelizedKey, + value, + instance, + false + ); + } + } else { + if (value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } + } + } + } else { + if (setFullProps(instance, rawProps, props, attrs)) { + hasAttrsChanged = true; + } + let kebabKey; + for (const key in rawCurrentProps) { + if (!rawProps || // for camelCase + !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case + // and converted to camelCase (#955) + ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) { + if (options) { + if (rawPrevProps && // for camelCase + (rawPrevProps[key] !== void 0 || // for kebab-case + rawPrevProps[kebabKey] !== void 0)) { + props[key] = resolvePropValue( + options, + rawCurrentProps, + key, + void 0, + instance, + true + ); + } + } else { + delete props[key]; + } + } + } + if (attrs !== rawCurrentProps) { + for (const key in attrs) { + if (!rawProps || !hasOwn(rawProps, key) && true) { + delete attrs[key]; + hasAttrsChanged = true; + } + } + } + } + if (hasAttrsChanged) { + trigger(instance.attrs, "set", ""); + } +} +function setFullProps(instance, rawProps, props, attrs) { + const [options, needCastKeys] = instance.propsOptions; + let hasAttrsChanged = false; + let rawCastValues; + if (rawProps) { + for (let key in rawProps) { + if (isReservedProp(key)) { + continue; + } + const value = rawProps[key]; + let camelKey; + if (options && hasOwn(options, camelKey = camelize(key))) { + if (!needCastKeys || !needCastKeys.includes(camelKey)) { + props[camelKey] = value; + } else { + (rawCastValues || (rawCastValues = {}))[camelKey] = value; + } + } else if (!isEmitListener(instance.emitsOptions, key)) { + if (!(key in attrs) || value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } + } + } + if (needCastKeys) { + const rawCurrentProps = toRaw(props); + const castValues = rawCastValues || EMPTY_OBJ; + for (let i = 0; i < needCastKeys.length; i++) { + const key = needCastKeys[i]; + props[key] = resolvePropValue( + options, + rawCurrentProps, + key, + castValues[key], + instance, + !hasOwn(castValues, key) + ); + } + } + return hasAttrsChanged; +} +function resolvePropValue(options, props, key, value, instance, isAbsent) { + const opt = options[key]; + if (opt != null) { + const hasDefault = hasOwn(opt, "default"); + if (hasDefault && value === void 0) { + const defaultValue = opt.default; + if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) { + const { propsDefaults } = instance; + if (key in propsDefaults) { + value = propsDefaults[key]; + } else { + const reset = setCurrentInstance(instance); + value = propsDefaults[key] = defaultValue.call( + null, + props + ); + reset(); + } + } else { + value = defaultValue; + } + if (instance.ce) { + instance.ce._setProp(key, value); + } + } + if (opt[ + 0 + /* shouldCast */ + ]) { + if (isAbsent && !hasDefault) { + value = false; + } else if (opt[ + 1 + /* shouldCastTrue */ + ] && (value === "" || value === hyphenate(key))) { + value = true; + } + } + } + return value; +} +const mixinPropsCache = /* @__PURE__ */ new WeakMap(); +function normalizePropsOptions(comp, appContext, asMixin = false) { + const cache = asMixin ? mixinPropsCache : appContext.propsCache; + const cached = cache.get(comp); + if (cached) { + return cached; + } + const raw = comp.props; + const normalized = {}; + const needCastKeys = []; + let hasExtends = false; + if (!isFunction(comp)) { + const extendProps = (raw2) => { + hasExtends = true; + const [props, keys] = normalizePropsOptions(raw2, appContext, true); + extend(normalized, props); + if (keys) needCastKeys.push(...keys); + }; + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendProps); + } + if (comp.extends) { + extendProps(comp.extends); + } + if (comp.mixins) { + comp.mixins.forEach(extendProps); + } + } + if (!raw && !hasExtends) { + if (isObject(comp)) { + cache.set(comp, EMPTY_ARR); + } + return EMPTY_ARR; + } + if (isArray(raw)) { + for (let i = 0; i < raw.length; i++) { + const normalizedKey = camelize(raw[i]); + if (validatePropName(normalizedKey)) { + normalized[normalizedKey] = EMPTY_OBJ; + } + } + } else if (raw) { + for (const key in raw) { + const normalizedKey = camelize(key); + if (validatePropName(normalizedKey)) { + const opt = raw[key]; + const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt); + const propType = prop.type; + let shouldCast = false; + let shouldCastTrue = true; + if (isArray(propType)) { + for (let index = 0; index < propType.length; ++index) { + const type = propType[index]; + const typeName = isFunction(type) && type.name; + if (typeName === "Boolean") { + shouldCast = true; + break; + } else if (typeName === "String") { + shouldCastTrue = false; + } + } + } else { + shouldCast = isFunction(propType) && propType.name === "Boolean"; + } + prop[ + 0 + /* shouldCast */ + ] = shouldCast; + prop[ + 1 + /* shouldCastTrue */ + ] = shouldCastTrue; + if (shouldCast || hasOwn(prop, "default")) { + needCastKeys.push(normalizedKey); + } + } + } + } + const res = [normalized, needCastKeys]; + if (isObject(comp)) { + cache.set(comp, res); + } + return res; +} +function validatePropName(key) { + if (key[0] !== "$" && !isReservedProp(key)) { + return true; + } + return false; +} +const isInternalKey = (key) => key[0] === "_" || key === "$stable"; +const normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)]; +const normalizeSlot = (key, rawSlot, ctx) => { + if (rawSlot._n) { + return rawSlot; + } + const normalized = withCtx((...args) => { + if (false) ; + return normalizeSlotValue(rawSlot(...args)); + }, ctx); + normalized._c = false; + return normalized; +}; +const normalizeObjectSlots = (rawSlots, slots, instance) => { + const ctx = rawSlots._ctx; + for (const key in rawSlots) { + if (isInternalKey(key)) continue; + const value = rawSlots[key]; + if (isFunction(value)) { + slots[key] = normalizeSlot(key, value, ctx); + } else if (value != null) { + const normalized = normalizeSlotValue(value); + slots[key] = () => normalized; + } + } +}; +const normalizeVNodeSlots = (instance, children) => { + const normalized = normalizeSlotValue(children); + instance.slots.default = () => normalized; +}; +const assignSlots = (slots, children, optimized) => { + for (const key in children) { + if (optimized || key !== "_") { + slots[key] = children[key]; + } + } +}; +const initSlots = (instance, children, optimized) => { + const slots = instance.slots = createInternalObject(); + if (instance.vnode.shapeFlag & 32) { + const type = children._; + if (type) { + assignSlots(slots, children, optimized); + if (optimized) { + def(slots, "_", type, true); + } + } else { + normalizeObjectSlots(children, slots); + } + } else if (children) { + normalizeVNodeSlots(instance, children); + } +}; +const updateSlots = (instance, children, optimized) => { + const { vnode, slots } = instance; + let needDeletionCheck = true; + let deletionComparisonTarget = EMPTY_OBJ; + if (vnode.shapeFlag & 32) { + const type = children._; + if (type) { + if (optimized && type === 1) { + needDeletionCheck = false; + } else { + assignSlots(slots, children, optimized); + } + } else { + needDeletionCheck = !children.$stable; + normalizeObjectSlots(children, slots); + } + deletionComparisonTarget = children; + } else if (children) { + normalizeVNodeSlots(instance, children); + deletionComparisonTarget = { default: 1 }; + } + if (needDeletionCheck) { + for (const key in slots) { + if (!isInternalKey(key) && deletionComparisonTarget[key] == null) { + delete slots[key]; + } + } + } +}; +const queuePostRenderEffect = queueEffectWithSuspense; +function createRenderer(options) { + return baseCreateRenderer(options); +} +function createHydrationRenderer(options) { + return baseCreateRenderer(options, createHydrationFunctions); +} +function baseCreateRenderer(options, createHydrationFns) { + const target = getGlobalThis(); + target.__VUE__ = true; + const { + insert: hostInsert, + remove: hostRemove, + patchProp: hostPatchProp, + createElement: hostCreateElement, + createText: hostCreateText, + createComment: hostCreateComment, + setText: hostSetText, + setElementText: hostSetElementText, + parentNode: hostParentNode, + nextSibling: hostNextSibling, + setScopeId: hostSetScopeId = NOOP, + insertStaticContent: hostInsertStaticContent + } = options; + const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!n2.dynamicChildren) => { + if (n1 === n2) { + return; + } + if (n1 && !isSameVNodeType(n1, n2)) { + anchor = getNextHostNode(n1); + unmount(n1, parentComponent, parentSuspense, true); + n1 = null; + } + if (n2.patchFlag === -2) { + optimized = false; + n2.dynamicChildren = null; + } + const { type, ref: ref3, shapeFlag } = n2; + switch (type) { + case Text: + processText(n1, n2, container, anchor); + break; + case Comment: + processCommentNode(n1, n2, container, anchor); + break; + case Static: + if (n1 == null) { + mountStaticNode(n2, container, anchor, namespace); + } + break; + case Fragment: + processFragment( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + break; + default: + if (shapeFlag & 1) { + processElement( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else if (shapeFlag & 6) { + processComponent( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else if (shapeFlag & 64) { + type.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + internals + ); + } else if (shapeFlag & 128) { + type.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + internals + ); + } else ; + } + if (ref3 != null && parentComponent) { + setRef(ref3, n1 && n1.ref, parentSuspense, n2 || n1, !n2); + } + }; + const processText = (n1, n2, container, anchor) => { + if (n1 == null) { + hostInsert( + n2.el = hostCreateText(n2.children), + container, + anchor + ); + } else { + const el = n2.el = n1.el; + if (n2.children !== n1.children) { + hostSetText(el, n2.children); + } + } + }; + const processCommentNode = (n1, n2, container, anchor) => { + if (n1 == null) { + hostInsert( + n2.el = hostCreateComment(n2.children || ""), + container, + anchor + ); + } else { + n2.el = n1.el; + } + }; + const mountStaticNode = (n2, container, anchor, namespace) => { + [n2.el, n2.anchor] = hostInsertStaticContent( + n2.children, + container, + anchor, + namespace, + n2.el, + n2.anchor + ); + }; + const moveStaticNode = ({ el, anchor }, container, nextSibling) => { + let next; + while (el && el !== anchor) { + next = hostNextSibling(el); + hostInsert(el, container, nextSibling); + el = next; + } + hostInsert(anchor, container, nextSibling); + }; + const removeStaticNode = ({ el, anchor }) => { + let next; + while (el && el !== anchor) { + next = hostNextSibling(el); + hostRemove(el); + el = next; + } + hostRemove(anchor); + }; + const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + if (n2.type === "svg") { + namespace = "svg"; + } else if (n2.type === "math") { + namespace = "mathml"; + } + if (n1 == null) { + mountElement( + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else { + patchElement( + n1, + n2, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + }; + const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + let el; + let vnodeHook; + const { props, shapeFlag, transition, dirs } = vnode; + el = vnode.el = hostCreateElement( + vnode.type, + namespace, + props && props.is, + props + ); + if (shapeFlag & 8) { + hostSetElementText(el, vnode.children); + } else if (shapeFlag & 16) { + mountChildren( + vnode.children, + el, + null, + parentComponent, + parentSuspense, + resolveChildrenNamespace(vnode, namespace), + slotScopeIds, + optimized + ); + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "created"); + } + setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent); + if (props) { + for (const key in props) { + if (key !== "value" && !isReservedProp(key)) { + hostPatchProp(el, key, null, props[key], namespace, parentComponent); + } + } + if ("value" in props) { + hostPatchProp(el, "value", null, props.value, namespace); + } + if (vnodeHook = props.onVnodeBeforeMount) { + invokeVNodeHook(vnodeHook, parentComponent, vnode); + } + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); + } + const needCallTransitionHooks = needTransition(parentSuspense, transition); + if (needCallTransitionHooks) { + transition.beforeEnter(el); + } + hostInsert(el, container, anchor); + if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) { + queuePostRenderEffect(() => { + vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); + needCallTransitionHooks && transition.enter(el); + dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); + }, parentSuspense); + } + }; + const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => { + if (scopeId) { + hostSetScopeId(el, scopeId); + } + if (slotScopeIds) { + for (let i = 0; i < slotScopeIds.length; i++) { + hostSetScopeId(el, slotScopeIds[i]); + } + } + if (parentComponent) { + let subTree = parentComponent.subTree; + if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) { + const parentVNode = parentComponent.vnode; + setScopeId( + el, + parentVNode, + parentVNode.scopeId, + parentVNode.slotScopeIds, + parentComponent.parent + ); + } + } + }; + const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => { + for (let i = start; i < children.length; i++) { + const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]); + patch( + null, + child, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + }; + const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + const el = n2.el = n1.el; + let { patchFlag, dynamicChildren, dirs } = n2; + patchFlag |= n1.patchFlag & 16; + const oldProps = n1.props || EMPTY_OBJ; + const newProps = n2.props || EMPTY_OBJ; + let vnodeHook; + parentComponent && toggleRecurse(parentComponent, false); + if (vnodeHook = newProps.onVnodeBeforeUpdate) { + invokeVNodeHook(vnodeHook, parentComponent, n2, n1); + } + if (dirs) { + invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate"); + } + parentComponent && toggleRecurse(parentComponent, true); + if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) { + hostSetElementText(el, ""); + } + if (dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + el, + parentComponent, + parentSuspense, + resolveChildrenNamespace(n2, namespace), + slotScopeIds + ); + } else if (!optimized) { + patchChildren( + n1, + n2, + el, + null, + parentComponent, + parentSuspense, + resolveChildrenNamespace(n2, namespace), + slotScopeIds, + false + ); + } + if (patchFlag > 0) { + if (patchFlag & 16) { + patchProps(el, oldProps, newProps, parentComponent, namespace); + } else { + if (patchFlag & 2) { + if (oldProps.class !== newProps.class) { + hostPatchProp(el, "class", null, newProps.class, namespace); + } + } + if (patchFlag & 4) { + hostPatchProp(el, "style", oldProps.style, newProps.style, namespace); + } + if (patchFlag & 8) { + const propsToUpdate = n2.dynamicProps; + for (let i = 0; i < propsToUpdate.length; i++) { + const key = propsToUpdate[i]; + const prev = oldProps[key]; + const next = newProps[key]; + if (next !== prev || key === "value") { + hostPatchProp(el, key, prev, next, namespace, parentComponent); + } + } + } + } + if (patchFlag & 1) { + if (n1.children !== n2.children) { + hostSetElementText(el, n2.children); + } + } + } else if (!optimized && dynamicChildren == null) { + patchProps(el, oldProps, newProps, parentComponent, namespace); + } + if ((vnodeHook = newProps.onVnodeUpdated) || dirs) { + queuePostRenderEffect(() => { + vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1); + dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated"); + }, parentSuspense); + } + }; + const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => { + for (let i = 0; i < newChildren.length; i++) { + const oldVNode = oldChildren[i]; + const newVNode = newChildren[i]; + const container = ( + // oldVNode may be an errored async setup() component inside Suspense + // which will not have a mounted element + oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent + // of the Fragment itself so it can move its children. + (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement + // which also requires the correct parent container + !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything. + oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : ( + // In other cases, the parent container is not actually used so we + // just pass the block element here to avoid a DOM parentNode call. + fallbackContainer + ) + ); + patch( + oldVNode, + newVNode, + container, + null, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + true + ); + } + }; + const patchProps = (el, oldProps, newProps, parentComponent, namespace) => { + if (oldProps !== newProps) { + if (oldProps !== EMPTY_OBJ) { + for (const key in oldProps) { + if (!isReservedProp(key) && !(key in newProps)) { + hostPatchProp( + el, + key, + oldProps[key], + null, + namespace, + parentComponent + ); + } + } + } + for (const key in newProps) { + if (isReservedProp(key)) continue; + const next = newProps[key]; + const prev = oldProps[key]; + if (next !== prev && key !== "value") { + hostPatchProp(el, key, prev, next, namespace, parentComponent); + } + } + if ("value" in newProps) { + hostPatchProp(el, "value", oldProps.value, newProps.value, namespace); + } + } + }; + const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(""); + const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(""); + let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2; + if (fragmentSlotScopeIds) { + slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; + } + if (n1 == null) { + hostInsert(fragmentStartAnchor, container, anchor); + hostInsert(fragmentEndAnchor, container, anchor); + mountChildren( + // #10007 + // such fragment like `<>` will be compiled into + // a fragment which doesn't have a children. + // In this case fallback to an empty array + n2.children || [], + container, + fragmentEndAnchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else { + if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result + // of renderSlot() with no valid children + n1.dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + container, + parentComponent, + parentSuspense, + namespace, + slotScopeIds + ); + if ( + // #2080 if the stable fragment has a key, it's a