From 4ed2e11ca230832512e195f333cf8cfd0aa51be2 Mon Sep 17 00:00:00 2001 From: liugang Date: Thu, 21 Nov 2024 15:05:09 +0800 Subject: [PATCH 001/431] * [bug#57288] fix error of select fields from a table into other records. --- lib/base/mao/mao.class.php | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/base/mao/mao.class.php b/lib/base/mao/mao.class.php index cb081c9880..57432b446a 100644 --- a/lib/base/mao/mao.class.php +++ b/lib/base/mao/mao.class.php @@ -707,11 +707,8 @@ class baseMao if(empty($this->cache)) { /* 如果缓存关闭,从数据库中获取。If the cache is off, get from the database. */ - $fields = []; - foreach($this->fields as $field => $alias) $fields[] = $field == $alias ? $field : "$field AS $alias"; - $fields = implode(',', $fields); - $primaryKey = $this->config->cache->raw[$this->table]; + $fields = $primaryKey . ',' . implode(',', array_keys($this->fields)); $cacheResult = $this->dao->select($fields)->from($this->table)->where($primaryKey)->in(array_unique($keyList))->fetchAll($primaryKey); } else @@ -721,10 +718,16 @@ class baseMao foreach($data as $index => $row) { - $key = $keyList[$index]; - $cacheRow = $cacheResult[$key]; - - foreach($this->fields as $field => $alias) $row->$alias = $cacheRow->$field; + $key = $keyList[$index]; + if(isset($cacheResult[$key])) + { + $cacheRow = $cacheResult[$key]; + foreach($this->fields as $field => $alias) $row->$alias = $cacheRow->$field; + } + else + { + foreach($this->fields as $field => $alias) $row->$alias = ''; + } } } From 07ca6dfb7ea3a318384d89b633d8851cd1c5c6d1 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Thu, 21 Nov 2024 13:31:04 +0800 Subject: [PATCH 002/431] * [task#133002,doing,0.2h] add control of pivot-versions. --- module/pivot/control.php | 15 +++++++++++++++ module/pivot/model.php | 12 ++++++++++++ module/pivot/ui/show.html.php | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/module/pivot/control.php b/module/pivot/control.php index 9cfe675110..b8857aab24 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -68,6 +68,21 @@ class pivot extends control $this->display(); } + /** + * 透视表版本列表。 + * Show versions of a pivot. + * + * @param int $pivotID + * @access public + * @return void + */ + public function versions(int $pivotID) + { + $this->view->versions = $this->pivot->getPivotVersions($pivotID); + $this->view->pivotID = $pivotID; + $this->display(); + } + /** * Drill data modal. * 下钻数据的弹窗。 diff --git a/module/pivot/model.php b/module/pivot/model.php index a07300849d..98ffdfebe5 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -2815,6 +2815,18 @@ class pivotModel extends model return $datas; } + + /** + * Get versions of a pivot. + * + * @param int $pivotID + * @access public + * @return array + */ + public function getPivotVersions(int $pivotID): array + { + return $this->dao->select('*')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($pivotID)->fetchAll(); + } } /** diff --git a/module/pivot/ui/show.html.php b/module/pivot/ui/show.html.php index b9dd261304..9c45ca6677 100644 --- a/module/pivot/ui/show.html.php +++ b/module/pivot/ui/show.html.php @@ -99,7 +99,7 @@ $generateData = function() use ($lang, $pivotName, $pivot, $data, $configs, $sho ( $lang->pivot->checkNewVersion, set('data-toggle', 'modal'), - set::url($this->createLink('pivot', 'versions', "pivotID={$pivot->id}")) + set::href($this->createLink('pivot', 'versions', "pivotID={$pivot->id}")) ) ) ), From c3142854e247f4fb1ab2d4b76f45daa625ed428d Mon Sep 17 00:00:00 2001 From: zhouxin Date: Thu, 21 Nov 2024 13:31:56 +0800 Subject: [PATCH 003/431] * [task#133002,doing,0.1h] add ui page. --- module/pivot/ui/versions.html.php | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 module/pivot/ui/versions.html.php diff --git a/module/pivot/ui/versions.html.php b/module/pivot/ui/versions.html.php new file mode 100644 index 0000000000..6cf622aa51 --- /dev/null +++ b/module/pivot/ui/versions.html.php @@ -0,0 +1,11 @@ + + * @package pivot + * @link https://www.zentao.net + */ +namespace zin; From 5bf2dda62bc96b2fadc285f4605b284b0dc9a070 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Thu, 21 Nov 2024 14:40:53 +0800 Subject: [PATCH 004/431] * [task#133002,doing,0.2h] get max version. --- module/pivot/model.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/pivot/model.php b/module/pivot/model.php index 98ffdfebe5..39d9a5e79a 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -2827,6 +2827,26 @@ class pivotModel extends model { return $this->dao->select('*')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($pivotID)->fetchAll(); } + + /** + * Get max version. + * + * @param int $pivotID + * @access public + * @return string + */ + public function getMaxVersion(int $pivotID): string + { + $versions = $this->dao->select('version')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($pivotID)->fetchPairs(); + + $maxVersion = current($versions); + foreach($versions as $version) + { + if(version_compare($version, $maxVersion, '>')) $maxVersion = $version; + } + + return $maxVersion; + } } /** From b832b9bfd2e54952f9fcda9d177348b65882d83c Mon Sep 17 00:00:00 2001 From: zhouxin Date: Thu, 21 Nov 2024 14:56:30 +0800 Subject: [PATCH 005/431] * [task#133002,doing,0.2h] add control. --- module/pivot/control.php | 6 ++++-- module/pivot/lang/de.php | 1 + module/pivot/lang/en.php | 1 + module/pivot/lang/fr.php | 1 + module/pivot/lang/zh-cn.php | 1 + 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/module/pivot/control.php b/module/pivot/control.php index b8857aab24..daa39b3d36 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -73,13 +73,15 @@ class pivot extends control * Show versions of a pivot. * * @param int $pivotID + * @param string $version * @access public * @return void */ - public function versions(int $pivotID) + public function versions(int $pivotID, string $version = 'newest') { $this->view->versions = $this->pivot->getPivotVersions($pivotID); - $this->view->pivotID = $pivotID; + $this->view->version = $version == 'newest' ? $this->pivot->getMaxVersion($pivotID) : $version; + $this->view->pivot = $this->pivot->getByID($pivotID); $this->display(); } diff --git a/module/pivot/lang/de.php b/module/pivot/lang/de.php index f9a79ab539..57298fe452 100644 --- a/module/pivot/lang/de.php +++ b/module/pivot/lang/de.php @@ -494,3 +494,4 @@ $lang->pivot->drill->designChangedTip = 'Setting columns field change, please ch $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; +$lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; diff --git a/module/pivot/lang/en.php b/module/pivot/lang/en.php index 8c1c976cab..ddbd1fb037 100644 --- a/module/pivot/lang/en.php +++ b/module/pivot/lang/en.php @@ -494,3 +494,4 @@ $lang->pivot->drill->designChangedTip = 'Setting columns field change, please ch $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; +$lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; diff --git a/module/pivot/lang/fr.php b/module/pivot/lang/fr.php index 6d35995d34..8d06801354 100644 --- a/module/pivot/lang/fr.php +++ b/module/pivot/lang/fr.php @@ -494,3 +494,4 @@ $lang->pivot->drill->designChangedTip = 'Setting columns field change, please ch $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; +$lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; diff --git a/module/pivot/lang/zh-cn.php b/module/pivot/lang/zh-cn.php index 3d9e740176..db389944bc 100644 --- a/module/pivot/lang/zh-cn.php +++ b/module/pivot/lang/zh-cn.php @@ -494,3 +494,4 @@ $lang->pivot->drill->designChangedTip = '设计变更,请检查'; $lang->pivot->tipNewVersion = '有新版本更新'; $lang->pivot->checkNewVersion = '点击查看'; +$lang->pivot->tipVersions = '此版本的内容如下所示,您可以点击下方按钮进行版本切换。切换版本后,此透视表内容以及进入设计后的设计器内相关配置,均会按照切换的版本展示。'; From 5f15513d0f3575857a5751b8af0934a5693e5c19 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Thu, 21 Nov 2024 15:07:09 +0800 Subject: [PATCH 006/431] * [task#133002,doing,0.2h] add panel for pivot-versions. --- module/pivot/ui/versions.html.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/module/pivot/ui/versions.html.php b/module/pivot/ui/versions.html.php index 6cf622aa51..6039bb0474 100644 --- a/module/pivot/ui/versions.html.php +++ b/module/pivot/ui/versions.html.php @@ -9,3 +9,20 @@ declare(strict_types = 1); * @link https://www.zentao.net */ namespace zin; +panel +( + setID('pivotVersionPanel'), + set::title("{$pivot->name} #{$version}"), + set::shadow(false), + set::headingClass('h-12'), + set::bodyClass('pt-0'), + to::titleSuffix + ( + icon + ( + setClass('cursor-pointer text-warning'), + setData(array('toggle' => 'tooltip', 'title' => $lang->pivot->tipVersions, 'placement' => 'right', 'className' => 'text-wraning border border-light', 'type' => 'white')), + 'help' + ) + ) +); From beff9c5ef61d68373883b9ecb021710227d3c6e4 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Thu, 21 Nov 2024 15:26:26 +0800 Subject: [PATCH 007/431] * [task#133002,doing,0.3h] add versions table to pivot-version. --- module/pivot/control.php | 6 +++--- module/pivot/lang/de.php | 2 ++ module/pivot/lang/en.php | 2 ++ module/pivot/lang/fr.php | 2 ++ module/pivot/lang/zh-cn.php | 2 ++ module/pivot/ui/versions.html.php | 21 +++++++++++++++++++++ 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/module/pivot/control.php b/module/pivot/control.php index daa39b3d36..f4f2e864ba 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -79,9 +79,9 @@ class pivot extends control */ public function versions(int $pivotID, string $version = 'newest') { - $this->view->versions = $this->pivot->getPivotVersions($pivotID); - $this->view->version = $version == 'newest' ? $this->pivot->getMaxVersion($pivotID) : $version; - $this->view->pivot = $this->pivot->getByID($pivotID); + $this->view->versionSpecs = $this->pivot->getPivotVersions($pivotID); + $this->view->version = $version == 'newest' ? $this->pivot->getMaxVersion($pivotID) : $version; + $this->view->pivot = $this->pivot->getByID($pivotID); $this->display(); } diff --git a/module/pivot/lang/de.php b/module/pivot/lang/de.php index 57298fe452..29cb51b4c8 100644 --- a/module/pivot/lang/de.php +++ b/module/pivot/lang/de.php @@ -492,6 +492,8 @@ $lang->pivot->drill->activatedBug = "Activated Bug Count"; $lang->pivot->drill->auto = "Auto"; $lang->pivot->drill->designChangedTip = 'Setting columns field change, please check'; +$lang->pivot->versionNumber = 'Version'; +$lang->pivot->versionDesc = 'Desc'; $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; $lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; diff --git a/module/pivot/lang/en.php b/module/pivot/lang/en.php index ddbd1fb037..3586d8fd19 100644 --- a/module/pivot/lang/en.php +++ b/module/pivot/lang/en.php @@ -492,6 +492,8 @@ $lang->pivot->drill->activatedBug = "Activated Bug Count"; $lang->pivot->drill->auto = "Auto"; $lang->pivot->drill->designChangedTip = 'Setting columns field change, please check'; +$lang->pivot->versionNumber = 'Version'; +$lang->pivot->versionDesc = 'Desc'; $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; $lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; diff --git a/module/pivot/lang/fr.php b/module/pivot/lang/fr.php index 8d06801354..23d50f6f23 100644 --- a/module/pivot/lang/fr.php +++ b/module/pivot/lang/fr.php @@ -492,6 +492,8 @@ $lang->pivot->drill->activatedBug = "Activated Bug Count"; $lang->pivot->drill->auto = "Auto"; $lang->pivot->drill->designChangedTip = 'Setting columns field change, please check'; +$lang->pivot->versionNumber = 'Version'; +$lang->pivot->versionDesc = 'Desc'; $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; $lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; diff --git a/module/pivot/lang/zh-cn.php b/module/pivot/lang/zh-cn.php index db389944bc..3271fa6255 100644 --- a/module/pivot/lang/zh-cn.php +++ b/module/pivot/lang/zh-cn.php @@ -492,6 +492,8 @@ $lang->pivot->drill->activatedBug = "激活的Bug数"; $lang->pivot->drill->auto = "自动"; $lang->pivot->drill->designChangedTip = '设计变更,请检查'; +$lang->pivot->versionNumber = '版本号'; +$lang->pivot->versionDesc = '版本描述'; $lang->pivot->tipNewVersion = '有新版本更新'; $lang->pivot->checkNewVersion = '点击查看'; $lang->pivot->tipVersions = '此版本的内容如下所示,您可以点击下方按钮进行版本切换。切换版本后,此透视表内容以及进入设计后的设计器内相关配置,均会按照切换的版本展示。'; diff --git a/module/pivot/ui/versions.html.php b/module/pivot/ui/versions.html.php index 6039bb0474..e6ce4eb174 100644 --- a/module/pivot/ui/versions.html.php +++ b/module/pivot/ui/versions.html.php @@ -9,6 +9,17 @@ declare(strict_types = 1); * @link https://www.zentao.net */ namespace zin; + +$versionsTableBody = array(); +foreach($versionSpecs as $versionSpec) +{ + $versionsTableBody[] = h::tr + ( + h::td('#' . $versionSpec->version), + h::td($versionSpec->desc), + ); +} + panel ( setID('pivotVersionPanel'), @@ -24,5 +35,15 @@ panel setData(array('toggle' => 'tooltip', 'title' => $lang->pivot->tipVersions, 'placement' => 'right', 'className' => 'text-wraning border border-light', 'type' => 'white')), 'help' ) + ), + h::table + ( + set::className('versionTable table bordered'), + h::tr + ( + h::th($lang->pivot->versionNumber), + h::th($lang->pivot->desc) + ), + $versionsTableBody ) ); From 18239bdcaa9f87efe4d56cf1525179f37d2d1602 Mon Sep 17 00:00:00 2001 From: liyang Date: Thu, 21 Nov 2024 15:39:56 +0800 Subject: [PATCH 008/431] * [task#132856] adjust get list method. --- module/system/control.php | 2 +- module/system/model.php | 3 ++- module/system/test/model/getlist.php | 15 ++++++++------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/module/system/control.php b/module/system/control.php index 4bbc0dce4d..2141fc0361 100644 --- a/module/system/control.php +++ b/module/system/control.php @@ -542,7 +542,7 @@ class system extends control $this->app->loadClass('pager', true); $pager = pager::init($recTotal, $recPerPage, $pageID); - $systems = $this->system->getList($orderBy, $pager); + $systems = $this->system->getList($productID, $orderBy, $pager); foreach($systems as &$system) { $system->latestRelease = $system->latestRelease ? $system->latestRelease : ''; diff --git a/module/system/model.php b/module/system/model.php index 2270186625..e13b935901 100644 --- a/module/system/model.php +++ b/module/system/model.php @@ -22,10 +22,11 @@ class systemModel extends model * @access public * @return array */ - public function getList(string $orderBy = 'id_desc', object $pager = null): array + public function getList(int $product, string $orderBy = 'id_desc', object $pager = null): array { return $this->dao->select('*')->from(TABLE_SYSTEM) ->where('deleted')->eq('0') + ->andWhere('product')->eq($product) ->orderBy($orderBy) ->page($pager) ->fetchAll(); diff --git a/module/system/test/model/getlist.php b/module/system/test/model/getlist.php index f98b571511..2085a0b95e 100755 --- a/module/system/test/model/getlist.php +++ b/module/system/test/model/getlist.php @@ -3,6 +3,7 @@ include dirname(__FILE__, 5) . '/test/lib/init.php'; su('admin'); zenData('system')->gen(10); +zenData('product')->gen(10); /** @@ -10,8 +11,8 @@ title=测试 systemModel::getList(); timeout=0 cid=1 -- 查询默认排序应用第0条的name属性 @应用10 -- 获取所有应用数量 @10 +- 查询默认排序应用第0条的name属性 @应用1 +- 获取所有应用数量 @1 - 查询默认排序应用下的状态第0条的status属性 @active - 查询ID正序排序应用第0条的name属性 @应用1 - 查询状态倒序排序应用第0条的name属性 @应用1 @@ -22,8 +23,8 @@ $system = $tester->loadModel('system'); $orderList = array('id_desc', 'id_asc', 'status_desc', 'status_asc'); -r($system->getList()) && p('0:name') && e('应用10'); // 查询默认排序应用 -r(count($system->getList())) && p() && e('10'); // 获取所有应用数量 -r($system->getList()) && p('0:status') && e('active'); // 查询默认排序应用下的状态 -r($system->getList($orderList[1])) && p('0:name') && e('应用1'); // 查询ID正序排序应用 -r($system->getList($orderList[2])) && p('0:name') && e('应用1'); // 查询状态倒序排序应用 +r($system->getList(1)) && p('0:name') && e('应用1'); // 查询默认排序应用 +r(count($system->getList(1))) && p() && e('1'); // 获取所有应用数量 +r($system->getList(1)) && p('0:status') && e('active'); // 查询默认排序应用下的状态 +r($system->getList(1, $orderList[1])) && p('0:name') && e('应用1'); // 查询ID正序排序应用 +r($system->getList(1, $orderList[2])) && p('0:name') && e('应用1'); // 查询状态倒序排序应用 From dfd9446f83c744ac639d429f453b734a9749766f Mon Sep 17 00:00:00 2001 From: liyang Date: Thu, 21 Nov 2024 15:41:56 +0800 Subject: [PATCH 009/431] * [task#132856] adjust get list method. --- test/data/system.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/data/system.yaml b/test/data/system.yaml index d3cb285db8..68de496eb3 100644 --- a/test/data/system.yaml +++ b/test/data/system.yaml @@ -13,8 +13,6 @@ fields: range: 0-1 - field: latestRelease range: 0 - - field: latestDate - range: [] - field: children range: "[],1" - field: status From 5e0fab6444aba388141ab552ad232936816b5492 Mon Sep 17 00:00:00 2001 From: liugang Date: Thu, 21 Nov 2024 16:23:55 +0800 Subject: [PATCH 010/431] + [refac] update privileges of cache. --- db/update21.1.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/update21.1.sql b/db/update21.1.sql index 28b13ca9db..be31beab31 100644 --- a/db/update21.1.sql +++ b/db/update21.1.sql @@ -74,3 +74,5 @@ CREATE TABLE IF NOT EXISTS `zt_mark` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE INDEX `idx_object` ON `zt_mark`(`objectType`,`objectID`); CREATE INDEX `idx_account` ON `zt_mark`(`account`); + +UPDATE `zt_grouppriv` SET `module` = 'cache', `method` = 'setting' WHERE `module` = 'admin' AND `method` = 'cache'; From 4435beefce82b904454cd8036e35c20cf82340f9 Mon Sep 17 00:00:00 2001 From: liugang Date: Thu, 21 Nov 2024 16:24:22 +0800 Subject: [PATCH 011/431] + [refac] add configuration of unused file. --- module/upgrade/config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/upgrade/config.php b/module/upgrade/config.php index 216a10400e..c5e60bd630 100644 --- a/module/upgrade/config.php +++ b/module/upgrade/config.php @@ -1408,6 +1408,7 @@ $config->delete['20_9'][] = 'extension/biz/deploy/js/finish.ui.js'; $config->delete['20_9'][] = 'extension/max/deploy/js/finish.ui.js'; $config->delete['20_9'][] = 'extension/ipd/deploy/js/finish.ui.js'; $config->delete['20_9'][] = 'module/account/'; +$config->delete['21_1'][] = 'module/admin/ui/cache.html.php'; $config->upgrade->openModules = array('action', 'admin', 'ai', 'bi', 'aiapp', 'api', 'automation', 'backup', 'block', 'branch', 'budget', 'bug', 'build', 'cache', 'caselib', 'chart', 'ci', 'client', 'common', 'company', 'compile', 'convert', 'cron', 'custom', 'datatable', 'dataview', 'dept', 'design', 'dev', 'dimension', 'doc', 'durationestimation', 'entry', 'execution', 'extension', 'file', 'git', 'gitlab', 'group', 'holiday', 'im', 'index', 'index.html', 'install', 'issue', 'jenkins', 'job', 'kanban', 'license', 'mail', 'message', 'metric', 'misc', 'mr', 'my', 'personnel', 'pipeline', 'product', 'productplan', 'productset', 'program', 'programplan', 'project', 'projectbuild', 'projectplan', 'projectrelease', 'projectstory', 'pivot', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'screen', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation', 'gitea', 'gogs', 'transfer', 'zahost', 'zanode', 'editor', 'charter', 'roadmap', 'account', 'cne', 'host', 'instance', 'ops', 'serverroom', 'space', 'store', 'system', 'solution', 'demand', 'gitfox', 'epic', 'requirement'); $config->upgrade->unsetModules = array('design', 'program', 'programplan', 'projectbuild', 'projectrelease', 'stage', 'stakeholder', 'product', 'branch', 'productplan', 'release', 'build', 'qa', 'bug', 'testcase', 'testtask', 'testreport', 'testsuite', 'caselib', 'automation', 'repo', 'ci', 'compile', 'jenkins', 'job', 'svn', 'gitlab', 'sonarqube', 'mr', 'git', 'report', 'sqlbuilder', 'feedback', 'faq', 'attend', 'holiday', 'leave', 'makeup', 'overtime', 'lieu', 'ops', 'host', 'serverroom', 'account', 'domain', 'service', 'deploy', 'conference', 'traincourse', 'pssp', 'baseline', 'classify', 'cm', 'cmcl', 'auditcl', 'reviewcl', 'process', 'activity', 'zoutput', 'auditplan', 'nc', 'subject', 'weekly', 'workestimation', 'issue', 'durationestimation', 'risk', 'opportunity', 'trainplan', 'gapanalysis', 'researchplan', 'researchreport', 'meeting', 'meetingroom', 'budget', 'reviewissue', 'reviewsetting', 'review', 'milestone', 'measurement', 'measrecord', 'assetlib', 'setting', 'im', 'client', 'ldap', 'dev', 'api', 'gitea', 'gogs', 'zanode', 'zahost'); From 5f0ca3bc10a2c79a8a2264b1daca7e6cb1e3ff66 Mon Sep 17 00:00:00 2001 From: liugang Date: Thu, 21 Nov 2024 16:24:45 +0800 Subject: [PATCH 012/431] + [refac] generate cache config based on old configuration. --- module/upgrade/config/upgradeflow.php | 1 + module/upgrade/model.php | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/module/upgrade/config/upgradeflow.php b/module/upgrade/config/upgradeflow.php index fcb21144d1..e1775aae5d 100644 --- a/module/upgrade/config/upgradeflow.php +++ b/module/upgrade/config/upgradeflow.php @@ -105,6 +105,7 @@ $config->upgrade->execFlow['20_5'] = array('functions' => 'fixWorkflowFie $config->upgrade->execFlow['20_6'] = array('functions' => 'processDemandFiles,processSqlbuilderTables'); $config->upgrade->execFlow['20_7'] = array('functions' => 'upgradeMyDocSpace'); $config->upgrade->execFlow['20_8'] = array('functions' => 'processWorkflowGroups'); +$config->upgrade->execFlow['21_1'] = array('functions' => 'processCacheConfig'); if(!empty($config->isINT)) { diff --git a/module/upgrade/model.php b/module/upgrade/model.php index c01169e18f..4c3939c9d1 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -10451,4 +10451,21 @@ class upgradeModel extends model } } } + + /** + * 根据旧的缓存配置生成新的缓存配置。 + * Generate new cache config. + * + * @access public + * @return void + */ + public function processCacheConfig() + { + $cache = json_decode($this->config->global->cache); + if(!empty($cache->dao->enable)) + { + $this->loadModel('install')->enableCache(); + $this->loadModel('setting')->deleteItems('owner=system&module=common§ion=global&key=cache'); + } + } } From 5f4856dc0b1239b457861b080d2afe1c6d1aeae9 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Thu, 21 Nov 2024 16:25:17 +0800 Subject: [PATCH 013/431] * [task#132860,doing,0.2h] adjust language for relase. --- module/release/lang/de.php | 4 +++- module/release/lang/en.php | 4 +++- module/release/lang/fr.php | 4 +++- module/release/lang/zh-cn.php | 6 ++++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/module/release/lang/de.php b/module/release/lang/de.php index 9328a5b1ca..a43f83578e 100755 --- a/module/release/lang/de.php +++ b/module/release/lang/de.php @@ -43,8 +43,10 @@ $lang->release->branch = 'Platform/Branch'; $lang->release->project = $lang->projectCommon; $lang->release->build = 'Build'; $lang->release->includedBuild = 'Included Builds'; +$lang->release->includedSystem = 'Included App'; $lang->release->relatedProject = 'Related ' . $lang->projectCommon; -$lang->release->name = 'Name'; +$lang->release->system = 'App'; +$lang->release->name = 'Version'; $lang->release->marker = 'Meilensteine'; $lang->release->date = 'Plan Date'; $lang->release->releasedDate = 'Actual Date'; diff --git a/module/release/lang/en.php b/module/release/lang/en.php index 237576da92..76eda0c5cb 100755 --- a/module/release/lang/en.php +++ b/module/release/lang/en.php @@ -43,8 +43,10 @@ $lang->release->branch = 'Platform/Branch'; $lang->release->project = $lang->projectCommon; $lang->release->build = 'Build'; $lang->release->includedBuild = 'Included Builds'; +$lang->release->includedSystem = 'Included App'; $lang->release->relatedProject = 'Related ' . $lang->projectCommon; -$lang->release->name = 'Name'; +$lang->release->system = 'App'; +$lang->release->name = 'Version'; $lang->release->marker = 'Milestone'; $lang->release->date = 'Plan Date'; $lang->release->releasedDate = 'Actual Date'; diff --git a/module/release/lang/fr.php b/module/release/lang/fr.php index 0f073f839c..0027fe069a 100755 --- a/module/release/lang/fr.php +++ b/module/release/lang/fr.php @@ -43,8 +43,10 @@ $lang->release->branch = 'Plateforme/Branche'; $lang->release->project = $lang->projectCommon; $lang->release->build = 'Build'; $lang->release->includedBuild = 'Included Builds'; +$lang->release->includedSystem = 'Included App'; $lang->release->relatedProject = 'Related ' . $lang->projectCommon; -$lang->release->name = 'Nom'; +$lang->release->system = 'App'; +$lang->release->name = 'Version'; $lang->release->marker = 'Etape Importante'; $lang->release->date = 'Plan Date'; $lang->release->releasedDate = 'Actual Date'; diff --git a/module/release/lang/zh-cn.php b/module/release/lang/zh-cn.php index ca21bffebd..71d73698b7 100755 --- a/module/release/lang/zh-cn.php +++ b/module/release/lang/zh-cn.php @@ -42,9 +42,11 @@ $lang->release->product = "所属{$lang->productCommon}"; $lang->release->branch = '平台/分支'; $lang->release->project = '所属' . $lang->projectCommon; $lang->release->build = '版本'; -$lang->release->includedBuild = '包含版本'; +$lang->release->includedBuild = '包含构建'; +$lang->release->includedSystem = '包含应用'; $lang->release->relatedProject = '对应' . $lang->projectCommon; -$lang->release->name = '发布名称'; +$lang->release->system = '应用'; +$lang->release->name = '应用版本号'; $lang->release->marker = '里程碑'; $lang->release->date = '计划发布日期'; $lang->release->releasedDate = '实际发布日期'; From 91e3fb0a6476a12b785521700e99e5faf99a7abc Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Thu, 21 Nov 2024 16:26:28 +0800 Subject: [PATCH 014/431] * [task#132860,doing,0.3h] adjust params for system getPairs. --- module/system/control.php | 4 ++-- module/system/model.php | 6 +++++- module/system/test/model/getpairs.php | 11 ++++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/module/system/control.php b/module/system/control.php index 2141fc0361..36a9c7474a 100644 --- a/module/system/control.php +++ b/module/system/control.php @@ -587,7 +587,7 @@ class system extends control } $this->view->title = $this->lang->system->create; - $this->view->systemList = $this->system->getPairs('0'); + $this->view->systemList = $this->system->getPairs(0, '0'); $this->display(); } @@ -622,7 +622,7 @@ class system extends control $this->view->title = $this->lang->system->edit; $this->view->system = $system; - $this->view->systemList = $this->system->getPairs('0'); + $this->view->systemList = $this->system->getPairs(0, '0'); $this->display(); } diff --git a/module/system/model.php b/module/system/model.php index e13b935901..6b818c3342 100644 --- a/module/system/model.php +++ b/module/system/model.php @@ -36,14 +36,18 @@ class systemModel extends model * 获取应用键值对。 * Get app pairs. * + * @param int $productID * @param string $integrated + * @param string $status * @access public * @return array */ - public function getPairs(string $integrated = ''): array + public function getPairs(int $productID = 0, string $integrated = '', string $status = ''): array { return $this->dao->select('id, name')->from(TABLE_SYSTEM) ->where('deleted')->eq('0') + ->beginIF($productID)->andWhere('product')->eq($productID)->fi() + ->beginIF($status)->andWhere('status')->eq($status)->fi() ->beginIF($integrated !== '')->andWhere('integrated')->eq($integrated)->fi() ->fetchPairs('id', 'name'); } diff --git a/module/system/test/model/getpairs.php b/module/system/test/model/getpairs.php index a670569428..d469f52a9b 100755 --- a/module/system/test/model/getpairs.php +++ b/module/system/test/model/getpairs.php @@ -5,6 +5,7 @@ su('admin'); zenData('system')->gen(10); /** + title=测试 systemModel::getPairs(); timeout=0 cid=1 @@ -19,8 +20,8 @@ cid=1 global $tester; $system = $tester->loadModel('system'); -r($system->getPairs()) && p('1') && e('应用1'); // 查询默认键值对 -r(count($system->getPairs())) && p() && e('10'); // 查询默认键值对数量 -r($system->getPairs('0')) && p('1') && e('应用1'); // 查询非集成应用 -r($system->getPairs('1')) && p('2') && e('应用2'); // 查询集成应用 -r(count($system->getPairs('1'))) && p() && e('5'); // 查询集成应用数量 +r($system->getPairs()) && p('1') && e('应用1'); // 查询默认键值对 +r(count($system->getPairs())) && p() && e('10'); // 查询默认键值对数量 +r($system->getPairs(1, '0')) && p('1') && e('应用1'); // 查询非集成应用 +r($system->getPairs(2, '1')) && p('2') && e('应用2'); // 查询集成应用 +r(count($system->getPairs(0, '1'))) && p() && e('5'); // 查询集成应用数量 From a78b17482f0f8ab2f790a1bb9004321b8f206a1c Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Thu, 21 Nov 2024 01:58:48 +0000 Subject: [PATCH 015/431] * [misc] add open module. --- module/upgrade/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/upgrade/config.php b/module/upgrade/config.php index c5e60bd630..27258c7ddb 100644 --- a/module/upgrade/config.php +++ b/module/upgrade/config.php @@ -1410,7 +1410,7 @@ $config->delete['20_9'][] = 'extension/ipd/deploy/js/finish.ui.js'; $config->delete['20_9'][] = 'module/account/'; $config->delete['21_1'][] = 'module/admin/ui/cache.html.php'; -$config->upgrade->openModules = array('action', 'admin', 'ai', 'bi', 'aiapp', 'api', 'automation', 'backup', 'block', 'branch', 'budget', 'bug', 'build', 'cache', 'caselib', 'chart', 'ci', 'client', 'common', 'company', 'compile', 'convert', 'cron', 'custom', 'datatable', 'dataview', 'dept', 'design', 'dev', 'dimension', 'doc', 'durationestimation', 'entry', 'execution', 'extension', 'file', 'git', 'gitlab', 'group', 'holiday', 'im', 'index', 'index.html', 'install', 'issue', 'jenkins', 'job', 'kanban', 'license', 'mail', 'message', 'metric', 'misc', 'mr', 'my', 'personnel', 'pipeline', 'product', 'productplan', 'productset', 'program', 'programplan', 'project', 'projectbuild', 'projectplan', 'projectrelease', 'projectstory', 'pivot', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'screen', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation', 'gitea', 'gogs', 'transfer', 'zahost', 'zanode', 'editor', 'charter', 'roadmap', 'account', 'cne', 'host', 'instance', 'ops', 'serverroom', 'space', 'store', 'system', 'solution', 'demand', 'gitfox', 'epic', 'requirement'); +$config->upgrade->openModules = array('action', 'admin', 'ai', 'bi', 'aiapp', 'api', 'automation', 'backup', 'block', 'branch', 'budget', 'bug', 'build', 'cache', 'caselib', 'chart', 'ci', 'client', 'common', 'company', 'compile', 'convert', 'cron', 'custom', 'datatable', 'dataview', 'dept', 'design', 'dev', 'dimension', 'doc', 'durationestimation', 'entry', 'execution', 'extension', 'file', 'git', 'gitlab', 'group', 'holiday', 'im', 'index', 'index.html', 'install', 'issue', 'jenkins', 'job', 'kanban', 'license', 'mail', 'message', 'metric', 'misc', 'mr', 'my', 'personnel', 'pipeline', 'product', 'productplan', 'productset', 'program', 'programplan', 'project', 'projectbuild', 'projectplan', 'projectrelease', 'projectstory', 'pivot', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'screen', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation', 'gitea', 'gogs', 'transfer', 'zahost', 'zanode', 'editor', 'charter', 'roadmap', 'account', 'cne', 'host', 'instance', 'ops', 'serverroom', 'space', 'store', 'system', 'solution', 'demand', 'gitfox', 'epic', 'requirement', 'mark'); $config->upgrade->unsetModules = array('design', 'program', 'programplan', 'projectbuild', 'projectrelease', 'stage', 'stakeholder', 'product', 'branch', 'productplan', 'release', 'build', 'qa', 'bug', 'testcase', 'testtask', 'testreport', 'testsuite', 'caselib', 'automation', 'repo', 'ci', 'compile', 'jenkins', 'job', 'svn', 'gitlab', 'sonarqube', 'mr', 'git', 'report', 'sqlbuilder', 'feedback', 'faq', 'attend', 'holiday', 'leave', 'makeup', 'overtime', 'lieu', 'ops', 'host', 'serverroom', 'account', 'domain', 'service', 'deploy', 'conference', 'traincourse', 'pssp', 'baseline', 'classify', 'cm', 'cmcl', 'auditcl', 'reviewcl', 'process', 'activity', 'zoutput', 'auditplan', 'nc', 'subject', 'weekly', 'workestimation', 'issue', 'durationestimation', 'risk', 'opportunity', 'trainplan', 'gapanalysis', 'researchplan', 'researchreport', 'meeting', 'meetingroom', 'budget', 'reviewissue', 'reviewsetting', 'review', 'milestone', 'measurement', 'measrecord', 'assetlib', 'setting', 'im', 'client', 'ldap', 'dev', 'api', 'gitea', 'gogs', 'zanode', 'zahost'); global $lang; From 71503cccb32d72c9c70379b7f8d3af8f40469bf7 Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Thu, 21 Nov 2024 06:14:38 +0000 Subject: [PATCH 016/431] * [story#69521,0.2h] add version to zt_chart. --- db/update21.1.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/update21.1.sql b/db/update21.1.sql index be31beab31..d2112787f6 100644 --- a/db/update21.1.sql +++ b/db/update21.1.sql @@ -52,6 +52,7 @@ CREATE TABLE IF NOT EXISTS `zt_pivotspec` ( CREATE UNIQUE INDEX `idx_pivot_version` ON `zt_pivotspec`(`pivot`, `version`); ALTER TABLE `zt_pivot` ADD `version` varchar(10) NOT NULL DEFAULT '0' AFTER `builtin`; +ALTER TABLE `zt_chart` ADD `version` varchar(10) NOT NULL DEFAULT '0' AFTER `builtin`; ALTER TABLE `zt_pivot` CHANGE `mode` `mode` varchar(10) NOT NULL DEFAULT 'builder'; ALTER TABLE `zt_pivot` CHANGE `sql` `sql` text NULL; ALTER TABLE `zt_pivot` CHANGE `fields` `fields` text NULL; From 85a54862c862d4c23d6ecba25598e447fadeb2fe Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Thu, 21 Nov 2024 06:15:41 +0000 Subject: [PATCH 017/431] * [story#69521,0.2h] add lang. --- module/pivot/lang/de.php | 1 + module/pivot/lang/en.php | 1 + module/pivot/lang/fr.php | 1 + module/pivot/lang/zh-cn.php | 1 + 4 files changed, 4 insertions(+) diff --git a/module/pivot/lang/de.php b/module/pivot/lang/de.php index 29cb51b4c8..86484a6b60 100644 --- a/module/pivot/lang/de.php +++ b/module/pivot/lang/de.php @@ -27,6 +27,7 @@ $lang->pivot->story = 'Story'; $lang->pivot->clear = 'Clear'; $lang->pivot->keep = 'Keep'; $lang->pivot->new = 'New'; +$lang->pivot->version = 'Version'; $lang->pivot->accessDenied = 'You do not have access to this pivot'; $lang->pivot->acl = 'Access Control'; diff --git a/module/pivot/lang/en.php b/module/pivot/lang/en.php index 3586d8fd19..bbb6914f09 100644 --- a/module/pivot/lang/en.php +++ b/module/pivot/lang/en.php @@ -27,6 +27,7 @@ $lang->pivot->story = 'Story'; $lang->pivot->clear = 'Clear'; $lang->pivot->keep = 'Keep'; $lang->pivot->new = 'New'; +$lang->pivot->version = 'Version'; $lang->pivot->accessDenied = 'You do not have access to this pivot'; $lang->pivot->acl = 'Access Control'; diff --git a/module/pivot/lang/fr.php b/module/pivot/lang/fr.php index 23d50f6f23..0ccca3e3f7 100644 --- a/module/pivot/lang/fr.php +++ b/module/pivot/lang/fr.php @@ -27,6 +27,7 @@ $lang->pivot->story = 'Story'; $lang->pivot->clear = 'Clear'; $lang->pivot->keep = 'Keep'; $lang->pivot->new = 'New'; +$lang->pivot->version = 'Version'; $lang->pivot->accessDenied = 'You do not have access to this pivot'; $lang->pivot->acl = 'Access Control'; diff --git a/module/pivot/lang/zh-cn.php b/module/pivot/lang/zh-cn.php index 3271fa6255..7ba0c466dc 100644 --- a/module/pivot/lang/zh-cn.php +++ b/module/pivot/lang/zh-cn.php @@ -27,6 +27,7 @@ $lang->pivot->story = '需求'; $lang->pivot->clear = '清空'; $lang->pivot->keep = '保留设计'; $lang->pivot->new = '新'; +$lang->pivot->version = '当前版本'; $lang->pivot->accessDenied = '您无权访问该透视表'; $lang->pivot->acl = '访问控制'; From 8332953b8393521f9f37319191ebf61089592500 Mon Sep 17 00:00:00 2001 From: songchenxuan Date: Thu, 21 Nov 2024 17:00:25 +0800 Subject: [PATCH 018/431] *[task#133011,1h,done]. --- module/pivot/control.php | 1 - module/pivot/zen.php | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/module/pivot/control.php b/module/pivot/control.php index f4f2e864ba..4dae1bab5d 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -51,7 +51,6 @@ class pivot extends control if($method && $method != 'show' && !common::hasPriv('pivot', $method)) $this->loadModel('common')->deny('pivot', $method); parse_str($params, $result); - if(method_exists($this->pivotZen, $method)) call_user_func_array(array($this->pivotZen, $method), $result); $this->session->set('backDimension', $dimensionID); $this->session->set('backGroup', $groupID); diff --git a/module/pivot/zen.php b/module/pivot/zen.php index db7b1ca587..60c8f7af8a 100644 --- a/module/pivot/zen.php +++ b/module/pivot/zen.php @@ -98,7 +98,7 @@ class pivotZen extends pivot foreach($pivots as $pivot) { $this->setNewMark($pivot, $firstAction); - $params = helper::safe64Encode("groupID={$group->id}&pivotID={$pivot->id}"); + $params = helper::safe64Encode("groupID={$group->id}&pivotID={$pivot->id}&mark=view"); $url = inlink('preview', "dimension={$dimensionID}&group={$currentGroup->id}&method=show¶ms={$params}"); $menus[] = (object)array('id' => $group->id . '_' . $pivot->id, 'parent' => $group->grade > 1 ? $group->id : 0, 'name' => $pivot->name, 'url' => $url); } @@ -169,12 +169,14 @@ class pivotZen extends pivot * @access public * @return void */ - public function show(int $groupID, int $pivotID): void + public function show(int $groupID, int $pivotID, string $mark = ''): void { $this->pivot->checkAccess($pivotID, 'preview'); $pivot = $this->pivot->getByID($pivotID, true); $driver = $pivot->driver; + + if($mark) $this->loadModel('mark')->setMark(array($pivot->id), 'pivot', $pivot->version, 'view'); if(isset($_POST['filterValues']) and $_POST['filterValues']) { foreach($this->post->filterValues as $key => $value) $pivot->filters[$key]['default'] = $value; From 2fa8ba8d57bc53e50cbde8aaf3532b4f6532cc2f Mon Sep 17 00:00:00 2001 From: sunguangming Date: Thu, 21 Nov 2024 09:04:51 +0000 Subject: [PATCH 019/431] * [misc] fix code error. --- module/story/tao.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/story/tao.php b/module/story/tao.php index e3c4b96756..c285af13ea 100644 --- a/module/story/tao.php +++ b/module/story/tao.php @@ -1911,6 +1911,8 @@ class storyTao extends storyModel */ protected function checkConditions(string $method, object $story) { + if($this->config->edition == 'open') return true; + static $flowActions = []; if(empty($flowActions)) $flowActions = $this->loadModel('workflowaction')->getList($story->type); $this->loadModel('flow'); From 1a60b77c72bb06ace681fe045ced3790efdda91e Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Thu, 21 Nov 2024 09:19:10 +0000 Subject: [PATCH 020/431] * [story#69521,0.2h] add lang. --- module/pivot/lang/de.php | 4 +++- module/pivot/lang/en.php | 4 +++- module/pivot/lang/fr.php | 4 +++- module/pivot/lang/zh-cn.php | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/module/pivot/lang/de.php b/module/pivot/lang/de.php index 86484a6b60..68e62db69d 100644 --- a/module/pivot/lang/de.php +++ b/module/pivot/lang/de.php @@ -28,6 +28,7 @@ $lang->pivot->clear = 'Clear'; $lang->pivot->keep = 'Keep'; $lang->pivot->new = 'New'; $lang->pivot->version = 'Version'; +$lang->pivot->viewVersion = 'View version'; $lang->pivot->accessDenied = 'You do not have access to this pivot'; $lang->pivot->acl = 'Access Control'; @@ -41,7 +42,8 @@ $lang->pivot->otherLang->productType = 'Product type'; $lang->pivot->cancelAndBack = 'Cancel save and back'; -$lang->pivot->deleteTip = 'Are you sure you want to delete it ?'; +$lang->pivot->deleteTip = 'Are you sure you want to delete it ?'; +$lang->pivot->disableVersionTip = 'The pivot table in draft mode does not support the version list popup at the moment.'; $lang->pivot->rangeList['current'] = 'Current Page'; $lang->pivot->rangeList['all'] = 'All Data'; diff --git a/module/pivot/lang/en.php b/module/pivot/lang/en.php index bbb6914f09..a89f8d7f9b 100644 --- a/module/pivot/lang/en.php +++ b/module/pivot/lang/en.php @@ -28,6 +28,7 @@ $lang->pivot->clear = 'Clear'; $lang->pivot->keep = 'Keep'; $lang->pivot->new = 'New'; $lang->pivot->version = 'Version'; +$lang->pivot->viewVersion = 'View version'; $lang->pivot->accessDenied = 'You do not have access to this pivot'; $lang->pivot->acl = 'Access Control'; @@ -41,7 +42,8 @@ $lang->pivot->otherLang->productType = 'Product type'; $lang->pivot->cancelAndBack = 'Cancel save and back'; -$lang->pivot->deleteTip = 'Are you sure you want to delete it ?'; +$lang->pivot->deleteTip = 'Are you sure you want to delete it ?'; +$lang->pivot->disableVersionTip = 'The pivot table in draft mode does not support the version list popup at the moment.'; $lang->pivot->rangeList['current'] = 'Current Page'; $lang->pivot->rangeList['all'] = 'All Data'; diff --git a/module/pivot/lang/fr.php b/module/pivot/lang/fr.php index 0ccca3e3f7..3497ff9cbc 100644 --- a/module/pivot/lang/fr.php +++ b/module/pivot/lang/fr.php @@ -28,6 +28,7 @@ $lang->pivot->clear = 'Clear'; $lang->pivot->keep = 'Keep'; $lang->pivot->new = 'New'; $lang->pivot->version = 'Version'; +$lang->pivot->viewVersion = 'View version'; $lang->pivot->accessDenied = 'You do not have access to this pivot'; $lang->pivot->acl = 'Access Control'; @@ -41,7 +42,8 @@ $lang->pivot->otherLang->productType = 'Product type'; $lang->pivot->cancelAndBack = 'Cancel save and back'; -$lang->pivot->deleteTip = 'Are you sure you want to delete it ?'; +$lang->pivot->deleteTip = 'Are you sure you want to delete it ?'; +$lang->pivot->disableVersionTip = 'The pivot table in draft mode does not support the version list popup at the moment.'; $lang->pivot->rangeList['current'] = 'Current Page'; $lang->pivot->rangeList['all'] = 'All Data'; diff --git a/module/pivot/lang/zh-cn.php b/module/pivot/lang/zh-cn.php index 7ba0c466dc..009946954f 100644 --- a/module/pivot/lang/zh-cn.php +++ b/module/pivot/lang/zh-cn.php @@ -28,6 +28,7 @@ $lang->pivot->clear = '清空'; $lang->pivot->keep = '保留设计'; $lang->pivot->new = '新'; $lang->pivot->version = '当前版本'; +$lang->pivot->viewVersion = '查看版本列表'; $lang->pivot->accessDenied = '您无权访问该透视表'; $lang->pivot->acl = '访问控制'; @@ -41,7 +42,8 @@ $lang->pivot->otherLang->productType = '产品类型'; $lang->pivot->cancelAndBack = '取消保存并返回'; -$lang->pivot->deleteTip = '您确认要删除吗?'; +$lang->pivot->deleteTip = '您确认要删除吗?'; +$lang->pivot->disableVersionTip = '草稿态的透视表暂时不支持查看版本列表弹窗。'; $lang->pivot->rangeList['current'] = '当前页'; $lang->pivot->rangeList['all'] = '全部'; From 5cfb0395fc6855a7fe60fe41ef772cb1d641b161 Mon Sep 17 00:00:00 2001 From: daitingting Date: Thu, 21 Nov 2024 09:32:52 +0000 Subject: [PATCH 021/431] * [task#133009,done,2h] Set default version, upgrade pivots. --- db/update21.1.sql | 3 ++ module/bi/config/pivots.php | 29 +++++++++++++++++ module/bi/model.php | 64 +++++++++++++++++++++++++------------ 3 files changed, 75 insertions(+), 21 deletions(-) diff --git a/db/update21.1.sql b/db/update21.1.sql index d2112787f6..1eb53cb5d3 100644 --- a/db/update21.1.sql +++ b/db/update21.1.sql @@ -77,3 +77,6 @@ CREATE INDEX `idx_object` ON `zt_mark`(`objectType`,`objectID`); CREATE INDEX `idx_account` ON `zt_mark`(`account`); UPDATE `zt_grouppriv` SET `module` = 'cache', `method` = 'setting' WHERE `module` = 'admin' AND `method` = 'cache'; + +UPDATE `zt_pivot` SET `version` = '1'; +INSERT INTO `zt_pivotspec` SELECT `id`,`version`,`driver`,`mode`,`name`,`desc`,`sql`,`fields`,`langs`,`vars`,`objects`,`settings`,`filters`,`createdDate` FROM `zt_pivot`; diff --git a/module/bi/config/pivots.php b/module/bi/config/pivots.php index 84847f00f7..c6dbe417ed 100644 --- a/module/bi/config/pivots.php +++ b/module/bi/config/pivots.php @@ -4,6 +4,7 @@ $config->bi->builtin->pivots = array(); $config->bi->builtin->pivots[] = array ( 'id' => 1000, + 'version' => '1', 'name' => array('zh-cn' => '完成项目工期透视表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'code' => 'finishedProjectDuration', 'dimension' => '2', @@ -93,6 +94,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1001, + 'version' => '1', 'name' => array('zh-cn' => '完成项目工时透视表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'code' => 'finishedProjectHour', 'dimension' => '2', @@ -221,6 +223,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1002, + 'version' => '1', 'name' => array('zh-cn' => '产品缺陷数据汇总表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'code' => 'productBugSummary', 'dimension' => '3', @@ -356,6 +359,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1003, + 'version' => '1', 'name' => array('zh-cn' => '产品需求交付统计表', 'zh-tw' => '產品完成度統計表', 'en' => 'Product Progress', 'de' => 'Product Progress', 'fr' => 'Product Progress'), 'code' => 'productProgress', 'desc' => array('zh-cn' => '按照产品列出需求总数,交付的需求总数(状态是关闭且关闭原因为已完成,或者研发阶段是已发布的需求)。', 'zh-tw' => '按照產品列出需求總數,完成的總數(狀態是關閉,或者研發階段是發布),完成的百分比。', 'en' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'de' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'fr' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.'), @@ -440,6 +444,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1004, + 'version' => '1', 'name' => array('zh-cn' => '产品需求状态分布表', 'zh-tw' => '產品需求狀態分布表', 'en' => 'Story Status', 'de' => 'Story Status', 'fr' => 'Story Status'), 'code' => 'productStoryStatus', 'desc' => array('zh-cn' => '按照产品列出需求总数,状态的分布情况。', 'zh-tw' => '按照產品列出需求總數,狀態的分布情況。', 'en' => 'Total number and status distribution of stories.', 'de' => 'Total number and status distribution of stories.', 'fr' => 'Total number and status distribution of stories.'), @@ -510,6 +515,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1005, + 'version' => '1', 'name' => array('zh-cn' => '产品需求阶段分布表', 'zh-tw' => '產品需求階段分布表', 'en' => 'Story Stage', 'de' => 'Story Stage', 'fr' => 'Story Stage'), 'code' => 'productStoryStage', 'desc' => array('zh-cn' => '按照产品列出需求总数,研发阶段的分布情况。', 'zh-tw' => '按照產品列出需求總數,研發階段的分布情況。', 'en' => 'Total number and stage distribution of stories ', 'de' => 'Total number and stage distribution of stories ', 'fr' => 'Total number and stage distribution of stories '), @@ -581,6 +587,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1006, + 'version' => '1', 'name' => array('zh-cn' => '产品发布数量统计表', 'zh-tw' => '產品發布數量統計表', 'en' => 'Product Release', 'de' => 'Product Release', 'fr' => 'Product Release'), 'code' => 'productRelease', 'desc' => array('zh-cn' => '按照产品列出发布的数量。', 'zh-tw' => '按照產品列出發布的數量。', 'en' => 'Product Release.', 'de' => 'Product Release.', 'fr' => 'Product Release.'), @@ -652,6 +659,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1007, + 'version' => '1', 'name' => array('zh-cn' => '任务状态统计表', 'zh-tw' => '任務狀態統計表', 'en' => 'Task Status Report', 'de' => 'Task Status Report', 'fr' => 'Task Status Report', 'vi' => 'Task Status Report', 'ja' => 'Task Status Report'), 'code' => 'taskStatus', 'desc' => array('zh-cn' => '按照执行统计任务的状态分布情况。', 'zh-tw' => '按照執行統計任務的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -759,6 +767,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1008, + 'version' => '1', 'name' => array('zh-cn' => '任务类型统计表', 'zh-tw' => '任務類型統計表', 'en' => 'Task Type Report', 'de' => 'Task Type Report', 'fr' => 'Task Type Report', 'vi' => 'Task Type Report', 'ja' => 'Task Type Report'), 'code' => 'taskType', 'desc' => array('zh-cn' => '按照项目统计任务的类型分布情况。', 'zh-tw' => '按照項目統計任務的類型分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -861,6 +870,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1009, + 'version' => '1', 'name' => array('zh-cn' => '项目任务指派统计表', 'zh-tw' => '項目任務指派統計表', 'en' => 'Task Assign Report', 'de' => 'Task Assign Report', 'fr' => 'Task Assign Report', 'vi' => 'Task Assign Report', 'ja' => 'Task Assign Report'), 'code' => 'projectTaskAssign', 'desc' => array('zh-cn' => '按照项目统计任务的指派给分布情况。', 'zh-tw' => '按照項目統計任務的指派給分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -964,6 +974,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1010, + 'version' => '1', 'name' => array('zh-cn' => '项目任务完成者统计表', 'zh-tw' => '項目任務完成者統計表', 'en' => 'Task Finish Report', 'de' => 'Task Finish Report', 'fr' => 'Task Finish Report', 'vi' => 'Task Finish Report', 'ja' => 'Task Finish Report'), 'code' => 'projectTaskFinished', 'desc' => array('zh-cn' => '按照项目统计任务的完成者分布情况。', 'zh-tw' => '按照項目統計任務的完成者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -1066,6 +1077,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1011, + 'version' => '1', 'name' => array('zh-cn' => '项目投入统计表', 'zh-tw' => '項目投入統計表', 'en' => 'Project Invest Report', 'de' => 'Project Invest Report', 'fr' => 'Project Invest Report', 'vi' => 'Project Invest Report', 'ja' => 'Project Invest Report'), 'code' => 'projectInvested', 'desc' => array('zh-cn' => '按照项目列出:任务数,需求数,人数,总消耗工时。', 'zh-tw' => '按照項目列出:任務數,需求數,人數,總消耗工時。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -1211,6 +1223,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1012, + 'version' => '1', 'name' => array('zh-cn' => '项目需求状态分布表', 'zh-tw' => '項目需求狀態分布表', 'en' => 'Project Story Status', 'de' => 'Project Story Status', 'fr' => 'Project Story Status', 'vi' => 'Project Story Status', 'ja' => 'Project Story Status'), 'code' => 'projectStoryStatus', 'desc' => array('zh-cn' => '按照项目统计需求的状态分布情况。', 'zh-tw' => '按照項目統計需求的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -1303,6 +1316,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1013, + 'version' => '1', 'name' => array('zh-cn' => '项目需求阶段分布表', 'zh-tw' => '項目需求階段分布表', 'en' => 'Project Stage Report', 'de' => 'Project Stage Report', 'fr' => 'Project Stage Report', 'vi' => 'Project Stage Report', 'ja' => 'Project Stage Report'), 'code' => 'projectStoryStage', 'desc' => array('zh-cn' => '按照项目统计需求阶段分布情况。', 'zh-tw' => '按照項目統計需求階段分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -1395,6 +1409,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1014, + 'version' => '1', 'name' => array('zh-cn' => '项目Bug解决方案分布表', 'zh-tw' => '項目Bug解決方案分布表', 'en' => 'Project Bug Resolution', 'de' => 'Project Bug Resolution', 'fr' => 'Project Bug Resolution', 'vi' => 'Project Bug Resolution', 'ja' => 'Project Bug Resolution'), 'code' => 'projectBugResolution', 'desc' => array('zh-cn' => '按照项目统计Bug的解决方案分布情况。', 'zh-tw' => '按照項目統計Bug的解決方案分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -1490,6 +1505,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1015, + 'version' => '1', 'name' => array('zh-cn' => '项目Bug状态分布表', 'zh-tw' => '項目Bug狀態分布表', 'en' => 'Project Bug Status', 'de' => 'Project Bug Status', 'fr' => 'Project Bug Status', 'vi' => 'Project Bug Status', 'ja' => 'Project Bug Status'), 'code' => 'projectBugStatus', 'desc' => array('zh-cn' => '按照项目统计Bug的状态分布情况。', 'zh-tw' => '按照項目統計Bug的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -1584,6 +1600,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1016, + 'version' => '1', 'name' => array('zh-cn' => '项目Bug创建者分布表', 'zh-tw' => '項目Bug創建者分布表', 'en' => 'Project Bug Opened', 'de' => 'Project Bug Opened', 'fr' => 'Project Bug Opened', 'vi' => 'Project Bug Opened', 'ja' => 'Project Bug Opened'), 'code' => 'projectBugOpenedBy', 'desc' => array('zh-cn' => '按照项目统计Bug的创建者分布情况。', 'zh-tw' => '按照項目統計Bug的創建者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -1678,6 +1695,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1017, + 'version' => '1', 'name' => array('zh-cn' => '项目Bug解决者分布表', 'zh-tw' => '項目Bug解決者分布表', 'en' => 'Project Bug Resolve', 'de' => 'Project Bug Resolve', 'fr' => 'Project Bug Resolve', 'vi' => 'Project Bug Resolve', 'ja' => 'Project Bug Resolve'), 'code' => 'projectBugResolvedBy', 'desc' => array('zh-cn' => '按照项目统计Bug的解决者分布情况。', 'zh-tw' => '按照項目統計Bug的解決者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -1774,6 +1792,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1018, + 'version' => '1', 'name' => array('zh-cn' => '项目Bug指派给分布表', 'zh-tw' => '項目Bug指派給分布表', 'en' => 'Project Bug Assign', 'de' => 'Project Bug Assign', 'fr' => 'Project Bug Assign', 'vi' => 'Project Bug Assign', 'ja' => 'Project Bug Assign'), 'code' => 'projectBugAssignedBy', 'desc' => array('zh-cn' => '按照项目统计Bug的指派给分布情况。', 'zh-tw' => '按照項目統計Bug的指派給分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -1867,6 +1886,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1019, + 'version' => '1', 'name' => array('zh-cn' => '项目质量表', 'zh-tw' => '項目質量表', 'en' => 'Project Quality Report', 'de' => 'Project Quality Report', 'fr' => 'Project Quality Report', 'vi' => 'Project Quality Report', 'ja' => 'Project Quality Report'), 'code' => 'projectQuality', 'desc' => array('zh-cn' => '列出项目的需求总数,完成需求数,任务总数,完成的任务数,Bug数,解决的Bug数,Bug/需求,Bug/任务,重要Bug数量(严重程度不大于3)。', 'zh-tw' => '列出項目的需求總數,完成需求數,任務總數,完成的任務數,Bug數,解決的Bug數,Bug/需求,Bug/任務,重要Bug數量(嚴重程度不大於3)。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -2057,6 +2077,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1020, + 'version' => '1', 'name' => array('zh-cn' => '产品Bug类型统计表', 'zh-tw' => '產品Bug類型統計表', 'en' => 'Bug Type of Product', 'de' => 'Bug Type of Product', 'fr' => 'Bug Type of Product'), 'code' => 'productBugType', 'desc' => array('zh-cn' => '按照产品统计Bug的类型分布情况。', 'zh-tw' => '按照產品統計Bug的類型分布情況。', 'en' => 'Type distribution of Bugs.', 'de' => 'Type distribution of Bugs.', 'fr' => 'Type distribution of Bugs.'), @@ -2132,6 +2153,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1021, + 'version' => '1', 'name' => array('zh-cn' => '产品质量表', 'zh-tw' => '產品質量表', 'en' => 'Product Quality', 'de' => 'Product Quality', 'fr' => 'Product Quality'), 'code' => 'productQuality', 'desc' => array('zh-cn' => '列出产品的需求数,完成的需求总数,Bug数,解决的Bug总数,Bug/需求,重要Bug数量(严重程度小于3)。', 'zh-tw' => '列出產品的需求數,完成的需求總數,Bug數,解決的Bug總數,Bug/需求,重要Bug數量(嚴重程度小於3)。', 'en' => 'Serious Bug (severity is less than 3).', 'de' => 'Serious Bug (severity is less than 3).', 'fr' => 'Serious Bug (severity is less than 3).'), @@ -2263,6 +2285,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1022, + 'version' => '1', 'name' => array('zh-cn' => '员工登录次数统计表', 'zh-tw' => '員工登錄次數統計表', 'en' => 'Login Times', 'de' => 'Login Times', 'fr' => 'Login Times'), 'code' => 'loginTimes', 'desc' => array('zh-cn' => '实现员工登录次数统计报表,按照天统计每天每个人的登录次数,以及总数。', 'zh-tw' => '實現員工登錄次數統計報表,按照天統計每天每個人的登錄次數,以及總數。', 'en' => 'The summary of user login times.', 'de' => 'The summary of user login times.', 'fr' => 'The summary of user login times.'), @@ -2334,6 +2357,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1023, + 'version' => '1', 'name' => array('zh-cn' => '日志汇总表', 'zh-tw' => '日誌匯總表', 'en' => 'Effort Summary', 'de' => 'Effort Summary', 'fr' => 'Effort Summary'), 'code' => 'effortSummary', 'desc' => array('zh-cn' => '查看某个时间段内的日志情况,可以按照部门选择。', 'zh-tw' => '查看某個時間段內的日誌情況,可以按照部門選擇。', 'en' => 'Effort summary of users within a certain period of time, you can select by department.', 'de' => 'Effort summary of users within a certain period of time, you can select by department.', 'fr' => 'Effort summary of users within a certain period of time, you can select by department.'), @@ -2416,6 +2440,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1024, + 'version' => '1', 'name' => array('zh-cn' => '公司动态汇总表', 'zh-tw' => '公司動態匯總表', 'en' => 'Company Dynamics', 'de' => 'Company Dynamics', 'fr' => 'Company Dynamics'), 'code' => 'companyDynamics', 'desc' => array('zh-cn' => '可以指定一个时期,列出相应的数据:1. 每天的登录次数。2. 每天的日志工时量。3. 每天新增的需求数。4. 每天关闭的需求数。5. 每天新增的任务数。6. 每天完成的任务数。7. 每天新增的Bug数。8. 每天解决的Bug数。9. 每天的动态数。', 'zh-tw' => '可以指定一個時期,列出相應的數據:1. 每天的登錄次數。2. 每天的日誌工時量。3. 每天新增的需求數。4. 每天關閉的需求數。5. 每天新增的任務數。6. 每天完成的任務數。7. 每天新增的Bug數。8. 每天解決的Bug數。9. 每天的動態數。', 'en' => 'The summary of company dynamics', 'de' => 'The summary of company dynamics', 'fr' => 'The summary of company dynamics'), @@ -2593,6 +2618,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1025, + 'version' => '1', 'name' => array('zh-cn' => 'Bug解决表', 'zh-tw' => 'Bug解決表', 'en' => 'Solved Bugs', 'de' => 'Solved Bugs', 'fr' => 'Solved Bugs'), 'code' => 'slovedBugs', 'desc' => array('zh-cn' => '列出解决的Bug总数,解决方案的分布,占的比例(该用户解决的Bug的数量占所有的解决的Bug的数量)。', 'zh-tw' => '列出解決的Bug總數,解決方案的分布,占的比例(該用戶解決的Bug的數量占所有的解決的Bug的數量)。', 'en' => 'percentage:self resolved / all resolved', 'de' => 'percentage:self resolved / all resolved', 'fr' => 'percentage:self resolved / all resolved'), @@ -2667,6 +2693,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1026, + 'version' => '1', 'name' => array('zh-cn' => '项目进展表', 'zh-tw' => '項目進展表', 'en' => 'Project Progress Report', 'de' => 'Project Progress Report', 'fr' => 'Project Progress Report', 'vi' => 'Project Progress Report', 'ja' => 'Project Progress Report'), 'code' => 'projectProgress', 'desc' => array('zh-cn' => '项目的:需求数,剩余需求数(过滤状态为已关闭的需求),任务数,剩余任务数(过滤状态为已完成和已关闭的任务),剩余工时(剩余任务的剩余工时),已消耗工时。', 'zh-tw' => '項目的需求數,任務數,已消耗工時,剩餘工時,剩餘需求數,剩餘任務數,進度。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), @@ -2837,6 +2864,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1027, + 'version' => '1', 'name' => array('zh-cn' => '项目执行Bug类型统计表', 'zh-tw' => '項目Bug類型統計表', 'en' => 'Project Bug Type', 'de' => 'Project Bug Type', 'fr' => 'Project Bug Type'), 'code' => 'projectBugType', 'desc' => array('zh-cn' => '按照项目下不同执行统计Bug的类型分布情况。', 'zh-tw' => '按照項目統計Bug的類型分布情況。'), @@ -2929,6 +2957,7 @@ EOT, $config->bi->builtin->pivots[] = array ( 'id' => 1028, + 'version' => '1', 'name' => array('zh-cn' => '产品Bug解决方案统计表', 'zh-tw' => '産品Bug解決方案統計表', 'en' => 'Bug Solution of Product'), 'code' => 'productBugSolution', 'desc' => array('zh-cn' => '按照产品统计Bug的解决方案分布情况。', 'zh-tw' => '按照産品統計Bug的解決方案分布情況。', 'en' => 'Solution distribution of bugs.'), diff --git a/module/bi/model.php b/module/bi/model.php index 53e8c45153..a988786c04 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -874,47 +874,69 @@ class biModel extends model { $currentOperate = $operate; $pivot = (object)$pivot; - $pivot->name = $this->jsonEncode($pivot->name); - $pivot->mode = 'text'; - if(isset($pivot->desc)) $pivot->desc = $this->jsonEncode($pivot->desc); - if(isset($pivot->settings)) $pivot->settings = $this->jsonEncode($pivot->settings); - if(isset($pivot->filters)) $pivot->filters = $this->jsonEncode($pivot->filters); - if(isset($pivot->fields)) $pivot->fields = $this->jsonEncode($pivot->fields); - if(isset($pivot->langs)) $pivot->langs = $this->jsonEncode($pivot->langs); - if(isset($pivot->vars)) $pivot->vars = $this->jsonEncode($pivot->vars); - if(!isset($pivot->driver)) $pivot->driver = $this->config->bi->defaultDriver; - if(!isset($pivot->drills)) $pivot->drills = array(); - if(!isset($pivot->settings)) $pivot->settings = null; - if(!isset($pivot->filters)) $pivot->filters = null; - if(!isset($pivot->fields)) $pivot->fields = null; - if(!isset($pivot->langs)) $pivot->langs = null; - if(!isset($pivot->vars)) $pivot->vars = null; + $pivotSpec = new stdclass(); + $pivotSpec->version = '1'; + $pivotSpec->pivot = $pivot->id; + $pivotSpec->mode = 'text'; + $pivotSpec->name = $this->jsonEncode($pivot->name); + if(isset($pivot->desc)) $pivotSpec->desc = $this->jsonEncode($pivot->desc); + if(isset($pivot->settings)) $pivotSpec->settings = $this->jsonEncode($pivot->settings); + if(isset($pivot->filters)) $pivotSpec->filters = $this->jsonEncode($pivot->filters); + if(isset($pivot->fields)) $pivotSpec->fields = $this->jsonEncode($pivot->fields); + if(isset($pivot->langs)) $pivotSpec->langs = $this->jsonEncode($pivot->langs); + if(isset($pivot->vars)) $pivotSpec->vars = $this->jsonEncode($pivot->vars); + if(!isset($pivot->driver)) $pivotSpec->driver = $this->config->bi->defaultDriver; + if(!isset($pivot->settings)) $pivotSpec->settings = null; + if(!isset($pivot->filters)) $pivotSpec->filters = null; + if(!isset($pivot->fields)) $pivotSpec->fields = null; + if(!isset($pivot->langs)) $pivotSpec->langs = null; + if(!isset($pivot->vars)) $pivotSpec->vars = null; + + unset($pivot->driver); + unset($pivot->name); + unset($pivot->desc); + unset($pivot->settings); + unset($pivot->filters); + unset($pivot->fields); + unset($pivot->langs); + unset($pivot->vars); + + if(!isset($pivot->drills)) $pivot->drills = array(); $pivotSQLs = array_merge($pivotSQLs, $this->prepareBuilitinPivotDrillSQL($pivot->id, $pivot->drills)); unset($pivot->drills); - $exists = $this->dao->select('id,name')->from(TABLE_PIVOT)->where('id')->eq($pivot->id)->orWhere('name')->eq($pivot->name)->fetch(); + $exists = $this->dao->select('id,name')->from(TABLE_PIVOT)->where('id')->eq($pivot->id)->fetch(); if(!$exists) $currentOperate = 'insert'; - $stmt = null; + $pivotStmt = null; + $pivotSpecStmt = null; if($currentOperate == 'insert') { + $now = helper::now(); $pivot->createdBy = 'system'; - $pivot->createdDate = helper::now(); + $pivot->createdDate = $now; $pivot->group = $this->getCorrectGroup($pivot->group, 'pivot'); - $stmt = $this->dao->insert(TABLE_PIVOT)->data($pivot); + $pivotStmt = $this->dao->insert(TABLE_PIVOT)->data($pivot); + + $pivotSpec->createdDate = $now; + $pivotSpecStmt = $this->dao->insert(TABLE_PIVOTSPEC)->data($pivotSpec); } if($currentOperate == 'update') { $id = $pivot->id; unset($pivot->group); unset($pivot->id); - $stmt = $this->dao->update(TABLE_PIVOT)->data($pivot)->where('id')->eq($id); + unset($pivotSpec->pivot); + unset($pivotSpec->version); + $pivotStmt = $this->dao->update(TABLE_PIVOT)->data($pivot)->where('id')->eq($id); + $pivotSpecStmt = $this->dao->update(TABLE_PIVOTSPEC)->data($pivotSpec)->where('pivot')->eq($id)->andWhere('version')->eq('1'); } - if(isset($stmt)) $pivotSQLs[] = $stmt->get(); + if(isset($pivotStmt)) $pivotSQLs[] = $pivotStmt->get(); + if(isset($pivotSpecStmt)) $pivotSQLs[] = $pivotSpecStmt->get(); } return $pivotSQLs; From 097b241378780a3445fbce59a4e6291e2b43ca1e Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 08:57:13 +0800 Subject: [PATCH 022/431] * [task#133002,doing,0.2h] show pivot table in pivot-versions. --- module/pivot/ui/show.html.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/module/pivot/ui/show.html.php b/module/pivot/ui/show.html.php index 9c45ca6677..bb51859212 100644 --- a/module/pivot/ui/show.html.php +++ b/module/pivot/ui/show.html.php @@ -68,7 +68,7 @@ $fnGenerateFilters = function() use($pivot, $showOrigin, $lang) ); }; -$generateData = function() use ($lang, $pivotName, $pivot, $data, $configs, $showOrigin, $fnGenerateFilters) +$generateData = function() use ($lang, $groupID, $pivotName, $pivot, $data, $configs, $showOrigin, $fnGenerateFilters) { $clickable = !$pivot->builtin; $emptyTip = $this->pivot->isFiltersAllEmpty($pivot->filters) ? $lang->pivot->filterEmptyVal : $lang->error->noData; @@ -79,11 +79,11 @@ $generateData = function() use ($lang, $pivotName, $pivot, $data, $configs, $sho panel ( setID('pivotPanel'), - set::title($pivotName), + $this->app->rawMethod != 'versions' ? set::title($pivotName) : null, set::shadow(false), set::headingClass('h-12'), set::bodyClass('pt-0'), - to::titleSuffix + $this->app->rawMethod != 'versions' ? to::titleSuffix ( $pivot->desc ? icon ( @@ -99,11 +99,12 @@ $generateData = function() use ($lang, $pivotName, $pivot, $data, $configs, $sho ( $lang->pivot->checkNewVersion, set('data-toggle', 'modal'), - set::href($this->createLink('pivot', 'versions', "pivotID={$pivot->id}")) + set('data-size', 'lg'), + set::href($this->createLink('pivot', 'versions', "groupID={$groupID}&pivotID={$pivot->id}")) ) ) - ), - toolbar + ) : null, + $this->app->rawMethod != 'versions' ? toolbar ( item ( @@ -147,7 +148,7 @@ $generateData = function() use ($lang, $pivotName, $pivot, $data, $configs, $sho 'url' => inlink('delete', "id=$pivot->id"), 'data-confirm' => array('message' => $lang->pivot->deleteTip, 'icon' => 'icon-exclamation-sign', 'iconClass' => 'warning-pale rounded-full icon-2x') ))) : null) : null - ), + ) : null, div(setClass('divider')), $fnGenerateFilters(), dtable From 276e6647ecfec2095da7011a0a284cb0e22c3a02 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 09:01:08 +0800 Subject: [PATCH 023/431] * [task#133002,doing,0.3h] add version param to pivotZen-show. --- module/pivot/zen.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/module/pivot/zen.php b/module/pivot/zen.php index 60c8f7af8a..06c7f4edd5 100644 --- a/module/pivot/zen.php +++ b/module/pivot/zen.php @@ -166,14 +166,24 @@ class pivotZen extends pivot * * @param int $groupID * @param int $pivotID + * @param string $mark + * @param string $version * @access public * @return void */ - public function show(int $groupID, int $pivotID, string $mark = ''): void + public function show(int $groupID, int $pivotID, string $mark = '', string $version = ''): void { $this->pivot->checkAccess($pivotID, 'preview'); - $pivot = $this->pivot->getByID($pivotID, true); + if(empty($version)) + { + $pivot = $this->pivot->getByID($pivotID, true); + } + else + { + $version = $version == 'newest' ? $this->pivot->getMaxVersion($pivotID) : $version; + $pivot = $this->pivot->getPivotSpec($pivotID, $version, true); + } $driver = $pivot->driver; if($mark) $this->loadModel('mark')->setMark(array($pivot->id), 'pivot', $pivot->version, 'view'); From ea998a30a5be6f0b58d5d61923d7900a4a5f74dc Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 09:04:27 +0800 Subject: [PATCH 024/431] * [task#133002,doing,0.5h] add method to get pivot spec. --- module/pivot/model.php | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/module/pivot/model.php b/module/pivot/model.php index 39d9a5e79a..2168ce46da 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -67,6 +67,8 @@ class pivotModel extends model * * @param int $pivotID * @param bool $processDateVar + * @param string $filterStatus + * @param bool $addDrills * @access public * @return object|bool */ @@ -100,6 +102,33 @@ class pivotModel extends model return $pivot; } + public function getPivotSpec(int $pivotID, string $version, bool $processDateVar = false, bool $addDrills = true) + { + $pivot = $this->dao->select('*')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($pivotID)->andWhere('version')->eq($version)->fetch(); + if(!$pivot) return false; + $pivot->id = $pivot->pivot; + + $pivot->fieldSettings = array(); + if(!empty($pivot->fields) && $pivot->fields != 'null') + { + $pivot->fieldSettings = json_decode($pivot->fields); + $pivot->fields = array_keys(get_object_vars($pivot->fieldSettings)); + } + + if(!empty($pivot->filters)) + { + $filters = json_decode($pivot->filters, true); + $pivot->filters = $this->setFilterDefault($filters, $processDateVar); + } + else + { + $pivot->filters = array(); + } + $this->completePivot($pivot); + + return $pivot; + } + /** * 时间占位符替换为实际的时间。 * Replace time placeholder with actual time. From 11d9b24e6236dd583d02ffac89c53bc4bca3bcc2 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 09:06:42 +0800 Subject: [PATCH 025/431] * [task#133002,doing,0.1h] add commit. --- module/pivot/model.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/module/pivot/model.php b/module/pivot/model.php index 2168ce46da..ae58fa2e6b 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -102,6 +102,17 @@ class pivotModel extends model return $pivot; } + /* + * 获取透视表某版本。 + * Get pivot by id and version. + * + * @param int $pivotID + * @param string $version + * @param bool $processDateVar + * @param bool $addDrills + * @access public + * @return object|bool + */ public function getPivotSpec(int $pivotID, string $version, bool $processDateVar = false, bool $addDrills = true) { $pivot = $this->dao->select('*')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($pivotID)->andWhere('version')->eq($version)->fetch(); From d2016bd638f9dcfa6fa9945f4dea4a22457a2b2c Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 09:07:29 +0800 Subject: [PATCH 026/431] * [task#133002,doing,0.5h] show pivot table in pivot-versions. --- module/pivot/control.php | 8 ++++++-- module/pivot/ui/versions.html.php | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/module/pivot/control.php b/module/pivot/control.php index 4dae1bab5d..5469c3e4a2 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -71,16 +71,20 @@ class pivot extends control * 透视表版本列表。 * Show versions of a pivot. * + * @param int $groupID * @param int $pivotID * @param string $version * @access public * @return void */ - public function versions(int $pivotID, string $version = 'newest') + public function versions(int $groupID, int $pivotID, string $version = 'newest') { + $pivot = $this->pivot->getByID($pivotID); + $this->pivotZen->show($groupID, $pivotID, '', $version); + $this->view->versionSpecs = $this->pivot->getPivotVersions($pivotID); $this->view->version = $version == 'newest' ? $this->pivot->getMaxVersion($pivotID) : $version; - $this->view->pivot = $this->pivot->getByID($pivotID); + $this->view->pivot = $pivot; $this->display(); } diff --git a/module/pivot/ui/versions.html.php b/module/pivot/ui/versions.html.php index e6ce4eb174..7eff4cda23 100644 --- a/module/pivot/ui/versions.html.php +++ b/module/pivot/ui/versions.html.php @@ -9,6 +9,7 @@ declare(strict_types = 1); * @link https://www.zentao.net */ namespace zin; +include_once 'show.html.php'; $versionsTableBody = array(); foreach($versionSpecs as $versionSpec) @@ -45,5 +46,11 @@ panel h::th($lang->pivot->desc) ), $versionsTableBody + ), + div + ( + setID('pivotContent'), + setClass('flex col gap-4 w-full'), + $generateData() ) ); From 55a115cb97f6d3d781b5f9760a8f61f1b195fb45 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 09:43:49 +0800 Subject: [PATCH 027/431] * [bug#57322] add delete host lang. --- module/host/control.php | 2 +- module/host/lang/de.php | 3 ++- module/host/lang/en.php | 3 ++- module/host/lang/fr.php | 3 ++- module/host/lang/zh-cn.php | 1 + 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/module/host/control.php b/module/host/control.php index 52808e0c3f..2ddf835c17 100644 --- a/module/host/control.php +++ b/module/host/control.php @@ -144,7 +144,7 @@ class host extends control $this->host->delete(TABLE_HOST, $id); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => inlink('browse'), 'closeModal' => true)); + return $this->send(array('result' => 'success', 'message' => $this->lang->host->deletedSuccess, 'load' => inlink('browse'), 'closeModal' => true)); } /** diff --git a/module/host/lang/de.php b/module/host/lang/de.php index e44d0ebe7d..22d3d75cc7 100644 --- a/module/host/lang/de.php +++ b/module/host/lang/de.php @@ -162,7 +162,8 @@ $lang->host->diskType = 'Disk Type'; $lang->host->diskTypeList['hdd'] = 'HDD'; $lang->host->diskTypeList['ssd'] = 'SSD'; -$lang->host->confirmDelete = 'Do you want to delete this host?'; +$lang->host->confirmDelete = 'Do you want to delete this host?'; +$lang->host->deletedSuccess = 'Deleted successfully!'; $lang->host->notice = new stdclass(); $lang->host->notice->memory = 'Memory size should be numbers!'; diff --git a/module/host/lang/en.php b/module/host/lang/en.php index e44d0ebe7d..22d3d75cc7 100644 --- a/module/host/lang/en.php +++ b/module/host/lang/en.php @@ -162,7 +162,8 @@ $lang->host->diskType = 'Disk Type'; $lang->host->diskTypeList['hdd'] = 'HDD'; $lang->host->diskTypeList['ssd'] = 'SSD'; -$lang->host->confirmDelete = 'Do you want to delete this host?'; +$lang->host->confirmDelete = 'Do you want to delete this host?'; +$lang->host->deletedSuccess = 'Deleted successfully!'; $lang->host->notice = new stdclass(); $lang->host->notice->memory = 'Memory size should be numbers!'; diff --git a/module/host/lang/fr.php b/module/host/lang/fr.php index e44d0ebe7d..22d3d75cc7 100644 --- a/module/host/lang/fr.php +++ b/module/host/lang/fr.php @@ -162,7 +162,8 @@ $lang->host->diskType = 'Disk Type'; $lang->host->diskTypeList['hdd'] = 'HDD'; $lang->host->diskTypeList['ssd'] = 'SSD'; -$lang->host->confirmDelete = 'Do you want to delete this host?'; +$lang->host->confirmDelete = 'Do you want to delete this host?'; +$lang->host->deletedSuccess = 'Deleted successfully!'; $lang->host->notice = new stdclass(); $lang->host->notice->memory = 'Memory size should be numbers!'; diff --git a/module/host/lang/zh-cn.php b/module/host/lang/zh-cn.php index 009d4d6486..53676f586f 100644 --- a/module/host/lang/zh-cn.php +++ b/module/host/lang/zh-cn.php @@ -163,6 +163,7 @@ $lang->host->diskTypeList['hdd'] = '机械硬盘'; $lang->host->diskTypeList['ssd'] = '固态硬盘'; $lang->host->confirmDelete = '是否删除该主机记录?'; +$lang->host->deletedSuccess = '删除成功!'; $lang->host->notice = new stdclass(); $lang->host->notice->memory = '内存大小只能为数字!'; From 876a465847554583cdba39fbe29829e365d51b20 Mon Sep 17 00:00:00 2001 From: lijie Date: Fri, 22 Nov 2024 09:34:24 +0800 Subject: [PATCH 028/431] [task#133034, 2h] modify function for close epic. --- module/epic/test/ui/page/view.php | 7 +++++-- module/story/test/lib/closestory.ui.class.php | 8 +++++--- module/story/test/ui/closestory.php | 8 +++++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/module/epic/test/ui/page/view.php b/module/epic/test/ui/page/view.php index 35f2a8cbb3..d2df7271a7 100755 --- a/module/epic/test/ui/page/view.php +++ b/module/epic/test/ui/page/view.php @@ -7,9 +7,12 @@ class viewPage extends page $xpath = array( /*需求详情页*/ - 'status' => "//*[@class='tab-content']/div/div/div[6]/div[2]/span", + 'status' => "//*[@class='tab-content']/div/div/div[6]/div[2]/span", + 'closeReason' => "/html/body/div[1]/div/div/div/div[2]/div[2]/div[1]/div[2]/div[2]/div/div[6]/div[2]", /*激活弹窗的激活按钮*/ - 'activate' => "//*[@type='submit']" + 'activate' => "//*[@type='submit']", + /*关闭弹窗中的关闭按钮*/ + 'closedBut' => "//*[@id='zin_epic_close_form']/div[4]/div/button" ); $this->dom->xpath = array_merge($this->dom->xpath, $xpath); } diff --git a/module/story/test/lib/closestory.ui.class.php b/module/story/test/lib/closestory.ui.class.php index 9c7a7b0ed2..0e108fc3f9 100644 --- a/module/story/test/lib/closestory.ui.class.php +++ b/module/story/test/lib/closestory.ui.class.php @@ -18,15 +18,17 @@ class closeStoryTester extends tester * @access public * @return object */ - public function closeStory($storyID, $closeReason) + public function closeStory($storyType, $storyID, $closeReason) { - $form = $this->initForm('story', 'view', array('id' => $storyID), 'appIframe-product'); //进入研发需求详情页 + $form = $this->initForm($storyType, 'view', array('id' => $storyID), 'appIframe-product'); //进入研发需求详情页 $form->dom->btn($this->lang->story->close)->click(); //点击关闭需求按钮 $form->wait(1); $form->dom->closedReason->picker($closeReason); //选择关闭原因 - $form->dom->getElement("//*[@id='zin_story_close_{$storyID}_form']/div[4]/div/button")->click(); + if($storyType == 'story') $form->dom->getElement("//*[@id='zin_story_close_{$storyID}_form']/div[4]/div/button")->click(); + + $form->dom->closedBut->click(); $form->wait(1); $viewPage = $this->loadPage('story', 'view'); diff --git a/module/story/test/ui/closestory.php b/module/story/test/ui/closestory.php index 226ad3771a..48986edd1c 100755 --- a/module/story/test/ui/closestory.php +++ b/module/story/test/ui/closestory.php @@ -65,9 +65,15 @@ $action->gen(7); $tester = new closeStoryTester(); $tester->login(); +$storyType = array(); +$storyType['story'] = 'story'; +$storyType['requirement'] = 'requirement'; +$storyType['epic'] = 'epic'; + $closeReason = array('已完成', '不做'); -r($tester->closeStory(1, $closeReason[0])) && p('message,status') && e('关闭需求成功,SUCCESS'); +r($tester->closeStory($storyType['story'], 1, $closeReason[0])) && p('message,status') && e('关闭需求成功,SUCCESS'); +r($tester->closeStory($storyType['epic'], 5, $closeReason[0])) && p('message,status') && e('关闭需求成功,SUCCESS'); r($tester->batchCloseStory($closeReason[1])) && p('message,status') && e('批量关闭需求成功,SUCCESS'); From ea29fecf7ab30ef1da5d85e034e1a8f07aeb6ab6 Mon Sep 17 00:00:00 2001 From: lixiaoyu Date: Fri, 22 Nov 2024 09:28:10 +0800 Subject: [PATCH 029/431] *[task#133115,doing,1h,7h] xpath of contribute --- module/my/test/ui/page/contribute.php | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 module/my/test/ui/page/contribute.php diff --git a/module/my/test/ui/page/contribute.php b/module/my/test/ui/page/contribute.php new file mode 100755 index 0000000000..476444be04 --- /dev/null +++ b/module/my/test/ui/page/contribute.php @@ -0,0 +1,31 @@ + '//*[@id="mainNavbar"]/div/menu/li[1]/a', + 'SR' => '//*[@id="mainNavbar"]/div/menu/li[2]/a', + 'UR' => '//*[@id="mainNavbar"]/div/menu/li[3]/a', + 'ER' => '//*[@id="mainNavbar"]/div/menu/li[4]/a', + 'bug' => '//*[@id="mainNavbar"]/div/menu/li[5]/a', + 'case' => '//*[@id="mainNavbar"]/div/menu/li[6]/a', + 'request' => '//*[@id="mainNavbar"]/div/menu/li[7]/a', + 'review' => '//*[@id="mainNavbar"]/div/menu/li[8]/a', + 'firstTab' => '//*[@id="featureBar"]/menu/li[1]/a', + 'secondTab' => '//*[@id="featureBar"]/menu/li[2]/a', + 'thirdTab' => '//*[@id="featureBar"]/menu/li[3]/a', + 'fourthTab' => '//*[@id="featureBar"]/menu/li[4]/a', + 'fifthTab' => '//*[@id="featureBar"]/menu/li[5]/a', + 'sixthTab' => '//*[@id="featureBar"]/menu/li[6]/a', + 'firstTabNum' => '//*[@id="featureBar"]/menu/li[1]/a/span[2]', + 'secondTabNum' => '//*[@id="featureBar"]/menu/li[2]/a/span[2]', + 'thirdTabNum' => '//*[@id="featureBar"]/menu/li[3]/a/span[2]', + 'fourthTabNum' => '//*[@id="featureBar"]/menu/li[4]/a/span[2]', + 'fifthTabNum' => '//*[@id="featureBar"]/menu/li[5]/a/span[2]', + 'sixthTabNum' => '//*[@id="featureBar"]/menu/li[6]/a/span[2]' + ); + $this->dom->xpath = array_merge($this->dom->xpath, $xpath); + } +} From 8a405133c0e6382de685e81ca1c69fa7c7dbf6a0 Mon Sep 17 00:00:00 2001 From: lixiaoyu Date: Fri, 22 Nov 2024 09:29:13 +0800 Subject: [PATCH 030/431] *[task#133115,doing,2h,7h] check data of contribute --- module/my/test/lib/contribute.ui.class.php | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 module/my/test/lib/contribute.ui.class.php diff --git a/module/my/test/lib/contribute.ui.class.php b/module/my/test/lib/contribute.ui.class.php new file mode 100755 index 0000000000..117fae854c --- /dev/null +++ b/module/my/test/lib/contribute.ui.class.php @@ -0,0 +1,50 @@ +initForm('my', 'contribute', array(), 'appIframe-my'); + $form->wait(2); + $numDom = $tabName . 'Num'; + $typeMessage = [ + 'task' => '任务', + 'SR' => '研发需求', + 'UR' => '用户需求', + 'ER' => '业务需求', + 'bug' => 'Bug', + 'case' => '用例', + 'request' => '测试单', + 'review' => '审批' + ]; + $tabMessage = [ + 'firstTab' => '第1个tab', + 'secondTab' => '第2个tab', + 'thirdTab' => '第3个tab', + 'fourthTab' => '第4个tab', + 'fifthTab' => '第5个tab', + 'sixthTab' => '第6个tab' + ]; + $form->dom->$type->click();//点击3级导航中对应的数据类型 + $form->wait(1); + $form->dom->$tabName->click();//点击对应的tab + $form->wait(1); + $num = $form->dom->$numDom->getText(); + $form->wait(2); + if (isset($typeMessage[$type]) && isset($tabMessage[$tabName])) + { + return ($num == $expectNum) + ? $this->success("{$typeMessage[$type]}的{$tabMessage[$tabName]}下数据显示正确") + : $this->failed("{$typeMessage[$type]}的{$tabMessage[$tabName]}下数据显示不正确"); + } + } +} From 7448150cee86dce940086e40e7643c401703bba6 Mon Sep 17 00:00:00 2001 From: lixiaoyu Date: Fri, 22 Nov 2024 09:32:00 +0800 Subject: [PATCH 031/431] *[task#133115,doing,2h,7h] add data of contribute --- module/my/test/ui/contribute.php | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 module/my/test/ui/contribute.php diff --git a/module/my/test/ui/contribute.php b/module/my/test/ui/contribute.php new file mode 100755 index 0000000000..41682be20c --- /dev/null +++ b/module/my/test/ui/contribute.php @@ -0,0 +1,50 @@ +#!/usr/bin/env php +id->range('1'); +$product->program->range('0'); +$product->name->range('产品1'); +$product->PO->range('admin'); +$product->status->range('normal'); +$product->type->range('normal'); +$product->gen(1); + +$project = zenData('project'); +$project->id->range('1-2'); +$project->project->range('0,1'); +$project->model->range('scrum,[]'); +$project->type->range('project,sprint'); +$project->parent->range('0,1'); +$project->auth->range('extend'); +$project->storytype->range('story'); +$project->path->range('`,1,`,`,1,2,`'); +$project->grade->range('1'); +$project->name->range('项目1,迭代1'); +$project->hasProduct->range('1'); +$project->status->range('doing'); +$project->acl->range('open'); +$project->gen(2); + +$projectProduct = zenData('projectproduct'); +$projectProduct->project->range('1-2'); +$projectProduct->product->range('1'); +$projectProduct->gen(2); + +$task = zenData('task'); +$task->id->range('1-10'); +$task->parent->range('0'); +$task->project->range('1'); +$task->execution->range('2'); +$task->story->range('0'); +$task->name->range('任务1,任务2,任务3,任务4,任务5,任务6,任务7,任务8,任务9,任务10'); +$task->status->range('closed{2},cancel{1},wait{5},done{2}'); +$task->gen(10); From 6dac5cc7913c9ac5a8db40b8ca3a65a44dd9013c Mon Sep 17 00:00:00 2001 From: lixiaoyu Date: Fri, 22 Nov 2024 09:33:17 +0800 Subject: [PATCH 032/431] *[task#133115,doing,2h,7h] add data of contribute --- module/my/test/ui/contribute.php | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/module/my/test/ui/contribute.php b/module/my/test/ui/contribute.php index 41682be20c..7eda725dc0 100755 --- a/module/my/test/ui/contribute.php +++ b/module/my/test/ui/contribute.php @@ -47,4 +47,50 @@ $task->execution->range('2'); $task->story->range('0'); $task->name->range('任务1,任务2,任务3,任务4,任务5,任务6,任务7,任务8,任务9,任务10'); $task->status->range('closed{2},cancel{1},wait{5},done{2}'); +$task->closedBy->range('admin{2},{8}'); +$task->canceledBy->range('null{2},admin{1},{7}'); +$task->assignedTo->range('closed{2},admin{4}'); +$task->finishedBy->range('admin{2},{8}'); $task->gen(10); + +$story = zenData('story'); +$story->id->range('1-27'); +$story->parent->range('0'); +$story->isParent->range('0'); +$story->root->range('1-27'); +$story->path->range('1-27'); +$story->grade->range('1'); +$story->product->range('1'); +$story->version->range('1'); +$story->title->range('研需01,研需02,研需03,研需04,研需05,研需06,研需07,研需08,研需09,研需10,用需01,用需02,用需03,用需04,用需05,用需06,用需07,业需01,业需02,业需03,业需04,业需05,业需06,业需07,业需08,业需09,业需10'); +$story->type->range('story{10},requirement{7},epic{10}'); +$story->status->range('active{3},closed{3},reviewing{4},active{3},closed{2},reviewing{6},closed{2},reviewing{4}'); +$story->openedBy->range('admin'); +$story->assignedTo->range('admin{3},closed{3},admin{2},{5},closed{2},admin{12}'); +$story->closedBy->range('{3},admin{3},{7},admin{2},{6},admin{2},{4}'); +$story->reviewedBy->range('admin{3},{7},admin{3},{8},admin{2},{4}'); +$story->deleted->range('0'); +$story->gen(27); + +$storyspec = zenData('storyspec'); +$storyspec->story->range('1-27'); +$storyspec->version->range('1'); +$storyspec->title->range('研需01,研需02,研需03,研需04,研需05,研需06,研需07,研需08,研需09,研需10,用需01,用需02,用需03,用需04,用需05,用需06,用需07,业需01,业需02,业需03,业需04,业需05,业需06,业需07,业需08,业需09,业需10'); +$storyspec->gen(27); +$bug->id->range('1-7'); +$bug->product->range('1'); +$bug->project->range('1'); +$bug->execution->range('2'); +$bug->module->range('0'); +$bug->plan->range('0'); +$bug->story->range('0'); +$bug->storyVersion->range('0'); +$bug->openedBuild->range('trunk'); +$bug->title->range('bug1,bug2,bug3,bug4,bug5,bug6,bug7'); +$bug->status->range('closed{2},resolved,active{4}'); +$bug->assignedTo->range('closed{2},admin{3},{2}'); +$bug->resolvedBy->range('admin{3},{4}'); +$bug->resolvedBuild->range('trunk{3},{4}'); +$bug->resolution->range('fixed{3},{4}'); +$bug->closedBy->range('admin{2},{5}'); +$bug->gen(7); From 17c3e56dd0fee1264e80fa33132974471a57f8e2 Mon Sep 17 00:00:00 2001 From: lixiaoyu Date: Fri, 22 Nov 2024 09:34:13 +0800 Subject: [PATCH 033/431] *[task#133115,doing,2h,7h] add data of contribute --- module/my/test/ui/contribute.php | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/module/my/test/ui/contribute.php b/module/my/test/ui/contribute.php index 7eda725dc0..aad6714942 100755 --- a/module/my/test/ui/contribute.php +++ b/module/my/test/ui/contribute.php @@ -77,6 +77,15 @@ $storyspec->story->range('1-27'); $storyspec->version->range('1'); $storyspec->title->range('研需01,研需02,研需03,研需04,研需05,研需06,研需07,研需08,研需09,研需10,用需01,用需02,用需03,用需04,用需05,用需06,用需07,业需01,业需02,业需03,业需04,业需05,业需06,业需07,业需08,业需09,业需10'); $storyspec->gen(27); + +$storyreview = zenData('storyreview'); +$storyreview->story->range('1-27'); +$storyreview->reviewer->range('admin{6},{4},admin{3},{9},admin{2},{4}'); +$storyreview->result->range('pass{6},{4},pass{3},{9},pass{2},{4}'); +$storyreview->result->range('1'); +$storyreview->gen(27); + +$bug = zenData('bug'); $bug->id->range('1-7'); $bug->product->range('1'); $bug->project->range('1'); @@ -94,3 +103,34 @@ $bug->resolvedBuild->range('trunk{3},{4}'); $bug->resolution->range('fixed{3},{4}'); $bug->closedBy->range('admin{2},{5}'); $bug->gen(7); + +$case = zenData('case'); +$case->id->range('1-5'); +$case->product->range('1'); +$case->project->range('0'); +$case->execution->range('2'); +$case->title->range('用例1,用例2,用例3,用例4,用例5'); +$case->type->range('feature'); +$case->status->range('normal'); +$case->openedBy->range('admin'); +$case->gen(5); + +$build = zenData('build'); +$build->id->range('1'); +$build->product->range('1'); +$build->project->range('1'); +$build->execution->range('2'); +$build->name->range('版本1'); +$build->gen(1); + +$testtask = zenData('testtask'); +$testtask->id->range('1'); +$testtask->product->range('1'); +$testtask->project->range('1'); +$testtask->execution->range('2'); +$testtask->name->range('测试单A'); +$testtask->status->range('done'); +$testtask->build->range('1'); +$testtask->owner->range('admin'); +$testtask->members->range('admin'); +$testtask->gen(1); From 297f0acee5295de88db88cfa46af261978d86916 Mon Sep 17 00:00:00 2001 From: lixiaoyu Date: Fri, 22 Nov 2024 09:34:54 +0800 Subject: [PATCH 034/431] *[task#133115,doing,2h,7h] add data of contribute --- module/my/test/ui/contribute.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/module/my/test/ui/contribute.php b/module/my/test/ui/contribute.php index aad6714942..3c8e7da6dc 100755 --- a/module/my/test/ui/contribute.php +++ b/module/my/test/ui/contribute.php @@ -134,3 +134,16 @@ $testtask->build->range('1'); $testtask->owner->range('admin'); $testtask->members->range('admin'); $testtask->gen(1); +$action = zenData('action'); +$action->id->range('1-34'); +$action->objectType->range('task{4},story{13},bug{3},story{14}'); +$action->objectID->range('3,4,5,6,1,2,3,7,8,16,17,18,19,20,21,22,23,3,4,5,1,2,3,11,12,13,22,23,1,2,3,11,12,13'); +$action->product->range('1'); +$action->project->range('1{4},0{13},1{3},0{14}'); +$action->execution->range('2{4},0{13},2{3},0{14}'); +$action->actor->range('admin'); +$action->action->range('assigned{20},submitreview{8},reviewed{6}'); +$action->gen(34); + +$tester = new contributeTester(); +$tester->login(); From 61f40053915209e3f83dc34bf8dd1cd415205334 Mon Sep 17 00:00:00 2001 From: lixiaoyu Date: Fri, 22 Nov 2024 09:35:30 +0800 Subject: [PATCH 035/431] *[task#133115,doing,2h,7h] add uitest case of contribute --- module/my/test/ui/contribute.php | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/module/my/test/ui/contribute.php b/module/my/test/ui/contribute.php index 3c8e7da6dc..ed4e5699f8 100755 --- a/module/my/test/ui/contribute.php +++ b/module/my/test/ui/contribute.php @@ -134,6 +134,7 @@ $testtask->build->range('1'); $testtask->owner->range('admin'); $testtask->members->range('admin'); $testtask->gen(1); + $action = zenData('action'); $action->id->range('1-34'); $action->objectType->range('task{4},story{13},bug{3},story{14}'); @@ -147,3 +148,38 @@ $action->gen(34); $tester = new contributeTester(); $tester->login(); + +r($tester->checkContribute('task', 'firstTab', '10')) && p('message,status') && e('任务的第1个tab下数据显示正确,SUCCESS');//检查任务列表-[由我创建]tab下的数据 +r($tester->checkContribute('task', 'secondTab', '2')) && p('message,status') && e('任务的第2个tab下数据显示正确,SUCCESS');//检查任务列表-[由我完成]tab下的数据 +r($tester->checkContribute('task', 'thirdTab', '8')) && p('message,status') && e('任务的第3个tab下数据显示正确,SUCCESS');//检查任务列表-[由我参与]tab下的数据 +r($tester->checkContribute('task', 'fourthTab', '2')) && p('message,status') && e('任务的第4个tab下数据显示正确,SUCCESS');//检查任务列表-[由我关闭]tab下的数据 +r($tester->checkContribute('task', 'fifthTab', '1')) && p('message,status') && e('任务的第5个tab下数据显示正确,SUCCESS');//检查任务列表-[由我取消]tab下的数据 +r($tester->checkContribute('task', 'sixthTab', '4')) && p('message,status') && e('任务的第6个tab下数据显示正确,SUCCESS');//检查任务列表-[由我指派]tab下的数据 + +r($tester->checkContribute('SR', 'firstTab', '10')) && p('message,status') && e('研发需求的第1个tab下数据显示正确,SUCCESS');//检查研发需求列表-[由我创建]tab下的数据 +r($tester->checkContribute('SR', 'secondTab', '3')) && p('message,status') && e('研发需求的第2个tab下数据显示正确,SUCCESS');//检查研发需求列表-[我评审过]tab下的数据 +r($tester->checkContribute('SR', 'thirdTab', '3')) && p('message,status') && e('研发需求的第3个tab下数据显示正确,SUCCESS');//检查研发需求列表-[由我关闭]tab下的数据 +r($tester->checkContribute('SR', 'fourthTab', '5')) && p('message,status') && e('研发需求的第4个tab下数据显示正确,SUCCESS');//检查研发需求列表-[由我指派]tab下的数据 + +r($tester->checkContribute('UR', 'firstTab', '7')) && p('message,status') && e('用户需求的第1个tab下数据显示正确,SUCCESS');//检查用户需求列表-[由我创建]tab下的数据 +r($tester->checkContribute('UR', 'secondTab', '3')) && p('message,status') && e('用户需求的第2个tab下数据显示正确,SUCCESS');//检查用户需求列表-[我评审过]tab下的数据 +r($tester->checkContribute('UR', 'thirdTab', '2')) && p('message,status') && e('用户需求的第3个tab下数据显示正确,SUCCESS');//检查用户需求列表-[由我关闭]tab下的数据 +r($tester->checkContribute('UR', 'fourthTab', '2')) && p('message,status') && e('用户需求的第4个tab下数据显示正确,SUCCESS');//检查用户需求列表-[由我指派]tab下的数据 + +r($tester->checkContribute('ER', 'firstTab', '10')) && p('message,status') && e('业务需求的第1个tab下数据显示正确,SUCCESS');//检查业务需求列表-[由我创建]tab下的数据 +r($tester->checkContribute('ER', 'secondTab', '2')) && p('message,status') && e('业务需求的第2个tab下数据显示正确,SUCCESS');//检查业务需求列表-[我评审过]tab下的数据 +r($tester->checkContribute('ER', 'thirdTab', '2')) && p('message,status') && e('业务需求的第3个tab下数据显示正确,SUCCESS');//检查业务需求列表-[由我关闭]tab下的数据 + +r($tester->checkContribute('bug', 'firstTab', '7')) && p('message,status') && e('Bug的第1个tab下数据显示正确,SUCCESS');//检查Bug列表-[由我创建]tab下的数据 +r($tester->checkContribute('bug', 'secondTab', '3')) && p('message,status') && e('Bug的第2个tab下数据显示正确,SUCCESS');//检查Bug列表-[由我解决]tab下的数据 +r($tester->checkContribute('bug', 'thirdTab', '2')) && p('message,status') && e('Bug的第3个tab下数据显示正确,SUCCESS');//检查Bug列表-[由我关闭]tab下的数据 +r($tester->checkContribute('bug', 'fourthTab', '3')) && p('message,status') && e('Bug的第4个tab下数据显示正确,SUCCESS');//检查Bug列表-[由我指派]tab下的数据 + +r($tester->checkContribute('case', 'firstTab', '5')) && p('message,status') && e('用例的第1个tab下数据显示正确,SUCCESS');//检查用例列表-[由我创建]tab下的数据 + +r($tester->checkContribute('request', 'firstTab', '1')) && p('message,status') && e('测试单的第1个tab下数据显示正确,SUCCESS');//检查测试单列表-[已测测试单]tab下的数据 + +r($tester->checkContribute('review', 'firstTab', '6')) && p('message,status') && e('审批的第1个tab下数据显示正确,SUCCESS');//检查审批列表-[由我评审]tab下的数据 +r($tester->checkContribute('review', 'secondTab', '8')) && p('message,status') && e('审批的第2个tab下数据显示正确,SUCCESS');//检查审批列表-[由我发起]tab下的数据 + +$tester->closeBrowser(); From f62e99a515d47d6609688b994219c7ff6a50851b Mon Sep 17 00:00:00 2001 From: songchenxuan Date: Fri, 22 Nov 2024 11:10:44 +0800 Subject: [PATCH 036/431] *[misc] modify pivot preview moduleMenu item name. --- lib/zin/wg/modulemenu/v1.php | 2 +- module/pivot/zen.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/zin/wg/modulemenu/v1.php b/lib/zin/wg/modulemenu/v1.php index 9c2f714c5f..2e275ba913 100644 --- a/lib/zin/wg/modulemenu/v1.php +++ b/lib/zin/wg/modulemenu/v1.php @@ -84,7 +84,7 @@ class moduleMenu extends wg $item = array( 'key' => $child->id, 'text' => $child->name, - 'hint' => $child->name, + 'hint' => is_array($child->name) ? (isset($child->name['text']) ? $child->name['text'] : current($child->name)) : $child->name, 'url' => zget($child, 'url', ''), 'titleAttrs' => $titleAttrs, 'contentClass' => 'overflow-x-hidden' diff --git a/module/pivot/zen.php b/module/pivot/zen.php index 06c7f4edd5..f0f9312915 100644 --- a/module/pivot/zen.php +++ b/module/pivot/zen.php @@ -123,7 +123,7 @@ class pivotZen extends pivot protected function setNewMark(object $pivot, object $firstAction): void { if(!$pivot->mark && $pivot->createdDate < $firstAction->date) $pivot->mark = true; - if(!$pivot->mark) $pivot->name = array('html' => $pivot->name . ' ' . $this->lang->pivot->new . ''); + if(!$pivot->mark) $pivot->name = array('text' => $pivot->name, 'html' => $pivot->name . ' ' . $this->lang->pivot->new . ''); } /** From d6f904169c67183451aa3cb0ae673573d08a7bcd Mon Sep 17 00:00:00 2001 From: sunhao Date: Fri, 22 Nov 2024 11:19:48 +0800 Subject: [PATCH 037/431] * [misc] return original value in context wrappers. --- lib/zin/core/context.func.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/zin/core/context.func.php b/lib/zin/core/context.func.php index be092e8ff1..d2d9534a56 100644 --- a/lib/zin/core/context.func.php +++ b/lib/zin/core/context.func.php @@ -77,27 +77,27 @@ function useWg(string $name) function pageJS() { - call_user_func_array('\zin\context::js', func_get_args()); + return call_user_func_array('\zin\context::js', func_get_args()); } function jsCall() { - call_user_func_array('\zin\context::jsCall', func_get_args()); + return call_user_func_array('\zin\context::jsCall', func_get_args()); } function jsVar() { - call_user_func_array('\zin\context::jsVar', func_get_args()); + return call_user_func_array('\zin\context::jsVar', func_get_args()); } function pageCSS() { - call_user_func_array('\zin\context::css', func_get_args()); + return call_user_func_array('\zin\context::css', func_get_args()); } function import() { - call_user_func_array('\zin\context::import', func_get_args()); + return call_user_func_array('\zin\context::import', func_get_args()); } function setPageData($name, $value) From 469f420de282de02fc5f3fdf6a29c90fb7730020 Mon Sep 17 00:00:00 2001 From: sunhao Date: Fri, 22 Nov 2024 11:20:20 +0800 Subject: [PATCH 038/431] * [misc] add more options to batch form. --- lib/zin/wg/formbatch/v1.php | 10 +++++----- lib/zin/wg/formbatchpanel/v1.php | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/zin/wg/formbatch/v1.php b/lib/zin/wg/formbatch/v1.php index d8ca745d83..5fde864b91 100644 --- a/lib/zin/wg/formbatch/v1.php +++ b/lib/zin/wg/formbatch/v1.php @@ -43,7 +43,8 @@ class formBatch extends formBase 'sortable?: boo|array', // 排序配置,设置为 false 不启用排序,设置为 true 使用默认排序 'onRenderRow?: function', // 渲染行时的回调函数。 'hiddenFields?: array', // 被隐藏的字段。 - 'onRenderRowCol?: function' // 渲染列时的回调函数。 + 'onRenderRowCol?: function', // 渲染列时的回调函数。 + 'batchFormOptions?: array' // 批量表单选项。 ); /** @@ -105,10 +106,8 @@ class formBatch extends formBase foreach($items as $item) { - if($item instanceof item || is_array($item)) - { - $item = $this->onBuildItem($item); - } + if($item instanceof setting) $item = $item->toArray(); + if($item instanceof item || is_array($item)) $item = $this->onBuildItem($item); if($item instanceof formBatchItem) { if($item->hasProp('name') && is_null($item->prop('hidden'))) $item->setProp('hidden', in_array($item->prop('name'), $hiddenFields)); @@ -165,6 +164,7 @@ class formBatch extends formBase $props[] = setClass('form-batch'); $batchFormOptions = $this->props->pick(array('minRows', 'maxRows', 'data', 'mode', 'idKey', 'onRenderRow', 'onRenderRowCol', 'addRowIcon', 'deleteRowIcon', 'sortRowIcon', 'sortable')); + $batchFormOptions = array_merge($batchFormOptions, $this->prop('batchFormOptions', array())); $props = array_merge($props, zui::create('batchForm', $batchFormOptions)); return $props; diff --git a/lib/zin/wg/formbatchpanel/v1.php b/lib/zin/wg/formbatchpanel/v1.php index 1aaec45a27..826fc146de 100644 --- a/lib/zin/wg/formbatchpanel/v1.php +++ b/lib/zin/wg/formbatchpanel/v1.php @@ -43,7 +43,8 @@ class formBatchPanel extends formPanel 'sortRowIcon?: string|false', // 排序行的图标,如果设置为 `false` 则不显示图标 'sortable?: boo|array', // 排序配置,设置为 false 不启用排序,设置为 true 使用默认排序 'onRenderRow?: function', // 渲染行时的回调函数。 - 'onRenderRowCol?: function' // 渲染列时的回调函数。 + 'onRenderRowCol?: function', // 渲染列时的回调函数。 + 'batchFormOptions?: array' // 批量表单选项。 ); public static function getPageCSS(): ?string From 3315e320d964bcda1f090a6df2e425c70308524c Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 12:41:16 +0800 Subject: [PATCH 039/431] * [task#132864] rename buid lang. --- module/action/lang/zh-cn.php | 34 +++++++++++------------ module/ai/lang/zh-cn.php | 4 +-- module/block/lang/zh-cn.php | 4 +-- module/branch/lang/zh-cn.php | 2 +- module/bug/lang/zh-cn.php | 18 ++++++------ module/build/lang/zh-cn.php | 44 +++++++++++++++--------------- module/common/lang/zh-cn.php | 4 +-- module/convert/lang/zh-cn.php | 2 +- module/custom/lang/zh-cn.php | 14 +++++----- module/dataview/lang/zh-cn.php | 6 ++-- module/dev/lang/zh-cn.php | 4 +-- module/execution/lang/zh-cn.php | 6 ++-- module/group/lang/zh-cn.php | 8 +++--- module/kanban/lang/zh-cn.php | 4 +-- module/product/lang/zh-cn.php | 2 +- module/project/lang/zh-cn.php | 6 ++-- module/projectbuild/lang/zh-cn.php | 12 ++++---- module/release/lang/zh-cn.php | 6 ++-- module/report/lang/zh-cn.php | 2 +- module/testreport/lang/zh-cn.php | 10 +++---- module/testtask/lang/zh-cn.php | 4 +-- module/tutorial/lang/zh-cn.php | 14 +++++----- module/weekly/lang/zh-cn.php | 12 ++++---- 23 files changed, 111 insertions(+), 111 deletions(-) diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 4dbd978234..9935d22151 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -114,8 +114,8 @@ $lang->action->objectTypes['program'] = '项目集'; $lang->action->objectTypes['project'] = $lang->projectCommon; $lang->action->objectTypes['execution'] = '执行'; $lang->action->objectTypes['task'] = '任务'; -$lang->action->objectTypes['build'] = '版本'; -$lang->action->objectTypes['projectbuild'] = '项目版本'; +$lang->action->objectTypes['build'] = '构建'; +$lang->action->objectTypes['projectbuild'] = '项目构建'; $lang->action->objectTypes['job'] = '流水线'; $lang->action->objectTypes['bug'] = 'Bug'; $lang->action->objectTypes['case'] = '用例'; @@ -184,7 +184,7 @@ $lang->action->objectTypes['domain'] = '域名'; $lang->action->objectTypes['prompt'] = '提词'; $lang->action->objectTypes['miniprogram'] = '小程序'; $lang->action->objectTypes['metric'] = '度量'; -$lang->action->objectTypes['projectbuild'] = '版本'; +$lang->action->objectTypes['projectbuild'] = '构建'; $lang->action->objectTypes['board'] = '白板'; $lang->action->objectTypes['boardspace'] = '白板空间'; $lang->action->objectTypes['productline'] = '产品线'; @@ -236,7 +236,7 @@ $lang->action->desc->verified = '$date, 由 $actor $lang->action->desc->diff1 = '修改了 %s,旧值为 "%s",新值为 "%s"。
' . "\n"; $lang->action->desc->diff2 = '修改了 %s,区别为:' . "\n" . "
%s
" . "\n
%s
"; $lang->action->desc->diff3 = '将文件名 %s 改为 %s 。' . "\n"; -$lang->action->desc->linked2bug = '$date 由 $actor 关联到版本 $extra'; +$lang->action->desc->linked2bug = '$date 由 $actor 关联到构建 $extra'; $lang->action->desc->linked2testtask = '$date 由 $actor 关联到测试单 $extra'; $lang->action->desc->unlinkedfromtesttask = '$date 由 $actor 从测试单 $extra 中移除'; $lang->action->desc->resolved = '$date, 由 $actor 解决。' . "\n"; @@ -255,7 +255,7 @@ $lang->action->desc->importedcard = '$date, 由 $actor $lang->action->desc->importedproductplan = '$date, 由 $actor 从' . $lang->productCommon . '计划 $extra 导入。' . "\n"; $lang->action->desc->importedrelease = '$date, 由 $actor 从' . $lang->productCommon . '发布 $extra 导入。' . "\n"; $lang->action->desc->importedexecution = '$date, 由 $actor 从' . $lang->projectCommon . '执行 $extra 导入。' . "\n"; -$lang->action->desc->importedbuild = '$date, 由 $actor 从' . $lang->projectCommon . '版本 $extra 导入。' . "\n"; +$lang->action->desc->importedbuild = '$date, 由 $actor 从' . $lang->projectCommon . '构建 $extra 导入。' . "\n"; $lang->action->desc->importedticket = '$date, 由 $actor 从反馈工单 $extra 导入。' . "\n"; $lang->action->desc->fromsonarqube = '$date, 由 $actor 从SonarQube问题转化而来。' . "\n"; $lang->action->desc->tolib = '$date, 由 $actor 导入。' . "\n"; @@ -422,7 +422,7 @@ $lang->action->label->unlinkedfromexecution = "移除了{$lang->executionCommo $lang->action->label->linked2kanban = '关联了看板'; $lang->action->label->linked2project = "关联了{$lang->projectCommon}"; $lang->action->label->unlinkedfromproject = "移除了{$lang->projectCommon}"; -$lang->action->label->unlinkedfrombuild = "移除了版本"; +$lang->action->label->unlinkedfrombuild = "移除了构建"; $lang->action->label->linked2release = "关联了发布"; $lang->action->label->unlinkedfromrelease = "移除了发布"; $lang->action->label->linked2revision = "关联了代码提交"; @@ -646,8 +646,8 @@ $lang->action->dynamicAction->story['linked2release'] = "{$lang->SRCommon $lang->action->dynamicAction->story['unlinkedfromrelease'] = "发布移除{$lang->SRCommon}"; $lang->action->dynamicAction->story['linked2revision'] = "{$lang->SRCommon}关联代码提交"; $lang->action->dynamicAction->story['unlinkedfromrevision'] = "{$lang->SRCommon}取消关联代码提交"; -$lang->action->dynamicAction->story['linked2build'] = "{$lang->SRCommon}关联版本"; -$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->SRCommon}"; +$lang->action->dynamicAction->story['linked2build'] = "{$lang->SRCommon}关联构建"; +$lang->action->dynamicAction->story['unlinkedfrombuild'] = "构建移除{$lang->SRCommon}"; $lang->action->dynamicAction->story['unlinkedfromproject'] = "移除{$lang->projectCommon}"; $lang->action->dynamicAction->story['undeleted'] = "还原{$lang->SRCommon}"; $lang->action->dynamicAction->story['hidden'] = "隐藏{$lang->SRCommon}"; @@ -737,9 +737,9 @@ $lang->action->dynamicAction->task['ganttmove'] = '排序'; $lang->action->dynamicAction->task['linked2revision'] = '任务关联代码提交'; $lang->action->dynamicAction->task['unlinkedfromrevision'] = '任务取消关联代码提交'; -$lang->action->dynamicAction->build['opened'] = '创建版本'; -$lang->action->dynamicAction->build['edited'] = '编辑版本'; -$lang->action->dynamicAction->build['deleted'] = '删除版本'; +$lang->action->dynamicAction->build['opened'] = '创建构建'; +$lang->action->dynamicAction->build['edited'] = '编辑构建'; +$lang->action->dynamicAction->build['deleted'] = '删除构建'; $lang->action->dynamicAction->bug['opened'] = '创建Bug'; $lang->action->dynamicAction->bug['importfromgitlab'] = "从Gitlab关联创建Bug"; @@ -761,8 +761,8 @@ $lang->action->dynamicAction->bug['linked2release'] = 'Bug关联发布'; $lang->action->dynamicAction->bug['unlinkedfromrelease'] = '发布移除Bug'; $lang->action->dynamicAction->bug['linked2revision'] = 'Bug关联代码提交'; $lang->action->dynamicAction->bug['unlinkedfromrevision'] = 'Bug取消关联代码提交'; -$lang->action->dynamicAction->bug['linked2bug'] = 'Bug关联版本'; -$lang->action->dynamicAction->bug['unlinkedfrombuild'] = '版本移除Bug'; +$lang->action->dynamicAction->bug['linked2bug'] = 'Bug关联构建'; +$lang->action->dynamicAction->bug['unlinkedfrombuild'] = '构建移除Bug'; $lang->action->dynamicAction->bug['fromsonarqube'] = '由SonarQube问题创建'; $lang->action->dynamicAction->testtask['opened'] = '创建测试单'; @@ -892,7 +892,7 @@ $lang->action->label->project = "{$lang->projectCommon}|project|index|projec $lang->action->label->execution = "执行|execution|task|executionID=%s"; $lang->action->label->task = '任务|task|view|taskID=%s'; -$lang->action->label->build = '版本|build|view|buildID=%s'; +$lang->action->label->build = '构建|build|view|buildID=%s'; $lang->action->label->bug = 'Bug|bug|view|bugID=%s'; $lang->action->label->case = '用例|testcase|view|caseID=%s'; $lang->action->label->testtask = '测试单|testtask|view|caseID=%s'; @@ -948,7 +948,7 @@ $lang->action->search->objectTypeList['user'] = '用户'; $lang->action->search->objectTypeList['doc'] = '文档'; $lang->action->search->objectTypeList['doclib'] = '文档库'; $lang->action->search->objectTypeList['todo'] = '待办'; -$lang->action->search->objectTypeList['build'] = '版本'; +$lang->action->search->objectTypeList['build'] = '构建'; $lang->action->search->objectTypeList['release'] = '发布'; $lang->action->search->objectTypeList['productplan'] = '计划'; $lang->action->search->objectTypeList['branch'] = '分支'; @@ -1039,7 +1039,7 @@ $lang->action->apiTitle->svncommited = '提交代码,版本为action->apiTitle->gitcommited = '提交代码,版本为#%s。'; $lang->action->apiTitle->finished = '完成。'; $lang->action->apiTitle->paused = '暂停。'; -$lang->action->apiTitle->linked2bug = '关联到版本 %s'; +$lang->action->apiTitle->linked2bug = '关联到构建 %s'; $lang->action->apiTitle->linked2testtask = '关联到测试单 %s'; $lang->action->apiTitle->resolved = '解决。'; $lang->action->apiTitle->managed = '维护。'; @@ -1078,7 +1078,7 @@ $lang->action->apiTitle->unlinkedfromexecution = "移除{$lang->executionCommon} $lang->action->apiTitle->linked2kanban = '关联看板'; $lang->action->apiTitle->linked2project = "关联{$lang->projectCommon}"; $lang->action->apiTitle->unlinkedfromproject = "移除{$lang->projectCommon}"; -$lang->action->apiTitle->unlinkedfrombuild = "移除版本"; +$lang->action->apiTitle->unlinkedfrombuild = "移除构建"; $lang->action->apiTitle->linked2release = "关联发布"; $lang->action->apiTitle->unlinkedfromrelease = "移除发布"; $lang->action->apiTitle->linked2revision = "关联代码提交"; diff --git a/module/ai/lang/zh-cn.php b/module/ai/lang/zh-cn.php index 9b543f8d40..d726b31ee1 100644 --- a/module/ai/lang/zh-cn.php +++ b/module/ai/lang/zh-cn.php @@ -820,7 +820,7 @@ $lang->ai->formSchema['bug']['create']->properties->pri->type = ' $lang->ai->formSchema['bug']['create']->properties->pri->description = 'Bug 的优先级'; $lang->ai->formSchema['bug']['create']->properties->pri->enum = array('1', '2', '3', '4'); $lang->ai->formSchema['bug']['create']->properties->openedBuild->type = 'string'; -$lang->ai->formSchema['bug']['create']->properties->openedBuild->description = 'Bug 影响的版本'; +$lang->ai->formSchema['bug']['create']->properties->openedBuild->description = 'Bug 影响的构建'; $lang->ai->formSchema['bug']['create']->properties->openedBuild->enum = array('trunk'); $lang->ai->formSchema['bug']['create']->required = array('title', 'steps', 'severity', 'pri', 'openedBuild'); $lang->ai->formSchema['bug']['edit'] = $lang->ai->formSchema['bug']['create']; @@ -1007,4 +1007,4 @@ $lang->ai->assistant->statusList['1'] = '已发布'; $lang->ai->assistant->statusList['on'] = '已发布'; // for render action changes. -$lang->aiassistant = $lang->ai->assistant; \ No newline at end of file +$lang->aiassistant = $lang->ai->assistant; diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php index 6669e19479..9f91fc57f5 100644 --- a/module/block/lang/zh-cn.php +++ b/module/block/lang/zh-cn.php @@ -230,7 +230,7 @@ $lang->block->availableBlocks['product'] = $lang->productCommon . '列表'; $lang->block->availableBlocks['execution'] = $lang->execution->common . '列表'; $lang->block->availableBlocks['plan'] = "计划列表"; $lang->block->availableBlocks['release'] = '发布列表'; -$lang->block->availableBlocks['build'] = '版本列表'; +$lang->block->availableBlocks['build'] = '构建列表'; $lang->block->availableBlocks['testcase'] = '用例'; $lang->block->availableBlocks['testtask'] = '测试单'; $lang->block->availableBlocks['risk'] = '风险'; @@ -288,7 +288,7 @@ $lang->block->modules['execution']->availableBlocks['statistic'] = $lang->execut $lang->block->modules['execution']->availableBlocks['overview'] = $lang->execution->common . '总览'; $lang->block->modules['execution']->availableBlocks['list'] = $lang->execution->common . '列表'; $lang->block->modules['execution']->availableBlocks['task'] = '任务列表'; -$lang->block->modules['execution']->availableBlocks['build'] = '版本列表'; +$lang->block->modules['execution']->availableBlocks['build'] = '构建列表'; $lang->block->modules['qa'] = new stdclass(); $lang->block->modules['qa']->availableBlocks['statistic'] = "{$lang->productCommon}的测试统计"; diff --git a/module/branch/lang/zh-cn.php b/module/branch/lang/zh-cn.php index 5616255591..31fa812f02 100644 --- a/module/branch/lang/zh-cn.php +++ b/module/branch/lang/zh-cn.php @@ -46,7 +46,7 @@ $lang->branch->confirmClose = '是否关闭该@branch@?'; $lang->branch->confirmActivate = '是否激活该@branch@?'; $lang->branch->existName = '@branch@名称已存在'; $lang->branch->mergedMain = '主干不支持被合并。'; -$lang->branch->mergeTips = '合并@branch@后,会将@branch@下面对应的发布、计划、版本、模块、需求、Bug、用例都合并到新的@branch@下。'; +$lang->branch->mergeTips = '合并@branch@后,会将@branch@下面对应的发布、计划、构建、模块、需求、Bug、用例都合并到新的@branch@下。'; $lang->branch->targetBranchTips = '您可以将其合并到已有的一个@branch@,也可以合并到主干或者新创建一个@branch@。'; $lang->branch->confirmMerge = '"mergedBranch"的数据将被合并到"targetBranch",请确认是否要执行分支合并操作,合并后数据将不可再恢复!'; diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index 0180cc5e5a..46b10de5bb 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -49,13 +49,13 @@ $lang->bug->notifyEmail = '通知邮箱'; $lang->bug->mailto = '抄送给'; $lang->bug->openedBy = '由谁创建'; $lang->bug->openedDate = '创建日期'; -$lang->bug->openedBuild = '影响版本'; +$lang->bug->openedBuild = '影响构建'; $lang->bug->assignedTo = '指派给'; $lang->bug->assignedToMe = '指派给我'; $lang->bug->assignedDate = '指派日期'; $lang->bug->resolvedBy = '解决者'; $lang->bug->resolution = '解决方案'; -$lang->bug->resolvedBuild = '解决版本'; +$lang->bug->resolvedBuild = '解决构建'; $lang->bug->resolvedDate = '解决日期'; $lang->bug->deadline = '截止日期'; $lang->bug->plan = '所属计划'; @@ -293,7 +293,7 @@ $lang->bug->report->select = '请选择报表类型'; $lang->bug->report->create = '生成报表'; $lang->bug->report->charts['bugsPerExecution'] = $lang->executionCommon . 'Bug数量'; -$lang->bug->report->charts['bugsPerBuild'] = '版本Bug数量'; +$lang->bug->report->charts['bugsPerBuild'] = '构建Bug数量'; $lang->bug->report->charts['bugsPerModule'] = '模块Bug数量'; $lang->bug->report->charts['openedBugsPerDay'] = '每天新增Bug数'; $lang->bug->report->charts['resolvedBugsPerDay'] = '每天解决Bug数'; @@ -356,7 +356,7 @@ $lang->bug->report->bugLiveDays->graph = new stdclass(); $lang->bug->report->bugHistories->graph = new stdclass(); $lang->bug->report->bugsPerExecution->graph->xAxisName = $lang->executionCommon; -$lang->bug->report->bugsPerBuild->graph->xAxisName = '版本'; +$lang->bug->report->bugsPerBuild->graph->xAxisName = '构建'; $lang->bug->report->bugsPerModule->graph->xAxisName = '模块'; $lang->bug->report->openedBugsPerDay->type = 'bar'; @@ -390,8 +390,8 @@ $lang->bug->action->totask = array('main' => '$date, 由 $ $lang->bug->action->converttotask = array('main' => '$date, 由 $actor 转为任务,编号为 $extra。'); $lang->bug->action->linked2plan = array('main' => '$date, 由 $actor 关联到计划 $extra。'); $lang->bug->action->unlinkedfromplan = array('main' => '$date, 由 $actor 从计划 $extra 移除。'); -$lang->bug->action->linked2build = array('main' => '$date, 由 $actor 关联到版本 $extra。'); -$lang->bug->action->unlinkedfrombuild = array('main' => '$date, 由 $actor 从版本 $extra 移除。'); +$lang->bug->action->linked2build = array('main' => '$date, 由 $actor 关联到构建 $extra。'); +$lang->bug->action->unlinkedfrombuild = array('main' => '$date, 由 $actor 从构建 $extra 移除。'); $lang->bug->action->unlinkedfromrelease = array('main' => '$date, 由 $actor 从发布 $extra 移除。'); $lang->bug->action->linked2release = array('main' => '$date, 由 $actor 关联到发布 $extra。'); $lang->bug->action->linked2revision = array('main' => '$date, 由 $actor 关联到代码提交 $extra.'); @@ -417,8 +417,8 @@ $lang->bug->moreSelects['browse']['more']['overduebugs'] = $lang->bug->overdue $lang->bug->moreSelects['browse']['more']['needconfirm'] = $lang->bug->needConfirm; $lang->bug->placeholder = new stdclass(); -$lang->bug->placeholder->chooseBuilds = '选择相关版本...'; -$lang->bug->placeholder->newBuildName = '新版本名称'; +$lang->bug->placeholder->chooseBuilds = '选择相关构建...'; +$lang->bug->placeholder->newBuildName = '新构建名称'; $lang->bug->placeholder->duplicate = '请输入关键字'; /* 交互提示。*/ @@ -431,7 +431,7 @@ $lang->bug->notice->confirmDelete = '您确认要删除该Bug吗?'; $lang->bug->notice->remindTask = '该Bug已经转化为任务,是否更新任务(编号:%s)状态 ?'; $lang->bug->notice->skipClose = 'Bug %s 不是已解决状态,不能关闭,将自动忽略。'; $lang->bug->notice->executionAccessDenied = "您无权访问该Bug所属的{$lang->executionCommon}!"; -$lang->bug->notice->confirmUnlinkBuild = "更换解决版本将取消与旧版本的关联,您确定取消该bug与%s的关联吗?"; +$lang->bug->notice->confirmUnlinkBuild = "更换解决构建将取消与旧构建的关联,您确定取消该bug与%s的关联吗?"; $lang->bug->notice->noSwitchBranch = 'Bug%s所属模块不在当前分支下,将自动忽略。'; $lang->bug->notice->confirmToStory = '转需求后Bug将自动关闭,关闭原因为转为需求。'; $lang->bug->notice->productDitto = "该 bug 与上一 bug 不属于同一{$lang->productCommon}!"; diff --git a/module/build/lang/zh-cn.php b/module/build/lang/zh-cn.php index 6f26d02892..5d06041ff5 100644 --- a/module/build/lang/zh-cn.php +++ b/module/build/lang/zh-cn.php @@ -9,21 +9,21 @@ * @version $Id: zh-cn.php 4129 2013-01-18 01:58:14Z wwccss $ * @link https://www.zentao.net */ -$lang->build->common = "版本"; -$lang->build->create = "创建版本"; -$lang->build->edit = "编辑版本"; +$lang->build->common = "构建"; +$lang->build->create = "创建构建"; +$lang->build->edit = "编辑构建"; $lang->build->linkStory = "关联{$lang->SRCommon}"; $lang->build->linkBug = "关联Bug"; -$lang->build->delete = "删除版本"; +$lang->build->delete = "删除构建"; $lang->build->deleted = "已删除"; -$lang->build->view = "版本详情"; +$lang->build->view = "构建详情"; $lang->build->batchUnlink = '批量移除'; $lang->build->batchUnlinkStory = "批量移除{$lang->SRCommon}"; $lang->build->batchUnlinkBug = '批量移除Bug'; $lang->build->viewBug = '查看Bug'; $lang->build->bugList = 'Bug列表'; -$lang->build->confirmDelete = "您确认删除该版本吗?"; +$lang->build->confirmDelete = "您确认删除该构建吗?"; $lang->build->confirmUnlinkStory = "您确认移除该{$lang->SRCommon}吗?"; $lang->build->confirmUnlinkBug = "您确认移除该Bug吗?"; @@ -37,9 +37,9 @@ $lang->build->branchAll = '所有关联%s'; $lang->build->branchName = '所属%s'; $lang->build->execution = '所属' . $lang->executionCommon; $lang->build->executionAB = '所属执行'; -$lang->build->integrated = '集成版本'; -$lang->build->singled = '单一版本'; -$lang->build->builds = '包含版本'; +$lang->build->integrated = '集成构建'; +$lang->build->singled = '单一构建'; +$lang->build->builds = '包含构建'; $lang->build->released = '发布'; $lang->build->name = '名称编号'; $lang->build->nameAB = '名称'; @@ -51,7 +51,7 @@ $lang->build->filePath = '下载地址'; $lang->build->desc = '描述'; $lang->build->mailto = 'Mailto'; $lang->build->files = '上传发行包'; -$lang->build->last = '上个版本'; +$lang->build->last = '上个构建'; $lang->build->createdBy = '由谁创建'; $lang->build->createdDate = '创建时间'; $lang->build->packageType = '包类型'; @@ -60,20 +60,20 @@ $lang->build->unlinkBug = '移除Bug'; $lang->build->stories = "完成的{$lang->SRCommon}"; $lang->build->bugs = '解决的Bug'; $lang->build->generatedBugs = '产生的Bug'; -$lang->build->noProduct = " 该{$lang->executionCommon}没有关联{$lang->productCommon},无法创建版本,请先关联{$lang->productCommon}"; -$lang->build->noBuild = '暂时没有版本。'; +$lang->build->noProduct = " 该{$lang->executionCommon}没有关联{$lang->productCommon},无法创建构建,请先关联{$lang->productCommon}"; +$lang->build->noBuild = '暂时没有构建。'; $lang->build->emptyExecution = $lang->executionCommon . '不能为空。'; -$lang->build->linkedBuild = '关联版本'; +$lang->build->linkedBuild = '关联构建'; $lang->build->createTest = '提交测试'; $lang->build->notice = new stdclass(); -$lang->build->notice->changeProduct = "已经关联{$lang->SRCommon}、Bug或提交测试单的版本,不能修改其所属{$lang->productCommon}"; -$lang->build->notice->changeExecution = "提交测试单的版本,不能修改其所属{$lang->executionCommon}"; -$lang->build->notice->changeBuilds = "提交测试单的版本,不能修改关联版本"; -$lang->build->notice->autoRelation = "相关版本下完成的需求、解决的Bug、产生的Bug将会自动关联到{$lang->projectCommon}版本中"; -$lang->build->notice->createTest = "该版本所属执行已删除,不能提交测试"; +$lang->build->notice->changeProduct = "已经关联{$lang->SRCommon}、Bug或提交测试单的构建,不能修改其所属{$lang->productCommon}"; +$lang->build->notice->changeExecution = "提交测试单的构建,不能修改其所属{$lang->executionCommon}"; +$lang->build->notice->changeBuilds = "提交测试单的构建,不能修改关联的构建"; +$lang->build->notice->autoRelation = "相关构建下完成的需求、解决的Bug、产生的Bug将会自动关联到{$lang->projectCommon}构建中"; +$lang->build->notice->createTest = "该构建所属执行已删除,不能提交测试"; -$lang->build->confirmChangeBuild = "%s『%s』解除关联后,%s下 %s个{$lang->SRCommon}和%s个Bug将同步从版本移除,是否解除?"; +$lang->build->confirmChangeBuild = "%s『%s』解除关联后,%s下 %s个{$lang->SRCommon}和%s个Bug将同步从构建移除,是否解除?"; $lang->build->confirmRemoveStory = "%s『%s』解除关联后,%s下 %s个{$lang->SRCommon}将同步从计划中移除,是否解除?"; $lang->build->confirmRemoveBug = "%s『%s』解除关联后,%s下 %s个Bug将同步从计划中移除,是否解除?"; $lang->build->confirmRemoveTips = "确认删除%s『%s』吗?"; @@ -84,11 +84,11 @@ $lang->build->createdBugs = ' 本次共产生 %s 个Bug'; $lang->build->placeholder = new stdclass(); $lang->build->placeholder->scmPath = ' 软件源代码库,如Subversion、Git库地址'; -$lang->build->placeholder->filePath = ' 该版本软件包下载存储地址'; -$lang->build->placeholder->multipleSelect = "版本支持多选"; +$lang->build->placeholder->filePath = ' 该构建软件包下载存储地址'; +$lang->build->placeholder->multipleSelect = "构建支持多选"; $lang->build->action = new stdclass(); -$lang->build->action->buildopened = '$date, 由 $actor 创建版本 $extra。' . "\n"; +$lang->build->action->buildopened = '$date, 由 $actor 创建构建 $extra。' . "\n"; $lang->backhome = '返回'; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 022c75717d..a3702079f1 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -236,7 +236,7 @@ $lang->bug->common = 'Bug'; $lang->testcase->common = '用例'; $lang->testtask->common = '测试单'; $lang->score->common = '我的积分'; -$lang->build->common = '版本'; +$lang->build->common = '构建'; $lang->testreport->common = '测试报告'; $lang->automation->common = '自动化'; $lang->autotest->common = '自动化'; @@ -459,7 +459,7 @@ if($config->URAndSR) $lang->searchObjects['requirement'] = $lang->URCommon; $lang->searchObjects['task'] = '任务'; $lang->searchObjects['testcase'] = '用例'; $lang->searchObjects['product'] = $lang->productCommon; -$lang->searchObjects['build'] = '版本'; +$lang->searchObjects['build'] = '构建'; $lang->searchObjects['release'] = '发布'; $lang->searchObjects['productplan'] = $lang->productCommon . '计划'; $lang->searchObjects['testtask'] = '测试单'; diff --git a/module/convert/lang/zh-cn.php b/module/convert/lang/zh-cn.php index 623bdf51f9..84498c99cb 100644 --- a/module/convert/lang/zh-cn.php +++ b/module/convert/lang/zh-cn.php @@ -189,7 +189,7 @@ $lang->convert->jira->importSteps['file'][5] = "上述步骤完成后,点击 $lang->convert->jira->objectList['user'] = '用户'; $lang->convert->jira->objectList['project'] = '项目'; $lang->convert->jira->objectList['issue'] = 'Issue'; -$lang->convert->jira->objectList['build'] = '版本'; +$lang->convert->jira->objectList['build'] = '构建'; $lang->convert->jira->objectList['issuelink'] = '关联关系'; $lang->convert->jira->objectList['action'] = '历史记录'; $lang->convert->jira->objectList['file'] = '附件'; diff --git a/module/custom/lang/zh-cn.php b/module/custom/lang/zh-cn.php index a0d81a33a8..23d4a0e6cf 100644 --- a/module/custom/lang/zh-cn.php +++ b/module/custom/lang/zh-cn.php @@ -208,19 +208,19 @@ $lang->custom->notice->noClosedBlock = '没有永久关闭的区块'; $lang->custom->notice->required = '页面提交时,选中的字段必填'; $lang->custom->notice->conceptResult = '我们已经根据您的选择为您设置了 %s-%s 模式,使用%s + %s。'; $lang->custom->notice->conceptPath = '您可以在:后台 -> 自定义 -> 流程页面修改。'; -$lang->custom->notice->readOnlyOfProduct = '禁止修改后,已关闭' . $lang->productCommon . '下的' . $lang->SRCommon . '、Bug、用例、日志、发布、计划、版本都禁止修改。'; +$lang->custom->notice->readOnlyOfProduct = '禁止修改后,已关闭' . $lang->productCommon . '下的' . $lang->SRCommon . '、Bug、用例、日志、发布、计划、构建都禁止修改。'; $lang->custom->notice->readOnlyOfProject = "禁止修改后,已关闭{$lang->projectCommon}下的数据将禁止修改:
-1. 产品型{$lang->projectCommon}启用{$lang->custom->executionCommon}:已关闭项目下的{$lang->custom->executionCommon}、需求、设计、评审、评审问题、基线、文档、版本、发布、日志、测试单、测试报告、过程裁剪、调研、估算、问题、风险、机会、会议、质量保证计划、不符合项等禁止修改。
-2. 产品型{$lang->projectCommon}不启用{$lang->custom->executionCommon}:已关闭项目下的任务、需求、版本、发布、日志、测试单、测试报告、文档等禁止修改。
-3. 项目型{$lang->projectCommon}启用{$lang->custom->executionCommon}:已关闭项目下的执行、需求、设计、评审、评审问题、基线、Bug、用例、测试单、测试报告、文档、版本、发布、日志、过程裁剪、调研、估算、问题、风险、机会、会议、质量保证计划、不符合项等禁止修改。
-4. 项目型{$lang->projectCommon}不启用{$lang->custom->executionCommon}:已关闭项目下的任务、需求、Bug、用例、测试单、测试报告、文档、版本、发布、日志等禁止修改。"; +1. 产品型{$lang->projectCommon}启用{$lang->custom->executionCommon}:已关闭项目下的{$lang->custom->executionCommon}、需求、设计、评审、评审问题、基线、文档、构建、发布、日志、测试单、测试报告、过程裁剪、调研、估算、问题、风险、机会、会议、质量保证计划、不符合项等禁止修改。
+2. 产品型{$lang->projectCommon}不启用{$lang->custom->executionCommon}:已关闭项目下的任务、需求、构建、发布、日志、测试单、测试报告、文档等禁止修改。
+3. 项目型{$lang->projectCommon}启用{$lang->custom->executionCommon}:已关闭项目下的执行、需求、设计、评审、评审问题、基线、Bug、用例、测试单、测试报告、文档、构建、发布、日志、过程裁剪、调研、估算、问题、风险、机会、会议、质量保证计划、不符合项等禁止修改。
+4. 项目型{$lang->projectCommon}不启用{$lang->custom->executionCommon}:已关闭项目下的任务、需求、Bug、用例、测试单、测试报告、文档、构建、发布、日志等禁止修改。"; if(in_array($config->edition, array('open', 'biz'))) { - $lang->custom->notice->readOnlyOfExecution = "禁止修改后,已关闭{$lang->custom->executionCommon}下的任务、日志、版本、测试单、测试报告、文档以及关联需求等都禁止修改。"; + $lang->custom->notice->readOnlyOfExecution = "禁止修改后,已关闭{$lang->custom->executionCommon}下的任务、日志、构建、测试单、测试报告、文档以及关联需求等都禁止修改。"; } else { - $lang->custom->notice->readOnlyOfExecution = "禁止修改后,已关闭{$lang->custom->executionCommon}下的任务、日志、版本、测试单、测试报告、文档、问题、风险、QA、会议以及关联需求等都禁止修改。"; + $lang->custom->notice->readOnlyOfExecution = "禁止修改后,已关闭{$lang->custom->executionCommon}下的任务、日志、构建、测试单、测试报告、文档、问题、风险、QA、会议以及关联需求等都禁止修改。"; } $lang->custom->notice->readOnlyOfKanban = "禁止修改后,已关闭{$lang->custom->kanban}下的卡片以及相关设置都禁止修改。"; $lang->custom->notice->URSREmpty = '自定义需求名称不能为空!'; diff --git a/module/dataview/lang/zh-cn.php b/module/dataview/lang/zh-cn.php index bf42182687..1c4093b808 100644 --- a/module/dataview/lang/zh-cn.php +++ b/module/dataview/lang/zh-cn.php @@ -117,16 +117,16 @@ $lang->dataview->objects['effort'] = '日志'; if($this->config->edition != 'open') $lang->dataview->objects['feedback'] = '反馈'; $lang->dataview->tables = array(); -$lang->dataview->tables['build'] = array('name' => '版本数据', 'desc' => '包括版本名称、所属产品、所属项目、所属执行、创建人等'); +$lang->dataview->tables['build'] = array('name' => '构建数据', 'desc' => '包括构建名称、所属产品、所属项目、所属执行、创建人等'); $lang->dataview->tables['product'] = array('name' => '产品数据', 'desc' => '包括产品名称、所属产品线、所属项目集、产品代号、创建人等'); $lang->dataview->tables['productplan'] = array('name' => '产品计划数据', 'desc' => '包括计划名称、所属产品、父计划、开始时间、结束时间等'); -$lang->dataview->tables['release'] = array('name' => '产品发布数据', 'desc' => '包括发布名称、所属产品、所属项目、相关版本、创建人等'); +$lang->dataview->tables['release'] = array('name' => '产品发布数据', 'desc' => '包括发布名称、所属产品、所属项目、相关构建、创建人等'); $lang->dataview->tables['project'] = array('name' => '项目数据', 'desc' => '包括项目名称、项目代号、项目模型、开始时间、结束时间等'); $lang->dataview->tables['execution'] = array('name' => '执行数据', 'desc' => '包括执行名称、执行代号、所属项目、开始时间、结束时间等'); $lang->dataview->tables['task'] = array('name' => '任务数据', 'desc' => '包括任务名称、优先级、指派人、所属执行、创建人等'); //$lang->dataview->tables['team'] = array('name' => '团队数据', 'desc' => '包括所属项目、所属执行、团队成员等'); $lang->dataview->tables['bug'] = array('name' => 'Bug数据', 'desc' => '包括Bug严重程度、优先级、解决人、所属项目、所属产品等'); -$lang->dataview->tables['bugbuild'] = array('name' => '版本Bug数据', 'desc' => '版本的Bug严重程度、优先级、解决人、所属项目、所属产品等'); +$lang->dataview->tables['bugbuild'] = array('name' => '构建Bug数据', 'desc' => '构建的Bug严重程度、优先级、解决人、所属项目、所属产品等'); $lang->dataview->tables['story'] = array('name' => '需求数据', 'desc' => '包括需求优先级、创建人、所属产品、状态、阶段等'); $lang->dataview->tables['testcase'] = array('name' => '用例数据', 'desc' => '包括用例优先级、创建人、所属产品、状态、看护人等'); $lang->dataview->tables['casestep'] = array('name' => '用例步骤数据', 'desc' => '包括所属用例、用例步骤、期望结果等'); diff --git a/module/dev/lang/zh-cn.php b/module/dev/lang/zh-cn.php index 5438129a72..e6205b8158 100644 --- a/module/dev/lang/zh-cn.php +++ b/module/dev/lang/zh-cn.php @@ -44,7 +44,7 @@ $lang->dev->switchList['0'] = '关闭'; $lang->dev->tableList = array(); $lang->dev->tableList['action'] = '系统日志'; $lang->dev->tableList['bug'] = 'Bug'; -$lang->dev->tableList['build'] = '版本'; +$lang->dev->tableList['build'] = '构建'; $lang->dev->tableList['burn'] = '燃尽图'; $lang->dev->tableList['case'] = '测试用例'; $lang->dev->tableList['casestep'] = '用例步骤'; @@ -154,7 +154,7 @@ $lang->dev->tableList['kanbangroup'] = '看板组'; $lang->dev->tableList['kanbanregion'] = '看板区域'; $lang->dev->tableList['kanbanspace'] = '看板空间'; $lang->dev->tableList['personnel'] = '可访问人员'; -$lang->dev->tableList['projectbuild'] = "{$lang->projectCommon}版本"; +$lang->dev->tableList['projectbuild'] = "{$lang->projectCommon}构建"; $lang->dev->tableList['projectrelease'] = "{$lang->projectCommon}发布"; $lang->dev->tableList['design'] = '设计'; $lang->dev->tableList['stage'] = '阶段'; diff --git a/module/execution/lang/zh-cn.php b/module/execution/lang/zh-cn.php index bde1793ac7..de44273c6a 100644 --- a/module/execution/lang/zh-cn.php +++ b/module/execution/lang/zh-cn.php @@ -102,7 +102,7 @@ $lang->execution->all = '所有'; $lang->execution->undone = '未完成'; $lang->execution->unclosed = '未关闭'; $lang->execution->closedExecution = '已关闭的执行'; -$lang->execution->typeDesc = "运维{$lang->executionCommon}没有{$lang->SRCommon}、bug、版本、测试功能。"; +$lang->execution->typeDesc = "运维{$lang->executionCommon}没有{$lang->SRCommon}、bug、构建、测试功能。"; $lang->execution->mine = '我负责:'; $lang->execution->involved = '我参与'; $lang->execution->other = '其他'; @@ -231,7 +231,7 @@ $lang->execution->bug = 'Bug列表'; $lang->execution->testcase = '用例列表'; $lang->execution->dynamic = '动态'; $lang->execution->latestDynamic = '最新动态'; -$lang->execution->build = '版本列表'; +$lang->execution->build = '构建列表'; $lang->execution->testtask = '测试单'; $lang->execution->burn = '燃尽图'; $lang->execution->computeBurn = '更新燃尽图'; @@ -559,7 +559,7 @@ $lang->execution->featureBar['all']['closed'] = $lang->execution->statusList[ $lang->execution->featureBar['bug']['all'] = '全部'; $lang->execution->featureBar['bug']['unresolved'] = '未解决'; -$lang->execution->featureBar['build']['all'] = '全部版本'; +$lang->execution->featureBar['build']['all'] = '全部构建'; $lang->execution->featureBar['story']['all'] = '全部'; $lang->execution->featureBar['story']['unclosed'] = '未关闭'; diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index 390b516590..0510c7400f 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -279,8 +279,8 @@ $lang->group->package->burndown = '燃尽图'; $lang->group->package->cfd = '累积流图'; $lang->group->package->manageExecutionStory = '维护执行研发需求'; $lang->group->package->manageExecutionEffort = '维护执行日志'; -$lang->group->package->manageBuild = '创建维护版本'; -$lang->group->package->deleteBuild = '删除版本'; +$lang->group->package->manageBuild = '创建维护构建'; +$lang->group->package->deleteBuild = '删除构建'; $lang->group->package->browseStoryLib = '浏览需求库'; $lang->group->package->manageStoryLib = '创建维护需求库'; $lang->group->package->deleteStoryLib = '删除需求库'; @@ -467,7 +467,7 @@ $lang->group->package->commonEffort = '通用日志'; $lang->group->package->docTemplate = '文档模板'; $lang->group->package->importStoryLib = '导入需求库'; $lang->group->package->projectStakeholder = '项目干系人'; -$lang->group->package->projectBuild = '项目版本'; +$lang->group->package->projectBuild = '项目构建'; $lang->group->package->importCaseLib = '导入用例库'; $lang->group->package->commonSetting = '通用配置'; $lang->group->package->stageSetting = '阶段列表设置'; @@ -509,7 +509,7 @@ $lang->group->package->importProjectRelease = '导入导出项目发布'; $lang->group->package->projectReleaseNotify = '项目发布通知'; $lang->group->package->gantt = '阶段甘特图'; $lang->group->package->executionRelation = '维护任务关系'; -$lang->group->package->browseBuild = '浏览版本'; +$lang->group->package->browseBuild = '浏览构建'; $lang->group->package->browseExecutionStory = '浏览执行研发需求'; $lang->group->package->manageCard = '维护卡片'; $lang->group->package->browseProjectStory = '浏览项目需求'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index af641a49ac..866746e8ab 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -81,7 +81,7 @@ $lang->kanban->importCard = '转入卡片'; $lang->kanban->importPlan = '计划'; $lang->kanban->importRelease = '发布'; $lang->kanban->importExecution = $lang->execution->common; -$lang->kanban->importBuild = '版本'; +$lang->kanban->importBuild = '构建'; $lang->kanban->importTicket = '工单'; $lang->kanban->allKanban = '所有看板'; $lang->kanban->allProjects = '所有' . $lang->projectCommon; @@ -240,7 +240,7 @@ $lang->kanban->importList['off'] = '不启用导入功能'; $lang->kanban->importObjectList = array(); $lang->kanban->importObjectList['plans'] = '计划'; $lang->kanban->importObjectList['releases'] = '发布'; -$lang->kanban->importObjectList['builds'] = '版本'; +$lang->kanban->importObjectList['builds'] = '构建'; $lang->kanban->importObjectList['executions'] = $lang->execution->common; if($this->config->edition != 'open') $lang->kanban->importObjectList['tickets'] = '工单'; $lang->kanban->importObjectList['cards'] = '其他看板卡片'; diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index eef89db6d7..cda14c6e70 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -62,7 +62,7 @@ $lang->product->bugs = '相关Bug'; $lang->product->projects = "关联{$lang->projectCommon}数"; $lang->product->executions = "关联{$lang->execution->common}数"; $lang->product->cases = '用例数'; -$lang->product->builds = '版本数'; +$lang->product->builds = '构建数'; $lang->product->roadmap = "{$lang->productCommon}路线图"; $lang->product->doc = '文档列表'; $lang->product->project = $lang->projectCommon . '列表'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index f61aadbc13..dca2c8ae7c 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -38,7 +38,7 @@ $lang->project->execution = '执行列表'; $lang->project->bug = 'Bug列表'; $lang->project->testcase = '用例列表'; $lang->project->testtask = '测试单'; -$lang->project->build = '版本'; +$lang->project->build = '构建'; $lang->project->updateOrder = '排序'; $lang->project->sort = "{$lang->projectCommon}排序"; $lang->project->whitelist = "{$lang->projectCommon}白名单"; @@ -241,7 +241,7 @@ $lang->project->createExecution = "该{$lang->projectCommon}下没有{$la $lang->project->unlinkExecutionMember = "该用户参与了%s%s%s个{$lang->execution->common},是否同时将其移除?(该用户所产生的数据不会受影响。)"; $lang->project->unlinkExecutionMembers = "移除的团队成员还参与了{$lang->projectCommon}下的执行,是否同步从执行团队中移除?"; $lang->project->productTip = "点击新建{$lang->productCommon}后,{$lang->projectCommon}将不会关联已选中的{$lang->productCommon}。"; -$lang->project->noDevStage = "该{$lang->projectCommon}下没有研发类型的阶段,或者您没有权限访问,暂时不支持创建版本。"; +$lang->project->noDevStage = "该{$lang->projectCommon}下没有研发类型的阶段,或者您没有权限访问,暂时不支持创建构建。"; $lang->project->budgetOverrun = "{$lang->projectCommon}的预算超出了项目集的剩余预算:%s。"; $lang->project->disabledInputTip = '请先取消%s'; $lang->project->linkRepoFailed = '关联代码库失败'; @@ -342,7 +342,7 @@ $lang->project->featureBar['bug']['unresolved'] = '未解决'; $app->loadLang('testcase'); $lang->project->featureBar['testcase'] = $lang->testcase->featureBar['browse']; -$lang->project->featureBar['build']['all'] = '全部版本'; +$lang->project->featureBar['build']['all'] = '全部构建'; $lang->project->featureBar['group']['all'] = '浏览分组'; diff --git a/module/projectbuild/lang/zh-cn.php b/module/projectbuild/lang/zh-cn.php index cd2077ca31..79b34eecfa 100644 --- a/module/projectbuild/lang/zh-cn.php +++ b/module/projectbuild/lang/zh-cn.php @@ -9,12 +9,12 @@ * @version $Id: zh-cn.php 4129 2020-11-27 01:58:14Z wwccss $ * @link https://www.zentao.net */ -$lang->projectbuild->common = $lang->projectCommon . '版本'; -$lang->projectbuild->browse = '版本列表'; -$lang->projectbuild->create = "创建版本"; -$lang->projectbuild->edit = "编辑版本"; -$lang->projectbuild->delete = "删除版本"; -$lang->projectbuild->view = "版本详情"; +$lang->projectbuild->common = $lang->projectCommon . '构建'; +$lang->projectbuild->browse = '构建列表'; +$lang->projectbuild->create = "创建构建"; +$lang->projectbuild->edit = "编辑构建"; +$lang->projectbuild->delete = "删除构建"; +$lang->projectbuild->view = "构建详情"; $lang->projectbuild->linkStory = "关联{$lang->SRCommon}"; $lang->projectbuild->linkBug = "关联Bug"; $lang->projectbuild->unlinkStory = "移除{$lang->SRCommon}"; diff --git a/module/release/lang/zh-cn.php b/module/release/lang/zh-cn.php index 71d73698b7..92677353be 100755 --- a/module/release/lang/zh-cn.php +++ b/module/release/lang/zh-cn.php @@ -25,10 +25,10 @@ $lang->release->batchUnlinkBug = '批量移除Bug'; $lang->release->manageSystem = '管理应用'; $lang->release->confirmDelete = '您确认删除该发布吗?'; -$lang->release->syncFromBuilds = "将版本中完成的{$lang->SRCommon}和已解决的Bug关联到发布下"; +$lang->release->syncFromBuilds = "将构建中完成的{$lang->SRCommon}和已解决的Bug关联到发布下"; $lang->release->confirmUnlinkStory = "您确认移除该{$lang->SRCommon}吗?"; $lang->release->confirmUnlinkBug = '您确认移除该Bug吗?'; -$lang->release->existBuild = '『版本』已经有『%s』这条记录了。您可以更改『发布名称』或者选择一个『版本』。'; +$lang->release->existBuild = '『构建』已经有『%s』这条记录了。您可以更改『发布名称』或者选择一个『构建』。'; $lang->release->noRelease = '暂时没有发布。'; $lang->release->errorDate = '发布日期不能大于今天。'; $lang->release->confirmActivate = '您确认激活该发布吗?'; @@ -41,7 +41,7 @@ $lang->release->id = 'ID'; $lang->release->product = "所属{$lang->productCommon}"; $lang->release->branch = '平台/分支'; $lang->release->project = '所属' . $lang->projectCommon; -$lang->release->build = '版本'; +$lang->release->build = '构建'; $lang->release->includedBuild = '包含构建'; $lang->release->includedSystem = '包含应用'; $lang->release->relatedProject = '对应' . $lang->projectCommon; diff --git a/module/report/lang/zh-cn.php b/module/report/lang/zh-cn.php index 4bad3fd6ca..1a21d140a5 100644 --- a/module/report/lang/zh-cn.php +++ b/module/report/lang/zh-cn.php @@ -159,7 +159,7 @@ $lang->report->annualData->objectTypeList['execution'] = $lang->executionCommo $lang->report->annualData->objectTypeList['task'] = '任务'; $lang->report->annualData->objectTypeList['repo'] = '代码'; $lang->report->annualData->objectTypeList['bug'] = 'Bug'; -$lang->report->annualData->objectTypeList['build'] = '版本'; +$lang->report->annualData->objectTypeList['build'] = '构建'; $lang->report->annualData->objectTypeList['testtask'] = '测试单'; $lang->report->annualData->objectTypeList['case'] = '用例'; $lang->report->annualData->objectTypeList['doc'] = '文档'; diff --git a/module/testreport/lang/zh-cn.php b/module/testreport/lang/zh-cn.php index 42e3f37893..d5173fa6cd 100644 --- a/module/testreport/lang/zh-cn.php +++ b/module/testreport/lang/zh-cn.php @@ -25,7 +25,7 @@ $lang->testreport->begin = '开始时间'; $lang->testreport->end = '结束时间'; $lang->testreport->stories = "测试的{$lang->SRCommon}"; $lang->testreport->bugs = '测试的Bug'; -$lang->testreport->builds = '版本信息'; +$lang->testreport->builds = '构建信息'; $lang->testreport->goal = $lang->projectCommon . '目标'; $lang->testreport->cases = '用例'; $lang->testreport->bugInfo = 'Bug分布'; @@ -73,21 +73,21 @@ $lang->testreport->bugStageList['resolved'] = '解决的Bug'; $lang->testreport->featureBar['browse']['all'] = '全部'; $lang->testreport->caseSummary = '共有%s个用例,共执行%s个用例,产生了%s个结果,失败的用例有%s个。'; -$lang->testreport->buildSummary = '共测试了%s个版本。'; +$lang->testreport->buildSummary = '共测试了%s个构建。'; $lang->testreport->confirmDelete = '是否删除该报告?'; $lang->testreport->moreNotice = "更多功能可以参考禅道扩展机制进行扩展,也可以联系我们进行定制。"; $lang->testreport->exportNotice = "由禅道项目管理软件导出"; $lang->testreport->noReport = "暂无报告,请选择测试单生成测试报告。"; -$lang->testreport->foundBugTip = "影响版本在测试轮次内,并且创建时间在测试时间范围内产生的Bug数。"; +$lang->testreport->foundBugTip = "影响构建在测试轮次内,并且创建时间在测试时间范围内产生的Bug数。"; $lang->testreport->legacyBugTip = "Bug状态是激活,或Bug的解决时间在测试结束时间之后。"; $lang->testreport->activatedBugTip = "在测试单时间范围内被激活的Bug数量。"; $lang->testreport->fromCaseBugTip = "测试时间范围内,用例执行失败后创建的Bug。"; -$lang->testreport->errorTrunk = "主干版本不能创建测试报告,请修改关联版本!"; +$lang->testreport->errorTrunk = "主干构建不能创建测试报告,请修改关联构建!"; $lang->testreport->noTestTask = "该{$lang->productCommon}下还没有关联的测试单,不能创建报告。请先创建测试单,再创建。"; $lang->testreport->noObjectID = "没有选定测试单或{$lang->executionCommon},无法创建测试报告!"; $lang->testreport->moreProduct = "只能对同一个{$lang->productCommon}生成测试报告。"; $lang->testreport->hiddenCase = "隐藏 %s 个用例"; -$lang->testreport->goalTip = "该版本所属{$lang->execution->common}的描述信息"; +$lang->testreport->goalTip = "该构建所属{$lang->execution->common}的描述信息"; $lang->testreport->bugSummary = <<%s
个Bug , diff --git a/module/testtask/lang/zh-cn.php b/module/testtask/lang/zh-cn.php index 909539f1d2..535584f0da 100644 --- a/module/testtask/lang/zh-cn.php +++ b/module/testtask/lang/zh-cn.php @@ -73,7 +73,7 @@ $lang->testtask->product = '所属' . $lang->productCommon; $lang->testtask->project = '所属' . $lang->projectCommon; $lang->testtask->execution = '所属' . $lang->execution->common; $lang->testtask->type = '测试类型'; -$lang->testtask->build = '提测版本'; +$lang->testtask->build = '提测构建'; $lang->testtask->owner = '负责人'; $lang->testtask->members = '参与人'; $lang->testtask->executor = '执行人'; @@ -150,7 +150,7 @@ $lang->testtask->pass = '通过'; $lang->testtask->fail = '失败'; $lang->testtask->showResult = '共执行次'; $lang->testtask->showFail = '失败次'; -$lang->testtask->runInTask = ' %s,提测版本为 %s '; +$lang->testtask->runInTask = ' %s,提测构建为 %s '; $lang->testtask->runCaseResult = ',由 %s 执行 %s,结果为 %s。'; $lang->testtask->confirmDelete = '您确认要删除该测试单吗?'; diff --git a/module/tutorial/lang/zh-cn.php b/module/tutorial/lang/zh-cn.php index 5a9ea1e2ad..52457bac91 100644 --- a/module/tutorial/lang/zh-cn.php +++ b/module/tutorial/lang/zh-cn.php @@ -1009,22 +1009,22 @@ $lang->tutorial->kanbanProjectManage->manageKanban->step23 = new stdClass(); $lang->tutorial->kanbanProjectManage->manageKanban->step23->name = '保存表单'; $lang->tutorial->kanbanProjectManage->manageBuild = new stdClass(); -$lang->tutorial->kanbanProjectManage->manageBuild->title = '版本管理'; +$lang->tutorial->kanbanProjectManage->manageBuild->title = '构建管理'; $lang->tutorial->kanbanProjectManage->manageBuild->step1 = new stdClass(); -$lang->tutorial->kanbanProjectManage->manageBuild->step1->name = '点击版本'; -$lang->tutorial->kanbanProjectManage->manageBuild->step1->desc = '可以在这里进行版本管理'; +$lang->tutorial->kanbanProjectManage->manageBuild->step1->name = '点击构建'; +$lang->tutorial->kanbanProjectManage->manageBuild->step1->desc = '可以在这里进行构建管理'; $lang->tutorial->kanbanProjectManage->manageBuild->step2 = new stdClass(); -$lang->tutorial->kanbanProjectManage->manageBuild->step2->name = '点击创建版本'; -$lang->tutorial->kanbanProjectManage->manageBuild->step2->desc = '可以在这里创建新的版本'; +$lang->tutorial->kanbanProjectManage->manageBuild->step2->name = '点击创建构建'; +$lang->tutorial->kanbanProjectManage->manageBuild->step2->desc = '可以在这里创建新的构建'; $lang->tutorial->kanbanProjectManage->manageBuild->step3 = new stdClass(); $lang->tutorial->kanbanProjectManage->manageBuild->step3->name = '填写表单'; $lang->tutorial->kanbanProjectManage->manageBuild->step4 = new stdClass(); $lang->tutorial->kanbanProjectManage->manageBuild->step4->name = '保存表单'; -$lang->tutorial->kanbanProjectManage->manageBuild->step4->desc = '保存后在版本列表中显示'; +$lang->tutorial->kanbanProjectManage->manageBuild->step4->desc = '保存后在构建列表中显示'; $lang->tutorial->kanbanProjectManage->manageBuild->step5 = new stdClass(); $lang->tutorial->kanbanProjectManage->manageBuild->step5->name = '点击累积流图'; @@ -1590,7 +1590,7 @@ $lang->tutorial->productManage->branchManage->step12->name = '选择分支'; $lang->tutorial->productManage->branchManage->step13 = new stdClass(); $lang->tutorial->productManage->branchManage->step13->name = '保存表单'; -$lang->tutorial->productManage->branchManage->step13->desc = '保存后分支下面对应的发布、计划、版本、模块、需求、Bug、用例都合并到新的分支下'; +$lang->tutorial->productManage->branchManage->step13->desc = '保存后分支下面对应的发布、计划、构建、模块、需求、Bug、用例都合并到新的分支下'; $lang->tutorial->productManage->branchManage->step14 = new stdClass(); $lang->tutorial->productManage->branchManage->step14->name = '点击研发需求'; diff --git a/module/weekly/lang/zh-cn.php b/module/weekly/lang/zh-cn.php index 8dcdc1d555..e89f74df4b 100644 --- a/module/weekly/lang/zh-cn.php +++ b/module/weekly/lang/zh-cn.php @@ -77,10 +77,10 @@ $lang->weekly->reportHelpNotice = <<1)累加本周结束日期之前所有消耗的工时

统计范围:

-1)所有消耗的工时包括任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审的耗时 +1)所有消耗的工时包括任务、需求、Bug、用例、构建、测试单、问题、风险、文档、评审的耗时
2)为避免重复计算,只包含子任务,不包括父任务 -
3)包括已删除的任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审的耗时 -
4)包括已删除执行中任务、需求、Bug、用例、版本、测试单、文档的耗时 +
3)包括已删除的任务、需求、Bug、用例、构建、测试单、问题、风险、文档、评审的耗时 +
4)包括已删除执行中任务、需求、Bug、用例、构建、测试单、文档的耗时
5)包括取消的任务、问题、风险的耗时

SV(%)进度偏差率

计算方式:SV(%) = -1 * (1 - (EV / PV))% @@ -133,10 +133,10 @@ $lang->weekly->blockHelpNotice = <<1)累加本周结束日期之前所有消耗的工时

统计范围:

-1)所有消耗的工时包括任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审的耗时 +1)所有消耗的工时包括任务、需求、Bug、用例、构建、测试单、问题、风险、文档、评审的耗时
2)为避免重复计算,只包含子任务,不包括父任务 -
3)包括已删除的任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审的耗时 -
4)包括已删除执行中任务、需求、Bug、用例、版本、测试单、文档的耗时 +
3)包括已删除的任务、需求、Bug、用例、构建、测试单、问题、风险、文档、评审的耗时 +
4)包括已删除执行中任务、需求、Bug、用例、构建、测试单、文档的耗时
5)包括取消的任务、问题、风险的耗时

SV(%)进度偏差率

From 8383ce9764584693202aafe4d0e3c46f86750dc3 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 10:08:17 +0800 Subject: [PATCH 040/431] * [misc] adjust jenkins url for compile. --- module/compile/tao.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/compile/tao.php b/module/compile/tao.php index a7b3308367..3e15e865e9 100644 --- a/module/compile/tao.php +++ b/module/compile/tao.php @@ -45,7 +45,7 @@ class compileTao extends compileModel $urlPrefix = sprintf('%s/job/%s/', $url, $pipeline); } - return $urlPrefix; + return rtrim($urlPrefix, '/') . '/'; } /** From 9ee9fb2e251b17f6ffac44362f1624dd9b7a61e9 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 13:08:03 +0800 Subject: [PATCH 041/431] * [task#132860,doing,0.1h] add language for release. --- module/release/lang/de.php | 1 + module/release/lang/en.php | 1 + module/release/lang/fr.php | 1 + module/release/lang/zh-cn.php | 1 + 4 files changed, 4 insertions(+) diff --git a/module/release/lang/de.php b/module/release/lang/de.php index a43f83578e..ad48df643b 100755 --- a/module/release/lang/de.php +++ b/module/release/lang/de.php @@ -23,6 +23,7 @@ $lang->release->batchUnlink = 'Mehrere entfernen'; $lang->release->batchUnlinkStory = 'Mehrere Storys entfernen'; $lang->release->batchUnlinkBug = 'Mehrere Bugs entfernen'; $lang->release->manageSystem = 'System verwalten'; +$lang->release->addSystem = 'System hinzufügen'; $lang->release->confirmDelete = 'Möchten Sie dieses Releas löschen?'; $lang->release->syncFromBuilds = 'Link the stories completed in the version and the bugs solved to the release'; diff --git a/module/release/lang/en.php b/module/release/lang/en.php index 76eda0c5cb..706be1bd7c 100755 --- a/module/release/lang/en.php +++ b/module/release/lang/en.php @@ -23,6 +23,7 @@ $lang->release->batchUnlink = 'Batch Unlink'; $lang->release->batchUnlinkStory = 'Batch Unlink Stories'; $lang->release->batchUnlinkBug = 'Batch Unlink Bugs'; $lang->release->manageSystem = 'Manage Applications'; +$lang->release->addSystem = 'Add Application'; $lang->release->confirmDelete = 'Do you want to delete this release?'; $lang->release->syncFromBuilds = 'Link the stories completed in the version and the bugs solved to the release'; diff --git a/module/release/lang/fr.php b/module/release/lang/fr.php index 0027fe069a..66bac66369 100755 --- a/module/release/lang/fr.php +++ b/module/release/lang/fr.php @@ -23,6 +23,7 @@ $lang->release->batchUnlink = 'Retirer par Lot'; $lang->release->batchUnlinkStory = 'Retirer Stories par Lot'; $lang->release->batchUnlinkBug = 'Retirer Bugs par Lot'; $lang->release->manageSystem = 'Gestion des Applications'; +$lang->release->addSystem = 'System hinzufügen'; $lang->release->confirmDelete = 'Voulez-vous réellement supprimer cette release ?'; $lang->release->syncFromBuilds = 'Link the stories completed in the version and the bugs solved to the release'; diff --git a/module/release/lang/zh-cn.php b/module/release/lang/zh-cn.php index 92677353be..8d38250213 100755 --- a/module/release/lang/zh-cn.php +++ b/module/release/lang/zh-cn.php @@ -23,6 +23,7 @@ $lang->release->batchUnlink = '批量移除'; $lang->release->batchUnlinkStory = "批量移除{$lang->SRCommon}"; $lang->release->batchUnlinkBug = '批量移除Bug'; $lang->release->manageSystem = '管理应用'; +$lang->release->addSystem = '新建应用'; $lang->release->confirmDelete = '您确认删除该发布吗?'; $lang->release->syncFromBuilds = "将构建中完成的{$lang->SRCommon}和已解决的Bug关联到发布下"; From 0d3c1281022393770a7b49beb6be48a3c3615727 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 13:08:44 +0800 Subject: [PATCH 042/431] + [task#132860,doing,0.4h] add block for release create. --- module/release/ui/create.html.php | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/module/release/ui/create.html.php b/module/release/ui/create.html.php index 21b8704945..de6f0f55cf 100644 --- a/module/release/ui/create.html.php +++ b/module/release/ui/create.html.php @@ -34,6 +34,40 @@ formPanel ( set::title($lang->release->create), on::change('[name=status]', 'changeStatus'), + on::change('[name=newSystem]', 'setSystemBox'), + formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->release->system), + set::required(true), + inputGroup + ( + div + ( + setClass('w-full'), + setId('systemBox'), + picker + ( + set::name('system'), + set::required(true), + set::items($apps) + ), + input(set::name('systemName'), setClass('hidden')) + ), + div + ( + setClass('input-group-addon flex'), + checkbox + ( + set::name('newSystem'), + set::text($lang->release->addSystem) + ) + ) + ) + ) + ), formRow ( formGroup From 2b9b7e43c2553913428db6662df2d51c9fd2da34 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 13:09:09 +0800 Subject: [PATCH 043/431] + [task#132860,doing,0.2h] add linkage for release create. --- module/release/js/create.ui.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/module/release/js/create.ui.js b/module/release/js/create.ui.js index a03a8e44d3..541be9ddc2 100644 --- a/module/release/js/create.ui.js +++ b/module/release/js/create.ui.js @@ -18,3 +18,19 @@ window.changeStatus = function(e) $('[data-name=date] .form-label').addClass('required'); } } + +window.setSystemBox = function(e) +{ + const newSystem = $(e.target).is(':checked') ? 1 : 0; + $('#systemBox #systemName').addClass('hidden'); + $('#systemBox .picker-box').addClass('hidden'); + if(newSystem == 1) + { + $('#systemBox #systemName').removeClass('hidden'); + } + else + { + $('#systemBox #systemName').val(''); + $('#systemBox .picker-box').removeClass('hidden'); + } +} From 1bafc4790a2b89f3b4e95ed14745698aea172afc Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 13:09:47 +0800 Subject: [PATCH 044/431] + [task#132860,doing,0.5h] add apps for release create page. --- module/projectrelease/zen.php | 1 + module/release/config/form.php | 3 ++- module/release/control.php | 1 + module/release/zen.php | 7 +++++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/module/projectrelease/zen.php b/module/projectrelease/zen.php index 984fdf00f9..14c93eab8c 100644 --- a/module/projectrelease/zen.php +++ b/module/projectrelease/zen.php @@ -27,6 +27,7 @@ class projectreleaseZen extends projectrelease $this->view->products = $this->products; $this->view->product = $product; + $this->view->apps = $this->loadModel('system')->getPairs($productID, '', 'active'); $this->view->branches = (isset($product->type) and $product->type == 'normal') ? array() : $this->loadModel('branch')->getPairs($productID, 'active', $projectID); $this->view->branch = $branch; $this->view->project = $this->project->getByID($projectID); diff --git a/module/release/config/form.php b/module/release/config/form.php index dd30bdf4b4..290b6af15b 100644 --- a/module/release/config/form.php +++ b/module/release/config/form.php @@ -3,7 +3,8 @@ global $app; $config->release->form = new stdclass(); -$config->release->form->create['name'] = array('type' => 'string', 'required' => true, 'default' => ''); +$config->release->form->create['system'] = array('type' => 'int', 'required' => false, 'default' => 0); +$config->release->form->create['name'] = array('type' => 'string', 'required' => true); $config->release->form->create['marker'] = array('type' => 'int', 'required' => false, 'default' => 0); $config->release->form->create['build'] = array('type' => 'array', 'required' => false, 'default' => '', 'filter' => 'join'); $config->release->form->create['stories'] = array('type' => 'array', 'required' => false, 'default' => '', 'filter' => 'join'); diff --git a/module/release/control.php b/module/release/control.php index c8012626e2..049453bea0 100755 --- a/module/release/control.php +++ b/module/release/control.php @@ -140,6 +140,7 @@ class release extends control $this->view->users = $this->loadModel('user')->getPairs('noclosed'); $this->view->lastRelease = $this->release->getLast($productID, (int)$branch); $this->view->status = $status; + $this->view->apps = $this->loadModel('system')->getPairs($productID, '', 'active'); $this->display(); } diff --git a/module/release/zen.php b/module/release/zen.php index 76f9d74763..d25525bc06 100644 --- a/module/release/zen.php +++ b/module/release/zen.php @@ -71,6 +71,7 @@ class releaseZen extends release { $productID = $this->post->product ? $this->post->product : $productID; $branch = $this->post->branch ? $this->post->branch : $branch; + $newSystem = $this->post->newSystem; if(empty($projectID)) { $product = $this->loadModel('product')->getById($productID); @@ -84,6 +85,12 @@ class releaseZen extends release ->fetch('id'); } } + if(!$newSystem && !$this->post->system) $this->config->release->form->create['system']['required'] = true; + if($newSystem && !$this->post->systemName) + { + $this->config->release->form->create['systemName'] = array('type' => 'string', 'required' => true); + $this->lang->release->systemName = $this->lang->release->system; + } $release = form::data() ->add('product', (int)$productID) From 88353ccb3fe30645ded8f1648e1fe8554027f93d Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 10:05:27 +0800 Subject: [PATCH 045/431] * [task#133002,doing,0.5h] add feature of switch version. --- module/pivot/control.php | 1 + module/pivot/js/versions.ui.js | 7 +++++++ module/pivot/ui/versions.html.php | 15 +++++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 module/pivot/js/versions.ui.js diff --git a/module/pivot/control.php b/module/pivot/control.php index 5469c3e4a2..62178aa6f4 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -85,6 +85,7 @@ class pivot extends control $this->view->versionSpecs = $this->pivot->getPivotVersions($pivotID); $this->view->version = $version == 'newest' ? $this->pivot->getMaxVersion($pivotID) : $version; $this->view->pivot = $pivot; + $this->view->groupID = $groupID; $this->display(); } diff --git a/module/pivot/js/versions.ui.js b/module/pivot/js/versions.ui.js new file mode 100644 index 0000000000..ea8a3a89fc --- /dev/null +++ b/module/pivot/js/versions.ui.js @@ -0,0 +1,7 @@ +function switchVersion(e) +{ + const groupID = $(e.target).attr('data-group'); + const pivotID = $(e.target).attr('data-pivot'); + const version = $(e.target).attr('data-version'); + loadModal($.createLink('pivot', 'versions', `groupID=${groupID}&pivotID=${pivotID}&version=${version}`)); +} diff --git a/module/pivot/ui/versions.html.php b/module/pivot/ui/versions.html.php index 7eff4cda23..f4516e6983 100644 --- a/module/pivot/ui/versions.html.php +++ b/module/pivot/ui/versions.html.php @@ -16,8 +16,19 @@ foreach($versionSpecs as $versionSpec) { $versionsTableBody[] = h::tr ( - h::td('#' . $versionSpec->version), - h::td($versionSpec->desc), + h::td + ( + h::a + ( + '#' . $versionSpec->version, + set::href("javascript:;"), + on::click("switchVersion"), + setData('pivot', $pivot->id), + setData('version', $versionSpec->version), + setData('group', $groupID) + ) + ), + h::td($versionSpec->desc) ); } From d4e9291f6f0a45a167890c4ee6423042b5ece919 Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 13:41:21 +0800 Subject: [PATCH 046/431] + [task#132561 doing 0.1h 7h] init the thinkappeals widget. --- lib/zin/wg/thinkappeals/v1.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 lib/zin/wg/thinkappeals/v1.php diff --git a/lib/zin/wg/thinkappeals/v1.php b/lib/zin/wg/thinkappeals/v1.php new file mode 100644 index 0000000000..697b5e99d0 --- /dev/null +++ b/lib/zin/wg/thinkappeals/v1.php @@ -0,0 +1,17 @@ + Date: Fri, 22 Nov 2024 13:42:15 +0800 Subject: [PATCH 047/431] + [task#132561 doing 0.2h 7h] add the getIndicator function for thinkappeals widget. --- lib/zin/wg/thinkappeals/v1.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/zin/wg/thinkappeals/v1.php b/lib/zin/wg/thinkappeals/v1.php index 697b5e99d0..444348310b 100644 --- a/lib/zin/wg/thinkappeals/v1.php +++ b/lib/zin/wg/thinkappeals/v1.php @@ -14,4 +14,18 @@ class thinkAppeals extends thinkModel { return file_get_contents(__DIR__ . DS . 'js' . DS . 'v1.js'); } + + protected function getIndicator(): array + { + global $app; + + $blocks = $this->prop('blocks'); + $indicator = array(); + + foreach($blocks['steps'] as $key => $step) + { + $indicator[] = array('name' => $step->title, 'color'=> '#64758B', 'axisLabel' => $key == 0 ? array('show' => true) : null); + } + return $indicator; + } } From 8a45fcd6311d13f83bcdef82c23971204332d5a7 Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 13:43:12 +0800 Subject: [PATCH 048/431] + [task#132561 doing 0.4h 7h] add the buildEcharts function for thinkappeals widget. --- lib/zin/wg/thinkappeals/v1.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lib/zin/wg/thinkappeals/v1.php b/lib/zin/wg/thinkappeals/v1.php index 444348310b..05b70b17f3 100644 --- a/lib/zin/wg/thinkappeals/v1.php +++ b/lib/zin/wg/thinkappeals/v1.php @@ -28,4 +28,24 @@ class thinkAppeals extends thinkModel } return $indicator; } + + protected function buildEcharts(): node + { + $blocks = $this->prop('blocks'); + return echarts + ( + set::width('100%'), + set::height('900px'), + set::color(array('#29AA93', '#FF9F46')), + set::legend(array(array( + 'data' => $blocks['legend'], + 'icon' => 'circle', + 'itemGap' => 90, + 'itemWidth' => 14, + 'itemHeight' => 14, + 'bottom' => 40, + 'textStyle' => array('color' => '#64758B', 'padding' => array(0, 0, 0, 16)) + ))), + ); + } } From 6282f59eb3b32154c23035a11b8cf53e7690429c Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 13:43:36 +0800 Subject: [PATCH 049/431] + [task#132561 doing 0.4h 7h] add the series data for thinkappeals widget. --- lib/zin/wg/thinkappeals/v1.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/zin/wg/thinkappeals/v1.php b/lib/zin/wg/thinkappeals/v1.php index 05b70b17f3..505af13613 100644 --- a/lib/zin/wg/thinkappeals/v1.php +++ b/lib/zin/wg/thinkappeals/v1.php @@ -46,6 +46,17 @@ class thinkAppeals extends thinkModel 'bottom' => 40, 'textStyle' => array('color' => '#64758B', 'padding' => array(0, 0, 0, 16)) ))), + set::radar(array('nameGap' => 32, 'indicator' => $this->getIndicator())), + set::series + ( + array( + array( + 'type' => 'radar', + 'data' => $blocks['seriesData'], + 'label' => array('normal' => array('show' => true, 'formatter' => jsRaw('formatSeriesLabel'))) + ) + ) + ) ); } } From fdc8c54a9533d32ab14792454d4e38ab9db69950 Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 13:43:55 +0800 Subject: [PATCH 050/431] + [task#132561 doing 0.4h 7h] add the buildBody function for thinkappeals widget. --- lib/zin/wg/thinkappeals/v1.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/zin/wg/thinkappeals/v1.php b/lib/zin/wg/thinkappeals/v1.php index 505af13613..9fbadb4077 100644 --- a/lib/zin/wg/thinkappeals/v1.php +++ b/lib/zin/wg/thinkappeals/v1.php @@ -59,4 +59,21 @@ class thinkAppeals extends thinkModel ) ); } + + protected function buildBody(): node + { + list($mode, $wizard) = $this->prop(array('mode', 'wizard')); + + if($mode == 'preview') + { + $count = $wizard->config['configureDimension']['count']; + return div + ( + setClass('flex justify-center'), + img(set::src("data/thinmory/wizardsetting/appeals/dimension$count.svg")), + ); + } + + return $this->buildEcharts(); + } } From ecd0f632275e9f291565aa7e63c745b07a72e29d Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 13:45:12 +0800 Subject: [PATCH 051/431] + [task#132561 doing 0.4h 7h] add the build function for thinkappeals widget. --- lib/zin/wg/thinkappeals/v1.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/zin/wg/thinkappeals/v1.php b/lib/zin/wg/thinkappeals/v1.php index 9fbadb4077..d8acf43e18 100644 --- a/lib/zin/wg/thinkappeals/v1.php +++ b/lib/zin/wg/thinkappeals/v1.php @@ -76,4 +76,9 @@ class thinkAppeals extends thinkModel return $this->buildEcharts(); } + + protected function build(): node + { + return div(setClass('model-appeals my-1 flex col flex-wrap justify-between'), $this->buildBody()); + } } From 74fb9efdf654e34a81121ba402246d2f27875b93 Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 13:45:36 +0800 Subject: [PATCH 052/431] + [task#132561 doing 0.2h 7h] add js file for thinkappeals widget. --- lib/zin/wg/thinkappeals/js/v1.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 lib/zin/wg/thinkappeals/js/v1.js diff --git a/lib/zin/wg/thinkappeals/js/v1.js b/lib/zin/wg/thinkappeals/js/v1.js new file mode 100644 index 0000000000..d813564562 --- /dev/null +++ b/lib/zin/wg/thinkappeals/js/v1.js @@ -0,0 +1,12 @@ +/** + * 格式化坐标标签数据。 + * Format coordinate label data. + * + * @param object params + * @access public + * @return array + */ +window.formatSeriesLabel = function(params) +{ + return params?.value?.toFixed(2); +} From da5c88cd6ac114019664774675629c67442bddbb Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 13:46:40 +0800 Subject: [PATCH 053/431] + [task#132561 doing 0.1h 7h] add a declaration about thinkappeals widget. --- lib/zin/func.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/zin/func.php b/lib/zin/func.php index ba81d4f5f7..d0d3bfa01f 100644 --- a/lib/zin/func.php +++ b/lib/zin/func.php @@ -223,6 +223,7 @@ function thinkPestel(): thinkPestel {return createWg('thinkPestel', func_get_arg function think4p(): think4p {return createWg('think4p', func_get_args());} function think3c(): think3c {return createWg('think3c', func_get_args());} function thinkAnsoff(): thinkAnsoff {return createWg('thinkAnsoff', func_get_args());} +function thinkAppeals(): thinkAppeals {return createWg('thinkAppeals', func_get_args());} function thinkVennLink(): thinkVennLink {return createWg('thinkVennLink', func_get_args());} function thinkStepQuote(): thinkStepQuote {return createWg('thinkStepQuote', func_get_args());} function sqlBuilderControl(): sqlBuilderControl {return createWg('sqlBuilderControl', func_get_args());} From eb699e369e0613dd5c81634d84f8d8aae7d3422e Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 13:47:14 +0800 Subject: [PATCH 054/431] + [task#132561 doing 0.1h 7h] add defineProps for the thinkmodel widget. --- lib/zin/wg/thinkmodel/v1.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/zin/wg/thinkmodel/v1.php b/lib/zin/wg/thinkmodel/v1.php index 3c59de8730..555c4bf0a7 100644 --- a/lib/zin/wg/thinkmodel/v1.php +++ b/lib/zin/wg/thinkmodel/v1.php @@ -5,8 +5,9 @@ namespace zin; class thinkModel extends wg { protected static array $defineProps = array( - 'mode?: string', // 模型展示模式。 preview 后台设计预览 | view 前台结果展示 - 'blocks: array' // 模型节点 + 'mode?: string', // 模型展示模式。 preview 后台设计预览 | view 前台结果展示 + 'blocks: array', // 模型节点 + 'wizard?: object' // 模型数据 ); protected function buildQuestionItem(object $step): wg|array From 75ecb24fc19beb876150f58dd9c7f3da80abf19b Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 13:47:50 +0800 Subject: [PATCH 055/431] + [task#132561 doing 0.1h 7h] add a call about thinkappeals widget. --- lib/zin/wg/thinkresult/v1.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/zin/wg/thinkresult/v1.php b/lib/zin/wg/thinkresult/v1.php index 5ac88b89c2..05f1cb9625 100644 --- a/lib/zin/wg/thinkresult/v1.php +++ b/lib/zin/wg/thinkresult/v1.php @@ -26,10 +26,10 @@ class thinkResult extends wg list($wizard, $mode, $blocks) = $this->prop(array('wizard', 'mode', 'blocks')); $model = $wizard->model; - $wgMap = array('swot' => 'thinkSwot', 'pffa' => 'thinkPffa', 'pest' => 'thinkPestel', 'pestel' => 'thinkPestel', '4p' => 'think4p', '4p2' => 'think4p', '3c' => 'think3c', 'ansoff' => 'thinkAnsoff'); + $wgMap = array('swot' => 'thinkSwot', 'pffa' => 'thinkPffa', 'pest' => 'thinkPestel', 'pestel' => 'thinkPestel', '4p' => 'think4p', '4p2' => 'think4p', '3c' => 'think3c', 'ansoff' => 'thinkAnsoff', 'appeals' => 'thinkAppeals'); if(!isset($wgMap[$model])) return array(); - return createWg($wgMap[$model], array(set::mode($mode), set::blocks($blocks))); + return createWg($wgMap[$model], array(set::mode($mode), set::blocks($blocks), set::wizard($wizard))); } protected function build(): node From 176fe4a373ac1e1833ad0f12e1a01bfb803ad467 Mon Sep 17 00:00:00 2001 From: daitingting Date: Fri, 22 Nov 2024 05:52:33 +0000 Subject: [PATCH 056/431] * [task#133009,done,1h] Set createdDate. --- module/bi/config/pivots.php | 545 +++++++++++++++++++----------------- module/bi/model.php | 50 ++-- 2 files changed, 309 insertions(+), 286 deletions(-) diff --git a/module/bi/config/pivots.php b/module/bi/config/pivots.php index c6dbe417ed..3f1930cc8c 100644 --- a/module/bi/config/pivots.php +++ b/module/bi/config/pivots.php @@ -3,14 +3,15 @@ $config->bi->builtin->pivots = array(); $config->bi->builtin->pivots[] = array ( - 'id' => 1000, - 'version' => '1', - 'name' => array('zh-cn' => '完成项目工期透视表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'code' => 'finishedProjectDuration', - 'dimension' => '2', - 'driver' => 'mysql', - 'group' => '86', - 'sql' => << 1000, + 'version' => '1', + 'name' => array('zh-cn' => '完成项目工期透视表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'code' => 'finishedProjectDuration', + 'dimension' => '2', + 'driver' => 'mysql', + 'group' => '86', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1001, - 'version' => '1', - 'name' => array('zh-cn' => '完成项目工时透视表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'code' => 'finishedProjectHour', - 'dimension' => '2', - 'driver' => 'mysql', - 'group' => '85', - 'sql' => << 1001, + 'version' => '1', + 'name' => array('zh-cn' => '完成项目工时透视表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'code' => 'finishedProjectHour', + 'dimension' => '2', + 'driver' => 'mysql', + 'group' => '85', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1002, - 'version' => '1', - 'name' => array('zh-cn' => '产品缺陷数据汇总表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'code' => 'productBugSummary', - 'dimension' => '3', - 'driver' => 'mysql', - 'group' => '100', - 'sql' => << 1002, + 'version' => '1', + 'name' => array('zh-cn' => '产品缺陷数据汇总表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'code' => 'productBugSummary', + 'dimension' => '3', + 'driver' => 'mysql', + 'group' => '100', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1003, - 'version' => '1', - 'name' => array('zh-cn' => '产品需求交付统计表', 'zh-tw' => '產品完成度統計表', 'en' => 'Product Progress', 'de' => 'Product Progress', 'fr' => 'Product Progress'), - 'code' => 'productProgress', - 'desc' => array('zh-cn' => '按照产品列出需求总数,交付的需求总数(状态是关闭且关闭原因为已完成,或者研发阶段是已发布的需求)。', 'zh-tw' => '按照產品列出需求總數,完成的總數(狀態是關閉,或者研發階段是發布),完成的百分比。', 'en' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'de' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'fr' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '59', - 'sql' => << 1003, + 'version' => '1', + 'name' => array('zh-cn' => '产品需求交付统计表', 'zh-tw' => '產品完成度統計表', 'en' => 'Product Progress', 'de' => 'Product Progress', 'fr' => 'Product Progress'), + 'code' => 'productProgress', + 'desc' => array('zh-cn' => '按照产品列出需求总数,交付的需求总数(状态是关闭且关闭原因为已完成,或者研发阶段是已发布的需求)。', 'zh-tw' => '按照產品列出需求總數,完成的總數(狀態是關閉,或者研發階段是發布),完成的百分比。', 'en' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'de' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'fr' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '59', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1004, - 'version' => '1', - 'name' => array('zh-cn' => '产品需求状态分布表', 'zh-tw' => '產品需求狀態分布表', 'en' => 'Story Status', 'de' => 'Story Status', 'fr' => 'Story Status'), - 'code' => 'productStoryStatus', - 'desc' => array('zh-cn' => '按照产品列出需求总数,状态的分布情况。', 'zh-tw' => '按照產品列出需求總數,狀態的分布情況。', 'en' => 'Total number and status distribution of stories.', 'de' => 'Total number and status distribution of stories.', 'fr' => 'Total number and status distribution of stories.'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '59', - 'sql' => << 1004, + 'version' => '1', + 'name' => array('zh-cn' => '产品需求状态分布表', 'zh-tw' => '產品需求狀態分布表', 'en' => 'Story Status', 'de' => 'Story Status', 'fr' => 'Story Status'), + 'code' => 'productStoryStatus', + 'desc' => array('zh-cn' => '按照产品列出需求总数,状态的分布情况。', 'zh-tw' => '按照產品列出需求總數,狀態的分布情況。', 'en' => 'Total number and status distribution of stories.', 'de' => 'Total number and status distribution of stories.', 'fr' => 'Total number and status distribution of stories.'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '59', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1005, - 'version' => '1', - 'name' => array('zh-cn' => '产品需求阶段分布表', 'zh-tw' => '產品需求階段分布表', 'en' => 'Story Stage', 'de' => 'Story Stage', 'fr' => 'Story Stage'), - 'code' => 'productStoryStage', - 'desc' => array('zh-cn' => '按照产品列出需求总数,研发阶段的分布情况。', 'zh-tw' => '按照產品列出需求總數,研發階段的分布情況。', 'en' => 'Total number and stage distribution of stories ', 'de' => 'Total number and stage distribution of stories ', 'fr' => 'Total number and stage distribution of stories '), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '59', - 'sql' => << 1005, + 'version' => '1', + 'name' => array('zh-cn' => '产品需求阶段分布表', 'zh-tw' => '產品需求階段分布表', 'en' => 'Story Stage', 'de' => 'Story Stage', 'fr' => 'Story Stage'), + 'code' => 'productStoryStage', + 'desc' => array('zh-cn' => '按照产品列出需求总数,研发阶段的分布情况。', 'zh-tw' => '按照產品列出需求總數,研發階段的分布情況。', 'en' => 'Total number and stage distribution of stories ', 'de' => 'Total number and stage distribution of stories ', 'fr' => 'Total number and stage distribution of stories '), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '59', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1006, - 'version' => '1', - 'name' => array('zh-cn' => '产品发布数量统计表', 'zh-tw' => '產品發布數量統計表', 'en' => 'Product Release', 'de' => 'Product Release', 'fr' => 'Product Release'), - 'code' => 'productRelease', - 'desc' => array('zh-cn' => '按照产品列出发布的数量。', 'zh-tw' => '按照產品列出發布的數量。', 'en' => 'Product Release.', 'de' => 'Product Release.', 'fr' => 'Product Release.'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '59', - 'sql' => << 1006, + 'version' => '1', + 'name' => array('zh-cn' => '产品发布数量统计表', 'zh-tw' => '產品發布數量統計表', 'en' => 'Product Release', 'de' => 'Product Release', 'fr' => 'Product Release'), + 'code' => 'productRelease', + 'desc' => array('zh-cn' => '按照产品列出发布的数量。', 'zh-tw' => '按照產品列出發布的數量。', 'en' => 'Product Release.', 'de' => 'Product Release.', 'fr' => 'Product Release.'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '59', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1007, - 'version' => '1', - 'name' => array('zh-cn' => '任务状态统计表', 'zh-tw' => '任務狀態統計表', 'en' => 'Task Status Report', 'de' => 'Task Status Report', 'fr' => 'Task Status Report', 'vi' => 'Task Status Report', 'ja' => 'Task Status Report'), - 'code' => 'taskStatus', - 'desc' => array('zh-cn' => '按照执行统计任务的状态分布情况。', 'zh-tw' => '按照執行統計任務的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60', - 'sql' => << 1007, + 'version' => '1', + 'name' => array('zh-cn' => '任务状态统计表', 'zh-tw' => '任務狀態統計表', 'en' => 'Task Status Report', 'de' => 'Task Status Report', 'fr' => 'Task Status Report', 'vi' => 'Task Status Report', 'ja' => 'Task Status Report'), + 'code' => 'taskStatus', + 'desc' => array('zh-cn' => '按照执行统计任务的状态分布情况。', 'zh-tw' => '按照執行統計任務的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1008, - 'version' => '1', - 'name' => array('zh-cn' => '任务类型统计表', 'zh-tw' => '任務類型統計表', 'en' => 'Task Type Report', 'de' => 'Task Type Report', 'fr' => 'Task Type Report', 'vi' => 'Task Type Report', 'ja' => 'Task Type Report'), - 'code' => 'taskType', - 'desc' => array('zh-cn' => '按照项目统计任务的类型分布情况。', 'zh-tw' => '按照項目統計任務的類型分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60', - 'sql' => << 1008, + 'version' => '1', + 'name' => array('zh-cn' => '任务类型统计表', 'zh-tw' => '任務類型統計表', 'en' => 'Task Type Report', 'de' => 'Task Type Report', 'fr' => 'Task Type Report', 'vi' => 'Task Type Report', 'ja' => 'Task Type Report'), + 'code' => 'taskType', + 'desc' => array('zh-cn' => '按照项目统计任务的类型分布情况。', 'zh-tw' => '按照項目統計任務的類型分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1009, - 'version' => '1', - 'name' => array('zh-cn' => '项目任务指派统计表', 'zh-tw' => '項目任務指派統計表', 'en' => 'Task Assign Report', 'de' => 'Task Assign Report', 'fr' => 'Task Assign Report', 'vi' => 'Task Assign Report', 'ja' => 'Task Assign Report'), - 'code' => 'projectTaskAssign', - 'desc' => array('zh-cn' => '按照项目统计任务的指派给分布情况。', 'zh-tw' => '按照項目統計任務的指派給分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60', - 'sql' => << 1009, + 'version' => '1', + 'name' => array('zh-cn' => '项目任务指派统计表', 'zh-tw' => '項目任務指派統計表', 'en' => 'Task Assign Report', 'de' => 'Task Assign Report', 'fr' => 'Task Assign Report', 'vi' => 'Task Assign Report', 'ja' => 'Task Assign Report'), + 'code' => 'projectTaskAssign', + 'desc' => array('zh-cn' => '按照项目统计任务的指派给分布情况。', 'zh-tw' => '按照項目統計任務的指派給分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1010, - 'version' => '1', - 'name' => array('zh-cn' => '项目任务完成者统计表', 'zh-tw' => '項目任務完成者統計表', 'en' => 'Task Finish Report', 'de' => 'Task Finish Report', 'fr' => 'Task Finish Report', 'vi' => 'Task Finish Report', 'ja' => 'Task Finish Report'), - 'code' => 'projectTaskFinished', - 'desc' => array('zh-cn' => '按照项目统计任务的完成者分布情况。', 'zh-tw' => '按照項目統計任務的完成者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60', - 'sql' => << 1010, + 'version' => '1', + 'name' => array('zh-cn' => '项目任务完成者统计表', 'zh-tw' => '項目任務完成者統計表', 'en' => 'Task Finish Report', 'de' => 'Task Finish Report', 'fr' => 'Task Finish Report', 'vi' => 'Task Finish Report', 'ja' => 'Task Finish Report'), + 'code' => 'projectTaskFinished', + 'desc' => array('zh-cn' => '按照项目统计任务的完成者分布情况。', 'zh-tw' => '按照項目統計任務的完成者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1011, - 'version' => '1', - 'name' => array('zh-cn' => '项目投入统计表', 'zh-tw' => '項目投入統計表', 'en' => 'Project Invest Report', 'de' => 'Project Invest Report', 'fr' => 'Project Invest Report', 'vi' => 'Project Invest Report', 'ja' => 'Project Invest Report'), - 'code' => 'projectInvested', - 'desc' => array('zh-cn' => '按照项目列出:任务数,需求数,人数,总消耗工时。', 'zh-tw' => '按照項目列出:任務數,需求數,人數,總消耗工時。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60', - 'sql' => << 1011, + 'version' => '1', + 'name' => array('zh-cn' => '项目投入统计表', 'zh-tw' => '項目投入統計表', 'en' => 'Project Invest Report', 'de' => 'Project Invest Report', 'fr' => 'Project Invest Report', 'vi' => 'Project Invest Report', 'ja' => 'Project Invest Report'), + 'code' => 'projectInvested', + 'desc' => array('zh-cn' => '按照项目列出:任务数,需求数,人数,总消耗工时。', 'zh-tw' => '按照項目列出:任務數,需求數,人數,總消耗工時。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1012, - 'version' => '1', - 'name' => array('zh-cn' => '项目需求状态分布表', 'zh-tw' => '項目需求狀態分布表', 'en' => 'Project Story Status', 'de' => 'Project Story Status', 'fr' => 'Project Story Status', 'vi' => 'Project Story Status', 'ja' => 'Project Story Status'), - 'code' => 'projectStoryStatus', - 'desc' => array('zh-cn' => '按照项目统计需求的状态分布情况。', 'zh-tw' => '按照項目統計需求的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60', - 'sql' => << 1012, + 'version' => '1', + 'name' => array('zh-cn' => '项目需求状态分布表', 'zh-tw' => '項目需求狀態分布表', 'en' => 'Project Story Status', 'de' => 'Project Story Status', 'fr' => 'Project Story Status', 'vi' => 'Project Story Status', 'ja' => 'Project Story Status'), + 'code' => 'projectStoryStatus', + 'desc' => array('zh-cn' => '按照项目统计需求的状态分布情况。', 'zh-tw' => '按照項目統計需求的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1013, - 'version' => '1', - 'name' => array('zh-cn' => '项目需求阶段分布表', 'zh-tw' => '項目需求階段分布表', 'en' => 'Project Stage Report', 'de' => 'Project Stage Report', 'fr' => 'Project Stage Report', 'vi' => 'Project Stage Report', 'ja' => 'Project Stage Report'), - 'code' => 'projectStoryStage', - 'desc' => array('zh-cn' => '按照项目统计需求阶段分布情况。', 'zh-tw' => '按照項目統計需求階段分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60', - 'sql' => << 1013, + 'version' => '1', + 'name' => array('zh-cn' => '项目需求阶段分布表', 'zh-tw' => '項目需求階段分布表', 'en' => 'Project Stage Report', 'de' => 'Project Stage Report', 'fr' => 'Project Stage Report', 'vi' => 'Project Stage Report', 'ja' => 'Project Stage Report'), + 'code' => 'projectStoryStage', + 'desc' => array('zh-cn' => '按照项目统计需求阶段分布情况。', 'zh-tw' => '按照項目統計需求階段分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1014, - 'version' => '1', - 'name' => array('zh-cn' => '项目Bug解决方案分布表', 'zh-tw' => '項目Bug解決方案分布表', 'en' => 'Project Bug Resolution', 'de' => 'Project Bug Resolution', 'fr' => 'Project Bug Resolution', 'vi' => 'Project Bug Resolution', 'ja' => 'Project Bug Resolution'), - 'code' => 'projectBugResolution', - 'desc' => array('zh-cn' => '按照项目统计Bug的解决方案分布情况。', 'zh-tw' => '按照項目統計Bug的解決方案分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60,61', - 'sql' => << 1014, + 'version' => '1', + 'name' => array('zh-cn' => '项目Bug解决方案分布表', 'zh-tw' => '項目Bug解決方案分布表', 'en' => 'Project Bug Resolution', 'de' => 'Project Bug Resolution', 'fr' => 'Project Bug Resolution', 'vi' => 'Project Bug Resolution', 'ja' => 'Project Bug Resolution'), + 'code' => 'projectBugResolution', + 'desc' => array('zh-cn' => '按照项目统计Bug的解决方案分布情况。', 'zh-tw' => '按照項目統計Bug的解決方案分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60,61', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1015, - 'version' => '1', - 'name' => array('zh-cn' => '项目Bug状态分布表', 'zh-tw' => '項目Bug狀態分布表', 'en' => 'Project Bug Status', 'de' => 'Project Bug Status', 'fr' => 'Project Bug Status', 'vi' => 'Project Bug Status', 'ja' => 'Project Bug Status'), - 'code' => 'projectBugStatus', - 'desc' => array('zh-cn' => '按照项目统计Bug的状态分布情况。', 'zh-tw' => '按照項目統計Bug的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60,61', - 'sql' => << 1015, + 'version' => '1', + 'name' => array('zh-cn' => '项目Bug状态分布表', 'zh-tw' => '項目Bug狀態分布表', 'en' => 'Project Bug Status', 'de' => 'Project Bug Status', 'fr' => 'Project Bug Status', 'vi' => 'Project Bug Status', 'ja' => 'Project Bug Status'), + 'code' => 'projectBugStatus', + 'desc' => array('zh-cn' => '按照项目统计Bug的状态分布情况。', 'zh-tw' => '按照項目統計Bug的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60,61', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1016, - 'version' => '1', - 'name' => array('zh-cn' => '项目Bug创建者分布表', 'zh-tw' => '項目Bug創建者分布表', 'en' => 'Project Bug Opened', 'de' => 'Project Bug Opened', 'fr' => 'Project Bug Opened', 'vi' => 'Project Bug Opened', 'ja' => 'Project Bug Opened'), - 'code' => 'projectBugOpenedBy', - 'desc' => array('zh-cn' => '按照项目统计Bug的创建者分布情况。', 'zh-tw' => '按照項目統計Bug的創建者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60,61', - 'sql' => << 1016, + 'version' => '1', + 'name' => array('zh-cn' => '项目Bug创建者分布表', 'zh-tw' => '項目Bug創建者分布表', 'en' => 'Project Bug Opened', 'de' => 'Project Bug Opened', 'fr' => 'Project Bug Opened', 'vi' => 'Project Bug Opened', 'ja' => 'Project Bug Opened'), + 'code' => 'projectBugOpenedBy', + 'desc' => array('zh-cn' => '按照项目统计Bug的创建者分布情况。', 'zh-tw' => '按照項目統計Bug的創建者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60,61', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1017, - 'version' => '1', - 'name' => array('zh-cn' => '项目Bug解决者分布表', 'zh-tw' => '項目Bug解決者分布表', 'en' => 'Project Bug Resolve', 'de' => 'Project Bug Resolve', 'fr' => 'Project Bug Resolve', 'vi' => 'Project Bug Resolve', 'ja' => 'Project Bug Resolve'), - 'code' => 'projectBugResolvedBy', - 'desc' => array('zh-cn' => '按照项目统计Bug的解决者分布情况。', 'zh-tw' => '按照項目統計Bug的解決者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60,61', - 'sql' => << 1017, + 'version' => '1', + 'name' => array('zh-cn' => '项目Bug解决者分布表', 'zh-tw' => '項目Bug解決者分布表', 'en' => 'Project Bug Resolve', 'de' => 'Project Bug Resolve', 'fr' => 'Project Bug Resolve', 'vi' => 'Project Bug Resolve', 'ja' => 'Project Bug Resolve'), + 'code' => 'projectBugResolvedBy', + 'desc' => array('zh-cn' => '按照项目统计Bug的解决者分布情况。', 'zh-tw' => '按照項目統計Bug的解決者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60,61', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1018, - 'version' => '1', - 'name' => array('zh-cn' => '项目Bug指派给分布表', 'zh-tw' => '項目Bug指派給分布表', 'en' => 'Project Bug Assign', 'de' => 'Project Bug Assign', 'fr' => 'Project Bug Assign', 'vi' => 'Project Bug Assign', 'ja' => 'Project Bug Assign'), - 'code' => 'projectBugAssignedBy', - 'desc' => array('zh-cn' => '按照项目统计Bug的指派给分布情况。', 'zh-tw' => '按照項目統計Bug的指派給分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60,61', - 'sql' => << 1018, + 'version' => '1', + 'name' => array('zh-cn' => '项目Bug指派给分布表', 'zh-tw' => '項目Bug指派給分布表', 'en' => 'Project Bug Assign', 'de' => 'Project Bug Assign', 'fr' => 'Project Bug Assign', 'vi' => 'Project Bug Assign', 'ja' => 'Project Bug Assign'), + 'code' => 'projectBugAssignedBy', + 'desc' => array('zh-cn' => '按照项目统计Bug的指派给分布情况。', 'zh-tw' => '按照項目統計Bug的指派給分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60,61', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1019, - 'version' => '1', - 'name' => array('zh-cn' => '项目质量表', 'zh-tw' => '項目質量表', 'en' => 'Project Quality Report', 'de' => 'Project Quality Report', 'fr' => 'Project Quality Report', 'vi' => 'Project Quality Report', 'ja' => 'Project Quality Report'), - 'code' => 'projectQuality', - 'desc' => array('zh-cn' => '列出项目的需求总数,完成需求数,任务总数,完成的任务数,Bug数,解决的Bug数,Bug/需求,Bug/任务,重要Bug数量(严重程度不大于3)。', 'zh-tw' => '列出項目的需求總數,完成需求數,任務總數,完成的任務數,Bug數,解決的Bug數,Bug/需求,Bug/任務,重要Bug數量(嚴重程度不大於3)。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60', - 'sql' => << 1019, + 'version' => '1', + 'name' => array('zh-cn' => '项目质量表', 'zh-tw' => '項目質量表', 'en' => 'Project Quality Report', 'de' => 'Project Quality Report', 'fr' => 'Project Quality Report', 'vi' => 'Project Quality Report', 'ja' => 'Project Quality Report'), + 'code' => 'projectQuality', + 'desc' => array('zh-cn' => '列出项目的需求总数,完成需求数,任务总数,完成的任务数,Bug数,解决的Bug数,Bug/需求,Bug/任务,重要Bug数量(严重程度不大于3)。', 'zh-tw' => '列出項目的需求總數,完成需求數,任務總數,完成的任務數,Bug數,解決的Bug數,Bug/需求,Bug/任務,重要Bug數量(嚴重程度不大於3)。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1020, - 'version' => '1', - 'name' => array('zh-cn' => '产品Bug类型统计表', 'zh-tw' => '產品Bug類型統計表', 'en' => 'Bug Type of Product', 'de' => 'Bug Type of Product', 'fr' => 'Bug Type of Product'), - 'code' => 'productBugType', - 'desc' => array('zh-cn' => '按照产品统计Bug的类型分布情况。', 'zh-tw' => '按照產品統計Bug的類型分布情況。', 'en' => 'Type distribution of Bugs.', 'de' => 'Type distribution of Bugs.', 'fr' => 'Type distribution of Bugs.'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '59,61', - 'sql' => << 1020, + 'version' => '1', + 'name' => array('zh-cn' => '产品Bug类型统计表', 'zh-tw' => '產品Bug類型統計表', 'en' => 'Bug Type of Product', 'de' => 'Bug Type of Product', 'fr' => 'Bug Type of Product'), + 'code' => 'productBugType', + 'desc' => array('zh-cn' => '按照产品统计Bug的类型分布情况。', 'zh-tw' => '按照產品統計Bug的類型分布情況。', 'en' => 'Type distribution of Bugs.', 'de' => 'Type distribution of Bugs.', 'fr' => 'Type distribution of Bugs.'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '59,61', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1021, - 'version' => '1', - 'name' => array('zh-cn' => '产品质量表', 'zh-tw' => '產品質量表', 'en' => 'Product Quality', 'de' => 'Product Quality', 'fr' => 'Product Quality'), - 'code' => 'productQuality', - 'desc' => array('zh-cn' => '列出产品的需求数,完成的需求总数,Bug数,解决的Bug总数,Bug/需求,重要Bug数量(严重程度小于3)。', 'zh-tw' => '列出產品的需求數,完成的需求總數,Bug數,解決的Bug總數,Bug/需求,重要Bug數量(嚴重程度小於3)。', 'en' => 'Serious Bug (severity is less than 3).', 'de' => 'Serious Bug (severity is less than 3).', 'fr' => 'Serious Bug (severity is less than 3).'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '59', - 'sql' => << 1021, + 'version' => '1', + 'name' => array('zh-cn' => '产品质量表', 'zh-tw' => '產品質量表', 'en' => 'Product Quality', 'de' => 'Product Quality', 'fr' => 'Product Quality'), + 'code' => 'productQuality', + 'desc' => array('zh-cn' => '列出产品的需求数,完成的需求总数,Bug数,解决的Bug总数,Bug/需求,重要Bug数量(严重程度小于3)。', 'zh-tw' => '列出產品的需求數,完成的需求總數,Bug數,解決的Bug總數,Bug/需求,重要Bug數量(嚴重程度小於3)。', 'en' => 'Serious Bug (severity is less than 3).', 'de' => 'Serious Bug (severity is less than 3).', 'fr' => 'Serious Bug (severity is less than 3).'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '59', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1022, - 'version' => '1', - 'name' => array('zh-cn' => '员工登录次数统计表', 'zh-tw' => '員工登錄次數統計表', 'en' => 'Login Times', 'de' => 'Login Times', 'fr' => 'Login Times'), - 'code' => 'loginTimes', - 'desc' => array('zh-cn' => '实现员工登录次数统计报表,按照天统计每天每个人的登录次数,以及总数。', 'zh-tw' => '實現員工登錄次數統計報表,按照天統計每天每個人的登錄次數,以及總數。', 'en' => 'The summary of user login times.', 'de' => 'The summary of user login times.', 'fr' => 'The summary of user login times.'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '62', - 'sql' => << 1022, + 'version' => '1', + 'name' => array('zh-cn' => '员工登录次数统计表', 'zh-tw' => '員工登錄次數統計表', 'en' => 'Login Times', 'de' => 'Login Times', 'fr' => 'Login Times'), + 'code' => 'loginTimes', + 'desc' => array('zh-cn' => '实现员工登录次数统计报表,按照天统计每天每个人的登录次数,以及总数。', 'zh-tw' => '實現員工登錄次數統計報表,按照天統計每天每個人的登錄次數,以及總數。', 'en' => 'The summary of user login times.', 'de' => 'The summary of user login times.', 'fr' => 'The summary of user login times.'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '62', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1023, - 'version' => '1', - 'name' => array('zh-cn' => '日志汇总表', 'zh-tw' => '日誌匯總表', 'en' => 'Effort Summary', 'de' => 'Effort Summary', 'fr' => 'Effort Summary'), - 'code' => 'effortSummary', - 'desc' => array('zh-cn' => '查看某个时间段内的日志情况,可以按照部门选择。', 'zh-tw' => '查看某個時間段內的日誌情況,可以按照部門選擇。', 'en' => 'Effort summary of users within a certain period of time, you can select by department.', 'de' => 'Effort summary of users within a certain period of time, you can select by department.', 'fr' => 'Effort summary of users within a certain period of time, you can select by department.'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '62', - 'sql' => << 1023, + 'version' => '1', + 'name' => array('zh-cn' => '日志汇总表', 'zh-tw' => '日誌匯總表', 'en' => 'Effort Summary', 'de' => 'Effort Summary', 'fr' => 'Effort Summary'), + 'code' => 'effortSummary', + 'desc' => array('zh-cn' => '查看某个时间段内的日志情况,可以按照部门选择。', 'zh-tw' => '查看某個時間段內的日誌情況,可以按照部門選擇。', 'en' => 'Effort summary of users within a certain period of time, you can select by department.', 'de' => 'Effort summary of users within a certain period of time, you can select by department.', 'fr' => 'Effort summary of users within a certain period of time, you can select by department.'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '62', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1024, - 'version' => '1', - 'name' => array('zh-cn' => '公司动态汇总表', 'zh-tw' => '公司動態匯總表', 'en' => 'Company Dynamics', 'de' => 'Company Dynamics', 'fr' => 'Company Dynamics'), - 'code' => 'companyDynamics', - 'desc' => array('zh-cn' => '可以指定一个时期,列出相应的数据:1. 每天的登录次数。2. 每天的日志工时量。3. 每天新增的需求数。4. 每天关闭的需求数。5. 每天新增的任务数。6. 每天完成的任务数。7. 每天新增的Bug数。8. 每天解决的Bug数。9. 每天的动态数。', 'zh-tw' => '可以指定一個時期,列出相應的數據:1. 每天的登錄次數。2. 每天的日誌工時量。3. 每天新增的需求數。4. 每天關閉的需求數。5. 每天新增的任務數。6. 每天完成的任務數。7. 每天新增的Bug數。8. 每天解決的Bug數。9. 每天的動態數。', 'en' => 'The summary of company dynamics', 'de' => 'The summary of company dynamics', 'fr' => 'The summary of company dynamics'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '62', - 'sql' => << 1024, + 'version' => '1', + 'name' => array('zh-cn' => '公司动态汇总表', 'zh-tw' => '公司動態匯總表', 'en' => 'Company Dynamics', 'de' => 'Company Dynamics', 'fr' => 'Company Dynamics'), + 'code' => 'companyDynamics', + 'desc' => array('zh-cn' => '可以指定一个时期,列出相应的数据:1. 每天的登录次数。2. 每天的日志工时量。3. 每天新增的需求数。4. 每天关闭的需求数。5. 每天新增的任务数。6. 每天完成的任务数。7. 每天新增的Bug数。8. 每天解决的Bug数。9. 每天的动态数。', 'zh-tw' => '可以指定一個時期,列出相應的數據:1. 每天的登錄次數。2. 每天的日誌工時量。3. 每天新增的需求數。4. 每天關閉的需求數。5. 每天新增的任務數。6. 每天完成的任務數。7. 每天新增的Bug數。8. 每天解決的Bug數。9. 每天的動態數。', 'en' => 'The summary of company dynamics', 'de' => 'The summary of company dynamics', 'fr' => 'The summary of company dynamics'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '62', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1025, - 'version' => '1', - 'name' => array('zh-cn' => 'Bug解决表', 'zh-tw' => 'Bug解決表', 'en' => 'Solved Bugs', 'de' => 'Solved Bugs', 'fr' => 'Solved Bugs'), - 'code' => 'slovedBugs', - 'desc' => array('zh-cn' => '列出解决的Bug总数,解决方案的分布,占的比例(该用户解决的Bug的数量占所有的解决的Bug的数量)。', 'zh-tw' => '列出解決的Bug總數,解決方案的分布,占的比例(該用戶解決的Bug的數量占所有的解決的Bug的數量)。', 'en' => 'percentage:self resolved / all resolved', 'de' => 'percentage:self resolved / all resolved', 'fr' => 'percentage:self resolved / all resolved'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '61', - 'sql' => << 1025, + 'version' => '1', + 'name' => array('zh-cn' => 'Bug解决表', 'zh-tw' => 'Bug解決表', 'en' => 'Solved Bugs', 'de' => 'Solved Bugs', 'fr' => 'Solved Bugs'), + 'code' => 'slovedBugs', + 'desc' => array('zh-cn' => '列出解决的Bug总数,解决方案的分布,占的比例(该用户解决的Bug的数量占所有的解决的Bug的数量)。', 'zh-tw' => '列出解決的Bug總數,解決方案的分布,占的比例(該用戶解決的Bug的數量占所有的解決的Bug的數量)。', 'en' => 'percentage:self resolved / all resolved', 'de' => 'percentage:self resolved / all resolved', 'fr' => 'percentage:self resolved / all resolved'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '61', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1026, - 'version' => '1', - 'name' => array('zh-cn' => '项目进展表', 'zh-tw' => '項目進展表', 'en' => 'Project Progress Report', 'de' => 'Project Progress Report', 'fr' => 'Project Progress Report', 'vi' => 'Project Progress Report', 'ja' => 'Project Progress Report'), - 'code' => 'projectProgress', - 'desc' => array('zh-cn' => '项目的:需求数,剩余需求数(过滤状态为已关闭的需求),任务数,剩余任务数(过滤状态为已完成和已关闭的任务),剩余工时(剩余任务的剩余工时),已消耗工时。', 'zh-tw' => '項目的需求數,任務數,已消耗工時,剩餘工時,剩餘需求數,剩餘任務數,進度。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60', - 'sql' => << 1026, + 'version' => '1', + 'name' => array('zh-cn' => '项目进展表', 'zh-tw' => '項目進展表', 'en' => 'Project Progress Report', 'de' => 'Project Progress Report', 'fr' => 'Project Progress Report', 'vi' => 'Project Progress Report', 'ja' => 'Project Progress Report'), + 'code' => 'projectProgress', + 'desc' => array('zh-cn' => '项目的:需求数,剩余需求数(过滤状态为已关闭的需求),任务数,剩余任务数(过滤状态为已完成和已关闭的任务),剩余工时(剩余任务的剩余工时),已消耗工时。', 'zh-tw' => '項目的需求數,任務數,已消耗工時,剩餘工時,剩餘需求數,剩餘任務數,進度。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1027, - 'version' => '1', - 'name' => array('zh-cn' => '项目执行Bug类型统计表', 'zh-tw' => '項目Bug類型統計表', 'en' => 'Project Bug Type', 'de' => 'Project Bug Type', 'fr' => 'Project Bug Type'), - 'code' => 'projectBugType', - 'desc' => array('zh-cn' => '按照项目下不同执行统计Bug的类型分布情况。', 'zh-tw' => '按照項目統計Bug的類型分布情況。'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '60,61', - 'sql' => << 1027, + 'version' => '1', + 'name' => array('zh-cn' => '项目执行Bug类型统计表', 'zh-tw' => '項目Bug類型統計表', 'en' => 'Project Bug Type', 'de' => 'Project Bug Type', 'fr' => 'Project Bug Type'), + 'code' => 'projectBugType', + 'desc' => array('zh-cn' => '按照项目下不同执行统计Bug的类型分布情况。', 'zh-tw' => '按照項目統計Bug的類型分布情況。'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '60,61', + 'createdDate' => '2009-03-14', + 'sql' => <<bi->builtin->pivots[] = array ( - 'id' => 1028, - 'version' => '1', - 'name' => array('zh-cn' => '产品Bug解决方案统计表', 'zh-tw' => '産品Bug解決方案統計表', 'en' => 'Bug Solution of Product'), - 'code' => 'productBugSolution', - 'desc' => array('zh-cn' => '按照产品统计Bug的解决方案分布情况。', 'zh-tw' => '按照産品統計Bug的解決方案分布情況。', 'en' => 'Solution distribution of bugs.'), - 'dimension' => '1', - 'driver' => 'mysql', - 'group' => '59,61', - 'sql' => << 1028, + 'version' => '1', + 'name' => array('zh-cn' => '产品Bug解决方案统计表', 'zh-tw' => '産品Bug解決方案統計表', 'en' => 'Bug Solution of Product'), + 'code' => 'productBugSolution', + 'desc' => array('zh-cn' => '按照产品统计Bug的解决方案分布情况。', 'zh-tw' => '按照産品統計Bug的解決方案分布情況。', 'en' => 'Solution distribution of bugs.'), + 'dimension' => '1', + 'driver' => 'mysql', + 'group' => '59,61', + 'createdDate' => '2009-03-14', + 'sql' => <<createdDate : helper::now(); + + $pivot->createdDate = $createdDate; $pivotSpec = new stdclass(); - $pivotSpec->version = '1'; - $pivotSpec->pivot = $pivot->id; - $pivotSpec->mode = 'text'; - $pivotSpec->name = $this->jsonEncode($pivot->name); + $pivotSpec->version = '1'; + $pivotSpec->pivot = $pivot->id; + $pivotSpec->mode = 'text'; + $pivotSpec->name = $this->jsonEncode($pivot->name); + $pivotSpec->createdDate = $createdDate; + if(isset($pivot->desc)) $pivotSpec->desc = $this->jsonEncode($pivot->desc); if(isset($pivot->settings)) $pivotSpec->settings = $this->jsonEncode($pivot->settings); if(isset($pivot->filters)) $pivotSpec->filters = $this->jsonEncode($pivot->filters); @@ -907,33 +913,21 @@ class biModel extends model $pivotSQLs = array_merge($pivotSQLs, $this->prepareBuilitinPivotDrillSQL($pivot->id, $pivot->drills)); unset($pivot->drills); - $exists = $this->dao->select('id,name')->from(TABLE_PIVOT)->where('id')->eq($pivot->id)->fetch(); - if(!$exists) $currentOperate = 'insert'; + $pivotExists = $this->dao->select('id,name')->from(TABLE_PIVOT)->where('id')->eq($pivot->id)->fetch(); + $pivotSpecExists = $this->dao->select('pivot,version')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($pivot->id)->andWhere('version')->eq($pivot->version)->fetch(); + if(!$pivotExists) $currentPivotOperate = 'insert'; + if(!$pivotSpecExists) $currentPivotSpecOperate = 'insert'; - $pivotStmt = null; - $pivotSpecStmt = null; - if($currentOperate == 'insert') + $pivotStmt = null; + if($currentPivotOperate == 'insert') { - $now = helper::now(); - $pivot->createdBy = 'system'; - $pivot->createdDate = $now; - $pivot->group = $this->getCorrectGroup($pivot->group, 'pivot'); - + $pivot->createdBy = 'system'; + $pivot->group = $this->getCorrectGroup($pivot->group, 'pivot'); $pivotStmt = $this->dao->insert(TABLE_PIVOT)->data($pivot); + } - $pivotSpec->createdDate = $now; - $pivotSpecStmt = $this->dao->insert(TABLE_PIVOTSPEC)->data($pivotSpec); - } - if($currentOperate == 'update') - { - $id = $pivot->id; - unset($pivot->group); - unset($pivot->id); - unset($pivotSpec->pivot); - unset($pivotSpec->version); - $pivotStmt = $this->dao->update(TABLE_PIVOT)->data($pivot)->where('id')->eq($id); - $pivotSpecStmt = $this->dao->update(TABLE_PIVOTSPEC)->data($pivotSpec)->where('pivot')->eq($id)->andWhere('version')->eq('1'); - } + $pivotSpecStmt = null; + if($currentPivotSpecOperate == 'insert') $pivotSpecStmt = $this->dao->insert(TABLE_PIVOTSPEC)->data($pivotSpec); if(isset($pivotStmt)) $pivotSQLs[] = $pivotStmt->get(); if(isset($pivotSpecStmt)) $pivotSQLs[] = $pivotSpecStmt->get(); From 1212ce3b7d29b777c6a6c1cbb382ad56b5d6851a Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 13:54:00 +0800 Subject: [PATCH 057/431] * [task#133001,done,0.1h] add priv. --- module/pivot/ui/show.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/pivot/ui/show.html.php b/module/pivot/ui/show.html.php index bb51859212..922db1ace7 100644 --- a/module/pivot/ui/show.html.php +++ b/module/pivot/ui/show.html.php @@ -91,7 +91,7 @@ $generateData = function() use ($lang, $groupID, $pivotName, $pivot, $data, $con setData(array('toggle' => 'tooltip', 'title' => $pivot->desc, 'placement' => 'right', 'className' => 'text-gray border border-light', 'type' => 'white')), 'help' ) : null, - span + hasPriv('pivot', 'design') ? span ( set::style(array('font-weight' => 'normal')), $lang->pivot->tipNewVersion . $lang->comma, @@ -102,7 +102,7 @@ $generateData = function() use ($lang, $groupID, $pivotName, $pivot, $data, $con set('data-size', 'lg'), set::href($this->createLink('pivot', 'versions', "groupID={$groupID}&pivotID={$pivot->id}")) ) - ) + ) : null ) : null, $this->app->rawMethod != 'versions' ? toolbar ( From 66bfd7fd266fc95791aff1d9b04c0da615ae630f Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 13:59:32 +0800 Subject: [PATCH 058/431] * [task#132870] add system lang on build. --- module/build/lang/de.php | 2 ++ module/build/lang/en.php | 2 ++ module/build/lang/fr.php | 2 ++ module/build/lang/zh-cn.php | 2 ++ 4 files changed, 8 insertions(+) diff --git a/module/build/lang/de.php b/module/build/lang/de.php index 7cd579861e..1c617dc3a4 100644 --- a/module/build/lang/de.php +++ b/module/build/lang/de.php @@ -22,6 +22,8 @@ $lang->build->batchUnlinkStory = "Batch {$lang->SRCommon} Unlink"; $lang->build->batchUnlinkBug = 'Batch Bug Unlink'; $lang->build->viewBug = 'Bugs'; $lang->build->bugList = 'Bug List'; +$lang->build->system = 'Application'; +$lang->build->addSystem = 'Add Application'; $lang->build->confirmDelete = "Möchten Sie dieses Build löschen?"; $lang->build->confirmUnlinkStory = "Möchten Sie diese {$lang->SRCommon} löschen?"; diff --git a/module/build/lang/en.php b/module/build/lang/en.php index 3b1182d9cb..0f4fc1ac9b 100644 --- a/module/build/lang/en.php +++ b/module/build/lang/en.php @@ -22,6 +22,8 @@ $lang->build->batchUnlinkStory = "Batch Unlink {$lang->SRCommon}"; $lang->build->batchUnlinkBug = 'Batch Unlink Bugs'; $lang->build->viewBug = 'Bugs'; $lang->build->bugList = 'Bug List'; +$lang->build->system = 'Application'; +$lang->build->addSystem = 'Add Application'; $lang->build->confirmDelete = "Do you want to delete this build?"; $lang->build->confirmUnlinkStory = "Do you want to unlink this {$lang->SRCommon}?"; diff --git a/module/build/lang/fr.php b/module/build/lang/fr.php index 0a05a544b4..e85a7e3a33 100644 --- a/module/build/lang/fr.php +++ b/module/build/lang/fr.php @@ -22,6 +22,8 @@ $lang->build->batchUnlinkStory = "Retirer {$lang->SRCommon} par Lot"; $lang->build->batchUnlinkBug = 'Retirer Bugs par Lot'; $lang->build->viewBug = 'Bugs'; $lang->build->bugList = 'Bug List'; +$lang->build->system = 'Application'; +$lang->build->addSystem = 'Ajouter Application'; $lang->build->confirmDelete = "Voulez-vous supprimer ce build ?"; $lang->build->confirmUnlinkStory = "Voulez-vous retirer cette {$lang->SRCommon} du Build ?"; diff --git a/module/build/lang/zh-cn.php b/module/build/lang/zh-cn.php index 5d06041ff5..37a7072bbc 100644 --- a/module/build/lang/zh-cn.php +++ b/module/build/lang/zh-cn.php @@ -22,6 +22,8 @@ $lang->build->batchUnlinkStory = "批量移除{$lang->SRCommon}"; $lang->build->batchUnlinkBug = '批量移除Bug'; $lang->build->viewBug = '查看Bug'; $lang->build->bugList = 'Bug列表'; +$lang->build->system = '所属应用'; +$lang->build->addSystem = '新建应用'; $lang->build->confirmDelete = "您确认删除该构建吗?"; $lang->build->confirmUnlinkStory = "您确认移除该{$lang->SRCommon}吗?"; From 7bed699c008e46298e0aa36dde7590f2e736a858 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 14:01:52 +0800 Subject: [PATCH 059/431] * [task#132870] add system field on build page. --- module/build/ui/create.html.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/module/build/ui/create.html.php b/module/build/ui/create.html.php index b644073340..e02f0ae8b9 100644 --- a/module/build/ui/create.html.php +++ b/module/build/ui/create.html.php @@ -108,6 +108,7 @@ $productBranches = zget($product, 'branches', array()); formPanel ( set::title($lang->build->create), + on::change('[name=newSystem]', 'setSystemBox'), $integratedRow, $executionRow, $productRow, @@ -130,6 +131,15 @@ formPanel ) ), formRow + ( + formGroup + ( + set::width('1/2'), + set::label($lang->build->system), + set::required(true), + ) + ), + formRow ( setClass('hidden'), formGroup From ea052b2b5dae39d707e38a7c2a04d87b3b6f0201 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 14:03:01 +0800 Subject: [PATCH 060/431] * [task#132870] add system field on build page. --- module/build/ui/create.html.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/module/build/ui/create.html.php b/module/build/ui/create.html.php index e02f0ae8b9..f1f2d6afc2 100644 --- a/module/build/ui/create.html.php +++ b/module/build/ui/create.html.php @@ -137,6 +137,30 @@ formPanel set::width('1/2'), set::label($lang->build->system), set::required(true), + inputGroup + ( + div + ( + setClass('w-full'), + setId('systemBox'), + picker + ( + set::name('system'), + set::required(true), + set::items($apps) + ), + input(set::name('systemName'), setClass('hidden')) + ), + div + ( + setClass('input-group-addon flex'), + checkbox + ( + set::name('newSystem'), + set::text($lang->build->addSystem) + ) + ) + ) ) ), formRow From 4b2f4d85b8a98f73e52a1e4dd77bf71eacbc2b89 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 14:04:11 +0800 Subject: [PATCH 061/431] * [task#132870] add js. --- module/build/js/common.ui.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/module/build/js/common.ui.js b/module/build/js/common.ui.js index 425b7ed6c9..e4d67b3b5f 100644 --- a/module/build/js/common.ui.js +++ b/module/build/js/common.ui.js @@ -30,3 +30,19 @@ window.loadBranches = function(productID) } }, 'json'); } + +window.setSystemBox = function(e) +{ + const newSystem = $(e.target).is(':checked') ? 1 : 0; + $('#systemBox #systemName').addClass('hidden'); + $('#systemBox .picker-box').addClass('hidden'); + if(newSystem == 1) + { + $('#systemBox #systemName').removeClass('hidden'); + } + else + { + $('#systemBox #systemName').val(''); + $('#systemBox .picker-box').removeClass('hidden'); + } +} From 00c37dfbf003620f5df4083fb9da694e2f1246d8 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 14:10:42 +0800 Subject: [PATCH 062/431] * [task#133003,done,0.2h] always show tip. --- module/pivot/ui/versions.html.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/module/pivot/ui/versions.html.php b/module/pivot/ui/versions.html.php index f4516e6983..25ee99d1ce 100644 --- a/module/pivot/ui/versions.html.php +++ b/module/pivot/ui/versions.html.php @@ -41,11 +41,21 @@ panel set::bodyClass('pt-0'), to::titleSuffix ( - icon + div ( - setClass('cursor-pointer text-warning'), - setData(array('toggle' => 'tooltip', 'title' => $lang->pivot->tipVersions, 'placement' => 'right', 'className' => 'text-wraning border border-light', 'type' => 'white')), - 'help' + label + ( + to::before + ( + icon + ( + setClass('warning-ghost margin-left8'), + 'help' + ) + ), + set::text($lang->pivot->tipVersions), + setClass('gray-200-pale') + ) ) ), h::table From 01a96ef89e080fb88ac836706e35f962c777aed2 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 14:04:51 +0800 Subject: [PATCH 063/431] * [task#132860,doing,0.1h] adjust sql for system table. --- db/update21.1.sql | 2 +- db/zentao.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/update21.1.sql b/db/update21.1.sql index 1eb53cb5d3..f95578244c 100644 --- a/db/update21.1.sql +++ b/db/update21.1.sql @@ -4,7 +4,7 @@ CREATE TABLE IF NOT EXISTS `zt_system` ( `product` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', `integrated` ENUM('0','1') NOT NULL DEFAULT '0', `latestRelease` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', - `latestDate` DATETIME NULL, + `latestDate` DATE NULL, `children` VARCHAR(255) NOT NULL DEFAULT '', `status` ENUM('active','inactive') NOT NULL DEFAULT 'active', `desc` mediumtext NULL, diff --git a/db/zentao.sql b/db/zentao.sql index 7d132b2500..bbb5fd7cb1 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -16132,7 +16132,7 @@ CREATE TABLE IF NOT EXISTS `zt_system` ( `product` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', `integrated` ENUM('0','1') NOT NULL DEFAULT '0', `latestRelease` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', - `latestDate` DATETIME NULL, + `latestDate` DATE NULL, `children` VARCHAR(255) NOT NULL DEFAULT '', `status` ENUM('active','inactive') NOT NULL DEFAULT 'active', `desc` mediumtext NULL, From 364036edbc63b2e9ebddb6c8478238cda517cfdf Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 14:09:36 +0800 Subject: [PATCH 064/431] + [task#132860,doing,0.5h] add system create and update release method. --- module/release/model.php | 2 ++ module/release/zen.php | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/module/release/model.php b/module/release/model.php index 94665f67e9..fc6a46c1dc 100755 --- a/module/release/model.php +++ b/module/release/model.php @@ -287,6 +287,8 @@ class releaseModel extends model } } + if($release->system && $release->status == 'normal') $this->loadModel('system')->setSystemRelease($release->system, $releaseID, $release->releasedDate); + return $releaseID; } diff --git a/module/release/zen.php b/module/release/zen.php index d25525bc06..cf14ecebb5 100644 --- a/module/release/zen.php +++ b/module/release/zen.php @@ -85,6 +85,7 @@ class releaseZen extends release ->fetch('id'); } } + if(!$newSystem && !$this->post->system) $this->config->release->form->create['system']['required'] = true; if($newSystem && !$this->post->systemName) { @@ -107,6 +108,17 @@ class releaseZen extends release return false; } + if($newSystem && $this->post->systemName) + { + $system = new stdclass(); + $system->name = $this->post->systemName; + $system->product = $productID; + $system->createdBy = $this->app->user->account; + $system->createdDate = helper::now(); + + $release->system = $this->loadModel('system')->create($system); + } + return $release; } From f0a4d3df6a7ac76e0bba57d0aa32771fe2ec148d Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 14:10:09 +0800 Subject: [PATCH 065/431] * [task#132860,doing,0.2h] adjust form check for release. --- module/projectrelease/control.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index a09e1fcaf7..d30823b3ab 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -107,6 +107,14 @@ class projectrelease extends control if(!empty($_POST)) { + $this->lang->projectrelease->system = $this->lang->release->system; + if(!$this->post->newSystem && !$this->post->system) $this->config->release->form->create['system']['required'] = true; + if($this->post->newSystem && !$this->post->systemName) + { + $this->config->release->form->create['systemName'] = array('type' => 'string', 'required' => true); + $this->lang->projectrelease->systemName = $this->lang->release->system; + } + $release = form::data($this->config->release->form->create) ->add('product', $this->post->product ? $this->post->product : 0) ->add('branch', $this->post->branch ? $this->post->branch : 0) @@ -116,6 +124,17 @@ class projectrelease extends control /* Check build if build is required. */ if(strpos($this->config->release->create->requiredFields, 'build') !== false && empty($release->build)) dao::$errors['build'] = sprintf($this->lang->error->notempty, $this->lang->release->build); + + if($this->post->newSystem && $this->post->systemName) + { + $system = new stdclass(); + $system->name = $this->post->systemName; + $system->product = $productID; + $system->createdBy = $this->app->user->account; + $system->createdDate = helper::now(); + + $release->system = $this->loadModel('system')->create($system); + } if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); if(!empty($_FILES['releaseFiles'])) $_FILES['files'] = $_FILES['releaseFiles']; From a752774e8e1d8b2ce019c5c15d9a9175e7150f37 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 14:10:52 +0800 Subject: [PATCH 066/431] + [task#132860,doing,0.5h] add setSystemRelease method for system. --- module/system/model.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/system/model.php b/module/system/model.php index 6b818c3342..3c82b1e8c5 100644 --- a/module/system/model.php +++ b/module/system/model.php @@ -416,4 +416,24 @@ class systemModel extends model if($action == 'inactive') return $system->status == 'active'; return true; } + + /** + * 更新应用的最新发布信息。 + * Update the latest release of the app. + * + * @param int $systemID + * @param int $releaseID + * @param string $releasedDate + * @access public + * @return bool + */ + public function setSystemRelease(int $systemID, int $releaseID, string $releasedDate): bool + { + $system = $this->fetchByID($systemID); + if(!$system || $system->latestDate > $releasedDate) return false; + if($system->latestDate == $releasedDate && $system->latestRelease >= $releaseID) return false; + + $this->dao->update(TABLE_SYSTEM)->set('latestDate')->eq($releasedDate)->set('latestRelease')->eq($releaseID)->where('id')->eq($systemID)->exec(); + return !dao::isError(); + } } From d52f216d1f72047f69ead6882c96591204d16a79 Mon Sep 17 00:00:00 2001 From: wangzemei Date: Fri, 22 Nov 2024 14:58:00 +0800 Subject: [PATCH 067/431] + [task#132557 doing 0.1h 2h] add permission for thinkwizard. --- module/group/packagemanager.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/module/group/packagemanager.php b/module/group/packagemanager.php index 6349f47206..e9e7ace414 100644 --- a/module/group/packagemanager.php +++ b/module/group/packagemanager.php @@ -4195,7 +4195,7 @@ $config->group->package->manageThinkWizard->subset = 'thinkwizard'; $config->group->package->manageThinkWizard->privs = array(); $config->group->package->manageThinkWizard->privs['thinkwizard-create'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 5, 'depend' => array('thinkwizard-browse')); $config->group->package->manageThinkWizard->privs['thinkwizard-edit'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 10, 'depend' => array('thinkwizard-browse')); -$config->group->package->manageThinkWizard->privs['thinkwizard-design'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 15, 'depend' => array('thinkwizard-browse', 'thinkwizard-result', 'thinkstep-create', 'thinkstep-edit', 'thinkstep-view', 'thinkstep-delete', 'thinkstep-link', 'thinkstep-cancelLink', 'thinkwizard-configureobjectsforappeals', 'thinkwizard-configuredimensionforappeals', 'thinkwizard-configurequestionsforappeals', 'thinkwizard-scoringcriteria')); +$config->group->package->manageThinkWizard->privs['thinkwizard-design'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 15, 'depend' => array('thinkwizard-browse', 'thinkwizard-result', 'thinkstep-create', 'thinkstep-edit', 'thinkstep-view', 'thinkstep-delete', 'thinkstep-link', 'thinkstep-cancelLink', 'thinkwizard-configureobjectsforappeals', 'thinkwizard-configuredimensionforappeals', 'thinkwizard-configurequestionsforappeals', 'thinkwizard-scoringcriteria', 'thinkwizard-previewforappeals', 'thinkwizard-prereleaseforappeals')); $config->group->package->manageThinkWizard->privs['thinkwizard-publish'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 20, 'depend' => array('thinkwizard-browse')); $config->group->package->manageThinkWizard->privs['thinkwizard-offline'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 25, 'depend' => array('thinkwizard-browse')); $config->group->package->manageThinkWizard->privs['thinkwizard-admin'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 30, 'depend' => array('thinkwizard-browse')); @@ -4203,6 +4203,8 @@ $config->group->package->manageThinkWizard->privs['thinkwizard-configureobjectsf $config->group->package->manageThinkWizard->privs['thinkwizard-configuredimensionforappeals'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 40, 'depend' => array('thinkwizard-admin')); $config->group->package->manageThinkWizard->privs['thinkwizard-configurequestionsforappeals'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 45, 'depend' => array('thinkwizard-admin')); $config->group->package->manageThinkWizard->privs['thinkwizard-scoringcriteria'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 50, 'depend' => array('thinkwizard-admin')); +$config->group->package->manageThinkWizard->privs['thinkwizard-previewforappeals'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 55, 'depend' => array('thinkwizard-admin')); +$config->group->package->manageThinkWizard->privs['thinkwizard-prereleaseforappeals'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 60, 'depend' => array('thinkwizard-admin')); $config->group->package->deleteThinkWizard = new stdclass(); $config->group->package->deleteThinkWizard->subset = 'thinkwizard'; From e1415b28b6ac08dec7337d2a47ff59bd463c46b7 Mon Sep 17 00:00:00 2001 From: lihuifang Date: Fri, 22 Nov 2024 14:56:59 +0800 Subject: [PATCH 068/431] +[task#133057,doing,0.5h,2.5h] Add ztf notes. --- module/projectstory/test/ui/export.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 module/projectstory/test/ui/export.php diff --git a/module/projectstory/test/ui/export.php b/module/projectstory/test/ui/export.php new file mode 100755 index 0000000000..e4d59ca553 --- /dev/null +++ b/module/projectstory/test/ui/export.php @@ -0,0 +1,20 @@ +#!/usr/bin/env php + Date: Fri, 22 Nov 2024 14:57:48 +0800 Subject: [PATCH 069/431] *[task#133057,doing,1h,2h] Add project testdata. --- module/projectstory/test/ui/export.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/projectstory/test/ui/export.php b/module/projectstory/test/ui/export.php index e4d59ca553..ab8894913e 100755 --- a/module/projectstory/test/ui/export.php +++ b/module/projectstory/test/ui/export.php @@ -18,3 +18,23 @@ cid=73 - 最终测试状态 @SUCCESS */ +chdir(__DIR__); +include '../lib/export.ui.class.php'; + +$product = zenData('product'); +$product->id->range('1'); +$product->name->range('产品1'); +$product->type->range('normal'); +$product->gen(1); + +$project = zenData('project'); +$project->id->range('1'); +$project->project->range('0'); +$project->model->range('scrum'); +$project->type->range('project'); +$project->auth->range('extend'); +$project->storytype->range('`story,epic,requirement`'); +$project->path->range('`,1,`'); +$project->grade->range('1'); +$project->name->range('项目1'); +$project->hasProduct->range('1'); From 91a96958af315178ebaced6dda5b9cddef98bff9 Mon Sep 17 00:00:00 2001 From: lihuifang Date: Fri, 22 Nov 2024 14:58:16 +0800 Subject: [PATCH 070/431] *[task#133057,doing,1.5h,1h] Add projectstory testdata. --- module/projectstory/test/ui/export.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/projectstory/test/ui/export.php b/module/projectstory/test/ui/export.php index ab8894913e..f84cc6a72b 100755 --- a/module/projectstory/test/ui/export.php +++ b/module/projectstory/test/ui/export.php @@ -38,3 +38,23 @@ $project->path->range('`,1,`'); $project->grade->range('1'); $project->name->range('项目1'); $project->hasProduct->range('1'); +$project->status->range('wait'); +$project->acl->range('open'); +$project->gen(1); + +$projectProduct = zenData('projectproduct'); +$projectProduct->project->range('1'); +$projectProduct->product->range('1'); +$projectProduct->gen(1); + +$story = zenData('story'); +$story->id->range('1-10'); +$story->parent->range('0'); +$story->isParent->range('0'); +$story->root->range('1-10'); +$story->path->range('`,1,`, `,2,`, `,3,`, `,4,`, `,5,`, `,6,`, `,7,`, `,8,`, `,9,`, `,10,`'); +$story->grade->range('1'); +$story->product->range('1'); +$story->module->range('0'); +$story->plan->range('0'); +$story->title->range('需求001,需求002,需求003,需求004,需求005,需求006,需求007,需求008,需求009,需求010'); From 990e6ac98f53f2cbc4ee5bbf63af11377d4ed20c Mon Sep 17 00:00:00 2001 From: lihuifang Date: Fri, 22 Nov 2024 14:58:35 +0800 Subject: [PATCH 071/431] *[task#133057,doing,1.5h,1h] Add projectstory testdata. --- module/projectstory/test/ui/export.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/projectstory/test/ui/export.php b/module/projectstory/test/ui/export.php index f84cc6a72b..5e70a5aafe 100755 --- a/module/projectstory/test/ui/export.php +++ b/module/projectstory/test/ui/export.php @@ -58,3 +58,23 @@ $story->product->range('1'); $story->module->range('0'); $story->plan->range('0'); $story->title->range('需求001,需求002,需求003,需求004,需求005,需求006,需求007,需求008,需求009,需求010'); +$story->type->range('story'); +$story->estimate->range('0'); +$story->status->range('active{3}, closed{1}, reviewing{2}, draft{1}, changing{3}'); +$story->stage->range('projected'); +$story->assignedTo->range('[]'); +$story->version->range('1'); +$story->gen(10); + +$storySpec = zenData('storyspec'); +$storySpec->story->range('1-10'); +$storySpec->version->range('1'); +$storySpec->title->range('1-10'); +$storySpec->gen(10); + +$projectStory = zenData('projectstory'); +$projectStory->project->range('1'); +$projectStory->product->range('1'); +$projectStory->branch->range('0'); +$projectStory->story->range('1-10'); +$projectStory->version->range('1'); From dadca2dd939fb2326f1f5da00c291de3cc4e4c1c Mon Sep 17 00:00:00 2001 From: lihuifang Date: Fri, 22 Nov 2024 14:59:02 +0800 Subject: [PATCH 072/431] *[task#133057,doing,2h,0.5h] Add ui test file. --- module/projectstory/test/ui/export.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/module/projectstory/test/ui/export.php b/module/projectstory/test/ui/export.php index 5e70a5aafe..72644b125d 100755 --- a/module/projectstory/test/ui/export.php +++ b/module/projectstory/test/ui/export.php @@ -78,3 +78,21 @@ $projectStory->product->range('1'); $projectStory->branch->range('0'); $projectStory->story->range('1-10'); $projectStory->version->range('1'); +$projectStory->order->range('1'); +$projectStory->gen(10); + +$tester = new exportTester(); +$tester->login(); + +//设置项目需求导出数据 +$projectStory = array( + array('filename' => ''), + array('filename' => '项目导出文件1', 'encoding' => 'UTF-8', 'data' => '选中记录'), + array('filename' => '项目导出文件2', 'format' => 'xml'), +); + +r($tester->export($projectStory['0'])) && p('message,status') && e('项目需求导出成功,SUCCESS'); // 按照默认设置导出项目需求 +r($tester->export($projectStory['1'])) && p('message,status') && e('项目需求导出成功,SUCCESS'); // 项目需求导出csv-UTF-8-选中记录 +r($tester->export($projectStory['2'])) && p('message,status') && e('项目需求导出成功,SUCCESS'); // 项目需求导出xml-全部记录 + +$tester->closeBrowser(); From bde82f64edcab892addde087b39e8f7d60bc4e64 Mon Sep 17 00:00:00 2001 From: lihuifang Date: Fri, 22 Nov 2024 15:00:08 +0800 Subject: [PATCH 073/431] +[task#133057,doing,2h,0.5h] Add element of export projectstory. --- module/projectstory/test/ui/page/story.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/module/projectstory/test/ui/page/story.php b/module/projectstory/test/ui/page/story.php index 65bd65aa0e..3360c41ccb 100755 --- a/module/projectstory/test/ui/page/story.php +++ b/module/projectstory/test/ui/page/story.php @@ -15,7 +15,12 @@ class storyPage extends page 'closedTab' => "//*[@id='more']/menu/menu/li[1]/a/div/div", 'linkedExecutionTab' => "//*[@id='more']/menu/menu/li[2]/a/div/div", 'unlinkedExecutionTab' => "//*[@id='more']/menu/menu/li[3]/a/div/div", - 'num' => "//*[@id='stories_table']/div/div[3]/div[2]/strong[1]" + 'num' => "//*[@id='stories_table']/div/div[3]/div[2]/strong[1]", + /* 导出 */ + 'format' => "//*[@data-name='fileType']/div/div/span[1]", + 'encoding' => "//*[@data-name='encode']/div/div/span[1]", + 'data' => "//*[@data-name='exportType']/div/div/span[1]", + 'exportBtnAlert' => "//*[@class='modal-content']/div[3]/div/div/form/div[8]/div/div/button/span" ); $this->dom->xpath = array_merge($this->dom->xpath, $xpath); } From 9d251cd9274489e26bf62a2de82fa3a24f18ed50 Mon Sep 17 00:00:00 2001 From: lihuifang Date: Fri, 22 Nov 2024 15:01:17 +0800 Subject: [PATCH 074/431] +[task#133057,doing,2.3h,0.2h] Add testui function of export projectstory. --- .../projectstory/test/lib/export.ui.class.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100755 module/projectstory/test/lib/export.ui.class.php diff --git a/module/projectstory/test/lib/export.ui.class.php b/module/projectstory/test/lib/export.ui.class.php new file mode 100755 index 0000000000..01e48e70a6 --- /dev/null +++ b/module/projectstory/test/lib/export.ui.class.php @@ -0,0 +1,19 @@ +initForm('projectstory', 'story', array('project' => '1'), 'appIframe-project'); + $form->dom->exportBtn->click(); + if(isset($projectStory['filename'])) $form->dom->fileName->setValue($projectStory['filename']); + if(isset($projectStory['format'])) $form->dom->format->picker($projectStory['format']); + if(isset($projectStory['encoding'])) $form->dom->encoding->picker($projectStory['encoding']); + if(isset($projectStory['data'])) $form->dom->data->picker($projectStory['data']); From ccdf1d0240fb6caeccbd9b4c50068c6de5f98899 Mon Sep 17 00:00:00 2001 From: lihuifang Date: Fri, 22 Nov 2024 15:01:56 +0800 Subject: [PATCH 075/431] +[task#133057,done,2.5h,0h] Add testui function of export projectstory. --- module/projectstory/test/lib/export.ui.class.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/module/projectstory/test/lib/export.ui.class.php b/module/projectstory/test/lib/export.ui.class.php index 01e48e70a6..63366415c3 100755 --- a/module/projectstory/test/lib/export.ui.class.php +++ b/module/projectstory/test/lib/export.ui.class.php @@ -17,3 +17,11 @@ class exportTester extends tester if(isset($projectStory['format'])) $form->dom->format->picker($projectStory['format']); if(isset($projectStory['encoding'])) $form->dom->encoding->picker($projectStory['encoding']); if(isset($projectStory['data'])) $form->dom->data->picker($projectStory['data']); + $form->dom->exportBtnAlert->click(); + $form->wait(2); + + /*添加断言,是否导出成功*/ + if($form->dom->exportBtnAlert) return $this->failed('项目需求导出失败'); + return $this->success('项目需求导出成功'); + } +} From a1313c88e2ec7fed3470af0e21aba274ed5a6231 Mon Sep 17 00:00:00 2001 From: daitingting Date: Fri, 22 Nov 2024 07:06:02 +0000 Subject: [PATCH 076/431] * [misc,1h] Set sql and get pivot sqls. --- module/bi/model.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/module/bi/model.php b/module/bi/model.php index c49864053c..a5d83447c8 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -883,6 +883,7 @@ class biModel extends model $pivotSpec->version = '1'; $pivotSpec->pivot = $pivot->id; $pivotSpec->mode = 'text'; + $pivotSpec->sql = $pivot->sql; $pivotSpec->name = $this->jsonEncode($pivot->name); $pivotSpec->createdDate = $createdDate; @@ -903,6 +904,7 @@ class biModel extends model unset($pivot->driver); unset($pivot->name); unset($pivot->desc); + unset($pivot->sql); unset($pivot->settings); unset($pivot->filters); unset($pivot->fields); @@ -925,11 +927,10 @@ class biModel extends model $pivot->group = $this->getCorrectGroup($pivot->group, 'pivot'); $pivotStmt = $this->dao->insert(TABLE_PIVOT)->data($pivot); } + if(isset($pivotStmt)) $pivotSQLs[] = $pivotStmt->get(); $pivotSpecStmt = null; if($currentPivotSpecOperate == 'insert') $pivotSpecStmt = $this->dao->insert(TABLE_PIVOTSPEC)->data($pivotSpec); - - if(isset($pivotStmt)) $pivotSQLs[] = $pivotStmt->get(); if(isset($pivotSpecStmt)) $pivotSQLs[] = $pivotSpecStmt->get(); } From c58c72b6186ffd64b14b50e5650f0111f892b943 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 15:24:04 +0800 Subject: [PATCH 077/431] * [task#132860,doing,0.1h] adjust language for release. --- module/release/lang/de.php | 2 +- module/release/lang/en.php | 2 +- module/release/lang/fr.php | 2 +- module/release/lang/zh-cn.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/release/lang/de.php b/module/release/lang/de.php index ad48df643b..781efc2be8 100755 --- a/module/release/lang/de.php +++ b/module/release/lang/de.php @@ -55,7 +55,7 @@ $lang->release->desc = 'Beschreibung'; $lang->release->files = 'Gehäuse'; $lang->release->status = 'Status'; $lang->release->subStatus = 'Sub Status'; -$lang->release->last = 'Letztes Release'; +$lang->release->last = 'Latest Version'; $lang->release->unlinkStory = 'Story entfernen'; $lang->release->unlinkBug = 'Bug entfernen'; $lang->release->stories = 'Abgeschlossene Story'; diff --git a/module/release/lang/en.php b/module/release/lang/en.php index 706be1bd7c..7008d21f07 100755 --- a/module/release/lang/en.php +++ b/module/release/lang/en.php @@ -55,7 +55,7 @@ $lang->release->desc = 'Description'; $lang->release->files = 'Files'; $lang->release->status = 'Status'; $lang->release->subStatus = 'Sub Status'; -$lang->release->last = 'Last Release'; +$lang->release->last = 'Latest Version'; $lang->release->unlinkStory = 'Unlink Story'; $lang->release->unlinkBug = 'Unlink Bug'; $lang->release->stories = 'Finished Story'; diff --git a/module/release/lang/fr.php b/module/release/lang/fr.php index 66bac66369..2347811658 100755 --- a/module/release/lang/fr.php +++ b/module/release/lang/fr.php @@ -55,7 +55,7 @@ $lang->release->desc = 'Description'; $lang->release->files = 'Files'; $lang->release->status = 'Statut'; $lang->release->subStatus = 'Sous-statut'; -$lang->release->last = 'Dernière Release'; +$lang->release->last = 'Latest Version'; $lang->release->unlinkStory = 'Retirer Story'; $lang->release->unlinkBug = 'Retirer Bug'; $lang->release->stories = 'Stories Terminées'; diff --git a/module/release/lang/zh-cn.php b/module/release/lang/zh-cn.php index 8d38250213..8cecd0cd8b 100755 --- a/module/release/lang/zh-cn.php +++ b/module/release/lang/zh-cn.php @@ -55,7 +55,7 @@ $lang->release->desc = '描述'; $lang->release->files = '附件'; $lang->release->status = '状态'; $lang->release->subStatus = '子状态'; -$lang->release->last = '上次发布'; +$lang->release->last = '最新版本号'; $lang->release->unlinkStory = "移除{$lang->SRCommon}"; $lang->release->unlinkBug = '移除Bug'; $lang->release->stories = "完成的{$lang->SRCommon}"; From 214f2fd2dbc23a790d014af7491b3d8093eb7720 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 15:24:41 +0800 Subject: [PATCH 078/431] * [task#132860,doing,0.2h] update system info for release publish. --- module/release/control.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/module/release/control.php b/module/release/control.php index 049453bea0..1cc9e60204 100755 --- a/module/release/control.php +++ b/module/release/control.php @@ -562,6 +562,7 @@ class release extends control */ public function publish(int $releaseID) { + $release = $this->release->getByID($releaseID); if($_POST) { if(!$this->post->releasedDate) @@ -573,11 +574,13 @@ class release extends control $this->release->changeStatus($releaseID, $this->post->status, $this->post->releasedDate); if(dao::isError()) return $this->sendError(dao::getError()); + if($release->system && $this->post->status == 'normal') $this->loadModel('system')->setSystemRelease($release->system, $releaseID, $this->post->releasedDate); + $this->loadModel('action')->create('release', $releaseID, 'published', $this->post->comment, $this->post->status); return $this->sendSuccess(array('load' => true, 'closeModal' => true)); } - $this->view->release = $this->release->getByID($releaseID); + $this->view->release = $release; $this->display(); } From 6d2a2c7f5f4906e4452f4d38de4709819b17aadf Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 15:32:45 +0800 Subject: [PATCH 079/431] * [task#132856] add getparis method unit test. --- module/release/test/model/getpairs.php | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100755 module/release/test/model/getpairs.php diff --git a/module/release/test/model/getpairs.php b/module/release/test/model/getpairs.php new file mode 100755 index 0000000000..8020dd5a35 --- /dev/null +++ b/module/release/test/model/getpairs.php @@ -0,0 +1,27 @@ +#!/usr/bin/env php +gen(10); + +/** + +title=测试 systemModel::getPairs(); +timeout=0 +cid=1 + +- 查询默认键值对属性1 @产品正常的正常的发布1 +- 查询默认键值对数量 @10 +- 查询id为1的发布属性1 @产品正常的正常的发布1 +- 查询id为3的发布属性3 @产品正常的正常的发布3 +- 根据id列表查询发布 @2 + +*/ +global $tester; +$release = $tester->loadModel('release'); + +r($release->getPairs()) && p('1') && e('产品正常的正常的发布1'); // 查询默认键值对 +r(count($release->getPairs())) && p() && e('10'); // 查询默认键值对数量 +r($release->getPairs(array('1', '2'))) && p('1') && e('产品正常的正常的发布1'); // 查询id为1的发布 +r($release->getPairs(array('3', '4'))) && p('3') && e('产品正常的正常的发布3'); // 查询id为3的发布 +r(count($release->getPairs(array('1', '2')))) && p() && e('2'); // 根据id列表查询发布 From cb9cec5e1f8acca1628d8079b9ced7694bc85947 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 15:33:23 +0800 Subject: [PATCH 080/431] * [task#132856] add getparis method. --- module/release/model.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/module/release/model.php b/module/release/model.php index fc6a46c1dc..b863e9776a 100755 --- a/module/release/model.php +++ b/module/release/model.php @@ -56,6 +56,22 @@ class releaseModel extends model return $release; } + /** + * 获取发布列表。 + * Get release list. + * + * @param array $idList + * @access public + * @return array + */ + public function getPairs(array $idList = array()): array + { + return $this->dao->select('id, name')->from(TABLE_RELEASE) + ->where('deleted')->eq(0) + ->beginIF($idList)->andWhere('id')->in($idList)->fi() + ->fetchPairs(); + } + /** * 获取发布列表信息。 * Get release list information. From 69b08245307f11d5dd7fe647ee562fd5dd758fc3 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 15:34:06 +0800 Subject: [PATCH 081/431] * [task#132856] update browse page. --- module/release/ui/browse.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/release/ui/browse.html.php b/module/release/ui/browse.html.php index 40c4806dc1..7e33f77eab 100644 --- a/module/release/ui/browse.html.php +++ b/module/release/ui/browse.html.php @@ -23,7 +23,7 @@ featureBar /* zin: Define the toolbar on main menu. */ $canCreateRelease = hasPriv('release', 'create') && common::canModify('product', $product); $canManageSystem = hasPriv('system', 'browse') && common::canModify('product', $product); -if($canCreateRelease) $createItem = array('icon' => 'plus', 'class' => 'primary', 'text' => $lang->release->create, 'url' => $this->createLink('release', 'create', "productID={$product->id}&branch={$branch}")); +if($canCreateRelease) $createItem = array('icon' => 'plus', 'class' => 'primary', 'text' => $lang->release->create, 'url' => $this->createLink('release', 'create', "productID={$product->id}")); if($canManageSystem) $manageSystemItem = array('class' => 'ghost', 'text' => $lang->release->manageSystem, 'url' => $this->createLink('system', 'browse', "productID={$product->id}&branch={$branch}"), 'data-app' => 'product'); toolbar ( From cfc823f9ceb0e53c68dddc23765ef48f08d9ab42 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 15:34:28 +0800 Subject: [PATCH 082/431] * [task#132856] adjust system list. --- module/common/lang/menu.php | 2 +- module/projectrelease/ui/browse.html.php | 12 ++++++++++++ module/system/control.php | 14 ++++++++++++-- module/system/ui/browse.html.php | 5 +++-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index 8ec26c3ced..26ae9595a3 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -237,7 +237,7 @@ $lang->scrum->menu->doc = array('link' => "{$lang->doc->common}|doc|proj $lang->scrum->menu->qa = array('link' => "{$lang->qa->common}|project|bug|projectID=%s", 'subModule' => 'testcase,testtask,bug,testreport', 'alias' => 'bug,testtask,testcase,testreport', 'exclude' => 'execution-create,execution-batchedit'); if(helper::hasFeature('devops')) $lang->scrum->menu->devops = array('link' => "{$lang->devops->common}|repo|browse|repoID=0&branchID=&objectID=%s", 'subModule' => 'repo,mr'); $lang->scrum->menu->build = array('link' => "{$lang->build->common}|projectbuild|browse|project=%s", 'subModule' => 'projectbuild'); -$lang->scrum->menu->release = array('link' => "{$lang->release->common}|projectrelease|browse|project=%s", 'subModule' => 'projectrelease'); +$lang->scrum->menu->release = array('link' => "{$lang->release->common}|projectrelease|browse|project=%s", 'subModule' => 'projectrelease,system'); $lang->scrum->menu->dynamic = array('link' => "$lang->dynamic|project|dynamic|project=%s"); $lang->scrum->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'tree,stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team', 'exclude' => 'tree-browsetask'); diff --git a/module/projectrelease/ui/browse.html.php b/module/projectrelease/ui/browse.html.php index 7f83be20bc..14c1654e1c 100644 --- a/module/projectrelease/ui/browse.html.php +++ b/module/projectrelease/ui/browse.html.php @@ -16,8 +16,20 @@ featureBar set::linkParams("projectID={$projectID}&executionID={$executionID}&type={key}&orderBy={$orderBy}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}") ); +$canManageSystem = hasPriv('system', 'browse') && common::canModify('project', $project); toolbar ( + !$project->hasProduct && $canManageSystem ? item(set + ( + array + ( + 'class' => 'ghost', + 'text' => $lang->release->manageSystem, + 'url' => $this->createLink('system', 'browse', "productID=0&projectID={$projectID}"), + 'data-app' => 'project' + ) + )) : null, + common::canModify('project', $project) && hasPriv('projectrelease', 'create') ? item(set ([ 'text' => $lang->release->create, diff --git a/module/system/control.php b/module/system/control.php index 36a9c7474a..c4e605a296 100644 --- a/module/system/control.php +++ b/module/system/control.php @@ -535,9 +535,17 @@ class system extends control * @access public * @return void */ - public function browse(int $productID, string $branch, string $orderBy = 'id_desc', int $recTotal = 0, int $recPerPage = 20, int $pageID = 1) + public function browse(int $productID, int $projectID = 0, string $orderBy = 'id_desc', int $recTotal = 0, int $recPerPage = 20, int $pageID = 1) { - $this->commonAction($productID, $branch); + if($projectID) + { + $this->loadModel('project')->setMenu($projectID); + $productID = $this->loadModel('product')->getProductIDByProject($projectID); + } + else + { + $this->commonAction($productID); + } $this->app->loadClass('pager', true); $pager = pager::init($recTotal, $recPerPage, $pageID); @@ -550,7 +558,9 @@ class system extends control $this->view->title = $this->lang->system->browse; $this->view->productID = $productID; + $this->view->projectID = $projectID; $this->view->appList = $systems; + $this->view->releases = $this->loadModel('release')->getPairs(); $this->view->appPairs = $this->system->getPairs(); $this->view->orderBy = $orderBy; $this->view->pager = $pager; diff --git a/module/system/ui/browse.html.php b/module/system/ui/browse.html.php index 91476d96ee..bbab40cbee 100644 --- a/module/system/ui/browse.html.php +++ b/module/system/ui/browse.html.php @@ -14,7 +14,8 @@ $canCreate = hasPriv('system', 'create'); $createLink = $this->createLink('system', 'create', 'productID=' . $productID); $createItem = array('text' => $lang->system->create, 'url' => $createLink, 'class' => 'primary', 'icon' => 'plus', 'data-toggle' => 'modal'); -$config->system->dtable->fieldList['children']['map'] = $appPairs; +$config->system->dtable->fieldList['children']['map'] = $appPairs; +$config->system->dtable->fieldList['latestRelease']['map'] = $releases; $tableData = initTableData($appList, $config->system->dtable->fieldList, $this->system); featureBar @@ -36,7 +37,7 @@ dtable ( set::cols($config->system->dtable->fieldList), set::data($tableData), - set::sortLink(createLink('system', 'browse', "productID={$productID}&branch={$branch}&orderBy={name}_{sortType}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}")), + set::sortLink(createLink('system', 'browse', "productID={$productID}&projectID={$projectID}&orderBy={name}_{sortType}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}")), set::orderBy($orderBy), set::footPager(usePager()) ); From e776740671960f63163be62d0daa3b3e0c6b7fad Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 22 Nov 2024 15:37:29 +0800 Subject: [PATCH 083/431] * [task#132856] adjust system list. --- module/projectrelease/ui/browse.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/projectrelease/ui/browse.html.php b/module/projectrelease/ui/browse.html.php index 14c1654e1c..af43730b97 100644 --- a/module/projectrelease/ui/browse.html.php +++ b/module/projectrelease/ui/browse.html.php @@ -16,7 +16,7 @@ featureBar set::linkParams("projectID={$projectID}&executionID={$executionID}&type={key}&orderBy={$orderBy}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}") ); -$canManageSystem = hasPriv('system', 'browse') && common::canModify('project', $project); +$canManageSystem = hasPriv('system', 'browse') && common::canModify('project', $project); toolbar ( !$project->hasProduct && $canManageSystem ? item(set From bff6888b7ee240faec63dbefd39222f486b15d3f Mon Sep 17 00:00:00 2001 From: zhangyu Date: Fri, 22 Nov 2024 15:12:41 +0800 Subject: [PATCH 084/431] * [task#132559 doing 0.3h 2h] modify preview actions of thinkstep. --- lib/zin/wg/thinkstep/v1.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/zin/wg/thinkstep/v1.php b/lib/zin/wg/thinkstep/v1.php index e9af6681fb..18b21fc645 100644 --- a/lib/zin/wg/thinkstep/v1.php +++ b/lib/zin/wg/thinkstep/v1.php @@ -28,6 +28,7 @@ class thinkStep extends wg if($questionType === 'checkbox') return thinkCheckbox(set::step($step), set::questionType('checkbox'), set::mode($action), set::isRun($isRun), set::quoteQuestions($quoteQuestions), set::quotedQuestions($quotedQuestions)); if($questionType === 'tableInput') return thinkTableInput(set::step($step), set::questionType('tableInput'), set::mode($action), set::isRun($isRun)); if($questionType === 'multicolumn') return thinkMulticolumn(set::step($step), set::questionType('multicolumn'), set::mode($action), set::isRun($isRun), set::quoteQuestions($quoteQuestions), set::quotedQuestions($quotedQuestions), set::modeClass($modeClass)); + if($questionType === 'score') return thinkScore(set::step($step), set::questionType('score'), set::mode($action), set::isRun($isRun), set::quoteQuestions($quoteQuestions), set::quotedQuestions($quotedQuestions)); return array(); } @@ -48,6 +49,9 @@ class thinkStep extends wg $linkmodel = !$isRun && in_array($wizard->model, $config->thinkwizard->venn); $canLink = common::hasPriv('thinkstep', 'link') && $linkmodel && $basicType == 'question'; + $hiddenModelType = in_array($wizard->type, $config->thinkwizard->hiddenMenuType); + $previewCanActions = !$hiddenModelType || ($hiddenModelType && !empty($item->type) && $item->type == 'transition'); + return div ( setClass('think-step relative h-full overflow-y-auto scrollbar-thin'), @@ -63,7 +67,7 @@ class thinkStep extends wg setStyle(array('min-width' => '48px')), btnGroup ( - $canLink ? btn + ($canLink && $previewCanActions) ? btn ( setClass('btn ghost text-gray w-5 h-5 mr-1'), set::icon('link'), @@ -73,14 +77,14 @@ class thinkStep extends wg set('data-dismiss', 'modal'), set('data-size', 'sm'), ): null, - $canEdit ? btn + ($canEdit && $previewCanActions) ? btn ( setClass('btn ghost text-gray w-5 h-5'), set::icon('edit'), set::hint($lang->thinkstep->actions['edit']), set::url(createLink('thinkstep', 'edit', "marketID={$marketID}&stepID={$item->id}")), ) : null, - $canDelete ? ((!$item->existNotNode && empty($quotedQuestions)) ? btn + ($canDelete && $previewCanActions) ? ((!$item->existNotNode && empty($quotedQuestions)) ? btn ( setClass('btn ghost text-gray w-5 h-5 ml-1 ajax-submit'), set::icon('trash'), From fb92b13f28a7efa2f743b366dc54f7c8f40716a0 Mon Sep 17 00:00:00 2001 From: zhangyu Date: Fri, 22 Nov 2024 15:13:18 +0800 Subject: [PATCH 085/431] * [task#132559 doing 0.5h 2h] modify preview actions of thinkstepmenu. --- lib/zin/wg/thinkstepmenu/v1.php | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/zin/wg/thinkstepmenu/v1.php b/lib/zin/wg/thinkstepmenu/v1.php index 1a45d61f8f..db4bb59c16 100644 --- a/lib/zin/wg/thinkstepmenu/v1.php +++ b/lib/zin/wg/thinkstepmenu/v1.php @@ -148,6 +148,9 @@ class thinkStepMenu extends wg $wizard = $this->prop('wizard'); $canAddChild = true; $showQuestionOfNode = true; + $hiddenModelType = in_array($wizard->type, $config->thinkwizard->hiddenMenuType); + $previewCanActions = !$hiddenModelType || ($hiddenModelType && $item->type == 'transition'); + if(!empty($item->children)) { foreach($item->children as $child) @@ -156,6 +159,7 @@ class thinkStepMenu extends wg if($showQuestionOfNode && $child->type == 'node') $showQuestionOfNode = false; } } + if($hiddenModelType) $canAddChild = false; $canCreate = common::hasPriv('thinkstep', 'create'); $canEdit = common::hasPriv('thinkstep', 'edit'); $canDelete = common::hasPriv('thinkstep', 'delete'); @@ -166,7 +170,7 @@ class thinkStepMenu extends wg $transitionAction = array(); if($canCreate) { - if($item->type == 'node') $menus[] = array( + if($item->type == 'node' && !$hiddenModelType) $menus[] = array( 'key' => 'addNode', 'icon' => 'add-chapter', 'text' => $this->lang->thinkstep->actions['sameNode'], @@ -179,7 +183,7 @@ class thinkStepMenu extends wg 'onClick' => jsRaw("() => addNode({$item->id}, 'child')") ); - $transitionAction[] = array('type' => 'divider'); + $transitionAction[] = $previewCanActions ? array('type' => 'divider') : null; $transitionAction[] = array( 'key' => 'transition', 'icon' => 'transition', @@ -219,19 +223,19 @@ class thinkStepMenu extends wg 'innerClass' => 'text-gray opacity-50', 'hint' => $this->lang->thinkstep->tips->linkBlocks ); - $menus = array_merge($menus, array( - $canEdit ? array( + ($canEdit && $previewCanActions) ? array( 'key' => 'editNode', 'icon' => 'edit', 'text' => $this->lang->thinkstep->actions['edit'], 'url' => createLink('thinkstep', 'edit', "marketID={$marketID}&stepID={$item->id}") ) : null, - $canDelete ? $deleteItem : null, + ($canDelete && $previewCanActions) ? $deleteItem : null, in_array($wizard->model, $config->thinkwizard->venn) && $item->type == 'question' && $canLink ? $linkItem : null ), $transitionAction); - if($canCreate && (($showQuestionOfNode && $item->type == 'node') || $item->hasSameQuestion || $item->type == 'question')) $menus = array_merge($menus, array( + $canAddQuestions = ($showQuestionOfNode && $item->type == 'node') || $item->hasSameQuestion || $item->type == 'question'; + if($canCreate && !$hiddenModelType && $canAddQuestions) $menus = array_merge($menus, array( array('type' => 'divider'), $this->buildMenuItem('radio', 'radio', $this->lang->thinkstep->createStep . $this->lang->thinkstep->actions['radio'], $item, $parentID, 'radio'), $this->buildMenuItem('checkbox', 'checkbox', $this->lang->thinkstep->createStep . $this->lang->thinkstep->actions['checkbox'], $item, $parentID, 'checkbox'), From e728fd719e82eff284234522b1d2856862852c80 Mon Sep 17 00:00:00 2001 From: zhangyu Date: Fri, 22 Nov 2024 15:17:31 +0800 Subject: [PATCH 086/431] + [task#132545 doing 0.2h 2h] add initial thinkscore. --- lib/zin/wg/thinkscore/v1.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 lib/zin/wg/thinkscore/v1.php diff --git a/lib/zin/wg/thinkscore/v1.php b/lib/zin/wg/thinkscore/v1.php new file mode 100644 index 0000000000..19cce91d34 --- /dev/null +++ b/lib/zin/wg/thinkscore/v1.php @@ -0,0 +1,18 @@ + Date: Fri, 22 Nov 2024 15:20:24 +0800 Subject: [PATCH 087/431] * [task#132545 doing 0.1h 2h] add thinkScore of func. --- lib/zin/func.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/zin/func.php b/lib/zin/func.php index d0d3bfa01f..b9ace347e4 100644 --- a/lib/zin/func.php +++ b/lib/zin/func.php @@ -212,6 +212,7 @@ function thinkTableInput(): thinkTableInput {return createWg('thinkTableInput', function thinkInput(): thinkInput {return createWg('thinkInput', func_get_args());} function thinkMatrixOptions(): thinkMatrixOptions {return createWg('thinkMatrixOptions', func_get_args());} function thinkMulticolumn(): thinkMulticolumn {return createWg('thinkMulticolumn', func_get_args());} +function thinkScore(): thinkScore {return createWg('thinkScore', func_get_args());} function thinkStepMenu(): thinkStepMenu {return createWg('thinkStepMenu', func_get_args());} function thinkResult(): thinkResult {return createWg('thinkResult', func_get_args());} function thinkSwot(): thinkSwot {return createWg('thinkSwot', func_get_args());} From b9cefce2b17289b520c376125077b331eb6b29c8 Mon Sep 17 00:00:00 2001 From: zhangyu Date: Fri, 22 Nov 2024 15:36:16 +0800 Subject: [PATCH 088/431] * [task#132559 doing 0.1h 2h] fix snoar error. --- lib/zin/wg/thinkstep/v1.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/zin/wg/thinkstep/v1.php b/lib/zin/wg/thinkstep/v1.php index 18b21fc645..652913840b 100644 --- a/lib/zin/wg/thinkstep/v1.php +++ b/lib/zin/wg/thinkstep/v1.php @@ -39,19 +39,19 @@ class thinkStep extends wg list($item, $action, $wizard, $addType, $isRun, $quotedQuestions) = $this->prop(array('item', 'action', 'wizard', 'addType', 'isRun', 'quotedQuestions')); if(!$item && !$addType) return array(); + $hiddenModelType = in_array($wizard->type, $config->thinkwizard->hiddenMenuType); + $previewCanActions = !$hiddenModelType || ($hiddenModelType && !empty($item->type) && $item->type == 'transition'); + $marketID = data('marketID'); $basicType = $item->type ?? ''; $typeLang = $action . 'Step'; $type = $addType ? $addType : ($basicType == 'question' ? $item->options->questionType : $basicType); $title = $action == 'detail' ? sprintf($lang->thinkstep->info, $lang->thinkstep->$basicType) : sprintf($lang->thinkstep->formTitle[$type], $lang->thinkstep->$typeLang); $canEdit = common::hasPriv('thinkstep', 'edit'); - $canDelete = common::hasPriv('thinkstep', 'delete'); + $canDelete = common::hasPriv('thinkstep', 'delete') && $previewCanActions; $linkmodel = !$isRun && in_array($wizard->model, $config->thinkwizard->venn); $canLink = common::hasPriv('thinkstep', 'link') && $linkmodel && $basicType == 'question'; - $hiddenModelType = in_array($wizard->type, $config->thinkwizard->hiddenMenuType); - $previewCanActions = !$hiddenModelType || ($hiddenModelType && !empty($item->type) && $item->type == 'transition'); - return div ( setClass('think-step relative h-full overflow-y-auto scrollbar-thin'), @@ -84,7 +84,7 @@ class thinkStep extends wg set::hint($lang->thinkstep->actions['edit']), set::url(createLink('thinkstep', 'edit', "marketID={$marketID}&stepID={$item->id}")), ) : null, - ($canDelete && $previewCanActions) ? ((!$item->existNotNode && empty($quotedQuestions)) ? btn + $canDelete ? ((!$item->existNotNode && empty($quotedQuestions)) ? btn ( setClass('btn ghost text-gray w-5 h-5 ml-1 ajax-submit'), set::icon('trash'), From 5bfb45476a92520cbdcbf4a0482ebb3c65e825f5 Mon Sep 17 00:00:00 2001 From: lixiaoyu Date: Fri, 22 Nov 2024 14:26:18 +0800 Subject: [PATCH 089/431] *[task#133115,done,0.3h,0h] modify data of contribute --- module/my/test/ui/contribute.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/my/test/ui/contribute.php b/module/my/test/ui/contribute.php index ed4e5699f8..a4cd1867ca 100755 --- a/module/my/test/ui/contribute.php +++ b/module/my/test/ui/contribute.php @@ -82,7 +82,6 @@ $storyreview = zenData('storyreview'); $storyreview->story->range('1-27'); $storyreview->reviewer->range('admin{6},{4},admin{3},{9},admin{2},{4}'); $storyreview->result->range('pass{6},{4},pass{3},{9},pass{2},{4}'); -$storyreview->result->range('1'); $storyreview->gen(27); $bug = zenData('bug'); @@ -144,6 +143,7 @@ $action->project->range('1{4},0{13},1{3},0{14}'); $action->execution->range('2{4},0{13},2{3},0{14}'); $action->actor->range('admin'); $action->action->range('assigned{20},submitreview{8},reviewed{6}'); +$storyreview->result->range('1'); $action->gen(34); $tester = new contributeTester(); From edcef47b3931e51f4d2a4e1f8f5e46b88088485b Mon Sep 17 00:00:00 2001 From: lixiaoyu Date: Fri, 22 Nov 2024 14:33:23 +0800 Subject: [PATCH 090/431] *[task#133115,done,0.3h,0h] modify data of contribute --- module/my/test/ui/contribute.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/my/test/ui/contribute.php b/module/my/test/ui/contribute.php index a4cd1867ca..8e1bde9787 100755 --- a/module/my/test/ui/contribute.php +++ b/module/my/test/ui/contribute.php @@ -143,7 +143,7 @@ $action->project->range('1{4},0{13},1{3},0{14}'); $action->execution->range('2{4},0{13},2{3},0{14}'); $action->actor->range('admin'); $action->action->range('assigned{20},submitreview{8},reviewed{6}'); -$storyreview->result->range('1'); +$action->extra->range('{28},Pass{6}'); $action->gen(34); $tester = new contributeTester(); From fd774d8352b47f67d886d6adb0f2a6ebe1f48310 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 16:09:19 +0800 Subject: [PATCH 091/431] * [task#132860,doing,0.1h] adjust system create params. --- module/projectrelease/control.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index d30823b3ab..d8663574da 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -125,11 +125,11 @@ class projectrelease extends control /* Check build if build is required. */ if(strpos($this->config->release->create->requiredFields, 'build') !== false && empty($release->build)) dao::$errors['build'] = sprintf($this->lang->error->notempty, $this->lang->release->build); - if($this->post->newSystem && $this->post->systemName) + if($this->post->newSystem && $this->post->systemName && $this->post->product) { $system = new stdclass(); $system->name = $this->post->systemName; - $system->product = $productID; + $system->product = $this->post->product; $system->createdBy = $this->app->user->account; $system->createdDate = helper::now(); From baf8b7dd261ed3de088bf9f4c492b3ea48db65be Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 16:09:58 +0800 Subject: [PATCH 092/431] * [task#132860,doing,0.2h] add system block for release edit. --- module/release/control.php | 1 + module/release/ui/edit.html.php | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/module/release/control.php b/module/release/control.php index 1cc9e60204..6727246d3d 100755 --- a/module/release/control.php +++ b/module/release/control.php @@ -198,6 +198,7 @@ class release extends control $this->view->release = $release; $this->view->builds = $builds; $this->view->users = $this->loadModel('user')->getPairs('noclosed'); + $this->view->apps = $this->loadModel('system')->getPairs($release->product); $this->display(); } diff --git a/module/release/ui/edit.html.php b/module/release/ui/edit.html.php index 869d92b456..8c2dc2bbf0 100644 --- a/module/release/ui/edit.html.php +++ b/module/release/ui/edit.html.php @@ -15,6 +15,16 @@ formPanel ( set::title($lang->release->edit), on::change('[name=status]', 'changeStatus'), + formGroup + ( + set::width('1/2'), + set::label($lang->release->system), + set::name('system'), + set::control(array('type' => 'picker', 'required' => true)), + set::items($apps), + set::disabled(true), + set::value($release->system) + ), formRow ( formGroup From 6310c8debdf4f45b6f2c95da7ca30827eb1698a1 Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Fri, 22 Nov 2024 08:18:21 +0000 Subject: [PATCH 093/431] * [story#69519,0.2h] only builtin set mark. --- module/pivot/zen.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/module/pivot/zen.php b/module/pivot/zen.php index f0f9312915..dfbab7f94f 100644 --- a/module/pivot/zen.php +++ b/module/pivot/zen.php @@ -80,7 +80,9 @@ class pivotZen extends pivot $groups = $this->pivot->getGroupsByDimensionAndPath($dimensionID, $currentGroup->path); if(!$groups) return array(); + $this->loadModel('bi'); $firstAction = $this->loadModel('action')->getAccountFirstAction($this->app->user->account); + $builtins = array_column($this->config->bi->builtin->pivots, 'id', 'id'); $menus = array(); foreach($groups as $group) { @@ -97,7 +99,7 @@ class pivotZen extends pivot foreach($pivots as $pivot) { - $this->setNewMark($pivot, $firstAction); + $this->setNewMark($pivot, $firstAction, $builtins); $params = helper::safe64Encode("groupID={$group->id}&pivotID={$pivot->id}&mark=view"); $url = inlink('preview', "dimension={$dimensionID}&group={$currentGroup->id}&method=show¶ms={$params}"); $menus[] = (object)array('id' => $group->id . '_' . $pivot->id, 'parent' => $group->grade > 1 ? $group->id : 0, 'name' => $pivot->name, 'url' => $url); @@ -120,8 +122,9 @@ class pivotZen extends pivot * @access protected * @return void */ - protected function setNewMark(object $pivot, object $firstAction): void + protected function setNewMark(object $pivot, object $firstAction, array $builtins): void { + if(!isset($builtins[$pivot->id])) return; if(!$pivot->mark && $pivot->createdDate < $firstAction->date) $pivot->mark = true; if(!$pivot->mark) $pivot->name = array('text' => $pivot->name, 'html' => $pivot->name . ' ' . $this->lang->pivot->new . ''); } From 1eeaae7a90bdc6e54eb352026a4eba2520492132 Mon Sep 17 00:00:00 2001 From: songchenxuan Date: Fri, 22 Nov 2024 16:20:39 +0800 Subject: [PATCH 094/431] *[misc] getPivotSpecData to pivot. --- module/pivot/tao.php | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/module/pivot/tao.php b/module/pivot/tao.php index 6671366256..c0437cf828 100644 --- a/module/pivot/tao.php +++ b/module/pivot/tao.php @@ -15,12 +15,38 @@ class pivotTao extends pivotModel $pivot = $this->dao->select('*')->from(TABLE_PIVOT)->where('id')->eq($id)->andWhere('deleted')->eq('0')->fetch(); if(!$pivot) return false; - $specData = $this->dao->select('*')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($id)->andWhere('version')->eq($pivot->version)->fetch(); - if(!$specData) return $pivot; - - foreach($specData as $specKey => $specValue) $pivot->$specKey = $specValue; - return $pivot; + return $this->mergePivotSpecData($pivot); } + + /** + * 合并 pivotSpec 的数据。 + * Merge pivotSpec data to pivot. + * + * @param int $id + * @access public + * @return object|bool + */ + protected function mergePivotSpecData($pivots, $isObject = true) + { + if($isObject) $pivots = array($pivots); + $pivotIDList = array_column($pivots, 'id'); + + $pivotSpecs = $this->dao->select('t2.*')->from(TABLE_PIVOT)->alias('t1') + ->leftJoin(TABLE_PIVOTSPEC)->alias('t2')->on('t1.id = t2.pivot and t1.version = t2.version') + ->where('t1.id')->in($pivotIDList) + ->fetchAll('pivot'); + + foreach($pivots as $index => $pivot) + { + if(!isset($pivotSpecs[$pivot->id])) continue; + + foreach($pivotSpecs[$pivot->id] as $specKey => $specValue) $pivot->$specKey = $specValue; + $pivots[$index] = $pivot; + } + + return $isObject ? current($pivots) : $pivots; + } + /** * 获取产品列表。 * Get product list. From e401d9ff585e2f0b7c5c0ef16e9c5c7506211c7c Mon Sep 17 00:00:00 2001 From: huairong Date: Fri, 22 Nov 2024 16:45:56 +0800 Subject: [PATCH 095/431] + [task#133031,doing,0.5,1.5] Add active bug function. --- module/project/test/lib/bug.ui.class.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/module/project/test/lib/bug.ui.class.php b/module/project/test/lib/bug.ui.class.php index cbe2d8da95..38b1ee8d10 100644 --- a/module/project/test/lib/bug.ui.class.php +++ b/module/project/test/lib/bug.ui.class.php @@ -149,4 +149,26 @@ class bugTester extends tester if($form->dom->status->getText() == '已关闭') return $this->success('关闭Bug成功'); return $this->failed('关闭Bug失败'); } + + /** + * 激活bug。 + * Active bug. + * + * @param string $user + * @access public + * @return object + */ + public function activeBug($user) + { + $form = $this->initForm('project', 'bug', array('project' => 1), 'appIframe-project'); + $form->dom->activeBtn->click(); + $title = $form->dom->activeTitle->getText(); + $form->dom->activeAssignTo->picker($user); + $form->dom->active->click(); + $form->wait(1); + $form->dom->search(array("{$this->lang->bug->name},=,{$title}")); + $form->wait(1); + if($form->dom->status->getText() == '激活') return $this->success('激活Bug成功'); + return $this->failed('激活Bug失败'); + } } From 49ca06ac1d4855d1852b169d9d8a6e2d4169fb28 Mon Sep 17 00:00:00 2001 From: huairong Date: Fri, 22 Nov 2024 16:47:40 +0800 Subject: [PATCH 096/431] + [task#133031,doing,0.2,1.3] Add element of active bug page. --- module/project/test/ui/page/bug.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/module/project/test/ui/page/bug.php b/module/project/test/ui/page/bug.php index 4dfd8093b0..5e2c2ebaea 100644 --- a/module/project/test/ui/page/bug.php +++ b/module/project/test/ui/page/bug.php @@ -47,7 +47,13 @@ class bugPage extends page /* 关闭页面 */ 'close' => "//*[@class='form load-indicator form-ajax no-morph form-horz']/div[2]/div/button", 'closeTitle' => "//*[@class='modal modal-async load-indicator modal-trans show in']/div/div/div[1]/div/div[2]/span[1]", - ); + /* 激活页面 */ + 'active' => "//*[@class='form load-indicator form-ajax no-morph form-horz']/div[5]/div/button", + 'activeTitle' => "//*[@class='modal modal-async load-indicator modal-trans show in']/div/div/div[1]/div/div[2]/span[1]", + 'activeAssignTo' => "//*[@name='assignedTo']", + /* 搜索列表 */ + 'status' => "//*[@id='table-project-bug']/div[2]/div[2]/div/div[3]/div/span", + ); $this->dom->xpath = array_merge($this->dom->xpath, $xpath); } } From 56e1e62f34866c0ad7250757dfbe53d3c6a0c535 Mon Sep 17 00:00:00 2001 From: huairong Date: Fri, 22 Nov 2024 16:49:35 +0800 Subject: [PATCH 097/431] + [task#133031,doing,0.1,1.0] Add comment of active bug ui test file. --- module/project/test/ui/activebug.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 module/project/test/ui/activebug.php diff --git a/module/project/test/ui/activebug.php b/module/project/test/ui/activebug.php new file mode 100755 index 0000000000..6ab13e5213 --- /dev/null +++ b/module/project/test/ui/activebug.php @@ -0,0 +1,14 @@ +#!/usr/bin/env php + Date: Fri, 22 Nov 2024 16:51:03 +0800 Subject: [PATCH 098/431] + [task#133031,doing,0.2,0.8] Add product testdata. --- module/project/test/ui/activebug.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/module/project/test/ui/activebug.php b/module/project/test/ui/activebug.php index 6ab13e5213..1436a512e1 100755 --- a/module/project/test/ui/activebug.php +++ b/module/project/test/ui/activebug.php @@ -12,3 +12,12 @@ cid=1 - 测试结果 @激活Bug成功 */ + +chdir(__DIR__); +include '../lib/bug.ui.class.php'; + +$product = zenData('product'); +$product->id->range('1-2'); +$product->name->range('产品1, 产品2'); +$product->type->range('normal'); +$product->gen(2); From 03e39b99191f456370d8fe37e541a4a7c84184cd Mon Sep 17 00:00:00 2001 From: huairong Date: Fri, 22 Nov 2024 16:52:00 +0800 Subject: [PATCH 099/431] + [task#133031,doing,0.4,0.4] Add project and projectproduct testdata. --- module/project/test/ui/activebug.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/project/test/ui/activebug.php b/module/project/test/ui/activebug.php index 1436a512e1..3cef672ffa 100755 --- a/module/project/test/ui/activebug.php +++ b/module/project/test/ui/activebug.php @@ -21,3 +21,23 @@ $product->id->range('1-2'); $product->name->range('产品1, 产品2'); $product->type->range('normal'); $product->gen(2); + +$project = zenData('project'); +$project->id->range('1'); +$project->project->range('0'); +$project->model->range('scrum'); +$project->type->range('project'); +$project->auth->range('extend'); +$project->storytype->range('`story,epic,requirement`'); +$project->path->range('`,1,`'); +$project->grade->range('1'); +$project->name->range('敏捷项目1'); +$project->hasProduct->range('1'); +$project->status->range('wait'); +$project->acl->range('open'); +$project->gen(1); + +$projectProduct = zenData('projectproduct'); +$projectProduct->project->range('1'); +$projectProduct->product->range('1{1}, 2{1}'); +$projectProduct->gen(2); From e1ea47017893401e2ca88d3d349d58f45fe3a63c Mon Sep 17 00:00:00 2001 From: huairong Date: Fri, 22 Nov 2024 16:53:00 +0800 Subject: [PATCH 100/431] + [task#133031,doing,0.3,0.2] Add bug and team testdata. --- module/project/test/ui/activebug.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/module/project/test/ui/activebug.php b/module/project/test/ui/activebug.php index 3cef672ffa..c22e52a1cd 100755 --- a/module/project/test/ui/activebug.php +++ b/module/project/test/ui/activebug.php @@ -41,3 +41,22 @@ $projectProduct = zenData('projectproduct'); $projectProduct->project->range('1'); $projectProduct->product->range('1{1}, 2{1}'); $projectProduct->gen(2); + +$bug = zenData('bug'); +$bug->id->range('1-10'); +$bug->project->range('1'); +$bug->product->range('1{2}, 2{2}'); +$bug->execution->range('0'); +$bug->title->range('Bug1, Bug2, Bug3, Bug4'); +$bug->openedBuild->range('trunk'); +$bug->status->range('active{2}, closed{2}'); +$bug->assignedTo->range('[]'); +$bug->gen(4); + +$team = zendata('team'); +$team->id->range('1'); +$team->root->range('1'); +$team->type->range('project'); +$team->account->range('admin'); +$team->join->range('(-2M)-(-M):1D')->type('timestamp')->format('YY/MM/DD'); +$team->gen(1); From fa82d20696504432ec9a48cef689f65112631095 Mon Sep 17 00:00:00 2001 From: huairong Date: Fri, 22 Nov 2024 16:53:50 +0800 Subject: [PATCH 101/431] + [task#133031,done,0.2] Add testcase of active bug under project. --- module/project/test/ui/activebug.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/module/project/test/ui/activebug.php b/module/project/test/ui/activebug.php index c22e52a1cd..8a07f5ae0f 100755 --- a/module/project/test/ui/activebug.php +++ b/module/project/test/ui/activebug.php @@ -60,3 +60,10 @@ $team->type->range('project'); $team->account->range('admin'); $team->join->range('(-2M)-(-M):1D')->type('timestamp')->format('YY/MM/DD'); $team->gen(1); + +$tester = new bugTester(); +$tester->login(); + +r($tester->activeBug('admin')) && p('status,message') && e('SUCCESS,激活Bug成功'); + +$tester->closeBrowser(); From 06e484fbff67c99dc59ad1c74c09450094580908 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 22 Nov 2024 17:10:54 +0800 Subject: [PATCH 102/431] + [task#132860,doing,0.3h] add params for system getList. --- module/system/control.php | 2 +- module/system/model.php | 9 ++++++--- module/system/test/model/getlist.php | 19 ++++++++++--------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/module/system/control.php b/module/system/control.php index c4e605a296..df5f1ed08d 100644 --- a/module/system/control.php +++ b/module/system/control.php @@ -550,7 +550,7 @@ class system extends control $this->app->loadClass('pager', true); $pager = pager::init($recTotal, $recPerPage, $pageID); - $systems = $this->system->getList($productID, $orderBy, $pager); + $systems = $this->system->getList($productID, 'all', $orderBy, $pager); foreach($systems as &$system) { $system->latestRelease = $system->latestRelease ? $system->latestRelease : ''; diff --git a/module/system/model.php b/module/system/model.php index 3c82b1e8c5..b54e6c2629 100644 --- a/module/system/model.php +++ b/module/system/model.php @@ -17,19 +17,22 @@ class systemModel extends model * 获取应用列表。 * Get app list. * + * @param int $productID + * @param string $status * @param string $orderBy * @param object $pager * @access public * @return array */ - public function getList(int $product, string $orderBy = 'id_desc', object $pager = null): array + public function getList(int $productID, string $status = 'active', string $orderBy = 'id_desc', object $pager = null): array { return $this->dao->select('*')->from(TABLE_SYSTEM) ->where('deleted')->eq('0') - ->andWhere('product')->eq($product) + ->andWhere('product')->eq($productID) + ->beginIF($status && $status != 'all')->andWhere('status')->eq($status)->fi() ->orderBy($orderBy) ->page($pager) - ->fetchAll(); + ->fetchAll('id'); } /** diff --git a/module/system/test/model/getlist.php b/module/system/test/model/getlist.php index 2085a0b95e..a34ac6168a 100755 --- a/module/system/test/model/getlist.php +++ b/module/system/test/model/getlist.php @@ -11,11 +11,11 @@ title=测试 systemModel::getList(); timeout=0 cid=1 -- 查询默认排序应用第0条的name属性 @应用1 +- 查询默认排序应用第1条的name属性 @应用1 - 获取所有应用数量 @1 -- 查询默认排序应用下的状态第0条的status属性 @active -- 查询ID正序排序应用第0条的name属性 @应用1 -- 查询状态倒序排序应用第0条的name属性 @应用1 +- 查询默认排序应用下的状态第1条的status属性 @active +- 查询ID正序排序应用第1条的name属性 @应用1 +- 查询状态倒序排序应用第1条的name属性 @应用1 */ global $tester; @@ -23,8 +23,9 @@ $system = $tester->loadModel('system'); $orderList = array('id_desc', 'id_asc', 'status_desc', 'status_asc'); -r($system->getList(1)) && p('0:name') && e('应用1'); // 查询默认排序应用 -r(count($system->getList(1))) && p() && e('1'); // 获取所有应用数量 -r($system->getList(1)) && p('0:status') && e('active'); // 查询默认排序应用下的状态 -r($system->getList(1, $orderList[1])) && p('0:name') && e('应用1'); // 查询ID正序排序应用 -r($system->getList(1, $orderList[2])) && p('0:name') && e('应用1'); // 查询状态倒序排序应用 +r($system->getList(1)) && p('1:name') && e('应用1'); // 查询默认排序应用 +r(count($system->getList(1))) && p() && e('1'); // 获取所有应用数量 +r($system->getList(1)) && p('1:status') && e('active'); // 查询默认排序应用下的状态 + +r($system->getList(1, 'all', $orderList[1])) && p('1:name') && e('应用1'); // 查询ID正序排序应用 +r($system->getList(1, 'active', $orderList[2])) && p('1:name') && e('应用1'); // 查询状态倒序排序应用 \ No newline at end of file From a9f0db55bab169d1870a8fa8c7e2180405463a4c Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 08:39:40 +0800 Subject: [PATCH 103/431] * [task#132865] add system field in buid table. --- db/update21.1.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/update21.1.sql b/db/update21.1.sql index f95578244c..847f6d9fb0 100644 --- a/db/update21.1.sql +++ b/db/update21.1.sql @@ -21,6 +21,8 @@ CREATE INDEX `idx_status` ON `zt_system`(`status`); ALTER TABLE `zt_release` ADD `system` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `name`; ALTER TABLE `zt_release` ADD `releases` VARCHAR(255) NOT NULL DEFAULT '' AFTER `system`; +ALTER TABLE `zt_build` ADD `system` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `name`; + CREATE INDEX `idx_system` ON `zt_release`(`system`); ALTER TABLE `zt_review` ADD `toAuditBy` varchar(30) not NULL default '' AFTER `lastAuditedDate`; From d60e191128877d95b93bb177d34c7778865129ee Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 08:44:04 +0800 Subject: [PATCH 104/431] * [task#132865] add system field in buid table. --- db/zentao.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/zentao.sql b/db/zentao.sql index bbb5fd7cb1..41e7082d7c 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -381,6 +381,7 @@ CREATE TABLE IF NOT EXISTS `zt_build` ( `execution` mediumint(8) unsigned NOT NULL default '0', `builds` varchar(255) NOT NULL DEFAULT '', `name` char(150) NOT NULL DEFAULT '', + `system` mediumint(8) unsigned NOT NULL DEFAULT '0', `scmPath` char(255) NOT NULL DEFAULT '', `filePath` char(255) NOT NULL DEFAULT '', `date` date NULL, From 8c2d499e08b88b2c552150bc0bc8733da4d21dc1 Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 08:48:25 +0800 Subject: [PATCH 105/431] * [task#132865] add system idx in table build. --- db/update21.1.sql | 1 + db/zentao.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/db/update21.1.sql b/db/update21.1.sql index 847f6d9fb0..7e72ff824f 100644 --- a/db/update21.1.sql +++ b/db/update21.1.sql @@ -24,6 +24,7 @@ ALTER TABLE `zt_release` ADD `releases` VARCHAR(255) NOT NULL DEFAULT '' AFTER ` ALTER TABLE `zt_build` ADD `system` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `name`; CREATE INDEX `idx_system` ON `zt_release`(`system`); +CREATE INDEX `idx_system` ON `zt_build`(`system`); ALTER TABLE `zt_review` ADD `toAuditBy` varchar(30) not NULL default '' AFTER `lastAuditedDate`; ALTER TABLE `zt_review` ADD `toAuditDate` datetime NULL AFTER `toAuditBy`; diff --git a/db/zentao.sql b/db/zentao.sql index 41e7082d7c..11a249a13d 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -397,6 +397,7 @@ CREATE TABLE IF NOT EXISTS `zt_build` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE INDEX `product` ON `zt_build`(`product`); CREATE INDEX `execution` ON `zt_build`(`execution`); +CREATE INDEX `idx_system` ON `zt_build`(`system`); -- DROP TABLE IF EXISTS `zt_burn`; CREATE TABLE IF NOT EXISTS `zt_burn` ( From f1fda82b0e16f9c3a358d6497e9146215af69d55 Mon Sep 17 00:00:00 2001 From: liugang Date: Fri, 22 Nov 2024 13:06:00 +0800 Subject: [PATCH 106/431] * [refac] check if a variable is empty before using it as an array. --- lib/cache/cache.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cache/cache.class.php b/lib/cache/cache.class.php index 8aeea8791f..4c5cff6da0 100644 --- a/lib/cache/cache.class.php +++ b/lib/cache/cache.class.php @@ -432,7 +432,7 @@ class cache /* 把被删除的数据的 id 从缓存中删除。Delete the id of the deleted data from cache. */ $setCacheKey = $this->getSetCacheKey($code); $objectIdList = $this->cache->get($setCacheKey); - $this->cache->set($setCacheKey, array_diff($objectIdList, array_map(function($object) use ($field) { return $object->$field; }, $this->objects))); + if($objectIdList) $this->cache->set($setCacheKey, array_diff($objectIdList, array_map(function($object) use ($field) { return $object->$field; }, $this->objects))); if(empty($this->config->cache->res[$this->table])) return; From c8ad8fd2687f33d62f7c2fa02ea3493377900150 Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 08:55:38 +0800 Subject: [PATCH 107/431] * [bug#56989] add remove file config. --- module/upgrade/config.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/upgrade/config.php b/module/upgrade/config.php index 27258c7ddb..40b33cdadb 100644 --- a/module/upgrade/config.php +++ b/module/upgrade/config.php @@ -1408,6 +1408,8 @@ $config->delete['20_9'][] = 'extension/biz/deploy/js/finish.ui.js'; $config->delete['20_9'][] = 'extension/max/deploy/js/finish.ui.js'; $config->delete['20_9'][] = 'extension/ipd/deploy/js/finish.ui.js'; $config->delete['20_9'][] = 'module/account/'; +$config->delete['20_9'][] = 'module/host/js/create.ui.js'; +$config->delete['20_9'][] = 'module/host/js/edit.ui.js'; $config->delete['21_1'][] = 'module/admin/ui/cache.html.php'; $config->upgrade->openModules = array('action', 'admin', 'ai', 'bi', 'aiapp', 'api', 'automation', 'backup', 'block', 'branch', 'budget', 'bug', 'build', 'cache', 'caselib', 'chart', 'ci', 'client', 'common', 'company', 'compile', 'convert', 'cron', 'custom', 'datatable', 'dataview', 'dept', 'design', 'dev', 'dimension', 'doc', 'durationestimation', 'entry', 'execution', 'extension', 'file', 'git', 'gitlab', 'group', 'holiday', 'im', 'index', 'index.html', 'install', 'issue', 'jenkins', 'job', 'kanban', 'license', 'mail', 'message', 'metric', 'misc', 'mr', 'my', 'personnel', 'pipeline', 'product', 'productplan', 'productset', 'program', 'programplan', 'project', 'projectbuild', 'projectplan', 'projectrelease', 'projectstory', 'pivot', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'screen', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation', 'gitea', 'gogs', 'transfer', 'zahost', 'zanode', 'editor', 'charter', 'roadmap', 'account', 'cne', 'host', 'instance', 'ops', 'serverroom', 'space', 'store', 'system', 'solution', 'demand', 'gitfox', 'epic', 'requirement', 'mark'); From 191e3758957a48607c5b1aaa6d6c4182a34cf2eb Mon Sep 17 00:00:00 2001 From: daitingting Date: Fri, 22 Nov 2024 09:28:59 +0000 Subject: [PATCH 108/431] * [task#133009,done,1h] Optimize codes. --- module/pivot/tao.php | 47 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 37 deletions(-) diff --git a/module/pivot/tao.php b/module/pivot/tao.php index c0437cf828..6b80a3a146 100644 --- a/module/pivot/tao.php +++ b/module/pivot/tao.php @@ -12,39 +12,11 @@ class pivotTao extends pivotModel */ protected function fetchPivot(int $id): object|bool { - $pivot = $this->dao->select('*')->from(TABLE_PIVOT)->where('id')->eq($id)->andWhere('deleted')->eq('0')->fetch(); - if(!$pivot) return false; - - return $this->mergePivotSpecData($pivot); - } - - /** - * 合并 pivotSpec 的数据。 - * Merge pivotSpec data to pivot. - * - * @param int $id - * @access public - * @return object|bool - */ - protected function mergePivotSpecData($pivots, $isObject = true) - { - if($isObject) $pivots = array($pivots); - $pivotIDList = array_column($pivots, 'id'); - - $pivotSpecs = $this->dao->select('t2.*')->from(TABLE_PIVOT)->alias('t1') - ->leftJoin(TABLE_PIVOTSPEC)->alias('t2')->on('t1.id = t2.pivot and t1.version = t2.version') - ->where('t1.id')->in($pivotIDList) - ->fetchAll('pivot'); - - foreach($pivots as $index => $pivot) - { - if(!isset($pivotSpecs[$pivot->id])) continue; - - foreach($pivotSpecs[$pivot->id] as $specKey => $specValue) $pivot->$specKey = $specValue; - $pivots[$index] = $pivot; - } - - return $isObject ? current($pivots) : $pivots; + return $this->dao->select('t1.*, t2.*')->from(TABLE_PIVOT)->alias('t1') + ->leftJoin(TABLE_PIVOTSPEC)->alias('t2')->on('t1.id=t2.pivot and t1.version=t2.version') + ->where('t1.id')->eq($id) + ->andWhere('t1.deleted')->eq('0') + ->fetch(); } /** @@ -472,10 +444,11 @@ EOT)->from(TABLE_TASK)->alias('t1') */ protected function getAllPivotByGroupID(int $groupID): array { - return $this->dao->select('*')->from(TABLE_PIVOT) - ->where("FIND_IN_SET({$groupID}, `group`)") - ->andWhere('stage')->ne('draft') - ->andWhere('deleted')->eq('0') + return $this->dao->select('t1.*, t2.*')->from(TABLE_PIVOT)->alias('t1') + ->leftJoin(TABLE_PIVOTSPEC)->alias('t2')->on('t1.id=t2.pivot and t1.version=t2.version') + ->where("FIND_IN_SET({$groupID}, t1.`group`)") + ->andWhere('t1.stage')->ne('draft') + ->andWhere('t1.deleted')->eq('0') ->orderBy('id_desc') ->fetchAll(); } From 4f2b237918dc847012e9b8964153297fea539f6e Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 15:07:32 +0800 Subject: [PATCH 109/431] * [task#133002,doing,0.1h] add tips of no versions. --- module/pivot/control.php | 5 ++++- module/pivot/lang/de.php | 1 + module/pivot/lang/en.php | 1 + module/pivot/lang/fr.php | 1 + module/pivot/lang/zh-cn.php | 1 + 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/module/pivot/control.php b/module/pivot/control.php index 62178aa6f4..3f4236bcf3 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -79,10 +79,13 @@ class pivot extends control */ public function versions(int $groupID, int $pivotID, string $version = 'newest') { + $versionSpecs = $this->pivot->getPivotVersions($pivotID); + if(empty($versionSpecs)) $this->sendError($this->lang->pivot->tipNoVersions); + $pivot = $this->pivot->getByID($pivotID); $this->pivotZen->show($groupID, $pivotID, '', $version); - $this->view->versionSpecs = $this->pivot->getPivotVersions($pivotID); + $this->view->versionSpecs = $versionSpecs; $this->view->version = $version == 'newest' ? $this->pivot->getMaxVersion($pivotID) : $version; $this->view->pivot = $pivot; $this->view->groupID = $groupID; diff --git a/module/pivot/lang/de.php b/module/pivot/lang/de.php index 68e62db69d..35d03c8175 100644 --- a/module/pivot/lang/de.php +++ b/module/pivot/lang/de.php @@ -500,3 +500,4 @@ $lang->pivot->versionDesc = 'Desc'; $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; $lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; +$lang->pivot->tipNoVersions = 'There are no other versions of this pivot'; diff --git a/module/pivot/lang/en.php b/module/pivot/lang/en.php index a89f8d7f9b..e60d93ecc7 100644 --- a/module/pivot/lang/en.php +++ b/module/pivot/lang/en.php @@ -500,3 +500,4 @@ $lang->pivot->versionDesc = 'Desc'; $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; $lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; +$lang->pivot->tipNoVersions = 'There are no other versions of this pivot'; diff --git a/module/pivot/lang/fr.php b/module/pivot/lang/fr.php index 3497ff9cbc..dbf6b6a3f5 100644 --- a/module/pivot/lang/fr.php +++ b/module/pivot/lang/fr.php @@ -500,3 +500,4 @@ $lang->pivot->versionDesc = 'Desc'; $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; $lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; +$lang->pivot->tipNoVersions = 'There are no other versions of this pivot'; diff --git a/module/pivot/lang/zh-cn.php b/module/pivot/lang/zh-cn.php index 009946954f..9d795b0f3f 100644 --- a/module/pivot/lang/zh-cn.php +++ b/module/pivot/lang/zh-cn.php @@ -500,3 +500,4 @@ $lang->pivot->versionDesc = '版本描述'; $lang->pivot->tipNewVersion = '有新版本更新'; $lang->pivot->checkNewVersion = '点击查看'; $lang->pivot->tipVersions = '此版本的内容如下所示,您可以点击下方按钮进行版本切换。切换版本后,此透视表内容以及进入设计后的设计器内相关配置,均会按照切换的版本展示。'; +$lang->pivot->tipNoVersions = '该透视表没有其他版本'; From 194ec86d85cf4bdfd99e87d5d976f5079f553121 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Fri, 22 Nov 2024 15:38:15 +0800 Subject: [PATCH 110/431] * [task#133003,done,0.1h] adjust lang. --- module/pivot/lang/de.php | 2 +- module/pivot/lang/en.php | 2 +- module/pivot/lang/fr.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/pivot/lang/de.php b/module/pivot/lang/de.php index 35d03c8175..3405d14565 100644 --- a/module/pivot/lang/de.php +++ b/module/pivot/lang/de.php @@ -499,5 +499,5 @@ $lang->pivot->versionNumber = 'Version'; $lang->pivot->versionDesc = 'Desc'; $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; -$lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; +$lang->pivot->tipVersions = 'This is the content of this version. You can click the button below to switch version, After switching version, the content of this pivot and related configurations in the designer will be displayed according to the switched version.'; $lang->pivot->tipNoVersions = 'There are no other versions of this pivot'; diff --git a/module/pivot/lang/en.php b/module/pivot/lang/en.php index e60d93ecc7..2257de1c25 100644 --- a/module/pivot/lang/en.php +++ b/module/pivot/lang/en.php @@ -499,5 +499,5 @@ $lang->pivot->versionNumber = 'Version'; $lang->pivot->versionDesc = 'Desc'; $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; -$lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; +$lang->pivot->tipVersions = 'This is the content of this version. You can click the button below to switch version, After switching version, the content of this pivot and related configurations in the designer will be displayed according to the switched version.'; $lang->pivot->tipNoVersions = 'There are no other versions of this pivot'; diff --git a/module/pivot/lang/fr.php b/module/pivot/lang/fr.php index dbf6b6a3f5..dd8cfe353e 100644 --- a/module/pivot/lang/fr.php +++ b/module/pivot/lang/fr.php @@ -499,5 +499,5 @@ $lang->pivot->versionNumber = 'Version'; $lang->pivot->versionDesc = 'Desc'; $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; -$lang->pivot->tipVersions = 'You can click the button below to switch version. After switch version, the content of this pivot table and the configurations will be displayed according to the switched version.'; +$lang->pivot->tipVersions = 'This is the content of this version. You can click the button below to switch version, After switching version, the content of this pivot and related configurations in the designer will be displayed according to the switched version.'; $lang->pivot->tipNoVersions = 'There are no other versions of this pivot'; From 46658db9cab17d84d741f53eae7b042f3a303b85 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Mon, 25 Nov 2024 09:35:03 +0800 Subject: [PATCH 111/431] * [task#133003,done,0.1h] fix conflict. --- module/pivot/model.php | 3 +-- module/pivot/tao.php | 28 ++++++++++++++++++++++------ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/module/pivot/model.php b/module/pivot/model.php index ae58fa2e6b..5f343afa06 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -115,9 +115,8 @@ class pivotModel extends model */ public function getPivotSpec(int $pivotID, string $version, bool $processDateVar = false, bool $addDrills = true) { - $pivot = $this->dao->select('*')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($pivotID)->andWhere('version')->eq($version)->fetch(); + $pivot = $this->pivotTao->fetchPivot($pivotID, $version); if(!$pivot) return false; - $pivot->id = $pivot->pivot; $pivot->fieldSettings = array(); if(!empty($pivot->fields) && $pivot->fields != 'null') diff --git a/module/pivot/tao.php b/module/pivot/tao.php index 6b80a3a146..79263aad71 100644 --- a/module/pivot/tao.php +++ b/module/pivot/tao.php @@ -6,17 +6,33 @@ class pivotTao extends pivotModel * 获取透视表。 * Fetch pivot by id. * - * @param int $id + * @param int $id + * @param string|null $version * @access public * @return object|bool */ - protected function fetchPivot(int $id): object|bool + protected function fetchPivot(int $id, string|null $version = null): object|bool { - return $this->dao->select('t1.*, t2.*')->from(TABLE_PIVOT)->alias('t1') - ->leftJoin(TABLE_PIVOTSPEC)->alias('t2')->on('t1.id=t2.pivot and t1.version=t2.version') - ->where('t1.id')->eq($id) - ->andWhere('t1.deleted')->eq('0') + if(is_null($version)) + { + return $this->dao->select('t1.*, t2.*')->from(TABLE_PIVOT)->alias('t1') + ->leftJoin(TABLE_PIVOTSPEC)->alias('t2')->on('t1.id=t2.pivot and t1.version=t2.version') + ->where('t1.id')->eq($id) + ->andWhere('t1.deleted')->eq('0') + ->fetch(); + } + + $pivot = $this->dao->select('*')->from(TABLE_PIVOT)->where('id')->eq($id)->andWhere('deleted')->eq('0')->fetch(); + if(!$pivot) return false; + + $specData = $this->dao->select('*')->from(TABLE_PIVOTSPEC) + ->where('pivot')->eq($id) + ->andWhere('version')->eq($version) ->fetch(); + if(!$specData) return $pivot; + + foreach($specData as $specKey => $specValue) $pivot->$specKey = $specValue; + return $pivot; } /** From 97db3b7caae12a03e3a5472f0d11434c2316e946 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Mon, 25 Nov 2024 09:59:28 +0800 Subject: [PATCH 112/431] * [task#132861,doing,0.2h] adjust system actions. --- module/system/control.php | 4 +--- module/system/model.php | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/module/system/control.php b/module/system/control.php index df5f1ed08d..747ceb1735 100644 --- a/module/system/control.php +++ b/module/system/control.php @@ -589,10 +589,9 @@ class system extends control ->setIF($integrated == '0', 'children', '') ->get(); - $systemID = $this->system->create($formData); + $this->system->create($formData); if(dao::isError()) return $this->sendError(dao::getError()); - if($systemID) $this->loadModel('action')->create('system', $systemID, 'created'); $this->sendSuccess(array('load' => true)); } @@ -626,7 +625,6 @@ class system extends control $this->system->update($id, $formData); if(dao::isError()) return $this->sendError(dao::getError()); - $this->loadModel('action')->create('system', $id, 'edited'); $this->sendSuccess(array('load' => true)); } diff --git a/module/system/model.php b/module/system/model.php index b54e6c2629..e8b8a62ded 100644 --- a/module/system/model.php +++ b/module/system/model.php @@ -55,6 +55,22 @@ class systemModel extends model ->fetchPairs('id', 'name'); } + /** + * 根据ID列表获取应用。 + * Get apps by id list. + * + * @param array $idList + * @access public + * @return array + */ + public function getByIdList(array $idList): array + { + return $this->dao->select('*')->from(TABLE_SYSTEM) + ->where('deleted')->eq('0') + ->andWhere('id')->in($idList) + ->fetchAll('id'); + } + /** * 创建应用。 * Create an app. @@ -70,9 +86,19 @@ class systemModel extends model ->batchCheck($this->config->system->create->requiredFields, 'notempty') ->autoCheck() ->exec(); + if(dao::isError()) + { + if($this->app->rawModule != 'system' && !empty(dao::$errors['name'])) + { + dao::$errors['systemName'] = dao::$errors['name']; + unset(dao::$errors['name']); + } + return false; + } - if(dao::isError()) return false; - return $this->dao->lastInsertID(); + $systemID = $this->dao->lastInsertID(); + $this->loadModel('action')->create('system', $systemID, 'created'); + return $systemID; } /** @@ -92,6 +118,9 @@ class systemModel extends model ->beginIF($checkRequired)->batchCheck($this->config->system->edit->requiredFields, 'notempty')->fi() ->where('id')->eq($id) ->exec(); + if(dao::isError()) return false; + + $this->loadModel('action')->create('system', $id, 'edited'); return !dao::isError(); } From 69c66eeae9752186d338ca3b959319c761d5a631 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Mon, 25 Nov 2024 10:04:45 +0800 Subject: [PATCH 113/431] * [task#133002,doing,0.3h] fix error. --- module/pivot/tao.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/module/pivot/tao.php b/module/pivot/tao.php index 79263aad71..3b5c3ab259 100644 --- a/module/pivot/tao.php +++ b/module/pivot/tao.php @@ -13,21 +13,13 @@ class pivotTao extends pivotModel */ protected function fetchPivot(int $id, string|null $version = null): object|bool { - if(is_null($version)) - { - return $this->dao->select('t1.*, t2.*')->from(TABLE_PIVOT)->alias('t1') - ->leftJoin(TABLE_PIVOTSPEC)->alias('t2')->on('t1.id=t2.pivot and t1.version=t2.version') - ->where('t1.id')->eq($id) - ->andWhere('t1.deleted')->eq('0') - ->fetch(); - } - $pivot = $this->dao->select('*')->from(TABLE_PIVOT)->where('id')->eq($id)->andWhere('deleted')->eq('0')->fetch(); if(!$pivot) return false; $specData = $this->dao->select('*')->from(TABLE_PIVOTSPEC) ->where('pivot')->eq($id) - ->andWhere('version')->eq($version) + ->beginIF(is_null($version))->andWhere('version')->eq($pivot->version)->fi() + ->beginIF(!is_null($version))->andWhere('version')->eq($version)->fi() ->fetch(); if(!$specData) return $pivot; From 081ad4dcd6bfa76a37ac7b11b3ed8258b7249a27 Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 10:09:27 +0800 Subject: [PATCH 114/431] * [task#132865] add system config in create build. --- module/build/config/form.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/build/config/form.php b/module/build/config/form.php index 2b52b4f6c7..f2f1cceaca 100644 --- a/module/build/config/form.php +++ b/module/build/config/form.php @@ -6,6 +6,7 @@ $now = helper::now(); $config->build->form->create['project'] = array('type' => 'int', 'required' => false, 'default' => 0); $config->build->form->create['execution'] = array('type' => 'int', 'required' => $app->tab == 'execution', 'default' => 0); $config->build->form->create['product'] = array('type' => 'int', 'required' => false, 'default' => 0); +$config->build->form->create['system'] = array('type' => 'int', 'required' => false, 'default' => 0); $config->build->form->create['scmPath'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->build->form->create['filePath'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->build->form->create['desc'] = array('type' => 'string', 'required' => false, 'default' => '', 'control' => 'editor'); From 134574fd225e86e2d5518e99955f9b6330a9b663 Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 10:10:43 +0800 Subject: [PATCH 115/431] * [task#132865] add ajax get system method. --- module/build/control.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/module/build/control.php b/module/build/control.php index 17621d6dc4..1174b40d03 100644 --- a/module/build/control.php +++ b/module/build/control.php @@ -685,4 +685,23 @@ class build extends control if($this->post->bugIdList) $this->build->batchUnlinkBug($buildID, $this->post->bugIdList); return $this->sendSuccess(array('load' => $this->createLink($this->app->rawModule, 'view', "buildID=$buildID&type=bug"))); } + + /** + * 根据选择的产品获取应用列表。 + * Get system list by product. + * + * @param int $productID + * @access public + * @return string + */ + public function ajaxGetSystemList(int $productID) + { + $systemList = $this->loadModel('system')->getPairs($productID, '0'); + if(empty($systemList)) return ''; + + $system = array(); + foreach($systemList as $systemID => $systemName) $system[] = array('text' => $systemName, 'value' => $systemID); + + echo json_encode($system); + } } From 0586a388dfed4447af8b43dd8f8342204e74e273 Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 10:13:07 +0800 Subject: [PATCH 116/431] * [task#132865] add system in buid create form data. --- module/build/zen.php | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/module/build/zen.php b/module/build/zen.php index d444bfb7a2..1ef9d6a57e 100644 --- a/module/build/zen.php +++ b/module/build/zen.php @@ -237,8 +237,32 @@ class buildZen extends build */ public function buildBuildForCreate() { + $newSystem = $this->post->newSystem; + if($this->post->isIntegrated == 'yes') $this->config->build->create->requiredFields = str_replace(',execution,', ',', ',' . $this->config->build->create->requiredFields . ','); - return form::data($this->config->build->form->create)->setDefault('createdBy', $this->app->user->account)->get(); + + if(!$newSystem && !$this->post->system) $this->config->build->form->create['system']['required'] = true; + if($newSystem && !$this->post->systemName) + { + $this->config->build->form->create['systemName'] = array('type' => 'string', 'required' => true); + $this->lang->build->systemName = $this->lang->build->system; + } + if($newSystem && $this->post->systemName) + { + $system = new stdclass(); + $system->name = $this->post->systemName; + $system->product = $this->post->product; + $system->createdBy = $this->app->user->account; + $system->createdDate = helper::now(); + + $buildSystem = $this->loadModel('system')->create($system); + } + $formData = form::data($this->config->build->form->create) + ->setDefault('createdBy', $this->app->user->account) + ->setIF(isset($buildSystem), 'system', $buildSystem) + ->get(); + + return $formData; } /** From 8de431d3254bcdc8bbc2dd6f016ad6701463256c Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 10:17:06 +0800 Subject: [PATCH 117/431] * [task#132865] add load system js mehod. --- module/build/js/common.ui.js | 16 ++++++++++++++++ module/build/js/create.ui.js | 3 +++ 2 files changed, 19 insertions(+) diff --git a/module/build/js/common.ui.js b/module/build/js/common.ui.js index e4d67b3b5f..4930cc3bad 100644 --- a/module/build/js/common.ui.js +++ b/module/build/js/common.ui.js @@ -31,6 +31,22 @@ window.loadBranches = function(productID) }, 'json'); } +window.loadSystem = function(productID) +{ + productID = parseInt(productID); + if(!productID) productID = $('input[name=product]').val(); + if(typeof(productID) == "undefined") return; + + $.get($.createLink('build', 'ajaxGetSystemList', 'productID=' + productID), function(data) + { + if(data) + { + const $systemPicker = $('[name=system]').zui('picker'); + $systemPicker.render({items: data}); + } + }, 'json'); +} + window.setSystemBox = function(e) { const newSystem = $(e.target).is(':checked') ? 1 : 0; diff --git a/module/build/js/create.ui.js b/module/build/js/create.ui.js index 5d13fe1be0..a75cdeacde 100644 --- a/module/build/js/create.ui.js +++ b/module/build/js/create.ui.js @@ -63,6 +63,7 @@ $().ready(function() } }); loadBranches(); + loadSystem(); if(multipleProject) { window.waitDom('[name=execution]', function() @@ -99,6 +100,7 @@ function loadProducts(executionID) $('select[name^=builds]').attr('data-placeholder', multipleSelect); loadBranches(productID); + loadSystem(productID); } else { @@ -109,6 +111,7 @@ function loadProducts(executionID) }); loadLastBuild(); + loadSystem(); } /** From af39144caa484eb729e518392ec3ccc470394983 Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 10:17:28 +0800 Subject: [PATCH 118/431] * [task#132865] add system field on build page. --- module/build/ui/create.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/build/ui/create.html.php b/module/build/ui/create.html.php index f1f2d6afc2..b7380d740e 100644 --- a/module/build/ui/create.html.php +++ b/module/build/ui/create.html.php @@ -147,7 +147,7 @@ formPanel ( set::name('system'), set::required(true), - set::items($apps) + set::items(array()) ), input(set::name('systemName'), setClass('hidden')) ), From 3ac2dc83160ffedbf19496566911356928a0f73b Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 25 Nov 2024 10:20:41 +0800 Subject: [PATCH 119/431] * [task#132865] add system field on build page. --- module/build/config/form.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/build/config/form.php b/module/build/config/form.php index f2f1cceaca..f9dcc71de6 100644 --- a/module/build/config/form.php +++ b/module/build/config/form.php @@ -6,7 +6,7 @@ $now = helper::now(); $config->build->form->create['project'] = array('type' => 'int', 'required' => false, 'default' => 0); $config->build->form->create['execution'] = array('type' => 'int', 'required' => $app->tab == 'execution', 'default' => 0); $config->build->form->create['product'] = array('type' => 'int', 'required' => false, 'default' => 0); -$config->build->form->create['system'] = array('type' => 'int', 'required' => false, 'default' => 0); +$config->build->form->create['system'] = array('type' => 'int', 'required' => false, 'default' => 0); $config->build->form->create['scmPath'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->build->form->create['filePath'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->build->form->create['desc'] = array('type' => 'string', 'required' => false, 'default' => '', 'control' => 'editor'); From 46c379a52c9687542736a04a3a25ceb9371e9795 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Mon, 25 Nov 2024 10:30:35 +0800 Subject: [PATCH 120/431] Revert " * [task#133009,done,1h] Optimize codes." This reverts commit 191e3758957a48607c5b1aaa6d6c4182a34cf2eb. --- module/pivot/tao.php | 49 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/module/pivot/tao.php b/module/pivot/tao.php index 3b5c3ab259..38adb5a0bd 100644 --- a/module/pivot/tao.php +++ b/module/pivot/tao.php @@ -16,17 +16,45 @@ class pivotTao extends pivotModel $pivot = $this->dao->select('*')->from(TABLE_PIVOT)->where('id')->eq($id)->andWhere('deleted')->eq('0')->fetch(); if(!$pivot) return false; - $specData = $this->dao->select('*')->from(TABLE_PIVOTSPEC) - ->where('pivot')->eq($id) - ->beginIF(is_null($version))->andWhere('version')->eq($pivot->version)->fi() - ->beginIF(!is_null($version))->andWhere('version')->eq($version)->fi() - ->fetch(); + if(is_null($version)) return $this->mergePivotSpecData($pivot); + + $specData = $this->dao->select('*')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($id)->andWhere('version')->eq($version)->fetch(); if(!$specData) return $pivot; foreach($specData as $specKey => $specValue) $pivot->$specKey = $specValue; return $pivot; } + /** + * 合并 pivotSpec 的数据。 + * Merge pivotSpec data to pivot. + * + * @param int $id + * @param bool $isObject + * @access public + * @return object|bool + */ + protected function mergePivotSpecData($pivots, $isObject = true) + { + if($isObject) $pivots = array($pivots); + $pivotIDList = array_column($pivots, 'id'); + + $pivotSpecs = $this->dao->select('t2.*')->from(TABLE_PIVOT)->alias('t1') + ->leftJoin(TABLE_PIVOTSPEC)->alias('t2')->on('t1.id = t2.pivot and t1.version = t2.version') + ->where('t1.id')->in($pivotIDList) + ->fetchAll('pivot'); + + foreach($pivots as $index => $pivot) + { + if(!isset($pivotSpecs[$pivot->id])) continue; + + foreach($pivotSpecs[$pivot->id] as $specKey => $specValue) $pivot->$specKey = $specValue; + $pivots[$index] = $pivot; + } + + return $isObject ? current($pivots) : $pivots; + } + /** * 获取产品列表。 * Get product list. @@ -452,13 +480,14 @@ EOT)->from(TABLE_TASK)->alias('t1') */ protected function getAllPivotByGroupID(int $groupID): array { - return $this->dao->select('t1.*, t2.*')->from(TABLE_PIVOT)->alias('t1') - ->leftJoin(TABLE_PIVOTSPEC)->alias('t2')->on('t1.id=t2.pivot and t1.version=t2.version') - ->where("FIND_IN_SET({$groupID}, t1.`group`)") - ->andWhere('t1.stage')->ne('draft') - ->andWhere('t1.deleted')->eq('0') + $pivots = $this->dao->select('*')->from(TABLE_PIVOT) + ->where("FIND_IN_SET({$groupID}, `group`)") + ->andWhere('stage')->ne('draft') + ->andWhere('deleted')->eq('0') ->orderBy('id_desc') ->fetchAll(); + + return $this->mergePivotSpecData($pivots); } /** From 4920e2e0cd876bb16a84487dd90e550cc3641a9d Mon Sep 17 00:00:00 2001 From: lihuifang Date: Mon, 25 Nov 2024 10:40:42 +0800 Subject: [PATCH 121/431] +[task#133058,doing,0.5h,2h] Add ztf notes. --- module/projectstory/test/ui/linkstory.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 module/projectstory/test/ui/linkstory.php diff --git a/module/projectstory/test/ui/linkstory.php b/module/projectstory/test/ui/linkstory.php new file mode 100755 index 0000000000..898f75642f --- /dev/null +++ b/module/projectstory/test/ui/linkstory.php @@ -0,0 +1,20 @@ +#!/usr/bin/env php +id->range('1'); From 47ec0314acc73512c1bcd08cd8561be411aae0c2 Mon Sep 17 00:00:00 2001 From: lihuifang Date: Mon, 25 Nov 2024 10:41:23 +0800 Subject: [PATCH 122/431] +[task#133058,doing,1h,1.5h] Add project testdata. --- module/projectstory/test/ui/linkstory.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/projectstory/test/ui/linkstory.php b/module/projectstory/test/ui/linkstory.php index 898f75642f..2e33cfa80f 100755 --- a/module/projectstory/test/ui/linkstory.php +++ b/module/projectstory/test/ui/linkstory.php @@ -18,3 +18,23 @@ include '../lib/linkstory.ui.class.php'; $product = zenData('product'); $product->id->range('1'); +$product->name->range('产品1'); +$product->type->range('normal'); +$product->gen(1); + +$project = zenData('project'); +$project->id->range('1'); +$project->project->range('0'); +$project->model->range('scrum'); +$project->type->range('project'); +$project->auth->range('extend'); +$project->storytype->range('`story,epic,requirement`'); +$project->path->range('`,1,`'); +$project->grade->range('1'); +$project->name->range('项目1'); +$project->hasProduct->range('1'); +$project->status->range('wait'); +$project->acl->range('open'); +$project->gen(1); + +$projectProduct = zenData('projectproduct'); From 4ff6c526188b72a7087ad802baa3144907368082 Mon Sep 17 00:00:00 2001 From: lihuifang Date: Mon, 25 Nov 2024 10:42:34 +0800 Subject: [PATCH 123/431] +[task#133058,doing,1h,1.5h] Add story testdata. --- module/projectstory/test/ui/linkstory.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/projectstory/test/ui/linkstory.php b/module/projectstory/test/ui/linkstory.php index 2e33cfa80f..c5c629414e 100755 --- a/module/projectstory/test/ui/linkstory.php +++ b/module/projectstory/test/ui/linkstory.php @@ -38,3 +38,23 @@ $project->acl->range('open'); $project->gen(1); $projectProduct = zenData('projectproduct'); +$projectProduct->project->range('1'); +$projectProduct->product->range('1'); +$projectProduct->gen(1); + +$story = zenData('story'); +$story->id->range('1-5'); +$story->parent->range('0'); +$story->isParent->range('0'); +$story->root->range('1-5'); +$story->path->range('`,1,`, `,2,`, `,3,`, `,4,`, `,5,`'); +$story->grade->range('1'); +$story->product->range('1'); +$story->module->range('0'); +$story->plan->range('0'); +$story->title->range('需求001,需求002,需求003,需求004,需求005'); +$story->type->range('story'); +$story->estimate->range('0'); +$story->status->range('active{2}, reviewing{1}, draft{1}, changing{1}'); +$story->stage->range('wait'); +$story->assignedTo->range('[]'); From 04f556ff1a664df7d5d86c91188836d833a26c4f Mon Sep 17 00:00:00 2001 From: lihuifang Date: Mon, 25 Nov 2024 10:42:59 +0800 Subject: [PATCH 124/431] +[task#133058,doing,1h,1.5h] Add story testdata. --- module/projectstory/test/ui/linkstory.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/module/projectstory/test/ui/linkstory.php b/module/projectstory/test/ui/linkstory.php index c5c629414e..288ee98553 100755 --- a/module/projectstory/test/ui/linkstory.php +++ b/module/projectstory/test/ui/linkstory.php @@ -58,3 +58,21 @@ $story->estimate->range('0'); $story->status->range('active{2}, reviewing{1}, draft{1}, changing{1}'); $story->stage->range('wait'); $story->assignedTo->range('[]'); +$story->version->range('1'); +$story->gen(5); + +$storySpec = zenData('storyspec'); +$storySpec->story->range('1-5'); +$storySpec->version->range('1'); +$storySpec->title->range('1-5'); +$storySpec->gen(5); + +$projectStory = zenData('projectstory'); +$projectStory->product->range('1'); +$projectStory->branch->range('0'); +$projectStory->story->range('1-5'); +$projectStory->version->range('1'); +$projectStory->order->range('1'); +$projectStory->gen(5); + +$tester = new linkStoryTester(); From 6bf7e60113e6650979ee87ebd344def8c55b7a33 Mon Sep 17 00:00:00 2001 From: lihuifang Date: Mon, 25 Nov 2024 10:43:29 +0800 Subject: [PATCH 125/431] +[task#133058,doing,1.5h,1h] Add ui test file. --- module/projectstory/test/ui/linkstory.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/module/projectstory/test/ui/linkstory.php b/module/projectstory/test/ui/linkstory.php index 288ee98553..d7bcdc6275 100755 --- a/module/projectstory/test/ui/linkstory.php +++ b/module/projectstory/test/ui/linkstory.php @@ -76,3 +76,8 @@ $projectStory->order->range('1'); $projectStory->gen(5); $tester = new linkStoryTester(); +$tester->login(); + +r($tester->linkstory()) && p('status,message') && e('SUCCESS,关联需求成功'); //正常关联需求 + +$tester->closeBrowser(); From cb161f9798ba33a328893eb3026ed9b3a8f34c43 Mon Sep 17 00:00:00 2001 From: lihuifang Date: Mon, 25 Nov 2024 10:44:32 +0800 Subject: [PATCH 126/431] +[task#133058,doing,2h,0.5h] Add element of linkstory. --- module/projectstory/test/ui/page/story.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/module/projectstory/test/ui/page/story.php b/module/projectstory/test/ui/page/story.php index 3360c41ccb..b92c522b98 100755 --- a/module/projectstory/test/ui/page/story.php +++ b/module/projectstory/test/ui/page/story.php @@ -16,11 +16,18 @@ class storyPage extends page 'linkedExecutionTab' => "//*[@id='more']/menu/menu/li[2]/a/div/div", 'unlinkedExecutionTab' => "//*[@id='more']/menu/menu/li[3]/a/div/div", 'num' => "//*[@id='stories_table']/div/div[3]/div[2]/strong[1]", + 'allTabNum' => "//*[@id='main']/div/div[1]/div[1]/menu/li[1]/a/span[2]", /* 导出 */ 'format' => "//*[@data-name='fileType']/div/div/span[1]", 'encoding' => "//*[@data-name='encode']/div/div/span[1]", 'data' => "//*[@data-name='exportType']/div/div/span[1]", - 'exportBtnAlert' => "//*[@class='modal-content']/div[3]/div/div/form/div[8]/div/div/button/span" + 'exportBtnAlert' => "//*[@class='modal-content']/div[3]/div/div/form/div[8]/div/div/button/span", + /* 关联需求 */ + 'allTabNum' => "//*[@id='main']/div/div[1]/div[1]/menu/li[1]/a/span[2]", + 'linkStoryBtn' => "//*[@id='actionBar']/div[3]/a/span", + 'searchBtn' => "//*[@class='btn primary']", + 'selectAllStory' => "//*[@id='table-projectstory-linkstory']/div[3]/div/div/label", + 'saveBtn' => "//*[@id='table-projectstory-linkstory']/div[3]/nav/button/span" ); $this->dom->xpath = array_merge($this->dom->xpath, $xpath); } From ac5a629da33e473b20aab38a238add71cb5380aa Mon Sep 17 00:00:00 2001 From: lihuifang Date: Mon, 25 Nov 2024 10:45:37 +0800 Subject: [PATCH 127/431] +[task#133058,done,2.2h,0.3h] Add testui function of linkstory. --- .../test/lib/linkstory.ui.class.php | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 module/projectstory/test/lib/linkstory.ui.class.php diff --git a/module/projectstory/test/lib/linkstory.ui.class.php b/module/projectstory/test/lib/linkstory.ui.class.php new file mode 100755 index 0000000000..9316988c36 --- /dev/null +++ b/module/projectstory/test/lib/linkstory.ui.class.php @@ -0,0 +1,20 @@ +initForm('projectstory', 'story', array('project' => '1'), 'appIframe-project'); + $form->dom->allTab->click(); + $numBefore = $form->dom->allTabNum->getText(); + $form->dom->linkStoryBtn->click(); + $form->wait(2); + $form->dom->searchBtn->click(); + $form->dom->selectAllStory->click(); From 238cccf5cc01c711ac6be2e029198d63f9aa473b Mon Sep 17 00:00:00 2001 From: lihuifang Date: Mon, 25 Nov 2024 10:45:55 +0800 Subject: [PATCH 128/431] +[task#133058,done,2.5h,0h] Add testui function of linkstory. --- module/projectstory/test/lib/linkstory.ui.class.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/module/projectstory/test/lib/linkstory.ui.class.php b/module/projectstory/test/lib/linkstory.ui.class.php index 9316988c36..421e5e8715 100755 --- a/module/projectstory/test/lib/linkstory.ui.class.php +++ b/module/projectstory/test/lib/linkstory.ui.class.php @@ -18,3 +18,13 @@ class linkStoryTester extends tester $form->wait(2); $form->dom->searchBtn->click(); $form->dom->selectAllStory->click(); + $form->dom->saveBtn->click(); + $form->wait(2); + + $storyView = $this->loadPage('project', 'story'); + $storyView->dom->allTab->click(); + $storyView->wait(2); + if($storyView->dom->allTabNum->getText() !== $numBefore) return $this->success('关联需求成功'); + return $this->failed('关联需求失败'); + } +} From 35dbdef1514594cd6d960de37ea314cb7433b70f Mon Sep 17 00:00:00 2001 From: zhaixiaojian Date: Mon, 25 Nov 2024 10:10:38 +0800 Subject: [PATCH 129/431] [task#69672,done,2h,0h] Optimize deletion prompts and logic. --- module/instance/control.php | 4 +--- module/instance/lang/de.php | 4 ++-- module/instance/lang/en.php | 2 +- module/instance/lang/fr.php | 4 ++-- module/instance/lang/zh-cn.php | 2 +- module/instance/ui/backuplist.html.php | 3 +-- 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/module/instance/control.php b/module/instance/control.php index 4f698f65a0..40b1a9e582 100644 --- a/module/instance/control.php +++ b/module/instance/control.php @@ -667,9 +667,7 @@ class instance extends control $success = $this->instance->deleteBackup($instance, $backupName); if(!$success) return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'deleteFail'))); - $this->action->create('instance', $instance->id, 'manualdeletebackup', '', json_encode(array('result' => 'success'))); - $locate = $this->createLink('instance', 'view', 'id=' . $instanceID); - return $this->send(array('result' => 'success', 'load' => array('alert' => zget($this->lang->instance->notices, 'deleteSuccess'), 'locate' => $locate, 'closeModal' => true))); + return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'deleteSuccess'), 'load' => $this->createLink('instance', 'view', 'id=' . $instanceID))); } } diff --git a/module/instance/lang/de.php b/module/instance/lang/de.php index fa85304569..a2c69001df 100644 --- a/module/instance/lang/de.php +++ b/module/instance/lang/de.php @@ -117,7 +117,7 @@ $lang->instance->backup->volSpentSeconds = 'Time taken (seconds)'; $lang->instance->backup->volSize = 'Size'; $lang->instance->backup->lastRestore = 'Last rollback'; $lang->instance->backup->restoreDate = 'Restore time'; -$lang->instance->backup->latestBackupAt = 'Last backup time'; +$lang->instance->backup->latestBackupAt = 'Last backup time'; $lang->instance->backup->backupBeforeRestore = 'We recommend that you backup before rolling back!'; $lang->instance->backup->enableAutoBackup = 'Enable automatic backup'; $lang->instance->backup->autoBackup = 'Automatic backup'; @@ -293,7 +293,7 @@ $lang->instance->notices['backupFail'] = 'Backup failed'; $lang->instance->notices['cleanBackupsSuccess'] = 'Backup cleanup successfuls'; $lang->instance->notices['restoreSuccess'] = 'The rollback task has been submitted'; $lang->instance->notices['restoreFail'] = 'Rollback failed'; -$lang->instance->notices['deleteSuccess'] = 'DeleteSuccess'; +$lang->instance->notices['deleteSuccess'] = 'The deletion task has been submitted'; $lang->instance->notices['deleteFail'] = 'Delete failed'; $lang->instance->notices['starting'] = 'Starting, please wait...'; $lang->instance->notices['stopping'] = 'Closing, please wait...'; diff --git a/module/instance/lang/en.php b/module/instance/lang/en.php index fc4815035c..a2c69001df 100644 --- a/module/instance/lang/en.php +++ b/module/instance/lang/en.php @@ -293,7 +293,7 @@ $lang->instance->notices['backupFail'] = 'Backup failed'; $lang->instance->notices['cleanBackupsSuccess'] = 'Backup cleanup successfuls'; $lang->instance->notices['restoreSuccess'] = 'The rollback task has been submitted'; $lang->instance->notices['restoreFail'] = 'Rollback failed'; -$lang->instance->notices['deleteSuccess'] = 'DeleteSuccess'; +$lang->instance->notices['deleteSuccess'] = 'The deletion task has been submitted'; $lang->instance->notices['deleteFail'] = 'Delete failed'; $lang->instance->notices['starting'] = 'Starting, please wait...'; $lang->instance->notices['stopping'] = 'Closing, please wait...'; diff --git a/module/instance/lang/fr.php b/module/instance/lang/fr.php index fa85304569..a2c69001df 100644 --- a/module/instance/lang/fr.php +++ b/module/instance/lang/fr.php @@ -117,7 +117,7 @@ $lang->instance->backup->volSpentSeconds = 'Time taken (seconds)'; $lang->instance->backup->volSize = 'Size'; $lang->instance->backup->lastRestore = 'Last rollback'; $lang->instance->backup->restoreDate = 'Restore time'; -$lang->instance->backup->latestBackupAt = 'Last backup time'; +$lang->instance->backup->latestBackupAt = 'Last backup time'; $lang->instance->backup->backupBeforeRestore = 'We recommend that you backup before rolling back!'; $lang->instance->backup->enableAutoBackup = 'Enable automatic backup'; $lang->instance->backup->autoBackup = 'Automatic backup'; @@ -293,7 +293,7 @@ $lang->instance->notices['backupFail'] = 'Backup failed'; $lang->instance->notices['cleanBackupsSuccess'] = 'Backup cleanup successfuls'; $lang->instance->notices['restoreSuccess'] = 'The rollback task has been submitted'; $lang->instance->notices['restoreFail'] = 'Rollback failed'; -$lang->instance->notices['deleteSuccess'] = 'DeleteSuccess'; +$lang->instance->notices['deleteSuccess'] = 'The deletion task has been submitted'; $lang->instance->notices['deleteFail'] = 'Delete failed'; $lang->instance->notices['starting'] = 'Starting, please wait...'; $lang->instance->notices['stopping'] = 'Closing, please wait...'; diff --git a/module/instance/lang/zh-cn.php b/module/instance/lang/zh-cn.php index fdcad8fde8..f5217b709b 100644 --- a/module/instance/lang/zh-cn.php +++ b/module/instance/lang/zh-cn.php @@ -297,7 +297,7 @@ $lang->instance->notices['backupFail'] = '备份失败'; $lang->instance->notices['cleanBackupsSuccess'] = '备份清理成功'; $lang->instance->notices['restoreSuccess'] = '还原任务已提交'; $lang->instance->notices['restoreFail'] = '还原失败'; -$lang->instance->notices['deleteSuccess'] = '删除成功'; +$lang->instance->notices['deleteSuccess'] = '删除任务已提交'; $lang->instance->notices['deleteFail'] = '删除失败'; $lang->instance->notices['starting'] = '启动中,请稍候...'; $lang->instance->notices['stopping'] = '关闭中,请稍候...'; diff --git a/module/instance/ui/backuplist.html.php b/module/instance/ui/backuplist.html.php index c9983bcfaf..c80fc7ff1c 100644 --- a/module/instance/ui/backuplist.html.php +++ b/module/instance/ui/backuplist.html.php @@ -45,10 +45,9 @@ foreach($backupList as &$backup) foreach($config->backup->dtable->fieldList['actions']['actionsMap'] as $actionType => $actionItems) { $backup->actions[$actionIdx]['name'] = $actionType; - $backup->actions[$actionIdx]['disabled'] = false; + $backup->actions[$actionIdx]['disabled'] = (!in_array($status, array('success', 'completed', 'deleting')) || (!empty($restoreStatus) && in_array($restoreStatus, array('pending', 'inprogress')))) ? true : false; $actionIdx++; } - if(!in_array($status, array('success', 'completed')) || in_array($restoreStatus, array('pending', 'inprogress'))) $backup->actions[0]['disabled'] = true; } dtable ( From 589bcafc3b11758b56aea9eb585c56f4925674f9 Mon Sep 17 00:00:00 2001 From: zhaixiaojian Date: Mon, 25 Nov 2024 10:30:01 +0800 Subject: [PATCH 130/431] * [task#133271,done,0.5h,0h] Delete App Sync Delete Schedule Task. --- module/instance/control.php | 4 ++++ module/instance/model.php | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/module/instance/control.php b/module/instance/control.php index 40b1a9e582..d1d0b88581 100644 --- a/module/instance/control.php +++ b/module/instance/control.php @@ -419,6 +419,10 @@ class instance extends control $success = $this->instance->uninstall($instance); $this->action->create('instance', $instance->id, 'uninstall', '', json_encode(array('result' => $success, 'app' => array('alias' => $instance->appName, 'app_version' => $instance->version)))); + + /* Synchronize deletion of backup tasks. */ + /* 同步删除备份任务。 */ + $this->instance->deleteBackupCron($instance); if($success) return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'uninstallSuccess'), 'load' => $this->createLink('space', 'browse'))); return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'uninstallFail'))); diff --git a/module/instance/model.php b/module/instance/model.php index f6199d9d8e..b1f282d139 100644 --- a/module/instance/model.php +++ b/module/instance/model.php @@ -1392,4 +1392,17 @@ class instanceModel extends model { return $this->cne->deleteBackup($instance, $backupName); } + + /** + * Delete Backup Cron. + * 删除备份任务. + * @param $instance + * @return void + */ + public function deleteBackupCron($instance) + { + $command = 'moduleName=instance&methodName=cronBackup&instanceID=' . $instance->id; + $cron = $this->dao->select('*')->from(TABLE_CRON)->where('command')->eq($command)->fetch(); + if($cron->id) $this->dao->delete()->from(TABLE_CRON)->where('id')->eq($cron->id)->exec(); + } } From 0c5059993c9277f8ae7dfd5ddaa20cda8b619d68 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Mon, 25 Nov 2024 10:49:59 +0800 Subject: [PATCH 131/431] * [task#133002,doing,0.5h] optimization pivot-versions. --- module/pivot/js/versions.ui.js | 2 +- module/pivot/lang/de.php | 1 + module/pivot/lang/en.php | 1 + module/pivot/lang/fr.php | 1 + module/pivot/lang/zh-cn.php | 1 + module/pivot/model.php | 22 +++++++++++++++++++--- module/pivot/ui/versions.html.php | 7 ++++--- 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/module/pivot/js/versions.ui.js b/module/pivot/js/versions.ui.js index ea8a3a89fc..f20257d885 100644 --- a/module/pivot/js/versions.ui.js +++ b/module/pivot/js/versions.ui.js @@ -1,4 +1,4 @@ -function switchVersion(e) +function previewVersion(e) { const groupID = $(e.target).attr('data-group'); const pivotID = $(e.target).attr('data-pivot'); diff --git a/module/pivot/lang/de.php b/module/pivot/lang/de.php index 3405d14565..cc8a819c3e 100644 --- a/module/pivot/lang/de.php +++ b/module/pivot/lang/de.php @@ -501,3 +501,4 @@ $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; $lang->pivot->tipVersions = 'This is the content of this version. You can click the button below to switch version, After switching version, the content of this pivot and related configurations in the designer will be displayed according to the switched version.'; $lang->pivot->tipNoVersions = 'There are no other versions of this pivot'; +$lang->pivot->switchTo = 'Switch To This Version'; diff --git a/module/pivot/lang/en.php b/module/pivot/lang/en.php index 2257de1c25..57f7c4f643 100644 --- a/module/pivot/lang/en.php +++ b/module/pivot/lang/en.php @@ -501,3 +501,4 @@ $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; $lang->pivot->tipVersions = 'This is the content of this version. You can click the button below to switch version, After switching version, the content of this pivot and related configurations in the designer will be displayed according to the switched version.'; $lang->pivot->tipNoVersions = 'There are no other versions of this pivot'; +$lang->pivot->switchTo = 'Switch To This Version'; diff --git a/module/pivot/lang/fr.php b/module/pivot/lang/fr.php index dd8cfe353e..553a97548e 100644 --- a/module/pivot/lang/fr.php +++ b/module/pivot/lang/fr.php @@ -501,3 +501,4 @@ $lang->pivot->tipNewVersion = 'Has New Version!'; $lang->pivot->checkNewVersion = 'Click to check'; $lang->pivot->tipVersions = 'This is the content of this version. You can click the button below to switch version, After switching version, the content of this pivot and related configurations in the designer will be displayed according to the switched version.'; $lang->pivot->tipNoVersions = 'There are no other versions of this pivot'; +$lang->pivot->switchTo = 'Switch To This Version'; diff --git a/module/pivot/lang/zh-cn.php b/module/pivot/lang/zh-cn.php index 9d795b0f3f..99a1a3e5c4 100644 --- a/module/pivot/lang/zh-cn.php +++ b/module/pivot/lang/zh-cn.php @@ -501,3 +501,4 @@ $lang->pivot->tipNewVersion = '有新版本更新'; $lang->pivot->checkNewVersion = '点击查看'; $lang->pivot->tipVersions = '此版本的内容如下所示,您可以点击下方按钮进行版本切换。切换版本后,此透视表内容以及进入设计后的设计器内相关配置,均会按照切换的版本展示。'; $lang->pivot->tipNoVersions = '该透视表没有其他版本'; +$lang->pivot->switchTo = '切换到此版本'; diff --git a/module/pivot/model.php b/module/pivot/model.php index 5f343afa06..00513d4179 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -2860,11 +2860,27 @@ class pivotModel extends model * * @param int $pivotID * @access public - * @return array + * @return array|bool */ - public function getPivotVersions(int $pivotID): array + public function getPivotVersions(int $pivotID): array|bool { - return $this->dao->select('*')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($pivotID)->fetchAll(); + $pivot = $this->dao->select('*')->from(TABLE_PIVOT)->where('id')->eq($pivotID)->andWhere('deleted')->eq('0')->fetch(); + if(!$pivot) return false; + + $pivotSpecList = $this->dao->select('*')->from(TABLE_PIVOTSPEC)->where('pivot')->eq($pivotID)->fetchAll(); + if(!$pivotSpecList) return false; + + $pivotVersionList = array(); + foreach($pivotSpecList as $index => $specData) + { + $pivotVersion = clone $pivot; + foreach($specData as $specKey => $specValue) $pivotVersion->$specKey = $specValue; + $this->processNameDesc($pivotVersion); + + $pivotVersionList[] = $pivotVersion; + } + + return $pivotVersionList; } /** diff --git a/module/pivot/ui/versions.html.php b/module/pivot/ui/versions.html.php index 25ee99d1ce..bfd9199702 100644 --- a/module/pivot/ui/versions.html.php +++ b/module/pivot/ui/versions.html.php @@ -22,7 +22,7 @@ foreach($versionSpecs as $versionSpec) ( '#' . $versionSpec->version, set::href("javascript:;"), - on::click("switchVersion"), + on::click("previewVersion"), setData('pivot', $pivot->id), setData('version', $versionSpec->version), setData('group', $groupID) @@ -60,7 +60,7 @@ panel ), h::table ( - set::className('versionTable table bordered'), + set::className('versionTable table bordered table-hover'), h::tr ( h::th($lang->pivot->versionNumber), @@ -73,5 +73,6 @@ panel setID('pivotContent'), setClass('flex col gap-4 w-full'), $generateData() - ) + ), + set::actions(array(array('text' => $lang->pivot->switchTo, 'class' => 'primary', 'type' => 'submit'))) ); From 7d9c108a15f5f5f55b338e3010b361c4ab604f37 Mon Sep 17 00:00:00 2001 From: sunhao Date: Mon, 25 Nov 2024 13:35:05 +0800 Subject: [PATCH 132/431] * [misc] update zui3 lib. --- www/js/zui3/zui.zentao.css | 2 +- www/js/zui3/zui.zentao.js | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/www/js/zui3/zui.zentao.css b/www/js/zui3/zui.zentao.css index e68b547b85..b0561cefbe 100644 --- a/www/js/zui3/zui.zentao.css +++ b/www/js/zui3/zui.zentao.css @@ -1,2 +1,2 @@ /*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com*/*,:after,:before{border-color:rgb(var(--color-gray-200-rgb));border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:rgb(var(--color-gray-400-rgb));opacity:1}input::placeholder,textarea::placeholder{color:rgb(var(--color-gray-400-rgb));opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}:root{--screen-2xl:1720px;--color-gray-50:#fcfdfe;--color-gray-100:#eff1f3;--color-gray-200:#ebedf3;--color-gray-300:#d2d6e5;--color-gray-400:#b2b9c5;--color-gray-500:#64758b;--color-gray-600:#4a577f;--color-gray-700:#3d4667;--color-gray-800:#353d57;--color-gray-900:#30394a;--color-gray-950:#0b0f18;--color-gray-50-rgb:252,253,254;--color-gray-100-rgb:239,241,243;--color-gray-200-rgb:235,237,243;--color-gray-300-rgb:210,214,229;--color-gray-400-rgb:178,185,197;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:74,87,127;--color-gray-700-rgb:61,70,103;--color-gray-800-rgb:53,61,87;--color-gray-900-rgb:48,57,74;--color-gray-950-rgb:11,15,24;--color-primary-50:#eef6ff;--color-primary-100:#d9eaff;--color-primary-200:#bcdcff;--color-primary-300:#8ec6ff;--color-primary-400:#59a5ff;--color-primary-500:#3883fa;--color-primary-600:#2b67e5;--color-primary-700:#144ce1;--color-primary-800:#173db6;--color-primary-900:#19388f;--color-primary-950:#142457;--color-primary-50-rgb:238,246,255;--color-primary-100-rgb:217,234,255;--color-primary-200-rgb:188,220,255;--color-primary-300-rgb:142,198,255;--color-primary-400-rgb:89,165,255;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:43,103,229;--color-primary-700-rgb:20,76,225;--color-primary-800-rgb:23,61,182;--color-primary-900-rgb:25,56,143;--color-primary-950-rgb:20,36,87;--color-secondary-50:#e7f6ff;--color-secondary-100:#cdecff;--color-secondary-200:#9bd9ff;--color-secondary-300:#77cbff;--color-secondary-400:#60c2ff;--color-secondary-500:#37b2fe;--color-secondary-600:#18a6fd;--color-secondary-700:#1099ed;--color-secondary-800:#078ada;--color-secondary-900:#046bab;--color-secondary-950:#062a4b;--color-secondary-50-rgb:231,246,255;--color-secondary-100-rgb:205,236,255;--color-secondary-200-rgb:155,217,255;--color-secondary-300-rgb:119,203,255;--color-secondary-400-rgb:96,194,255;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:24,166,253;--color-secondary-700-rgb:16,153,237;--color-secondary-800-rgb:7,138,218;--color-secondary-900-rgb:4,107,171;--color-secondary-950-rgb:6,42,75;--color-success-50:#effaf6;--color-success-100:#d6f2e7;--color-success-200:#ade5ce;--color-success-300:#83d7b6;--color-success-400:#5aca9d;--color-success-500:#31bd85;--color-success-600:#2ba675;--color-success-700:#28996c;--color-success-800:#21805a;--color-success-900:#185e3b;--color-success-950:#0e3421;--color-success-50-rgb:239,250,246;--color-success-100-rgb:214,242,231;--color-success-200-rgb:173,229,206;--color-success-300-rgb:131,215,182;--color-success-400-rgb:90,202,157;--color-success-500-rgb:49,189,133;--color-success-600-rgb:43,166,117;--color-success-700-rgb:40,153,108;--color-success-800-rgb:33,128,90;--color-success-900-rgb:24,94,59;--color-success-950-rgb:14,52,33;--color-warning-50:#fff4ea;--color-warning-100:#ffecdb;--color-warning-200:#ffd2a9;--color-warning-300:#ffbc7e;--color-warning-400:#ffaf65;--color-warning-500:#ff9f46;--color-warning-600:#f38f19;--color-warning-700:#ed8307;--color-warning-800:#d17100;--color-warning-900:#af5f01;--color-warning-950:#441506;--color-warning-50-rgb:255,244,234;--color-warning-100-rgb:255,236,219;--color-warning-200-rgb:255,210,169;--color-warning-300-rgb:255,188,126;--color-warning-400-rgb:255,175,101;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:243,143,25;--color-warning-700-rgb:237,131,7;--color-warning-800-rgb:209,113,0;--color-warning-900-rgb:175,95,1;--color-warning-950-rgb:68,21,6;--color-danger-50:#ffebeb;--color-danger-100:#ffd5d5;--color-danger-200:#ffb1b1;--color-danger-300:#ff9292;--color-danger-400:#ff7c7c;--color-danger-500:#fc5959;--color-danger-600:#fb2b2b;--color-danger-700:#d91b1b;--color-danger-800:#ba1313;--color-danger-900:#a20606;--color-danger-950:#470808;--color-danger-50-rgb:255,235,235;--color-danger-100-rgb:255,213,213;--color-danger-200-rgb:255,177,177;--color-danger-300-rgb:255,146,146;--color-danger-400-rgb:255,124,124;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:251,43,43;--color-danger-700-rgb:217,27,27;--color-danger-800-rgb:186,19,19;--color-danger-900-rgb:162,6,6;--color-danger-950-rgb:71,8,8;--color-important-50:#fff8f5;--color-important-100:#ffe2d9;--color-important-200:#ffcebf;--color-important-300:#ffb29b;--color-important-400:#ff8c68;--color-important-500:#ff8058;--color-important-600:#ff6f42;--color-important-700:#ff4912;--color-important-800:#c83509;--color-important-900:#611700;--color-important-950:#440609;--color-important-50-rgb:255,248,245;--color-important-100-rgb:255,226,217;--color-important-200-rgb:255,206,191;--color-important-300-rgb:255,178,155;--color-important-400-rgb:255,140,104;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,111,66;--color-important-700-rgb:255,73,18;--color-important-800-rgb:200,53,9;--color-important-900-rgb:97,23,0;--color-important-950-rgb:68,6,9;--color-special-50:#efecfa;--color-special-100:#e4dff7;--color-special-200:#c4b6ff;--color-special-300:#a38cff;--color-special-400:#8a6ff5;--color-special-500:#8166ee;--color-special-600:#7055df;--color-special-700:#513baa;--color-special-800:#452da5;--color-special-900:#30216e;--color-special-950:#271560;--color-special-50-rgb:239,236,250;--color-special-100-rgb:228,223,247;--color-special-200-rgb:196,182,255;--color-special-300-rgb:163,140,255;--color-special-400-rgb:138,111,245;--color-special-500-rgb:129,102,238;--color-special-600-rgb:112,85,223;--color-special-700-rgb:81,59,170;--color-special-800-rgb:69,45,165;--color-special-900-rgb:48,33,110;--color-special-950-rgb:39,21,96;--color-inherit:inherit;--color-transparent:transparent;--color-current:currentColor;--color-black:#000;--color-white:#fff;--color-canvas:#fff;--color-canvas-light:#fff;--color-canvas-dark:#fcfdfe;--color-inverse:#000;--color-surface:#eff1f3;--color-surface-light:#fcfdfe;--color-surface-strong:#ebedf3;--color-fore:#30394a;--color-fore-in-light:#30394a;--color-fore-in-dark:#fff;--color-focus:#bcdcff;--color-link:#2b47a2;--color-link-hover:#144ce1;--color-link-visited:#6328a4;--color-link-active:#144ce1;--color-placeholder:#64758b;--color-border:#ebedf3;--color-border-strong:#d2d6e5;--color-border-light:#eff1f3;--color-black-rgb:0,0,0;--color-white-rgb:255,255,255;--color-canvas-rgb:255,255,255;--color-canvas-light-rgb:255,255,255;--color-canvas-dark-rgb:252,253,254;--color-inverse-rgb:0,0,0;--color-surface-rgb:239,241,243;--color-surface-light-rgb:252,253,254;--color-surface-strong-rgb:235,237,243;--color-fore-rgb:48,57,74;--color-fore-in-light-rgb:48,57,74;--color-fore-in-dark-rgb:255,255,255;--color-focus-rgb:188,220,255;--color-link-rgb:43,71,162;--color-link-hover-rgb:20,76,225;--color-link-visited-rgb:99,40,164;--color-link-active-rgb:20,76,225;--color-placeholder-rgb:100,117,139;--color-border-rgb:235,237,243;--color-border-strong-rgb:210,214,229;--color-border-light-rgb:239,241,243;--radius-none:0px;--radius-sm:0.0625rem;--radius:0.125rem;--radius-md:0.25rem;--radius-lg:0.375rem;--radius-xl:0.5rem;--radius-2xl:0.75rem;--radius-3xl:1rem;--radius-full:9999px;--shadow-sm:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--shadow-md:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--shadow-lg:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--shadow-xl:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--shadow-2xl:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--shadow-inner:inset 0 2px 4px 0 rgba(0,0,0,.05);--shadow-none:none;--space:0.25rem;--font-size-article:0.875rem;--font-size-root:16px;--font-size-page-lineHeight:1.5384615385}.dark{--color-gray-50:#0b0f18;--color-gray-100:#30394a;--color-gray-200:#353d57;--color-gray-300:#3d4667;--color-gray-400:#4a577f;--color-gray-500:#64758b;--color-gray-600:#b2b9c5;--color-gray-700:#d2d6e5;--color-gray-800:#ebedf3;--color-gray-900:#eff1f3;--color-gray-950:#fcfdfe;--color-gray-50-rgb:11,15,24;--color-gray-100-rgb:48,57,74;--color-gray-200-rgb:53,61,87;--color-gray-300-rgb:61,70,103;--color-gray-400-rgb:74,87,127;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:178,185,197;--color-gray-700-rgb:210,214,229;--color-gray-800-rgb:235,237,243;--color-gray-900-rgb:239,241,243;--color-gray-950-rgb:252,253,254;--color-primary-50:#142457;--color-primary-100:#19388f;--color-primary-200:#173db6;--color-primary-300:#144ce1;--color-primary-400:#2b67e5;--color-primary-500:#3883fa;--color-primary-600:#59a5ff;--color-primary-700:#8ec6ff;--color-primary-800:#bcdcff;--color-primary-900:#d9eaff;--color-primary-950:#eef6ff;--color-primary-50-rgb:20,36,87;--color-primary-100-rgb:25,56,143;--color-primary-200-rgb:23,61,182;--color-primary-300-rgb:20,76,225;--color-primary-400-rgb:43,103,229;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:89,165,255;--color-primary-700-rgb:142,198,255;--color-primary-800-rgb:188,220,255;--color-primary-900-rgb:217,234,255;--color-primary-950-rgb:238,246,255;--color-secondary-50:#062a4b;--color-secondary-100:#046bab;--color-secondary-200:#078ada;--color-secondary-300:#1099ed;--color-secondary-400:#18a6fd;--color-secondary-500:#37b2fe;--color-secondary-600:#60c2ff;--color-secondary-700:#77cbff;--color-secondary-800:#9bd9ff;--color-secondary-900:#cdecff;--color-secondary-950:#e7f6ff;--color-secondary-50-rgb:6,42,75;--color-secondary-100-rgb:4,107,171;--color-secondary-200-rgb:7,138,218;--color-secondary-300-rgb:16,153,237;--color-secondary-400-rgb:24,166,253;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:96,194,255;--color-secondary-700-rgb:119,203,255;--color-secondary-800-rgb:155,217,255;--color-secondary-900-rgb:205,236,255;--color-secondary-950-rgb:231,246,255;--color-success-50:#0e3421;--color-success-100:#185e3b;--color-success-200:#21805a;--color-success-300:#28996c;--color-success-400:#2ba675;--color-success-500:#31bd85;--color-success-600:#5aca9d;--color-success-700:#83d7b6;--color-success-800:#ade5ce;--color-success-900:#d6f2e7;--color-success-950:#effaf6;--color-success-50-rgb:14,52,33;--color-success-100-rgb:24,94,59;--color-success-200-rgb:33,128,90;--color-success-300-rgb:40,153,108;--color-success-400-rgb:43,166,117;--color-success-500-rgb:49,189,133;--color-success-600-rgb:90,202,157;--color-success-700-rgb:131,215,182;--color-success-800-rgb:173,229,206;--color-success-900-rgb:214,242,231;--color-success-950-rgb:239,250,246;--color-warning-50:#441506;--color-warning-100:#af5f01;--color-warning-200:#d17100;--color-warning-300:#ed8307;--color-warning-400:#f38f19;--color-warning-500:#ff9f46;--color-warning-600:#ffaf65;--color-warning-700:#ffbc7e;--color-warning-800:#ffd2a9;--color-warning-900:#ffecdb;--color-warning-950:#fff4ea;--color-warning-50-rgb:68,21,6;--color-warning-100-rgb:175,95,1;--color-warning-200-rgb:209,113,0;--color-warning-300-rgb:237,131,7;--color-warning-400-rgb:243,143,25;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:255,175,101;--color-warning-700-rgb:255,188,126;--color-warning-800-rgb:255,210,169;--color-warning-900-rgb:255,236,219;--color-warning-950-rgb:255,244,234;--color-danger-50:#470808;--color-danger-100:#a20606;--color-danger-200:#ba1313;--color-danger-300:#d91b1b;--color-danger-400:#fb2b2b;--color-danger-500:#fc5959;--color-danger-600:#ff7c7c;--color-danger-700:#ff9292;--color-danger-800:#ffb1b1;--color-danger-900:#ffd5d5;--color-danger-950:#ffebeb;--color-danger-50-rgb:71,8,8;--color-danger-100-rgb:162,6,6;--color-danger-200-rgb:186,19,19;--color-danger-300-rgb:217,27,27;--color-danger-400-rgb:251,43,43;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:255,124,124;--color-danger-700-rgb:255,146,146;--color-danger-800-rgb:255,177,177;--color-danger-900-rgb:255,213,213;--color-danger-950-rgb:255,235,235;--color-important-50:#440609;--color-important-100:#611700;--color-important-200:#c83509;--color-important-300:#ff4912;--color-important-400:#ff6f42;--color-important-500:#ff8058;--color-important-600:#ff8c68;--color-important-700:#ffb29b;--color-important-800:#ffcebf;--color-important-900:#ffe2d9;--color-important-950:#fff8f5;--color-important-50-rgb:68,6,9;--color-important-100-rgb:97,23,0;--color-important-200-rgb:200,53,9;--color-important-300-rgb:255,73,18;--color-important-400-rgb:255,111,66;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,140,104;--color-important-700-rgb:255,178,155;--color-important-800-rgb:255,206,191;--color-important-900-rgb:255,226,217;--color-important-950-rgb:255,248,245;--color-special-50:#271560;--color-special-100:#30216e;--color-special-200:#452da5;--color-special-300:#513baa;--color-special-400:#7055df;--color-special-500:#8166ee;--color-special-600:#8a6ff5;--color-special-700:#a38cff;--color-special-800:#c4b6ff;--color-special-900:#e4dff7;--color-special-950:#efecfa;--color-special-50-rgb:39,21,96;--color-special-100-rgb:48,33,110;--color-special-200-rgb:69,45,165;--color-special-300-rgb:81,59,170;--color-special-400-rgb:112,85,223;--color-special-500-rgb:129,102,238;--color-special-600-rgb:138,111,245;--color-special-700-rgb:163,140,255;--color-special-800-rgb:196,182,255;--color-special-900-rgb:228,223,247;--color-special-950-rgb:239,236,250;--color-canvas:#0b0f18;--color-inverse:#fff;--color-surface:#353d57;--color-surface-light:#30394a;--color-surface-strong:#3d4667;--color-fore:#ebedf3;--color-focus:#173db6;--color-link:#59a5ff;--color-link-hover:#3883fa;--color-link-visited:#bcdcff;--color-link-active:#bcdcff;--color-placeholder:#4a577f;--color-border:#353d57;--color-border-strong:#3d4667;--color-border-light:#30394a;--color-canvas-rgb:11,15,24;--color-inverse-rgb:255,255,255;--color-surface-rgb:53,61,87;--color-surface-light-rgb:48,57,74;--color-surface-strong-rgb:61,70,103;--color-fore-rgb:235,237,243;--color-focus-rgb:23,61,182;--color-link-rgb:89,165,255;--color-link-hover-rgb:56,131,250;--color-link-visited-rgb:188,220,255;--color-link-active-rgb:188,220,255;--color-placeholder-rgb:74,87,127;--color-border-rgb:53,61,87;--color-border-strong-rgb:61,70,103;--color-border-light-rgb:48,57,74}.light-in-dark{--color-gray-50:#fcfdfe;--color-gray-100:#eff1f3;--color-gray-200:#ebedf3;--color-gray-300:#d2d6e5;--color-gray-400:#b2b9c5;--color-gray-500:#64758b;--color-gray-600:#4a577f;--color-gray-700:#3d4667;--color-gray-800:#353d57;--color-gray-900:#30394a;--color-gray-950:#0b0f18;--color-gray-50-rgb:252,253,254;--color-gray-100-rgb:239,241,243;--color-gray-200-rgb:235,237,243;--color-gray-300-rgb:210,214,229;--color-gray-400-rgb:178,185,197;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:74,87,127;--color-gray-700-rgb:61,70,103;--color-gray-800-rgb:53,61,87;--color-gray-900-rgb:48,57,74;--color-gray-950-rgb:11,15,24;--color-primary-50:#eef6ff;--color-primary-100:#d9eaff;--color-primary-200:#bcdcff;--color-primary-300:#8ec6ff;--color-primary-400:#59a5ff;--color-primary-500:#3883fa;--color-primary-600:#2b67e5;--color-primary-700:#144ce1;--color-primary-800:#173db6;--color-primary-900:#19388f;--color-primary-950:#142457;--color-primary-50-rgb:238,246,255;--color-primary-100-rgb:217,234,255;--color-primary-200-rgb:188,220,255;--color-primary-300-rgb:142,198,255;--color-primary-400-rgb:89,165,255;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:43,103,229;--color-primary-700-rgb:20,76,225;--color-primary-800-rgb:23,61,182;--color-primary-900-rgb:25,56,143;--color-primary-950-rgb:20,36,87;--color-secondary-50:#e7f6ff;--color-secondary-100:#cdecff;--color-secondary-200:#9bd9ff;--color-secondary-300:#77cbff;--color-secondary-400:#60c2ff;--color-secondary-500:#37b2fe;--color-secondary-600:#18a6fd;--color-secondary-700:#1099ed;--color-secondary-800:#078ada;--color-secondary-900:#046bab;--color-secondary-950:#062a4b;--color-secondary-50-rgb:231,246,255;--color-secondary-100-rgb:205,236,255;--color-secondary-200-rgb:155,217,255;--color-secondary-300-rgb:119,203,255;--color-secondary-400-rgb:96,194,255;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:24,166,253;--color-secondary-700-rgb:16,153,237;--color-secondary-800-rgb:7,138,218;--color-secondary-900-rgb:4,107,171;--color-secondary-950-rgb:6,42,75;--color-success-50:#effaf6;--color-success-100:#d6f2e7;--color-success-200:#ade5ce;--color-success-300:#83d7b6;--color-success-400:#5aca9d;--color-success-500:#31bd85;--color-success-600:#2ba675;--color-success-700:#28996c;--color-success-800:#21805a;--color-success-900:#185e3b;--color-success-950:#0e3421;--color-success-50-rgb:239,250,246;--color-success-100-rgb:214,242,231;--color-success-200-rgb:173,229,206;--color-success-300-rgb:131,215,182;--color-success-400-rgb:90,202,157;--color-success-500-rgb:49,189,133;--color-success-600-rgb:43,166,117;--color-success-700-rgb:40,153,108;--color-success-800-rgb:33,128,90;--color-success-900-rgb:24,94,59;--color-success-950-rgb:14,52,33;--color-warning-50:#fff4ea;--color-warning-100:#ffecdb;--color-warning-200:#ffd2a9;--color-warning-300:#ffbc7e;--color-warning-400:#ffaf65;--color-warning-500:#ff9f46;--color-warning-600:#f38f19;--color-warning-700:#ed8307;--color-warning-800:#d17100;--color-warning-900:#af5f01;--color-warning-950:#441506;--color-warning-50-rgb:255,244,234;--color-warning-100-rgb:255,236,219;--color-warning-200-rgb:255,210,169;--color-warning-300-rgb:255,188,126;--color-warning-400-rgb:255,175,101;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:243,143,25;--color-warning-700-rgb:237,131,7;--color-warning-800-rgb:209,113,0;--color-warning-900-rgb:175,95,1;--color-warning-950-rgb:68,21,6;--color-danger-50:#ffebeb;--color-danger-100:#ffd5d5;--color-danger-200:#ffb1b1;--color-danger-300:#ff9292;--color-danger-400:#ff7c7c;--color-danger-500:#fc5959;--color-danger-600:#fb2b2b;--color-danger-700:#d91b1b;--color-danger-800:#ba1313;--color-danger-900:#a20606;--color-danger-950:#470808;--color-danger-50-rgb:255,235,235;--color-danger-100-rgb:255,213,213;--color-danger-200-rgb:255,177,177;--color-danger-300-rgb:255,146,146;--color-danger-400-rgb:255,124,124;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:251,43,43;--color-danger-700-rgb:217,27,27;--color-danger-800-rgb:186,19,19;--color-danger-900-rgb:162,6,6;--color-danger-950-rgb:71,8,8;--color-important-50:#fff8f5;--color-important-100:#ffe2d9;--color-important-200:#ffcebf;--color-important-300:#ffb29b;--color-important-400:#ff8c68;--color-important-500:#ff8058;--color-important-600:#ff6f42;--color-important-700:#ff4912;--color-important-800:#c83509;--color-important-900:#611700;--color-important-950:#440609;--color-important-50-rgb:255,248,245;--color-important-100-rgb:255,226,217;--color-important-200-rgb:255,206,191;--color-important-300-rgb:255,178,155;--color-important-400-rgb:255,140,104;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,111,66;--color-important-700-rgb:255,73,18;--color-important-800-rgb:200,53,9;--color-important-900-rgb:97,23,0;--color-important-950-rgb:68,6,9;--color-special-50:#efecfa;--color-special-100:#e4dff7;--color-special-200:#c4b6ff;--color-special-300:#a38cff;--color-special-400:#8a6ff5;--color-special-500:#8166ee;--color-special-600:#7055df;--color-special-700:#513baa;--color-special-800:#452da5;--color-special-900:#30216e;--color-special-950:#271560;--color-special-50-rgb:239,236,250;--color-special-100-rgb:228,223,247;--color-special-200-rgb:196,182,255;--color-special-300-rgb:163,140,255;--color-special-400-rgb:138,111,245;--color-special-500-rgb:129,102,238;--color-special-600-rgb:112,85,223;--color-special-700-rgb:81,59,170;--color-special-800-rgb:69,45,165;--color-special-900-rgb:48,33,110;--color-special-950-rgb:39,21,96;--color-inherit:inherit;--color-transparent:transparent;--color-current:currentColor;--color-black:#000;--color-white:#fff;--color-canvas:#fff;--color-canvas-light:#fff;--color-canvas-dark:#fcfdfe;--color-inverse:#000;--color-surface:#eff1f3;--color-surface-light:#fcfdfe;--color-surface-strong:#ebedf3;--color-fore:#30394a;--color-fore-in-light:#30394a;--color-fore-in-dark:#fff;--color-focus:#bcdcff;--color-link:#2b47a2;--color-link-hover:#144ce1;--color-link-visited:#6328a4;--color-link-active:#144ce1;--color-placeholder:#64758b;--color-border:#ebedf3;--color-border-strong:#d2d6e5;--color-border-light:#eff1f3;--color-black-rgb:0,0,0;--color-white-rgb:255,255,255;--color-canvas-rgb:255,255,255;--color-canvas-light-rgb:255,255,255;--color-canvas-dark-rgb:252,253,254;--color-inverse-rgb:0,0,0;--color-surface-rgb:239,241,243;--color-surface-light-rgb:252,253,254;--color-surface-strong-rgb:235,237,243;--color-fore-rgb:48,57,74;--color-fore-in-light-rgb:48,57,74;--color-fore-in-dark-rgb:255,255,255;--color-focus-rgb:188,220,255;--color-link-rgb:43,71,162;--color-link-hover-rgb:20,76,225;--color-link-visited-rgb:99,40,164;--color-link-active-rgb:20,76,225;--color-placeholder-rgb:100,117,139;--color-border-rgb:235,237,243;--color-border-strong-rgb:210,214,229;--color-border-light-rgb:239,241,243}body{--btn-bg:var(--color-gray-50)}@media (prefers-color-scheme:dark){.dark-auto{--color-gray-50:#0b0f18;--color-gray-100:#30394a;--color-gray-200:#353d57;--color-gray-300:#3d4667;--color-gray-400:#4a577f;--color-gray-500:#64758b;--color-gray-600:#b2b9c5;--color-gray-700:#d2d6e5;--color-gray-800:#ebedf3;--color-gray-900:#eff1f3;--color-gray-950:#fcfdfe;--color-gray-50-rgb:11,15,24;--color-gray-100-rgb:48,57,74;--color-gray-200-rgb:53,61,87;--color-gray-300-rgb:61,70,103;--color-gray-400-rgb:74,87,127;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:178,185,197;--color-gray-700-rgb:210,214,229;--color-gray-800-rgb:235,237,243;--color-gray-900-rgb:239,241,243;--color-gray-950-rgb:252,253,254;--color-primary-50:#142457;--color-primary-100:#19388f;--color-primary-200:#173db6;--color-primary-300:#144ce1;--color-primary-400:#2b67e5;--color-primary-500:#3883fa;--color-primary-600:#59a5ff;--color-primary-700:#8ec6ff;--color-primary-800:#bcdcff;--color-primary-900:#d9eaff;--color-primary-950:#eef6ff;--color-primary-50-rgb:20,36,87;--color-primary-100-rgb:25,56,143;--color-primary-200-rgb:23,61,182;--color-primary-300-rgb:20,76,225;--color-primary-400-rgb:43,103,229;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:89,165,255;--color-primary-700-rgb:142,198,255;--color-primary-800-rgb:188,220,255;--color-primary-900-rgb:217,234,255;--color-primary-950-rgb:238,246,255;--color-secondary-50:#062a4b;--color-secondary-100:#046bab;--color-secondary-200:#078ada;--color-secondary-300:#1099ed;--color-secondary-400:#18a6fd;--color-secondary-500:#37b2fe;--color-secondary-600:#60c2ff;--color-secondary-700:#77cbff;--color-secondary-800:#9bd9ff;--color-secondary-900:#cdecff;--color-secondary-950:#e7f6ff;--color-secondary-50-rgb:6,42,75;--color-secondary-100-rgb:4,107,171;--color-secondary-200-rgb:7,138,218;--color-secondary-300-rgb:16,153,237;--color-secondary-400-rgb:24,166,253;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:96,194,255;--color-secondary-700-rgb:119,203,255;--color-secondary-800-rgb:155,217,255;--color-secondary-900-rgb:205,236,255;--color-secondary-950-rgb:231,246,255;--color-success-50:#0e3421;--color-success-100:#185e3b;--color-success-200:#21805a;--color-success-300:#28996c;--color-success-400:#2ba675;--color-success-500:#31bd85;--color-success-600:#5aca9d;--color-success-700:#83d7b6;--color-success-800:#ade5ce;--color-success-900:#d6f2e7;--color-success-950:#effaf6;--color-success-50-rgb:14,52,33;--color-success-100-rgb:24,94,59;--color-success-200-rgb:33,128,90;--color-success-300-rgb:40,153,108;--color-success-400-rgb:43,166,117;--color-success-500-rgb:49,189,133;--color-success-600-rgb:90,202,157;--color-success-700-rgb:131,215,182;--color-success-800-rgb:173,229,206;--color-success-900-rgb:214,242,231;--color-success-950-rgb:239,250,246;--color-warning-50:#441506;--color-warning-100:#af5f01;--color-warning-200:#d17100;--color-warning-300:#ed8307;--color-warning-400:#f38f19;--color-warning-500:#ff9f46;--color-warning-600:#ffaf65;--color-warning-700:#ffbc7e;--color-warning-800:#ffd2a9;--color-warning-900:#ffecdb;--color-warning-950:#fff4ea;--color-warning-50-rgb:68,21,6;--color-warning-100-rgb:175,95,1;--color-warning-200-rgb:209,113,0;--color-warning-300-rgb:237,131,7;--color-warning-400-rgb:243,143,25;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:255,175,101;--color-warning-700-rgb:255,188,126;--color-warning-800-rgb:255,210,169;--color-warning-900-rgb:255,236,219;--color-warning-950-rgb:255,244,234;--color-danger-50:#470808;--color-danger-100:#a20606;--color-danger-200:#ba1313;--color-danger-300:#d91b1b;--color-danger-400:#fb2b2b;--color-danger-500:#fc5959;--color-danger-600:#ff7c7c;--color-danger-700:#ff9292;--color-danger-800:#ffb1b1;--color-danger-900:#ffd5d5;--color-danger-950:#ffebeb;--color-danger-50-rgb:71,8,8;--color-danger-100-rgb:162,6,6;--color-danger-200-rgb:186,19,19;--color-danger-300-rgb:217,27,27;--color-danger-400-rgb:251,43,43;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:255,124,124;--color-danger-700-rgb:255,146,146;--color-danger-800-rgb:255,177,177;--color-danger-900-rgb:255,213,213;--color-danger-950-rgb:255,235,235;--color-important-50:#440609;--color-important-100:#611700;--color-important-200:#c83509;--color-important-300:#ff4912;--color-important-400:#ff6f42;--color-important-500:#ff8058;--color-important-600:#ff8c68;--color-important-700:#ffb29b;--color-important-800:#ffcebf;--color-important-900:#ffe2d9;--color-important-950:#fff8f5;--color-important-50-rgb:68,6,9;--color-important-100-rgb:97,23,0;--color-important-200-rgb:200,53,9;--color-important-300-rgb:255,73,18;--color-important-400-rgb:255,111,66;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,140,104;--color-important-700-rgb:255,178,155;--color-important-800-rgb:255,206,191;--color-important-900-rgb:255,226,217;--color-important-950-rgb:255,248,245;--color-special-50:#271560;--color-special-100:#30216e;--color-special-200:#452da5;--color-special-300:#513baa;--color-special-400:#7055df;--color-special-500:#8166ee;--color-special-600:#8a6ff5;--color-special-700:#a38cff;--color-special-800:#c4b6ff;--color-special-900:#e4dff7;--color-special-950:#efecfa;--color-special-50-rgb:39,21,96;--color-special-100-rgb:48,33,110;--color-special-200-rgb:69,45,165;--color-special-300-rgb:81,59,170;--color-special-400-rgb:112,85,223;--color-special-500-rgb:129,102,238;--color-special-600-rgb:138,111,245;--color-special-700-rgb:163,140,255;--color-special-800-rgb:196,182,255;--color-special-900-rgb:228,223,247;--color-special-950-rgb:239,236,250;--color-canvas:#0b0f18;--color-inverse:#fff;--color-surface:#353d57;--color-surface-light:#30394a;--color-surface-strong:#3d4667;--color-fore:#ebedf3;--color-focus:#173db6;--color-link:#59a5ff;--color-link-hover:#3883fa;--color-link-visited:#bcdcff;--color-link-active:#bcdcff;--color-placeholder:#4a577f;--color-border:#353d57;--color-border-strong:#3d4667;--color-border-light:#30394a;--color-canvas-rgb:11,15,24;--color-inverse-rgb:255,255,255;--color-surface-rgb:53,61,87;--color-surface-light-rgb:48,57,74;--color-surface-strong-rgb:61,70,103;--color-fore-rgb:235,237,243;--color-focus-rgb:23,61,182;--color-link-rgb:89,165,255;--color-link-hover-rgb:56,131,250;--color-link-visited-rgb:188,220,255;--color-link-active-rgb:188,220,255;--color-placeholder-rgb:74,87,127;--color-border-rgb:53,61,87;--color-border-strong-rgb:61,70,103;--color-border-light-rgb:48,57,74}}*,:after,:before{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}:focus-visible{outline-color:transparent}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }html{font-size:var(--font-size-root)}body{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));font-size:.8125rem;line-height:1.5384615385}.dark,body{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}:root{--font-h1-size:2.25rem;--article-p-space:0.5em;--article-heading-space:0.5em;--article-hr-space:1.5em;--article-cell-padding:0.25rem 0.75rem}a,a.disabled:hover{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}a:hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}a:focus-visible{outline-color:rgb(var(--color-focus-rgb));outline-offset:2px;outline-width:2px}.code,code{background-color:rgba(var(--color-important-500-rgb),.1);border-radius:var(--radius);padding-left:.25rem;padding-right:.25rem;--tw-text-opacity:1;color:rgba(var(--color-important-500-rgb),var(--tw-text-opacity))}pre{font-size:.75rem;line-height:1rem;overflow:auto;padding:.5rem}pre code{background-color:transparent;color:inherit;padding:0}samp,var{font-weight:700}.blockquote,blockquote{border-left-width:4px;font-size:.875rem;line-height:1.3rem;padding-left:.75rem;text-wrap:balance}.blockquote figcaption,blockquote figcaption{font-size:.75rem;line-height:1rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:700;line-height:1.5;text-wrap:balance}.h1,h1{font-size:1.75rem}.h2,h2{font-size:1.5rem}.h3,h3{font-size:1.25rem}.h4,h4{font-size:1rem}.h5,h5{font-size:.875rem}.h6,h6{font-size:.75rem}ul{list-style-type:disc}ol,ul{padding-left:1.5em}ol{list-style-type:decimal}dt{font-weight:700}dd{padding-left:2em}.article{color:var(--font-size-article);-webkit-hyphens:auto;hyphens:auto;overflow-wrap:break-word}.article h1,.article h2,.article h3,.article h4{margin-bottom:var(--article-heading-space);margin-top:var(--article-heading-space)}.article audio,.article blockquote,.article figure,.article img,.article ol,.article p,.article table,.article ul,.article video{margin-bottom:var(--article-p-space);margin-top:var(--article-p-space)}.article p{min-height:1em}.article p:empty:before{content:" ";display:inline-block}.article hr{margin-bottom:var(--article-hr-space);margin-top:var(--article-hr-space)}.article table{border-width:1px}.article td,.article th{border-bottom-width:1px;padding:var(--article-cell-padding)}.article thead{background-color:var(--table-head-bg,var(--color-gray-100))}.article ol *,.article table *,.article ul *{margin-bottom:0;margin-top:0}.article pre{border-radius:var(--radius);border-width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity))}:root{--alert-bg:var(--color-surface)}.alert{align-items:center;background-color:var(--alert-bg);border-radius:var(--radius);display:flex;gap:.75rem;padding:.5rem .75rem}.alert-content{display:flex;flex:1 1 auto;flex-direction:column;gap:1rem}.alert-close{margin-bottom:-.375rem;margin-right:-.5rem;margin-top:-.375rem}.alert-link{color:inherit;font-weight:700}.alert-link:hover{color:inherit;text-decoration-line:underline}.alert-heading{font-weight:700;margin:0}.alert-text{flex:1 1 auto;white-space:pre-line}.alert-actions{align-items:center;display:flex;gap:.5rem}:root{--breadcrumb-divider:"/";--breadcrumb-divider-color:var(--color-gray-500);--breadcrumb-color-active:var(--color-gray-500)}.breadcrumb{display:flex;gap:1.25rem;list-style-type:none;padding-left:0}.breadcrumb>li{position:relative}.breadcrumb>li+li:before{color:var(--breadcrumb-divider-color);content:var(--breadcrumb-divider);display:block;left:-1.25rem;position:absolute;text-align:center;width:1.25rem}.breadcrumb>.active{color:var(--breadcrumb-color-active)}:root{--btn-radius:var(--radius);--btn-bg:var(--color-surface);--btn-border-color:var(--color-gray-300);--btn-height:2rem}.btn{align-items:center;background-color:var(--btn-bg);border-radius:var(--btn-radius);display:inline-flex;gap:.375rem;height:var(--btn-height);justify-content:center;padding-left:.75rem;padding-right:.75rem;white-space:nowrap;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--btn-border-color)}.btn,.btn-default:hover{color:inherit}.btn-link{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity));text-decoration-line:underline;text-underline-offset:2px;--tw-ring-color:transparent}.btn-link:visited{color:rgba(var(--color-link-visited-rgb),var(--tw-text-opacity))}.btn-link:hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}.btn-link{--btn-bg:transparent}.btn.size-xs,.size-xs>.btn{padding-left:.25rem;padding-right:.25rem;--btn-height:1.25rem}.btn.size-sm,.btn.size-xs,.size-sm>.btn,.size-xs>.btn{font-size:.75rem;line-height:1rem}.btn.size-sm,.size-sm>.btn{--btn-height:1.5rem}.btn.size-md,.btn.size-sm,.size-md>.btn,.size-sm>.btn{padding-left:.5rem;padding-right:.5rem}.btn.size-md,.size-md>.btn{--btn-height:1.75rem}.btn.size-lg,.size-lg>.btn{font-size:1rem;line-height:1.5rem;padding-left:1rem;padding-right:1rem;--btn-height:2.5rem}.btn.size-xl,.size-xl>.btn{font-size:1.125rem;line-height:1.75rem;padding-left:1.25rem;padding-right:1.25rem;--btn-height:3rem}.btn.square{aspect-ratio:1/1;gap:.125rem;padding-left:0;padding-right:0}@supports not (aspect-ratio:1/1){.btn.square{width:var(--btn-height)}}.btn.btn-caret{padding-left:.25rem;padding-right:.25rem}.btn.btn-wide{min-width:80px}:root{--checkbox-size:12px;--checkbox-color:var(--color-primary-500)}.checkbox,.radio{align-items:center;cursor:pointer;display:flex;gap:.375rem;min-height:20px}.checkbox>input[type=checkbox],.radio>input[type=radio]{accent-color:rgb(var(--color-primary-500-rgb));border-radius:var(--radius-lg)}.checkbox-primary,.radio-primary{display:flex;gap:.375rem;min-height:20px;position:relative}.checkbox-primary>input[type=checkbox],.radio-primary>input[type=radio]{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.checkbox-primary>label,.radio-primary>label{cursor:pointer;padding-left:calc(var(--checkbox-size) + 8px);position:relative}.checkbox-primary>label:after,.checkbox-primary>label:before,.radio-primary>label:after,.radio-primary>label:before{display:block;height:var(--checkbox-size);left:0;position:absolute;transition-duration:.15s;transition-property:transform,background-color,color,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--checkbox-size);--tw-content:"";content:var(--tw-content);top:calc((20px - var(--checkbox-size))/2)}.checkbox-primary>label:before{border-radius:var(--radius-sm);border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.checkbox-primary>label:after{--tw-scale-x:.9;--tw-scale-y:.9;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTkgMjAuNDItNi4yMS02LjIxIDIuODMtMi44M0w5IDE0Ljc3bDkuODgtOS44OSAyLjgzIDIuODN6Ii8+PC9zdmc+");transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.radio-primary>label:before{border-radius:var(--radius-full);border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.radio-primary>label:after{background-color:var(--checkbox-color);border-radius:var(--radius-full);opacity:0;--checkbox-radio-size:calc(var(--checkbox-size)*2/3);height:var(--checkbox-radio-size);left:calc((var(--checkbox-size) - var(--checkbox-radio-size))/2);top:calc((20px - var(--checkbox-radio-size))/2);width:var(--checkbox-radio-size)}.checkbox-primary>label:hover:before,.radio-primary>label:hover:before{border-color:var(--checkbox-color)}.checkbox-primary.focus>label:before,.checkbox-primary>input[type=checkbox]:focus+label:before,.radio-primary.focus>label:before,.radio-primary>input[type=radio]:focus+label:before{border-color:var(--checkbox-color);outline-color:rgb(var(--color-focus-rgb));outline-style:solid;outline-width:2px}.checkbox-primary.checked>label:before,.checkbox-primary>input[type=checkbox]:checked+label:before{background-color:var(--checkbox-color);border-color:var(--checkbox-color)}.radio-primary.checked>label:before,.radio-primary>input[type=radio]:checked+label:before{border-color:var(--checkbox-color)}.checkbox-primary.checked>label:after,.checkbox-primary>input[type=checkbox]:checked+label:after,.radio-primary.checked>label:after,.radio-primary>input[type=radio]:checked+label:after{opacity:1}.checkbox-primary.disabled>label,.checkbox-primary>input[type=checkbox]:disabled+label,.radio-primary.disabled>label,.radio-primary>input[type=radio]:disabled+label{cursor:not-allowed;opacity:.7;pointer-events:none;--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.checkbox-primary.indeterminate>label:after,.checkbox-primary>input[type=checkbox]:indeterminate+label:after{--tw-border-opacity:1;background-color:var(--checkbox-color);background-image:none;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity));border-width:calc((var(--checkbox-size) - 2px)/2) 2px;opacity:1}.check-list{align-items:flex-start;flex-direction:column;gap:.5rem}.check-list,.check-list-inline{display:flex;padding-bottom:.375rem;padding-top:.375rem}.check-list-inline{align-items:center;-moz-column-gap:1rem;column-gap:1rem;flex-direction:row;flex-wrap:wrap;row-gap:.5rem}.switch{display:flex;gap:.375rem;min-height:20px;padding-left:2.5rem;position:relative}.switch>input{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.switch>label:after,.switch>label:before{border-radius:var(--radius-full);border-width:1px;height:1rem;left:0;position:absolute;top:.125rem;width:2rem;--tw-border-opacity:1;border-color:rgba(var(--color-border-strong-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:"";content:var(--tw-content)}.switch>label:before{cursor:pointer;--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.switch>label:hover:before{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}.switch>label:after{height:.75rem;left:.125rem;top:.25rem;width:.75rem;--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.switch>input:checked+label:before{background-color:var(--checkbox-color);border-color:rgba(var(--color-inverse-rgb),.2)}.switch>input:checked+label:after{color:var(--checkbox-color);left:18px}.switch.focus>label:before,.switch>input:focus+label:before{border-color:var(--checkbox-color);outline-color:rgb(var(--color-focus-rgb));outline-style:solid;outline-width:2px}.switch.disabled>label:before,.switch>input:disabled+label:before{cursor:not-allowed;opacity:.7;pointer-events:none;--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:root{--form-control-radius:var(--radius);--form-control-border:var(--color-border);--form-control-focus:var(--color-primary-500);--form-control-disabled:var(--color-surface);--form-control-readonly:var(--color-surface)}.dark{--form-control-border:var(--color-border-strong)}input::-moz-placeholder,textarea::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-placeholder-opacity))}input::placeholder,textarea::placeholder{--tw-placeholder-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-placeholder-opacity))}.form-control{border-radius:var(--form-control-radius);display:block;height:2rem;width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));outline-color:transparent;outline-style:solid;outline-width:1px;padding:.25rem .5rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--form-control-border);transition-duration:.15s;transition-property:outline,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.form-control.focus,.form-control:focus{outline-color:var(--form-control-focus);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-focus-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.3}.form-control.disabled,.form-control[disabled]{background-color:var(--form-control-disabled);opacity:1}.form-control.readonly,.form-control[readonly]{background-color:var(--form-control-readonly)}select{-webkit-appearance:none;background-image:url("data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==");background-position:right 8px top 50%;background-repeat:no-repeat;background-size:8px auto;padding-right:1rem}select.form-control[multiple]{background-image:none}textarea.form-control{height:auto;min-height:32px}input[type=file].form-control{padding:.125rem}input[type=file].form-control::-webkit-file-upload-button{-webkit-appearance:none;appearance:none;border-radius:inherit;border-style:none;cursor:pointer;height:1.75rem;padding-left:.5rem;padding-right:.5rem}input[type=file].form-control::-webkit-file-upload-button:hover{background-color:rgba(var(--color-black-rgb),.1)}.has-error .form-control,.has-error.form-control{--tw-ring-color:rgba(var(--color-danger-500-rgb),0.6)}.has-error .form-control.focus,.has-error .form-control:focus,.has-error.form-control.focus,.has-error.form-control:focus{outline-color:rgb(var(--color-danger-500-rgb));--tw-ring-color:rgba(var(--color-danger-500-rgb),0.1)}.has-warning .form-control,.has-warning.form-control{--tw-ring-color:rgba(var(--color-warning-500-rgb),0.6)}.has-warning .form-control.focus,.has-warning .form-control:focus,.has-warning.form-control.focus,.has-warning.form-control:focus{outline-color:rgb(var(--color-warning-500-rgb));--tw-ring-color:rgba(var(--color-warning-500-rgb),0.2)}.has-success .form-control,.has-success.form-control{--tw-ring-color:rgba(var(--color-success-500-rgb),0.6)}.has-success .form-control.focus,.has-success .form-control:focus,.has-success.form-control.focus,.has-success.form-control:focus{outline-color:rgb(var(--color-success-500-rgb));--tw-ring-color:rgba(var(--color-success-500-rgb),0.2)}.form-control.size-sm,.size-sm>.form-control{font-size:.75rem;height:1.5rem;line-height:1rem;padding-left:.5rem;padding-right:.5rem}.form-control.size-md,.size-md>.form-control{height:1.75rem;padding-left:.5rem;padding-right:.5rem}.form-control.size-lg,.size-lg>.form-control{font-size:1rem;height:2.5rem;line-height:1.5rem;padding-left:.75rem;padding-right:.75rem}:root{--input-group-addon-bg:var(--color-gray-50)}.input-group{align-items:stretch;display:flex}.input-group>.form-control,.input-group>.input-control{flex:1 1 auto;z-index:1}.input-group-addon{align-items:center;background-color:var(--input-group-addon-bg);border-radius:var(--form-control-radius);display:flex;flex:none;height:2rem;padding-left:.5rem;padding-right:.5rem;z-index:0;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--form-control-border)}.size-sm>.input-group-addon{font-size:.75rem;height:1.5rem;line-height:1rem;padding-left:.5rem;padding-right:.5rem}.size-lg>.input-group-addon{font-size:1rem;height:2.5rem;line-height:1.5rem;padding-left:.75rem;padding-right:.75rem}.input-group-control{flex:1 1 auto}.input-group>*+*,.input-group>*+* .form-control{border-bottom-left-radius:var(--radius-none);border-top-left-radius:var(--radius-none)}.input-group>:not(:last-child),.input-group>:not(:last-child) .form-control{border-bottom-right-radius:var(--radius-none);border-top-right-radius:var(--radius-none)}.input-group .btn:focus-visible,.input-group .form-control:focus{z-index:2}:root{--form-tip-color:var(--color-gray-400);--form-label-color:var(--color-gray-700);--form-horz-label-width:6rem;--form-grid-gap-x:1.25rem;--form-grid-gap-y:.75rem}.form{flex-direction:column;gap:1rem}.form,.form-label{display:flex}.form-label{align-items:center;color:var(--form-label-color);flex-direction:row;gap:.25rem;height:2rem;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.form-label.required:after{content:"*";display:inline-block;margin-left:.25rem;--tw-translate-y:0.125rem;--tw-scale-x:1.25;--tw-scale-y:1.25;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.no-required .form-label.required:after{display:none}.form-label-actions{flex:1 1 auto;justify-content:flex-end}.form-label>.checkbox-primary{margin-left:.75rem}.form-tip{color:var(--form-tip-color);display:block;margin-top:.25rem}.has-error .form-tip{--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.has-warning .form-tip{--tw-text-opacity:1;color:rgba(var(--color-warning-500-rgb),var(--tw-text-opacity))}.has-success .form-tip{--tw-text-opacity:1;color:rgba(var(--color-success-500-rgb),var(--tw-text-opacity))}.form-actions{display:flex;flex-direction:row;gap:1rem;justify-content:center}.form-grid{--form-grid-gap-x-half:calc(var(--form-grid-gap-x)/2);--form-grid-gap-y-half:calc(var(--form-grid-gap-y)/2);align-items:flex-start;flex-direction:row;flex-wrap:wrap;gap:0}.form-grid .form-group{padding:var(--form-grid-gap-y-half) var(--form-grid-gap-x-half)}.form-grid .form-label.required:after{margin-left:.25rem;order:-9999}.form-grid .form-label .checkbox{margin-left:.75rem;margin-right:.75rem}.form-grid .has-wrap-after:after{display:block;width:100%;--tw-content:"";content:var(--tw-content)}.form-grid-wrap{width:100%}.form-grid-row{display:flex;flex-direction:row;padding-bottom:var(--form-grid-gap-y-half);padding-top:var(--form-grid-gap-y-half);position:relative;width:100%}.form-grid-col{padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half)}.form-grid .form-actions{gap:1.5rem;justify-content:center;padding:var(--form-grid-gap-y) var(--form-grid-gap-x-half);width:100%}.form-grid .form-actions.is-pinned{border-top-width:1px}.form-horz .form-row{align-items:flex-start;display:flex;flex-direction:row}.form-horz .form-group{align-items:flex-start;display:flex;flex:none;flex-direction:row;flex-wrap:wrap;min-height:32px;min-width:0;padding-left:var(--form-horz-label-width);position:relative}.form-horz .form-row .form-group{flex:1 1 auto}.form-horz .form-group[class*=" w-"],.form-horz .form-group[class^=w-]{flex:none}.form-horz .form-group>*{min-width:0}.form-horz .form-group.no-label{padding-left:0}.form-horz .form-group.no-label>.check-list-inline{padding-left:1rem;padding-right:1rem}.form-horz .form-label{justify-content:flex-end;left:0;padding-left:1rem;padding-right:.5rem;position:absolute;top:0;width:var(--form-horz-label-width)}.form-horz .form-label.required:after{margin-left:0;order:-9999}.form-horz .form-tip{width:100%}.form-horz .form-tip,.form-horz .input-control,.form-horz .input-group{flex:1 1 auto}.form .form-group-wrapper,.form-horz .form-group-wrapper{flex:1 1 auto;min-width:0;width:100%;z-index:1}.form .form-group-wrapper.flex-none,.form-horz .form-group-wrapper.flex-none{flex:none}.form fieldset>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.form fieldset{padding-bottom:1rem;padding-left:1rem}.form-grid fieldset>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.form legend{border-bottom-width:1px;display:flex;justify-content:flex-start;margin-left:-1rem;width:100%;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-primary-100-rgb),var(--tw-border-opacity));width:calc(100% + 1rem)}.form-title{align-items:center;background-color:rgba(var(--color-primary-50-rgb),.5);display:flex;font-weight:700;height:1.75rem;padding-left:.75rem;padding-right:.75rem}:root{--input-control-fix-width-sm:2rem;--input-control-fix-width:4.375rem;--input-control-fix-width-lg:6.75rem}.input-control{position:relative;--input-control-prefix:8px;--input-control-suffix:8px}.input-control-prefix,.input-control-suffix{align-items:center;display:flex;height:100%;left:0;opacity:.5;padding-left:.5rem;padding-right:.5rem;position:absolute;top:0;white-space:nowrap;width:var(--input-control-prefix);z-index:1}.input-control-suffix{justify-content:flex-end;left:auto;right:0;width:var(--input-control-suffix)}.form-control:focus+.input-control-prefix,.form-control:focus+.input-control-suffix{opacity:1}.input-control>.form-control{padding-left:var(--input-control-prefix);padding-right:var(--input-control-suffix)}.input-control>select.form-control{background-position-x:calc(100% - var(--input-control-suffix) - 8px);padding-right:calc(var(--input-control-suffix) + 20px)}.has-prefix{--input-control-prefix:var(--input-control-fix-width)}.has-suffix{--input-control-suffix:var(--input-control-fix-width)}.has-prefix-sm{--input-control-prefix:var(--input-control-fix-width-sm)}.has-suffix-sm{--input-control-suffix:var(--input-control-fix-width-sm)}.has-prefix-lg{--input-control-prefix:var(--input-control-fix-width-lg)}.has-suffix-lg{--input-control-suffix:var(--input-control-fix-width-lg)}.has-prefix-icon{--input-control-prefix:32px}.has-suffix-icon{--input-control-suffix:32px}.input-control.has-prefix-icon{--input-control-prefix:32px}.input-control.has-suffix-icon{--input-control-suffix:32px}.input-control.has-prefix-icon>.input-control-prefix,.input-control.has-suffix-icon>.input-control-suffix{justify-content:center;padding:0}.input-control.size-sm>.form-control,.input-control.size-sm>.input-control-prefix,.input-control.size-sm>.input-control-suffix{font-size:.75rem;line-height:1rem}.input-control.size-lg>.form-control,.input-control.size-lg>.input-control-prefix,.input-control.size-lg>.input-control-suffix{font-size:1rem;line-height:1.5rem}:root{--label-bg:rgba(var(--color-canvas-rgb),.1);--label-border-color:var(--color-gray-300);--label-color:var(--color-gray-500);--label-radius:var(--radius)}.label{align-items:center;background-color:var(--label-bg);border-radius:var(--label-radius);color:var(--label-color);display:inline-flex;font-size:.75rem;height:1.25rem;justify-content:center;line-height:1rem;min-width:1.25rem;padding-left:.25rem;padding-right:.25rem;white-space:pre-line;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--label-border-color)}.label.size-lg{font-size:.8125rem;height:1.5rem;line-height:1.25rem;min-width:1.5rem;padding-left:.5rem;padding-right:.5rem}.label.size-sm{height:1rem;min-width:1rem}.label-dot{aspect-ratio:1/1;border-radius:var(--radius-full);height:.5rem;min-width:0;padding-left:0;padding-right:0}.caret,.caret-down,.caret-left,.caret-right,.caret-up{align-items:center;display:inline-flex;height:.75rem;justify-content:center;position:relative;width:.75rem}.caret-down:before,.caret-left:before,.caret-right:before,.caret-up:before,.caret:before{display:block;height:.35rem;transform-origin:center;width:.35rem;--tw-translate-y:-1px;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.caret-left:before{--tw-translate-x:0.125rem;--tw-translate-y:0px;--tw-rotate:135deg}.caret-left:before,.caret-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.caret-right:before{--tw-translate-x:-0.125rem;--tw-translate-y:0px;--tw-rotate:-45deg}.caret-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:focus>.caret,:hover>.caret{opacity:inherit}.disabled .caret,.readonly .caret{opacity:var(--caret-opacity,.5)}.listitem{align-items:center;border-radius:var(--radius);display:flex;flex-direction:row;flex-wrap:nowrap;gap:.5rem;padding:.25rem}.listitem.selected{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.listitem.active{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.item-actions,.item-avatar,.item-icon,.item-trailing,.item-trailing-icon{flex:none}.item-icon.icon-EMPTY{display:none}.item-subtitle{font-size:.75rem;line-height:1rem;opacity:.8}.item-content,.item-text{flex:1 1 auto;min-width:0}.item-leading,.item-trailing{align-items:center;display:flex;flex:none;gap:.5rem}.item-checkbox{margin-right:-.5rem}.item-content{align-items:center;display:flex;gap:.5rem}.multiline>.item-content{align-items:flex-start;flex-direction:column;gap:.25rem}.list{list-style-type:none;padding-left:0}.list-heading-inner .item-title{font-weight:700;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.with-hover-actions>.item{position:relative}.with-hover-actions>.item>.item-inner .item-actions{opacity:0;pointer-events:none;position:absolute;right:.25rem;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.with-hover-actions>.item>.item-inner:hover .item-actions{display:flex;margin-top:-.25rem;opacity:1;pointer-events:auto;position:static}.list.is-nested-sub{padding-left:var(--list-indent)}.is-nested-collapsed{display:none}.nested-toggle-icon{align-items:center;border-radius:var(--radius);display:flex;height:1rem;justify-content:center;margin-right:-.25rem;width:1rem}.magnifier{display:inline-block;height:1em;position:relative;width:1em}.magnifier:after,.magnifier:before{border-radius:var(--radius-full);content:"";display:block;position:absolute}.magnifier:before{border:1px solid;height:.75em;width:.75em}.magnifier:after{height:1px;left:.55em;top:.7em;width:.5em;--tw-rotate:45deg;background-color:currentColor;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.search-box.compact.has-prefix-icon{--input-control-prefix:24px}.search-box.compact.has-suffix-icon{--input-control-suffix:24px}:root{--menu-bg:var(--color-canvas);--menu-active-bg:var(--color-primary-500);--menu-active-color:var(--color-canvas);--menu-selected-bg:var(--color-primary-50);--menu-selected-color:var(--color-primary-500);--menu-icon-opacity:.5;--menu-icon-margin:1.75rem;--menu-min-width:3rem;--menu-heading-color:var(--color-gray-500)}.menu{background:var(--menu-bg);max-width:var(--menu-max-width);min-width:var(--menu-min-width);padding:.5rem}.menu-wrapper{display:flex;flex-direction:column;min-height:0}.menu-wrapper>.menu{flex:1 1 auto;min-height:0;overflow:auto}.menu-item>.item-inner,.menu-item>a{align-items:center;border-radius:var(--radius);color:inherit;cursor:pointer;display:flex;gap:.5rem;justify-content:space-between;overflow:hidden;padding:.25rem .5rem;position:relative;text-overflow:ellipsis;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);white-space:nowrap}.menu-item>.selected{background:var(--menu-selected-bg);color:var(--menu-selected-color)}.menu-item>.active,.menu-item>a.hover,.menu-item>a:hover{background:var(--menu-active-bg);color:var(--menu-active-color)}.menu-item.disabled>a:hover,.menu-item>a.disabled:hover{background-color:inherit;color:inherit}.menu-item .item-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:clip;white-space:nowrap}.menu>.divider{margin:.25rem}.menu-heading{align-items:center;color:var(--menu-heading-color);display:flex;font-size:.75rem;font-weight:700;height:2rem;line-height:1rem;padding-left:.25rem;padding-right:.25rem}.has-icons>.menu-item>a>.item-icon{align-items:center;display:flex;height:1rem;justify-content:center;opacity:var(--menu-icon-opacity);width:1rem}.menu-nested{--menu-indent:10px}.menu-nested .menu{background-color:transparent;margin-bottom:-.5rem;margin-left:var(--menu-indent);margin-top:-.5rem;padding-right:0}.menu-nested .menu-item>.item-inner{padding-left:0}.menu-nested .search-menu-footer,.menu-nested .search-menu-header{margin-bottom:.25rem;margin-left:var(--menu-indent);margin-top:-.125rem;padding-right:1px}.menu.compact .menu-item>a{padding-bottom:.125rem;padding-top:.125rem}.menu.compact .menu-heading{height:1.75rem}.search-menu-header{padding:.5rem .5rem .125rem}.search-menu-footer{padding:.125rem .5rem .5rem}.search-menu .item.is-not-match,.search-menu-footer:empty,.search-menu-header:empty{display:none}.search-menu .item.is-not-match.has-match-child{display:list-item}.search-menu .item.is-not-match.has-match-child>.item-inner{opacity:.5;pointer-events:none}.search-menu.no-toggle-on-search .nested-toggle-icon{pointer-events:none}.search-menu .is-match-keys{font-weight:700;text-decoration-line:underline}.search-menu-no-match-hint{display:none;font-size:.75rem;line-height:1rem;padding:.5rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.no-match-child .search-menu-no-match-hint{display:block}.no-match-child>.menu{display:none}.search-menu-exceed-limit-hint{font-size:.75rem;line-height:1rem;padding:.5rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}:root{--alert-bg:var(--color-surface)}.alert{align-items:center;background-color:var(--alert-bg);border-radius:var(--radius);display:flex;gap:.75rem;padding:.5rem .75rem}.alert-content{display:flex;flex:1 1 auto;flex-direction:column;gap:1rem}.alert-close{margin-bottom:-.375rem;margin-right:-.5rem;margin-top:-.375rem}.alert-link{color:inherit;font-weight:700}.alert-link:hover{color:inherit;text-decoration-line:underline}.alert-heading{font-weight:700;margin:0}.alert-text{flex:1 1 auto;white-space:pre-line}.alert-actions{align-items:center;display:flex;gap:.5rem}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.messagers{align-items:flex-end;bottom:0;display:flex;flex-direction:column;gap:.5rem;justify-content:flex-end;left:0;padding:1rem;pointer-events:none;position:fixed;right:0;top:0;z-index:1900}.messagers-top-left,.messagers-top-right{justify-content:flex-start}.messagers-bottom-left,.messagers-top-left{align-items:flex-start}.messagers-bottom,.messagers-center,.messagers-top{align-items:center}.messagers-top,.messagers-top-left,.messagers-top-right{justify-content:flex-start}.messagers-center{justify-content:center}.messager{background-color:rgba(var(--color-inverse-rgb),.8);pointer-events:auto;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);transition-duration:.3s}:root{--progress-radius:var(--radius);--progress-striped-size:40px;--progress-bg:var(--color-surface);--progress-bar-color:var(--color-primary-500)}.progress{background:var(--progress-bg);border-radius:var(--progress-radius);display:flex;height:1.25rem}.progress-bar{background:var(--progress-bar-color);height:100%;transition-duration:.5s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1)}.progress-striped>.progress-bar{background-image:linear-gradient(45deg,rgba(var(--color-canvas-rgb),.15) 25%,transparent 25%,transparent 50%,rgba(var(--color-canvas-rgb),.15) 50%,rgba(var(--color-canvas-rgb),.15) 75%,transparent 75%,transparent);background-size:var(--progress-striped-size) var(--progress-striped-size)}.progress>.progress-bar:first-child{border-bottom-left-radius:inherit;border-top-left-radius:inherit}.progress>.progress-bar:last-child{border-bottom-right-radius:inherit;border-top-right-radius:inherit}.progress.active .progress-bar{animation:progress-bar-stripes 2s linear infinite}@keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}.scrollbar,:root{--scrollbar-size:10px;--scrollbar-opacity:.6;--scrollbar-bg:rgba(var(--color-inverse-rgb),.15);--scrollbar-inset:inset 0 0 0 1px rgba(var(--color-inverse-rgb),.05);--scrollbar-bar-bg:rgba(var(--color-inverse-rgb),.3);--scrollbar-hover-bg:rgba(var(--color-inverse-rgb),.4);--scrollbar-drag-bg:rgba(var(--color-inverse-rgb),.5);--scrollbar-radius:var(--radius-sm);--scrollbar-duration:.7s}::-webkit-scrollbar{height:var(--scrollbar-size);width:var(--scrollbar-size)}::-webkit-scrollbar-track{box-shadow:var(--scrollbar-shadow);-webkit-transition:background-color var(--scrollbar-duration);transition:background-color var(--scrollbar-duration)}::-webkit-scrollbar-track:hover,:hover::-webkit-scrollbar-track{background:var(--scrollbar-bg)}::-webkit-scrollbar-thumb{background:var(--scrollbar-bar-bg);border-radius:var(--scrollbar-radius);min-height:var(--scrollbar-size);-webkit-transition:var(--scrollbar-duration);transition:var(--scrollbar-duration);-webkit-transition-property:background-color;transition-property:background-color}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-hover-bg)}::-webkit-scrollbar-thumb:active{background:var(--scrollbar-drag-bg)}@-moz-document url-prefix(){.scrollbar-thin{scrollbar-width:thin}}.scrollbar-thin::-webkit-scrollbar{height:calc(var(--scrollbar-size)/2);width:calc(var(--scrollbar-size)/2)}.scrollbar-hover::-webkit-scrollbar,.scrollbar-hover::-webkit-scrollbar-thumb,.scrollbar-hover::-webkit-scrollbar-track{visibility:hidden}.scrollbar-hover:hover::-webkit-scrollbar,.scrollbar-hover:hover::-webkit-scrollbar-thumb,.scrollbar-hover:hover::-webkit-scrollbar-track{visibility:visible}@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(./icons/ZentaoIcon.eot?v=1.71);src:url(./icons/ZentaoIcon.woff?v=1.71) format("woff"),url(./icons/ZentaoIcon.ttf?v=1.71) format("truetype"),url(./icons/ZentaoIcon.svg?v=1.71#regular) format("svg")}.icon,[class*=" icon-"],[class^=icon-]{display:inline-block;font-display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{display:inline-block;min-width:14px;text-align:center}.icon-xs:before{font-size:.7em}.icon-sm:before{font-size:.8em}.icon-lg:before{font-size:1.25em;vertical-align:-10%}.icon-2x{font-size:28px}.icon-3x{font-size:42px}.icon-4x{font-size:56px}.icon-5x{font-size:70px}.icon-run{position:relative}.icon-run:before{opacity:.5}.icon-run:after{bottom:0;content:"\ea07";display:block;left:0;position:absolute;right:0;text-align:center;top:0}.icon-guihua:before{content:"\ea02"}.icon-memory:before{content:"\e9fd"}.icon-cpu:before{content:"\e9fe"}.icon-pause-pure:before{content:"\e9ff"}.icon-exclamation-pure:before{content:"\ea00"}.icon-zentao:before{content:"\e901"}.icon-zentao-alt:before{content:"\e900"}.icon-safe:before{content:"\ea06"}.icon-ai:before{content:"\e983"}.icon-kanban:before{content:"\e997"}.icon-college:before{content:"\e9c8"}.icon-home:before,.icon-menu-my:before{content:"\e97a"}.icon-program:before{content:"\e9aa"}.icon-lightbulb-alt:before,.icon-product:before{content:"\e98f"}.icon-project:before,.icon-rocket:before{content:"\e99c"}.icon-run:before{content:"\e9a9"}.icon-run-alt:before{content:"\ea07"}.icon-test:before{content:"\e956"}.icon-devops:before,.icon-infinite:before{content:"\e9a3"}.icon-doc:before,.icon-menu-doc:before{content:"\e99b"}.icon-statistic:before{content:"\e999"}.icon-group:before,.icon-menu-users:before,.icon-persons:before,.icon-team:before{content:"\e97e"}.icon-assets:before,.icon-diamond:before{content:"\e9ae"}.icon-flow:before{content:"\e994"}.icon-backend:before,.icon-cog-outline:before{content:"\ea05"}.icon-help:before{content:"\e968"}.icon-download:before,.icon-import:before{content:"\e904"}.icon-export:before{content:"\e905"}.icon-lightbulb:before{content:"\e91c"}.icon-close:before{content:"\e936"}.icon-check:before{content:"\e5ca"}.icon-minus:before{content:"\e926"}.icon-expand-alt:before{content:"\e6f1"}.icon-collapse-alt:before{content:"\e6f2"}.icon-fullscreen:before{content:"\e96b"}.icon-star-empty:before{content:"\e94a"}.icon-star:before{content:"\e94b"}.icon-exclamation-sign:before{content:"\e930"}.icon-info-sign:before{content:"\e9d5"}.icon-flag:before{content:"\e937"}.icon-check-circle:before{content:"\e92f"}.icon-check-sign:before{content:"\e938"}.icon-chart-pie:before{content:"\e95b"}.icon-history:before{content:"\e95f"}.icon-pencil:before{content:"\e254"}.icon-search:before{content:"\e928"}.icon-restart:before{content:"\e95e"}.icon-cog:before{content:"\e93b"}.icon-chart-line:before{content:"\e95c"}.icon-bar-chart:before,.icon-chart-bar:before{content:"\e95d"}.icon-exchange:before{content:"\e927"}.icon-severity:before{content:"\e973"}.icon-book:before{content:"\f02d"}.icon-treemap-alt:before{content:"\e971"}.icon-severity-solid:before{content:"\e902"}.icon-chat-line:before{content:"\e998"}.icon-stack:before{content:"\e943"}.icon-cube:before{content:"\e967"}.icon-minus-sign:before{content:"\e939"}.icon-bars-sign:before{content:"\e93a"}.icon-chat:before,.icon-message:before{content:"\e940"}.icon-more:before{content:"\e744"}.icon-certificate:before{content:"\f0a3"}.icon-bell:before{content:"\e7f5"}.icon-columns:before{content:"\f0db"}.icon-envelope-o:before{content:"\e92a"}.icon-unfold-all:before{content:"\e931"}.icon-fold-all:before{content:"\e932"}.icon-bars:before{content:"\e948"}.icon-cards-view:before{content:"\e949"}.icon-ellipsis-v:before{content:"\e5d4"}.icon-spinner-indicator:before{content:"\e982"}.icon-up-circle:before{content:"\e92b"}.icon-right-circle:before{content:"\e92c"}.icon-down-circle:before{content:"\e92d"}.icon-left-circle:before{content:"\e92e"}.icon-angle-double-right:before{content:"\f101"}.icon-angle-down:before{content:"\e313"}.icon-angle-left:before{content:"\e314"}.icon-angle-right:before{content:"\e315"}.icon-angle-top:before{content:"\e316"}.icon-first-page:before{content:"\e5dc"}.icon-last-page:before{content:"\e5dd"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-arrow-up:before{content:"\e923"}.icon-arrow-down:before{content:"\e924"}.icon-arrow-left:before{content:"\e952"}.icon-arrow-right:before{content:"\e93e"}.icon-chevron-left:before{content:"\e934"}.icon-chevron-right:before{content:"\e935"}.icon-chevron-double-up:before{content:"\e959"}.icon-chevron-double-down:before{content:"\e95a"}.icon-folder-account:before{content:"\e942"}.icon-folder-move:before{content:"\e960"}.icon-folder-plus:before{content:"\e961"}.icon-folder-upload:before{content:"\e962"}.icon-folder-star:before{content:"\e963"}.icon-folder-edit:before{content:"\e964"}.icon-folder-download:before{content:"\e965"}.icon-folder-outline:before{content:"\e966"}.icon-folder:before{content:"\e944"}.icon-folder-o:before{content:"\e945"}.icon-folder-open-o:before{content:"\e946"}.icon-folder-open:before{content:"\e947"}.icon-color:before{content:"\e93c"}.icon-paper-clip:before{content:"\e93d"}.icon-text:before{content:"\e929"}.icon-share:before{content:"\f064"}.icon-format-list-bulleted:before{content:"\e9a8"}.icon-format-bold:before{content:"\e953"}.icon-format-header-pound:before{content:"\e954"}.icon-format-italic:before{content:"\e955"}.icon-format-list-numbers:before{content:"\e969"}.icon-format-quote-close:before{content:"\e96a"}.icon-image:before{content:"\e96c"}.icon-table-large:before{content:"\e96d"}.icon-productplan:before{content:"\e9fc"}.icon-aiux:before{content:"\e99e"}.icon-qc:before{content:"\e986"}.icon-qc-q:before{content:"\e985"}.icon-qc-c:before{content:"\e987"}.icon-sonarqube:before{content:"\e9ba"}.icon-board:before{content:"\ea15"}.icon-market:before{content:"\ea01"}.icon-ztool:before{content:"\e9c1"}.icon-contacts:before{content:"\e9c3"}.icon-chats:before{content:"\e9c4"}.icon-ops:before{content:"\e903"}.icon-menu-backend:before{content:"\e993"}.icon-feedback:before{content:"\e991"}.icon-oa:before{content:"\e9a1"}.icon-more-circle:before{content:"\e988"}.icon-controls:before{content:"\e995"}.icon-account:before{content:"\e992"}.icon-about:before,.icon-info:before{content:"\e996"}.icon-exclamation:before{content:"\e9fa"}.icon-exit:before{content:"\e99a"}.icon-theme:before{content:"\e9a0"}.icon-globe:before,.icon-lang:before{content:"\f0ac"}.icon-template:before{content:"\e9fb"}.icon-seal:before{content:"\e9f8"}.icon-menu-arrow-left:before{content:"\e9f0"}.icon-menu-arrow-right:before{content:"\e9f1"}.icon-add-directory:before{content:"\e9ef"}.icon-design:before{content:"\e9ec"}.icon-download-alt:before{content:"\e9ea"}.icon-blame:before{content:"\e9e0"}.icon-draft-edit:before{content:"\e9dc"}.icon-sub-review-user:before{content:"\e9db"}.icon-sub-review:before{content:"\e9df"}.icon-ztf:before{content:"\e9dd"}.icon-save:before{content:"\e9d8"}.icon-list-box:before{content:"\e9b4"}.icon-usecase:before{content:"\e99d"}.icon-code:before{content:"\e990"}.icon-summary:before{content:"\e9ad"}.icon-more-alt:before{content:"\e9a7"}.icon-customer:before{content:"\e9d9"}.icon-alarm:before{content:"\ea16"}.icon-treeview:before{content:"\ea0d"}.icon-or:before{content:"\ea0b"}.icon-manager:before{content:"\ea0c"}.icon-target:before{content:"\ea0a"}.icon-ipd:before{content:"\e9f9"}.icon-wiki-lib:before{content:"\e9f5"}.icon-annex-lib:before{content:"\e9f6"}.icon-interface-lib:before{content:"\e9f7"}.icon-has-authority-pack:before{content:"\e9f3"}.icon-without-authority-pack:before{content:"\e9f4"}.icon-data-structure:before{content:"\e9f2"}.icon-waterfallplus:before{content:"\e9ed"}.icon-agileplus:before{content:"\e9ee"}.icon-horn:before{content:"\e9eb"}.icon-resume:before{content:"\e9e9"}.icon-mirror:before{content:"\e9e6"}.icon-remote:before{content:"\e9e7"}.icon-moon:before{content:"\e9e8"}.icon-ticket:before{content:"\e9e1"}.icon-gantt-alt:before{content:"\e9e2"}.icon-tree:before{content:"\e9c9"}.icon-list:before{content:"\e9cb"}.icon-gantt:before{content:"\e9cc"}.icon-group-view:before{content:"\e9cd"}.icon-inherit-space:before{content:"\e9c2"}.icon-card-archive:before{content:"\e9b8"}.icon-col-archive:before{content:"\e9b9"}.icon-col-add-right:before{content:"\e9bb"}.icon-col-add-left:before{content:"\e9bc"}.icon-col-split:before{content:"\e9bd"}.icon-waterfall:before{content:"\e9a4"}.icon-manual:before{content:"\e98d"}.icon-lane:before{content:"\e9b1"}.icon-mobile:before{content:"\ea18"}.icon-clear:before{content:"\ea19"}.icon-db:before{content:"\ea17"}.icon-unpinned:before{content:"\ea08"}.icon-pinned:before{content:"\ea09"}.icon-support-ticket:before{content:"\ea04"}.icon-snap-house:before{content:"\e9e3"}.icon-wrench:before{content:"\e9e4"}.icon-desktop:before{content:"\e9e5"}.icon-back-circle:before{content:"\e9da"}.icon-back:before{content:"\e9d3"}.icon-shield:before{content:"\e9ca"}.icon-meh:before{content:"\e9ce"}.icon-frown:before{content:"\e9cf"}.icon-smile:before{content:"\e9d0"}.icon-unlock-solid:before{content:"\e9d1"}.icon-lock-solid:before{content:"\e9d2"}.icon-ver:before{content:"\e9c6"}.icon-publish:before,.icon-send:before{content:"\e9c7"}.icon-tag:before{content:"\e9be"}.icon-tag-lock:before{content:"\e9bf"}.icon-code-fork:before{content:"\f126"}.icon-branch-lock:before{content:"\e9c0"}.icon-groups:before{content:"\e9af"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-thumbs-up-solid:before{content:"\e9d6"}.icon-thumbs-down-solid:before{content:"\e9d7"}.icon-hash:before,.icon-version:before{content:"\e9ab"}.icon-p-square:before{content:"\e97b"}.icon-video-play:before{content:"\e97f"}.icon-plus-solid-circle:before{content:"\e974"}.icon-minuse-solid-circle:before{content:"\e9b6"}.icon-s:before{content:"\e975"}.icon-c:before{content:"\e976"}.icon-t:before{content:"\e977"}.icon-guide:before{content:"\e978"}.icon-todo:before{content:"\e979"}.icon-plus:before{content:"\e925"}.icon-side-left:before{content:"\e9b3"}.icon-side-right:before{content:"\e9b2"}.icon-fullscreen-exit:before{content:"\e972"}.icon-alert:before{content:"\e99f"}.icon-undo:before{content:"\e93f"}.icon-redo:before{content:"\e9d4"}.icon-swap:before{content:"\e9b0"}.icon-chat-solid:before{content:"\e9b5"}.icon-clock:before{content:"\e97c"}.icon-cost:before{content:"\e97d"}.icon-pencil-alt:before{content:"\e984"}.icon-size-height:before{content:"\e9c5"}.icon-upload-file:before{content:"\ea03"}.icon-file-log:before{content:"\e9de"}.icon-rich-text:before{content:"\e913"}.icon-markdown:before{content:"\e916"}.icon-excel:before{content:"\e933"}.icon-text-link:before{content:"\e94d"}.icon-ppt:before{content:"\e957"}.icon-word:before{content:"\e958"}.icon-doc-lib:before{content:"\e96f"}.icon-file-empty:before,.icon-file:before{content:"\f016"}.icon-file-text:before{content:"\f0f6"}.icon-file-alt:before{content:"\f15b"}.icon-file-text-alt:before{content:"\f15c"}.icon-file-pdf:before{content:"\f1c1"}.icon-file-word:before{content:"\f1c2"}.icon-file-excel:before{content:"\f1c3"}.icon-file-powerpoint:before{content:"\f1c4"}.icon-file-image:before{content:"\f1c5"}.icon-file-archive:before{content:"\f1c6"}.icon-file-audio:before{content:"\f1c7"}.icon-file-video:before{content:"\f1c8"}.icon-file-code:before{content:"\f1c9"}.icon-multi-input:before{content:"\ea1a"}.icon-cell-input:before{content:"\ea0e"}.icon-input:before{content:"\ea0f"}.icon-checkbox:before{content:"\ea10"}.icon-radio:before{content:"\ea11"}.icon-transition:before{content:"\ea12"}.icon-add-sub-chapter:before{content:"\ea13"}.icon-add-chapter:before{content:"\ea14"}.icon-menu-collapse:before{content:"\e980"}.icon-menu-expand:before{content:"\e981"}.icon-estimate:before{content:"\e9ac"}.icon-sprint:before{content:"\e9a2"}.icon-shield-check:before{content:"\e9a5"}.icon-ok:before{content:"\e9a6"}.icon-printer:before{content:"\e906"}.icon-bullhorn:before{content:"\e910"}.icon-person:before{content:"\e941"}.icon-fields:before{content:"\e989"}.icon-trigger:before{content:"\e98a"}.icon-layout:before{content:"\e98b"}.icon-audit:before{content:"\e98c"}.icon-ban-circle:before,.icon-cancel:before{content:"\e951"}.icon-eye:before{content:"\e94e"}.icon-eye-off:before{content:"\e96e"}.icon-unlock:before{content:"\e94f"}.icon-lock:before,.icon-private:before{content:"\e950"}.icon-move:before{content:"\e94c"}.icon-hand-right:before{content:"\e907"}.icon-checked:before{content:"\e908"}.icon-off:before{content:"\e909"}.icon-play:before,.icon-start:before{content:"\e90a"}.icon-time:before{content:"\e90b"}.icon-edit:before{content:"\e90c"}.icon-trash:before{content:"\e90d"}.icon-link:before{content:"\e90e"}.icon-unlink:before{content:"\e90f"}.icon-bug:before{content:"\e911"}.icon-list-alt:before{content:"\e912"}.icon-alter:before,.icon-change:before{content:"\e970"}.icon-glasses:before,.icon-review:before{content:"\e914"}.icon-sitemap:before,.icon-testcase:before{content:"\e915"}.icon-pluses:before{content:"\e917"}.icon-report-list:before{content:"\e918"}.icon-active:before,.icon-magic:before{content:"\e919"}.icon-treemap:before{content:"\e91a"}.icon-confirm:before{content:"\e91b"}.icon-split:before{content:"\e98e"}.icon-calendar:before,.icon-delay:before{content:"\e91d"}.icon-pause:before{content:"\e91e"}.icon-ban:before{content:"\e91f"}.icon-plus-bold:before{content:"\e920"}.icon-copy:before{content:"\e921"}.icon-refresh:before{content:"\e922"}.icon-diff:before{content:"\e9b7"}.icon-docspace:before{content:"\ea1b"}.icon-doclib:before{content:"\ea1c"}.status-active,.status-asked,.status-normal,.status-unconfirmed,.status-wait{color:var(--color-status-normal,#313c52)}.status-active.status-issue,.status-checking,.status-commenting,.status-confirmed,.status-doing{color:#ff6f42}.status-blocked,.status-hangup,.status-pause,.status-suspended{color:#b89664}.status-clarify,.status-draft{color:#8166ee}.status-noreview,.status-reviewing,.status-wait.status-testcase{color:#18a6fd}.status-active.status-risk,.status-changed,.status-changing,.status-fail{color:#fb2b2b}.status-checked,.status-done,.status-pass,.status-replied,.status-resolved,.status-success{color:#0dbb7d}.status-cancel,.status-canceled,.status-investigate{color:var(--color-status-cancel,#838a9d)}.status-closed,.status-testtask.status-done{color:var(--color-status-closed,#9ea3b0)}.dark{--color-status-normal:#eff1f3;--color-status-cancel:#9ea3b0;--color-status-closed:#838a9d}@media (prefers-color-scheme:dark){.dark-auto{--color-status-normal:#eff1f3;--color-status-cancel:#9ea3b0;--color-status-closed:#838a9d}}.pri,[class*=" pri-"],[class^=pri-]{border-color:currentColor;border-radius:var(--radius-full);border-width:1px;display:inline-block;font-size:.75rem;height:1rem;line-height:1rem;line-height:14px;max-width:54px;min-width:16px;overflow:hidden;padding-left:.125rem;padding-right:.125rem;text-align:center;white-space:nowrap;--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.pri-1{color:rgb(255 73 18/var(--tw-text-opacity))}.pri-1,.pri-2{--tw-text-opacity:1}.pri-2{color:rgba(var(--color-warning-600-rgb),var(--tw-text-opacity))}.pri-3{color:rgb(59 130 246/var(--tw-text-opacity))}.pri-3,.pri-4{--tw-text-opacity:1}.pri-4{color:rgb(149 211 224/var(--tw-text-opacity))}.severity{display:inline-block;font-size:.75rem;height:1rem;line-height:1rem;line-height:14px;max-width:54px;min-width:16px;overflow:hidden;padding-left:.125rem;padding-right:.125rem;position:relative;text-align:center;white-space:nowrap;--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.severity:before{background-color:currentColor;background-repeat:no-repeat;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;--tw-content:attr(data-severity);content:var(--tw-content);-webkit-mask:url('data:image/svg+xml;charset=utf-8,');mask:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-size:100% 100%;mask-size:100% 100%}.severity:after,.severity:before{display:inline-block}.severity:after{--tw-scale-x:.75;--tw-scale-y:.75;content:attr(data-severity);line-height:20px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.severity[data-severity="1"]{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.severity[data-severity="2"]{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.severity[data-severity="3"]{--tw-text-opacity:1;color:rgb(250 174 26/var(--tw-text-opacity))}.severity[data-severity="4"]{--tw-text-opacity:1;color:rgb(184 150 100/var(--tw-text-opacity))}.severity[data-severity="5"]{--tw-text-opacity:1;color:rgb(158 163 176/var(--tw-text-opacity))}.severity-label{background-color:transparent}.severity-label:after,.severity-label:before{--tw-content:none;content:var(--tw-content)}.risk-high{color:rgb(220 38 38/var(--tw-text-opacity))}.risk-high,.risk-middle{--tw-text-opacity:1}.risk-middle{color:rgb(234 179 8/var(--tw-text-opacity))}.label.label-id{border-radius:var(--radius-full);flex:none;--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-300-rgb),var(--tw-ring-opacity));--label-bg:rgba(var(--color-canvas-rgb),.1)}.nav-feature{--nav-active-bg:var(--color-primary-100);--nav-active-color:var(--color-fore)}.nav-feature .nav-checkbox>.checkbox,.nav-feature .nav-checkbox>.checkbox-primary,.nav-feature .nav-item>a{align-items:center;border-radius:var(--radius);height:2rem;padding-left:.625rem;padding-right:.625rem}.nav-feature .nav-item>a>.icon{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.sortable-list .listitem{cursor:move;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-left:.5rem;padding-right:.5rem}.sortable-list .sortable-ghost>.listitem{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-50-rgb),var(--tw-bg-opacity))}.sortable-empty-shadow{height:1px!important;left:0!important;opacity:0!important;pointer-events:none!important;position:absolute!important;top:0!important;width:1px!important}:root{--avatar-radius:12.5%;--avatar-bg:var(--color-surface)}.avatar{align-items:center;aspect-ratio:1/1;background:var(--avatar-bg);border-radius:var(--avatar-radius);display:inline-flex;justify-content:center;overflow:hidden;width:2rem}.avatar>img{height:100%;margin:0;-o-object-fit:cover;object-fit:cover;width:100%}.avatar.size-xs{width:1.25rem}.avatar.size-sm,.avatar.size-xs{font-size:.75rem;line-height:1rem}.avatar.size-sm{width:1.5rem}.avatar.size-lg{font-size:1.5rem;line-height:2rem;width:3rem}.avatar.size-xl{font-size:2.25rem;line-height:2.5rem;width:5rem}.avatar-group{display:flex;gap:.625rem}.avatar-group>.avatar{box-shadow:0 0 0 1px var(--color-canvas)}.avatar-group>*+*{margin-left:-1rem}.avatar-group.size-xs>*+*{margin-left:-.75rem}.avatar-group.size-sm>*+*{margin-left:-.875rem}.avatar-group.size-lg>*+*{margin-left:-1.25rem}.avatar-group.size-xl>*+*{margin-left:-1.5rem}.btn-group{display:flex;gap:1px}.btn-group>.btn.active{z-index:1}.btn-group>.btn:focus-within,.btn-group>.btn:hover{z-index:2}.btn-group>.btn.disabled,.btn-group>.btn:disabled{z-index:0}.btn-group>.btn:not(:first-child){border-bottom-left-radius:var(--radius-none);border-left-color:rgba(var(--color-canvas-rgb),.2);border-left-width:1px;border-top-left-radius:var(--radius-none)}.btn-group>.btn:not(:first-child):before{left:-1px}.btn-group>.btn:not(:last-child){border-bottom-right-radius:var(--radius-none);border-top-right-radius:var(--radius-none)}.color-picker-heading{align-items:center;font-weight:700;justify-content:space-between;margin-bottom:-.25rem;padding:.5rem}.color-picker-heading,.color-picker-row{display:flex;flex-direction:row}.color-picker-row{flex-wrap:wrap;gap:.5rem;padding:.75rem}.color-picker-item{align-items:center;border-radius:var(--radius-full);display:flex;height:1.25rem;justify-content:center;padding-left:.125rem;padding-right:.125rem;width:1.25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.pick-container{left:0;pointer-events:none;position:absolute;top:0;z-index:1600}.pick-pop{display:flex;flex-direction:column;opacity:0;pointer-events:auto;position:absolute;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);z-index:1200}.pick-pop.in{opacity:1}.date-picker-menu{--menu-bg:none}.date-picker-menu .mini-calendar{margin-top:-.75rem}.date-pick-menu-month,.date-pick-menu-years{display:flex;flex-direction:row;flex-wrap:wrap;gap:1px;max-height:237px;padding-bottom:.5rem;padding-left:.5rem;padding-right:.5rem}.date-pick-menu-years>.btn{width:2.5rem}.date-pick-menu-years>.btn.is-current{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.date-pick-menu-month>.btn.active,.date-pick-menu-years>.btn.active{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.date-pick-menu-month>.btn{width:3rem}.date-picker-menu-footer{border-top-width:1px;display:flex;flex-direction:row;padding:.25rem}.date-picker-menu-footer>.toolbar{flex:1 1 auto;justify-content:center}.date-picker-menu>.menu{border-right-width:1px}.date-picker-menu .menu-item{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.time-picker-menu{max-height:inherit}.time-picker-menu .menu-item>a{justify-content:center;padding-left:0;padding-right:0;text-align:center}.datetime-picker-menu{max-height:inherit}.mini-calendar{padding:.5rem}.mini-calendar>.row>.col{align-items:center;justify-content:center;width:14.2857%}.mini-calendar-day{height:2rem}.mini-calendar-day.disabled{pointer-events:none;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-200-rgb),var(--tw-bg-opacity));opacity:.5}.mini-calendar-day>.btn{width:2rem}.mini-calendar-day.is-weekend>.btn{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.mini-calendar-day.active>.btn,.mini-calendar-day.is-today>.btn{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.mini-calendar-day.selected>.btn{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.mini-calendar-day.is-out-month{opacity:.5}.i-time{border-color:currentColor;border-radius:50%;border-width:.08em;display:inline-block;height:1em;position:relative;width:1em}.i-time:after{border-color:currentColor;border-width:0 0 .08em .08em;height:.385em;left:.3846em;position:absolute;top:.08em;width:.385em;--tw-content:"";content:var(--tw-content)}.chevron-down,.chevron-left,.chevron-right,.chevron-up{align-items:center;display:inline-flex;height:1em;justify-content:center;position:relative;width:1em}.chevron-down:before,.chevron-left:before,.chevron-right:before,.chevron-up:before{display:block;height:.6923077em;transform-origin:center;width:.6923077em;--tw-translate-y:-0.125rem;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.chevron-left:before{--tw-translate-y:0px;--tw-translate-x:0.125rem;--tw-rotate:135deg}.chevron-left:before,.chevron-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-right:before{--tw-translate-y:0px;--tw-translate-x:-0.125rem;--tw-rotate:-45deg}.chevron-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.i-calendar{border-radius:2px;display:inline-block;height:.79em;margin-top:.16em;position:relative;width:1em}.i-calendar,.i-calendar:after,.i-calendar:before{border-color:currentColor;border-width:.08em}.i-calendar:after,.i-calendar:before{position:absolute;--tw-content:"";content:var(--tw-content)}.i-calendar:before{border-bottom-width:0;left:.15em;top:.307em;width:.6em}.i-calendar:after{border-bottom-width:0;border-top-width:0;height:.3077em;left:.17em;top:-.154em;width:.538em}:root{--modal-radius:var(--radius-lg);--modal-bg:rgba(var(--color-inverse-rgb),.4);--modal-sm:37.5rem;--modal-base:50rem;--modal-lg:75rem;--modal-xl:90rem}.modal{align-items:center;background-color:var(--modal-bg);bottom:0;display:none;justify-content:center;left:0;overflow:hidden;position:fixed;right:0;top:0;z-index:1500}.modal.load-indicator:before{background-color:transparent;transition-property:none}.modal.loading:after{--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.modal.loading .modal-dialog{opacity:0!important}.modal.show{display:flex}.modal-no-backdrop{background-color:transparent;pointer-events:none}.modal-hide{opacity:0!important}.modal-dialog{background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));pointer-events:auto;position:relative;--tw-bg-opacity:0.9;--tw-shadow:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--tw-shadow-colored:0 10px 50px -10px var(--tw-shadow-color),0 8px 20px -10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);border-radius:var(--modal-radius);width:var(--modal-base)}.modal-content,.modal-dialog{max-height:100vh}.modal-content{display:flex;flex-direction:column;height:100%}.loading>.modal-dialog>.modal-content{opacity:0;visibility:hidden}.modal-dialog.loading{background-color:transparent}.modal-dialog.loading>.modal-content{display:none}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.modal-header{align-items:center;display:flex;flex:none;flex-wrap:nowrap;gap:1rem;padding:1rem 1.25rem;position:relative}.modal-title{flex:1 1 auto;font-size:1rem;font-weight:700;line-height:1.5rem}.modal-actions{position:absolute;right:.75rem;top:.75rem;z-index:15}.modal-body{flex:1 1 auto;overflow:auto;padding:1rem 1.25rem}.modal-footer{align-items:center;display:flex;flex:none;gap:.75rem;padding:1.25rem}.modal-dialog.size-full,.modal-dialog[data-size=full]{border-radius:var(--radius-none);height:100vh;width:100vw}.modal-dialog.size-sm,.modal-dialog[data-size=sm]{width:var(--modal-sm)}.modal-dialog.size-lg,.modal-dialog[data-size=lg]{width:var(--modal-lg)}.modal-dialog.size-xl,.modal-dialog[data-size=xl]{width:var(--modal-xl)}.modal-iframe{flex:1 1 auto;width:100%}.modal-trans{opacity:0;transition-duration:.2s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.modal-trans.in{opacity:1}.modal-trans>.modal-dialog{transition-property:transform,opacity;--tw-scale-x:.95;--tw-scale-y:.95;opacity:0;transition-duration:.3s}.modal-trans.in>.modal-dialog,.modal-trans>.modal-dialog{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.modal-trans.in>.modal-dialog{--tw-scale-x:1;--tw-scale-y:1;opacity:1}.modal-alert .modal-footer{justify-content:flex-end}.modal-alert .modal-header{margin-bottom:-1rem}.modal-alert .modal-body{overflow-wrap:break-word;white-space:pre-line}.modal-alert .modal-actions+.modal-body{padding-right:3rem}.modal-alert .modal-header+.modal-actions+.modal-body{padding-right:1.25rem}.file-selector{gap:.5rem;width:100%}.file-selector,.file-selector-box{display:flex;flex-direction:column}.file-selector-box{border-style:dashed;border-width:1px;gap:0;height:auto;justify-content:center;position:relative;--tw-border-opacity:1;background-color:rgba(var(--color-primary-50-rgb),.3);border-color:rgba(var(--color-primary-400-rgb),var(--tw-border-opacity));padding:.5rem .75rem;--tw-ring-color:transparent;--state-color:rgba(var(--color-primary-500-rgb),.05)}.file-selector-box .text{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.is-dragging .file-selector-box{border-style:solid}.file-selector-btn{align-items:center;display:flex;gap:.5rem;position:relative}.is-dragging .file-selector-btn{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.file-selector-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;bottom:0;cursor:pointer;left:0;opacity:.1;position:absolute;right:0;top:0}.file-selector-tip{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.file-selector.is-mode-button{flex-direction:column-reverse}.file-selector-list.is-empty{display:none}.file-selector-item .item-avatar{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.file-selector-item .item-subtitle{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.file-selector-item .item-content{flex:none;margin-right:.25rem;max-width:100%}.file-selector-item>.listitem:hover{background-color:rgba(var(--color-gray-500-rgb),.05)}.file-selector-item.is-renaming .item-avatar+.item-content{max-width:calc(100% - 32px)}.file-selector-rename-text{max-width:100%;min-width:100px;position:relative}.file-selector-rename-text>div{overflow:hidden;pointer-events:none;visibility:hidden;white-space:nowrap}.file-selector-rename-input{bottom:0;left:0;position:absolute;right:0;top:0}.file-selector-grid{align-items:flex-start;border-color:transparent;border-radius:var(--radius);border-width:1px;display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--file-selector-grid-gap);--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity));padding:.5rem}.file-selector-grid-item{height:var(--file-selector-grid-height)}.file-selector-grid-btn,.file-selector-grid-item{width:var(--file-selector-grid-width)}.file-selector-grid-btn{aspect-ratio:1/1;border-style:dashed;border-width:1px;display:flex;flex-direction:column;gap:0;height:auto;justify-content:center;--tw-border-opacity:1;background-color:rgba(var(--color-primary-50-rgb),.3);border-color:rgba(var(--color-primary-400-rgb),var(--tw-border-opacity));padding:.5rem;--tw-ring-color:transparent;--state-color:rgba(var(--color-primary-500-rgb),.05)}.file-selector-grid-btn .text{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.file-selector-grid-item .listitem{flex-direction:column;height:100%;padding:0;position:relative;width:100%}.file-selector-grid-item .item-avatar{border-radius:var(--radius);border-width:1px;width:100%;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.file-selector-grid-item .item-avatar.has-icon>.icon{font-size:calc(var(--file-selector-grid-width)/2)}.file-selector-grid-item .item-content,.file-selector-grid-item .toolbar{aspect-ratio:1/1;left:0;position:absolute;right:0;top:0;width:100%}.file-selector-grid-item .item-title{bottom:-1.25rem;font-size:.75rem;left:0;line-height:1rem;overflow:hidden;position:absolute;right:1.5rem;white-space:nowrap}.file-selector-grid-item .item-subtitle{border-radius:var(--radius-full);bottom:.25rem;left:.25rem;position:absolute;--tw-bg-opacity:1;background-color:rgba(var(--color-fore-rgb),var(--tw-bg-opacity));font-size:.75rem;line-height:1rem;padding-left:.25rem;padding-right:.25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.file-selector-grid-item:hover .item-subtitle{opacity:1}.file-selector-grid-item .toolbar .btn[data-remove-file]{background-color:rgba(var(--color-inverse-rgb),.5);padding:.375rem;position:absolute;right:1px;top:1px;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.file-selector-grid-item .toolbar .btn[data-rename-file]{bottom:-1.5rem;padding:0;position:absolute;right:0}.file-selector-grid .file-selector-rename{bottom:0;height:1.5rem;position:absolute;top:auto}.file-selector-grid .file-selector-rename-text{width:100%}.is-dragging .file-selector-grid{border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-primary-400-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}:root{--nav-radius:var(--radius);--nav-active-color:var(--color-primary-500);--nav-active-bg:var(--color-inherit);--nav-heading-color:var(--color-gray-500);--nav-gap:0.25rem;--nav-item-color:inherit;--nav-item-bg:transparent;--nav-item-padding:1rem;--nav-item-height:2rem;--nav-item-gap:0.75rem;--nav-divider-height:calc(var(--nav-item-height)/2);--nav-divider-margin:0.5rem}.nav{list-style-type:none;padding-left:0}.nav,.nav-item{align-items:center;display:flex;position:relative}.nav-item{gap:var(--nav-item-gap)}.nav-item>a{align-items:center;background-color:var(--nav-item-bg);color:var(--nav-item-color);cursor:pointer;display:flex;gap:var(--nav-gap);height:var(--nav-item-height);justify-content:center;padding-left:var(--nav-item-padding);padding-right:var(--nav-item-padding)}.nav-item>a>.text{white-space:nowrap}.nav-item>.active{font-weight:700;--nav-item-color:var(--nav-active-color);--nav-item-bg:var(--nav-active-bg)}.nav-item>.selected{--nav-item-color:var(--nav-selected-color);--nav-item-bg:var(--nav-selected-bg)}.nav-item>.disabled{--nav-item-color:var(--nav-disabled-color);--nav-item-bg:var(--nav-disabled-bg)}.nav-item>.disabled>*{opacity:var(--opacity-disabled)}.nav-divider,.nav>.divider{align-self:center;height:var(--nav-divider-height);margin-left:var(--nav-divider-margin);margin-right:var(--nav-divider-margin)}.nav-heading{align-items:center;color:var(--nav-heading-color);display:flex;font-weight:700;gap:.25rem;height:2rem;justify-content:center;padding-left:1rem;padding-right:1rem}.nav-space{flex:1 1 auto;width:1rem}.nav-compact{--nav-gap:0.25rem;--nav-item-gap:0.5rem;--nav-item-height:1.75rem;--nav-item-padding:0.5rem;--nav-divider-margin:0.25rem}.nav-primary>.nav-item{position:relative}.nav-primary>.nav-item:hover{z-index:10}.nav-primary>.nav-item+.nav-item{margin-left:-1px}.nav-primary>.nav-item>a{border-radius:var(--radius-none);border-width:1px}.nav-primary>.nav-item:first-child>a,.nav-primary>.nav-item:has(.nav-heading)+.nav-item>a{border-bottom-left-radius:var(--nav-radius);border-top-left-radius:var(--nav-radius)}.nav-primary>.nav-item:last-child>a{border-bottom-right-radius:var(--nav-radius);border-top-right-radius:var(--nav-radius)}.nav-primary>.nav-item>.active{--tw-text-opacity:1;background:var(--nav-active-color);border-color:var(--nav-active-color);color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.nav-primary>.nav-divider{display:none}.nav-secondary>.nav-item>a{border-radius:var(--radius-none);position:relative}.nav-secondary>.nav-item>a:after{bottom:-2px;display:block;height:2px;left:0;position:absolute;right:0;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}.nav-secondary>.nav-item>.active:after{background-color:currentColor}.nav-secondary>.nav-divider{margin:0 0 0 -1px}.nav-tabs>.nav-item>a{border-bottom-left-radius:var(--radius-none);border-bottom-right-radius:var(--radius-none);position:relative}.nav-tabs>.nav-item>a:after{border-color:transparent;border-width:1px;bottom:-1px;display:block;left:-1px;pointer-events:none;position:absolute;right:-1px;top:-1px;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-content:"";border-top-left-radius:inherit;border-top-right-radius:inherit;content:var(--tw-content)}.nav-tabs>.nav-item>.active:after{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));border-bottom-color:transparent}.nav-tabs>.nav-divider{margin:0 0 0 -1px}.nav-pills>.nav-item>a{border-radius:var(--radius-full)}.nav-pills>.nav-item>.active{--tw-text-opacity:1;background:var(--nav-active-color);border-color:var(--nav-active-color);color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.nav-steps{--nav-item-bg:var(--color-canvas);--nav-active-bg:var(--color-primary-500);--nav-active-color:var(--color-canvas);--nav-selected-bg:var(--color-secondary-500);--nav-selected-color:var(--color-canvas)}.nav-steps>.nav-item+.nav-item>a{padding-left:calc(var(--nav-item-padding) + var(--nav-item-height)/3)}.nav-steps>.nav-item>a:after,.nav-steps>.nav-item>a:before{border-style:solid;height:0;left:100%;position:absolute;width:0;z-index:2;--tw-content:"";border-color:transparent;border-left-color:var(--nav-item-bg,var(--color-canvas));border-width:calc(var(--nav-item-height)/2);border-left-width:calc(var(--nav-item-height)/3);border-right-width:0;content:var(--tw-content)}.nav-steps>.nav-item>a:before{background-color:transparent!important;border-left-color:var(--color-border);bottom:auto;left:calc(100% + 5.5px);opacity:1!important;right:auto;top:.4rem;transform:none;z-index:1;--nav-item-height:1.2rem}.nav-steps>.nav-item:has(+.nav-item>.active)>.selected:before,.nav-steps>.nav-item:has(+.nav-item>.active,+.nav-item>.selected)>a:not(.active,.selected):before,.nav-steps>.nav-item:has(+.nav-item>.selected)>.active:before,.nav-steps>.nav-item:last-child>a:after,.nav-steps>.nav-item:last-child>a:before{display:none}.nav-steps>.nav-item>a:hover{--nav-item-bg:var(--color-gray-100)}.nav-steps>.nav-item>.active:hover{--nav-item-bg:var(--color-primary-600)}.nav-steps>.nav-item>.selected:hover{--nav-item-bg:var(--color-secondary-600)}.nav-stacked{flex-direction:column}.nav-stacked>.nav-item{width:100%}.nav-stacked>.nav-heading,.nav-stacked>.nav-item>a{justify-content:flex-start;width:100%}.nav-stacked>.nav-divider{height:1px;margin:.5rem 0;width:100%}.nav-primary.nav-stacked>.nav-item>a{height:2.5rem}.nav-primary.nav-stacked>.nav-item+.nav-item{margin-left:0;margin-top:-1px}.nav-primary.nav-stacked>.nav-item:first-child>a{border-bottom-left-radius:0;border-top-left-radius:var(--nav-radius);border-top-right-radius:var(--nav-radius)}.nav-primary.nav-stacked>.nav-item:last-child>a{border-bottom-left-radius:var(--nav-radius);border-bottom-right-radius:var(--nav-radius);border-top-right-radius:0}.nav-secondary.nav-stacked>.nav-item>a:after{bottom:0;height:100%;left:auto;right:0;top:0;width:2px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity))}.nav-secondary.nav-stacked>.nav-item>.active:after{background-color:currentColor}.nav-secondary.nav-stacked>.nav-divider{margin:0}.nav-tabs.nav-stacked>.nav-item>a{border-bottom-left-radius:var(--nav-radius);border-bottom-right-radius:var(--radius-none);border-top-right-radius:var(--radius-none);position:relative}.nav-tabs.nav-stacked>.nav-item>a:after{--tw-border-opacity:1;border-bottom-color:transparent;border-bottom-left-radius:inherit;border-right-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));border-top-left-radius:inherit}.nav-tabs.nav-stacked>.nav-item>a.active:after{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));border-right-color:transparent}.nav-tabs.nav-stacked>.nav-divider{margin:0}.nav-pills.nav-stacked>.nav-item+.nav-item{margin-top:.25rem}.nav-justified>.nav-item:not(.flex-none,.nav-divider){flex:1 1 auto}.nav-justified>.nav-item>a{width:100%}.arrow,.arrow:before{background:inherit;height:calc(var(--arrow-size)*1.4142);position:absolute;width:calc(var(--arrow-size)*1.4142)}.arrow{visibility:hidden;--arrow-size:5px}.arrow:before{border:inherit;content:"";visibility:visible;--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.arrow-top,.arrow-up{border-bottom:inherit;border-right:inherit;border-width:1px 0 0 1px;top:calc(1px - var(--arrow-size))}.white>.arrow-top,.white>.arrow-up{top:calc(0px - var(--arrow-size))}.arrow-bottom,.arrow-down{border-left:inherit;border-top:inherit;border-width:0 1px 1px 0;bottom:calc(1px - var(--arrow-size))}.white>.arrow-bottom,.white>.arrow-down{bottom:calc(0px - var(--arrow-size))}.arrow-left{border-right:inherit;border-top:inherit;border-width:0 0 1px 1px;left:calc(1px - var(--arrow-size))}.white>.arrow-left{left:calc(0px - var(--arrow-size))}.arrow-right{border-bottom:inherit;border-left:inherit;border-width:1px 1px 0 0;right:calc(1px - var(--arrow-size))}.white>.arrow-right{right:calc(0px - var(--arrow-size))}.popover{display:none;left:0;position:absolute;top:0;width:-moz-max-content;width:max-content}.popover.show{display:block}.popover-heading{align-items:center;border-top-left-radius:inherit;border-top-right-radius:inherit;display:flex;gap:1rem;height:2.5rem;justify-content:space-between;position:relative;z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:.75rem;padding-right:.5rem}.popover-title{flex:1 1 auto;font-weight:700}.popover-content{padding:.75rem;position:relative;z-index:1}.popover-arrow{z-index:0}.has-heading>.popover-arrow.arrow-top,.has-heading>.popover-arrow.arrow-up{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.popover>.btn-close{position:absolute;right:.5rem;top:.625rem;z-index:2}.btn-close+.popover-content{padding-right:3rem}.btn.with-popover-show{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.with-popover-show[data-pop-placement=top]>.caret{--tw-rotate:180deg}.with-popover-show[data-pop-placement=left]>.caret,.with-popover-show[data-pop-placement=top]>.caret{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.with-popover-show[data-pop-placement=left]>.caret{--tw-rotate:90deg}.with-popover-show[data-pop-placement=right]>.caret{--tw-rotate:-90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pager{align-items:center;display:flex;gap:.25rem;white-space:nowrap}.menu.pager-size-menu{display:grid!important;grid-template-columns:repeat(3,minmax(0,1fr));text-align:center}.menu.pager-size-menu>.menu-item>a{margin:.125rem}.pager .pager-goto-group>.form-control{width:3rem}.pager .pager-goto-group>.input-group-addon{border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-gray-300-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.pager>.pager-nav.active{--tw-text-opacity:1;box-shadow:0 0 0 1px var(--color-primary-500);color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.panel{border-radius:var(--radius);overflow:hidden;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05}.panel-heading{background-color:var(--panel-heading-bg);flex-wrap:nowrap;gap:1rem;justify-content:space-between;padding:.5rem 1rem}.panel-heading,.panel-title{align-items:center;display:flex}.panel-title{font-weight:700;gap:.5rem;margin:0}.panel-actions{align-items:center;display:flex;margin-right:-.5rem}.panel-body{padding:.75rem 1rem}.panel-footer{align-items:center;background-color:var(--panel-footer-bg);display:flex;gap:.5rem;padding:.5rem 1rem}.size-sm .panel-body,.size-sm .panel-footer,.size-sm .panel-heading{padding:.375rem .75rem}.size-lg .panel-body,.size-lg .panel-footer,.size-lg .panel-heading{padding:1rem 1.25rem}.picker{position:relative}.picker-select{align-items:center;gap:.25rem;justify-content:space-between}.picker-select,.picker-select.form-control{display:flex}.picker-select-placeholder{flex:1 1 auto;--tw-text-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-text-opacity))}.picker-select-multi .picker-select-placeholder{padding-left:.25rem;padding-right:.25rem}.picker-single-selection{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap}.picker-deselect-btn{border-radius:var(--radius-full);padding:.25rem}.picker-deselect-btn:not(:hover){opacity:.7}.picker-select-multi.form-control{height:auto;min-height:32px;padding-left:.25rem}.picker-multi-selections{display:flex;flex-wrap:wrap;gap:.25rem;min-width:0}.picker-multi-selection{align-items:center;border-radius:var(--radius-full);border-width:1px;display:flex;max-width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:.5rem}.readonly .picker-multi-selection{padding-right:.5rem}.picker-multi-selection>.text{max-width:180px;min-width:0;overflow:clip;white-space:nowrap}.picker-no-search{cursor:default}.picker-menu-list{border-style:none;flex:1 1 auto;min-height:0;overflow-y:auto;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.picker-menu-search+.picker-menu-list.menu{margin-top:-.125rem;padding-top:0}.picker-menu-list.tree{padding:.5rem}.picker-menu-list .tree-item>.selected .item-content{font-weight:400}.picker-menu .search-menu-footer{border-top-width:1px;padding-bottom:.25rem;padding-top:.25rem}.picker-search-input{border-color:transparent;height:1.75rem;outline-width:0!important;padding-left:0;padding-right:2rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.picker-search{flex:none;position:relative;width:100%}.picker-search>.magnifier{opacity:.5;position:absolute;right:0;top:.5rem}.picker-search-clear.btn{cursor:pointer;height:1.25rem;position:absolute;right:0;top:.25rem;width:1.25rem}.picker-search.is-inline{min-width:64px;width:4rem}.is-inline>.picker-search-input{height:1.25rem;min-width:64px;padding-left:.25rem;padding-right:.25rem}.picker-search-measure{height:0;left:0;overflow:hidden;position:absolute;top:0;white-space:nowrap}.split{display:flex;flex-direction:row}.split-vert{flex-direction:column}.split-cell{min-height:0;min-width:0}.has-animation>.split-cell{transition-duration:.15s;transition-property:width,height;transition-timing-function:cubic-bezier(.4,0,.2,1)}.gutter{align-items:stretch;border-radius:var(--radius);cursor:col-resize;display:flex;flex:none;flex-direction:row;justify-content:center;position:relative}.gutter-vert{cursor:row-resize;flex-direction:column}.gutter:before{display:block;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:"";content:var(--tw-content)}.gutter-horz:before{width:1px}.gutter-vert:before{height:1px}.gutter-horz:hover:before{width:75%}.gutter-vert:hover:before{height:75%}.gutter-resize-handler,.gutter-toggle{align-items:center;border-radius:var(--radius-lg);border-width:1px;display:flex;height:1.75rem;justify-content:center;margin-top:-.875rem;position:absolute;top:50%;width:.75rem;--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity));transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.gutter-toggle>span{--tw-scale-x:.75;--tw-scale-y:.75;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.gutter:hover .gutter-toggle{--tw-border-opacity:1;border-color:rgba(var(--color-gray-500-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.gutter .gutter-toggle:hover{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.is-last>.gutter-toggle{--tw-scale-x:-1}.is-first>.gutter-toggle,.is-last>.gutter-toggle{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.is-first>.gutter-toggle{--tw-scale-x:1}.gutter-vert .gutter-toggle{left:50%;margin-left:-.375rem;margin-top:0;top:auto;--tw-rotate:90deg}.gutter-vert .gutter-toggle,.gutter.is-next-collapsed>.gutter-toggle{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.gutter.is-next-collapsed>.gutter-toggle{--tw-scale-x:1}.gutter.is-prev-collapsed>.gutter-toggle{--tw-scale-x:-1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.gutter-horz.is-first.is-prev-collapsed{transform:translateX(calc(-1px - var(--split-gutter-size)/2))}.gutter-horz.is-last.is-next-collapsed{transform:translateX(calc(1px + var(--split-gutter-size)/2))}.gutter-vert.is-first.is-prev-collapsed{transform:translateY(calc(-1px - var(--split-gutter-size)/2))}.gutter-vert.is-last.is-next-collapsed{transform:translateY(calc(1px + var(--split-gutter-size)/2))}.gutter-resize-handler{background-color:transparent;border-width:0}.gutter-resize-handler:before{border-left-width:1px;border-right-width:1px;bottom:0;left:.25rem;position:absolute;right:.25rem;top:0;--tw-content:"";content:var(--tw-content)}.sidebar{flex:none!important;position:relative;--gutter-width:1px;--sidebar-duration:200ms}.has-sidebar-animation .sidebar{transition-duration:.15s;transition-duration:var(--sidebar-duration);transition-property:width,margin;transition-timing-function:cubic-bezier(.4,0,.2,1)}.sidebar-left.is-collapsed{margin-left:calc(var(--gutter-width)*-1)}.sidebar-right.is-collapsed{margin-right:calc(var(--gutter-width)*-1)}.sidebar.is-collapsed>*,.sidebar.is-expanded.is-animating>*{display:none}.sidebar.is-collapsed>.sidebar-gutter{display:flex!important}.sidebar-gutter{bottom:0;left:100%;position:absolute;top:0;width:var(--gutter-width)}.sidebar-right>.sidebar-gutter{left:auto;right:100%}.is-collapsed>.gutter>.gutter-toggle>span{--tw-rotate:-180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sidebar-gutter:before{border-radius:var(--radius-full);opacity:0}.sidebar-gutter:hover:before{opacity:1;width:.5rem}.is-expanded .sidebar-gutter.gutter-border:before{opacity:1}.is-sidebar-resizing{cursor:col-resize}:root{--table-head-bg:var(--color-surface);--table-striped-color:var(--color-gray-50);--table-hover-color:rgba(var(--color-primary-500-rgb),.05);--table-border-color:var(--color-border)}.table{border-color:var(--table-border-color);width:100%}.table>thead{background-color:var(--table-head-bg)}.table>*>tr{border-bottom-width:1px}.table>*>tr>*{padding:.5rem 1rem}.table-striped>tbody>tr:nth-child(2n){background:var(--table-striped-color)}.table-hover>tbody>tr:hover>*{background:var(--table-hover-color)}.table.bordered>*>tr>*{border-width:1px}.table.borderless>*>tr,.table.borderless>*>tr>*{border-style:none}.condensed>*>tr>*{padding:.375rem .75rem}.table-fixed{table-layout:fixed}.table-fixed>*>tr>*{overflow:hidden;white-space:nowrap}.toolbar{align-items:center;display:flex;position:relative}.toolbar>.divider{margin:.5rem;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity))}.toolbar-space{flex:1 1 auto;height:1px;width:1px}.toolbar>.dropdown.show{align-items:center;display:flex;position:relative}:root{--tooltip-bg:var(--skin-color,var(--color-inverse));--tooltip-text:var(--skin-text,var(--color-canvas));--tooltip-arrow:6px;--tooltip-delay:0.5s}.hint,[class*=" hint-"],[class^=hint-]{position:relative}.hint:before,[class*=" hint-"]:before,[class^=hint-]:before{border-style:solid;height:0;position:absolute;width:0;--tw-content:"";border-color:var(--tooltip-bg) transparent transparent transparent;border-width:var(--tooltip-arrow) var(--tooltip-arrow) 0 var(--tooltip-arrow);content:var(--tw-content);margin-bottom:calc(0px - var(--tooltip-arrow))}.hint:after,[class*=" hint-"]:after,[class^=hint-]:after{background-color:var(--tooltip-bg);border-color:var(--tooltip-color);border-radius:var(--radius);color:var(--tooltip-text);font-size:.75rem;line-height:1rem;max-width:28rem;overflow:hidden;padding:.25rem .5rem;position:absolute;white-space:nowrap;--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-content:attr(data-hint);content:var(--tw-content);text-shadow:0 1px 0 var(--tooltip-bg)}.hint:after,.hint:before,[class*=" hint-"]:after,[class*=" hint-"]:before,[class^=hint-]:after,[class^=hint-]:before{bottom:100%;left:50%;opacity:0;pointer-events:none;transition-delay:0s;transition-duration:.15s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,1,1);visibility:hidden;z-index:1800;--tw-translate-x:-50%;--tw-translate-y:calc(var(--tooltip-arrow)*-1);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint:hover:after,.hint:hover:before,[class*=" hint-"]:hover:after,[class*=" hint-"]:hover:before,[class^=hint-]:hover:after,[class^=hint-]:hover:before{opacity:1;transition-delay:var(--tooltip-delay);visibility:visible}.hint-bottom:before{border-color:transparent transparent var(--tooltip-bg) transparent;border-width:0 var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow);margin-bottom:auto;margin-top:calc(0px - var(--tooltip-arrow))}.hint-bottom:after,.hint-bottom:before{bottom:auto;top:100%;--tw-translate-y:var(--tooltip-arrow);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint-left:before{border-color:transparent transparent transparent var(--tooltip-bg);border-width:var(--tooltip-arrow) 0 var(--tooltip-arrow) var(--tooltip-arrow);margin-bottom:auto;margin-right:calc(0px - var(--tooltip-arrow))}.hint-left:after,.hint-left:before{bottom:50%;left:auto;right:100%;--tw-translate-x:calc(var(--tooltip-arrow)*-1);--tw-translate-y:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint-right:before{border-color:transparent var(--tooltip-bg) transparent;border-width:var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow) 0;margin-bottom:auto;margin-left:calc(0px - var(--tooltip-arrow))}.hint-right:after,.hint-right:before{bottom:50%;left:100%;--tw-translate-x:var(--tooltip-arrow);--tw-translate-y:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint-lg:after,.hint-sm -.hint-md:after:after,.hint-xl:after{white-space:normal;word-break:break-all}.hint-sm:after{width:4rem}.hint-md:after{width:8rem}.hint-lg:after{width:16rem}.hint-xl:after{width:24rem}.hint-primary{--tooltip-bg:var(--color-primary-500)}.hint-success{--tooltip-bg:var(--color-success-500)}.hint-danger{--tooltip-bg:var(--color-danger-500)}.hint-warning{--tooltip-bg:var(--color-warning-500)}.hint-important{--tooltip-bg:var(--color-important-500)}.hint-special{--tooltip-bg:var(--color-special-500)}.tooltip{background-color:var(--tooltip-bg);border-color:var(--tooltip-color);border-radius:var(--radius);color:var(--tooltip-text);font-size:.75rem;line-height:1rem;max-width:28rem;padding:.25rem .5rem;white-space:pre-wrap;z-index:1800}.tooltip:not(.white)>.arrow{border-width:0}.tooltip.white>.arrow{border-color:inherit}.tooltip-has-title{--tw-bg-opacity:0.8;padding:.5rem .75rem .75rem;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.tooltip-has-title>.arrow{opacity:.75}.tooltip-heading{align-items:center;display:flex;font-size:.8125rem;font-weight:700;gap:1rem;justify-content:space-between;line-height:1.25rem;padding:.25rem}.tooltip-heading>.btn-close{margin-right:-.25rem}.tooltip-content{padding:.25rem}.tree-item-inner{flex-direction:row;min-height:24px;padding-left:var(--list-nested-indent)}.tree-item-inner,.tree-toggle{align-items:center;display:flex}.tree-toggle{border-radius:var(--radius);flex:none;height:1rem;justify-content:center;margin-right:-.375rem;width:1rem;--caret-size:5px;--caret-opacity:.3}.tree-item-inner>.item-icon{opacity:.5;width:1rem}.tree-item-inner:hover>.item-icon{opacity:.8}.tree-item-inner.has-hover{border-radius:var(--radius)}.tree-item-inner .item-title:not(:hover),.tree-item-inner>a.item-title:not(:hover){color:inherit}.tree-item-inner>.toolbar{margin-left:1rem;opacity:.6}.tree-item-inner:hover>.toolbar{opacity:1}.tree-item>.active{background:var(--menu-active-bg);color:var(--menu-active-color)}.tree-item>.selected{background:var(--menu-selected-bg)}.tree-item>.selected .item-content{color:var(--menu-selected-color);font-weight:700}.tree.search-menu-on-top>.search-box{left:0;right:0}.tree-lines .tree{position:relative}.tree-lines .tree-item{--tree-line-indent:calc(var(--list-nested-indent) + 8px)}.tree-lines .tree:before{border-left-width:1px;bottom:.5rem;display:block;left:var(--tree-line-indent);position:absolute;top:-.5rem;--tw-content:"";content:var(--tw-content)}.upload .upload-tip{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.upload .draggable-area{background-color:rgba(var(--color-primary-50-rgb),.2);border:1px dashed var(--color-primary-300)}.upload .draggable-area.dragover{background-color:rgba(var(--color-primary-500-rgb),.1);border-style:solid}.upload .upload-tip{color:var(--color-slate-500)}.file-item>.img{height:120px;width:120px}.upload .file-item:hover .file-size{display:flex!important}.form-batch-container{overflow-y:auto}.form-batch-table{min-width:100%;table-layout:fixed;--table-head-bg:var(--color-canvas)}.form-batch-table>*>tr{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.form-batch-table>*>tr>*{padding-left:.375rem;padding-right:.375rem;vertical-align:top}.form-batch-table>*>tr>th{text-align:left;vertical-align:middle}.form-batch-head[data-name=ACTIONS]{width:5rem}.form-batch-head[data-name=ACTIONS][data-action-count="3"]{width:6rem}.form-batch-label{display:inline}.form-batch-control>textarea.form-control{height:2rem}.form-batch-btn+.btn{margin-left:.25rem}.form-batch-table>tbody[data-count="1"] .form-batch-btn[data-type=delete]{display:none}.form-batch-ditto{position:relative}.form-batch-ditto-btn{bottom:0;height:auto;opacity:.5;padding-left:.5rem;padding-right:.5rem;position:absolute!important;right:0;top:0}.form-batch-ditto-btn:after{bottom:.5rem;left:-1px;position:absolute;top:.5rem;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}[data-ditto=on] .form-batch-ditto-btn{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));opacity:1}.form-batch-row-actions{padding-bottom:.75rem!important;padding-top:.75rem!important}.form-batch-ditto-wrapper{position:relative}.form-batch-ditto-control .form-control{padding-right:calc(var(--form-batch-ditto-width) + 8px)}.form-batch-ditto-control .input-control>.input-control-suffix{right:var(--form-batch-ditto-width)}.form-batch-ditto-control .input-control>.form-control{padding-right:calc(var(--form-batch-ditto-width) + var(--input-control-suffix))}.form-batch-ditto-control .pick-pri{padding-right:calc(var(--form-batch-ditto-width) + 8px)}.datalist{--datalist-label-width:68px}.datalist-item{display:flex;gap:.5rem;padding-bottom:.375rem;padding-top:.375rem}.datalist-item-label{align-items:center;display:flex;flex:none;justify-content:flex-end;overflow:hidden;white-space:nowrap;width:var(--datalist-label-width);--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.datalist-item-content{align-items:center;display:flex;flex:1 1 0%;gap:.5rem}.scrollbar,:root{--scrollbar-size:10px;--scrollbar-opacity:.6;--scrollbar-bg:rgba(var(--color-inverse-rgb),.15);--scrollbar-inset:inset 0 0 0 1px rgba(var(--color-inverse-rgb),.05);--scrollbar-bar-bg:rgba(var(--color-inverse-rgb),.3);--scrollbar-hover-bg:rgba(var(--color-inverse-rgb),.4);--scrollbar-drag-bg:rgba(var(--color-inverse-rgb),.5);--scrollbar-radius:var(--radius-sm);--scrollbar-duration:.7s}.scrollbar{background:var(--scrollbar-bg);box-shadow:var(--scrollbar-shadow);opacity:var(--scrollbar-opacity);position:absolute;transition-duration:.15s;transition-duration:var(--scrollbar-duration);transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.scrollbar-hover .scrollbar{opacity:0}.scrollbar-hover:hover .scrollbar{opacity:var(--scrollbar-opacity)}.scrollbar.is-dragging,.scrollbar:hover{opacity:1!important}.scrollbar-bar{background:var(--scrollbar-bar-bg);border-radius:var(--scrollbar-radius);position:absolute}.scrollbar-bar:hover{background:var(--scrollbar-hover-bg)}.is-dragging>.scrollbar-bar{background:var(--scrollbar-drag-bg)}.is-horz>.scrollbar-bar{height:100%;z-index:20}.is-vert>.scrollbar-bar{width:100%;z-index:20}.doc-app{--doc-view-max-width:800px;--doc-view-padding:24px;--doc-view-side-width:240px;--affine-editor-side-padding:0}.doc-app{align-items:stretch;display:flex;flex-direction:column;min-height:120px}.doc-space-picker-menu .menu-item>.item-inner{padding-right:.25rem}.doc-app-search .form-control{border-radius:var(--radius-full)}.doc-app-search .input-control-prefix{cursor:pointer;opacity:.75}.doc-app-search.empty:not(.focus){transition-duration:.15s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}.doc-app-search.empty:not(.focus) .form-control{padding-left:.5rem;padding-right:.5rem;--tw-ring-color:transparent}.doc-app-search.empty:not(.focus) .form-control::-moz-placeholder{opacity:0}.doc-app-search.empty:not(.focus) .form-control::placeholder{opacity:0}.doc-app-search.empty:not(.focus) .form-control:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.doc-app-search:not(.empty) .form-control{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-300-rgb),var(--tw-ring-opacity))}.doc-app-header .divider{height:1rem!important;margin-left:.25rem!important;margin-right:.25rem!important}.doc-app .is-match-keys{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-100-rgb),var(--tw-bg-opacity));font-weight:700;text-decoration-line:underline;text-underline-offset:2px}.doc-main .dtable-footer{border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}.doc-main.show-view>.doc-list{pointer-events:none;visibility:hidden;z-index:-10}.has-doc-app-fullscreen .doc-app-header,.has-doc-app-fullscreen .doc-sidebar,.has-doc-app-fullscreen>#header{display:none}.has-doc-app-fullscreen #mainContainer{max-width:none!important;padding:0!important;width:100%!important}.has-doc-app-fullscreen #docApp{height:calc(100vh - 12px)!important}.doc-tree .item-inner{cursor:pointer;padding-right:0;position:relative}.doc-tree .item-inner>.item-icon{flex:none;opacity:1}.doc-tree .item-inner .item-title{overflow:hidden;text-overflow:clip;white-space:nowrap}.doc-tree .item-inner.selected .item-title{font-weight:700}.doc-tree .item-inner>.toolbar{top:.25rem!important}.doc-tree .item-inner>.toolbar>.btn.with-popover-show,.doc-tree .list-heading-inner>.toolbar{opacity:1!important}.doc-tree .item-inner:hover>.toolbar{margin-top:0!important}.doc-tree .with-hover-actions>.item>.item-inner .item-actions{right:0}.doc-sidebar .sortable-ghost{border-radius:var(--radius-sm);z-index:10;--tw-bg-opacity:1;background-color:rgba(var(--color-warning-100-rgb),var(--tw-bg-opacity));opacity:.3;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-warning-600-rgb),var(--tw-ring-opacity))}.doc-list-item-title{overflow:hidden;text-overflow:clip}.doc-view{scroll-padding-top:16px;scrollbar-gutter:stable both-edges}.doc-view-content{max-width:var(--doc-view-max-width);padding:var(--doc-view-padding)}.doc-files .item-content{flex:none}.doc-files .file-list-item{border-radius:var(--radius-lg);transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.doc-files .file-list-item:hover{background-color:rgba(var(--color-inverse-rgb),.05)}.doc-files .file-list-item .item-actions,.doc-files .file-list-item:hover .item-actions{margin-left:1rem;margin-top:0;position:relative}.doc-files .file-list-item .item-actions .btn{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}.doc-editor .affine-page-viewport{overflow:visible!important}.doc-editor .affine-page-root-block-container{padding:0 0 2rem!important}.doc-editor-keywords,.doc-editor-title{flex:none}.doc-editor-keywords:hover .form-control{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.doc-editor-keywords .form-control:focus{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.doc-editor-control{z-index:2}.doc-view-sidebar{display:flex;flex-direction:column;max-height:calc(100% - 24px);overflow:visible;width:var(--doc-view-side-width)}.doc-view-sidebar-nav{--nav-item-padding:6px;--nav-item-color:var(--color-gray-500);--nav-active-bg:var(--color-primary-100);--nav-active-color:var(--color-fore);--nav-item-height:26px;--nav-divider-margin:8px;background-color:rgba(var(--color-surface-rgb),.2)}.doc-view-sidebar .datalist{--datalist-label-width:56px}.is-closed.doc-view-sidebar .doc-view-sidebar-content,.is-sidebar-closed .doc-view-sidebar-content{display:none}.is-closed.doc-view-sidebar,.is-sidebar-closed .doc-view-sidebar{--doc-view-side-width:0;opacity:0;transition-delay:1s;transition-duration:1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.doc-view:hover .doc-view-sidebar{opacity:1;transition-delay:0s}.is-closed>.doc-view-sidebar-container,.is-sidebar-closed .doc-view-sidebar-container{position:absolute;right:0;top:0}.doc-view-sidebar-container{background-color:rgba(var(--color-canvas-rgb),.8);min-height:0;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.doc-outline .tree-toggle.is-empty:before{border-radius:var(--radius-full);height:.25rem;position:absolute;width:.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-300-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}.doc-outline .is-nested-root.no-nested-items{padding-left:.375rem}.doc-path-picker .picker-deselect-btn{display:none}.doc-path-picker-angle{margin-left:-.125rem;margin-right:-.125rem}.doc-path-picker,.doc-space-picker{outline:2px solid transparent!important;outline-offset:2px!important;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.dropmenu-btn{gap:.25rem;padding-left:.5rem;padding-right:.5rem}.dropmenu-btn>.text{max-width:180px;overflow:hidden}.dropmenu-btn>.is-leading{left:-.625rem;opacity:.6;position:absolute}.dropmenu-btn>.is-caret{align-items:center;background-color:rgba(var(--color-canvas-rgb),.2);border-radius:var(--radius);display:flex;height:1rem;justify-content:center;width:1rem}.dropmenu-nav{border-bottom-width:1px;margin-left:.75rem;margin-right:.75rem;margin-top:.25rem}.has-search .dropmenu-nav{margin-top:-.5rem}.dropmenu-nav>.nav-secondary{gap:.5rem}.dropmenu-nav>.nav-secondary>.nav-item>a{border-radius:var(--radius);padding-left:.5rem;padding-right:.5rem}.dropmenu-nav>.nav-secondary>.nav-item>a:after{bottom:-1px;left:1rem;opacity:0;right:1rem}.dropmenu-nav>.nav-secondary>.nav-item>.active:after{left:.5rem;opacity:1;right:.5rem;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dropmenu-title{font-size:.75rem;font-weight:700;line-height:1rem;margin-bottom:-.5rem;padding:.75rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.dropmenu-list{min-height:0;overflow-x:hidden;overflow-y:auto;padding:.5rem .75rem}.dropmenu.loading>*{opacity:0}.dropmenu-item .tree-item-inner{border-radius:var(--radius);cursor:pointer;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dropmenu-item.is-item.active>.tree-item-inner{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.tree-item-inner.is-link:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.tree-item-inner.is-link:hover .item-content,.tree-item-inner.is-link:hover .item-trailing-icon,.tree-item-inner.is-link:hover .label{color:inherit}.tree-item-inner.is-toggle:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.dropmenu-item+.tree-item{margin-top:.125rem}.dropmenu-item .is-match{font-weight:700;text-decoration-line:underline}.dropmenu-item .item-title,.dropmenu-item .label{overflow:hidden;white-space:nowrap}.dropmenu-item .item-content{padding-left:.375rem;padding-right:.375rem}.dropmenu-item *+.item-content{padding-left:0}.tree-item-inner.is-toggle .item-title{opacity:.6}.tree-item-inner.is-toggle:hover .item-title{opacity:1}.dropmenu-item-check{align-items:center;display:flex;flex:1 1 auto;justify-content:flex-end;padding-right:.5rem}.dropmenu-item .nested-toggle-icon.is-empty{width:.25rem}.dropmenu-item .item-icon{margin-right:-.25rem}:root{--affine-text-secondary-color:var(--color-secondary-500)}.blocksuite-portal{position:absolute!important}.embed-card-modal-mask{z-index:12!important}.embed-card-modal-wrapper{z-index:13!important}.card-list{--list-gap:.625rem;--list-count-per-row:1}.card-list,.card-list-item{padding:calc(var(--list-gap)/2)}.card-list-item{width:calc(100%/var(--list-count-per-row))}.card-grid{display:flex;flex-wrap:wrap}.card-grid .card{height:100%}:root{--form-control-border:var(--color-border-strong)}.checkbox-primary.disabled,.checkbox-primary.disabled>label,.checkbox-primary>input[type=checkbox]:disabled,.checkbox-primary>input[type=checkbox]:disabled+label,.radio-primary.disabled,.radio-primary.disabled>label,.radio-primary>input[type=radio],.radio-primary>input[type=radio]:disabled+label{filter:none!important}.checkbox-primary.disabled>label,.radio-primary.disabled>label{opacity:1}.checkbox-primary.disabled>label:before,.radio-primary.disabled>label:before{background-color:rgba(var(--color-inverse-rgb),.05);opacity:.5}.form-actions{gap:1rem;justify-content:center}.form-actions .btn{min-width:96px}.form-control-static{min-height:32px;padding-bottom:.375rem;padding-top:.375rem}:root{--zt-panel-form-max-width:1000px}.size-sm{--zt-panel-form-max-width:800px}.size-lg{--zt-panel-form-max-width:1200px}.panel-body>.container,.panel-heading>.container{max-width:var(--panel-container-width);min-width:0;padding-left:var(--panel-container-padding);padding-right:var(--panel-container-padding)}.panel-heading>.container{align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;gap:1rem;justify-content:space-between;min-height:48px}.panel-form{border-radius:var(--radius-md);margin-bottom:1rem;margin-left:auto;margin-right:auto;max-width:var(--zt-panel-form-max-width);min-width:var(--zt-panel-form-min-width);overflow:visible;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-bottom:1rem;padding-left:1rem;padding-right:1rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.panel-form .form-actions{background-color:rgba(var(--color-canvas-rgb),.8);bottom:0;padding-bottom:1rem;padding-top:1rem;position:sticky;z-index:3;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.panel-form .form-grid{margin-left:calc(0px - var(--form-grid-gap-y-half));margin-right:calc(0px - var(--form-grid-gap-y-half));padding-bottom:0}.panel-form-toolbar{padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half);width:100%}.panel-form-toolbar>.toolbar{gap:1rem;padding-bottom:.75rem;padding-top:.75rem}.panel-form-divider{margin-bottom:.75rem;margin-top:1rem;padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half);width:100%}.panel-form-divider:before{background-color:rgba(var(--color-border-rgb),.7);display:block;height:1px;--tw-content:"";content:var(--tw-content)}.is-full .btn-full-form,.is-lite .btn-lite-form{z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-300-rgb),var(--tw-ring-opacity))}.btn-toggle-fold:after{content:attr(data-expand-text)}.show-fold-items .btn-toggle-fold:after{content:attr(data-collapse-text)}.is-foldable,.is-full .full\:hidden,.is-full .lite\:visible,.is-full .panel-form-divider,.is-full .panel-form-toolbar,.is-lite .full\:visible,.is-lite .lite\:hidden,.no-foldable-items .btn-toggle-fold{display:none}.is-foldable.is-pinned,.is-full .full\:visible,.is-full .is-foldable,.is-full .lite\:hidden,.is-lite .full\:hidden,.is-lite .lite\:visible,.show-fold-items .is-foldable{display:block}.is-full .full\:w-1\/2,.is-lite .lite\:w-1\/2{width:50%}.is-full .full\:w-1\/3,.is-lite .lite\:w-1\/3{width:33.333333%}.is-full .full\:w-2\/3,.is-lite .lite\:w-2\/3{width:66.666667%}.is-full .full\:w-1\/4,.is-lite .lite\:w-1\/4{width:25%}.is-full .full\:w-2\/4,.is-lite .lite\:w-2\/4{width:50%}.is-full .full\:w-3\/4,.is-lite .lite\:w-3\/4{width:75%}.is-full .full\:w-1\/5,.is-lite .lite\:w-1\/5{width:20%}.is-full .full\:w-2\/5,.is-lite .lite\:w-2\/5{width:40%}.is-full .full\:w-3\/5,.is-lite .lite\:w-3\/5{width:60%}.is-full .full\:w-4\/5,.is-lite .lite\:w-4\/5{width:80%}.is-full .full\:w-1\/6,.is-lite .lite\:w-1\/6{width:16.666667%}.is-full .full\:w-2\/6,.is-lite .lite\:w-2\/6{width:33.333333%}.is-full .full\:w-3\/6,.is-lite .lite\:w-3\/6{width:50%}.is-full .full\:w-4\/6,.is-lite .lite\:w-4\/6{width:66.666667%}.is-full .full\:w-5\/6,.is-lite .lite\:w-5\/6{width:83.333333%}.is-full .full\:w-full,.is-lite .lite\:w-full{width:100%}.page-form{--panel-container-width:960px;--panel-container-padding:20px;--zt-panel-form-max-width:1200px;--zt-panel-form-min-width:1040px;padding-left:0;padding-right:0;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.page-form .panel-heading{border-bottom-width:1px;--tw-border-opacity:0.7;padding:0}.page-form .panel-title{font-size:1rem;line-height:1.5rem}@media (max-width:1240px){.page-form{--zt-panel-form-max-width:1100px}}@media (max-width:1110px){.page-form{--zt-panel-form-max-width:1040px}}.modal-body>.page-form{margin:-1.5rem -2rem!important;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-body>.page-form>.panel-heading{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);position:sticky;top:-1.25rem;z-index:2;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-bottom:.375rem;padding-top:.375rem}.modal-body>.panel-form .form-actions{bottom:-1.5rem!important;padding-bottom:1.5rem;padding-top:1.5rem}.dropdown.popover{display:flex;flex-direction:column;position:absolute;z-index:1200}.dropdown.show{display:flex}.dropdown-menu{display:none;--menu-min-width:7rem;--menu-max-width:20rem}.dropdown-menu.show,.menu-wrapper>.dropdown-menu,.show>.dropdown-menu{display:block}.dropdown>.dropdown-menu,.menu-wrapper .dropdown-menu{position:relative}.popup .popup.search-menu{background-color:var(--menu-bg)}.show>.menu-wrapper{display:flex}.dropdown>.menu-wrapper{height:100%}.dropdown>.menu-wrapper .menu-wrapper{position:absolute}.dropdown>.menu-wrapper.is-tree .menu-wrapper{position:relative}.is-contextmenu .is-nested-show>a:not(:hover){--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity))}.is-contextmenu .menu-item.is-nested>.item-inner>.nested-toggle-icon{position:absolute;right:.25rem;top:.375rem}.is-contextmenu .menu-nested .menu-item>.item-inner{padding-left:.5rem;padding-right:1.25rem}.is-contextmenu .menu-nested .menu-item>.item-inner>.item-content{overflow:hidden}.dropdown>.arrow{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.global-search-panel li:not(.order-first):hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.global-search-panel li a{width:100%}.global-search-panel li{cursor:pointer}.history-panel>.panel-heading+.panel-body{margin-top:-.75rem}.history-panel-action{position:relative}.history-panel-action:before{border-left-width:1px;bottom:-.375rem;left:.5rem;position:absolute;top:22px;--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-content:"";content:var(--tw-content)}.col-reverse>.history-panel-action:first-child:before,.col>.history-panel-action:last-child:before{display:none}.history-panel-action>.item-inner{padding-left:1.5rem}.history-panel-action>.item-inner>.avatar{left:0;position:absolute;top:.375rem}.img-cutter{background:var(--color-gray-100);border:1px solid #ddd;margin-bottom:20px;padding:10px}.img-cutter .canvas{margin:0 auto;max-width:100%;min-width:50px;position:relative}.img-cutter .cover{bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.img-cutter .controller{background:none;border:1px dashed hsla(0,0%,100%,.7);cursor:move;position:absolute;z-index:5}.img-cutter .control{background:#000;background:rgba(0,0,0,.6);border:1px solid hsla(0,0%,100%,.6);height:6px;position:absolute;width:6px}.img-cutter .control[data-type=left]{cursor:w-resize;left:-4px;margin-top:-3px;top:50%}.img-cutter .control[data-type=top]{cursor:n-resize;left:50%;margin-left:-3px;top:-4px}.img-cutter .control[data-type=right]{cursor:e-resize;margin-top:-3px;right:-4px;top:50%}.img-cutter .control[data-type=bottom]{bottom:-4px;cursor:s-resize;left:50%;margin-left:-3px}.img-cutter .control[data-type=top-left]{cursor:nw-resize;left:-4px;top:-4px}.img-cutter .control[data-type=top-right]{cursor:ne-resize;right:-4px;top:-4px}.img-cutter .control[data-type=bottom-left]{bottom:-4px;cursor:sw-resize;left:-4px}.img-cutter .control[data-type=bottom-right]{bottom:-4px;cursor:se-resize;right:-4px}.img-cutter .cliper{bottom:0;left:0;position:absolute;right:0;top:0;z-index:2}.messager-lite{border-radius:var(--radius-lg);min-width:160px;--tw-bg-opacity:1!important;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))!important;padding:1rem 1.5rem;--tw-text-opacity:1!important;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))!important;--skin-ring:transparent!important;--skin-text:inherit!important;--skin-color:var(--color-gray-500)}.messager-lite .alert-icon{color:var(--skin-color);font-size:1.5rem;line-height:2rem}.messager-lite .alert-text{font-size:.875rem;font-weight:700;line-height:1.3rem}.messager-lite .toolbar{gap:.5rem;margin-left:2rem}.messager-lite .alert-content+.alert-close{margin-left:1.5rem}.messager-lite .toolbar .btn.ghost{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.modal-reconfirm .modal-body{font-size:14px;font-weight:700;padding:24px 32px}.modal-reconfirm .modal-footer{justify-content:center;padding:24px}.picker-deselect-btn{opacity:.6;transition-duration:.15s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.picker-multi-selection{cursor:pointer;padding-right:.5rem;position:relative}.picker-multi-selection .picker-deselect-btn{bottom:0;left:0;position:absolute;right:0;top:0;--tw-scale-x:0;--tw-scale-y:0;background-color:rgba(var(--color-surface-rgb),.8);opacity:0}.picker-deselect-btn:hover,.picker-multi-selection .picker-deselect-btn,.picker-multi-selection:hover .picker-deselect-btn{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.picker-deselect-btn:hover,.picker-multi-selection:hover .picker-deselect-btn{--tw-scale-x:1;--tw-scale-y:1;opacity:1;--state-color:rgba(var(--color-surface-rgb),.9)}.pick-pri{flex-direction:row;justify-content:flex-start;position:relative}.pick-pri,.pick-pri>.text{align-items:center;display:flex}.pick-pri>.text{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap}.pick-pri .placeholder{--tw-text-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-text-opacity))}.pick-pri-list>.btn{justify-content:flex-start}.disabled.pick-pri,.disabled.pick-pri>*{filter:none}.search-form{--gutter-width:12px;padding-bottom:.5rem}.search-form-container{border-radius:var(--radius);min-height:116px;position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.is-simple .search-form-container{min-height:56px}.search-form-field td{padding:.375rem}.search-form-field td.is-andOr,.search-form-field td.is-operator{width:5rem}.search-form-field td.is-condition{width:7rem}.search-form-field td.is-operator{width:5rem}[lang=en] .search-form-field td.is-operator{width:6rem}.search-form .sidebar-right.is-collapsed{margin-right:-.375rem}.is-simple .search-form-wrapper{display:flex}.is-simple .search-form-wrapper>.row{flex:1 1 auto}.is-simple .search-form-wrapper>.toolbar{flex:none;margin-top:0}.zinbar [data-hint]{position:relative}.zinbar [data-hint]:after{background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity));border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg);bottom:100%;display:block;pointer-events:none;position:absolute;right:0;white-space:nowrap;z-index:50;--tw-bg-opacity:0.9;font-size:.75rem;line-height:1rem;padding:.125rem .25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:attr(data-hint);content:var(--tw-content)}.zinbar [data-hint]:hover:after{opacity:1}.zin-perf-btn-list .text-danger{color:var(--color-danger-400)}.zinbar .state{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.zinbar .state:active{--tw-scale-x:1.05;--tw-scale-y:1.05}.zinbar .state:active,.zinbar.collapse{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.zinbar.collapse{--tw-translate-x:100%}.zinbar.collapse>div{pointer-events:none}.zinbar{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.7s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}body[z-perf=danger]:before,body[z-perf=warning]:before{bottom:0;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:9990;--tw-border-opacity:1;border-color:rgba(var(--color-warning-600-rgb),var(--tw-border-opacity));font-size:.75rem;line-height:1rem;--tw-content:"";border-style:inset;border-width:12px 8px 8px;content:var(--tw-content)}body[z-perf=danger]:before{--tw-border-opacity:1;border-color:rgba(var(--color-danger-600-rgb),var(--tw-border-opacity))}body[z-perf=danger]:after,body[z-perf=warning]:after{font-size:.75rem;font-weight:700;left:0;line-height:1rem;line-height:1;pointer-events:none;position:fixed;right:0;text-align:center;top:0;z-index:9991;--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity));--tw-content:attr(z-perf-message);content:var(--tw-content)}.card{border-radius:var(--radius);min-height:28px;position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;transition-duration:.15s;transition-property:box-shadow,border,color,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.card:hover{--tw-shadow:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--tw-shadow-colored:0 2px 6px -1px var(--tw-shadow-color),0 1px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.card-content,.card-footer,.card-header,.card-heading{padding:.25rem .5rem}.card-heading{align-items:center;display:flex;gap:.5rem}.card-icon{opacity:.5}.card-header{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.card-content{display:flex;flex-direction:column;gap:.25rem}.card-actions{position:absolute;right:.125rem;top:.125rem}.card-actions+.card-heading{padding-right:1.75rem}.card-subtitle{font-size:.75rem;line-height:1rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.card.selected{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-400-rgb),var(--tw-ring-opacity))}.card-list{--list-gap:.625rem;--list-count-per-row:1}.card-list,.card-list-item{padding:calc(var(--list-gap)/2)}.card-list-item{width:calc(100%/var(--list-count-per-row))}.card-grid{display:flex;flex-wrap:wrap}.card-grid .card{height:100%}.contextmenu{display:none}.contextmenu.show{display:block}.contextmenu .popup .popup,.contextmenu.popup{position:absolute}.more,.more-vert{margin:.5rem;position:relative}.more,.more-vert,.more-vert:after,.more-vert:before,.more:after,.more:before{background-color:currentColor;border-radius:var(--radius-full);height:.125rem;width:.125rem}.more-vert:after,.more-vert:before,.more:after,.more:before{display:block;left:-5px;position:absolute;top:0;--tw-content:"";content:var(--tw-content)}.more-vert:after,.more:after{left:5px}.more-vert{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dashboard-blocks{position:relative}.dashboard-block-cell{position:absolute;transition-duration:.15s;transition-property:left,top;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-block{border-radius:var(--radius);bottom:.5rem;left:.5rem;position:absolute;right:.5rem;top:.5rem;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-block.is-dragging{opacity:0;z-index:1600}.dashboard-block-header{align-items:center;border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);display:flex;flex-direction:row;justify-content:space-between;left:0;padding:.75rem;pointer-events:none;position:absolute;right:0;top:0;z-index:10}.dashboard-block-header>*{pointer-events:auto}.dashboard-block-title{font-size:.875rem;font-weight:700;line-height:1.3rem}.dashboard-block-body{bottom:0;left:0;position:absolute;right:0;top:0}.dashboard-block-body>.panel{display:flex;flex-direction:column;height:100%;width:100%;--tw-shadow:0px 6px 16px rgba(202,215,235,.25)}.dashboard-block-body .panel-heading{cursor:move;flex:none}.dashboard-block-body .panel-body{flex:1 1 auto;overflow-y:auto}.has-more-menu>.dashboard-block-body .panel-heading{padding-right:3rem}.dashboard-block-body .panel-title{font-size:.875rem;height:2rem;line-height:1.3rem}.dashboard-block-actions .btn{opacity:.6}.dashboard-block-actions .btn:hover{opacity:1}.dashboard-drop-shadow{position:absolute;transition-duration:.15s;transition-property:left,top;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-drop-shadow:before{background-color:rgba(var(--color-inverse-rgb),.05);border-radius:var(--radius);bottom:.5rem;left:.5rem;position:absolute;right:.5rem;top:.5rem;--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-content:"";content:var(--tw-content)}:root{--dtable-checked-bg:var(--color-warning-50);--dtable-checked-bg-hover:var(--color-warning-100);--dtable-checked-border:var(--color-border-strong)}.dtable-cell.is-checked,.dtable-striped .dtable-cell.is-odd-row.is-checked{background-color:var(--dtable-checked-bg)}.checkbox-primary.dtable-checkbox{margin-right:-.375rem}.dtable-checkbox{order:-5}.dtable-hover-col .dtable-cell.is-hover-col.is-checked,.dtable-hover-row .dtable-cell.is-hover-row.is-checked{background-color:var(--dtable-checked-bg-hover)}.dtable-cell.is-checked{--dtable-border-color:var(--dtable-checked-border)}.dtable-check-info{flex-shrink:1;margin-right:.5rem;overflow:hidden;white-space:nowrap}:root{--toggle-icon-size:calc(var(--font-size-root)*3/4 + 1px)}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-color:currentColor;border-width:1px;display:block;opacity:.5;position:relative}.toggle-icon-collapse:hover,.toggle-icon-expand:hover,.toggle-icon:hover{opacity:.9}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-radius:inherit;height:var(--toggle-icon-size);width:var(--toggle-icon-size)}.is-collapsed .toggle-icon:after,.is-collapsed .toggle-icon:before,.is-expanded .toggle-icon:before,.toggle-icon-collapse:after,.toggle-icon-collapse:before,.toggle-icon-expand:before{background-color:currentColor;content:" ";display:block;height:1px;left:2px;position:absolute;right:2px;top:calc((var(--toggle-icon-size) - 3px)/2)}.is-collapsed .toggle-icon:after,.toggle-icon-collapse:after{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:root{--dtable-nt-size:calc(var(--font-size-root)*3/4 + 1px)}.dtable-nested-indent{flex:none;margin-right:-.25rem;order:-100}.dtable-nested-toggle{align-items:center;border-radius:var(--radius-sm);display:flex;flex:none;height:1.25rem;justify-content:center;margin-left:-.25rem;order:-6;width:1.25rem}.dtable-nested-toggle.is-no-child{margin-right:-.25rem;opacity:0;pointer-events:none}.dtable-child-label{order:-5}.dtable-header-group{align-items:center;background:var(--dtable-header-bg);cursor:default;display:flex;justify-content:center;left:0;position:absolute;top:1px;z-index:30}.dtable-bordered .dtable-header-group{border-bottom:1px solid var(--dtable-border-color);border-left:1px solid var(--dtable-border-color)}.dtable-header-as-group{contain:style;content-visibility:visible;overflow:visible!important}.dtable-sorting{cursor:move}.dtable-cell.is-sorting-from{background-color:var(--dtable-bg);z-index:20}.dtable-cell.is-sorting-from:before{border-top-width:1px}.dtable-sorting .dtable-cell.is-sorting-after{--tw-translate-y:-100%}.dtable-sorting .dtable-cell.is-sorting-after,.dtable-sorting .dtable-cell.is-sorting-before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dtable-sorting .dtable-cell.is-sorting-before{--tw-translate-y:100%}.dtable-cell.is-sorting-before:before,.dtable-cell.is-sorting-from:before{border-bottom-width:1px;border-top-width:1px}.dtable{--dtable-bg:var(--color-canvas);--dtable-striped-bg:var(--color-gray-50);--dtable-hover-bg:rgba(var(--color-primary-500-rgb),.05);--dtable-header-bg:var(--color-surface);--dtable-footer-bg:var(--color-surface);--dtable-border-color:var(--color-border);--dtable-sorter-size:0.3125rem}.dtable{position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.dtable.no-animation *{transition-property:none!important}.dtable-block{overflow:hidden;position:absolute;width:100%}.dtable-header{background-color:var(--dtable-header-bg);border-top-left-radius:inherit;border-top-right-radius:inherit}.dtable-body{overflow:hidden}.dtable-cells{background-color:var(--dtable-bg);height:100%;position:absolute;z-index:0}.dtable-cells-container{height:100%;position:absolute;width:100%}.dtable-header .dtable-cells{background-color:var(--dtable-header-bg)}.dtable-cells.dtable-fixed-left,.dtable-cells.dtable-fixed-right{z-index:10}.dtable-cell{position:absolute;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-cell:after,.dtable-cell:before{bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:-1px;z-index:2}.dtable-cell:before{border-bottom-width:1px;border-color:var(--dtable-border-color);opacity:1}.dtable-header-cell{align-items:center;display:flex;font-weight:700}.dtable-header-cell:after,.dtable-header-cell:before{top:0}.dtable-cell-content{align-items:center;display:flex;gap:.25rem;height:100%;overflow:hidden;padding-left:.75rem;padding-right:.75rem;position:relative;white-space:nowrap;width:100%;z-index:5}.dtable-body .dtable-cell.is-last-row:before{border-bottom-width:0}.dtable-footer{align-items:center;background-color:var(--dtable-footer-bg);border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-color:var(--dtable-border-color);border-top-width:1px;display:flex;padding-left:.75rem;padding-right:.75rem;position:absolute;width:100%;z-index:10}.dtable-empty-tip{align-items:center;display:flex;height:100%;justify-content:center}.dtable .scrollbar{z-index:20}.dtable-header{transition-duration:1s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-scrolled-down .dtable-header{border-bottom-color:rgba(var(--color-inverse-rgb),.15);border-bottom-width:1px}.dtable-has-scroll-y:not(.dtable-scrolled-bottom) .dtable-footer{border-top-color:rgba(var(--color-inverse-rgb),.15);border-top-width:1px}.dtable-scroll-shadow{background-image:linear-gradient(90deg,rgba(0,0,0,.03),transparent),linear-gradient(90deg,rgba(0,0,0,.03),transparent 50%);opacity:0;pointer-events:none;position:absolute;top:0;transition-duration:1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:8px;z-index:20}.dtable:hover .dtable-scroll-shadow{opacity:1}.dtable-scroll-shadow.is-right{margin-left:-7px;--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dtable-scroll-shadow.is-left,.dtable-scrolled-end .dtable-scroll-shadow.is-right{visibility:hidden}.dtable-scroll-shadow.is-right,.dtable-scrolled-right .dtable-scroll-shadow.is-left{visibility:visible}.scrollbar-hover:hover .scrollbar{opacity:0}.scrollbar-hover .dtable-body:hover~.scrollbar{opacity:var(--scrollbar-opacity)}.dtable-sort{display:inline-flex;height:calc(var(--dtable-sorter-size)*12/5);margin-left:.25rem;opacity:.8;position:relative}.dtable-cell:hover .dtable-sort{opacity:1}.dtable-sort:after,.dtable-sort:before{border-color:transparent;border-style:solid;height:0;left:0;opacity:.4;position:absolute;width:0;--tw-content:"";border-width:var(--dtable-sorter-size);content:var(--tw-content)}.dtable-sort:before{border-bottom-color:currentColor;border-top-width:0;top:0}.dtable-sort:after{border-bottom-width:0;border-top-color:currentColor;bottom:0}.dtable-sort.dtable-sort-asc:before,.dtable-sort.dtable-sort-desc:after{opacity:.9}.dtable-sort-link{align-items:center;cursor:pointer;display:inline-flex}.dtable-cells.dtable-fixed-left:before,.dtable-cells.dtable-fixed-right:before{border-color:var(--dtable-border-color);content:"";height:100%;pointer-events:none;position:absolute;width:100%;z-index:5}.dtable-cells.dtable-fixed-left:before{border-right-width:1px;right:-1px}.dtable-cells.dtable-fixed-right:before{border-left-width:1px;left:0}.dtable-bordered:before{border-color:var(--dtable-border-color);border-radius:inherit;border-width:1px;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:15}.dtable-bordered .dtable-cell:before{border-width:1px;right:-1px}.dtable-cell.has-border-left:before{border-left-width:1px}.dtable-cell.has-border-right:before{border-right-width:1px;right:-1px}.dtable-striped .dtable-cell.is-odd-row{background-color:var(--dtable-striped-bg)}.dtable-hover-cell .dtable-cell:hover:after,.dtable-hover-col .dtable-cell.is-hover-col:before,.dtable-hover-row .dtable-body .dtable-cell.is-hover-row:before{background-color:var(--dtable-hover-bg)}.kanban{--kanban-lane-name-width:20px;--kanban-col-width:280px;--kanban-cols-gap:8px;--kanban-lanes-gap:8px;--kanban-header-height:32px;--kanban-lane-height:auto;--kanban-lane-color:var(--color-primary-500);--kanban-link-color:var(--color-secondary-600)}.kanban{align-items:flex-start;display:flex;flex-direction:column;min-width:-moz-fit-content;min-width:fit-content;position:relative}.kanban-header{display:flex;flex-direction:row;height:var(--kanban-header-height)}.kanban.has-sub-cols .kanban-header{height:calc(var(--kanban-header-height)*2)}.kanban-header-lane-name{background-color:rgba(var(--color-fore-rgb),.05);flex:none;width:var(--kanban-lane-name-width)}.kanban-header-cols,.kanban-header-sub-cols{display:flex;flex:1 1 0%;flex-direction:row;gap:var(--kanban-cols-gap)}.kanban-header-sub-cols{border-top-width:2px;--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity))}.kanban-header-col{align-items:center;border-bottom-width:1px;display:flex;flex:1 1 0%;flex-direction:column;height:100%;width:var(--kanban-col-width)}.kanban-header-col.has-subs{width:auto}.kanban-header-col-wrapper{align-items:center;display:flex;flex:1 1 0%;flex-direction:row;position:relative;width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:3.5rem;padding-right:3.5rem}.kanban-header-col-wrapper.is-align-left{justify-content:flex-start;padding-left:.5rem}.kanban-header-col-wrapper.is-align-left>.kanban-header-title{justify-content:flex-start}.kanban-header-title{align-items:center;display:flex;flex:1 1 auto;flex-direction:row;justify-content:center;overflow:hidden}.kanban-header-title>.as-title{color:var(--kanban-col-color);font-weight:700;overflow:hidden;white-space:nowrap}.kanban-header-col-actions{bottom:.25rem;position:absolute;right:.25rem;top:.25rem}.kanban-header-col-actions>.btn{opacity:.6}.kanban-header-col-actions>.btn:hover{opacity:1}.kanban-body{display:flex;flex-direction:column;gap:var(--kanban-lanes-gap)}.kanban-lane{display:flex;flex-direction:row;height:var(--kanban-lane-height);min-height:96px}.kanban-lane-name{align-items:center;background-color:var(--kanban-lane-color);display:flex;justify-content:center;width:var(--kanban-lane-name-width);--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity));writing-mode:vertical-rl}.kanban-lane-actions,.kanban-lane-name{flex:none;position:relative}.kanban-lane.is-first .kanban-lane-actions{margin-top:calc(4px - var(--kanban-header-height))}.has-sub-cols .kanban-lane.is-first .kanban-lane-actions{margin-top:calc(4px - var(--kanban-header-height)*2)}.kanban-lane-actions>.btn.square{width:var(--kanban-lane-name-width)}.kanban-lane-title{align-items:center;display:flex;flex:1 1 auto;justify-content:center;overflow:hidden;white-space:nowrap}.kanban-lane-cols{display:flex;flex-direction:row;gap:var(--kanban-cols-gap)}.kanban-lane-col{background-color:rgba(var(--color-inverse-rgb),.05);display:flex;flex-direction:column;height:100%;width:var(--kanban-col-width)}.kanban-header-col,.kanban-lane-col{margin-left:calc(var(--kanban-col-gap-left) - var(--kanban-cols-gap));margin-right:calc(var(--kanban-col-gap-right) - var(--kanban-cols-gap))}.kanban-col-content{position:relative;z-index:5}.kanban-lane.is-first>.kanban-lane-name:before{background-color:var(--kanban-lane-color);bottom:100%;display:block;height:var(--kanban-header-height);left:0;position:absolute;right:0;--tw-content:"";content:var(--tw-content)}.kanban.has-sub-cols .kanban-lane.is-first>.kanban-lane-name:before{height:calc(var(--kanban-header-height)*2)}.kanban-lane{margin-bottom:calc(var(--kanban-col-gap-bottom) - var(--kanban-lanes-gap));margin-top:calc(var(--kanban-col-gap-top) - var(--kanban-lanes-gap))}.kanban-items{flex:1 1 auto;overflow:auto;scrollbar-gutter:both-edges stable}.kanban-lane.is-auto-height .kanban-items{scrollbar-gutter:auto}.kanban-item{cursor:default}.kanban-item .card-actions{z-index:5}.kanban-heading{width:100%}.kanban-heading .listitem{height:2.25rem}.kanban-heading .item-title{font-weight:700}.kanban.has-dragging{cursor:move}.kanban-item.is-dragging{cursor:move;opacity:.1}.kanban-sticky .kanban-header{position:sticky;top:0;z-index:10;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.kanban-sticky .kanban-header.is-pinned{border-bottom-color:rgba(var(--color-inverse-rgb),.15);border-bottom-width:1px;z-index:20;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.kanban-sticky .kanban-lane-name{left:0;position:sticky;z-index:21}.kanban-region{border-radius:var(--radius);min-width:-moz-fit-content;min-width:fit-content;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding:.75rem;--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.kanban-region>.kanban+.kanban{margin-top:.75rem}.kanban-region.has-heading{padding-top:0}.kanban-heading>.listitem{left:.75rem;position:sticky;width:calc(var(--kanban-list-width) - 24px)}.kanban-list{display:flex;flex-direction:column;gap:.75rem;height:100vh;overflow:auto;position:relative;scrollbar-gutter:stable}.kanban-list.is-moving{cursor:grabbing}.kanban-items.is-dropping{position:relative}.kanban-item.is-dropping{position:relative;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.kanban-item.is-dropping:after,.kanban-items.is-dropping>.card-list:after{background-color:rgba(var(--color-warning-500-rgb),.5);border-radius:var(--radius-full);display:block;height:.25rem;--tw-content:"";content:var(--tw-content)}.kanban-item.is-dropping:after{left:.25rem;position:absolute;right:.25rem;top:-.25rem}.kanban-item.is-dropping[z-drop-side=before]{--tw-translate-y:0.25rem}.kanban-item.is-dropping[z-drop-side=after],.kanban-item.is-dropping[z-drop-side=before]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-item.is-dropping[z-drop-side=after]{--tw-translate-y:-0.25rem}.kanban-item.is-dropping[z-drop-side=after]:after{bottom:-.25rem;top:auto}.kanban-links{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:5}.kanban-list>.kanban-links{overflow:visible;z-index:11}.kanban-link{align-items:center;color:var(--kanban-link-color);display:flex;justify-content:center;position:absolute}.kanban-link>svg{position:absolute}.kanban-link-text{border-radius:var(--radius);height:1em;line-height:1;padding-left:.125rem;padding-right:.125rem;pointer-events:auto;position:relative;text-align:center;white-space:nowrap}.kanban-link-start-point{height:.5rem;width:.5rem;--tw-translate-x:-0.25rem;--tw-translate-y:-0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-start-point,.kanban-link-start-point:before{background-color:currentColor;border-radius:var(--radius-full);position:absolute}.kanban-link-start-point:before{bottom:-.25rem;display:block;left:-.25rem;opacity:.2;right:-.25rem;top:-.25rem;--tw-content:"";content:var(--tw-content)}.kanban-link path{pointer-events:auto}.kanban-link path+path{opacity:.6}.kanban-link.is-hover path+path{opacity:1;stroke-width:calc(var(--kanban-link-weight)*1.5)}.kanban-link-delete-btn{pointer-events:auto;--tw-scale-x:.75;--tw-scale-y:.75;opacity:0;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.is-hover .kanban-link-delete-btn,.kanban-link-delete-btn{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.is-hover .kanban-link-delete-btn{--tw-scale-x:1;--tw-scale-y:1;opacity:1}.is-adding-link{cursor:crosshair;-webkit-user-select:none;-moz-user-select:none;user-select:none}.kanban-link-editor{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:20}.kanban-link-editor-from,.kanban-link-editor-to{border-radius:var(--radius);--tw-shadow-color:rgb(var(--color-primary-500-rgb));--tw-shadow:var(--tw-shadow-colored);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-500-rgb),var(--tw-ring-opacity))}.kanban-link-editor-from,.kanban-link-editor-point,.kanban-link-editor-to{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);position:absolute}.kanban-link-editor-point{height:.5rem;pointer-events:auto;width:.5rem;--tw-translate-x:-0.25rem;--tw-translate-y:-0.25rem;border-radius:var(--radius-full);cursor:move;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));opacity:.5;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--color-primary-500-rgb),0.1);transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.kanban-link-editor-point.is-left{left:0;top:50%}.kanban-link-editor-point.is-right{right:0;top:50%;--tw-translate-x:0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-editor-point.is-top{left:50%;top:0}.kanban-link-editor-point.is-bottom{bottom:0;left:50%;--tw-translate-y:0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-editor-point:hover{opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-primary-500-rgb),0.5)}.tab-pane{display:none}.tab-pane.active{display:block}.has-sorting-col{cursor:move;--dtable-sorting-col-color:var(--color-primary-300);--dtable-hover-bg:transparent}.has-sorting-col .dtable-col-splitter{display:none}.dtable-cell.is-sorting-col-move{transition-duration:.15s;transition-property:left;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-cell.is-sorting-from-col{transition-duration:.1s}.dtable-cell.is-sorting-from-col:after{background-color:var(--dtable-sorting-col-color)!important;opacity:.1!important}.dtable-cell.is-sorting-from-col:before{border-left:1px solid var(--dtable-sorting-col-color);border-right:1px solid var(--dtable-sorting-col-color)}.dtable-header-cell.is-sortable-col{cursor:move}.has-sorting-col .scrollbar.is-horz{opacity:var(--scrollbar-opacity)!important}.has-sorting-col .dtable-scroll-shadow{visibility:visible}:root{--dtable-col-splitter-width:7px;--dtable-col-splitter-color:var(--color-primary-500)}.dtable-cell.has-col-resizing:after,.dtable-cell.has-col-splitter:hover:after{background:var(--dtable-col-splitter-color);opacity:.05}.dtable-col-splitter{background:var(--dtable-col-splitter-color);border-radius:var(--radius-full);bottom:0;cursor:ew-resize;opacity:0;position:absolute;right:calc(var(--dtable-col-splitter-width)/-2);top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--dtable-col-splitter-width);z-index:20}.dtable-cell.has-col-splitter:hover .dtable-col-splitter{opacity:.3}.dtable-cell.has-col-resizing .dtable-col-splitter,.dtable-cell.has-col-splitter .dtable-col-splitter:hover{opacity:.5}.dtable.has-col-resizing .dtable-cell.has-col-splitter:not(.has-col-resizing) .dtable-col-splitter,.dtable.has-col-resizing .dtable-cell.has-col-splitter:not(.has-col-resizing):after{opacity:0}.dtable-col-splitter:after,.dtable-col-splitter:before{content:" ";display:block;height:.5rem;left:50%;margin-top:-.25rem;position:absolute;top:50%;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity))}.dtable-col-splitter:before{margin-left:-1px}.dtable-col-splitter:after{margin-left:1px}.dtable.has-col-resizing{--dtable-hover-bg:transparent}.dtable.has-col-resizing,.has-col-resizing .dtable-header-cell{cursor:ew-resize!important}.dtable-cell.is-col-resizing:before{border-right:1px solid var(--dtable-col-splitter-color)}.dtable-cell.is-col-resizing:after{background:var(--dtable-col-splitter-color);opacity:.05}.has-col-resizing .scrollbar.is-horz{opacity:var(--scrollbar-opacity)!important}.dtable-cell.has-contextmenu-show:after{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));opacity:.1}.dtable{--dtable-header-bg:var(--color-surface-light);--dtable-footer-bg:var(--color-surface-light);--dtable-border-color:var(--color-border-light);--dtable-checked-border:var(--color-border);--dtable-checked-bg:var(--color-primary-50);--dtable-checked-bg-hover:var(--color-primary-100);--dtable-hover-bg:rgba(var(--color-gray-500-rgb),.05);--dtable-link-color:var(--color-link);--dtable-link-hover-color:var(--color-link-hover);--dtable-link-visited-color:var(--color-link-visited)}.dtable-cell-content[style*="--color-link"]{--dtable-link-hover-color:var(--color-link);--dtable-link-visited-color:var(--color-link)}.dtable-body .dtable-cell a{--dtable-link-color:var(--color-link)}.dtable-body .dtable-cell a:not(.btn){color:var(--dtable-link-color)}.dtable-body .dtable-cell a:not(.btn):visited{color:var(--dtable-link-visited-color)}.dtable-body .dtable-cell a:not(.btn):hover{color:var(--dtable-link-hover-color)}.dtable .btn-avatar{border-radius:var(--radius-full);gap:.25rem;height:1.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity));padding-left:0;padding-right:.5rem;--tw-ring-color:transparent}.dtable .btn-avatar:hover{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dtable-nested-toggle{width:1rem}.dtable .toggle-icon{--toggle-icon-size:11px;border-radius:var(--radius);--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.dtable .toggle-icon:after,.dtable .toggle-icon:before{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-700-rgb),var(--tw-bg-opacity))}.dtable-footer>.toolbar{margin-right:.5rem}.dtable-header .dtable-cell[data-sort]>.dtable-cell-content>a:not(:hover){color:inherit}.dtable-assign-btn{align-items:center;border-radius:var(--radius-full);display:flex;flex-direction:row;height:1.25rem;padding-left:.375rem;padding-right:.375rem;--dtable-link-color:var(--color-fore)}.dtable-assign-btn:not(:hover){color:inherit}.dtable-assign-btn.is-me{--dtable-link-color:var(--color-warning-500)!important}.dtable-assign-btn:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.dtable-assign-btn>span{border-radius:var(--radius-full);line-height:20px;padding-left:.375rem;padding-right:.375rem}.dtable-assign-btn.is-unassigned>span{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.dtable-assign-btn.is-unassigned:hover>span{background-color:inherit;color:inherit;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.dtable-assign-btn>.icon{opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-assign-btn:not(.disabled):hover>.icon{opacity:1}.dtable-header .dtable-cell[data-type=assign]{padding-left:1.5rem}.dtable-cell-icon{order:-5}.dtable-custom-cell[data-type=control]{align-items:center;display:flex;justify-content:center;padding-left:.125rem;padding-right:.125rem;z-index:1}.dtable-empty-tip{min-height:212px}.dtable-cell[data-type=actions] .btn>.icon{font-size:1rem;line-height:1.5rem}.menu.menu-dtable-actions.has-icons{align-items:center;display:flex;gap:.25rem;min-width:auto;--menu-icon-opacity:1}.menu.menu-dtable-actions.has-icons>.menu-item>a{padding-left:.25rem;padding-right:.25rem}.menu.menu-dtable-actions.has-icons>.menu-item>a>.icon-EMPTY,.menu.menu-dtable-actions.has-icons>.menu-item>a>.item-content{display:none}.menu.menu-dtable-actions.has-icons>.menu-item>a>.icon-EMPTY+.item-content,.menu.menu-dtable-actions.has-icons>.menu-item>a>.item-content:first-child{display:block}:root{--state-color:rgba(0,0,0,.03);--zt-page-bg:#f8f9fa;--zt-header-height:3rem;--zt-header-bg:var(--color-canvas);--zt-header-color:var(--color-fore);--zt-sidebar-width:160px;--zt-navbar-active-color:var(--color-primary-500)}body{background-color:var(--zt-page-bg)}.page-app{overflow:overlay}.container{min-width:1200px}#header{height:var(--zt-header-height);--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background:var(--zt-header-bg);border-bottom:1px solid var(--zt-header-border,rgba(var(--color-inverse-rgb),.05));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--zt-header-color)}#header>.container{height:100%;position:relative}#heading{align-items:center;bottom:0;display:flex;gap:.25rem;left:1rem;position:absolute;top:0}#heading>.toolbar{margin-left:-.75rem}#heading .dropmenu-btn>.text{max-width:142px}#heading>[data-zui-dropmenu]+div .dropmenu-btn>.text,#heading>[data-zui-dropmenu]+div+div .dropmenu-btn>.text{max-width:78px}#navbar{align-items:center;display:flex;font-size:.875rem;height:100%;justify-content:center;line-height:1.3rem;--state-color:rgba(var(--color-primary-500-rgb),.05);--state-active-opacity:1;--state-active-color:rgba(var(--color-primary-500-rgb),.08)}#navbar>.nav{--nav-active-color:var(--zt-navbar-active-color,var(--color-current));--nav-item-padding:12px;--nav-divider-margin:8px;margin-left:var(--nav-offset-left)}#navbar>.nav>.nav-item>a{height:3rem;padding-left:var(--nav-item-padding);padding-right:var(--nav-item-padding)}#navbar>.nav>.nav-item>a:before{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}#navbar>.nav>.nav-item>a.active:before{background:var(--state-active-color)!important;opacity:1!important}#navbar>.nav>.divider{align-self:center;height:1.25rem;margin-left:var(--nav-divider-margin);margin-right:var(--nav-divider-margin);opacity:.2}#navbar>.nav.compact{font-size:.8125rem;line-height:1.25rem}#navbar>.nav.compact-extra{font-size:.75rem;line-height:1rem}#toolbar{align-items:center;bottom:0;display:flex;gap:.25rem;position:absolute;right:1rem;top:0}#main{min-height:100vh}#header+#main{min-height:calc(100vh - 3rem)}#main>.container{padding-left:1rem;padding-right:1rem;position:relative}@media (min-width:1400px){#header>.container,#main>.container,#mainNavbar>.container{padding-left:2.5rem;padding-right:2.5rem}#heading{left:2.5rem}#toolbar{right:2.5rem}}#mainNavbar{height:2.75rem;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}#mainNavbar>.container{position:relative}#mainNavbar .nav{bottom:0;height:2.75rem;justify-content:center;left:0;position:absolute;right:0;top:0}#mainNavbar .nav-item{font-size:.875rem;line-height:1.3rem}#mainNavbar .nav-item>a{border-radius:var(--radius)}#mainMenu{gap:1rem;justify-content:space-between;padding-bottom:.75rem;padding-top:.75rem}#featureBar,#mainMenu{align-items:center;display:flex}#featureBar{flex:1 1 auto;gap:.5rem}#actionBar{gap:.5rem}#actionBar>.nav-divider{margin-left:-.25rem;margin-right:-.25rem}#mainContent{padding-top:.75rem}#mainMenu+#mainContent{padding-top:0}#mainContent.row{align-items:stretch;display:flex;gap:1rem;justify-content:space-between}#mainContent.row>*{flex:1 1 auto;min-width:0}#mainContainer.has-sidebar-left{--gutter-left-size:16px}#mainContainer.is-sidebar-left-collapsed{--gutter-left-size:0}.has-sidebar-animation.has-sidebar-left #mainMenu{transition-duration:.15s;transition-property:padding-left;transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--modal-radius:var(--radius);--avatar-bg:var(--color-gray-200)}.modal-alert .modal-footer{justify-content:center}.modal-dialog{--tw-bg-opacity:1}.modal-content,.modal-dialog{max-height:calc(100vh - 4rem)}.modal-body,.modal-footer,.modal-header{padding:1.5rem 2rem}.modal-header{padding-right:3rem}.modal-body+.modal-footer,.modal-header+.modal-actions+.modal-body,.modal-header+.modal-body{padding-top:1px}.modal-condensed .modal-body,.modal-condensed .modal-header{padding:1rem 1.25rem}.modal-condensed .modal-actions{top:.75rem}:root{--label-bg:var(--color-gray-100);--label-color:var(--color-gray-800)}.label[class$=-pale],.label[class*="-pale "]{--tw-bg-opacity:0.4;--tw-ring-opacity:0.4}.body-modal .panel-form,.modal-body>.panel-form{margin:0;padding:0}.modal-body>.panel-form>.panel-heading{padding-left:1px;padding-right:1px;padding-top:1px}.modal-body>.panel-form>.panel-body{padding:1px}.modal-body>.form{padding-top:1px}.modal .history,.modal .panel-body>.form{padding:0}:root{--article-p-space:0}.lane-col-join-with-above{position:relative}.lane-col-join-with-above:before{background-color:inherit;left:0;position:absolute;right:0;--tw-content:"";content:var(--tw-content);height:var(--kanban-col-gap-top,var(--kanban-lanes-gap));top:calc(0px - var(--kanban-col-gap-top, var(--kanban-lanes-gap)))}.arrow,.arrow:before{background:inherit;height:calc(var(--arrow-size)*1.4142);position:absolute;width:calc(var(--arrow-size)*1.4142)}.arrow{visibility:hidden;--arrow-size:5px}.arrow:before{border:inherit;content:"";visibility:visible;--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.arrow-top,.arrow-up{border-bottom:inherit;border-right:inherit;border-width:1px 0 0 1px;top:calc(1px - var(--arrow-size))}.white>.arrow-top,.white>.arrow-up{top:calc(0px - var(--arrow-size))}.arrow-bottom,.arrow-down{border-left:inherit;border-top:inherit;border-width:0 1px 1px 0;bottom:calc(1px - var(--arrow-size))}.white>.arrow-bottom,.white>.arrow-down{bottom:calc(0px - var(--arrow-size))}.arrow-left{border-right:inherit;border-top:inherit;border-width:0 0 1px 1px;left:calc(1px - var(--arrow-size))}.white>.arrow-left{left:calc(0px - var(--arrow-size))}.arrow-right{border-bottom:inherit;border-left:inherit;border-width:1px 1px 0 0;right:calc(1px - var(--arrow-size))}.white>.arrow-right{right:calc(0px - var(--arrow-size))}.caret,.caret-down,.caret-left,.caret-right,.caret-up{align-items:center;display:inline-flex;height:.75rem;justify-content:center;position:relative;width:.75rem}.caret-down:before,.caret-left:before,.caret-right:before,.caret-up:before,.caret:before{display:block;height:.35rem;transform-origin:center;width:.35rem;--tw-translate-y:-1px;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.caret-left:before{--tw-translate-x:0.125rem;--tw-translate-y:0px;--tw-rotate:135deg}.caret-left:before,.caret-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.caret-right:before{--tw-translate-x:-0.125rem;--tw-translate-y:0px;--tw-rotate:-45deg}.caret-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:focus>.caret,:hover>.caret{opacity:inherit}.disabled .caret,.readonly .caret{opacity:var(--caret-opacity,.5)}:root{--toggle-icon-size:calc(var(--font-size-root)*3/4 + 1px)}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-color:currentColor;border-width:1px;display:block;opacity:.5;position:relative}.toggle-icon-collapse:hover,.toggle-icon-expand:hover,.toggle-icon:hover{opacity:.9}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-radius:inherit;height:var(--toggle-icon-size);width:var(--toggle-icon-size)}.is-collapsed .toggle-icon:after,.is-collapsed .toggle-icon:before,.is-expanded .toggle-icon:before,.toggle-icon-collapse:after,.toggle-icon-collapse:before,.toggle-icon-expand:before{background-color:currentColor;content:" ";display:block;height:1px;left:2px;position:absolute;right:2px;top:calc((var(--toggle-icon-size) - 3px)/2)}.is-collapsed .toggle-icon:after,.toggle-icon-collapse:after{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.spinner,.spinner:after,.spinner:before{display:block;height:1em;position:relative;width:1em}.spinner:after,.spinner:before{border-radius:var(--radius-full);content:" ";position:absolute}.spinner:before{animation:-spin 1s cubic-bezier(.6,0,.4,1) infinite;border:.16667em solid transparent;border-top-color:currentcolor}.spinner:after{border:.16667em solid;opacity:.2}.magnifier{display:inline-block;height:1em;position:relative;width:1em}.magnifier:after,.magnifier:before{border-radius:var(--radius-full);content:"";display:block;position:absolute}.magnifier:before{border:1px solid;height:.75em;width:.75em}.magnifier:after{height:1px;left:.55em;top:.7em;width:.5em;--tw-rotate:45deg;background-color:currentColor;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.more,.more-vert{margin:.5rem;position:relative}.more,.more-vert,.more-vert:after,.more-vert:before,.more:after,.more:before{background-color:currentColor;border-radius:var(--radius-full);height:.125rem;width:.125rem}.more-vert:after,.more-vert:before,.more:after,.more:before{display:block;left:-5px;position:absolute;top:0;--tw-content:"";content:var(--tw-content)}.more-vert:after,.more:after{left:5px}.more-vert{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-down,.chevron-left,.chevron-right,.chevron-up{align-items:center;display:inline-flex;height:1em;justify-content:center;position:relative;width:1em}.chevron-down:before,.chevron-left:before,.chevron-right:before,.chevron-up:before{display:block;height:.6923077em;transform-origin:center;width:.6923077em;--tw-translate-y:-0.125rem;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.chevron-left:before{--tw-translate-y:0px;--tw-translate-x:0.125rem;--tw-rotate:135deg}.chevron-left:before,.chevron-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-right:before{--tw-translate-y:0px;--tw-translate-x:-0.125rem;--tw-rotate:-45deg}.chevron-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.i-time{border-color:currentColor;border-radius:50%;border-width:.08em;display:inline-block;height:1em;position:relative;width:1em}.i-time:after{border-color:currentColor;border-width:0 0 .08em .08em;height:.385em;left:.3846em;position:absolute;top:.08em;width:.385em;--tw-content:"";content:var(--tw-content)}.i-calendar{border-color:currentColor;border-radius:2px;border-width:.08em;display:inline-block;height:.79em;margin-top:.16em;position:relative;width:1em}.i-calendar:after,.i-calendar:before{border-color:currentColor;border-width:.08em;position:absolute;--tw-content:"";content:var(--tw-content)}.i-calendar:before{border-bottom-width:0;left:.15em;top:.307em;width:.6em}.i-calendar:after{border-bottom-width:0;border-top-width:0;height:.3077em;left:.17em;top:-.154em;width:.538em}:root{--state-color:rgba(0,0,0,.05);--state-scale:.9;--opacity-disabled:.7;--opacity-muted:.5;--load-indicator-duration:300ms;--load-indicator-delay:.5s}.btn,.item>a,.state{cursor:pointer;position:relative}.btn:before,.item>a:before,.state:before{background:var(--state-color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transform:scale(var(--state-scale));transition-duration:.2s;transition-property:opacity,transform,box-shadow,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn.active:not(:hover,:focus-visible,:focus-within,:active):before,.item>a.active:not(:hover,:focus-visible,:focus-within,:active):before,.state.active:not(:hover,:focus-visible,:focus-within,:active):before{background:var(--state-active-color,var(--state-color));opacity:var(--state-active-opacity,0);--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-duration:.7s}.btn.selected:not(:hover,:focus-visible,:focus-within,:active):before,.item>a.selected:not(:hover,:focus-visible,:focus-within,:active):before,.state.selected:not(:hover,:focus-visible,:focus-within,:active):before{background:var(--state-selected-color,var(--state-scale));opacity:var(--state-selected-opacity,.1);--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn:focus-visible,.item>a:focus-visible,.state:focus-visible{outline:2px solid transparent;outline-offset:2px}.btn:active:before,.btn:focus-visible:before,.btn:hover:before,.item>a:active:before,.item>a:focus-visible:before,.item>a:hover:before,.state:active:before,.state:focus-visible:before,.state:hover:before{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn:hover:before,.item>a:hover:before,.state:hover:before{opacity:var(--state-hover-opacity,1)}.btn:active:before,.item>a:active:before,.state:active:before{background:var(--state-pressed-color,var(--state-color));opacity:var(--state-pressed-opacity,.6);--tw-ring-color:var(--state-ring-color,currentColor);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);transition-duration:.7s}.btn:focus-visible:before,.item>a:focus-visible:before,.state:focus-visible:before{background:var(--state-focus-color,var(--state-color));opacity:var(--state-focus-opacity,1);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-focus-rgb),var(--tw-ring-opacity))}.btn.disabled:before,.btn[disabled]:before,.item>a.disabled:before,.item>a[disabled]:before,.state.disabled:before,.state[disabled]:before{display:none}.btn{--state-active-opacity:1}@-moz-document url-prefix(){.btn,:root{--state-active-opacity:0;--state-focus-opacity:0}}.disabled,.disabled *,[disabled],[disabled] *{cursor:not-allowed!important;opacity:var(--opacity-disabled);--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.load-indicator:after,.load-indicator:before{display:block;opacity:0;position:absolute;transition-delay:0s;transition-duration:.15s;transition-duration:var(--load-indicator-duration);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden}.load-indicator:before{align-items:center;background-color:rgba(var(--color-canvas-rgb),.7);border-radius:inherit;bottom:0;display:flex;font-size:.75rem;justify-content:center;left:0;line-height:1rem;right:0;top:0;z-index:99;--tw-content:attr(data-loading);content:var(--tw-content)}.load-indicator[data-loading]:before{padding-top:3.5rem}.load-indicator:after{border-color:transparent currentcolor currentcolor;border-radius:var(--radius-full);border-style:dotted;border-width:4px 3px 4px 4px;height:2rem;left:50%;margin-left:-1rem;margin-top:-1rem;top:50%;width:2rem;z-index:100;--tw-content:"";content:var(--tw-content)}.load-indicator.loading:after,.load-indicator.loading:before{opacity:1;transition-delay:var(--load-indicator-delay);visibility:visible}@keyframes -spin{to{transform:rotate(1turn)}}.load-indicator.loading:after{animation:-spin 1s linear infinite;opacity:.5}.events-none,.pointer-events-none{pointer-events:none}.events-auto,.pointer-events-auto{pointer-events:auto}.scroll-auto{scroll-behavior:auto}.scroll-smooth{scroll-behavior:smooth}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;-moz-user-select:auto;user-select:auto}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-text{cursor:text}.cursor-move{cursor:move}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.active\:opacity-100.active,.active\:opacity-100:active,.group.active .group-active\:opacity-100,.group:active .group-active\:opacity-100,.group:hover .group-hover\:opacity-100,.hover\:opacity-100:hover{opacity:1}.active\:opacity-0.active,.active\:opacity-0:active,.group.active .group-active\:opacity-0,.group:active .group-active\:opacity-0,.group:hover .group-hover\:opacity-0,.hover\:opacity-0:hover{opacity:0}.active\:text-primary.active,.active\:text-primary:active,.group.active .group-active\:text-primary,.group:active .group-active\:text-primary,.group:hover .group-hover\:text-primary,.hover\:text-primary:hover{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.active\:border-primary.active,.active\:border-primary:active,.group.active .group-active\:border-primary,.group:active .group-active\:border-primary,.group:hover .group-hover\:border-primary,.hover\:border-primary:hover{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity))}.active\:primary-pale.active,.active\:primary-pale:active,.group.active .group-active\:primary-pale,.group:active .group-active\:primary-pale,.group:hover .group-hover\:primary-pale,.hover\:primary-pale:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.active\:primary.active,.active\:primary:active,.group.active .group-active\:primary,.group:active .group-active\:primary,.group:hover .group-hover\:primary,.hover\:primary:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.active\:canvas.active,.active\:canvas:active,.group.active .group-active\:canvas,.group:active .group-active\:canvas,.group:hover .group-hover\:canvas,.hover\:canvas:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.active\:font-bold.active,.active\:font-bold:active,.group.active .group-active\:font-bold,.group:active .group-active\:font-bold,.group:hover .group-hover\:font-bold,.hover\:font-bold:hover{font-weight:700}.active\:shadow.active,.active\:shadow:active,.group.active .group-active\:shadow,.group:active .group-active\:shadow,.group:hover .group-hover\:shadow,.hover\:shadow:hover{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.active\:shadow-lg.active,.active\:shadow-lg:active,.group.active .group-active\:shadow-lg,.group:active .group-active\:shadow-lg,.group:hover .group-hover\:shadow-lg,.hover\:shadow-lg:hover{--tw-shadow:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--tw-shadow-colored:0 5px 15px -3px var(--tw-shadow-color),0 2px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:block,.hover\:block:hover{display:block!important}.group:hover .group-hover\:flex,.hover\:flex:hover{display:flex!important}.group:hover .group-hover\:inline-flex,.hover\:inline-flex:hover{display:inline-flex!important}.group:hover .group-hover\:scale-110,.hover\:scale-110:hover{--tw-scale-x:1.1!important;--tw-scale-y:1.1!important}.group:hover .group-hover\:scale-110,.group:hover .group-hover\:scale-125,.hover\:scale-110:hover,.hover\:scale-125:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.group:hover .group-hover\:scale-125,.hover\:scale-125:hover{--tw-scale-x:1.25!important;--tw-scale-y:1.25!important}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.container{width:100%}@media (min-width:1720px){.container{max-width:1720px}}.container{margin-left:auto;margin-right:auto}.popup{background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));border-radius:var(--radius);--tw-bg-opacity:0.85;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;--tw-backdrop-blur:blur(16px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.hidden{display:none!important}.pull-right{float:right}.pull-left{float:left}.clearfix:after{clear:both;content:"";display:block}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-fill{-o-object-fit:fill;object-fit:fill}.object-none{-o-object-fit:none;object-fit:none}.object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.object-bottom{-o-object-position:bottom;object-position:bottom}.object-center{-o-object-position:center;object-position:center}.object-left{-o-object-position:left;object-position:left}.object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.object-left-top{-o-object-position:left top;object-position:left top}.object-right{-o-object-position:right;object-position:right}.object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.object-right-top{-o-object-position:right top;object-position:right top}.object-top{-o-object-position:top;object-position:top}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-clip{overflow:clip}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-clip{overflow-x:clip}.overflow-y-clip{overflow-y:clip}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.overflow-overlay{overflow:overlay}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{bottom:0;left:0;right:0;top:0}.inset-auto{bottom:auto;left:auto;right:auto;top:auto}.inset-x-0{left:0;right:0}.inset-y-0{bottom:0;top:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-full{top:100%}.right-full{right:100%}.bottom-full{bottom:100%}.left-full{left:100%}.top-auto{top:auto}.right-auto{right:auto}.bottom-auto{bottom:auto}.left-auto{left:auto}.top-px{top:1px}.right-px{right:1px}.bottom-px{bottom:1px}.left-px{left:1px}.top-0\.5{top:.125rem}.right-0\.5{right:.125rem}.bottom-0\.5{bottom:.125rem}.left-0\.5{left:.125rem}.top-1{top:.25rem}.right-1{right:.25rem}.bottom-1{bottom:.25rem}.left-1{left:.25rem}.top-1\.5{top:.375rem}.right-1\.5{right:.375rem}.bottom-1\.5{bottom:.375rem}.left-1\.5{left:.375rem}.top-2{top:.5rem}.right-2{right:.5rem}.bottom-2{bottom:.5rem}.left-2{left:.5rem}.top-2\.5{top:.625rem}.right-2\.5{right:.625rem}.bottom-2\.5{bottom:.625rem}.left-2\.5{left:.625rem}.top-3{top:.75rem}.right-3{right:.75rem}.bottom-3{bottom:.75rem}.left-3{left:.75rem}.top-3\.5{top:.875rem}.right-3\.5{right:.875rem}.bottom-3\.5{bottom:.875rem}.left-3\.5{left:.875rem}.top-4{top:1rem}.right-4{right:1rem}.bottom-4{bottom:1rem}.left-4{left:1rem}.top-5{top:1.25rem}.right-5{right:1.25rem}.bottom-5{bottom:1.25rem}.left-5{left:1.25rem}.top-6{top:1.5rem}.right-6{right:1.5rem}.bottom-6{bottom:1.5rem}.left-6{left:1.5rem}.top-7{top:1.75rem}.right-7{right:1.75rem}.bottom-7{bottom:1.75rem}.left-7{left:1.75rem}.top-8{top:2rem}.right-8{right:2rem}.bottom-8{bottom:2rem}.left-8{left:2rem}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-0{z-index:0}.z-1{z-index:1}.z-5{z-index:5}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.z-base{z-index:1100}.z-above{z-index:50}.z-below{z-index:-50}.z-dropdown{z-index:1200}.z-sticky{z-index:1300}.z-fixed{z-index:1400}.z-modal{z-index:1500}.z-overlay{z-index:1600}.z-popover{z-index:1700}.z-tooltip{z-index:1800}.z-messager{z-index:1900}.m-0{margin:0}.m-auto{margin:auto}.m-px{margin:1px}.m-0\.5{margin:.125rem}.m-1{margin:.25rem}.m-1\.5{margin:.375rem}.m-2{margin:.5rem}.m-2\.5{margin:.625rem}.m-3{margin:.75rem}.m-3\.5{margin:.875rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-7{margin:1.75rem}.m-8{margin:2rem}.m-9{margin:2.25rem}.m-10{margin:2.5rem}.mx-0{margin-left:0;margin-right:0}.my-0{margin-bottom:0}.mt-0,.my-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mx-auto{margin-left:auto;margin-right:auto}.my-auto{margin-bottom:auto}.mt-auto,.my-auto{margin-top:auto}.mr-auto{margin-right:auto}.mb-auto{margin-bottom:auto}.ml-auto{margin-left:auto}.mx-px{margin-left:1px;margin-right:1px}.my-px{margin-bottom:1px}.mt-px,.my-px{margin-top:1px}.mr-px{margin-right:1px}.mb-px{margin-bottom:1px}.ml-px{margin-left:1px}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.my-0\.5{margin-bottom:.125rem}.mt-0\.5,.my-0\.5{margin-top:.125rem}.mr-0\.5{margin-right:.125rem}.mb-0\.5{margin-bottom:.125rem}.ml-0\.5{margin-left:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-1{margin-bottom:.25rem}.mt-1,.my-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.my-1\.5{margin-bottom:.375rem}.mt-1\.5,.my-1\.5{margin-top:.375rem}.mr-1\.5{margin-right:.375rem}.mb-1\.5{margin-bottom:.375rem}.ml-1\.5{margin-left:.375rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-2{margin-bottom:.5rem}.mt-2,.my-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.my-2\.5{margin-bottom:.625rem}.mt-2\.5,.my-2\.5{margin-top:.625rem}.mr-2\.5{margin-right:.625rem}.mb-2\.5{margin-bottom:.625rem}.ml-2\.5{margin-left:.625rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-3{margin-bottom:.75rem}.mt-3,.my-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.my-3\.5{margin-bottom:.875rem}.mt-3\.5,.my-3\.5{margin-top:.875rem}.mr-3\.5{margin-right:.875rem}.mb-3\.5{margin-bottom:.875rem}.ml-3\.5{margin-left:.875rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-4{margin-bottom:1rem}.mt-4,.my-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.my-5{margin-bottom:1.25rem}.mt-5,.my-5{margin-top:1.25rem}.mr-5{margin-right:1.25rem}.mb-5{margin-bottom:1.25rem}.ml-5{margin-left:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-6{margin-bottom:1.5rem}.mt-6,.my-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mx-7{margin-left:1.75rem;margin-right:1.75rem}.my-7{margin-bottom:1.75rem}.mt-7,.my-7{margin-top:1.75rem}.mr-7{margin-right:1.75rem}.mb-7{margin-bottom:1.75rem}.ml-7{margin-left:1.75rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-8{margin-bottom:2rem}.mt-8,.my-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.ml-8{margin-left:2rem}.mx-9{margin-left:2.25rem;margin-right:2.25rem}.my-9{margin-bottom:2.25rem}.mt-9,.my-9{margin-top:2.25rem}.mr-9{margin-right:2.25rem}.mb-9{margin-bottom:2.25rem}.ml-9{margin-left:2.25rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.my-10{margin-bottom:2.5rem}.mt-10,.my-10{margin-top:2.5rem}.mr-10{margin-right:2.5rem}.mb-10{margin-bottom:2.5rem}.ml-10{margin-left:2.5rem}.p-0{padding:0}.p-px{padding:1px}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.p-9{padding:2.25rem}.p-10{padding:2.5rem}.px-0{padding-left:0;padding-right:0}.py-0{padding-bottom:0}.pt-0,.py-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.px-px{padding-left:1px;padding-right:1px}.py-px{padding-bottom:1px}.pt-px,.py-px{padding-top:1px}.pr-px{padding-right:1px}.pb-px{padding-bottom:1px}.pl-px{padding-left:1px}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.py-0\.5{padding-bottom:.125rem}.pt-0\.5,.py-0\.5{padding-top:.125rem}.pr-0\.5{padding-right:.125rem}.pb-0\.5{padding-bottom:.125rem}.pl-0\.5{padding-left:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-1{padding-bottom:.25rem}.pt-1,.py-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.py-1\.5{padding-bottom:.375rem}.pt-1\.5,.py-1\.5{padding-top:.375rem}.pr-1\.5{padding-right:.375rem}.pb-1\.5{padding-bottom:.375rem}.pl-1\.5{padding-left:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-2{padding-bottom:.5rem}.pt-2,.py-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.py-2\.5{padding-bottom:.625rem}.pt-2\.5,.py-2\.5{padding-top:.625rem}.pr-2\.5{padding-right:.625rem}.pb-2\.5{padding-bottom:.625rem}.pl-2\.5{padding-left:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-3{padding-bottom:.75rem}.pt-3,.py-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.py-3\.5{padding-bottom:.875rem}.pt-3\.5,.py-3\.5{padding-top:.875rem}.pr-3\.5{padding-right:.875rem}.pb-3\.5{padding-bottom:.875rem}.pl-3\.5{padding-left:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.py-4{padding-bottom:1rem}.pt-4,.py-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-5{padding-bottom:1.25rem}.pt-5,.py-5{padding-top:1.25rem}.pr-5{padding-right:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-6{padding-bottom:1.5rem}.pt-6,.py-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-7{padding-bottom:1.75rem}.pt-7,.py-7{padding-top:1.75rem}.pr-7{padding-right:1.75rem}.pb-7{padding-bottom:1.75rem}.pl-7{padding-left:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-8{padding-bottom:2rem}.pt-8,.py-8{padding-top:2rem}.pr-8{padding-right:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.py-9{padding-bottom:2.25rem}.pt-9,.py-9{padding-top:2.25rem}.pr-9{padding-right:2.25rem}.pb-9{padding-bottom:2.25rem}.pl-9{padding-left:2.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-10{padding-bottom:2.5rem}.pt-10,.py-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pb-10{padding-bottom:2.5rem}.pl-10{padding-left:2.5rem}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(0px*(1 - var(--tw-space-x-reverse)));margin-right:calc(0px*var(--tw-space-x-reverse))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.125rem*var(--tw-space-x-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.375rem*var(--tw-space-x-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.625rem*var(--tw-space-x-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.625rem*var(--tw-space-y-reverse));margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.875rem*var(--tw-space-x-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.875rem*var(--tw-space-y-reverse));margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.75rem*var(--tw-space-x-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.75rem*var(--tw-space-y-reverse));margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.25rem*var(--tw-space-x-reverse))}.space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2.25rem*var(--tw-space-y-reverse));margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.5rem*var(--tw-space-x-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2.5rem*var(--tw-space-y-reverse));margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(1px*var(--tw-space-x-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1px*var(--tw-space-y-reverse));margin-top:calc(1px*(1 - var(--tw-space-y-reverse)))}.w-0{width:0}.w-px{width:1px}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-32{width:8rem}.w-36{width:9rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-52{width:13rem}.w-56{width:14rem}.w-60{width:15rem}.w-64{width:16rem}.w-72{width:18rem}.w-80{width:20rem}.w-96{width:24rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-1\/6{width:16.666667%}.w-2\/6{width:33.333333%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.w-min{width:-moz-min-content;width:min-content}.w-max{width:-moz-max-content;width:max-content}.w-fit{width:-moz-fit-content;width:fit-content}.min-w-0{min-width:0}.min-w-full{min-width:100%}.min-w-min{min-width:-moz-min-content;min-width:min-content}.min-w-max{min-width:-moz-max-content;min-width:max-content}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.max-w-0{max-width:0}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-min{max-width:-moz-min-content;max-width:min-content}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-fit{max-width:-moz-fit-content;max-width:fit-content}.h-0{height:0}.h-px{height:1px}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-32{height:8rem}.h-36{height:9rem}.h-40{height:10rem}.h-44{height:11rem}.h-48{height:12rem}.h-52{height:13rem}.h-56{height:14rem}.h-60{height:15rem}.h-64{height:16rem}.h-72{height:18rem}.h-80{height:20rem}.h-96{height:24rem}.h-1\/2{height:50%}.h-1\/3{height:33.333333%}.h-2\/3{height:66.666667%}.h-1\/4{height:25%}.h-2\/4{height:50%}.h-3\/4{height:75%}.h-1\/5{height:20%}.h-2\/5{height:40%}.h-3\/5{height:60%}.h-4\/5{height:80%}.h-1\/6{height:16.666667%}.h-2\/6{height:33.333333%}.h-3\/6{height:50%}.h-4\/6{height:66.666667%}.h-5\/6{height:83.333333%}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.h-min{height:-moz-min-content;height:min-content}.h-max{height:-moz-max-content;height:max-content}.h-fit{height:-moz-fit-content;height:fit-content}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-min{min-height:-moz-min-content;min-height:min-content}.min-h-max{min-height:-moz-max-content;min-height:max-content}.min-h-fit{min-height:-moz-fit-content;min-height:fit-content}.max-h-0{max-height:0}.max-h-px{max-height:1px}.max-h-none{max-height:none}.max-h-full{max-height:100%}.max-h-min{max-height:-moz-min-content;max-height:min-content}.max-h-screen{max-height:100vh}.max-h-max{max-height:-moz-max-content;max-height:max-content}.max-h-fit{max-height:-moz-fit-content;max-height:fit-content}.canvas,.surface,.surface-light,.surface-strong{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}.canvas{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.surface-light{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-light-rgb),var(--tw-ring-opacity))}.surface{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-rgb),var(--tw-ring-opacity))}.surface-strong{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-strong-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-strong-rgb),var(--tw-ring-opacity))}.inverse{background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity));color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.inverse,.white{--tw-bg-opacity:1;--tw-text-opacity:1}.white{background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity));color:rgba(var(--color-fore-in-light-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-white-rgb),var(--tw-ring-opacity))}.black{--tw-bg-opacity:1;background-color:rgba(var(--color-black-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-black-rgb),var(--tw-ring-opacity))}.transparent{background-color:transparent;--tw-ring-color:transparent}.skin{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.skin:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger,.darken,.darker,.darkest,.gray,.gray-100,.gray-200,.gray-300,.gray-400,.gray-50,.gray-500,.gray-600,.gray-700,.gray-800,.gray-900,.gray-950,.important,.lighten,.lighter,.lightest,.primary,.secondary,.special,.success,.warning{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger:hover,.darken:hover,.darker:hover,.darkest:hover,.gray-100:hover,.gray-200:hover,.gray-300:hover,.gray-400:hover,.gray-500:hover,.gray-50:hover,.gray-600:hover,.gray-700:hover,.gray-800:hover,.gray-900:hover,.gray-950:hover,.gray:hover,.important:hover,.lighten:hover,.lighter:hover,.lightest:hover,.primary:hover,.secondary:hover,.special:hover,.success:hover,.warning:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger,.darken,.darker,.darkest,.gray,.gray-100,.gray-200,.gray-300,.gray-400,.gray-50,.gray-500,.gray-600,.gray-700,.gray-800,.gray-900,.gray-950,.important,.lighten,.lighter,.lightest,.primary,.secondary,.special,.success,.warning{--skin-text:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity));--skin-color:rgba(var(--skin-solid-rgb),1);--state-ring-color:var(--skin-color);--state-active-color:rgba(0,0,0,.1);--state-pressed-color:rgba(0,0,0,.1);--state-color:hsla(0,0%,100%,.1);--state-focus-color:rgba(0,0,0,.1)}.primary{--skin-solid-rgb:var(--color-primary-500-rgb)}.secondary{--skin-solid-rgb:var(--color-secondary-500-rgb)}.success{--skin-solid-rgb:var(--color-success-500-rgb)}.warning{--skin-solid-rgb:var(--color-warning-500-rgb)}.danger{--skin-solid-rgb:var(--color-danger-500-rgb)}.important{--skin-solid-rgb:var(--color-important-500-rgb)}.special{--skin-solid-rgb:var(--color-special-500-rgb)}.gray-50{--skin-bg:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity));--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-100{--skin-solid-rgb:var(--color-gray-100-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-200,.lightest{--skin-solid-rgb:var(--color-gray-200-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-300,.lighter{--skin-solid-rgb:var(--color-gray-300-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-400,.lighten{--skin-solid-rgb:var(--color-gray-400-rgb)}.gray,.gray-500{--skin-solid-rgb:var(--color-gray-500-rgb)}.darken,.gray-600{--skin-solid-rgb:var(--color-gray-600-rgb)}.darker,.gray-700{--skin-solid-rgb:var(--color-gray-700-rgb)}.darkest,.gray-800{--skin-solid-rgb:var(--color-gray-800-rgb)}.gray-900{--skin-solid-rgb:var(--color-gray-900-rgb)}.gray-950{--skin-solid-rgb:var(--color-gray-950-rgb)}.danger-pale,.gray-100-pale,.gray-200-pale,.gray-300-pale,.gray-400-pale,.gray-50-pale,.gray-500-pale,.gray-600-pale,.gray-700-pale,.gray-800-pale,.gray-900-pale,.gray-950-pale,.gray-pale,.important-pale,.pale,.primary-pale,.secondary-pale,.special-pale,.success-pale,.warning-pale{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-pale:hover,.gray-100-pale:hover,.gray-200-pale:hover,.gray-300-pale:hover,.gray-400-pale:hover,.gray-50-pale:hover,.gray-500-pale:hover,.gray-600-pale:hover,.gray-700-pale:hover,.gray-800-pale:hover,.gray-900-pale:hover,.gray-950-pale:hover,.gray-pale:hover,.important-pale:hover,.pale:hover,.primary-pale:hover,.secondary-pale:hover,.special-pale:hover,.success-pale:hover,.warning-pale:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-pale,.gray-100-pale,.gray-200-pale,.gray-300-pale,.gray-400-pale,.gray-50-pale,.gray-500-pale,.gray-600-pale,.gray-700-pale,.gray-800-pale,.gray-900-pale,.gray-950-pale,.gray-pale,.important-pale,.pale,.primary-pale,.secondary-pale,.special-pale,.success-pale,.warning-pale{--skin-color:rgba(var(--skin-pale-rgb),.1);--skin-text:rgba(var(--skin-pale-rgb),1);--state-color:rgba(var(--skin-pale-rgb),.1)}.pale{--skin-pale-rgb:var(--color-gray-500-rgb)}.primary-pale{--skin-pale-rgb:var(--color-primary-500-rgb)}.secondary-pale{--skin-pale-rgb:var(--color-secondary-500-rgb)}.success-pale{--skin-pale-rgb:var(--color-success-500-rgb)}.warning-pale{--skin-pale-rgb:var(--color-warning-500-rgb)}.danger-pale{--skin-pale-rgb:var(--color-danger-500-rgb)}.important-pale{--skin-pale-rgb:var(--color-important-500-rgb)}.special-pale{--skin-pale-rgb:var(--color-special-500-rgb)}.gray-50-pale{--skin-pale-rgb:var(--color-gray-50-rgb);--skin-text:var(--color-gray-400)}.gray-100-pale{--skin-pale-rgb:var(--color-gray-100-rgb);--skin-text:var(--color-gray-400)}.gray-200-pale{--skin-pale-rgb:var(--color-gray-200-rgb);--skin-text:var(--color-gray-400)}.gray-300-pale{--skin-pale-rgb:var(--color-gray-300-rgb);--skin-text:var(--color-gray-500)}.gray-400-pale{--skin-pale-rgb:var(--color-gray-400-rgb);--skin-text:var(--color-gray-500)}.gray-500-pale,.gray-pale{--skin-pale-rgb:var(--color-gray-500-rgb)}.gray-600-pale{--skin-pale-rgb:var(--color-gray-600-rgb)}.gray-700-pale{--skin-pale-rgb:var(--color-gray-700-rgb)}.gray-800-pale{--skin-pale-rgb:var(--color-gray-800-rgb)}.gray-900-pale{--skin-pale-rgb:var(--color-gray-900-rgb)}.gray-950-pale{--skin-pale-rgb:var(--color-gray-950-rgb)}.danger-outline,.dark-outline,.gray-300-outline,.gray-400-outline,.gray-600-outline,.gray-outline,.important-outline,.light-outline,.outline,.primary-outline,.secondary-outline,.special-outline,.success-outline,.warning-outline{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-outline:hover,.dark-outline:hover,.gray-300-outline:hover,.gray-400-outline:hover,.gray-600-outline:hover,.gray-outline:hover,.important-outline:hover,.light-outline:hover,.outline:hover,.primary-outline:hover,.secondary-outline:hover,.special-outline:hover,.success-outline:hover,.warning-outline:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-outline,.dark-outline,.gray-300-outline,.gray-400-outline,.gray-600-outline,.gray-outline,.important-outline,.light-outline,.outline,.primary-outline,.secondary-outline,.special-outline,.success-outline,.warning-outline{--skin-text:var(--skin-color,inherit);--skin-bg:transparent;--skin-color:rgba(var(--skin-outline-rgb),1);--state-color:rgba(var(--skin-outline-rgb),.1)}.outline{--skin-outline-rgb:var(--color-fore-rgb)}.primary-outline{--skin-outline-rgb:var(--color-primary-500-rgb)}.secondary-outline{--skin-outline-rgb:var(--color-secondary-500-rgb)}.success-outline{--skin-outline-rgb:var(--color-success-500-rgb)}.warning-outline{--skin-outline-rgb:var(--color-warning-500-rgb)}.danger-outline{--skin-outline-rgb:var(--color-danger-500-rgb)}.important-outline{--skin-outline-rgb:var(--color-important-500-rgb)}.special-outline{--skin-outline-rgb:var(--color-special-500-rgb)}.gray-300-outline{--skin-text:var(--color-gray-500);--skin-outline-rgb:var(--color-gray-300-rgb)}.gray-400-outline{--skin-text:var(--color-gray-500);--skin-outline-rgb:var(--color-gray-400-rgb)}.gray-outline{--skin-outline-rgb:var(--color-gray-500-rgb)}.gray-600-outline{--skin-outline-rgb:var(--color-gray-600-rgb)}.dark-outline{--skin-outline-rgb:var(--color-inverse-rgb)}.light-outline{--skin-outline-rgb:var(--color-canvas-rgb)}.danger-ghost,.ghost,.important-ghost,.primary-ghost,.secondary-ghost,.special-ghost,.success-ghost,.warning-ghost{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-ghost:hover,.ghost:hover,.important-ghost:hover,.primary-ghost:hover,.secondary-ghost:hover,.special-ghost:hover,.success-ghost:hover,.warning-ghost:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-ghost,.ghost,.important-ghost,.primary-ghost,.secondary-ghost,.special-ghost,.success-ghost,.warning-ghost{--tw-ring-opacity:0;--tw-bg-opacity:0;--skin-text:var(--skin-color,inherit);--skin-bg:transparent;--skin-ring:transparent;--skin-color:rgba(var(--skin-ghost-rgb),1);--state-color:rgba(var(--skin-ghost-rgb),.1)}.ghost{--skin-ghost-rgb:var(--color-fore-rgb);--skin-text:inherit}.primary-ghost{--skin-ghost-rgb:var(--color-primary-500-rgb)}.secondary-ghost{--skin-ghost-rgb:var(--color-secondary-500-rgb)}.success-ghost{--skin-ghost-rgb:var(--color-success-500-rgb)}.warning-ghost{--skin-ghost-rgb:var(--color-warning-500-rgb)}.danger-ghost{--skin-ghost-rgb:var(--color-danger-500-rgb)}.important-ghost{--skin-ghost-rgb:var(--color-important-500-rgb)}.special-ghost{--skin-ghost-rgb:var(--color-special-500-rgb)}.font-sans{font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif}.font-serif{font-family:Nimbus Roman No9 L,Songti SC,Noto Serif CJK SC,Source Han Serif SC,Source Han Serif CN,STSong,AR PL New Sung,AR PL SungtiL GB,NSimSun,SimSun,TW-Sung,WenQuanYi Bitmap Song,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,PMingLiU,MingLiU,serif}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-root{font-size:16px}.text-sm{font-size:.75rem;line-height:1rem}.text-base{font-size:.8125rem;line-height:1.25rem}.text-md{font-size:.875rem;line-height:1.3rem}.text-lg{font-size:1rem;line-height:1.5rem}.text-xl{font-size:1.125rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.font-thin{font-weight:100}.font-light{font-weight:300}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-black{font-weight:900}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.leading-10{line-height:2.5rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-loose{line-height:2}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{-webkit-line-clamp:3}.line-clamp-3,.line-clamp-4{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-4{-webkit-line-clamp:4}.line-clamp-5{-webkit-line-clamp:5}.line-clamp-5,.line-clamp-6{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-6{-webkit-line-clamp:6}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.align-bottom{vertical-align:bottom}.align-sub{vertical-align:sub}.align-super{vertical-align:super}.text-primary{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.text-secondary{--tw-text-opacity:1;color:rgba(var(--color-secondary-500-rgb),var(--tw-text-opacity))}.text-success{--tw-text-opacity:1;color:rgba(var(--color-success-500-rgb),var(--tw-text-opacity))}.text-warning{--tw-text-opacity:1;color:rgba(var(--color-warning-500-rgb),var(--tw-text-opacity))}.text-danger{--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.text-important{--tw-text-opacity:1;color:rgba(var(--color-important-500-rgb),var(--tw-text-opacity))}.text-special{--tw-text-opacity:1;color:rgba(var(--color-special-500-rgb),var(--tw-text-opacity))}.text-primary-50{--tw-text-opacity:1;color:rgba(var(--color-primary-50-rgb),var(--tw-text-opacity))}.text-primary-100{--tw-text-opacity:1;color:rgba(var(--color-primary-100-rgb),var(--tw-text-opacity))}.text-primary-200{--tw-text-opacity:1;color:rgba(var(--color-primary-200-rgb),var(--tw-text-opacity))}.text-primary-300{--tw-text-opacity:1;color:rgba(var(--color-primary-300-rgb),var(--tw-text-opacity))}.text-primary-400{--tw-text-opacity:1;color:rgba(var(--color-primary-400-rgb),var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.text-primary-600{--tw-text-opacity:1;color:rgba(var(--color-primary-600-rgb),var(--tw-text-opacity))}.text-primary-700{--tw-text-opacity:1;color:rgba(var(--color-primary-700-rgb),var(--tw-text-opacity))}.text-primary-800{--tw-text-opacity:1;color:rgba(var(--color-primary-800-rgb),var(--tw-text-opacity))}.text-primary-900{--tw-text-opacity:1;color:rgba(var(--color-primary-900-rgb),var(--tw-text-opacity))}.text-primary-950{--tw-text-opacity:1;color:rgba(var(--color-primary-950-rgb),var(--tw-text-opacity))}.text-secondary-50{--tw-text-opacity:1;color:rgba(var(--color-secondary-50-rgb),var(--tw-text-opacity))}.text-secondary-100{--tw-text-opacity:1;color:rgba(var(--color-secondary-100-rgb),var(--tw-text-opacity))}.text-secondary-200{--tw-text-opacity:1;color:rgba(var(--color-secondary-200-rgb),var(--tw-text-opacity))}.text-secondary-300{--tw-text-opacity:1;color:rgba(var(--color-secondary-300-rgb),var(--tw-text-opacity))}.text-secondary-400{--tw-text-opacity:1;color:rgba(var(--color-secondary-400-rgb),var(--tw-text-opacity))}.text-secondary-500{--tw-text-opacity:1;color:rgba(var(--color-secondary-500-rgb),var(--tw-text-opacity))}.text-secondary-600{--tw-text-opacity:1;color:rgba(var(--color-secondary-600-rgb),var(--tw-text-opacity))}.text-secondary-700{--tw-text-opacity:1;color:rgba(var(--color-secondary-700-rgb),var(--tw-text-opacity))}.text-secondary-800{--tw-text-opacity:1;color:rgba(var(--color-secondary-800-rgb),var(--tw-text-opacity))}.text-secondary-900{--tw-text-opacity:1;color:rgba(var(--color-secondary-900-rgb),var(--tw-text-opacity))}.text-secondary-950{--tw-text-opacity:1;color:rgba(var(--color-secondary-950-rgb),var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgba(var(--color-gray-50-rgb),var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(var(--color-gray-100-rgb),var(--tw-text-opacity))}.text-gray-200,.text-lightest{--tw-text-opacity:1;color:rgba(var(--color-gray-200-rgb),var(--tw-text-opacity))}.text-gray-300,.text-lighter{--tw-text-opacity:1;color:rgba(var(--color-gray-300-rgb),var(--tw-text-opacity))}.text-gray-400,.text-lighten{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.text-gray,.text-gray-500{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.text-darken,.text-gray-600{--tw-text-opacity:1;color:rgba(var(--color-gray-600-rgb),var(--tw-text-opacity))}.text-darker,.text-gray-700{--tw-text-opacity:1;color:rgba(var(--color-gray-700-rgb),var(--tw-text-opacity))}.text-darkest,.text-gray-800{--tw-text-opacity:1;color:rgba(var(--color-gray-800-rgb),var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgba(var(--color-gray-900-rgb),var(--tw-text-opacity))}.text-gray-950{--tw-text-opacity:1;color:rgba(var(--color-gray-950-rgb),var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity))}.text-black{--tw-text-opacity:1;color:rgba(var(--color-black-rgb),var(--tw-text-opacity))}.text-transparent{color:transparent}.text-canvas{--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.text-surface-light{--tw-text-opacity:1;color:rgba(var(--color-surface-light-rgb),var(--tw-text-opacity))}.text-surface{--tw-text-opacity:1;color:rgba(var(--color-surface-rgb),var(--tw-text-opacity))}.text-surface-strong{--tw-text-opacity:1;color:rgba(var(--color-surface-strong-rgb),var(--tw-text-opacity))}.text-inverse{--tw-text-opacity:1;color:rgba(var(--color-inverse-rgb),var(--tw-text-opacity))}.text-fore-in-light{--tw-text-opacity:1;color:rgba(var(--color-fore-in-light-rgb),var(--tw-text-opacity))}.text-fore-in-dark{--tw-text-opacity:1;color:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity))}.text-fore{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}.text-focus{--tw-text-opacity:1;color:rgba(var(--color-focus-rgb),var(--tw-text-opacity))}.text-link{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}.text-link-hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}.text-current{color:currentColor}.text-inherit{color:inherit}.clip,.ellipsis,.text-clip,.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.clip,.text-clip{text-overflow:clip}.whitespace-normal{white-space:normal}.nowrap,.whitespace-nowrap{white-space:nowrap}.pre,.whitespace-pre{white-space:pre}.pre-line,.whitespace-pre-line{white-space:pre-line}.pre-wrap,.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-opacity-0{--tw-text-opacity:0}.text-opacity-5{--tw-text-opacity:.05}.text-opacity-10{--tw-text-opacity:.1}.text-opacity-20{--tw-text-opacity:.2}.text-opacity-25{--tw-text-opacity:.25}.text-opacity-30{--tw-text-opacity:.3}.text-opacity-40{--tw-text-opacity:.4}.text-opacity-50{--tw-text-opacity:.5}.text-opacity-60{--tw-text-opacity:.6}.text-opacity-70{--tw-text-opacity:.7}.text-opacity-80{--tw-text-opacity:.8}.text-opacity-90{--tw-text-opacity:.9}.text-opacity-95{--tw-text-opacity:.95}.text-opacity-100{--tw-text-opacity:1}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.list-unstyled{list-style-type:none;padding-left:0}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.bg-primary{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity))}.bg-secondary{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-500-rgb),var(--tw-bg-opacity))}.bg-success{--tw-bg-opacity:1;background-color:rgba(var(--color-success-500-rgb),var(--tw-bg-opacity))}.bg-warning{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-500-rgb),var(--tw-bg-opacity))}.bg-danger{--tw-bg-opacity:1;background-color:rgba(var(--color-danger-500-rgb),var(--tw-bg-opacity))}.bg-important{--tw-bg-opacity:1;background-color:rgba(var(--color-important-500-rgb),var(--tw-bg-opacity))}.bg-special{--tw-bg-opacity:1;background-color:rgba(var(--color-special-500-rgb),var(--tw-bg-opacity))}.bg-primary-50{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.bg-primary-100{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity))}.bg-primary-200{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-200-rgb),var(--tw-bg-opacity))}.bg-primary-300{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-300-rgb),var(--tw-bg-opacity))}.bg-primary-400{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-400-rgb),var(--tw-bg-opacity))}.bg-primary-500{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-600-rgb),var(--tw-bg-opacity))}.bg-primary-700{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-700-rgb),var(--tw-bg-opacity))}.bg-primary-800{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-800-rgb),var(--tw-bg-opacity))}.bg-primary-900{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-900-rgb),var(--tw-bg-opacity))}.bg-primary-950{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-950-rgb),var(--tw-bg-opacity))}.bg-secondary-50{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-50-rgb),var(--tw-bg-opacity))}.bg-secondary-100{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-100-rgb),var(--tw-bg-opacity))}.bg-secondary-200{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-200-rgb),var(--tw-bg-opacity))}.bg-secondary-300{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-300-rgb),var(--tw-bg-opacity))}.bg-secondary-400{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-400-rgb),var(--tw-bg-opacity))}.bg-secondary-500{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-500-rgb),var(--tw-bg-opacity))}.bg-secondary-600{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-600-rgb),var(--tw-bg-opacity))}.bg-secondary-700{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-700-rgb),var(--tw-bg-opacity))}.bg-secondary-800{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-800-rgb),var(--tw-bg-opacity))}.bg-secondary-900{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-900-rgb),var(--tw-bg-opacity))}.bg-secondary-950{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-950-rgb),var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.bg-gray-200,.bg-lightest{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-200-rgb),var(--tw-bg-opacity))}.bg-gray-300,.bg-lighter{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-300-rgb),var(--tw-bg-opacity))}.bg-gray-400,.bg-light{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-400-rgb),var(--tw-bg-opacity))}.bg-gray,.bg-gray-500{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-500-rgb),var(--tw-bg-opacity))}.bg-darken,.bg-gray-600{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-600-rgb),var(--tw-bg-opacity))}.bg-darker,.bg-gray-700{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-700-rgb),var(--tw-bg-opacity))}.bg-darkest,.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-800-rgb),var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-900-rgb),var(--tw-bg-opacity))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-950-rgb),var(--tw-bg-opacity))}.bg-canvas{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.bg-surface-light{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity))}.bg-surface{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.bg-surface-strong{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-strong-rgb),var(--tw-bg-opacity))}.bg-inverse{--tw-bg-opacity:1;background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity))}.bg-fore-in-light{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-in-light-rgb),var(--tw-bg-opacity))}.bg-fore-in-dark{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-in-dark-rgb),var(--tw-bg-opacity))}.bg-fore{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-rgb),var(--tw-bg-opacity))}.bg-focus{--tw-bg-opacity:1;background-color:rgba(var(--color-focus-rgb),var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgba(var(--color-black-rgb),var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-current{background-color:currentColor}.bg-inherit{background-color:inherit}.bg-none{background-image:none}.bg-opacity-0{--tw-bg-opacity:0}.bg-opacity-5{--tw-bg-opacity:.05}.bg-opacity-10{--tw-bg-opacity:.1}.bg-opacity-20{--tw-bg-opacity:.2}.bg-opacity-25{--tw-bg-opacity:.25}.bg-opacity-30{--tw-bg-opacity:.3}.bg-opacity-40{--tw-bg-opacity:.4}.bg-opacity-50{--tw-bg-opacity:.5}.bg-opacity-60{--tw-bg-opacity:.6}.bg-opacity-70{--tw-bg-opacity:.7}.bg-opacity-80{--tw-bg-opacity:.8}.bg-opacity-90{--tw-bg-opacity:.9}.bg-opacity-100{--tw-bg-opacity:1}.bg-auto{background-size:auto}.bg-cover{background-size:cover}.bg-contain{background-size:contain}.bg-repeat{background-repeat:repeat}.bg-no-repeat{background-repeat:no-repeat}.bg-repeat-x{background-repeat:repeat-x}.bg-repeat-y{background-repeat:repeat-y}.bg-repeat-round{background-repeat:round}.bg-repeat-space{background-repeat:space}.bg-bottom{background-position:bottom}.bg-center{background-position:50%}.bg-left{background-position:0}.bg-left-bottom{background-position:0 100%}.bg-left-top{background-position:0 0}.bg-right{background-position:100%}.bg-right-bottom{background-position:100% 100%}.bg-right-top{background-position:100% 0}.bg-top{background-position:top}.bg-fixed{background-attachment:fixed}.bg-local{background-attachment:local}.bg-scroll{background-attachment:scroll}.divider{align-self:stretch;border-color:currentColor;border-left-width:1px;border-top-width:1px;opacity:.1}.border-0{border-width:0}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-t{border-top-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.border-t-0{border-top-width:0}.border-r-0{border-right-width:0}.border-b-0{border-bottom-width:0}.border-l-0{border-left-width:0}.border-t-2{border-top-width:2px}.border-l-2{border-left-width:2px}.border-r-2{border-right-width:2px}.border-b-2{border-bottom-width:2px}.border-t-4{border-top-width:4px}.border-l-4{border-left-width:4px}.border-r-4{border-right-width:4px}.border-b-4{border-bottom-width:4px}.border-light{--tw-border-opacity:1;border-color:rgba(var(--color-border-light-rgb),var(--tw-border-opacity))}.border-strong{--tw-border-opacity:1;border-color:rgba(var(--color-border-strong-rgb),var(--tw-border-opacity))}.border-primary{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity))}.border-secondary{--tw-border-opacity:1;border-color:rgba(var(--color-secondary-500-rgb),var(--tw-border-opacity))}.border-success{--tw-border-opacity:1;border-color:rgba(var(--color-success-500-rgb),var(--tw-border-opacity))}.border-warning{--tw-border-opacity:1;border-color:rgba(var(--color-warning-500-rgb),var(--tw-border-opacity))}.border-danger{--tw-border-opacity:1;border-color:rgba(var(--color-danger-500-rgb),var(--tw-border-opacity))}.border-important{--tw-border-opacity:1;border-color:rgba(var(--color-important-500-rgb),var(--tw-border-opacity))}.border-special{--tw-border-opacity:1;border-color:rgba(var(--color-special-500-rgb),var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgba(var(--color-gray-50-rgb),var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgba(var(--color-gray-100-rgb),var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(var(--color-gray-200-rgb),var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(var(--color-gray-300-rgb),var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.border-gray,.border-gray-500{--tw-border-opacity:1;border-color:rgba(var(--color-gray-500-rgb),var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgba(var(--color-gray-600-rgb),var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgba(var(--color-gray-700-rgb),var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgba(var(--color-gray-800-rgb),var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgba(var(--color-gray-900-rgb),var(--tw-border-opacity))}.border-gray-950{--tw-border-opacity:1;border-color:rgba(var(--color-gray-950-rgb),var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgba(var(--color-white-rgb),var(--tw-border-opacity))}.border-black{--tw-border-opacity:1;border-color:rgba(var(--color-black-rgb),var(--tw-border-opacity))}.border-canvas{--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity))}.border-surface-light{--tw-border-opacity:1;border-color:rgba(var(--color-surface-light-rgb),var(--tw-border-opacity))}.border-surface{--tw-border-opacity:1;border-color:rgba(var(--color-surface-rgb),var(--tw-border-opacity))}.border-surface-strong{--tw-border-opacity:1;border-color:rgba(var(--color-surface-strong-rgb),var(--tw-border-opacity))}.border-inverse{--tw-border-opacity:1;border-color:rgba(var(--color-inverse-rgb),var(--tw-border-opacity))}.border-fore-in-light{--tw-border-opacity:1;border-color:rgba(var(--color-fore-in-light-rgb),var(--tw-border-opacity))}.border-fore-in-dark{--tw-border-opacity:1;border-color:rgba(var(--color-fore-in-dark-rgb),var(--tw-border-opacity))}.border-fore{--tw-border-opacity:1;border-color:rgba(var(--color-fore-rgb),var(--tw-border-opacity))}.border-focus{--tw-border-opacity:1;border-color:rgba(var(--color-focus-rgb),var(--tw-border-opacity))}.border-link{--tw-border-opacity:1;border-color:rgba(var(--color-link-rgb),var(--tw-border-opacity))}.border-link-hover{--tw-border-opacity:1;border-color:rgba(var(--color-link-hover-rgb),var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-current{border-color:currentColor}.border-inherit{border-color:inherit}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-double{border-style:double}.border-hidden{border-style:hidden}.border-none{border-style:none}.border-opacity-0{--tw-border-opacity:0}.border-opacity-5{--tw-border-opacity:.05}.border-opacity-10{--tw-border-opacity:.1}.border-opacity-20{--tw-border-opacity:.2}.border-opacity-25{--tw-border-opacity:.25}.border-opacity-30{--tw-border-opacity:.3}.border-opacity-40{--tw-border-opacity:.4}.border-opacity-50{--tw-border-opacity:.5}.border-opacity-60{--tw-border-opacity:.6}.border-opacity-70{--tw-border-opacity:.7}.border-opacity-80{--tw-border-opacity:.8}.border-opacity-90{--tw-border-opacity:.9}.border-opacity-95{--tw-border-opacity:.95}.border-opacity-100{--tw-border-opacity:1}.rounded-none{border-radius:var(--radius-none)}.rounded-sm{border-radius:var(--radius-sm)}.rounded{border-radius:var(--radius)}.rounded-md{border-radius:var(--radius-md)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.circle,.rounded-full{border-radius:var(--radius-full)}.rounded-l-none{border-bottom-left-radius:var(--radius-none);border-top-left-radius:var(--radius-none)}.rounded-t-none{border-top-left-radius:var(--radius-none)}.rounded-r-none,.rounded-t-none{border-top-right-radius:var(--radius-none)}.rounded-b-none,.rounded-r-none{border-bottom-right-radius:var(--radius-none)}.rounded-b-none{border-bottom-left-radius:var(--radius-none)}.rounded-br-none{border-bottom-right-radius:var(--radius-none)}.rounded-bl-none{border-bottom-left-radius:var(--radius-none)}.rounded-tr-none{border-top-right-radius:var(--radius-none)}.rounded-tl-none{border-top-left-radius:var(--radius-none)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.ring-border-light{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-light-rgb),var(--tw-ring-opacity))}.ring-border{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.ring-border-strong{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.ring-light{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05}.ring-gray{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.1}.ring-dark{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.2}.ring-darker{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.3}.ring-darkest{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.5}.ring-primary{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-500-rgb),var(--tw-ring-opacity))}.ring-secondary{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-secondary-500-rgb),var(--tw-ring-opacity))}.ring-warning{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-warning-500-rgb),var(--tw-ring-opacity))}.ring-success{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-success-500-rgb),var(--tw-ring-opacity))}.ring-danger{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-danger-500-rgb),var(--tw-ring-opacity))}.ring-important{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-important-500-rgb),var(--tw-ring-opacity))}.ring-special{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-special-500-rgb),var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-50-rgb),var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-100-rgb),var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-200-rgb),var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-300-rgb),var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-400-rgb),var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-500-rgb),var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-600-rgb),var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-700-rgb),var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-800-rgb),var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-900-rgb),var(--tw-ring-opacity))}.ring-gray-950{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-950-rgb),var(--tw-ring-opacity))}.ring-inverse{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity))}.ring-canvas{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-canvas-rgb),var(--tw-ring-opacity))}.ring-surface{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-rgb),var(--tw-ring-opacity))}.ring-fore{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-fore-rgb),var(--tw-ring-opacity))}.ring-transparent{--tw-ring-color:transparent}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-black-rgb),var(--tw-ring-opacity))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-white-rgb),var(--tw-ring-opacity))}.ring-inherit{--tw-ring-color:inherit}.ring-current{--tw-ring-color:currentColor}.ring-opacity-0{--tw-ring-opacity:0}.ring-opacity-5{--tw-ring-opacity:.05}.ring-opacity-10{--tw-ring-opacity:.1}.ring-opacity-20{--tw-ring-opacity:.2}.ring-opacity-30{--tw-ring-opacity:.3}.ring-opacity-40{--tw-ring-opacity:.4}.ring-opacity-50{--tw-ring-opacity:.5}.ring-opacity-60{--tw-ring-opacity:.6}.ring-opacity-70{--tw-ring-opacity:.7}.ring-opacity-80{--tw-ring-opacity:.8}.ring-opacity-90{--tw-ring-opacity:.9}.ring-opacity-100{--tw-ring-opacity:1}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-3{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-3,.ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-offset-0{--tw-ring-offset-width:0px}.ring-offset-1{--tw-ring-offset-width:1px}.ring-offset-2{--tw-ring-offset-width:2px}.ring-offset-4{--tw-ring-offset-width:4px}.ring-offset-8{--tw-ring-offset-width:8px}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--tw-shadow-colored:0 2px 6px -1px var(--tw-shadow-color),0 1px 4px -2px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--tw-shadow-colored:0 5px 15px -3px var(--tw-shadow-color),0 2px 6px -4px var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color)}.shadow-2xl,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--tw-shadow-colored:0 10px 50px -10px var(--tw-shadow-color),0 8px 20px -10px var(--tw-shadow-color)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.muted{opacity:var(--opacity-muted)}.opacity-0{opacity:0}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.opacity-100{opacity:1}.blur-none{--tw-blur:blur(0)}.blur-none,.blur-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-sm{--tw-blur:blur(4px)}.blur{--tw-blur:blur(8px)}.blur,.blur-md{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-md{--tw-blur:blur(12px)}.blur-lg{--tw-blur:blur(16px)}.blur-lg,.blur-xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-xl{--tw-blur:blur(24px)}.grayscale{--tw-grayscale:grayscale(100%)}.grayscale,.invert{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%)}.filter-none{filter:none!important}.drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.drop-shadow-none,.drop-shadow-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}.drop-shadow,.drop-shadow-md{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,.07)) drop-shadow(0 2px 2px rgba(0,0,0,.06))}.drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,.04)) drop-shadow(0 4px 3px rgba(0,0,0,.1))}.drop-shadow-lg,.drop-shadow-xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,.03)) drop-shadow(0 8px 5px rgba(0,0,0,.08))}.drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,.15));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-none{--tw-backdrop-blur:blur(0)}.backdrop-blur-none,.backdrop-blur-sm{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-blur-md{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.backdrop-blur-lg,.backdrop-blur-xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.backdrop-blur-2xl,.backdrop-blur-3xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-none{transition-property:none}.fade,.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{opacity:0;transition-duration:.15s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{--tw-scale-x:.9;--tw-scale-y:.9}.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-bottom{--tw-translate-y:25%}.fade-from-top{--tw-translate-y:-25%}.fade-from-left,.fade-from-top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-left{--tw-translate-x:-25%}.fade-from-right{--tw-translate-x:25%}.fade-from-bottom.in,.fade-from-center.in,.fade-from-left.in,.fade-from-right,.fade-from-right.in,.fade-from-top.in,.fade.in{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-bottom.in,.fade-from-center.in,.fade-from-left.in,.fade-from-right.in,.fade-from-top.in,.fade.in{--tw-translate-x:0px;--tw-translate-y:0px;--tw-scale-x:1;--tw-scale-y:1;opacity:1}.duration-75{transition-duration:75ms}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-1000{transition-duration:1s}@keyframes -spin{to{transform:rotate(1turn)}}.animate-spin,.spin{animation:-spin 1s linear infinite}@keyframes -ping{75%,to{opacity:0;transform:scale(2)}}.animate-ping,.ping{animation:-ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes -pulse{50%{opacity:.5}}.animate-pulse,.pulse{animation:-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes -bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.animate-bounce,.bounce{animation:-bounce 1s infinite}.animate-highlight,.highlight{animation:-highlight 2s ease-in-out infinite;outline-color:#fde047;outline-offset:-1px;outline-style:solid;outline-width:1px}@keyframes -highlight{50%{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity));outline-offset:-4px;outline-width:4px}}.scale-0{--tw-scale-x:0;--tw-scale-y:0}.scale-0,.scale-50{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.scale-75,.scale-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-100,.scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.scale-105,.scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.scale-125,.scale-150{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.flip-x{--tw-scale-x:-1}.flip-x,.flip-y{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.flip-y{--tw-scale-y:-1}.rotate-0{--tw-rotate:0deg}.rotate-0,.rotate-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-1{--tw-rotate:1deg}.rotate-2{--tw-rotate:2deg}.rotate-2,.rotate-3{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-3{--tw-rotate:3deg}.rotate-6{--tw-rotate:6deg}.rotate-12,.rotate-6{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-12{--tw-rotate:12deg}.rotate-45{--tw-rotate:45deg}.rotate-45,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg}.rotate-135{--tw-rotate:135deg}.rotate-135,.rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.rotate-270{--tw-rotate:270deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.basis-0{flex-basis:0px}.basis-1{flex-basis:0.25rem}.basis-2{flex-basis:0.5rem}.basis-3{flex-basis:0.75rem}.basis-4{flex-basis:1rem}.basis-5{flex-basis:1.25rem}.basis-6{flex-basis:1.5rem}.basis-7{flex-basis:1.75rem}.basis-8{flex-basis:2rem}.basis-9{flex-basis:2.25rem}.basis-10{flex-basis:2.5rem}.basis-11{flex-basis:2.75rem}.basis-12{flex-basis:3rem}.basis-14{flex-basis:3.5rem}.basis-16{flex-basis:4rem}.basis-20{flex-basis:5rem}.basis-24{flex-basis:6rem}.basis-28{flex-basis:7rem}.basis-32{flex-basis:8rem}.basis-36{flex-basis:9rem}.basis-40{flex-basis:10rem}.basis-44{flex-basis:11rem}.basis-48{flex-basis:12rem}.basis-52{flex-basis:13rem}.basis-56{flex-basis:14rem}.basis-60{flex-basis:15rem}.basis-64{flex-basis:16rem}.basis-72{flex-basis:18rem}.basis-80{flex-basis:20rem}.basis-96{flex-basis:24rem}.basis-auto{flex-basis:auto}.basis-px{flex-basis:1px}.basis-0\.5{flex-basis:0.125rem}.basis-1\.5{flex-basis:0.375rem}.basis-2\.5{flex-basis:0.625rem}.basis-3\.5{flex-basis:0.875rem}.basis-1\/2{flex-basis:50%}.basis-1\/3{flex-basis:33.333333%}.basis-2\/3{flex-basis:66.666667%}.basis-1\/4{flex-basis:25%}.basis-2\/4{flex-basis:50%}.basis-3\/4{flex-basis:75%}.basis-1\/5{flex-basis:20%}.basis-2\/5{flex-basis:40%}.basis-3\/5{flex-basis:60%}.basis-4\/5{flex-basis:80%}.basis-1\/6{flex-basis:16.666667%}.basis-2\/6{flex-basis:33.333333%}.basis-3\/6{flex-basis:50%}.basis-4\/6{flex-basis:66.666667%}.basis-5\/6{flex-basis:83.333333%}.basis-1\/12{flex-basis:8.333333%}.basis-2\/12{flex-basis:16.666667%}.basis-3\/12{flex-basis:25%}.basis-4\/12{flex-basis:33.333333%}.basis-5\/12{flex-basis:41.666667%}.basis-6\/12{flex-basis:50%}.basis-7\/12{flex-basis:58.333333%}.basis-8\/12{flex-basis:66.666667%}.basis-9\/12{flex-basis:75%}.basis-10\/12{flex-basis:83.333333%}.basis-11\/12{flex-basis:91.666667%}.basis-full{flex-basis:100%}.row{display:flex;flex-direction:row}.center,.col{display:flex;flex-direction:column}.center,.center-row{align-items:center;justify-content:center}.center-row{display:flex;flex-direction:row}.center-x,.center-y{align-items:center;display:flex}.center-y{flex-direction:column}.row-reverse{display:flex;flex-direction:row-reverse}.col-reverse{display:flex;flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.grow{flex-grow:1!important}.grow-0{flex-grow:0!important}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.gap-0{gap:0}.gap-x-0{-moz-column-gap:0;column-gap:0}.gap-y-0{row-gap:0}.gap-px{gap:1px}.gap-x-px{-moz-column-gap:1px;column-gap:1px}.gap-y-px{row-gap:1px}.gap-0\.5{gap:.125rem}.gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.gap-y-0\.5{row-gap:.125rem}.gap-3px{gap:3px}.gap-1{gap:.25rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-y-1{row-gap:.25rem}.gap-1\.5{gap:.375rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-y-1\.5{row-gap:.375rem}.gap-2{gap:.5rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-2{row-gap:.5rem}.gap-2\.5{gap:.625rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-y-2\.5{row-gap:.625rem}.gap-3{gap:.75rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-3{row-gap:.75rem}.gap-3\.5{gap:.875rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-y-3\.5{row-gap:.875rem}.gap-4{gap:1rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-4{row-gap:1rem}.gap-5{gap:1.25rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-5{row-gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-6{row-gap:1.5rem}.gap-7{gap:1.75rem}.gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.gap-y-7{row-gap:1.75rem}.gap-8{gap:2rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-8{row-gap:2rem}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.self-baseline{align-self:baseline}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-evenly{align-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}@font-face{font-display:fallback;font-family:D-DIN-PRO;font-weight:400;src:url(./fonts/D-DIN-PRO-400-Regular.otf)}@font-face{font-display:fallback;font-family:D-DIN-PRO;font-weight:500;src:url(./fonts/D-DIN-PRO-700-Bold.otf)}.num{font-family:D-DIN-PRO}@font-face{font-display:fallback;font-family:Nunito;font-weight:400;src:url(./fonts/Nunito-Regular.ttf)}@font-face{font-display:fallback;font-family:Nunito;font-weight:700;src:url(./fonts/Nunito-Bold.ttf)}@font-face{font-display:fallback;font-family:Nunito;font-weight:300;src:url(./fonts/Nunito-Light.ttf)}.font-brand{font-family:Nunito;font-weight:400}@supports not (gap:4px){.gap-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(1px*var(--tw-space-x-reverse))}.gap-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2px*(1 - var(--tw-space-x-reverse)));margin-right:calc(2px*var(--tw-space-x-reverse))}.gap-3px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(3px*(1 - var(--tw-space-x-reverse)));margin-right:calc(3px*var(--tw-space-x-reverse))}.gap-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.gap-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(6px*(1 - var(--tw-space-x-reverse)));margin-right:calc(6px*var(--tw-space-x-reverse))}.gap-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.gap-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(10px*(1 - var(--tw-space-x-reverse)));margin-right:calc(10px*var(--tw-space-x-reverse))}.gap-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.gap-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(14px*(1 - var(--tw-space-x-reverse)));margin-right:calc(14px*var(--tw-space-x-reverse))}.gap-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.gap-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.gap-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.gap-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.75rem*var(--tw-space-x-reverse))}.gap-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.col.gap-px>:not([hidden])~:not([hidden]),.gap-px.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1px*var(--tw-space-y-reverse));margin-top:calc(1px*(1 - var(--tw-space-y-reverse)))}.col.gap-0\.5>:not([hidden])~:not([hidden]),.gap-0\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2px*var(--tw-space-y-reverse));margin-top:calc(2px*(1 - var(--tw-space-y-reverse)))}.col.gap-3px>:not([hidden])~:not([hidden]),.gap-3px.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(3px*var(--tw-space-y-reverse));margin-top:calc(3px*(1 - var(--tw-space-y-reverse)))}.col.gap-1>:not([hidden])~:not([hidden]),.gap-1.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.col.gap-1\.5>:not([hidden])~:not([hidden]),.gap-1\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(6px*var(--tw-space-y-reverse));margin-top:calc(6px*(1 - var(--tw-space-y-reverse)))}.col.gap-2>:not([hidden])~:not([hidden]),.gap-2.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.col.gap-2\.5>:not([hidden])~:not([hidden]),.gap-2\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(10px*var(--tw-space-y-reverse));margin-top:calc(10px*(1 - var(--tw-space-y-reverse)))}.col.gap-3>:not([hidden])~:not([hidden]),.gap-3.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.col.gap-3\.5>:not([hidden])~:not([hidden]),.gap-3\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(14px*var(--tw-space-y-reverse));margin-top:calc(14px*(1 - var(--tw-space-y-reverse)))}.col.gap-4>:not([hidden])~:not([hidden]),.gap-4.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.col.gap-5>:not([hidden])~:not([hidden]),.gap-5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.col.gap-6>:not([hidden])~:not([hidden]),.gap-6.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.col.gap-7>:not([hidden])~:not([hidden]),.gap-7.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.75rem*var(--tw-space-y-reverse));margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)))}.col.gap-8>:not([hidden])~:not([hidden]),.gap-8.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.nav-item>a>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}} \ No newline at end of file +.hint-md:after:after,.hint-xl:after{white-space:normal;word-break:break-all}.hint-sm:after{width:4rem}.hint-md:after{width:8rem}.hint-lg:after{width:16rem}.hint-xl:after{width:24rem}.hint-primary{--tooltip-bg:var(--color-primary-500)}.hint-success{--tooltip-bg:var(--color-success-500)}.hint-danger{--tooltip-bg:var(--color-danger-500)}.hint-warning{--tooltip-bg:var(--color-warning-500)}.hint-important{--tooltip-bg:var(--color-important-500)}.hint-special{--tooltip-bg:var(--color-special-500)}.tooltip{background-color:var(--tooltip-bg);border-color:var(--tooltip-color);border-radius:var(--radius);color:var(--tooltip-text);font-size:.75rem;line-height:1rem;max-width:28rem;padding:.25rem .5rem;white-space:pre-wrap;z-index:1800}.tooltip:not(.white)>.arrow{border-width:0}.tooltip.white>.arrow{border-color:inherit}.tooltip-has-title{--tw-bg-opacity:0.8;padding:.5rem .75rem .75rem;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.tooltip-has-title>.arrow{opacity:.75}.tooltip-heading{align-items:center;display:flex;font-size:.8125rem;font-weight:700;gap:1rem;justify-content:space-between;line-height:1.25rem;padding:.25rem}.tooltip-heading>.btn-close{margin-right:-.25rem}.tooltip-content{padding:.25rem}.tree-item-inner{flex-direction:row;min-height:24px;padding-left:var(--list-nested-indent)}.tree-item-inner,.tree-toggle{align-items:center;display:flex}.tree-toggle{border-radius:var(--radius);flex:none;height:1rem;justify-content:center;margin-right:-.375rem;width:1rem;--caret-size:5px;--caret-opacity:.3}.tree-item-inner>.item-icon{opacity:.5;width:1rem}.tree-item-inner:hover>.item-icon{opacity:.8}.tree-item-inner.has-hover{border-radius:var(--radius)}.tree-item-inner .item-title:not(:hover),.tree-item-inner>a.item-title:not(:hover){color:inherit}.tree-item-inner>.toolbar{margin-left:1rem;opacity:.6}.tree-item-inner:hover>.toolbar{opacity:1}.tree-item>.active{background:var(--menu-active-bg);color:var(--menu-active-color)}.tree-item>.selected{background:var(--menu-selected-bg)}.tree-item>.selected .item-content{color:var(--menu-selected-color);font-weight:700}.tree.search-menu-on-top>.search-box{left:0;right:0}.tree-lines .tree{position:relative}.tree-lines .tree-item{--tree-line-indent:calc(var(--list-nested-indent) + 8px)}.tree-lines .tree:before{border-left-width:1px;bottom:.5rem;display:block;left:var(--tree-line-indent);position:absolute;top:-.5rem;--tw-content:"";content:var(--tw-content)}.upload .upload-tip{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.upload .draggable-area{background-color:rgba(var(--color-primary-50-rgb),.2);border:1px dashed var(--color-primary-300)}.upload .draggable-area.dragover{background-color:rgba(var(--color-primary-500-rgb),.1);border-style:solid}.upload .upload-tip{color:var(--color-slate-500)}.file-item>.img{height:120px;width:120px}.upload .file-item:hover .file-size{display:flex!important}.form-batch-container{overflow-y:auto}.form-batch-table{min-width:100%;table-layout:fixed;--table-head-bg:var(--color-canvas)}.form-batch-table>*>tr{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.form-batch-table>*>tr>*{padding-left:.375rem;padding-right:.375rem;vertical-align:top}.form-batch-table>*>tr>th{text-align:left;vertical-align:middle}.form-batch-head[data-name=ACTIONS]{width:5rem}.form-batch-head[data-name=ACTIONS][data-action-count="3"]{width:6rem}.form-batch-label{display:inline}.form-batch-control>textarea.form-control{height:2rem}.form-batch-btn+.btn{margin-left:.25rem}.form-batch-table>tbody[data-count="1"] .form-batch-btn[data-type=delete]{display:none}.form-batch-ditto{position:relative}.form-batch-ditto-btn{bottom:0;height:auto;opacity:.5;padding-left:.5rem;padding-right:.5rem;position:absolute!important;right:0;top:0}.form-batch-ditto-btn:after{bottom:.5rem;left:-1px;position:absolute;top:.5rem;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}[data-ditto=on] .form-batch-ditto-btn{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));opacity:1}.form-batch-row-actions{padding-bottom:.75rem!important;padding-top:.75rem!important}.form-batch-ditto-wrapper{position:relative}.form-batch-ditto-control .form-control{padding-right:calc(var(--form-batch-ditto-width) + 8px)}.form-batch-ditto-control .input-control>.input-control-suffix{right:var(--form-batch-ditto-width)}.form-batch-ditto-control .input-control>.form-control{padding-right:calc(var(--form-batch-ditto-width) + var(--input-control-suffix))}.form-batch-ditto-control .pick-pri{padding-right:calc(var(--form-batch-ditto-width) + 8px)}.has-fixed-actions .form-batch-head[data-name=ACTIONS],.has-fixed-actions .form-batch-row-actions{position:sticky;right:0;z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.datalist{--datalist-label-width:68px}.datalist-item{display:flex;gap:.5rem;padding-bottom:.375rem;padding-top:.375rem}.datalist-item-label{align-items:center;display:flex;flex:none;justify-content:flex-end;overflow:hidden;white-space:nowrap;width:var(--datalist-label-width);--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.datalist-item-content{align-items:center;display:flex;flex:1 1 0%;gap:.5rem}.scrollbar,:root{--scrollbar-size:10px;--scrollbar-opacity:.6;--scrollbar-bg:rgba(var(--color-inverse-rgb),.15);--scrollbar-inset:inset 0 0 0 1px rgba(var(--color-inverse-rgb),.05);--scrollbar-bar-bg:rgba(var(--color-inverse-rgb),.3);--scrollbar-hover-bg:rgba(var(--color-inverse-rgb),.4);--scrollbar-drag-bg:rgba(var(--color-inverse-rgb),.5);--scrollbar-radius:var(--radius-sm);--scrollbar-duration:.7s}.scrollbar{background:var(--scrollbar-bg);box-shadow:var(--scrollbar-shadow);opacity:var(--scrollbar-opacity);position:absolute;transition-duration:.15s;transition-duration:var(--scrollbar-duration);transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.scrollbar-hover .scrollbar{opacity:0}.scrollbar-hover:hover .scrollbar{opacity:var(--scrollbar-opacity)}.scrollbar.is-dragging,.scrollbar:hover{opacity:1!important}.scrollbar-bar{background:var(--scrollbar-bar-bg);border-radius:var(--scrollbar-radius);position:absolute}.scrollbar-bar:hover{background:var(--scrollbar-hover-bg)}.is-dragging>.scrollbar-bar{background:var(--scrollbar-drag-bg)}.is-horz>.scrollbar-bar{height:100%;z-index:20}.is-vert>.scrollbar-bar{width:100%;z-index:20}.doc-app{--doc-view-max-width:800px;--doc-view-padding:24px;--doc-view-side-width:240px;--affine-editor-side-padding:0}.doc-app{align-items:stretch;display:flex;flex-direction:column;min-height:120px}.doc-space-picker-menu .menu-item>.item-inner{padding-right:.25rem}.doc-app-search .form-control{border-radius:var(--radius-full)}.doc-app-search .input-control-prefix{cursor:pointer;opacity:.75}.doc-app-search.empty:not(.focus){transition-duration:.15s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}.doc-app-search.empty:not(.focus) .form-control{padding-left:.5rem;padding-right:.5rem;--tw-ring-color:transparent}.doc-app-search.empty:not(.focus) .form-control::-moz-placeholder{opacity:0}.doc-app-search.empty:not(.focus) .form-control::placeholder{opacity:0}.doc-app-search.empty:not(.focus) .form-control:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.doc-app-search:not(.empty) .form-control{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-300-rgb),var(--tw-ring-opacity))}.doc-app-header .divider{height:1rem!important;margin-left:.25rem!important;margin-right:.25rem!important}.doc-app .is-match-keys{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-100-rgb),var(--tw-bg-opacity));font-weight:700;text-decoration-line:underline;text-underline-offset:2px}.doc-main .dtable-footer{border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}.doc-main.show-view>.doc-list{pointer-events:none;visibility:hidden;z-index:-10}.has-doc-app-fullscreen .doc-app-header,.has-doc-app-fullscreen .doc-sidebar,.has-doc-app-fullscreen>#header{display:none}.has-doc-app-fullscreen #mainContainer{max-width:none!important;padding:0!important;width:100%!important}.has-doc-app-fullscreen #docApp{height:calc(100vh - 12px)!important}.doc-tree .item-inner{cursor:pointer;padding-right:0;position:relative}.doc-tree .item-inner>.item-icon{flex:none;opacity:1}.doc-tree .item-inner .item-title{overflow:hidden;text-overflow:clip;white-space:nowrap}.doc-tree .item-inner.selected .item-title{font-weight:700}.doc-tree .item-inner>.toolbar{top:.25rem!important}.doc-tree .item-inner>.toolbar>.btn.with-popover-show,.doc-tree .list-heading-inner>.toolbar{opacity:1!important}.doc-tree .item-inner:hover>.toolbar{margin-top:0!important}.doc-tree .with-hover-actions>.item>.item-inner .item-actions{right:0}.doc-sidebar .sortable-ghost{border-radius:var(--radius-sm);z-index:10;--tw-bg-opacity:1;background-color:rgba(var(--color-warning-100-rgb),var(--tw-bg-opacity));opacity:.3;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-warning-600-rgb),var(--tw-ring-opacity))}.doc-list-item-title{overflow:hidden;text-overflow:clip}.doc-view{scroll-padding-top:16px;scrollbar-gutter:stable both-edges}.doc-view-content{max-width:var(--doc-view-max-width);padding:var(--doc-view-padding)}.doc-files .item-content{flex:none}.doc-files .file-list-item{border-radius:var(--radius-lg);transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.doc-files .file-list-item:hover{background-color:rgba(var(--color-inverse-rgb),.05)}.doc-files .file-list-item .item-actions,.doc-files .file-list-item:hover .item-actions{margin-left:1rem;margin-top:0;position:relative}.doc-files .file-list-item .item-actions .btn{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}.doc-editor .affine-page-viewport{overflow:visible!important}.doc-editor .affine-page-root-block-container{padding:0 0 2rem!important}.doc-editor-keywords,.doc-editor-title{flex:none}.doc-editor-keywords:hover .form-control{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.doc-editor-keywords .form-control:focus{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.doc-editor-control{z-index:2}.doc-view-sidebar{display:flex;flex-direction:column;max-height:calc(100% - 24px);overflow:visible;width:var(--doc-view-side-width)}.doc-view-sidebar-nav{--nav-item-padding:6px;--nav-item-color:var(--color-gray-500);--nav-active-bg:var(--color-primary-100);--nav-active-color:var(--color-fore);--nav-item-height:26px;--nav-divider-margin:8px;background-color:rgba(var(--color-surface-rgb),.2)}.doc-view-sidebar .datalist{--datalist-label-width:56px}.is-closed.doc-view-sidebar .doc-view-sidebar-content,.is-sidebar-closed .doc-view-sidebar-content{display:none}.is-closed.doc-view-sidebar,.is-sidebar-closed .doc-view-sidebar{--doc-view-side-width:0;opacity:0;transition-delay:1s;transition-duration:1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.doc-view:hover .doc-view-sidebar{opacity:1;transition-delay:0s}.is-closed>.doc-view-sidebar-container,.is-sidebar-closed .doc-view-sidebar-container{position:absolute;right:0;top:0}.doc-view-sidebar-container{background-color:rgba(var(--color-canvas-rgb),.8);min-height:0;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.doc-outline .tree-toggle.is-empty:before{border-radius:var(--radius-full);height:.25rem;position:absolute;width:.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-300-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}.doc-outline .is-nested-root.no-nested-items{padding-left:.375rem}.doc-path-picker .picker-deselect-btn{display:none}.doc-path-picker-angle{margin-left:-.125rem;margin-right:-.125rem}.doc-path-picker,.doc-space-picker{outline:2px solid transparent!important;outline-offset:2px!important;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.dropmenu-btn{gap:.25rem;padding-left:.5rem;padding-right:.5rem}.dropmenu-btn>.text{max-width:180px;overflow:hidden}.dropmenu-btn>.is-leading{left:-.625rem;opacity:.6;position:absolute}.dropmenu-btn>.is-caret{align-items:center;background-color:rgba(var(--color-canvas-rgb),.2);border-radius:var(--radius);display:flex;height:1rem;justify-content:center;width:1rem}.dropmenu-nav{border-bottom-width:1px;margin-left:.75rem;margin-right:.75rem;margin-top:.25rem}.has-search .dropmenu-nav{margin-top:-.5rem}.dropmenu-nav>.nav-secondary{gap:.5rem}.dropmenu-nav>.nav-secondary>.nav-item>a{border-radius:var(--radius);padding-left:.5rem;padding-right:.5rem}.dropmenu-nav>.nav-secondary>.nav-item>a:after{bottom:-1px;left:1rem;opacity:0;right:1rem}.dropmenu-nav>.nav-secondary>.nav-item>.active:after{left:.5rem;opacity:1;right:.5rem;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dropmenu-title{font-size:.75rem;font-weight:700;line-height:1rem;margin-bottom:-.5rem;padding:.75rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.dropmenu-list{min-height:0;overflow-x:hidden;overflow-y:auto;padding:.5rem .75rem}.dropmenu.loading>*{opacity:0}.dropmenu-item .tree-item-inner{border-radius:var(--radius);cursor:pointer;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dropmenu-item.is-item.active>.tree-item-inner{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.tree-item-inner.is-link:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.tree-item-inner.is-link:hover .item-content,.tree-item-inner.is-link:hover .item-trailing-icon,.tree-item-inner.is-link:hover .label{color:inherit}.tree-item-inner.is-toggle:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.dropmenu-item+.tree-item{margin-top:.125rem}.dropmenu-item .is-match{font-weight:700;text-decoration-line:underline}.dropmenu-item .item-title,.dropmenu-item .label{overflow:hidden;white-space:nowrap}.dropmenu-item .item-content{padding-left:.375rem;padding-right:.375rem}.dropmenu-item *+.item-content{padding-left:0}.tree-item-inner.is-toggle .item-title{opacity:.6}.tree-item-inner.is-toggle:hover .item-title{opacity:1}.dropmenu-item-check{align-items:center;display:flex;flex:1 1 auto;justify-content:flex-end;padding-right:.5rem}.dropmenu-item .nested-toggle-icon.is-empty{width:.25rem}.dropmenu-item .item-icon{margin-right:-.25rem}:root{--affine-text-secondary-color:var(--color-secondary-500)}.blocksuite-portal{position:absolute!important}.embed-card-modal-mask{z-index:12!important}.embed-card-modal-wrapper{z-index:13!important}.card-list{--list-gap:.625rem;--list-count-per-row:1}.card-list,.card-list-item{padding:calc(var(--list-gap)/2)}.card-list-item{width:calc(100%/var(--list-count-per-row))}.card-grid{display:flex;flex-wrap:wrap}.card-grid .card{height:100%}:root{--form-control-border:var(--color-border-strong)}.checkbox-primary.disabled,.checkbox-primary.disabled>label,.checkbox-primary>input[type=checkbox]:disabled,.checkbox-primary>input[type=checkbox]:disabled+label,.radio-primary.disabled,.radio-primary.disabled>label,.radio-primary>input[type=radio],.radio-primary>input[type=radio]:disabled+label{filter:none!important}.checkbox-primary.disabled>label,.radio-primary.disabled>label{opacity:1}.checkbox-primary.disabled>label:before,.radio-primary.disabled>label:before{background-color:rgba(var(--color-inverse-rgb),.05);opacity:.5}.form-actions{gap:1rem;justify-content:center}.form-actions .btn{min-width:96px}.form-control-static{min-height:32px;padding-bottom:.375rem;padding-top:.375rem}:root{--zt-panel-form-max-width:1000px}.size-sm{--zt-panel-form-max-width:800px}.size-lg{--zt-panel-form-max-width:1200px}.panel-body>.container,.panel-heading>.container{max-width:var(--panel-container-width);min-width:0;padding-left:var(--panel-container-padding);padding-right:var(--panel-container-padding)}.panel-heading>.container{align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;gap:1rem;justify-content:space-between;min-height:48px}.panel-form{border-radius:var(--radius-md);margin-bottom:1rem;margin-left:auto;margin-right:auto;max-width:var(--zt-panel-form-max-width);min-width:var(--zt-panel-form-min-width);overflow:visible;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-bottom:1rem;padding-left:1rem;padding-right:1rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.panel-form .form-actions{background-color:rgba(var(--color-canvas-rgb),.8);bottom:0;padding-bottom:1rem;padding-top:1rem;position:sticky;z-index:3;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.panel-form .form-grid{margin-left:calc(0px - var(--form-grid-gap-y-half));margin-right:calc(0px - var(--form-grid-gap-y-half));padding-bottom:0}.panel-form-toolbar{padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half);width:100%}.panel-form-toolbar>.toolbar{gap:1rem;padding-bottom:.75rem;padding-top:.75rem}.panel-form-divider{margin-bottom:.75rem;margin-top:1rem;padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half);width:100%}.panel-form-divider:before{background-color:rgba(var(--color-border-rgb),.7);display:block;height:1px;--tw-content:"";content:var(--tw-content)}.is-full .btn-full-form,.is-lite .btn-lite-form{z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-300-rgb),var(--tw-ring-opacity))}.btn-toggle-fold:after{content:attr(data-expand-text)}.show-fold-items .btn-toggle-fold:after{content:attr(data-collapse-text)}.is-foldable,.is-full .full\:hidden,.is-full .lite\:visible,.is-full .panel-form-divider,.is-full .panel-form-toolbar,.is-lite .full\:visible,.is-lite .lite\:hidden,.no-foldable-items .btn-toggle-fold{display:none}.is-foldable.is-pinned,.is-full .full\:visible,.is-full .is-foldable,.is-full .lite\:hidden,.is-lite .full\:hidden,.is-lite .lite\:visible,.show-fold-items .is-foldable{display:block}.is-full .full\:w-1\/2,.is-lite .lite\:w-1\/2{width:50%}.is-full .full\:w-1\/3,.is-lite .lite\:w-1\/3{width:33.333333%}.is-full .full\:w-2\/3,.is-lite .lite\:w-2\/3{width:66.666667%}.is-full .full\:w-1\/4,.is-lite .lite\:w-1\/4{width:25%}.is-full .full\:w-2\/4,.is-lite .lite\:w-2\/4{width:50%}.is-full .full\:w-3\/4,.is-lite .lite\:w-3\/4{width:75%}.is-full .full\:w-1\/5,.is-lite .lite\:w-1\/5{width:20%}.is-full .full\:w-2\/5,.is-lite .lite\:w-2\/5{width:40%}.is-full .full\:w-3\/5,.is-lite .lite\:w-3\/5{width:60%}.is-full .full\:w-4\/5,.is-lite .lite\:w-4\/5{width:80%}.is-full .full\:w-1\/6,.is-lite .lite\:w-1\/6{width:16.666667%}.is-full .full\:w-2\/6,.is-lite .lite\:w-2\/6{width:33.333333%}.is-full .full\:w-3\/6,.is-lite .lite\:w-3\/6{width:50%}.is-full .full\:w-4\/6,.is-lite .lite\:w-4\/6{width:66.666667%}.is-full .full\:w-5\/6,.is-lite .lite\:w-5\/6{width:83.333333%}.is-full .full\:w-full,.is-lite .lite\:w-full{width:100%}.page-form{--panel-container-width:960px;--panel-container-padding:20px;--zt-panel-form-max-width:1200px;--zt-panel-form-min-width:1040px;padding-left:0;padding-right:0;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.page-form .panel-heading{border-bottom-width:1px;--tw-border-opacity:0.7;padding:0}.page-form .panel-title{font-size:1rem;line-height:1.5rem}@media (max-width:1240px){.page-form{--zt-panel-form-max-width:1100px}}@media (max-width:1110px){.page-form{--zt-panel-form-max-width:1040px}}.modal-body>.page-form{margin:-1.5rem -2rem!important;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-body>.page-form>.panel-heading{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);position:sticky;top:-1.25rem;z-index:2;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-bottom:.375rem;padding-top:.375rem}.modal-body>.panel-form .form-actions{bottom:-1.5rem!important;padding-bottom:1.5rem;padding-top:1.5rem}.dropdown.popover{display:flex;flex-direction:column;position:absolute;z-index:1200}.dropdown.show{display:flex}.dropdown-menu{display:none;--menu-min-width:7rem;--menu-max-width:20rem}.dropdown-menu.show,.menu-wrapper>.dropdown-menu,.show>.dropdown-menu{display:block}.dropdown>.dropdown-menu,.menu-wrapper .dropdown-menu{position:relative}.popup .popup.search-menu{background-color:var(--menu-bg)}.show>.menu-wrapper{display:flex}.dropdown>.menu-wrapper{height:100%}.dropdown>.menu-wrapper .menu-wrapper{position:absolute}.dropdown>.menu-wrapper.is-tree .menu-wrapper{position:relative}.is-contextmenu .is-nested-show>a:not(:hover){--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity))}.is-contextmenu .menu-item.is-nested>.item-inner>.nested-toggle-icon{position:absolute;right:.25rem;top:.375rem}.is-contextmenu .menu-nested .menu-item>.item-inner{padding-left:.5rem;padding-right:1.25rem}.is-contextmenu .menu-nested .menu-item>.item-inner>.item-content{overflow:hidden}.dropdown>.arrow{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.global-search-panel li:not(.order-first):hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.global-search-panel li a{width:100%}.global-search-panel li{cursor:pointer}.history-panel>.panel-heading+.panel-body{margin-top:-.75rem}.history-panel-action{position:relative}.history-panel-action:before{border-left-width:1px;bottom:-.375rem;left:.5rem;position:absolute;top:22px;--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-content:"";content:var(--tw-content)}.col-reverse>.history-panel-action:first-child:before,.col>.history-panel-action:last-child:before{display:none}.history-panel-action>.item-inner{padding-left:1.5rem}.history-panel-action>.item-inner>.avatar{left:0;position:absolute;top:.375rem}.img-cutter{background:var(--color-gray-100);border:1px solid #ddd;margin-bottom:20px;padding:10px}.img-cutter .canvas{margin:0 auto;max-width:100%;min-width:50px;position:relative}.img-cutter .cover{bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.img-cutter .controller{background:none;border:1px dashed hsla(0,0%,100%,.7);cursor:move;position:absolute;z-index:5}.img-cutter .control{background:#000;background:rgba(0,0,0,.6);border:1px solid hsla(0,0%,100%,.6);height:6px;position:absolute;width:6px}.img-cutter .control[data-type=left]{cursor:w-resize;left:-4px;margin-top:-3px;top:50%}.img-cutter .control[data-type=top]{cursor:n-resize;left:50%;margin-left:-3px;top:-4px}.img-cutter .control[data-type=right]{cursor:e-resize;margin-top:-3px;right:-4px;top:50%}.img-cutter .control[data-type=bottom]{bottom:-4px;cursor:s-resize;left:50%;margin-left:-3px}.img-cutter .control[data-type=top-left]{cursor:nw-resize;left:-4px;top:-4px}.img-cutter .control[data-type=top-right]{cursor:ne-resize;right:-4px;top:-4px}.img-cutter .control[data-type=bottom-left]{bottom:-4px;cursor:sw-resize;left:-4px}.img-cutter .control[data-type=bottom-right]{bottom:-4px;cursor:se-resize;right:-4px}.img-cutter .cliper{bottom:0;left:0;position:absolute;right:0;top:0;z-index:2}.messager-lite{border-radius:var(--radius-lg);min-width:160px;--tw-bg-opacity:1!important;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))!important;padding:1rem 1.5rem;--tw-text-opacity:1!important;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))!important;--skin-ring:transparent!important;--skin-text:inherit!important;--skin-color:var(--color-gray-500)}.messager-lite .alert-icon{color:var(--skin-color);font-size:1.5rem;line-height:2rem}.messager-lite .alert-text{font-size:.875rem;font-weight:700;line-height:1.3rem}.messager-lite .toolbar{gap:.5rem;margin-left:2rem}.messager-lite .alert-content+.alert-close{margin-left:1.5rem}.messager-lite .toolbar .btn.ghost{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.modal-reconfirm .modal-body{font-size:14px;font-weight:700;padding:24px 32px}.modal-reconfirm .modal-footer{justify-content:center;padding:24px}.picker-deselect-btn{opacity:.6;transition-duration:.15s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.picker-multi-selection{cursor:pointer;padding-right:.5rem;position:relative}.picker-multi-selection .picker-deselect-btn{bottom:0;left:0;position:absolute;right:0;top:0;--tw-scale-x:0;--tw-scale-y:0;background-color:rgba(var(--color-surface-rgb),.8);opacity:0}.picker-deselect-btn:hover,.picker-multi-selection .picker-deselect-btn,.picker-multi-selection:hover .picker-deselect-btn{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.picker-deselect-btn:hover,.picker-multi-selection:hover .picker-deselect-btn{--tw-scale-x:1;--tw-scale-y:1;opacity:1;--state-color:rgba(var(--color-surface-rgb),.9)}.pick-pri{flex-direction:row;justify-content:flex-start;position:relative}.pick-pri,.pick-pri>.text{align-items:center;display:flex}.pick-pri>.text{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap}.pick-pri .placeholder{--tw-text-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-text-opacity))}.pick-pri-list>.btn{justify-content:flex-start}.disabled.pick-pri,.disabled.pick-pri>*{filter:none}.search-form{--gutter-width:12px;padding-bottom:.5rem}.search-form-container{border-radius:var(--radius);min-height:116px;position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.is-simple .search-form-container{min-height:56px}.search-form-field td{padding:.375rem}.search-form-field td.is-andOr,.search-form-field td.is-operator{width:5rem}.search-form-field td.is-condition{width:7rem}.search-form-field td.is-operator{width:5rem}[lang=en] .search-form-field td.is-operator{width:6rem}.search-form .sidebar-right.is-collapsed{margin-right:-.375rem}.is-simple .search-form-wrapper{display:flex}.is-simple .search-form-wrapper>.row{flex:1 1 auto}.is-simple .search-form-wrapper>.toolbar{flex:none;margin-top:0}.zinbar [data-hint]{position:relative}.zinbar [data-hint]:after{background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity));border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg);bottom:100%;display:block;pointer-events:none;position:absolute;right:0;white-space:nowrap;z-index:50;--tw-bg-opacity:0.9;font-size:.75rem;line-height:1rem;padding:.125rem .25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:attr(data-hint);content:var(--tw-content)}.zinbar [data-hint]:hover:after{opacity:1}.zin-perf-btn-list .text-danger{color:var(--color-danger-400)}.zinbar .state{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.zinbar .state:active{--tw-scale-x:1.05;--tw-scale-y:1.05}.zinbar .state:active,.zinbar.collapse{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.zinbar.collapse{--tw-translate-x:100%}.zinbar.collapse>div{pointer-events:none}.zinbar{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.7s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}body[z-perf=danger]:before,body[z-perf=warning]:before{bottom:0;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:9990;--tw-border-opacity:1;border-color:rgba(var(--color-warning-600-rgb),var(--tw-border-opacity));font-size:.75rem;line-height:1rem;--tw-content:"";border-style:inset;border-width:12px 8px 8px;content:var(--tw-content)}body[z-perf=danger]:before{--tw-border-opacity:1;border-color:rgba(var(--color-danger-600-rgb),var(--tw-border-opacity))}body[z-perf=danger]:after,body[z-perf=warning]:after{font-size:.75rem;font-weight:700;left:0;line-height:1rem;line-height:1;pointer-events:none;position:fixed;right:0;text-align:center;top:0;z-index:9991;--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity));--tw-content:attr(z-perf-message);content:var(--tw-content)}.card{border-radius:var(--radius);min-height:28px;position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;transition-duration:.15s;transition-property:box-shadow,border,color,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.card:hover{--tw-shadow:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--tw-shadow-colored:0 2px 6px -1px var(--tw-shadow-color),0 1px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.card-content,.card-footer,.card-header,.card-heading{padding:.25rem .5rem}.card-heading{align-items:center;display:flex;gap:.5rem}.card-icon{opacity:.5}.card-header{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.card-content{display:flex;flex-direction:column;gap:.25rem}.card-actions{position:absolute;right:.125rem;top:.125rem}.card-actions+.card-heading{padding-right:1.75rem}.card-subtitle{font-size:.75rem;line-height:1rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.card.selected{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-400-rgb),var(--tw-ring-opacity))}.card-list{--list-gap:.625rem;--list-count-per-row:1}.card-list,.card-list-item{padding:calc(var(--list-gap)/2)}.card-list-item{width:calc(100%/var(--list-count-per-row))}.card-grid{display:flex;flex-wrap:wrap}.card-grid .card{height:100%}.contextmenu{display:none}.contextmenu.show{display:block}.contextmenu .popup .popup,.contextmenu.popup{position:absolute}.more,.more-vert{margin:.5rem;position:relative}.more,.more-vert,.more-vert:after,.more-vert:before,.more:after,.more:before{background-color:currentColor;border-radius:var(--radius-full);height:.125rem;width:.125rem}.more-vert:after,.more-vert:before,.more:after,.more:before{display:block;left:-5px;position:absolute;top:0;--tw-content:"";content:var(--tw-content)}.more-vert:after,.more:after{left:5px}.more-vert{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dashboard-blocks{position:relative}.dashboard-block-cell{position:absolute;transition-duration:.15s;transition-property:left,top;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-block{border-radius:var(--radius);bottom:.5rem;left:.5rem;position:absolute;right:.5rem;top:.5rem;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-block.is-dragging{opacity:0;z-index:1600}.dashboard-block-header{align-items:center;border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);display:flex;flex-direction:row;justify-content:space-between;left:0;padding:.75rem;pointer-events:none;position:absolute;right:0;top:0;z-index:10}.dashboard-block-header>*{pointer-events:auto}.dashboard-block-title{font-size:.875rem;font-weight:700;line-height:1.3rem}.dashboard-block-body{bottom:0;left:0;position:absolute;right:0;top:0}.dashboard-block-body>.panel{display:flex;flex-direction:column;height:100%;width:100%;--tw-shadow:0px 6px 16px rgba(202,215,235,.25)}.dashboard-block-body .panel-heading{cursor:move;flex:none}.dashboard-block-body .panel-body{flex:1 1 auto;overflow-y:auto}.has-more-menu>.dashboard-block-body .panel-heading{padding-right:3rem}.dashboard-block-body .panel-title{font-size:.875rem;height:2rem;line-height:1.3rem}.dashboard-block-actions .btn{opacity:.6}.dashboard-block-actions .btn:hover{opacity:1}.dashboard-drop-shadow{position:absolute;transition-duration:.15s;transition-property:left,top;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-drop-shadow:before{background-color:rgba(var(--color-inverse-rgb),.05);border-radius:var(--radius);bottom:.5rem;left:.5rem;position:absolute;right:.5rem;top:.5rem;--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-content:"";content:var(--tw-content)}:root{--dtable-checked-bg:var(--color-warning-50);--dtable-checked-bg-hover:var(--color-warning-100);--dtable-checked-border:var(--color-border-strong)}.dtable-cell.is-checked,.dtable-striped .dtable-cell.is-odd-row.is-checked{background-color:var(--dtable-checked-bg)}.checkbox-primary.dtable-checkbox{margin-right:-.375rem}.dtable-checkbox{order:-5}.dtable-hover-col .dtable-cell.is-hover-col.is-checked,.dtable-hover-row .dtable-cell.is-hover-row.is-checked{background-color:var(--dtable-checked-bg-hover)}.dtable-cell.is-checked{--dtable-border-color:var(--dtable-checked-border)}.dtable-check-info{flex-shrink:1;margin-right:.5rem;overflow:hidden;white-space:nowrap}:root{--toggle-icon-size:calc(var(--font-size-root)*3/4 + 1px)}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-color:currentColor;border-width:1px;display:block;opacity:.5;position:relative}.toggle-icon-collapse:hover,.toggle-icon-expand:hover,.toggle-icon:hover{opacity:.9}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-radius:inherit;height:var(--toggle-icon-size);width:var(--toggle-icon-size)}.is-collapsed .toggle-icon:after,.is-collapsed .toggle-icon:before,.is-expanded .toggle-icon:before,.toggle-icon-collapse:after,.toggle-icon-collapse:before,.toggle-icon-expand:before{background-color:currentColor;content:" ";display:block;height:1px;left:2px;position:absolute;right:2px;top:calc((var(--toggle-icon-size) - 3px)/2)}.is-collapsed .toggle-icon:after,.toggle-icon-collapse:after{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:root{--dtable-nt-size:calc(var(--font-size-root)*3/4 + 1px)}.dtable-nested-indent{flex:none;margin-right:-.25rem;order:-100}.dtable-nested-toggle{align-items:center;border-radius:var(--radius-sm);display:flex;flex:none;height:1.25rem;justify-content:center;margin-left:-.25rem;order:-6;width:1.25rem}.dtable-nested-toggle.is-no-child{margin-right:-.25rem;opacity:0;pointer-events:none}.dtable-child-label{order:-5}.dtable-header-group{align-items:center;background:var(--dtable-header-bg);cursor:default;display:flex;justify-content:center;left:0;position:absolute;top:1px;z-index:30}.dtable-bordered .dtable-header-group{border-bottom:1px solid var(--dtable-border-color);border-left:1px solid var(--dtable-border-color)}.dtable-header-as-group{contain:style;content-visibility:visible;overflow:visible!important}.dtable-sorting{cursor:move}.dtable-cell.is-sorting-from{background-color:var(--dtable-bg);z-index:20}.dtable-cell.is-sorting-from:before{border-top-width:1px}.dtable-sorting .dtable-cell.is-sorting-after{--tw-translate-y:-100%}.dtable-sorting .dtable-cell.is-sorting-after,.dtable-sorting .dtable-cell.is-sorting-before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dtable-sorting .dtable-cell.is-sorting-before{--tw-translate-y:100%}.dtable-cell.is-sorting-before:before,.dtable-cell.is-sorting-from:before{border-bottom-width:1px;border-top-width:1px}.dtable{--dtable-bg:var(--color-canvas);--dtable-striped-bg:var(--color-gray-50);--dtable-hover-bg:rgba(var(--color-primary-500-rgb),.05);--dtable-header-bg:var(--color-surface);--dtable-footer-bg:var(--color-surface);--dtable-border-color:var(--color-border);--dtable-sorter-size:0.3125rem}.dtable{position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.dtable.no-animation *{transition-property:none!important}.dtable-block{overflow:hidden;position:absolute;width:100%}.dtable-header{background-color:var(--dtable-header-bg);border-top-left-radius:inherit;border-top-right-radius:inherit}.dtable-body{overflow:hidden}.dtable-cells{background-color:var(--dtable-bg);height:100%;position:absolute;z-index:0}.dtable-cells-container{height:100%;position:absolute;width:100%}.dtable-header .dtable-cells{background-color:var(--dtable-header-bg)}.dtable-cells.dtable-fixed-left,.dtable-cells.dtable-fixed-right{z-index:10}.dtable-cell{position:absolute;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-cell:after,.dtable-cell:before{bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:-1px;z-index:2}.dtable-cell:before{border-bottom-width:1px;border-color:var(--dtable-border-color);opacity:1}.dtable-header-cell{align-items:center;display:flex;font-weight:700}.dtable-header-cell:after,.dtable-header-cell:before{top:0}.dtable-cell-content{align-items:center;display:flex;gap:.25rem;height:100%;overflow:hidden;padding-left:.75rem;padding-right:.75rem;position:relative;white-space:nowrap;width:100%;z-index:5}.dtable-body .dtable-cell.is-last-row:before{border-bottom-width:0}.dtable-footer{align-items:center;background-color:var(--dtable-footer-bg);border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-color:var(--dtable-border-color);border-top-width:1px;display:flex;padding-left:.75rem;padding-right:.75rem;position:absolute;width:100%;z-index:10}.dtable-empty-tip{align-items:center;display:flex;height:100%;justify-content:center}.dtable .scrollbar{z-index:20}.dtable-header{transition-duration:1s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-scrolled-down .dtable-header{border-bottom-color:rgba(var(--color-inverse-rgb),.15);border-bottom-width:1px}.dtable-has-scroll-y:not(.dtable-scrolled-bottom) .dtable-footer{border-top-color:rgba(var(--color-inverse-rgb),.15);border-top-width:1px}.dtable-scroll-shadow{background-image:linear-gradient(90deg,rgba(0,0,0,.03),transparent),linear-gradient(90deg,rgba(0,0,0,.03),transparent 50%);opacity:0;pointer-events:none;position:absolute;top:0;transition-duration:1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:8px;z-index:20}.dtable:hover .dtable-scroll-shadow{opacity:1}.dtable-scroll-shadow.is-right{margin-left:-7px;--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dtable-scroll-shadow.is-left,.dtable-scrolled-end .dtable-scroll-shadow.is-right{visibility:hidden}.dtable-scroll-shadow.is-right,.dtable-scrolled-right .dtable-scroll-shadow.is-left{visibility:visible}.scrollbar-hover:hover .scrollbar{opacity:0}.scrollbar-hover .dtable-body:hover~.scrollbar{opacity:var(--scrollbar-opacity)}.dtable-sort{display:inline-flex;height:calc(var(--dtable-sorter-size)*12/5);margin-left:.25rem;opacity:.8;position:relative}.dtable-cell:hover .dtable-sort{opacity:1}.dtable-sort:after,.dtable-sort:before{border-color:transparent;border-style:solid;height:0;left:0;opacity:.4;position:absolute;width:0;--tw-content:"";border-width:var(--dtable-sorter-size);content:var(--tw-content)}.dtable-sort:before{border-bottom-color:currentColor;border-top-width:0;top:0}.dtable-sort:after{border-bottom-width:0;border-top-color:currentColor;bottom:0}.dtable-sort.dtable-sort-asc:before,.dtable-sort.dtable-sort-desc:after{opacity:.9}.dtable-sort-link{align-items:center;cursor:pointer;display:inline-flex}.dtable-cells.dtable-fixed-left:before,.dtable-cells.dtable-fixed-right:before{border-color:var(--dtable-border-color);content:"";height:100%;pointer-events:none;position:absolute;width:100%;z-index:5}.dtable-cells.dtable-fixed-left:before{border-right-width:1px;right:-1px}.dtable-cells.dtable-fixed-right:before{border-left-width:1px;left:0}.dtable-bordered:before{border-color:var(--dtable-border-color);border-radius:inherit;border-width:1px;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:15}.dtable-bordered .dtable-cell:before{border-width:1px;right:-1px}.dtable-cell.has-border-left:before{border-left-width:1px}.dtable-cell.has-border-right:before{border-right-width:1px;right:-1px}.dtable-striped .dtable-cell.is-odd-row{background-color:var(--dtable-striped-bg)}.dtable-hover-cell .dtable-cell:hover:after,.dtable-hover-col .dtable-cell.is-hover-col:before,.dtable-hover-row .dtable-body .dtable-cell.is-hover-row:before{background-color:var(--dtable-hover-bg)}.kanban{--kanban-lane-name-width:20px;--kanban-col-width:280px;--kanban-cols-gap:8px;--kanban-lanes-gap:8px;--kanban-header-height:32px;--kanban-lane-height:auto;--kanban-lane-color:var(--color-primary-500);--kanban-link-color:var(--color-secondary-600)}.kanban{align-items:flex-start;display:flex;flex-direction:column;min-width:-moz-fit-content;min-width:fit-content;position:relative}.kanban-header{display:flex;flex-direction:row;height:var(--kanban-header-height)}.kanban.has-sub-cols .kanban-header{height:calc(var(--kanban-header-height)*2)}.kanban-header-lane-name{background-color:rgba(var(--color-fore-rgb),.05);flex:none;width:var(--kanban-lane-name-width)}.kanban-header-cols,.kanban-header-sub-cols{display:flex;flex:1 1 0%;flex-direction:row;gap:var(--kanban-cols-gap)}.kanban-header-sub-cols{border-top-width:2px;--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity))}.kanban-header-col{align-items:center;border-bottom-width:1px;display:flex;flex:1 1 0%;flex-direction:column;height:100%;width:var(--kanban-col-width)}.kanban-header-col.has-subs{width:auto}.kanban-header-col-wrapper{align-items:center;display:flex;flex:1 1 0%;flex-direction:row;position:relative;width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:3.5rem;padding-right:3.5rem}.kanban-header-col-wrapper.is-align-left{justify-content:flex-start;padding-left:.5rem}.kanban-header-col-wrapper.is-align-left>.kanban-header-title{justify-content:flex-start}.kanban-header-title{align-items:center;display:flex;flex:1 1 auto;flex-direction:row;justify-content:center;overflow:hidden}.kanban-header-title>.as-title{color:var(--kanban-col-color);font-weight:700;overflow:hidden;white-space:nowrap}.kanban-header-col-actions{bottom:.25rem;position:absolute;right:.25rem;top:.25rem}.kanban-header-col-actions>.btn{opacity:.6}.kanban-header-col-actions>.btn:hover{opacity:1}.kanban-body{display:flex;flex-direction:column;gap:var(--kanban-lanes-gap)}.kanban-lane{display:flex;flex-direction:row;height:var(--kanban-lane-height);min-height:96px}.kanban-lane-name{align-items:center;background-color:var(--kanban-lane-color);display:flex;justify-content:center;width:var(--kanban-lane-name-width);--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity));writing-mode:vertical-rl}.kanban-lane-actions,.kanban-lane-name{flex:none;position:relative}.kanban-lane.is-first .kanban-lane-actions{margin-top:calc(4px - var(--kanban-header-height))}.has-sub-cols .kanban-lane.is-first .kanban-lane-actions{margin-top:calc(4px - var(--kanban-header-height)*2)}.kanban-lane-actions>.btn.square{width:var(--kanban-lane-name-width)}.kanban-lane-title{align-items:center;display:flex;flex:1 1 auto;justify-content:center;overflow:hidden;white-space:nowrap}.kanban-lane-cols{display:flex;flex-direction:row;gap:var(--kanban-cols-gap)}.kanban-lane-col{background-color:rgba(var(--color-inverse-rgb),.05);display:flex;flex-direction:column;height:100%;width:var(--kanban-col-width)}.kanban-header-col,.kanban-lane-col{margin-left:calc(var(--kanban-col-gap-left) - var(--kanban-cols-gap));margin-right:calc(var(--kanban-col-gap-right) - var(--kanban-cols-gap))}.kanban-col-content{position:relative;z-index:5}.kanban-lane.is-first>.kanban-lane-name:before{background-color:var(--kanban-lane-color);bottom:100%;display:block;height:var(--kanban-header-height);left:0;position:absolute;right:0;--tw-content:"";content:var(--tw-content)}.kanban.has-sub-cols .kanban-lane.is-first>.kanban-lane-name:before{height:calc(var(--kanban-header-height)*2)}.kanban-lane{margin-bottom:calc(var(--kanban-col-gap-bottom) - var(--kanban-lanes-gap));margin-top:calc(var(--kanban-col-gap-top) - var(--kanban-lanes-gap))}.kanban-items{flex:1 1 auto;overflow:auto;scrollbar-gutter:both-edges stable}.kanban-lane.is-auto-height .kanban-items{scrollbar-gutter:auto}.kanban-item{cursor:default}.kanban-item .card-actions{z-index:5}.kanban-heading{width:100%}.kanban-heading .listitem{height:2.25rem}.kanban-heading .item-title{font-weight:700}.kanban.has-dragging{cursor:move}.kanban-item.is-dragging{cursor:move;opacity:.1}.kanban-sticky .kanban-header{position:sticky;top:0;z-index:10;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.kanban-sticky .kanban-header.is-pinned{border-bottom-color:rgba(var(--color-inverse-rgb),.15);border-bottom-width:1px;z-index:20;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.kanban-sticky .kanban-lane-name{left:0;position:sticky;z-index:21}.kanban-region{border-radius:var(--radius);min-width:-moz-fit-content;min-width:fit-content;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding:.75rem;--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.kanban-region>.kanban+.kanban{margin-top:.75rem}.kanban-region.has-heading{padding-top:0}.kanban-heading>.listitem{left:.75rem;position:sticky;width:calc(var(--kanban-list-width) - 24px)}.kanban-list{display:flex;flex-direction:column;gap:.75rem;height:100vh;overflow:auto;position:relative;scrollbar-gutter:stable}.kanban-list.is-moving{cursor:grabbing}.kanban-items.is-dropping{position:relative}.kanban-item.is-dropping{position:relative;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.kanban-item.is-dropping:after,.kanban-items.is-dropping>.card-list:after{background-color:rgba(var(--color-warning-500-rgb),.5);border-radius:var(--radius-full);display:block;height:.25rem;--tw-content:"";content:var(--tw-content)}.kanban-item.is-dropping:after{left:.25rem;position:absolute;right:.25rem;top:-.25rem}.kanban-item.is-dropping[z-drop-side=before]{--tw-translate-y:0.25rem}.kanban-item.is-dropping[z-drop-side=after],.kanban-item.is-dropping[z-drop-side=before]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-item.is-dropping[z-drop-side=after]{--tw-translate-y:-0.25rem}.kanban-item.is-dropping[z-drop-side=after]:after{bottom:-.25rem;top:auto}.kanban-links{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:5}.kanban-list>.kanban-links{overflow:visible;z-index:11}.kanban-link{align-items:center;color:var(--kanban-link-color);display:flex;justify-content:center;position:absolute}.kanban-link>svg{position:absolute}.kanban-link-text{border-radius:var(--radius);height:1em;line-height:1;padding-left:.125rem;padding-right:.125rem;pointer-events:auto;position:relative;text-align:center;white-space:nowrap}.kanban-link-start-point{height:.5rem;width:.5rem;--tw-translate-x:-0.25rem;--tw-translate-y:-0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-start-point,.kanban-link-start-point:before{background-color:currentColor;border-radius:var(--radius-full);position:absolute}.kanban-link-start-point:before{bottom:-.25rem;display:block;left:-.25rem;opacity:.2;right:-.25rem;top:-.25rem;--tw-content:"";content:var(--tw-content)}.kanban-link path{pointer-events:auto}.kanban-link path+path{opacity:.6}.kanban-link.is-hover path+path{opacity:1;stroke-width:calc(var(--kanban-link-weight)*1.5)}.kanban-link-delete-btn{pointer-events:auto;--tw-scale-x:.75;--tw-scale-y:.75;opacity:0;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.is-hover .kanban-link-delete-btn,.kanban-link-delete-btn{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.is-hover .kanban-link-delete-btn{--tw-scale-x:1;--tw-scale-y:1;opacity:1}.is-adding-link{cursor:crosshair;-webkit-user-select:none;-moz-user-select:none;user-select:none}.kanban-link-editor{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:20}.kanban-link-editor-from,.kanban-link-editor-to{border-radius:var(--radius);--tw-shadow-color:rgb(var(--color-primary-500-rgb));--tw-shadow:var(--tw-shadow-colored);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-500-rgb),var(--tw-ring-opacity))}.kanban-link-editor-from,.kanban-link-editor-point,.kanban-link-editor-to{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);position:absolute}.kanban-link-editor-point{height:.5rem;pointer-events:auto;width:.5rem;--tw-translate-x:-0.25rem;--tw-translate-y:-0.25rem;border-radius:var(--radius-full);cursor:move;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));opacity:.5;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--color-primary-500-rgb),0.1);transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.kanban-link-editor-point.is-left{left:0;top:50%}.kanban-link-editor-point.is-right{right:0;top:50%;--tw-translate-x:0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-editor-point.is-top{left:50%;top:0}.kanban-link-editor-point.is-bottom{bottom:0;left:50%;--tw-translate-y:0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-editor-point:hover{opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-primary-500-rgb),0.5)}.tab-pane{display:none}.tab-pane.active{display:block}.has-sorting-col{cursor:move;--dtable-sorting-col-color:var(--color-primary-300);--dtable-hover-bg:transparent}.has-sorting-col .dtable-col-splitter{display:none}.dtable-cell.is-sorting-col-move{transition-duration:.15s;transition-property:left;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-cell.is-sorting-from-col{transition-duration:.1s}.dtable-cell.is-sorting-from-col:after{background-color:var(--dtable-sorting-col-color)!important;opacity:.1!important}.dtable-cell.is-sorting-from-col:before{border-left:1px solid var(--dtable-sorting-col-color);border-right:1px solid var(--dtable-sorting-col-color)}.dtable-header-cell.is-sortable-col{cursor:move}.has-sorting-col .scrollbar.is-horz{opacity:var(--scrollbar-opacity)!important}.has-sorting-col .dtable-scroll-shadow{visibility:visible}:root{--dtable-col-splitter-width:7px;--dtable-col-splitter-color:var(--color-primary-500)}.dtable-cell.has-col-resizing:after,.dtable-cell.has-col-splitter:hover:after{background:var(--dtable-col-splitter-color);opacity:.05}.dtable-col-splitter{background:var(--dtable-col-splitter-color);border-radius:var(--radius-full);bottom:0;cursor:ew-resize;opacity:0;position:absolute;right:calc(var(--dtable-col-splitter-width)/-2);top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--dtable-col-splitter-width);z-index:20}.dtable-cell.has-col-splitter:hover .dtable-col-splitter{opacity:.3}.dtable-cell.has-col-resizing .dtable-col-splitter,.dtable-cell.has-col-splitter .dtable-col-splitter:hover{opacity:.5}.dtable.has-col-resizing .dtable-cell.has-col-splitter:not(.has-col-resizing) .dtable-col-splitter,.dtable.has-col-resizing .dtable-cell.has-col-splitter:not(.has-col-resizing):after{opacity:0}.dtable-col-splitter:after,.dtable-col-splitter:before{content:" ";display:block;height:.5rem;left:50%;margin-top:-.25rem;position:absolute;top:50%;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity))}.dtable-col-splitter:before{margin-left:-1px}.dtable-col-splitter:after{margin-left:1px}.dtable.has-col-resizing{--dtable-hover-bg:transparent}.dtable.has-col-resizing,.has-col-resizing .dtable-header-cell{cursor:ew-resize!important}.dtable-cell.is-col-resizing:before{border-right:1px solid var(--dtable-col-splitter-color)}.dtable-cell.is-col-resizing:after{background:var(--dtable-col-splitter-color);opacity:.05}.has-col-resizing .scrollbar.is-horz{opacity:var(--scrollbar-opacity)!important}.dtable-cell.has-contextmenu-show:after{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));opacity:.1}.dtable{--dtable-header-bg:var(--color-surface-light);--dtable-footer-bg:var(--color-surface-light);--dtable-border-color:var(--color-border-light);--dtable-checked-border:var(--color-border);--dtable-checked-bg:var(--color-primary-50);--dtable-checked-bg-hover:var(--color-primary-100);--dtable-hover-bg:rgba(var(--color-gray-500-rgb),.05);--dtable-link-color:var(--color-link);--dtable-link-hover-color:var(--color-link-hover);--dtable-link-visited-color:var(--color-link-visited)}.dtable-cell-content[style*="--color-link"]{--dtable-link-hover-color:var(--color-link);--dtable-link-visited-color:var(--color-link)}.dtable-body .dtable-cell a{--dtable-link-color:var(--color-link)}.dtable-body .dtable-cell a:not(.btn){color:var(--dtable-link-color)}.dtable-body .dtable-cell a:not(.btn):visited{color:var(--dtable-link-visited-color)}.dtable-body .dtable-cell a:not(.btn):hover{color:var(--dtable-link-hover-color)}.dtable .btn-avatar{border-radius:var(--radius-full);gap:.25rem;height:1.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity));padding-left:0;padding-right:.5rem;--tw-ring-color:transparent}.dtable .btn-avatar:hover{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dtable-nested-toggle{width:1rem}.dtable .toggle-icon{--toggle-icon-size:11px;border-radius:var(--radius);--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.dtable .toggle-icon:after,.dtable .toggle-icon:before{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-700-rgb),var(--tw-bg-opacity))}.dtable-footer>.toolbar{margin-right:.5rem}.dtable-header .dtable-cell[data-sort]>.dtable-cell-content>a:not(:hover){color:inherit}.dtable-assign-btn{align-items:center;border-radius:var(--radius-full);display:flex;flex-direction:row;height:1.25rem;padding-left:.375rem;padding-right:.375rem;--dtable-link-color:var(--color-fore)}.dtable-assign-btn:not(:hover){color:inherit}.dtable-assign-btn.is-me{--dtable-link-color:var(--color-warning-500)!important}.dtable-assign-btn:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.dtable-assign-btn>span{border-radius:var(--radius-full);line-height:20px;padding-left:.375rem;padding-right:.375rem}.dtable-assign-btn.is-unassigned>span{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.dtable-assign-btn.is-unassigned:hover>span{background-color:inherit;color:inherit;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.dtable-assign-btn>.icon{opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-assign-btn:not(.disabled):hover>.icon{opacity:1}.dtable-header .dtable-cell[data-type=assign]{padding-left:1.5rem}.dtable-cell-icon{order:-5}.dtable-custom-cell[data-type=control]{align-items:center;display:flex;justify-content:center;padding-left:.125rem;padding-right:.125rem;z-index:1}.dtable-empty-tip{min-height:212px}.dtable-cell[data-type=actions] .btn>.icon{font-size:1rem;line-height:1.5rem}.menu.menu-dtable-actions.has-icons{align-items:center;display:flex;gap:.25rem;min-width:auto;--menu-icon-opacity:1}.menu.menu-dtable-actions.has-icons>.menu-item>a{padding-left:.25rem;padding-right:.25rem}.menu.menu-dtable-actions.has-icons>.menu-item>a>.icon-EMPTY,.menu.menu-dtable-actions.has-icons>.menu-item>a>.item-content{display:none}.menu.menu-dtable-actions.has-icons>.menu-item>a>.icon-EMPTY+.item-content,.menu.menu-dtable-actions.has-icons>.menu-item>a>.item-content:first-child{display:block}:root{--state-color:rgba(0,0,0,.03);--zt-page-bg:#f8f9fa;--zt-header-height:3rem;--zt-header-bg:var(--color-canvas);--zt-header-color:var(--color-fore);--zt-sidebar-width:160px;--zt-navbar-active-color:var(--color-primary-500)}body{background-color:var(--zt-page-bg)}.page-app{overflow:overlay}.container{min-width:1200px}#header{height:var(--zt-header-height);--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background:var(--zt-header-bg);border-bottom:1px solid var(--zt-header-border,rgba(var(--color-inverse-rgb),.05));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--zt-header-color)}#header>.container{height:100%;position:relative}#heading{align-items:center;bottom:0;display:flex;gap:.25rem;left:1rem;position:absolute;top:0}#heading>.toolbar{margin-left:-.75rem}#heading .dropmenu-btn>.text{max-width:142px}#heading>[data-zui-dropmenu]+div .dropmenu-btn>.text,#heading>[data-zui-dropmenu]+div+div .dropmenu-btn>.text{max-width:78px}#navbar{align-items:center;display:flex;font-size:.875rem;height:100%;justify-content:center;line-height:1.3rem;--state-color:rgba(var(--color-primary-500-rgb),.05);--state-active-opacity:1;--state-active-color:rgba(var(--color-primary-500-rgb),.08)}#navbar>.nav{--nav-active-color:var(--zt-navbar-active-color,var(--color-current));--nav-item-padding:12px;--nav-divider-margin:8px;margin-left:var(--nav-offset-left)}#navbar>.nav>.nav-item>a{height:3rem;padding-left:var(--nav-item-padding);padding-right:var(--nav-item-padding)}#navbar>.nav>.nav-item>a:before{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}#navbar>.nav>.nav-item>a.active:before{background:var(--state-active-color)!important;opacity:1!important}#navbar>.nav>.divider{align-self:center;height:1.25rem;margin-left:var(--nav-divider-margin);margin-right:var(--nav-divider-margin);opacity:.2}#navbar>.nav.compact{font-size:.8125rem;line-height:1.25rem}#navbar>.nav.compact-extra{font-size:.75rem;line-height:1rem}#toolbar{align-items:center;bottom:0;display:flex;gap:.25rem;position:absolute;right:1rem;top:0}#main{min-height:100vh}#header+#main{min-height:calc(100vh - 3rem)}#main>.container{padding-left:1rem;padding-right:1rem;position:relative}@media (min-width:1400px){#header>.container,#main>.container,#mainNavbar>.container{padding-left:2.5rem;padding-right:2.5rem}#heading{left:2.5rem}#toolbar{right:2.5rem}}#mainNavbar{height:2.75rem;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}#mainNavbar>.container{position:relative}#mainNavbar .nav{bottom:0;height:2.75rem;justify-content:center;left:0;position:absolute;right:0;top:0}#mainNavbar .nav-item{font-size:.875rem;line-height:1.3rem}#mainNavbar .nav-item>a{border-radius:var(--radius)}#mainMenu{gap:1rem;justify-content:space-between;padding-bottom:.75rem;padding-top:.75rem}#featureBar,#mainMenu{align-items:center;display:flex}#featureBar{flex:1 1 auto;gap:.5rem}#actionBar{gap:.5rem}#actionBar>.nav-divider{margin-left:-.25rem;margin-right:-.25rem}#mainContent{padding-top:.75rem}#mainMenu+#mainContent{padding-top:0}#mainContent.row{align-items:stretch;display:flex;gap:1rem;justify-content:space-between}#mainContent.row>*{flex:1 1 auto;min-width:0}#mainContainer.has-sidebar-left{--gutter-left-size:16px}#mainContainer.is-sidebar-left-collapsed{--gutter-left-size:0}.has-sidebar-animation.has-sidebar-left #mainMenu{transition-duration:.15s;transition-property:padding-left;transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--modal-radius:var(--radius);--avatar-bg:var(--color-gray-200)}.modal-alert .modal-footer{justify-content:center}.modal-dialog{--tw-bg-opacity:1}.modal-content,.modal-dialog{max-height:calc(100vh - 4rem)}.modal-body,.modal-footer,.modal-header{padding:1.5rem 2rem}.modal-header{padding-right:3rem}.modal-body+.modal-footer,.modal-header+.modal-actions+.modal-body,.modal-header+.modal-body{padding-top:1px}.modal-condensed .modal-body,.modal-condensed .modal-header{padding:1rem 1.25rem}.modal-condensed .modal-actions{top:.75rem}:root{--label-bg:var(--color-gray-100);--label-color:var(--color-gray-800)}.label[class$=-pale],.label[class*="-pale "]{--tw-bg-opacity:0.4;--tw-ring-opacity:0.4}.body-modal .panel-form,.modal-body>.panel-form{margin:0;padding:0}.modal-body>.panel-form>.panel-heading{padding-left:1px;padding-right:1px;padding-top:1px}.modal-body>.panel-form>.panel-body{padding:1px}.modal-body>.form{padding-top:1px}.modal .history,.modal .panel-body>.form{padding:0}:root{--article-p-space:0}.lane-col-join-with-above{position:relative}.lane-col-join-with-above:before{background-color:inherit;left:0;position:absolute;right:0;--tw-content:"";content:var(--tw-content);height:var(--kanban-col-gap-top,var(--kanban-lanes-gap));top:calc(0px - var(--kanban-col-gap-top, var(--kanban-lanes-gap)))}.arrow,.arrow:before{background:inherit;height:calc(var(--arrow-size)*1.4142);position:absolute;width:calc(var(--arrow-size)*1.4142)}.arrow{visibility:hidden;--arrow-size:5px}.arrow:before{border:inherit;content:"";visibility:visible;--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.arrow-top,.arrow-up{border-bottom:inherit;border-right:inherit;border-width:1px 0 0 1px;top:calc(1px - var(--arrow-size))}.white>.arrow-top,.white>.arrow-up{top:calc(0px - var(--arrow-size))}.arrow-bottom,.arrow-down{border-left:inherit;border-top:inherit;border-width:0 1px 1px 0;bottom:calc(1px - var(--arrow-size))}.white>.arrow-bottom,.white>.arrow-down{bottom:calc(0px - var(--arrow-size))}.arrow-left{border-right:inherit;border-top:inherit;border-width:0 0 1px 1px;left:calc(1px - var(--arrow-size))}.white>.arrow-left{left:calc(0px - var(--arrow-size))}.arrow-right{border-bottom:inherit;border-left:inherit;border-width:1px 1px 0 0;right:calc(1px - var(--arrow-size))}.white>.arrow-right{right:calc(0px - var(--arrow-size))}.caret,.caret-down,.caret-left,.caret-right,.caret-up{align-items:center;display:inline-flex;height:.75rem;justify-content:center;position:relative;width:.75rem}.caret-down:before,.caret-left:before,.caret-right:before,.caret-up:before,.caret:before{display:block;height:.35rem;transform-origin:center;width:.35rem;--tw-translate-y:-1px;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.caret-left:before{--tw-translate-x:0.125rem;--tw-translate-y:0px;--tw-rotate:135deg}.caret-left:before,.caret-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.caret-right:before{--tw-translate-x:-0.125rem;--tw-translate-y:0px;--tw-rotate:-45deg}.caret-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:focus>.caret,:hover>.caret{opacity:inherit}.disabled .caret,.readonly .caret{opacity:var(--caret-opacity,.5)}:root{--toggle-icon-size:calc(var(--font-size-root)*3/4 + 1px)}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-color:currentColor;border-width:1px;display:block;opacity:.5;position:relative}.toggle-icon-collapse:hover,.toggle-icon-expand:hover,.toggle-icon:hover{opacity:.9}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-radius:inherit;height:var(--toggle-icon-size);width:var(--toggle-icon-size)}.is-collapsed .toggle-icon:after,.is-collapsed .toggle-icon:before,.is-expanded .toggle-icon:before,.toggle-icon-collapse:after,.toggle-icon-collapse:before,.toggle-icon-expand:before{background-color:currentColor;content:" ";display:block;height:1px;left:2px;position:absolute;right:2px;top:calc((var(--toggle-icon-size) - 3px)/2)}.is-collapsed .toggle-icon:after,.toggle-icon-collapse:after{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.spinner,.spinner:after,.spinner:before{display:block;height:1em;position:relative;width:1em}.spinner:after,.spinner:before{border-radius:var(--radius-full);content:" ";position:absolute}.spinner:before{animation:-spin 1s cubic-bezier(.6,0,.4,1) infinite;border:.16667em solid transparent;border-top-color:currentcolor}.spinner:after{border:.16667em solid;opacity:.2}.magnifier{display:inline-block;height:1em;position:relative;width:1em}.magnifier:after,.magnifier:before{border-radius:var(--radius-full);content:"";display:block;position:absolute}.magnifier:before{border:1px solid;height:.75em;width:.75em}.magnifier:after{height:1px;left:.55em;top:.7em;width:.5em;--tw-rotate:45deg;background-color:currentColor;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.more,.more-vert{margin:.5rem;position:relative}.more,.more-vert,.more-vert:after,.more-vert:before,.more:after,.more:before{background-color:currentColor;border-radius:var(--radius-full);height:.125rem;width:.125rem}.more-vert:after,.more-vert:before,.more:after,.more:before{display:block;left:-5px;position:absolute;top:0;--tw-content:"";content:var(--tw-content)}.more-vert:after,.more:after{left:5px}.more-vert{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-down,.chevron-left,.chevron-right,.chevron-up{align-items:center;display:inline-flex;height:1em;justify-content:center;position:relative;width:1em}.chevron-down:before,.chevron-left:before,.chevron-right:before,.chevron-up:before{display:block;height:.6923077em;transform-origin:center;width:.6923077em;--tw-translate-y:-0.125rem;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.chevron-left:before{--tw-translate-y:0px;--tw-translate-x:0.125rem;--tw-rotate:135deg}.chevron-left:before,.chevron-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-right:before{--tw-translate-y:0px;--tw-translate-x:-0.125rem;--tw-rotate:-45deg}.chevron-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.i-time{border-color:currentColor;border-radius:50%;border-width:.08em;display:inline-block;height:1em;position:relative;width:1em}.i-time:after{border-color:currentColor;border-width:0 0 .08em .08em;height:.385em;left:.3846em;position:absolute;top:.08em;width:.385em;--tw-content:"";content:var(--tw-content)}.i-calendar{border-color:currentColor;border-radius:2px;border-width:.08em;display:inline-block;height:.79em;margin-top:.16em;position:relative;width:1em}.i-calendar:after,.i-calendar:before{border-color:currentColor;border-width:.08em;position:absolute;--tw-content:"";content:var(--tw-content)}.i-calendar:before{border-bottom-width:0;left:.15em;top:.307em;width:.6em}.i-calendar:after{border-bottom-width:0;border-top-width:0;height:.3077em;left:.17em;top:-.154em;width:.538em}:root{--state-color:rgba(0,0,0,.05);--state-scale:.9;--opacity-disabled:.7;--opacity-muted:.5;--load-indicator-duration:300ms;--load-indicator-delay:.5s}.btn,.item>a,.state{cursor:pointer;position:relative}.btn:before,.item>a:before,.state:before{background:var(--state-color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transform:scale(var(--state-scale));transition-duration:.2s;transition-property:opacity,transform,box-shadow,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn.active:not(:hover,:focus-visible,:focus-within,:active):before,.item>a.active:not(:hover,:focus-visible,:focus-within,:active):before,.state.active:not(:hover,:focus-visible,:focus-within,:active):before{background:var(--state-active-color,var(--state-color));opacity:var(--state-active-opacity,0);--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-duration:.7s}.btn.selected:not(:hover,:focus-visible,:focus-within,:active):before,.item>a.selected:not(:hover,:focus-visible,:focus-within,:active):before,.state.selected:not(:hover,:focus-visible,:focus-within,:active):before{background:var(--state-selected-color,var(--state-scale));opacity:var(--state-selected-opacity,.1);--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn:focus-visible,.item>a:focus-visible,.state:focus-visible{outline:2px solid transparent;outline-offset:2px}.btn:active:before,.btn:focus-visible:before,.btn:hover:before,.item>a:active:before,.item>a:focus-visible:before,.item>a:hover:before,.state:active:before,.state:focus-visible:before,.state:hover:before{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn:hover:before,.item>a:hover:before,.state:hover:before{opacity:var(--state-hover-opacity,1)}.btn:active:before,.item>a:active:before,.state:active:before{background:var(--state-pressed-color,var(--state-color));opacity:var(--state-pressed-opacity,.6);--tw-ring-color:var(--state-ring-color,currentColor);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);transition-duration:.7s}.btn:focus-visible:before,.item>a:focus-visible:before,.state:focus-visible:before{background:var(--state-focus-color,var(--state-color));opacity:var(--state-focus-opacity,1);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-focus-rgb),var(--tw-ring-opacity))}.btn.disabled:before,.btn[disabled]:before,.item>a.disabled:before,.item>a[disabled]:before,.state.disabled:before,.state[disabled]:before{display:none}.btn{--state-active-opacity:1}@-moz-document url-prefix(){.btn,:root{--state-active-opacity:0;--state-focus-opacity:0}}.disabled,.disabled *,[disabled],[disabled] *{cursor:not-allowed!important;opacity:var(--opacity-disabled);--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.load-indicator:after,.load-indicator:before{display:block;opacity:0;position:absolute;transition-delay:0s;transition-duration:.15s;transition-duration:var(--load-indicator-duration);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden}.load-indicator:before{align-items:center;background-color:rgba(var(--color-canvas-rgb),.7);border-radius:inherit;bottom:0;display:flex;font-size:.75rem;justify-content:center;left:0;line-height:1rem;right:0;top:0;z-index:99;--tw-content:attr(data-loading);content:var(--tw-content)}.load-indicator[data-loading]:before{padding-top:3.5rem}.load-indicator:after{border-color:transparent currentcolor currentcolor;border-radius:var(--radius-full);border-style:dotted;border-width:4px 3px 4px 4px;height:2rem;left:50%;margin-left:-1rem;margin-top:-1rem;top:50%;width:2rem;z-index:100;--tw-content:"";content:var(--tw-content)}.load-indicator.loading:after,.load-indicator.loading:before{opacity:1;transition-delay:var(--load-indicator-delay);visibility:visible}@keyframes -spin{to{transform:rotate(1turn)}}.load-indicator.loading:after{animation:-spin 1s linear infinite;opacity:.5}.events-none,.pointer-events-none{pointer-events:none}.events-auto,.pointer-events-auto{pointer-events:auto}.scroll-auto{scroll-behavior:auto}.scroll-smooth{scroll-behavior:smooth}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;-moz-user-select:auto;user-select:auto}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-text{cursor:text}.cursor-move{cursor:move}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.active\:opacity-100.active,.active\:opacity-100:active,.group.active .group-active\:opacity-100,.group:active .group-active\:opacity-100,.group:hover .group-hover\:opacity-100,.hover\:opacity-100:hover{opacity:1}.active\:opacity-0.active,.active\:opacity-0:active,.group.active .group-active\:opacity-0,.group:active .group-active\:opacity-0,.group:hover .group-hover\:opacity-0,.hover\:opacity-0:hover{opacity:0}.active\:text-primary.active,.active\:text-primary:active,.group.active .group-active\:text-primary,.group:active .group-active\:text-primary,.group:hover .group-hover\:text-primary,.hover\:text-primary:hover{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.active\:border-primary.active,.active\:border-primary:active,.group.active .group-active\:border-primary,.group:active .group-active\:border-primary,.group:hover .group-hover\:border-primary,.hover\:border-primary:hover{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity))}.active\:primary-pale.active,.active\:primary-pale:active,.group.active .group-active\:primary-pale,.group:active .group-active\:primary-pale,.group:hover .group-hover\:primary-pale,.hover\:primary-pale:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.active\:primary.active,.active\:primary:active,.group.active .group-active\:primary,.group:active .group-active\:primary,.group:hover .group-hover\:primary,.hover\:primary:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.active\:canvas.active,.active\:canvas:active,.group.active .group-active\:canvas,.group:active .group-active\:canvas,.group:hover .group-hover\:canvas,.hover\:canvas:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.active\:font-bold.active,.active\:font-bold:active,.group.active .group-active\:font-bold,.group:active .group-active\:font-bold,.group:hover .group-hover\:font-bold,.hover\:font-bold:hover{font-weight:700}.active\:shadow.active,.active\:shadow:active,.group.active .group-active\:shadow,.group:active .group-active\:shadow,.group:hover .group-hover\:shadow,.hover\:shadow:hover{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.active\:shadow-lg.active,.active\:shadow-lg:active,.group.active .group-active\:shadow-lg,.group:active .group-active\:shadow-lg,.group:hover .group-hover\:shadow-lg,.hover\:shadow-lg:hover{--tw-shadow:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--tw-shadow-colored:0 5px 15px -3px var(--tw-shadow-color),0 2px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:block,.hover\:block:hover{display:block!important}.group:hover .group-hover\:flex,.hover\:flex:hover{display:flex!important}.group:hover .group-hover\:inline-flex,.hover\:inline-flex:hover{display:inline-flex!important}.group:hover .group-hover\:scale-110,.hover\:scale-110:hover{--tw-scale-x:1.1!important;--tw-scale-y:1.1!important}.group:hover .group-hover\:scale-110,.group:hover .group-hover\:scale-125,.hover\:scale-110:hover,.hover\:scale-125:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.group:hover .group-hover\:scale-125,.hover\:scale-125:hover{--tw-scale-x:1.25!important;--tw-scale-y:1.25!important}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.container{width:100%}@media (min-width:1720px){.container{max-width:1720px}}.container{margin-left:auto;margin-right:auto}.popup{background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));border-radius:var(--radius);--tw-bg-opacity:0.85;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;--tw-backdrop-blur:blur(16px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.hidden{display:none!important}.pull-right{float:right}.pull-left{float:left}.clearfix:after{clear:both;content:"";display:block}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-fill{-o-object-fit:fill;object-fit:fill}.object-none{-o-object-fit:none;object-fit:none}.object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.object-bottom{-o-object-position:bottom;object-position:bottom}.object-center{-o-object-position:center;object-position:center}.object-left{-o-object-position:left;object-position:left}.object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.object-left-top{-o-object-position:left top;object-position:left top}.object-right{-o-object-position:right;object-position:right}.object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.object-right-top{-o-object-position:right top;object-position:right top}.object-top{-o-object-position:top;object-position:top}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-clip{overflow:clip}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-clip{overflow-x:clip}.overflow-y-clip{overflow-y:clip}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.overflow-overlay{overflow:overlay}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{bottom:0;left:0;right:0;top:0}.inset-auto{bottom:auto;left:auto;right:auto;top:auto}.inset-x-0{left:0;right:0}.inset-y-0{bottom:0;top:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-full{top:100%}.right-full{right:100%}.bottom-full{bottom:100%}.left-full{left:100%}.top-auto{top:auto}.right-auto{right:auto}.bottom-auto{bottom:auto}.left-auto{left:auto}.top-px{top:1px}.right-px{right:1px}.bottom-px{bottom:1px}.left-px{left:1px}.top-0\.5{top:.125rem}.right-0\.5{right:.125rem}.bottom-0\.5{bottom:.125rem}.left-0\.5{left:.125rem}.top-1{top:.25rem}.right-1{right:.25rem}.bottom-1{bottom:.25rem}.left-1{left:.25rem}.top-1\.5{top:.375rem}.right-1\.5{right:.375rem}.bottom-1\.5{bottom:.375rem}.left-1\.5{left:.375rem}.top-2{top:.5rem}.right-2{right:.5rem}.bottom-2{bottom:.5rem}.left-2{left:.5rem}.top-2\.5{top:.625rem}.right-2\.5{right:.625rem}.bottom-2\.5{bottom:.625rem}.left-2\.5{left:.625rem}.top-3{top:.75rem}.right-3{right:.75rem}.bottom-3{bottom:.75rem}.left-3{left:.75rem}.top-3\.5{top:.875rem}.right-3\.5{right:.875rem}.bottom-3\.5{bottom:.875rem}.left-3\.5{left:.875rem}.top-4{top:1rem}.right-4{right:1rem}.bottom-4{bottom:1rem}.left-4{left:1rem}.top-5{top:1.25rem}.right-5{right:1.25rem}.bottom-5{bottom:1.25rem}.left-5{left:1.25rem}.top-6{top:1.5rem}.right-6{right:1.5rem}.bottom-6{bottom:1.5rem}.left-6{left:1.5rem}.top-7{top:1.75rem}.right-7{right:1.75rem}.bottom-7{bottom:1.75rem}.left-7{left:1.75rem}.top-8{top:2rem}.right-8{right:2rem}.bottom-8{bottom:2rem}.left-8{left:2rem}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-0{z-index:0}.z-1{z-index:1}.z-5{z-index:5}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.z-base{z-index:1100}.z-above{z-index:50}.z-below{z-index:-50}.z-dropdown{z-index:1200}.z-sticky{z-index:1300}.z-fixed{z-index:1400}.z-modal{z-index:1500}.z-overlay{z-index:1600}.z-popover{z-index:1700}.z-tooltip{z-index:1800}.z-messager{z-index:1900}.m-0{margin:0}.m-auto{margin:auto}.m-px{margin:1px}.m-0\.5{margin:.125rem}.m-1{margin:.25rem}.m-1\.5{margin:.375rem}.m-2{margin:.5rem}.m-2\.5{margin:.625rem}.m-3{margin:.75rem}.m-3\.5{margin:.875rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-7{margin:1.75rem}.m-8{margin:2rem}.m-9{margin:2.25rem}.m-10{margin:2.5rem}.mx-0{margin-left:0;margin-right:0}.my-0{margin-bottom:0}.mt-0,.my-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mx-auto{margin-left:auto;margin-right:auto}.my-auto{margin-bottom:auto}.mt-auto,.my-auto{margin-top:auto}.mr-auto{margin-right:auto}.mb-auto{margin-bottom:auto}.ml-auto{margin-left:auto}.mx-px{margin-left:1px;margin-right:1px}.my-px{margin-bottom:1px}.mt-px,.my-px{margin-top:1px}.mr-px{margin-right:1px}.mb-px{margin-bottom:1px}.ml-px{margin-left:1px}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.my-0\.5{margin-bottom:.125rem}.mt-0\.5,.my-0\.5{margin-top:.125rem}.mr-0\.5{margin-right:.125rem}.mb-0\.5{margin-bottom:.125rem}.ml-0\.5{margin-left:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-1{margin-bottom:.25rem}.mt-1,.my-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.my-1\.5{margin-bottom:.375rem}.mt-1\.5,.my-1\.5{margin-top:.375rem}.mr-1\.5{margin-right:.375rem}.mb-1\.5{margin-bottom:.375rem}.ml-1\.5{margin-left:.375rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-2{margin-bottom:.5rem}.mt-2,.my-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.my-2\.5{margin-bottom:.625rem}.mt-2\.5,.my-2\.5{margin-top:.625rem}.mr-2\.5{margin-right:.625rem}.mb-2\.5{margin-bottom:.625rem}.ml-2\.5{margin-left:.625rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-3{margin-bottom:.75rem}.mt-3,.my-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.my-3\.5{margin-bottom:.875rem}.mt-3\.5,.my-3\.5{margin-top:.875rem}.mr-3\.5{margin-right:.875rem}.mb-3\.5{margin-bottom:.875rem}.ml-3\.5{margin-left:.875rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-4{margin-bottom:1rem}.mt-4,.my-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.my-5{margin-bottom:1.25rem}.mt-5,.my-5{margin-top:1.25rem}.mr-5{margin-right:1.25rem}.mb-5{margin-bottom:1.25rem}.ml-5{margin-left:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-6{margin-bottom:1.5rem}.mt-6,.my-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mx-7{margin-left:1.75rem;margin-right:1.75rem}.my-7{margin-bottom:1.75rem}.mt-7,.my-7{margin-top:1.75rem}.mr-7{margin-right:1.75rem}.mb-7{margin-bottom:1.75rem}.ml-7{margin-left:1.75rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-8{margin-bottom:2rem}.mt-8,.my-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.ml-8{margin-left:2rem}.mx-9{margin-left:2.25rem;margin-right:2.25rem}.my-9{margin-bottom:2.25rem}.mt-9,.my-9{margin-top:2.25rem}.mr-9{margin-right:2.25rem}.mb-9{margin-bottom:2.25rem}.ml-9{margin-left:2.25rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.my-10{margin-bottom:2.5rem}.mt-10,.my-10{margin-top:2.5rem}.mr-10{margin-right:2.5rem}.mb-10{margin-bottom:2.5rem}.ml-10{margin-left:2.5rem}.p-0{padding:0}.p-px{padding:1px}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.p-9{padding:2.25rem}.p-10{padding:2.5rem}.px-0{padding-left:0;padding-right:0}.py-0{padding-bottom:0}.pt-0,.py-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.px-px{padding-left:1px;padding-right:1px}.py-px{padding-bottom:1px}.pt-px,.py-px{padding-top:1px}.pr-px{padding-right:1px}.pb-px{padding-bottom:1px}.pl-px{padding-left:1px}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.py-0\.5{padding-bottom:.125rem}.pt-0\.5,.py-0\.5{padding-top:.125rem}.pr-0\.5{padding-right:.125rem}.pb-0\.5{padding-bottom:.125rem}.pl-0\.5{padding-left:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-1{padding-bottom:.25rem}.pt-1,.py-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.py-1\.5{padding-bottom:.375rem}.pt-1\.5,.py-1\.5{padding-top:.375rem}.pr-1\.5{padding-right:.375rem}.pb-1\.5{padding-bottom:.375rem}.pl-1\.5{padding-left:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-2{padding-bottom:.5rem}.pt-2,.py-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.py-2\.5{padding-bottom:.625rem}.pt-2\.5,.py-2\.5{padding-top:.625rem}.pr-2\.5{padding-right:.625rem}.pb-2\.5{padding-bottom:.625rem}.pl-2\.5{padding-left:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-3{padding-bottom:.75rem}.pt-3,.py-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.py-3\.5{padding-bottom:.875rem}.pt-3\.5,.py-3\.5{padding-top:.875rem}.pr-3\.5{padding-right:.875rem}.pb-3\.5{padding-bottom:.875rem}.pl-3\.5{padding-left:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.py-4{padding-bottom:1rem}.pt-4,.py-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-5{padding-bottom:1.25rem}.pt-5,.py-5{padding-top:1.25rem}.pr-5{padding-right:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-6{padding-bottom:1.5rem}.pt-6,.py-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-7{padding-bottom:1.75rem}.pt-7,.py-7{padding-top:1.75rem}.pr-7{padding-right:1.75rem}.pb-7{padding-bottom:1.75rem}.pl-7{padding-left:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-8{padding-bottom:2rem}.pt-8,.py-8{padding-top:2rem}.pr-8{padding-right:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.py-9{padding-bottom:2.25rem}.pt-9,.py-9{padding-top:2.25rem}.pr-9{padding-right:2.25rem}.pb-9{padding-bottom:2.25rem}.pl-9{padding-left:2.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-10{padding-bottom:2.5rem}.pt-10,.py-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pb-10{padding-bottom:2.5rem}.pl-10{padding-left:2.5rem}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(0px*(1 - var(--tw-space-x-reverse)));margin-right:calc(0px*var(--tw-space-x-reverse))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.125rem*var(--tw-space-x-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.375rem*var(--tw-space-x-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.625rem*var(--tw-space-x-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.625rem*var(--tw-space-y-reverse));margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.875rem*var(--tw-space-x-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.875rem*var(--tw-space-y-reverse));margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.75rem*var(--tw-space-x-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.75rem*var(--tw-space-y-reverse));margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.25rem*var(--tw-space-x-reverse))}.space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2.25rem*var(--tw-space-y-reverse));margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.5rem*var(--tw-space-x-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2.5rem*var(--tw-space-y-reverse));margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(1px*var(--tw-space-x-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1px*var(--tw-space-y-reverse));margin-top:calc(1px*(1 - var(--tw-space-y-reverse)))}.w-0{width:0}.w-px{width:1px}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-32{width:8rem}.w-36{width:9rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-52{width:13rem}.w-56{width:14rem}.w-60{width:15rem}.w-64{width:16rem}.w-72{width:18rem}.w-80{width:20rem}.w-96{width:24rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-1\/6{width:16.666667%}.w-2\/6{width:33.333333%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.w-min{width:-moz-min-content;width:min-content}.w-max{width:-moz-max-content;width:max-content}.w-fit{width:-moz-fit-content;width:fit-content}.min-w-0{min-width:0}.min-w-full{min-width:100%}.min-w-min{min-width:-moz-min-content;min-width:min-content}.min-w-max{min-width:-moz-max-content;min-width:max-content}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.max-w-0{max-width:0}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-min{max-width:-moz-min-content;max-width:min-content}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-fit{max-width:-moz-fit-content;max-width:fit-content}.h-0{height:0}.h-px{height:1px}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-32{height:8rem}.h-36{height:9rem}.h-40{height:10rem}.h-44{height:11rem}.h-48{height:12rem}.h-52{height:13rem}.h-56{height:14rem}.h-60{height:15rem}.h-64{height:16rem}.h-72{height:18rem}.h-80{height:20rem}.h-96{height:24rem}.h-1\/2{height:50%}.h-1\/3{height:33.333333%}.h-2\/3{height:66.666667%}.h-1\/4{height:25%}.h-2\/4{height:50%}.h-3\/4{height:75%}.h-1\/5{height:20%}.h-2\/5{height:40%}.h-3\/5{height:60%}.h-4\/5{height:80%}.h-1\/6{height:16.666667%}.h-2\/6{height:33.333333%}.h-3\/6{height:50%}.h-4\/6{height:66.666667%}.h-5\/6{height:83.333333%}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.h-min{height:-moz-min-content;height:min-content}.h-max{height:-moz-max-content;height:max-content}.h-fit{height:-moz-fit-content;height:fit-content}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-min{min-height:-moz-min-content;min-height:min-content}.min-h-max{min-height:-moz-max-content;min-height:max-content}.min-h-fit{min-height:-moz-fit-content;min-height:fit-content}.max-h-0{max-height:0}.max-h-px{max-height:1px}.max-h-none{max-height:none}.max-h-full{max-height:100%}.max-h-min{max-height:-moz-min-content;max-height:min-content}.max-h-screen{max-height:100vh}.max-h-max{max-height:-moz-max-content;max-height:max-content}.max-h-fit{max-height:-moz-fit-content;max-height:fit-content}.canvas,.surface,.surface-light,.surface-strong{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}.canvas{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.surface-light{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-light-rgb),var(--tw-ring-opacity))}.surface{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-rgb),var(--tw-ring-opacity))}.surface-strong{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-strong-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-strong-rgb),var(--tw-ring-opacity))}.inverse{background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity));color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.inverse,.white{--tw-bg-opacity:1;--tw-text-opacity:1}.white{background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity));color:rgba(var(--color-fore-in-light-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-white-rgb),var(--tw-ring-opacity))}.black{--tw-bg-opacity:1;background-color:rgba(var(--color-black-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-black-rgb),var(--tw-ring-opacity))}.transparent{background-color:transparent;--tw-ring-color:transparent}.skin{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.skin:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger,.darken,.darker,.darkest,.gray,.gray-100,.gray-200,.gray-300,.gray-400,.gray-50,.gray-500,.gray-600,.gray-700,.gray-800,.gray-900,.gray-950,.important,.lighten,.lighter,.lightest,.primary,.secondary,.special,.success,.warning{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger:hover,.darken:hover,.darker:hover,.darkest:hover,.gray-100:hover,.gray-200:hover,.gray-300:hover,.gray-400:hover,.gray-500:hover,.gray-50:hover,.gray-600:hover,.gray-700:hover,.gray-800:hover,.gray-900:hover,.gray-950:hover,.gray:hover,.important:hover,.lighten:hover,.lighter:hover,.lightest:hover,.primary:hover,.secondary:hover,.special:hover,.success:hover,.warning:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger,.darken,.darker,.darkest,.gray,.gray-100,.gray-200,.gray-300,.gray-400,.gray-50,.gray-500,.gray-600,.gray-700,.gray-800,.gray-900,.gray-950,.important,.lighten,.lighter,.lightest,.primary,.secondary,.special,.success,.warning{--skin-text:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity));--skin-color:rgba(var(--skin-solid-rgb),1);--state-ring-color:var(--skin-color);--state-active-color:rgba(0,0,0,.1);--state-pressed-color:rgba(0,0,0,.1);--state-color:hsla(0,0%,100%,.1);--state-focus-color:rgba(0,0,0,.1)}.primary{--skin-solid-rgb:var(--color-primary-500-rgb)}.secondary{--skin-solid-rgb:var(--color-secondary-500-rgb)}.success{--skin-solid-rgb:var(--color-success-500-rgb)}.warning{--skin-solid-rgb:var(--color-warning-500-rgb)}.danger{--skin-solid-rgb:var(--color-danger-500-rgb)}.important{--skin-solid-rgb:var(--color-important-500-rgb)}.special{--skin-solid-rgb:var(--color-special-500-rgb)}.gray-50{--skin-bg:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity));--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-100{--skin-solid-rgb:var(--color-gray-100-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-200,.lightest{--skin-solid-rgb:var(--color-gray-200-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-300,.lighter{--skin-solid-rgb:var(--color-gray-300-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-400,.lighten{--skin-solid-rgb:var(--color-gray-400-rgb)}.gray,.gray-500{--skin-solid-rgb:var(--color-gray-500-rgb)}.darken,.gray-600{--skin-solid-rgb:var(--color-gray-600-rgb)}.darker,.gray-700{--skin-solid-rgb:var(--color-gray-700-rgb)}.darkest,.gray-800{--skin-solid-rgb:var(--color-gray-800-rgb)}.gray-900{--skin-solid-rgb:var(--color-gray-900-rgb)}.gray-950{--skin-solid-rgb:var(--color-gray-950-rgb)}.danger-pale,.gray-100-pale,.gray-200-pale,.gray-300-pale,.gray-400-pale,.gray-50-pale,.gray-500-pale,.gray-600-pale,.gray-700-pale,.gray-800-pale,.gray-900-pale,.gray-950-pale,.gray-pale,.important-pale,.pale,.primary-pale,.secondary-pale,.special-pale,.success-pale,.warning-pale{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-pale:hover,.gray-100-pale:hover,.gray-200-pale:hover,.gray-300-pale:hover,.gray-400-pale:hover,.gray-50-pale:hover,.gray-500-pale:hover,.gray-600-pale:hover,.gray-700-pale:hover,.gray-800-pale:hover,.gray-900-pale:hover,.gray-950-pale:hover,.gray-pale:hover,.important-pale:hover,.pale:hover,.primary-pale:hover,.secondary-pale:hover,.special-pale:hover,.success-pale:hover,.warning-pale:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-pale,.gray-100-pale,.gray-200-pale,.gray-300-pale,.gray-400-pale,.gray-50-pale,.gray-500-pale,.gray-600-pale,.gray-700-pale,.gray-800-pale,.gray-900-pale,.gray-950-pale,.gray-pale,.important-pale,.pale,.primary-pale,.secondary-pale,.special-pale,.success-pale,.warning-pale{--skin-color:rgba(var(--skin-pale-rgb),.1);--skin-text:rgba(var(--skin-pale-rgb),1);--state-color:rgba(var(--skin-pale-rgb),.1)}.pale{--skin-pale-rgb:var(--color-gray-500-rgb)}.primary-pale{--skin-pale-rgb:var(--color-primary-500-rgb)}.secondary-pale{--skin-pale-rgb:var(--color-secondary-500-rgb)}.success-pale{--skin-pale-rgb:var(--color-success-500-rgb)}.warning-pale{--skin-pale-rgb:var(--color-warning-500-rgb)}.danger-pale{--skin-pale-rgb:var(--color-danger-500-rgb)}.important-pale{--skin-pale-rgb:var(--color-important-500-rgb)}.special-pale{--skin-pale-rgb:var(--color-special-500-rgb)}.gray-50-pale{--skin-pale-rgb:var(--color-gray-50-rgb);--skin-text:var(--color-gray-400)}.gray-100-pale{--skin-pale-rgb:var(--color-gray-100-rgb);--skin-text:var(--color-gray-400)}.gray-200-pale{--skin-pale-rgb:var(--color-gray-200-rgb);--skin-text:var(--color-gray-400)}.gray-300-pale{--skin-pale-rgb:var(--color-gray-300-rgb);--skin-text:var(--color-gray-500)}.gray-400-pale{--skin-pale-rgb:var(--color-gray-400-rgb);--skin-text:var(--color-gray-500)}.gray-500-pale,.gray-pale{--skin-pale-rgb:var(--color-gray-500-rgb)}.gray-600-pale{--skin-pale-rgb:var(--color-gray-600-rgb)}.gray-700-pale{--skin-pale-rgb:var(--color-gray-700-rgb)}.gray-800-pale{--skin-pale-rgb:var(--color-gray-800-rgb)}.gray-900-pale{--skin-pale-rgb:var(--color-gray-900-rgb)}.gray-950-pale{--skin-pale-rgb:var(--color-gray-950-rgb)}.danger-outline,.dark-outline,.gray-300-outline,.gray-400-outline,.gray-600-outline,.gray-outline,.important-outline,.light-outline,.outline,.primary-outline,.secondary-outline,.special-outline,.success-outline,.warning-outline{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-outline:hover,.dark-outline:hover,.gray-300-outline:hover,.gray-400-outline:hover,.gray-600-outline:hover,.gray-outline:hover,.important-outline:hover,.light-outline:hover,.outline:hover,.primary-outline:hover,.secondary-outline:hover,.special-outline:hover,.success-outline:hover,.warning-outline:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-outline,.dark-outline,.gray-300-outline,.gray-400-outline,.gray-600-outline,.gray-outline,.important-outline,.light-outline,.outline,.primary-outline,.secondary-outline,.special-outline,.success-outline,.warning-outline{--skin-text:var(--skin-color,inherit);--skin-bg:transparent;--skin-color:rgba(var(--skin-outline-rgb),1);--state-color:rgba(var(--skin-outline-rgb),.1)}.outline{--skin-outline-rgb:var(--color-fore-rgb)}.primary-outline{--skin-outline-rgb:var(--color-primary-500-rgb)}.secondary-outline{--skin-outline-rgb:var(--color-secondary-500-rgb)}.success-outline{--skin-outline-rgb:var(--color-success-500-rgb)}.warning-outline{--skin-outline-rgb:var(--color-warning-500-rgb)}.danger-outline{--skin-outline-rgb:var(--color-danger-500-rgb)}.important-outline{--skin-outline-rgb:var(--color-important-500-rgb)}.special-outline{--skin-outline-rgb:var(--color-special-500-rgb)}.gray-300-outline{--skin-text:var(--color-gray-500);--skin-outline-rgb:var(--color-gray-300-rgb)}.gray-400-outline{--skin-text:var(--color-gray-500);--skin-outline-rgb:var(--color-gray-400-rgb)}.gray-outline{--skin-outline-rgb:var(--color-gray-500-rgb)}.gray-600-outline{--skin-outline-rgb:var(--color-gray-600-rgb)}.dark-outline{--skin-outline-rgb:var(--color-inverse-rgb)}.light-outline{--skin-outline-rgb:var(--color-canvas-rgb)}.danger-ghost,.ghost,.important-ghost,.primary-ghost,.secondary-ghost,.special-ghost,.success-ghost,.warning-ghost{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-ghost:hover,.ghost:hover,.important-ghost:hover,.primary-ghost:hover,.secondary-ghost:hover,.special-ghost:hover,.success-ghost:hover,.warning-ghost:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-ghost,.ghost,.important-ghost,.primary-ghost,.secondary-ghost,.special-ghost,.success-ghost,.warning-ghost{--tw-ring-opacity:0;--tw-bg-opacity:0;--skin-text:var(--skin-color,inherit);--skin-bg:transparent;--skin-ring:transparent;--skin-color:rgba(var(--skin-ghost-rgb),1);--state-color:rgba(var(--skin-ghost-rgb),.1)}.ghost{--skin-ghost-rgb:var(--color-fore-rgb);--skin-text:inherit}.primary-ghost{--skin-ghost-rgb:var(--color-primary-500-rgb)}.secondary-ghost{--skin-ghost-rgb:var(--color-secondary-500-rgb)}.success-ghost{--skin-ghost-rgb:var(--color-success-500-rgb)}.warning-ghost{--skin-ghost-rgb:var(--color-warning-500-rgb)}.danger-ghost{--skin-ghost-rgb:var(--color-danger-500-rgb)}.important-ghost{--skin-ghost-rgb:var(--color-important-500-rgb)}.special-ghost{--skin-ghost-rgb:var(--color-special-500-rgb)}.font-sans{font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif}.font-serif{font-family:Nimbus Roman No9 L,Songti SC,Noto Serif CJK SC,Source Han Serif SC,Source Han Serif CN,STSong,AR PL New Sung,AR PL SungtiL GB,NSimSun,SimSun,TW-Sung,WenQuanYi Bitmap Song,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,PMingLiU,MingLiU,serif}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-root{font-size:16px}.text-sm{font-size:.75rem;line-height:1rem}.text-base{font-size:.8125rem;line-height:1.25rem}.text-md{font-size:.875rem;line-height:1.3rem}.text-lg{font-size:1rem;line-height:1.5rem}.text-xl{font-size:1.125rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.font-thin{font-weight:100}.font-light{font-weight:300}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-black{font-weight:900}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.leading-10{line-height:2.5rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-loose{line-height:2}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{-webkit-line-clamp:3}.line-clamp-3,.line-clamp-4{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-4{-webkit-line-clamp:4}.line-clamp-5{-webkit-line-clamp:5}.line-clamp-5,.line-clamp-6{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-6{-webkit-line-clamp:6}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.align-bottom{vertical-align:bottom}.align-sub{vertical-align:sub}.align-super{vertical-align:super}.text-primary{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.text-secondary{--tw-text-opacity:1;color:rgba(var(--color-secondary-500-rgb),var(--tw-text-opacity))}.text-success{--tw-text-opacity:1;color:rgba(var(--color-success-500-rgb),var(--tw-text-opacity))}.text-warning{--tw-text-opacity:1;color:rgba(var(--color-warning-500-rgb),var(--tw-text-opacity))}.text-danger{--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.text-important{--tw-text-opacity:1;color:rgba(var(--color-important-500-rgb),var(--tw-text-opacity))}.text-special{--tw-text-opacity:1;color:rgba(var(--color-special-500-rgb),var(--tw-text-opacity))}.text-primary-50{--tw-text-opacity:1;color:rgba(var(--color-primary-50-rgb),var(--tw-text-opacity))}.text-primary-100{--tw-text-opacity:1;color:rgba(var(--color-primary-100-rgb),var(--tw-text-opacity))}.text-primary-200{--tw-text-opacity:1;color:rgba(var(--color-primary-200-rgb),var(--tw-text-opacity))}.text-primary-300{--tw-text-opacity:1;color:rgba(var(--color-primary-300-rgb),var(--tw-text-opacity))}.text-primary-400{--tw-text-opacity:1;color:rgba(var(--color-primary-400-rgb),var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.text-primary-600{--tw-text-opacity:1;color:rgba(var(--color-primary-600-rgb),var(--tw-text-opacity))}.text-primary-700{--tw-text-opacity:1;color:rgba(var(--color-primary-700-rgb),var(--tw-text-opacity))}.text-primary-800{--tw-text-opacity:1;color:rgba(var(--color-primary-800-rgb),var(--tw-text-opacity))}.text-primary-900{--tw-text-opacity:1;color:rgba(var(--color-primary-900-rgb),var(--tw-text-opacity))}.text-primary-950{--tw-text-opacity:1;color:rgba(var(--color-primary-950-rgb),var(--tw-text-opacity))}.text-secondary-50{--tw-text-opacity:1;color:rgba(var(--color-secondary-50-rgb),var(--tw-text-opacity))}.text-secondary-100{--tw-text-opacity:1;color:rgba(var(--color-secondary-100-rgb),var(--tw-text-opacity))}.text-secondary-200{--tw-text-opacity:1;color:rgba(var(--color-secondary-200-rgb),var(--tw-text-opacity))}.text-secondary-300{--tw-text-opacity:1;color:rgba(var(--color-secondary-300-rgb),var(--tw-text-opacity))}.text-secondary-400{--tw-text-opacity:1;color:rgba(var(--color-secondary-400-rgb),var(--tw-text-opacity))}.text-secondary-500{--tw-text-opacity:1;color:rgba(var(--color-secondary-500-rgb),var(--tw-text-opacity))}.text-secondary-600{--tw-text-opacity:1;color:rgba(var(--color-secondary-600-rgb),var(--tw-text-opacity))}.text-secondary-700{--tw-text-opacity:1;color:rgba(var(--color-secondary-700-rgb),var(--tw-text-opacity))}.text-secondary-800{--tw-text-opacity:1;color:rgba(var(--color-secondary-800-rgb),var(--tw-text-opacity))}.text-secondary-900{--tw-text-opacity:1;color:rgba(var(--color-secondary-900-rgb),var(--tw-text-opacity))}.text-secondary-950{--tw-text-opacity:1;color:rgba(var(--color-secondary-950-rgb),var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgba(var(--color-gray-50-rgb),var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(var(--color-gray-100-rgb),var(--tw-text-opacity))}.text-gray-200,.text-lightest{--tw-text-opacity:1;color:rgba(var(--color-gray-200-rgb),var(--tw-text-opacity))}.text-gray-300,.text-lighter{--tw-text-opacity:1;color:rgba(var(--color-gray-300-rgb),var(--tw-text-opacity))}.text-gray-400,.text-lighten{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.text-gray,.text-gray-500{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.text-darken,.text-gray-600{--tw-text-opacity:1;color:rgba(var(--color-gray-600-rgb),var(--tw-text-opacity))}.text-darker,.text-gray-700{--tw-text-opacity:1;color:rgba(var(--color-gray-700-rgb),var(--tw-text-opacity))}.text-darkest,.text-gray-800{--tw-text-opacity:1;color:rgba(var(--color-gray-800-rgb),var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgba(var(--color-gray-900-rgb),var(--tw-text-opacity))}.text-gray-950{--tw-text-opacity:1;color:rgba(var(--color-gray-950-rgb),var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity))}.text-black{--tw-text-opacity:1;color:rgba(var(--color-black-rgb),var(--tw-text-opacity))}.text-transparent{color:transparent}.text-canvas{--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.text-surface-light{--tw-text-opacity:1;color:rgba(var(--color-surface-light-rgb),var(--tw-text-opacity))}.text-surface{--tw-text-opacity:1;color:rgba(var(--color-surface-rgb),var(--tw-text-opacity))}.text-surface-strong{--tw-text-opacity:1;color:rgba(var(--color-surface-strong-rgb),var(--tw-text-opacity))}.text-inverse{--tw-text-opacity:1;color:rgba(var(--color-inverse-rgb),var(--tw-text-opacity))}.text-fore-in-light{--tw-text-opacity:1;color:rgba(var(--color-fore-in-light-rgb),var(--tw-text-opacity))}.text-fore-in-dark{--tw-text-opacity:1;color:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity))}.text-fore{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}.text-focus{--tw-text-opacity:1;color:rgba(var(--color-focus-rgb),var(--tw-text-opacity))}.text-link{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}.text-link-hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}.text-current{color:currentColor}.text-inherit{color:inherit}.clip,.ellipsis,.text-clip,.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.clip,.text-clip{text-overflow:clip}.whitespace-normal{white-space:normal}.nowrap,.whitespace-nowrap{white-space:nowrap}.pre,.whitespace-pre{white-space:pre}.pre-line,.whitespace-pre-line{white-space:pre-line}.pre-wrap,.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-opacity-0{--tw-text-opacity:0}.text-opacity-5{--tw-text-opacity:.05}.text-opacity-10{--tw-text-opacity:.1}.text-opacity-20{--tw-text-opacity:.2}.text-opacity-25{--tw-text-opacity:.25}.text-opacity-30{--tw-text-opacity:.3}.text-opacity-40{--tw-text-opacity:.4}.text-opacity-50{--tw-text-opacity:.5}.text-opacity-60{--tw-text-opacity:.6}.text-opacity-70{--tw-text-opacity:.7}.text-opacity-80{--tw-text-opacity:.8}.text-opacity-90{--tw-text-opacity:.9}.text-opacity-95{--tw-text-opacity:.95}.text-opacity-100{--tw-text-opacity:1}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.list-unstyled{list-style-type:none;padding-left:0}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.bg-primary{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity))}.bg-secondary{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-500-rgb),var(--tw-bg-opacity))}.bg-success{--tw-bg-opacity:1;background-color:rgba(var(--color-success-500-rgb),var(--tw-bg-opacity))}.bg-warning{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-500-rgb),var(--tw-bg-opacity))}.bg-danger{--tw-bg-opacity:1;background-color:rgba(var(--color-danger-500-rgb),var(--tw-bg-opacity))}.bg-important{--tw-bg-opacity:1;background-color:rgba(var(--color-important-500-rgb),var(--tw-bg-opacity))}.bg-special{--tw-bg-opacity:1;background-color:rgba(var(--color-special-500-rgb),var(--tw-bg-opacity))}.bg-primary-50{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.bg-primary-100{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity))}.bg-primary-200{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-200-rgb),var(--tw-bg-opacity))}.bg-primary-300{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-300-rgb),var(--tw-bg-opacity))}.bg-primary-400{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-400-rgb),var(--tw-bg-opacity))}.bg-primary-500{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-600-rgb),var(--tw-bg-opacity))}.bg-primary-700{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-700-rgb),var(--tw-bg-opacity))}.bg-primary-800{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-800-rgb),var(--tw-bg-opacity))}.bg-primary-900{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-900-rgb),var(--tw-bg-opacity))}.bg-primary-950{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-950-rgb),var(--tw-bg-opacity))}.bg-secondary-50{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-50-rgb),var(--tw-bg-opacity))}.bg-secondary-100{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-100-rgb),var(--tw-bg-opacity))}.bg-secondary-200{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-200-rgb),var(--tw-bg-opacity))}.bg-secondary-300{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-300-rgb),var(--tw-bg-opacity))}.bg-secondary-400{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-400-rgb),var(--tw-bg-opacity))}.bg-secondary-500{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-500-rgb),var(--tw-bg-opacity))}.bg-secondary-600{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-600-rgb),var(--tw-bg-opacity))}.bg-secondary-700{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-700-rgb),var(--tw-bg-opacity))}.bg-secondary-800{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-800-rgb),var(--tw-bg-opacity))}.bg-secondary-900{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-900-rgb),var(--tw-bg-opacity))}.bg-secondary-950{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-950-rgb),var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.bg-gray-200,.bg-lightest{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-200-rgb),var(--tw-bg-opacity))}.bg-gray-300,.bg-lighter{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-300-rgb),var(--tw-bg-opacity))}.bg-gray-400,.bg-light{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-400-rgb),var(--tw-bg-opacity))}.bg-gray,.bg-gray-500{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-500-rgb),var(--tw-bg-opacity))}.bg-darken,.bg-gray-600{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-600-rgb),var(--tw-bg-opacity))}.bg-darker,.bg-gray-700{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-700-rgb),var(--tw-bg-opacity))}.bg-darkest,.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-800-rgb),var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-900-rgb),var(--tw-bg-opacity))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-950-rgb),var(--tw-bg-opacity))}.bg-canvas{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.bg-surface-light{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity))}.bg-surface{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.bg-surface-strong{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-strong-rgb),var(--tw-bg-opacity))}.bg-inverse{--tw-bg-opacity:1;background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity))}.bg-fore-in-light{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-in-light-rgb),var(--tw-bg-opacity))}.bg-fore-in-dark{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-in-dark-rgb),var(--tw-bg-opacity))}.bg-fore{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-rgb),var(--tw-bg-opacity))}.bg-focus{--tw-bg-opacity:1;background-color:rgba(var(--color-focus-rgb),var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgba(var(--color-black-rgb),var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-current{background-color:currentColor}.bg-inherit{background-color:inherit}.bg-none{background-image:none}.bg-opacity-0{--tw-bg-opacity:0}.bg-opacity-5{--tw-bg-opacity:.05}.bg-opacity-10{--tw-bg-opacity:.1}.bg-opacity-20{--tw-bg-opacity:.2}.bg-opacity-25{--tw-bg-opacity:.25}.bg-opacity-30{--tw-bg-opacity:.3}.bg-opacity-40{--tw-bg-opacity:.4}.bg-opacity-50{--tw-bg-opacity:.5}.bg-opacity-60{--tw-bg-opacity:.6}.bg-opacity-70{--tw-bg-opacity:.7}.bg-opacity-80{--tw-bg-opacity:.8}.bg-opacity-90{--tw-bg-opacity:.9}.bg-opacity-100{--tw-bg-opacity:1}.bg-auto{background-size:auto}.bg-cover{background-size:cover}.bg-contain{background-size:contain}.bg-repeat{background-repeat:repeat}.bg-no-repeat{background-repeat:no-repeat}.bg-repeat-x{background-repeat:repeat-x}.bg-repeat-y{background-repeat:repeat-y}.bg-repeat-round{background-repeat:round}.bg-repeat-space{background-repeat:space}.bg-bottom{background-position:bottom}.bg-center{background-position:50%}.bg-left{background-position:0}.bg-left-bottom{background-position:0 100%}.bg-left-top{background-position:0 0}.bg-right{background-position:100%}.bg-right-bottom{background-position:100% 100%}.bg-right-top{background-position:100% 0}.bg-top{background-position:top}.bg-fixed{background-attachment:fixed}.bg-local{background-attachment:local}.bg-scroll{background-attachment:scroll}.divider{align-self:stretch;border-color:currentColor;border-left-width:1px;border-top-width:1px;opacity:.1}.border-0{border-width:0}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-t{border-top-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.border-t-0{border-top-width:0}.border-r-0{border-right-width:0}.border-b-0{border-bottom-width:0}.border-l-0{border-left-width:0}.border-t-2{border-top-width:2px}.border-l-2{border-left-width:2px}.border-r-2{border-right-width:2px}.border-b-2{border-bottom-width:2px}.border-t-4{border-top-width:4px}.border-l-4{border-left-width:4px}.border-r-4{border-right-width:4px}.border-b-4{border-bottom-width:4px}.border-light{--tw-border-opacity:1;border-color:rgba(var(--color-border-light-rgb),var(--tw-border-opacity))}.border-strong{--tw-border-opacity:1;border-color:rgba(var(--color-border-strong-rgb),var(--tw-border-opacity))}.border-primary{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity))}.border-secondary{--tw-border-opacity:1;border-color:rgba(var(--color-secondary-500-rgb),var(--tw-border-opacity))}.border-success{--tw-border-opacity:1;border-color:rgba(var(--color-success-500-rgb),var(--tw-border-opacity))}.border-warning{--tw-border-opacity:1;border-color:rgba(var(--color-warning-500-rgb),var(--tw-border-opacity))}.border-danger{--tw-border-opacity:1;border-color:rgba(var(--color-danger-500-rgb),var(--tw-border-opacity))}.border-important{--tw-border-opacity:1;border-color:rgba(var(--color-important-500-rgb),var(--tw-border-opacity))}.border-special{--tw-border-opacity:1;border-color:rgba(var(--color-special-500-rgb),var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgba(var(--color-gray-50-rgb),var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgba(var(--color-gray-100-rgb),var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(var(--color-gray-200-rgb),var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(var(--color-gray-300-rgb),var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.border-gray,.border-gray-500{--tw-border-opacity:1;border-color:rgba(var(--color-gray-500-rgb),var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgba(var(--color-gray-600-rgb),var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgba(var(--color-gray-700-rgb),var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgba(var(--color-gray-800-rgb),var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgba(var(--color-gray-900-rgb),var(--tw-border-opacity))}.border-gray-950{--tw-border-opacity:1;border-color:rgba(var(--color-gray-950-rgb),var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgba(var(--color-white-rgb),var(--tw-border-opacity))}.border-black{--tw-border-opacity:1;border-color:rgba(var(--color-black-rgb),var(--tw-border-opacity))}.border-canvas{--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity))}.border-surface-light{--tw-border-opacity:1;border-color:rgba(var(--color-surface-light-rgb),var(--tw-border-opacity))}.border-surface{--tw-border-opacity:1;border-color:rgba(var(--color-surface-rgb),var(--tw-border-opacity))}.border-surface-strong{--tw-border-opacity:1;border-color:rgba(var(--color-surface-strong-rgb),var(--tw-border-opacity))}.border-inverse{--tw-border-opacity:1;border-color:rgba(var(--color-inverse-rgb),var(--tw-border-opacity))}.border-fore-in-light{--tw-border-opacity:1;border-color:rgba(var(--color-fore-in-light-rgb),var(--tw-border-opacity))}.border-fore-in-dark{--tw-border-opacity:1;border-color:rgba(var(--color-fore-in-dark-rgb),var(--tw-border-opacity))}.border-fore{--tw-border-opacity:1;border-color:rgba(var(--color-fore-rgb),var(--tw-border-opacity))}.border-focus{--tw-border-opacity:1;border-color:rgba(var(--color-focus-rgb),var(--tw-border-opacity))}.border-link{--tw-border-opacity:1;border-color:rgba(var(--color-link-rgb),var(--tw-border-opacity))}.border-link-hover{--tw-border-opacity:1;border-color:rgba(var(--color-link-hover-rgb),var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-current{border-color:currentColor}.border-inherit{border-color:inherit}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-double{border-style:double}.border-hidden{border-style:hidden}.border-none{border-style:none}.border-opacity-0{--tw-border-opacity:0}.border-opacity-5{--tw-border-opacity:.05}.border-opacity-10{--tw-border-opacity:.1}.border-opacity-20{--tw-border-opacity:.2}.border-opacity-25{--tw-border-opacity:.25}.border-opacity-30{--tw-border-opacity:.3}.border-opacity-40{--tw-border-opacity:.4}.border-opacity-50{--tw-border-opacity:.5}.border-opacity-60{--tw-border-opacity:.6}.border-opacity-70{--tw-border-opacity:.7}.border-opacity-80{--tw-border-opacity:.8}.border-opacity-90{--tw-border-opacity:.9}.border-opacity-95{--tw-border-opacity:.95}.border-opacity-100{--tw-border-opacity:1}.rounded-none{border-radius:var(--radius-none)}.rounded-sm{border-radius:var(--radius-sm)}.rounded{border-radius:var(--radius)}.rounded-md{border-radius:var(--radius-md)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.circle,.rounded-full{border-radius:var(--radius-full)}.rounded-l-none{border-bottom-left-radius:var(--radius-none);border-top-left-radius:var(--radius-none)}.rounded-t-none{border-top-left-radius:var(--radius-none)}.rounded-r-none,.rounded-t-none{border-top-right-radius:var(--radius-none)}.rounded-b-none,.rounded-r-none{border-bottom-right-radius:var(--radius-none)}.rounded-b-none{border-bottom-left-radius:var(--radius-none)}.rounded-br-none{border-bottom-right-radius:var(--radius-none)}.rounded-bl-none{border-bottom-left-radius:var(--radius-none)}.rounded-tr-none{border-top-right-radius:var(--radius-none)}.rounded-tl-none{border-top-left-radius:var(--radius-none)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.ring-border-light{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-light-rgb),var(--tw-ring-opacity))}.ring-border{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.ring-border-strong{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.ring-light{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05}.ring-gray{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.1}.ring-dark{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.2}.ring-darker{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.3}.ring-darkest{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.5}.ring-primary{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-500-rgb),var(--tw-ring-opacity))}.ring-secondary{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-secondary-500-rgb),var(--tw-ring-opacity))}.ring-warning{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-warning-500-rgb),var(--tw-ring-opacity))}.ring-success{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-success-500-rgb),var(--tw-ring-opacity))}.ring-danger{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-danger-500-rgb),var(--tw-ring-opacity))}.ring-important{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-important-500-rgb),var(--tw-ring-opacity))}.ring-special{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-special-500-rgb),var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-50-rgb),var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-100-rgb),var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-200-rgb),var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-300-rgb),var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-400-rgb),var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-500-rgb),var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-600-rgb),var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-700-rgb),var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-800-rgb),var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-900-rgb),var(--tw-ring-opacity))}.ring-gray-950{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-950-rgb),var(--tw-ring-opacity))}.ring-inverse{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity))}.ring-canvas{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-canvas-rgb),var(--tw-ring-opacity))}.ring-surface{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-rgb),var(--tw-ring-opacity))}.ring-fore{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-fore-rgb),var(--tw-ring-opacity))}.ring-transparent{--tw-ring-color:transparent}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-black-rgb),var(--tw-ring-opacity))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-white-rgb),var(--tw-ring-opacity))}.ring-inherit{--tw-ring-color:inherit}.ring-current{--tw-ring-color:currentColor}.ring-opacity-0{--tw-ring-opacity:0}.ring-opacity-5{--tw-ring-opacity:.05}.ring-opacity-10{--tw-ring-opacity:.1}.ring-opacity-20{--tw-ring-opacity:.2}.ring-opacity-30{--tw-ring-opacity:.3}.ring-opacity-40{--tw-ring-opacity:.4}.ring-opacity-50{--tw-ring-opacity:.5}.ring-opacity-60{--tw-ring-opacity:.6}.ring-opacity-70{--tw-ring-opacity:.7}.ring-opacity-80{--tw-ring-opacity:.8}.ring-opacity-90{--tw-ring-opacity:.9}.ring-opacity-100{--tw-ring-opacity:1}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-3{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-3,.ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-offset-0{--tw-ring-offset-width:0px}.ring-offset-1{--tw-ring-offset-width:1px}.ring-offset-2{--tw-ring-offset-width:2px}.ring-offset-4{--tw-ring-offset-width:4px}.ring-offset-8{--tw-ring-offset-width:8px}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--tw-shadow-colored:0 2px 6px -1px var(--tw-shadow-color),0 1px 4px -2px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--tw-shadow-colored:0 5px 15px -3px var(--tw-shadow-color),0 2px 6px -4px var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color)}.shadow-2xl,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--tw-shadow-colored:0 10px 50px -10px var(--tw-shadow-color),0 8px 20px -10px var(--tw-shadow-color)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.muted{opacity:var(--opacity-muted)}.opacity-0{opacity:0}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.opacity-100{opacity:1}.blur-none{--tw-blur:blur(0)}.blur-none,.blur-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-sm{--tw-blur:blur(4px)}.blur{--tw-blur:blur(8px)}.blur,.blur-md{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-md{--tw-blur:blur(12px)}.blur-lg{--tw-blur:blur(16px)}.blur-lg,.blur-xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-xl{--tw-blur:blur(24px)}.grayscale{--tw-grayscale:grayscale(100%)}.grayscale,.invert{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%)}.filter-none{filter:none!important}.drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.drop-shadow-none,.drop-shadow-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}.drop-shadow,.drop-shadow-md{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,.07)) drop-shadow(0 2px 2px rgba(0,0,0,.06))}.drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,.04)) drop-shadow(0 4px 3px rgba(0,0,0,.1))}.drop-shadow-lg,.drop-shadow-xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,.03)) drop-shadow(0 8px 5px rgba(0,0,0,.08))}.drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,.15));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-none{--tw-backdrop-blur:blur(0)}.backdrop-blur-none,.backdrop-blur-sm{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-blur-md{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.backdrop-blur-lg,.backdrop-blur-xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.backdrop-blur-2xl,.backdrop-blur-3xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-none{transition-property:none}.fade,.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{opacity:0;transition-duration:.15s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{--tw-scale-x:.9;--tw-scale-y:.9}.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-bottom{--tw-translate-y:25%}.fade-from-top{--tw-translate-y:-25%}.fade-from-left,.fade-from-top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-left{--tw-translate-x:-25%}.fade-from-right{--tw-translate-x:25%}.fade-from-bottom.in,.fade-from-center.in,.fade-from-left.in,.fade-from-right,.fade-from-right.in,.fade-from-top.in,.fade.in{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-bottom.in,.fade-from-center.in,.fade-from-left.in,.fade-from-right.in,.fade-from-top.in,.fade.in{--tw-translate-x:0px;--tw-translate-y:0px;--tw-scale-x:1;--tw-scale-y:1;opacity:1}.duration-75{transition-duration:75ms}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-1000{transition-duration:1s}@keyframes -spin{to{transform:rotate(1turn)}}.animate-spin,.spin{animation:-spin 1s linear infinite}@keyframes -ping{75%,to{opacity:0;transform:scale(2)}}.animate-ping,.ping{animation:-ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes -pulse{50%{opacity:.5}}.animate-pulse,.pulse{animation:-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes -bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.animate-bounce,.bounce{animation:-bounce 1s infinite}.animate-highlight,.highlight{animation:-highlight 2s ease-in-out infinite;outline-color:#fde047;outline-offset:-1px;outline-style:solid;outline-width:1px}@keyframes -highlight{50%{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity));outline-offset:-4px;outline-width:4px}}.scale-0{--tw-scale-x:0;--tw-scale-y:0}.scale-0,.scale-50{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.scale-75,.scale-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-100,.scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.scale-105,.scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.scale-125,.scale-150{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.flip-x{--tw-scale-x:-1}.flip-x,.flip-y{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.flip-y{--tw-scale-y:-1}.rotate-0{--tw-rotate:0deg}.rotate-0,.rotate-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-1{--tw-rotate:1deg}.rotate-2{--tw-rotate:2deg}.rotate-2,.rotate-3{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-3{--tw-rotate:3deg}.rotate-6{--tw-rotate:6deg}.rotate-12,.rotate-6{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-12{--tw-rotate:12deg}.rotate-45{--tw-rotate:45deg}.rotate-45,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg}.rotate-135{--tw-rotate:135deg}.rotate-135,.rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.rotate-270{--tw-rotate:270deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.basis-0{flex-basis:0px}.basis-1{flex-basis:0.25rem}.basis-2{flex-basis:0.5rem}.basis-3{flex-basis:0.75rem}.basis-4{flex-basis:1rem}.basis-5{flex-basis:1.25rem}.basis-6{flex-basis:1.5rem}.basis-7{flex-basis:1.75rem}.basis-8{flex-basis:2rem}.basis-9{flex-basis:2.25rem}.basis-10{flex-basis:2.5rem}.basis-11{flex-basis:2.75rem}.basis-12{flex-basis:3rem}.basis-14{flex-basis:3.5rem}.basis-16{flex-basis:4rem}.basis-20{flex-basis:5rem}.basis-24{flex-basis:6rem}.basis-28{flex-basis:7rem}.basis-32{flex-basis:8rem}.basis-36{flex-basis:9rem}.basis-40{flex-basis:10rem}.basis-44{flex-basis:11rem}.basis-48{flex-basis:12rem}.basis-52{flex-basis:13rem}.basis-56{flex-basis:14rem}.basis-60{flex-basis:15rem}.basis-64{flex-basis:16rem}.basis-72{flex-basis:18rem}.basis-80{flex-basis:20rem}.basis-96{flex-basis:24rem}.basis-auto{flex-basis:auto}.basis-px{flex-basis:1px}.basis-0\.5{flex-basis:0.125rem}.basis-1\.5{flex-basis:0.375rem}.basis-2\.5{flex-basis:0.625rem}.basis-3\.5{flex-basis:0.875rem}.basis-1\/2{flex-basis:50%}.basis-1\/3{flex-basis:33.333333%}.basis-2\/3{flex-basis:66.666667%}.basis-1\/4{flex-basis:25%}.basis-2\/4{flex-basis:50%}.basis-3\/4{flex-basis:75%}.basis-1\/5{flex-basis:20%}.basis-2\/5{flex-basis:40%}.basis-3\/5{flex-basis:60%}.basis-4\/5{flex-basis:80%}.basis-1\/6{flex-basis:16.666667%}.basis-2\/6{flex-basis:33.333333%}.basis-3\/6{flex-basis:50%}.basis-4\/6{flex-basis:66.666667%}.basis-5\/6{flex-basis:83.333333%}.basis-1\/12{flex-basis:8.333333%}.basis-2\/12{flex-basis:16.666667%}.basis-3\/12{flex-basis:25%}.basis-4\/12{flex-basis:33.333333%}.basis-5\/12{flex-basis:41.666667%}.basis-6\/12{flex-basis:50%}.basis-7\/12{flex-basis:58.333333%}.basis-8\/12{flex-basis:66.666667%}.basis-9\/12{flex-basis:75%}.basis-10\/12{flex-basis:83.333333%}.basis-11\/12{flex-basis:91.666667%}.basis-full{flex-basis:100%}.row{display:flex;flex-direction:row}.center,.col{display:flex;flex-direction:column}.center,.center-row{align-items:center;justify-content:center}.center-row{display:flex;flex-direction:row}.center-x,.center-y{align-items:center;display:flex}.center-y{flex-direction:column}.row-reverse{display:flex;flex-direction:row-reverse}.col-reverse{display:flex;flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.grow{flex-grow:1!important}.grow-0{flex-grow:0!important}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.gap-0{gap:0}.gap-x-0{-moz-column-gap:0;column-gap:0}.gap-y-0{row-gap:0}.gap-px{gap:1px}.gap-x-px{-moz-column-gap:1px;column-gap:1px}.gap-y-px{row-gap:1px}.gap-0\.5{gap:.125rem}.gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.gap-y-0\.5{row-gap:.125rem}.gap-3px{gap:3px}.gap-1{gap:.25rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-y-1{row-gap:.25rem}.gap-1\.5{gap:.375rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-y-1\.5{row-gap:.375rem}.gap-2{gap:.5rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-2{row-gap:.5rem}.gap-2\.5{gap:.625rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-y-2\.5{row-gap:.625rem}.gap-3{gap:.75rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-3{row-gap:.75rem}.gap-3\.5{gap:.875rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-y-3\.5{row-gap:.875rem}.gap-4{gap:1rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-4{row-gap:1rem}.gap-5{gap:1.25rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-5{row-gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-6{row-gap:1.5rem}.gap-7{gap:1.75rem}.gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.gap-y-7{row-gap:1.75rem}.gap-8{gap:2rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-8{row-gap:2rem}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.self-baseline{align-self:baseline}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-evenly{align-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}@font-face{font-display:fallback;font-family:D-DIN-PRO;font-weight:400;src:url(./fonts/D-DIN-PRO-400-Regular.otf)}@font-face{font-display:fallback;font-family:D-DIN-PRO;font-weight:500;src:url(./fonts/D-DIN-PRO-700-Bold.otf)}.num{font-family:D-DIN-PRO}@font-face{font-display:fallback;font-family:Nunito;font-weight:400;src:url(./fonts/Nunito-Regular.ttf)}@font-face{font-display:fallback;font-family:Nunito;font-weight:700;src:url(./fonts/Nunito-Bold.ttf)}@font-face{font-display:fallback;font-family:Nunito;font-weight:300;src:url(./fonts/Nunito-Light.ttf)}.font-brand{font-family:Nunito;font-weight:400}@supports not (gap:4px){.gap-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(1px*var(--tw-space-x-reverse))}.gap-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2px*(1 - var(--tw-space-x-reverse)));margin-right:calc(2px*var(--tw-space-x-reverse))}.gap-3px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(3px*(1 - var(--tw-space-x-reverse)));margin-right:calc(3px*var(--tw-space-x-reverse))}.gap-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.gap-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(6px*(1 - var(--tw-space-x-reverse)));margin-right:calc(6px*var(--tw-space-x-reverse))}.gap-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.gap-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(10px*(1 - var(--tw-space-x-reverse)));margin-right:calc(10px*var(--tw-space-x-reverse))}.gap-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.gap-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(14px*(1 - var(--tw-space-x-reverse)));margin-right:calc(14px*var(--tw-space-x-reverse))}.gap-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.gap-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.gap-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.gap-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.75rem*var(--tw-space-x-reverse))}.gap-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.col.gap-px>:not([hidden])~:not([hidden]),.gap-px.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1px*var(--tw-space-y-reverse));margin-top:calc(1px*(1 - var(--tw-space-y-reverse)))}.col.gap-0\.5>:not([hidden])~:not([hidden]),.gap-0\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2px*var(--tw-space-y-reverse));margin-top:calc(2px*(1 - var(--tw-space-y-reverse)))}.col.gap-3px>:not([hidden])~:not([hidden]),.gap-3px.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(3px*var(--tw-space-y-reverse));margin-top:calc(3px*(1 - var(--tw-space-y-reverse)))}.col.gap-1>:not([hidden])~:not([hidden]),.gap-1.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.col.gap-1\.5>:not([hidden])~:not([hidden]),.gap-1\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(6px*var(--tw-space-y-reverse));margin-top:calc(6px*(1 - var(--tw-space-y-reverse)))}.col.gap-2>:not([hidden])~:not([hidden]),.gap-2.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.col.gap-2\.5>:not([hidden])~:not([hidden]),.gap-2\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(10px*var(--tw-space-y-reverse));margin-top:calc(10px*(1 - var(--tw-space-y-reverse)))}.col.gap-3>:not([hidden])~:not([hidden]),.gap-3.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.col.gap-3\.5>:not([hidden])~:not([hidden]),.gap-3\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(14px*var(--tw-space-y-reverse));margin-top:calc(14px*(1 - var(--tw-space-y-reverse)))}.col.gap-4>:not([hidden])~:not([hidden]),.gap-4.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.col.gap-5>:not([hidden])~:not([hidden]),.gap-5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.col.gap-6>:not([hidden])~:not([hidden]),.gap-6.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.col.gap-7>:not([hidden])~:not([hidden]),.gap-7.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.75rem*var(--tw-space-y-reverse));margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)))}.col.gap-8>:not([hidden])~:not([hidden]),.gap-8.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.nav-item>a>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}} \ No newline at end of file diff --git a/www/js/zui3/zui.zentao.js b/www/js/zui3/zui.zentao.js index 288e97ae61..b1ac5e7a6a 100644 --- a/www/js/zui3/zui.zentao.js +++ b/www/js/zui3/zui.zentao.js @@ -1,11 +1,11 @@ -var uu=(I,et,Dt)=>{if(!et.has(I))throw TypeError("Cannot "+Dt)};var $t=(I,et,Dt)=>(uu(I,et,"read from private field"),Dt?Dt.call(I):et.get(I)),zt=(I,et,Dt)=>{if(et.has(I))throw TypeError("Cannot add the same private member more than once");et instanceof WeakSet?et.add(I):et.set(I,Dt)},Bt=(I,et,Dt,Ua)=>(uu(I,et,"write to private field"),Ua?Ua.call(I,Dt):et.set(I,Dt),Dt);var du=(I,et,Dt)=>(uu(I,et,"access private method"),Dt);(function(I,et){typeof exports=="object"&&typeof module<"u"?et(exports):typeof define=="function"&&define.amd?define(["exports"],et):(I=typeof globalThis<"u"?globalThis:I||self,et(I.zui={}))})(this,function(I){var fa,pa,or,ar,lr,cr,hr,ur,ma,rg,ga,og,Wn,Un;"use strict";const et="",Dt="",Ua="",Ww="",Uw="",Vw="",Kw="",qw="",Gw="",Yw="",Qw="",Xw="",ug="3.0.0",dg="production",cn=document,$r=window,mu=cn.documentElement,ei=cn.createElement.bind(cn),gu=ei("div"),Va=ei("table"),fg=ei("tbody"),yu=ei("tr"),{isArray:Dr,prototype:_u}=Array,{concat:pg,filter:Ka,indexOf:vu,map:bu,push:mg,slice:wu,some:qa,splice:gg}=_u,yg=/^#(?:[\w-]|\\.|[^\x00-\xa0])*$/,_g=/^\.(?:[\w-]|\\.|[^\x00-\xa0])*$/,vg=/<.+>/,bg=/^\w+$/;function Ga(i,e){const t=wg(e);return!i||!t&&!ti(e)&&!nt(e)?[]:!t&&_g.test(i)?e.getElementsByClassName(i.slice(1).replace(/\\/g,"")):!t&&bg.test(i)?e.getElementsByTagName(i):e.querySelectorAll(i)}class Ir{constructor(e,t){if(!e)return;if(Ya(e))return e;let n=e;if(vt(e)){const s=t||cn;if(n=yg.test(e)&&ti(s)?s.getElementById(e.slice(1).replace(/\\/g,"")):vg.test(e)?$u(e):Ya(s)?s.find(e):vt(s)?y(s).find(e):Ga(e,s),!n)return}else if(ni(e))return this.ready(e);(n.nodeType||n===$r)&&(n=[n]),this.length=n.length;for(let s=0,r=this.length;s{for(;e.firstChild;)e.removeChild(e.firstChild)})};function Nr(...i){const e=xg(i[0])?i.shift():!1,t=i.shift(),n=i.length;if(!t)return{};if(!n)return Nr(e,y,t);for(let s=0;s{nt(r)&&ht(t,(o,a)=>{n?e?r.classList.add(a):r.classList.remove(a):r.classList.toggle(a)})})},ie.addClass=function(i){return this.toggleClass(i,!0)},ie.removeAttr=function(i){const e=Mr(i);return this.each((t,n)=>{nt(n)&&ht(e,(s,r)=>{n.removeAttribute(r)})})};function Sg(i,e){if(i){if(vt(i)){if(arguments.length<2){if(!this[0]||!nt(this[0]))return;const t=this[0].getAttribute(i);return gs(t)?void 0:t}return It(e)?this:gs(e)?this.removeAttr(i):this.each((t,n)=>{nt(n)&&n.setAttribute(i,e)})}for(const t in i)this.attr(t,i[t]);return this}}ie.attr=Sg,ie.removeClass=function(i){return arguments.length?this.toggleClass(i,!1):this.attr("class","")},ie.hasClass=function(i){return!!i&&qa.call(this,e=>nt(e)&&e.classList.contains(i))},ie.get=function(i){return It(i)?wu.call(this):(i=Number(i),this[i<0?i+this.length:i])},ie.eq=function(i){return y(this.get(i))},ie.first=function(){return this.eq(0)},ie.last=function(){return this.eq(-1)};function Tg(i){return It(i)?this.get().map(e=>nt(e)||Cg(e)?e.textContent:"").join(""):this.each((e,t)=>{nt(t)&&(t.textContent=i)})}ie.text=Tg;function hn(i,e,t){if(!nt(i))return;const n=$r.getComputedStyle(i,null);return t?n.getPropertyValue(e)||void 0:n[e]||i.style[e]}function Yt(i,e){return parseInt(hn(i,e),10)||0}function xu(i,e){return Yt(i,`border${e?"Left":"Top"}Width`)+Yt(i,`padding${e?"Left":"Top"}`)+Yt(i,`padding${e?"Right":"Bottom"}`)+Yt(i,`border${e?"Right":"Bottom"}Width`)}const Xa={};function $g(i){if(Xa[i])return Xa[i];const e=ei(i);cn.body.insertBefore(e,null);const t=hn(e,"display");return cn.body.removeChild(e),Xa[i]=t!=="none"?t:"block"}function ku(i){return hn(i,"display")==="none"}function Su(i,e){const t=i&&(i.matches||i.webkitMatchesSelector||i.msMatchesSelector);return!!t&&!!e&&t.call(i,e)}function Pr(i){return vt(i)?(e,t)=>Su(t,i):ni(i)?i:Ya(i)?(e,t)=>i.is(t):i?(e,t)=>t===i:()=>!1}ie.filter=function(i){const e=Pr(i);return y(Ka.call(this,(t,n)=>e.call(t,n,t)))};function kn(i,e){return e?i.filter(e):i}ie.detach=function(i){return kn(this,i).each((e,t)=>{t.parentNode&&t.parentNode.removeChild(t)}),this};const Dg=/^\s*<(\w+)[^>]*>/,Ig=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,Tu={"*":gu,tr:fg,td:yu,th:yu,thead:Va,tbody:Va,tfoot:Va};function $u(i){if(!vt(i))return[];if(Ig.test(i))return[ei(RegExp.$1)];const e=Dg.test(i)&&RegExp.$1,t=Tu[e]||Tu["*"];return t.innerHTML=i,y(t.childNodes).detach().get()}y.parseHTML=$u,ie.has=function(i){const e=vt(i)?(t,n)=>Ga(i,n).length:(t,n)=>n.contains(i);return this.filter(e)},ie.not=function(i){const e=Pr(i);return this.filter((t,n)=>(!vt(i)||nt(n))&&!e.call(n,t,n))};function un(i,e,t,n){const s=[],r=ni(e),o=n&&Pr(n);for(let a=0,l=i.length;ae.selected&&!e.disabled&&!e.parentNode.disabled),"value"):i.value||""}function Ng(i){return arguments.length?this.each((e,t)=>{const n=t.multiple&&t.options;if(n||Fu.test(t.type)){const s=Dr(i)?bu.call(i,String):gs(i)?[]:[String(i)];n?ht(t.options,(r,o)=>{o.selected=s.indexOf(o.value)>=0},!0):t.checked=s.indexOf(t.value)>=0}else t.value=It(i)||gs(i)?"":i}):this[0]&&Du(this[0])}ie.val=Ng,ie.is=function(i){const e=Pr(i);return qa.call(this,(t,n)=>e.call(t,n,t))},y.guid=1;function Qt(i){return i.length>1?Ka.call(i,(e,t,n)=>vu.call(n,e)===t):i}y.unique=Qt,ie.add=function(i,e){return y(Qt(this.get().concat(y(i,e).get())))},ie.children=function(i){return kn(y(Qt(un(this,e=>e.children))),i)},ie.parent=function(i){return kn(y(Qt(un(this,"parentNode"))),i)},ie.index=function(i){const e=i?y(i)[0]:this[0],t=i?this:y(e).parent().children();return vu.call(t,e)},ie.closest=function(i){const e=this.filter(i);if(e.length)return e;const t=this.parent();return t.length?t.closest(i):e},ie.siblings=function(i){return kn(y(Qt(un(this,e=>y(e).parent().children().not(e)))),i)},ie.find=function(i){return y(Qt(un(this,e=>Ga(i,e))))};const Mg=/^\s*\s*$/g,Pg=/^$|^module$|\/(java|ecma)script/i,Eg=["type","src","nonce","noModule"];function Ag(i,e){const t=y(i);t.filter("script").add(t.find("script")).each((n,s)=>{if(Pg.test(s.type)&&mu.contains(s)){const r=ei("script");r.text=s.textContent.replace(Mg,""),ht(Eg,(o,a)=>{s[a]&&(r[a]=s[a])}),e.head.insertBefore(r,null),e.head.removeChild(r)}})}function Lg(i,e,t,n,s){n?i.insertBefore(e,t?i.firstChild:null):i.nodeName==="HTML"?i.parentNode.replaceChild(e,i):i.parentNode.insertBefore(e,t?i:i.nextSibling),s&&Ag(e,i.ownerDocument)}function Sn(i,e,t,n,s,r,o,a){return ht(i,(l,c)=>{ht(y(c),(d,u)=>{ht(y(e),(p,g)=>{const b=t?u:g,C=t?g:u,S=t?d:p;Lg(b,S?C.cloneNode(!0):C,n,s,!S)},a)},o)},r),e}ie.after=function(){return Sn(arguments,this,!1,!1,!1,!0,!0)},ie.append=function(){return Sn(arguments,this,!1,!1,!0)};function Rg(i){if(!arguments.length)return this[0]&&this[0].innerHTML;if(It(i))return this;const e=/]/.test(i);return this.each((t,n)=>{nt(n)&&(e?y(n).empty().append(i):n.innerHTML=i)})}ie.html=Rg,ie.appendTo=function(i){return Sn(arguments,this,!0,!1,!0)},ie.wrapInner=function(i){return this.each((e,t)=>{const n=y(t),s=n.contents();s.length?s.wrapAll(i):n.append(i)})},ie.before=function(){return Sn(arguments,this,!1,!0)},ie.wrapAll=function(i){let e=y(i),t=e[0];for(;t.children.length;)t=t.firstElementChild;return this.first().before(e),this.appendTo(t)},ie.wrap=function(i){return this.each((e,t)=>{const n=y(i)[0];y(t).wrapAll(e?n.cloneNode(!0):n)})},ie.insertAfter=function(i){return Sn(arguments,this,!0,!1,!1,!1,!1,!0)},ie.insertBefore=function(i){return Sn(arguments,this,!0,!0)},ie.prepend=function(){return Sn(arguments,this,!1,!0,!0,!0,!0)},ie.prependTo=function(i){return Sn(arguments,this,!0,!0,!0,!1,!1,!0)},ie.contents=function(){return y(Qt(un(this,i=>i.tagName==="IFRAME"?[i.contentDocument]:i.tagName==="TEMPLATE"?i.content.childNodes:i.childNodes)))},ie.next=function(i,e,t){return kn(y(Qt(un(this,"nextElementSibling",e,t))),i)},ie.nextAll=function(i){return this.next(i,!0)},ie.nextUntil=function(i,e){return this.next(e,!0,i)},ie.parents=function(i,e){return kn(y(Qt(un(this,"parentElement",!0,e))),i)},ie.parentsUntil=function(i,e){return this.parents(e,i)},ie.prev=function(i,e,t){return kn(y(Qt(un(this,"previousElementSibling",e,t))),i)},ie.prevAll=function(i){return this.prev(i,!0)},ie.prevUntil=function(i,e){return this.prev(e,!0,i)},ie.map=function(i){return y(pg.apply([],bu.call(this,(e,t)=>i.call(e,t,e))))},ie.clone=function(){return this.map((i,e)=>e.cloneNode(!0))},ie.offsetParent=function(){return this.map((i,e)=>{let t=e.offsetParent;for(;t&&hn(t,"position")==="static";)t=t.offsetParent;return t||mu})},ie.slice=function(i,e){return y(wu.call(this,i,e))};const Og=/-([a-z])/g;function Ja(i){return i.replace(Og,(e,t)=>t.toUpperCase())}ie.ready=function(i){const e=()=>setTimeout(i,0,y);return cn.readyState!=="loading"?e():cn.addEventListener("DOMContentLoaded",e),this},ie.unwrap=function(){return this.parent().each((i,e)=>{if(e.tagName==="BODY")return;const t=y(e);t.replaceWith(t.children())}),this},ie.offset=function(){const i=this[0];if(!i)return;const e=i.getBoundingClientRect();return{top:e.top+$r.pageYOffset,left:e.left+$r.pageXOffset}},ie.position=function(){const i=this[0];if(!i)return;const e=hn(i,"position")==="fixed",t=e?i.getBoundingClientRect():this.offset();if(!e){const n=i.ownerDocument;let s=i.offsetParent||n.documentElement;for(;(s===n.body||s===n.documentElement)&&hn(s,"position")==="static";)s=s.parentNode;if(s!==i&&nt(s)){const r=y(s).offset();t.top-=r.top+Yt(s,"borderTopWidth"),t.left-=r.left+Yt(s,"borderLeftWidth")}}return{top:t.top-Yt(i,"marginTop"),left:t.left-Yt(i,"marginLeft")}};const Iu={class:"className",contenteditable:"contentEditable",for:"htmlFor",readonly:"readOnly",maxlength:"maxLength",tabindex:"tabIndex",colspan:"colSpan",rowspan:"rowSpan",usemap:"useMap"};ie.prop=function(i,e){if(i){if(vt(i))return i=Iu[i]||i,arguments.length<2?this[0]&&this[0][i]:this.each((t,n)=>{n[i]=e});for(const t in i)this.prop(t,i[t]);return this}},ie.removeProp=function(i){return this.each((e,t)=>{delete t[Iu[i]||i]})};const zg=/^--/;function Za(i){return zg.test(i)}const el={},{style:Fg}=gu,jg=["webkit","moz","ms"];function Bg(i,e=Za(i)){if(e)return i;if(!el[i]){const t=Ja(i),n=`${t[0].toUpperCase()}${t.slice(1)}`,s=`${t} ${jg.join(`${n} `)}${n}`.split(" ");ht(s,(r,o)=>{if(o in Fg)return el[i]=o,!1})}return el[i]}const Hg={animationIterationCount:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0};function Nu(i,e,t=Za(i)){return!t&&!Hg[i]&&Cu(e)?`${e}px`:e}function Wg(i,e){if(vt(i)){const t=Za(i);return i=Bg(i,t),arguments.length<2?this[0]&&hn(this[0],i,t):i?(e=Nu(i,e,t),this.each((n,s)=>{nt(s)&&(t?s.style.setProperty(i,e):s.style[i]=e)})):this}for(const t in i)this.css(t,i[t]);return this}ie.css=Wg;function Mu(i,e){try{return i(e)}catch{return e}}const Ug=/^\s+|\s+$/;function Pu(i,e){const t=i.dataset[e]||i.dataset[Ja(e)];return Ug.test(t)?t:Mu(JSON.parse,t)}function Vg(i,e,t){t=Mu(JSON.stringify,t),i.dataset[Ja(e)]=t}function Kg(i,e){if(!i){if(!this[0])return;const t={};for(const n in this[0].dataset)t[n]=Pu(this[0],n);return t}if(vt(i))return arguments.length<2?this[0]&&Pu(this[0],i):It(e)?this:this.each((t,n)=>{Vg(n,i,e)});for(const t in i)this.data(t,i[t]);return this}ie.data=Kg;function Eu(i,e){const t=i.documentElement;return Math.max(i.body[`scroll${e}`],t[`scroll${e}`],i.body[`offset${e}`],t[`offset${e}`],t[`client${e}`])}ht([!0,!1],(i,e)=>{ht(["Width","Height"],(t,n)=>{const s=`${e?"outer":"inner"}${n}`;ie[s]=function(r){if(this[0])return Di(this[0])?e?this[0][`inner${n}`]:this[0].document.documentElement[`client${n}`]:ti(this[0])?Eu(this[0],n):this[0][`${e?"offset":"client"}${n}`]+(r&&e?Yt(this[0],`margin${t?"Top":"Left"}`)+Yt(this[0],`margin${t?"Bottom":"Right"}`):0)}})}),ht(["Width","Height"],(i,e)=>{const t=e.toLowerCase();ie[t]=function(n){if(!this[0])return It(n)?void 0:this;if(!arguments.length)return Di(this[0])?this[0].document.documentElement[`client${e}`]:ti(this[0])?Eu(this[0],e):this[0].getBoundingClientRect()[t]-xu(this[0],!i);const s=parseInt(n,10);return this.each((r,o)=>{if(!nt(o))return;const a=hn(o,"boxSizing");o.style[t]=Nu(t,s+(a==="border-box"?xu(o,!i):0))})}});const Au="___cd";ie.toggle=function(i){return this.each((e,t)=>{if(!nt(t))return;const n=ku(t);(It(i)?n:i)?(t.style.display=t[Au]||"",ku(t)&&(t.style.display=$g(t.tagName))):n||(t[Au]=hn(t,"display"),t.style.display="none")})},ie.hide=function(){return this.toggle(!1)},ie.show=function(){return this.toggle(!0)};const Lu="___ce",tl=".",nl={focus:"focusin",blur:"focusout"},Ru={mouseenter:"mouseover",mouseleave:"mouseout"},qg=/^(mouse|pointer|contextmenu|drag|drop|click|dblclick)/i;function il(i){return Ru[i]||nl[i]||i}function sl(i){const e=i.split(tl);return[e[0],e.slice(1).sort()]}ie.trigger=function(i,e){if(vt(i)){const[n,s]=sl(i),r=il(n);if(!r)return this;const o=qg.test(r)?"MouseEvents":"HTMLEvents";i=cn.createEvent(o),i.initEvent(r,!0,!0),i.namespace=s.join(tl),i.___ot=n}i.___td=e;const t=i.___ot in nl;return this.each((n,s)=>{t&&ni(s[i.___ot])&&(s[`___i${i.type}`]=!0,s[i.___ot](),s[`___i${i.type}`]=!1),s.dispatchEvent(i)})};function Ou(i){return i[Lu]=i[Lu]||{}}function Gg(i,e,t,n,s){const r=Ou(i);r[e]=r[e]||[],r[e].push([t,n,s]),i.addEventListener(e,s)}function zu(i,e){return!e||!qa.call(e,t=>i.indexOf(t)<0)}function Er(i,e,t,n,s){const r=Ou(i);if(e)r[e]&&(r[e]=r[e].filter(([o,a,l])=>{if(s&&l.guid!==s.guid||!zu(o,t)||n&&n!==a)return!0;i.removeEventListener(e,l)}));else for(e in r)Er(i,e,t,n,s)}ie.off=function(i,e,t){if(It(i))this.each((n,s)=>{!nt(s)&&!ti(s)&&!Di(s)||Er(s)});else if(vt(i))ni(e)&&(t=e,e=""),ht(Mr(i),(n,s)=>{const[r,o]=sl(s),a=il(r);this.each((l,c)=>{!nt(c)&&!ti(c)&&!Di(c)||Er(c,a,o,e,t)})});else for(const n in i)this.off(n,i[n]);return this},ie.remove=function(i){return kn(this,i).detach().off(),this},ie.replaceWith=function(i){return this.before(i).remove()},ie.replaceAll=function(i){return y(i).replaceWith(this),this};function Yg(i,e,t,n,s){if(!vt(i)){for(const r in i)this.on(r,e,t,i[r],s);return this}return vt(e)||(It(e)||gs(e)?e="":It(t)?(t=e,e=""):(n=t,t=e,e="")),ni(n)||(n=t,t=void 0),n?(ht(Mr(i),(r,o)=>{const[a,l]=sl(o),c=il(a),d=a in Ru,u=a in nl;c&&this.each((p,g)=>{if(!nt(g)&&!ti(g)&&!Di(g))return;const b=function(C){if(C.target[`___i${C.type}`])return C.stopImmediatePropagation();if(C.namespace&&!zu(l,C.namespace.split(tl))||!e&&(u&&(C.target!==g||C.___ot===c)||d&&C.relatedTarget&&g.contains(C.relatedTarget)))return;let S=g;if(e){let D=C.target;for(;!Su(D,e);)if(D===g||(D=D.parentNode,!D))return;S=D}Object.defineProperty(C,"currentTarget",{configurable:!0,get(){return S}}),Object.defineProperty(C,"delegateTarget",{configurable:!0,get(){return g}}),Object.defineProperty(C,"data",{configurable:!0,get(){return t}});const x=n.call(S,C,C.___td);s&&Er(g,c,l,e,b),x===!1&&(C.preventDefault(),C.stopPropagation())};b.guid=n.guid=n.guid||y.guid++,Gg(g,c,l,e,b)})}),this):this}ie.on=Yg;function Qg(i,e,t,n){return this.on(i,e,t,n,!0)}ie.one=Qg;const Xg=/\r?\n/g;function Jg(i,e){return`&${encodeURIComponent(i)}=${encodeURIComponent(e.replace(Xg,`\r -`))}`}const Zg=/file|reset|submit|button|image/i,Fu=/radio|checkbox/i;ie.serialize=function(){let i="";return this.each((e,t)=>{ht(t.elements||[t],(n,s)=>{if(s.disabled||!s.name||s.tagName==="FIELDSET"||Zg.test(s.type)||Fu.test(s.type)&&!s.checked)return;const r=Du(s);if(!It(r)){const o=Dr(r)?r:[r];ht(o,(a,l)=>{i+=Jg(s.name,l)})}})}),i.slice(1)},window.$=y;function ju(i,e){if(i==null)return[i,void 0];typeof e=="string"&&(e=e.split("."));const t=e.join(".");let n=i;const s=[n];for(;typeof n=="object"&&n!==null&&e.length;){let r=e.shift(),o;const a=r.indexOf("[");if(a>0&&a{const s=t[n]??"";i=i.replace(new RegExp(`\\{${n}\\}`,"g"),`${s}`)}),i}for(let t=0;t(i[i.B=1]="B",i[i.KB=1024]="KB",i[i.MB=1048576]="MB",i[i.GB=1073741824]="GB",i[i.TB=1099511627776]="TB",i))(rl||{});function ft(i,e=2,t){return Number.isNaN(i)?"?KB":(t||(i<1024?t="B":i<1048576?t="KB":i<1073741824?t="MB":i<1099511627776?t="GB":t="TB"),(i/rl[t]).toFixed(e)+t)}const $n=i=>{const e=/^[0-9]*(B|KB|MB|GB|TB)$/;i=i.toUpperCase();const t=i.match(e);if(!t)return 0;const n=t[1];return i=i.replace(n,""),Number.parseInt(i,10)*rl[n]};let ol=(document.documentElement.getAttribute("lang")||"zh_cn").toLowerCase().replace("-","_"),dn;function ey(){return ol}function ty(i){ol=i.toLowerCase().replace("-","_")}function Bu(i,e){dn||(dn={}),typeof i=="string"&&(i={[i]:e??{}}),y.extend(!0,dn,i)}function Ne(i,e,t,n,s,r){Array.isArray(i)?dn&&i.unshift(dn):i=dn?[dn,i]:[i],typeof t=="string"&&(r=s,s=n,n=t,t=void 0);const o=s||ol;let a;for(const l of i){if(!l)continue;const c=l[o]||l.default;if(!c)continue;const d=r&&l===dn?`${r}.${e}`:e;if(a=ys(c,d),a!==void 0)break}return a===void 0?n:t?Ce(a,...Array.isArray(t)?t:[t]):a}function ny(i,e,t,n){return Ne(void 0,i,e,t,n)}Ne.addLang=Bu,Ne.getLang=ny,Ne.getCode=ey,Ne.setCode=ty,Ne.map=dn,Bu({zh_cn:{confirm:"确定",save:"保存",cancel:"取消",delete:"删除",reset:"重置",add:"添加",copy:"复制",close:"关闭"},zh_tw:{confirm:"確定",save:"儲存",cancel:"取消",delete:"刪除",reset:"重置",add:"添加",Copy:"複製",close:"關閉"},en:{confirm:"Confirm",save:"Save",cancel:"Cancel",delete:"Delete",reset:"Reset",add:"Add",copy:"Copy",close:"Close"}});function Hu(i,e,t){i instanceof Headers?i.set(e,t):Array.isArray(i)?i.push([e,t]):i[e]=t}function Ii(i,e,t){t!=null&&(Array.isArray(t)?t.forEach(n=>Ii(i,e,n)):!(t instanceof Blob)&&y.isPlainObject(t)?Object.entries(t).forEach(([n,s])=>{Ii(i,`${e}[${n}]`,s)}):i.append(e,t instanceof Blob?t:String(t)))}function iy(i,e){if(i){const t={text:"text/plain",html:"text/html",json:"application/json",...e};for(const[n,s]of Object.entries(t))if(s.split(",").map(r=>r.trim()).includes(i))return n}return"text"}function Ar(i,e){const t=e||new FormData;return i&&(typeof i=="string"&&(i=new URLSearchParams(i)),i instanceof URLSearchParams?i.forEach((n,s)=>{Ii(t,s,n)}):Array.isArray(i)?i.forEach(([n,s])=>{Ii(t,n,s)}):i instanceof FormData?i.forEach((n,s)=>{Ii(t,s,n)}):y.isPlainObject(i)&&Object.entries(i).forEach(([n,s])=>{Ii(t,n,s)})),t}class _s{get completed(){return this.data!==void 0||this.error!==void 0}get[Symbol.toStringTag](){return"Ajax"}constructor(e){this.setting=e,this._controller=new AbortController,this._callbacks={success:[],error:[],complete:[]}}on(e,t){return this._callbacks[e].push(t),this}success(e){return this.on("success",e)}done(e){return this.success(e)}fail(e){return this.on("error",e)}complete(e){return this.on("complete",e)}always(e){return this.complete(e)}then(e,t){return this.completed?t&&this.error?t(this.error):e(this.data):(this.success(n=>e(n)),t&&this.fail(t)),this}catch(e){return this.error?(e(this.error),this):this.on("error",t=>e(t))}finally(e){return this.completed?(e(),this):this.complete(()=>e())}abort(e){return this.completed?!1:(this._abortError=e,this._controller.abort(),!0)}getResponseHeader(e){var t;return(t=this.response)==null?void 0:t.headers.get(e)}_init(){if(this.completed)return;const{url:e,type:t,data:n,processData:s=!0,contentType:r,crossDomain:o,accepts:a,dataType:l,timeout:c,dataFilter:d,beforeSend:u,success:p,error:g,complete:b,...C}=this.setting;t&&(C.method=t);let S=n;S&&(s&&(S=Ar(S)),C.body=S),o&&(C.mode="cors");const x=C.headers||{};Hu(x,"X-Requested-With","XMLHttpRequest"),r&&Hu(x,"Content-Type",r),C.headers=x,C.signal&&C.signal.addEventListener("abort",()=>{this.abort()});const D=[...this.constructor.globalBeforeSends,u];for(const P of D){if(!P)continue;const B=P.call(this,C);if(B===!1)return;B&&Object.assign(C,B)}p&&this.success(p),g&&this.fail(g),b&&this.complete(b),C.signal=this._controller.signal,this.url=e,this.request=C}_emit(e,...t){this._callbacks[e].forEach(n=>{n.call(this,...t)})}async send(){var d;if(this.completed)return[];this._init();const{timeout:e,dataType:t,accepts:n,dataFilter:s,throws:r,jsonParser:o}=this.setting;e&&(this._timeoutID=window.setTimeout(()=>{this.abort(new Error("timeout"))},e));let a,l,c;try{a=await fetch(this.url,this.request),this.response=a;const{statusText:u}=a;if(a.ok){const p=(d=a.headers.get("Content-Disposition"))==null?void 0:d.startsWith("attachment"),g=p?"blob":t||iy(a.headers.get("Content-Type"),n);p||g==="blob"||g==="file"?c=await a.blob():g==="json"?typeof o=="function"?(c=await a.text(),c=o(c)):c=await a.json():c=await a.text(),this.data=c;const b=(s==null?void 0:s(c,g))??c;this._emit("success",b,u,a)}else throw this.data=await a.text(),new Error(u)}catch(u){this.data===void 0&&c!==void 0&&(this.data=c),l=u;let p=!1;l.name==="AbortError"&&(this._abortError?l=this._abortError:p=!0),this.error=l,p||this._emit("error",l,a==null?void 0:a.statusText,l.message)}if(this._timeoutID&&clearTimeout(this._timeoutID),this._emit("complete",a,a==null?void 0:a.statusText),l&&r)throw l;return[c,l,a]}}_s.globalBeforeSends=[],y.ajax=(i,e)=>{e=e||{},typeof i=="string"?e.url=i:y.extend(e,i);const t=new _s(e);return t.send(),t},y.getJSON=(i,e,t)=>(typeof e=="function"&&(t=e,e=void 0),y.ajax({url:i,data:e,success:t,dataType:"json"})),y.get=(i,e,t,n,s="GET")=>{let r,o;return typeof e=="function"?(r=e,o=void 0):o=e,typeof t=="function"?(r=t,n=void 0):n=t,y.ajax({method:s,url:i,data:o,success:r,dataType:n})},y.post=(i,e,t,n)=>y.get(i,e,t,n,"POST"),y.fn.load=function(i,e,t){typeof e=="function"&&(t=e,e=void 0);const[n,s]=i.split(" ");return y.get(n,e,(r,o,a)=>{s&&(r=y(r).find(s).html()),y(this).html(r).zuiInit(),t==null||t.call(this,r,o,a)},"html"),this};async function kt(i,e=[],t,n,s){const r={throws:!0,dataType:"json"};if(typeof i=="string")r.url=i;else if(typeof i=="object")y.extend(r,i);else if(typeof i=="function"){const l=i.call(n,...e);return l instanceof Promise?await l:l}t&&y.extend(r,typeof t=="function"?t(r):t),r.url&&(r.url=Ce(r.url,...e));const o=new _s(r);s==null||s(o);const[a]=await o.send();return a}function al(i){return!!(i&&(typeof i=="string"||typeof i=="object"&&i.url||typeof i=="function"))}y.fetch=kt;function pt(){return y.guid++}function Lr(i,e){if(i===e)return!1;if(i&&e){const t=typeof i,n=typeof e;if(t!==n)return!0;if(t==="object"&&n==="object"){const s=Array.isArray(i),r=Array.isArray(e);if(s!==r)return!0;if(s&&r){if(i.length!==e.length)return!0;for(let l=0;ln instanceof ii?n.value!==t[s]:Lr(n,t[s])))&&(this._value=this._compute(),this._lastDependencies=e.map(n=>n instanceof ii?n.cache:n)),this._value}}function ll(...i){const e=[],t=new Map,n=(s,r)=>{if(Array.isArray(s)&&(r=s[1],s=s[0]),!s.length)return;const o=t.get(s);typeof o=="number"?e[o][1]=!!r:(t.set(s,e.length),e.push([s,!!r]))};return i.forEach(s=>{typeof s=="function"&&(s=s()),Array.isArray(s)?ll(...s).forEach(n):s&&typeof s=="object"?Object.entries(s).forEach(n):typeof s=="string"&&s.split(" ").forEach(r=>n(r,!0))}),e.sort((s,r)=>(t.get(s[0])||0)-(t.get(r[0])||0))}const V=(...i)=>ll(...i).reduce((e,[t,n])=>(n&&e.push(t),e),[]).join(" ");y.classes=V,y.fn.setClass=function(i,...e){return this.each((t,n)=>{const s=y(n);i===!0?s.attr("class",V(s.attr("class"),...e)):s.addClass(V(i,...e))})};const Ni=new WeakMap;function Rr(i,e,t){const n=Ni.has(i),s=n?Ni.get(i):{};typeof e=="string"?s[e]=t:e===null?Object.keys(s).forEach(r=>{delete s[r]}):Object.assign(s,e),Object.keys(s).forEach(r=>{s[r]===void 0&&delete s[r]}),Object.keys(s).length?(!n&&i instanceof Element&&Object.assign(s,y(i).dataset(),s),Ni.set(i,s)):Ni.delete(i)}function vs(i,e,t){let n=Ni.get(i)||{};return t&&i instanceof Element&&(n=Object.assign({},y(i).dataset(),n)),e===void 0?n:n[e]}function sy(i){Ni.delete(i)}y.fn.dataset=y.fn.data,y.fn.data=function(...i){const[e,t]=i;return!i.length||i.length===1&&typeof e=="string"?this.length?vs(this[0],e,!0):void 0:this.each((n,s)=>Rr(s,e,t))},y.fn.removeData=function(i=null){return this.each((e,t)=>Rr(t,i))};function si(i,...e){return i.includes("RAWJS")&&(i=i.split('"RAWJS<').join("").split('>RAWJS"').join("").split("").join('"').split("").join(` -`)),new Function(`return ${i}`)(...e)}function cl(i,...e){return i.includes("RAWJS")?si(i,...e):JSON.parse(i)}function ry(i){return JSON.stringify(i,(e,t)=>{if(typeof t=="function")return`RAWJS<${t.toString().split('"').join("").split(` -`).join("")}>RAWJS`})}function Mi(i,e){const t=y(i)[0];if(!t)return;const{prefix:n,getter:s,evalValue:r,json:o=!0,evalArgs:a=[]}={prefix:"z-",...typeof e=="string"?{prefix:e}:e},l=Array.isArray(r)?new Set(r):void 0;return Array.from(t.attributes).reduce((c,d)=>{let{name:u}=d;const{value:p}=d;let g=p;if(u.startsWith(n)){if(u=u.slice(n.length).replace(/-([a-z])/g,b=>b[1].toUpperCase()),s)g=s(u,p);else try{r&&(!l||l.has(u))||r===void 0&&p.includes("RAWJS")?g=si(p,...a):o&&(g=JSON.parse(p))}catch{}c[u]=g}return c},{})}function hl(i,e,t="z-"){const n=y(i);Object.keys(e).forEach(s=>{let r=e[s];typeof r=="function"&&(r=`RAWJS<${r}>RAWJS`),typeof r!="string"&&(r=JSON.stringify(r)),s=s.replace(/[A-Z]/g,o=>`-${o.toLowerCase()}`),n.attr(`${t}${s}`,r)})}function oy(...i){var t;const e=i.length;if(!e)return Mi(this);if(e===1){const[n]=i;return typeof n=="string"?(t=Mi(this))==null?void 0:t[n]:(y.isPlainObject(n)&&hl(this,n),this)}return hl(this,{[i[0]]:i[1]}),this}y.fn.z=oy,y.fn._attr=y.fn.attr,y.fn.extend({attr(...i){const[e,t]=i;return!i.length||i.length===1&&typeof e=="string"?this._attr.apply(this,i):typeof e=="object"?(e&&Object.keys(e).forEach(n=>{const s=e[n];s===null?this.removeAttr(n):this._attr(n,s)}),this):t===null?this.removeAttr(e):this._attr(e,t)}}),y.Event||(y.Event=(i,e)=>{const[t,...n]=i.split("."),s=new Event(t,{bubbles:!0,cancelable:!0});return s.namespace=n.join("."),s.___ot=t,s.___td=e,s});const bs=(i,e)=>new Promise(t=>{const n=window.setTimeout(t,i);e&&e(n)}),Wu={};y.share=Wu;var Or,Oe,Uu;I.isValidElement=void 0;var ri,Vu,Ku,ul,dl,fl,pl,ws={},qu=[],ay=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,zr=Array.isArray;function Dn(i,e){for(var t in e)i[t]=e[t];return i}function Gu(i){i&&i.parentNode&&i.parentNode.removeChild(i)}function v(i,e,t){var n,s,r,o={};for(r in e)r=="key"?n=e[r]:r=="ref"?s=e[r]:o[r]=e[r];if(arguments.length>2&&(o.children=arguments.length>3?Or.call(arguments,2):t),typeof i=="function"&&i.defaultProps!=null)for(r in i.defaultProps)o[r]===void 0&&(o[r]=i.defaultProps[r]);return Fr(i,o,n,s,null)}function Fr(i,e,t,n,s){var r={type:i,props:e,key:t,ref:n,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:s??++Uu,__i:-1,__u:0};return s==null&&Oe.vnode!=null&&Oe.vnode(r),r}function fe(){return{current:null}}function In(i){return i.children}function pe(i,e){this.props=i,this.context=e}function Pi(i,e){if(e==null)return i.__?Pi(i.__,i.__i+1):null;for(var t;ee&&ri.sort(ul));jr.__r=0}function Xu(i,e,t,n,s,r,o,a,l,c,d){var u,p,g,b,C,S=n&&n.__k||qu,x=e.length;for(t.__d=l,ly(t,e,S),l=t.__d,u=0;u0?Fr(s.type,s.props,s.key,s.ref?s.ref:null,s.__v):s).__=i,s.__b=i.__b+1,r=null,(a=s.__i=cy(s,t,o,d))!==-1&&(d--,(r=t[a])&&(r.__u|=131072)),r==null||r.__v===null?(a==-1&&u--,typeof s.type!="function"&&(s.__u|=65536)):a!==o&&(a==o-1?u--:a==o+1?u++:(a>o?u--:u++,s.__u|=65536))):s=i.__k[n]=null;if(d)for(n=0;n(l!=null&&!(131072&l.__u)?1:0))for(;o>=0||a=0){if((l=e[o])&&!(131072&l.__u)&&s==l.key&&r===l.type)return o;o--}if(a{!t||typeof t!="object"||Object.keys(t).forEach(n=>{let s=t[n];const r=i[n];s!==r&&(r!==void 0&&(n==="className"||n.endsWith("Class")?s=[r,s]:n==="children"?s=[...Br(r),...Br(s)]:typeof r=="object"&&(n==="style"||n.endsWith("Style")||n==="attrs"||n.endsWith("Attrs")||n==="props")&&(s=y.extend(r,s))),i[n]=s)})}),i}function yl(i){return Object.keys(i).forEach(e=>{i[e]===void 0&&delete i[e]}),i}function id(i,e=!0){const t=y(i),n=t[0],s="zui-disable-scroll";if(e){if(t.data(s))return;if((t.css("scrollbar-gutter")||"").includes("stable")){t.data(s,{overflow:t.css("overflow")}).css("overflow","hidden");return}const r=n===document.body||t.is("html")?window.innerWidth-document.body.clientWidth:n.offsetWidth-n.clientWidth;if(!r)return;const o=t.css("paddingRight")||"0";t.data(s,{paddingRight:o,overflow:t.css("overflow")}).css({paddingRight:`${r+Number.parseInt(o,10)}px`,overflow:"hidden"})}else{const r=t.data(s);if(!r)return;t.css(r).removeData(s)}}y.fn.disableScroll=function(i=!0){return this.each((e,t)=>{id(t,i)})},y.fn.enableScroll=function(i=!0){return this.disableScroll(!i)};function _l(i,e,t){if(!(t.on||"click").split(" ").includes(e.type))return;const n=t.selector?y(e.target).closest(t.selector):i;if(!n.length)return;const s=c=>c===""?!0:c,r=c=>{if(typeof c=="string")try{c=JSON.parse(c)}catch{}return c};if(s(t.once)){if(t.onceCalled)return;i.dataset("once-called",!0)}if(s(t.prevent)&&e.preventDefault(),s(t.stop)&&e.stopPropagation(),s(t.self)&&e.currentTarget!==e.target)return;const o=[["$element",i],["event",e],["options",t],["$target",n]],a=c=>typeof c=="function"?c(...o):y.runJS(c,...o);if(t.if!==void 0&&!a(t.if))return;const l=t.call;if(l){let c;if(typeof l=="string"?c=/^[$A-Z_][0-9A-Z_$.]*$/i.test(l)?ys(window,l):a(l):c=l,typeof c=="function"){const d=[],u=t.params;t.params=d,typeof u=="string"&&u.length?u[0]==="["?d.push(...r(u)):d.push(...u.split(", ").map(p=>(p=p.trim(),p==="$element"?i:p==="event"?e:p==="options"?t:p.startsWith("$element.")||p.startsWith("event.")||p.startsWith("options.")?a(p):r(p)))):Array.isArray(u)?d.push(...u):d.push(u),c(...d)}}t.do&&a(t.do)}function dy(i){const e=y(this),t=i.type,n=e.attr("zui-on");if(n){const[o,a]=n.split("~").map(l=>l.trim());o&&o.split(" ").includes(t)&&_l(e,i,y.extend({on:o},a?a.startsWith("{")?si(a):{do:a}:Mi(e,{prefix:"data-",evalValue:["call","if","do"]})))}const s=e.attr(`zui-on-${t}`);s&&_l(e,i,y.extend({on:t},s.startsWith("{")?si(s):{do:s}));const r=e.attr("data-on");r&&r.split(" ").includes(t)&&_l(e,i,Mi(e,{prefix:"data-",evalValue:["call","if","do"]}))}function sd(i){y(document).off(".zui.global").on(i.map(e=>`${e}.zui.global`).join(" "),`[zui-on],${i.map(e=>`[zui-on-${e}]`)},[data-on]`,dy)}y(()=>{sd(["click","change","inited"])});function ai(i,e){if(typeof i=="function")return ai(i(...e||[]));if(typeof i=="number")return[i];let t=i.match(/(\d+)(%|px)?/);return t?[parseInt(t[1]),t[2]]:(t=i.match(/(\d+)\/(\d+)/),t?[100*parseInt(t[1])/parseInt(t[2]),"%"]:[NaN])}function We(i,e){if(i==null)return null;const[t,n="px"]=ai(i,e);return Number.isNaN(t)?typeof i=="string"?i:null:`${t}${n}`}async function Wr(i,e){var n,s,r;if(i instanceof Blob){const o=document.createElement("a");return o.href=window.URL.createObjectURL(i),e&&(o.download=decodeURIComponent(e)),o.click(),o.remove(),i}if(i instanceof Response){const o=await i.blob();return e=e||((r=(s=(n=i.headers.get("Content-Disposition"))==null?void 0:n.split(";")[1])==null?void 0:s.split("=")[1])==null?void 0:r.replace(/"/g,"")),Wr(o,e)}const t=await fetch(i);return Wr(t)}class rd{constructor(e){this._$target=y(e)}on(...e){return this._$target.on(...e),this}one(...e){return this._$target.one(...e),this}off(...e){return this._$target.off(...e),this}trigger(...e){return this._$target.trigger(...e),this}}const Xt=new rd(document);y.bus=Xt,y.on=Xt.on.bind(Xt),y.one=Xt.one.bind(Xt),y.off=Xt.off.bind(Xt),y.trigger=Xt.trigger.bind(Xt);var fy=["Shift","Meta","Alt","Control"],od=typeof navigator=="object"?navigator.platform:"",ad=/Mac|iPod|iPhone|iPad/.test(od),py=ad?"Meta":"Control",my=od==="Win32"?["Control","Alt"]:ad?["Alt"]:[];function vl(i,e){return typeof i.getModifierState=="function"&&(i.getModifierState(e)||my.includes(e)&&i.getModifierState("AltGraph"))}function gy(i){return i.trim().split(" ").map(function(e){var t=e.split(/\b\+/),n=t.pop();return[t=t.map(function(s){return s==="$mod"?py:s}),n]})}function ld(i,e){var t;e===void 0&&(e={});var n=(t=e.timeout)!=null?t:1e3,s=Object.keys(i).map(function(a){return[gy(a),i[a]]}),r=new Map,o=null;return function(a){a instanceof KeyboardEvent&&(s.forEach(function(l){var c=l[0],d=l[1],u=r.get(c)||c;(function(p,g){return!(g[1].toUpperCase()!==p.key.toUpperCase()&&g[1]!==p.code||g[0].find(function(b){return!vl(p,b)})||fy.find(function(b){return!g[0].includes(b)&&g[1]!==b&&vl(p,b)}))})(a,u[0])?u.length>1?r.set(c,u.slice(1)):(r.delete(c),d(a)):vl(a,a.key)||r.delete(c)}),o&&clearTimeout(o),o=setTimeout(r.clear.bind(r),n))}}function yy(i,e,t){var n;t===void 0&&(t={});var s=(n=t.event)!=null?n:"keydown",r=ld(e,t);return i.addEventListener(s,r),function(){i.removeEventListener(s,r)}}function bl(i,e={}){if(!i)return;const t=Object.keys(e).reduce((n,s)=>(e[s].optional||(n[s]={...e[s]}),n),{});return Object.keys(i).forEach(n=>{const s=i[n];s?s===!0?e[n]&&(t[n]={...e[n]}):t[n]=s:delete t[n]}),Object.keys(t).reduce((n,s)=>{const{keys:r,handler:o}=t[s];return typeof r=="string"?n[r]=o:r.forEach(a=>{n[a]=o}),n},{})}function wl(i,e,t){const{timeout:n,event:s="keydown",scope:r,when:o}=t||{},a=ld(e,{timeout:n}),l=`.zui.hotkeys${r?`.${r}`:""}`,c="zui-hotkeys-composing";return y(i).on(`${s}${l}`,function(d){o&&o(d)===!1||y(d.target).data(c)||a(d)}).on(`compositionstart${l}`,d=>{y(d.target).data(c,!0)}).on(`compositionend${l}`,d=>{y(d.target).removeData(c)})}function Cl(i,e){return y(i).off(`.zui.hotkeys${e?`.${e}`:""}`)}const _y=yy;y.fn.hotkeys=function(i,e){return wl(this,i,e)},y.fn.unbindHotkeys=function(i){return Cl(this,i)},y.hotkeys=function(i,e){wl(window,i,e)},y.unbindHotkeys=function(i){Cl(window,i)};function Ur(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement}async function cd(i){(typeof i=="string"||i instanceof Element||i instanceof y)&&(i={target:i});const{target:e,onError:t,onSuccess:n,afterExit:s,afterEnter:r}=i,o=y(e),a=o[0];if(!a)return;const l=a.requestFullscreen||a.webkitRequestFullscreen||a.mozRequestFullScreen;if(!l){t==null||t.call(a,new Error("[ZUI] The browser does not support full screen feature."));return}try{await l.call(a),n==null||n.call(a),y(a).off(".zui.fullscreen"),s&&o.on("exitFullscreen.zui.fullscreen",s),r&&o.on("enterFullscreen.zui.fullscreen",r)}catch(c){t==null||t.call(a,c)}document.zuiBindFullscreenChange||(document.zuiBindFullscreenChange=!0,y(document).on("fullscreenchange.zui webkitfullscreenchange.zui mozfullscreenchange.zui",c=>{const d=Ur();let u=d;d?y(d).addClass("is-in-fullscreen"):(u=y(document).find(".is-in-fullscreen")[0]||document,y(u).removeClass("is-in-fullscreen")),y("body").toggleClass("has-in-fullscreen",!!d);const p={event:c,target:u,fullscreenElement:d};y(u).trigger(d?"enterFullscreen":"exitFullscreen",p).trigger("toggleFullscreen",p)}))}async function xl(i){const e=Ur();return i===!1&&!!e===i?i:e?(document.exitFullscreen(),!1):(await cd(i),!0)}y.fn.fullscreen=function(i){return xl({target:this,...i})},y.getFullscreenElement=Ur,y.toggleFullscreen=xl;function Nn(i){return!i||i.parentNode===document?!1:i.parentNode?Nn(i.parentNode):!0}y.isDetached=Nn,y.fn.isDetached=function(){const i=this[0];return!i||Nn(i)};const li=class Zm{constructor(e,t){var b;this._inited=!1,this._autoDestory=0,this._destroyed=!1;const{KEY:n,DATA_KEY:s,MULTI_INSTANCE:r,NAME:o,ATTR_KEY:a,ALL:l,TYPED_ALL:c}=this.constructor;if(!o)throw new Error('[ZUI] The component must have a "NAME" static property.');const d=y(e);if(d.data(n)&&!r)throw new Error(`[ZUI] The component "${o}" has been initialized on element.`);const u=d[0],p=pt();this._gid=p,this._element=u,this.resetOptions(t),this._key=this.options.key??`__${p}`;let g=l.get(u);if(g?g.add(this):(g=new Set([this]),l.set(u,g)),c.has(o)?c.get(o).add(this):c.set(o,new Set([this])),d.data(n,this).attr(a,"").attr(s,`${p}`).attr("z-use",[...new Set([...g].map(C=>C.constructor.NAME))].join(",")),r){const C=`${n}:ALL`;let S=d.data(C);S||(S=new Map,d.data(C,S)),S.set(this._key,this)}this.init(),(b=this.options.$onCreate)==null||b.call(this),requestAnimationFrame(async()=>{var C;this._inited=!0,await this.afterInit(),this.emit("inited",this.options),(C=this.options.$onInited)==null||C.call(this)})}static get ZUI(){return this.NAME.replace(/(^[A-Z]+)/,e=>e.toLowerCase())}static get KEY(){return`zui.${this.NAME}`}static get NAMESPACE(){return`.zui.${this.ZUI}`}static get DATA_KEY(){return`data-zui-${this.NAME}`}static get ATTR_KEY(){return`z-use-${this.NAME}`}static get SELECTOR(){return`[${this.DATA_KEY}]`}get inited(){return this._inited}get destroyed(){return this._destroyed}get element(){return this._element}get key(){return this._key}get options(){return this._options}get gid(){return this._gid}get $element(){return y(this.element)}get $emitter(){return this.$element}get i18nData(){return[this.options.i18n,this.constructor.i18n]}init(){}afterInit(){}render(e,t){this.setOptions(e,t)}destroy(){var g;const{KEY:e,DATA_KEY:t,ALL:n,TYPED_ALL:s,NAME:r,MULTI_INSTANCE:o,ATTR_KEY:a}=this.constructor,{$element:l,element:c}=this;if(this.emit("destroyed"),this._destroyed=!0,l.off(this.namespace).removeData(e).removeAttr(a).removeAttr(t),o){const b=this.$element.data(`${e}:ALL`);if(b)if(b.delete(this._key),b.size===0)this.$element.removeData(`${e}:ALL`);else{const C=b.values().next().value;l.data(e,C).attr(t,String(C==null?void 0:C.gid))}}const d=n.get(c);d&&(d.delete(this),d.size===0&&n.delete(c));const u=s.get(r);u&&(u.delete(this),u.size===0&&s.delete(r));const p=n.get(c);p!=null&&p.size?l.attr("z-use",[...new Set([...p].map(b=>b.constructor.NAME))].join(",")):l.removeAttr("z-use"),(g=this.options.$onDestroy)==null||g.call(this)}autoDestroy(e=100){this._autoDestory&&clearTimeout(this._autoDestory),this._autoDestory=window.setTimeout(()=>{this._autoDestory=0,Nn(this.element)&&this.destroy()},e)}setOptions(e,t){if(t){const n={...this.constructor.DEFAULT,...(e==null?void 0:e.$optionsFromDataset)!==!1?this.$element.dataset():{},...e},{$options:s}=n;if(s){const r=typeof s=="function"?s.call(this,this.element,n):s;r&&y.extend(n,r),delete n.$options}this._options=n}else e&&y.extend(this._options,e);return this._options}resetOptions(e){return this.setOptions(e,!0)}emit(e,...t){const n=y.Event(e);return n.__src=this,this.$emitter.trigger(n,[this,...t]),n}on(e,t,n){const s=this;this.$element[n!=null&&n.once?"one":"on"](this._wrapEvent(e),function(r,o){(!r.__src||r.__src===s)&&t.call(this,r,o)})}one(e,t){this.on(e,t,{once:!0})}off(e){this.$element.off(this._wrapEvent(e))}i18n(e,t,n){const{i18nData:s}=this;return Ne(s,e,t,n,this.options.lang,this.constructor.NAME)??Ne(s,e,t,n,this.options.lang)??`{i18n:${e}}`}get namespace(){return`${this.constructor.NAMESPACE}.${this._key}`}_wrapEvent(e){return e.split(" ").map(t=>t.includes(".")?t:`${t}${this.namespace}`).join(" ")}static get(e,t){const n=y(e);if(this.MULTI_INSTANCE&&t!==void 0){const s=n.data(`${this.KEY}:ALL`);return s?s.get(t):void 0}return n.data(this.KEY)}static isValid(e){return!0}static ensure(e,t){const n=this.get(e,t==null?void 0:t.key);if(n){if(this.isValid(n))return t&&n.setOptions(t),n;n.destroy()}return new this(e,t)}static getAll(e,t){var l;const{SELECTOR:n,ALL:s,TYPED_ALL:r}=this,o=[],a=c=>{c instanceof this&&(!t||t(c)!==!1)&&o.push(c)};return e?y(e).find(n).each((c,d)=>{var u;(u=s.get(d))==null||u.forEach(a)}):this!==Zm?(l=r.get(this.NAME))==null||l.forEach(a):s.forEach(c=>{c.forEach(a)}),o.sort((c,d)=>c.gid-d.gid)}static query(e,t,n){return e===void 0?this.getAll(void 0,n).pop():this.get(y(e).closest(this.SELECTOR),t)}static defineFn(e){let t=e||this.ZUI;y.fn[t]&&(t=`zui${this.NAME}`);const n=this;y.fn.extend({[t](s,...r){const o=typeof s=="object"?s:void 0,a=typeof s=="string"?s:void 0;let l;return this.each((c,d)=>{let u=n.get(d);if(u)o&&u.render(o);else{if(a)return;u=new n(d,o)}if(a){let p=u[a],g=u;p===void 0&&(g=u.$,p=g[a]),typeof p=="function"?l=p.call(g,...r):l=p}}),l!==void 0?l:this}})}static register(e,t){var s,r;e=e||this,t=(t??e.NAME).toLowerCase(),this.map.set(t,e);const n=(r=(s=e.toggle)==null?void 0:s.name)==null?void 0:r.toLowerCase();n&&n!==t&&this.toggleMap.set(n,e)}};li.DEFAULT={},li.MULTI_INSTANCE=!1,li.ALL=new Map,li.TYPED_ALL=new Map,li.map=new Map,li.toggleMap=new Map;let Fe=li;function Cs(i){return Fe.map.get(i.toLowerCase())}function kl(i,e,t={}){let n=Cs(i);if(n||(n=Sl(i)),!n)return null;const{$update:s,...r}=t;if(!n.MULTI_INSTANCE){const o=n.get(e);if(o)return s&&o.render(r,s==="reset"),o}return new n(e,r)}function vy(i,e,t={}){requestAnimationFrame(()=>kl(i,e,t))}function hd(i,e){Fe.register(i,e)}function Sl(i){const{zui:e}=window;if(e){i=i==null?void 0:i.toLowerCase();for(const t in e){const n=t.toLowerCase()===i;if(i&&!n)continue;const s=e[t];if(!(typeof s!="function"||!s.NAME||!s.ZUI)&&(Fe.map.has(t.toLowerCase())||hd(s),n))return s}}}function by(i){var e;i?(e=Cs(i))==null||e.defineFn():window._zuiDefined||(Sl(),Fe.map.forEach(t=>{t.defineFn()}),Object.assign(window,{_zuiDefined:!0}))}function wy(i,e={}){const t=y(i);let n=t.attr("zui-create");const{update:s,onCreate:r}=e,o=(a,l)=>{if(l={$update:s,$optionsFromDataset:!1,...l},r){const d=r(a,l);if(d===!1)return;d&&(l=d)}const c=l.$lib;if(c){delete l.$lib,y.getLib(c).then(()=>kl(a,i,l));return}vy(a,i,l)};if(typeof n=="string"){n=n.trim();const a=n.length?n.split(",").map(d=>d.trim()):[],l=Mi(i,{prefix:"zui-create-",evalValue:!0}),c=Object.keys(l);if(!c.length&&a.length===1)o(a[0],t.dataset());else{const d=new Set;[...a,...c].forEach(u=>{if(d.has(u))return;const p=l[u];o(u,p),delete l[u],d.add(u)})}}else{const a=t.dataset(),l=a==null?void 0:a.zui;if(!l)return;console.warn("[ZUI] create component instance with [data-zui] is deprecated, use [zui-create] instead.",{element:i,options:e}),delete a.zui,o(l,a)}}function Cy(){y(document).on("click.zui.toggle mouseenter.zui.toggle","[data-toggle],[zui-toggle]",function(i){const e=y(this),t=e.dataset("toggle")||e.attr("zui-toggle");if(!t)return;const n=Fe.toggleMap.get(t)||Cs(t),s=n==null?void 0:n.toggle;if(!s)return;const{trigger:r="click",skip:o="[disabled],.disabled",check:a}=s,l=i.type==="mouseover"?"hover":"click";if(!r.includes(l)||a&&!a.call(n,this,l,i)||o&&e.is(o))return;const{onGet:c,onCreate:d,setOptions:u=!0,getOptions:p,prevent:g=!0,handler:b,onToggle:C,convertHref:S}=s;let x=e.dataset();const D=e.attr(`zui-toggle-${t}`);if(D&&(x=y.extend(x,si(D))),S&&e.is("a")){const B=e.attr("href");if(B){const H=S===!0?{selector:"target",url:"url"}:S;"#.".includes(B[0])?H.selector&&x[H.selector]===void 0&&(x[H.selector]=B):H.url&&x[H.url]===void 0&&(x[H.url]=B)}}if(p&&(x=p.call(n,this,x,i)),b){b.call(n,this,x,l,i),g&&i.preventDefault();return}let P=c?c.call(n,this):n.get(this);if(P)u&&P.setOptions(x);else{const B=d?d.call(n,this,i,x):new n(this,x);if(!B)return;P=B}if(C){if(C.call(n,P,this,i)===!1)return}else{const{shown:B,show:H,hide:G,toggle:Y}=P;let J;if(Y?J=Y:H&&G?B?J=G:J=H:H&&(J=H),J)J.call(P);else return}g&&i.preventDefault()})}function xy(i,e){const t=vs(i),n=[];return Object.keys(t).forEach(s=>{if(!s.startsWith("zui."))return;const r=t[s];(e==null?void 0:e(r,s))!==!1&&n.push(t[s])}),n}let Vr=0;function ud(i=100){if(Vr&&clearTimeout(Vr),i){Vr=window.setTimeout(()=>ud(0),i);return}Vr=0,Fe.ALL.forEach(e=>{e.forEach(t=>t.autoDestroy())})}function ky(){if(!document.body||vs(document.body,"_autoDestoryMob"))return;const i=new MutationObserver(e=>{let t=!1;for(const n of e)if(n.removedNodes.length){t=!0;break}t&&ud()});i.observe(document.body,{childList:!0,subtree:!0}),Rr(document.body,"_autoDestoryMob",i)}function dd(i,e){const t=y(i);t.find("[zui-create],[data-zui]").each(function(){var n;((n=e==null?void 0:e.beforeCreate)==null?void 0:n.call(e,this))!==!1&&wy(this,e)}),t.find("[zui-init]").each(function(){this.hasAttribute("z-zui-inited")||(this.setAttribute("z-zui-inited",""),y.runJS(this.getAttribute("zui-init"),["$element",y(this)]))}),t.find(".hide-before-init").removeClass("invisible hidden opacity-0"),t.find(".scroll-into-view").scrollIntoView(),t.find('[data-on="inited"],[zui-on-inited]').each((n,s)=>{const r=y(s);r.zui()||r.trigger("inited")}),e!=null&&e.runJS&&t.runJS()}y.fn.zuiInit=function(i){return dd(this,i),this},y.fn.zui=function(i,e){const t=this[0];if(!t)return;if(typeof i!="string"){const s={};let r;return xy(t,(o,a)=>{s[a]=o,(!r||r.gid1?t[0]:void 0,s=t[t.length>1?1:0],r=y(this).zui(n),o=r==null?void 0:r[s];typeof o=="function"&&o.apply(r,e)}),this},y(()=>{y("body").zuiInit({update:!0}),Cy(),ky()});class Tl extends Fe{init(){const{offset:e=1,side:t,zIndex:n,pinnedClass:s="is-pinned",targets:r,scrollContainer:o}=this.options,{$element:a}=this,l=r?a.find(r):a;if(l.css({position:"sticky",zIndex:n}),t&&l.css(t,-e),o){const c=a.closest(o)[0];if(c){const d=()=>{this._raf&&cancelAnimationFrame(this._raf),this._raf=requestAnimationFrame(()=>{if(this._raf=0,c.scrollTop===0&&(!t||t==="top")){l.toggleClass(s,!1);return}const u=c.getBoundingClientRect();l.each((p,g)=>{const C=g.getBoundingClientRect()[t||"top"]===u[t||"top"];g.classList.toggle(s,C)})})};this._scrollListener=d,c.addEventListener("scroll",d)}this._container=c}else this._ob=new IntersectionObserver(c=>{c.forEach(d=>{d.target.classList.toggle(s,d.intersectionRatiothis._ob.observe(d))}destroy(){var e;(e=this._ob)==null||e.disconnect(),this._container&&(this._container.removeEventListener("scroll",this._scrollListener),this._raf&&cancelAnimationFrame(this._raf))}}Tl.NAME="Sticky";const Ei=24*60*60*1e3,Ue=i=>i===void 0?new Date:(i instanceof Date||(typeof i=="string"&&(i=i.trim(),/^\d+$/.test(i)&&(i=Number.parseInt(i,10))),typeof i=="number"&&i<1e10&&(i*=1e3),i=new Date(i)),i),fd=(i,e,t="day")=>{if(typeof e=="string"){const n=Number.parseInt(e,10);t=e.replace(n.toString(),""),e=n}return i=new Date(Ue(i).getTime()),t==="month"?i.setMonth(i.getMonth()+e):t==="year"?i.setFullYear(i.getFullYear()+e):t==="week"?i.setDate(i.getDate()+e*7):t==="hour"?i.setHours(i.getHours()+e):t==="minute"?i.setMinutes(i.getMinutes()+e):t==="second"?i.setSeconds(i.getSeconds()+e):i.setDate(i.getDate()+e),i},Mn=(i,e=new Date)=>Ue(i).toDateString()===Ue(e).toDateString(),xs=(i,e=new Date)=>Ue(i).getFullYear()===Ue(e).getFullYear(),$l=(i,e=new Date)=>(i=Ue(i),e=Ue(e),i.getFullYear()===e.getFullYear()&&i.getMonth()===e.getMonth()),Sy=(i,e=new Date)=>{i=Ue(i),e=Ue(e);const t=1e3*60*60*24,n=Math.floor(i.getTime()/t),s=Math.floor(e.getTime()/t);return Math.floor((n+4)/7)===Math.floor((s+4)/7)},Ty=(i,e)=>Mn(Ue(e),i),$y=(i,e)=>Mn(Ue(e).getTime()-Ei,i),Dy=(i,e)=>Mn(Ue(e).getTime()+Ei,i),Dl=i=>i!=null&&!isNaN(Ue(i).getTime()),ut=(i,e="yyyy-MM-dd hh:mm",t="")=>{if(i=Ue(i),!Dl(i))return t;if(typeof e=="function")return e(i);const n={"M+":i.getMonth()+1,"d+":i.getDate(),"h+":i.getHours(),"H+":i.getHours()%12,"m+":i.getMinutes(),"s+":i.getSeconds(),"S+":i.getMilliseconds()};return/(y+)/i.test(e)&&(e.includes("[yyyy-]")&&(e=e.replace("[yyyy-]",xs(i)?"":"yyyy-")),e=e.replace(RegExp.$1,`${i.getFullYear()}`.substring(4-RegExp.$1.length))),Object.keys(n).forEach(s=>{if(new RegExp(`(${s})`).test(e)){const r=`${n[s]}`;e=e.replace(RegExp.$1,RegExp.$1.length===1?r:`00${r}`.substring(r.length))}}),e},Iy=(i,e,t)=>{const n={full:"yyyy-M-d",month:"M-d",day:"d",str:"{0} ~ {1}",...t},s=ut(i,xs(i)?n.month:n.full);if(Mn(i,e))return s;const r=ut(e,xs(i,e)?$l(i,e)?n.day:n.month:n.full);return n.str.replace("{0}",s).replace("{1}",r)};function Il(i){let e=0;if(typeof i!="string"&&(i=String(i)),i&&i.length)for(let t=0;t{try{a.includes("%")&&(a=decodeURIComponent(a)),a=JSON.parse(a)}catch{}return[o,a]})),params:n.map(o=>{if(o!=="undefined"){if(o==="null")return null;try{return o.includes("%")&&(o=decodeURIComponent(o)),JSON.parse(o)}catch{return o}}})}}function pd(i){if(Array.isArray(i))return{commands:i.map(Kr).filter(Boolean)};if(typeof i=="object")return i;i=i.replace(/^#!?/,"");const e=i.includes(">"),t=i.split(e?">":"|").map(Kr);return{async:e,commands:t.filter(Boolean)}}function Nl(i,e,t){if(typeof i=="string"&&(i=Kr(i)),!i)return;const{execute:n,event:s,scope:r}=e;if(!(r&&i.scope&&i.scope!==r))return n({name:i.name,options:{...e.options,...i.options},event:s,scope:i.scope,prevResult:t},i.params)}async function md(i,e){const{async:t,commands:n}=pd(i);if(!n.length)return[];const{signal:s}=e;if(t){const o=[];let a;for(const l of n){if(!(s!=null&&s.aborted))break;a=await Nl(l,e,a),s!=null&&s.aborted&&(a=void 0),o.push(a)}return o}return await Promise.all(n.map(o=>{if(!(s!=null&&s.aborted))return Nl(o,e)}))}const Ai="zui.commands",Li="z-commands",Ny="zui-commands-proxy",gd="zui-command";function qr(i,e){typeof e=="string"?e={scope:e}:typeof e=="function"&&(e={onCommand:e});const{scope:t="",events:n="click"}=e??{},s=y(i),r=(s.attr(Li)||"").split(",");t&&!r.includes(t)&&r.push(t),s.attr(Li,r.join(",")).data(Ai,{[t]:{...e,scope:t,events:n,gid:pt()},...s.data(Ai)})}function Gr(i,e=!0){const t=y(i);if(e===!0)t.removeAttr(Li),t.removeData(Ai);else if(e.length){const n=t.data(Ai)||{};e.split(",").forEach(r=>{delete n[r]});const s=Object.keys(n);s.length?t.attr(Li,s.join(",")).data(Ai,qr):Gr(t,!0)}}function yd(i,e){let t=i.closest(`[${Li}]`);if(!t.length){const o=i.closest(`[${Ny}]`);o.length&&(t=y(o.data("zui.commandProxy")||o.attr("COMMAND_PROXY_ATTR")).closest(`[${Li}]`))}if(!t.length)return;const n=t.data(Ai)||{},s=Object.values(n).sort((o,a)=>a.gid-o.gid);let r;return e!=null&&e.length?(r=s.find(o=>o.scope===e),r||(r=s.find(o=>{var a;return!((a=o.scope)!=null&&a.length)&&!o.scoped})),r):(r=s.find(o=>{var a;return!((a=o.scope)!=null&&a.length)&&!o.scoped}),r||(r=s.find(o=>!o.scoped)),r?r.element=t[0]:r=yd(i.parent(),e),r)}function My(i){if(!i.currentTarget)return;const e=y(i.currentTarget);if(e.closest(".disabled,[disabled]").length)return;const t=e.attr(gd)||(e.is('a[href^="#!"]')?e.attr("href"):"");if(!t)return;const n=new AbortController,s=()=>n.abort();md(t,{signal:n.signal,execute:(r,o)=>{const{scope:a,name:l}=r,c={...r,abort:s};let d;const u=yd(e,a);if(u){c.element=u.element;const g=(u.commands?u.commands[`${a}~${l}`]||u.commands[l]:null)||u.onCommand;if(g&&(d=g(c,o),i.commandHandled))return d}const p=[c,o];if(e.trigger("command",p).trigger(`command:${a?`${l}.${a}`:l}`,p),a&&e.trigger(`command:.${a}`,p),i.commandHandled)return d;if(a==="event"){l==="stop"?i.stopPropagation():l==="prevent"?i.preventDefault():Tn(i,l,o);return}return a==="window"?Tn(window,l,o):a==="zui"?Tn(window.zui,l,o):a==="target"?Tn(e[0],l,o):a==="$target"?Tn(e,l,o):a==="$"?Tn(y,l,o):d},event:i})}y.fn.command=function(i,e){return this.on(`command:${i}`,e)},y.fn.offCommand=function(i,e){return this.off(`command:${i}`,e)},y.fn.commands=function(i){return this.each((e,t)=>qr(t,i)),this},y.fn.unbindCommands=function(i){return this.each((e,t)=>Gr(t,i)),this},y(()=>{y(document).on("click.zui.command",`[${gd}],a[href^="#!"]`,My)});function Yr(i,e,t=!1){var s;const n=y(i);if(e!==void 0){if(typeof e=="string"&&e.length){const r=`zui-runjs-${pt()}`;n.append(`