diff --git a/exp_groups/package.json b/exp_groups/package.json index 78b8a1cd..61dca7f9 100644 --- a/exp_groups/package.json +++ b/exp_groups/package.json @@ -11,25 +11,25 @@ "node": ">=18" }, "peerDependencies": { - "@clusterio/lib": "^2.0.0-alpha.19" + "@clusterio/lib": "catalog:" }, "devDependencies": { - "@clusterio/lib": "^2.0.0-alpha.20", - "@clusterio/web_ui": "^2.0.0-alpha.20.b", + "@clusterio/lib": "catalog:", + "@clusterio/web_ui": "catalog:", "@types/fs-extra": "^11.0.4", - "@types/node": "^20.4.5", - "@types/react": "^18.2.21", - "antd": "^5.13.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "typescript": "^5.5.3", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.4", - "webpack-merge": "^5.9.0" + "@types/node": "catalog:", + "@types/react": "catalog:", + "antd": "catalog:", + "react": "catalog:", + "react-dom": "catalog:", + "typescript": "catalog:", + "webpack": "catalog:", + "webpack-cli": "catalog:", + "webpack-merge": "catalog:" }, "dependencies": { - "@sinclair/typebox": "^0.30.4", - "fs-extra": "^11.2.0" + "@sinclair/typebox": "catalog:", + "fs-extra": "^11.3.3" }, "publishConfig": { "access": "public" diff --git a/exp_gui/module/prototype.lua b/exp_gui/module/prototype.lua index 66a1b28e..ea1e6a31 100644 --- a/exp_gui/module/prototype.lua +++ b/exp_gui/module/prototype.lua @@ -274,6 +274,7 @@ function ExpElement._prototype:draw(definition) if not next(signals) then -- If no signals then skip var arg + --- @cast definition LuaGuiElement.add_param self._draw = function(_, parent) return parent.add(definition) end diff --git a/exp_legacy/module/config/_file_loader.lua b/exp_legacy/module/config/_file_loader.lua index 937d01c8..2964c6c7 100644 --- a/exp_legacy/module/config/_file_loader.lua +++ b/exp_legacy/module/config/_file_loader.lua @@ -22,9 +22,6 @@ return { --"modules.data.toolbar", --- GUI - "modules.gui.readme", - -- "modules.gui.rocket-info", - "modules.gui.task-list", "modules.gui.warp-list", "modules.gui.player-list", "modules.gui.vlayer", diff --git a/exp_legacy/module/locale/en/gui.cfg b/exp_legacy/module/locale/en/gui.cfg index 89a55d6c..317e23fe 100644 --- a/exp_legacy/module/locale/en/gui.cfg +++ b/exp_legacy/module/locale/en/gui.cfg @@ -54,28 +54,6 @@ progress-caption=__1__% progress-tooltip=This silo has launched __1__ rockets launch-failed=Failed to launch rocket, please wait a few seconds and try again. -[task-list] -main-caption=Task List [img=info] -main-tooltip=Task List -sub-tooltip=Tasks that remain to be done\n- You can use richtext to include images [img=utility/not_enough_repair_packs_icon] or [color=blue]color[/color] your tasks. -no-tasks=No tasks found! -no-tasks-tooltip=Click on the plus button to the top right of this window to add a new task! -last-edit=Last edited by __1__ at __2__ -add-tooltip=Add new task -confirm=Confirm -confirm-tooltip=Save task (minimum of 5 characters long) -discard=Discard -discard-tooltip=Discard task/changes -delete=Delete -delete-tooltip=Delete task -close-tooltip=Close task details -edit=Edit task -edit-tooltip=Currently being edited by: __1__ -edit-tooltip-none=Currently being edited by: Nobody -create-footer-header=Create task -edit-footer-header=Edit task -view-footer-header=Task details - [warp-list] main-caption=Warp List [img=info] main-tooltip=Warp List @@ -107,74 +85,6 @@ goto-cooldown=You are on cooldown, wait for your cooldown to recharge goto-disabled=You are not on a warp point, walk to a warp point goto-edit=Edit warp icon -[readme] -main-tooltip=Infomation -welcome-tab=Welcome -welcome-tooltip=Welcome to APERX -welcome-general=Welcome to APERX; we host many factorio servers. While you are here, we ask you to follow our rules. You can find these in the tab above. You can also find our custom commands and links to our other servers. This map has been online for __2__.\nPlease note that our servers reset periodically, the next reset is: __1__ -welcome-roles=We run a custom role system to help protect the work of others. As a result you may not be able to use your deconstruction planner yet or drop item on the groud. Roles also give you access to some custom features such as adding tasks to our task list or making new warp points.\nYou have been assigned the roles: __1__ -welcome-chat=Chatting can be difficult for new players because it’s different than other games! It’s very simple, the button you need to press is the “GRAVE/TILDE” key (which is located under the “ESC key”) - If you would like to change the key, go to your Controls tab in options.\nThe setting you need to change is “Toggle chat (and Lua console)” you currently have it set to "__CONTROL__toggle-console__" -rules-tab=Rules -rules-tooltip=Rules for our server -rules-general=By playing on our servers you accept the rules below. If you are supected of breaking a rule then you will be questioned by one of our moderators. If required you will be banned from our servers, appeals can be made by contacting an Administrator on our discord. -rules-1=Hacking / cheating / abusing bugs will not be tolerated. -rules-2=Any bugs or exploits found should be reported to our staff members. -rules-3=Be respectful to other players in chat, this includes any other forms of communication. -rules-4=Taking all items from a belt or logistics network is forbidden: sharing resources is mandatory. -rules-5=Spamming of chat, bots, unlimited chests, or concrete is not allowed. -rules-6=Before removing major parts of the factory tell other players why you are removing it. -rules-7=Do not cause unnecessary lag by placing/removing tiles with bots or using active provider chests, if think some thing might cause lag please ask staff first. -rules-8=Do not walk in random directions with no reason, this is to reduce map download times. -rules-9=Do not use speakers on global or with alerts without prior permission, no one wants to hear your music at full volume without knowing where the off switch is. -rules-10=Do not rotate belts, deactivate belts with wires, or cause production to stop without good reason, this goes for inserters and spliters as well. -rules-11=Do not make train roundabouts. Other loops such as RoRo stations are allowed. -rules-12=When using trains, use the same size other players have used, many players use 1-2-1, 2-4-2, or 3-8-3, meaning 1 engine 2 cargo 1 engine. -rules-13=Trains are Left Hand Drive (LHD) only, this means trains drive on the left side of the tracks. -rules-14=Do not beg for roles, advertise other servers, or link to harmful sites. -rules-15=Use common sense, report rule breakers, and Administrators have the final word. -commands-tab=Commands -commands-tooltip=Commands which you are able to use -commands-general=We have lots of custom commands which you are able to use. Below you can find a list of all the commands that you are allowed to use and what they do. If you need more information or want to search for a command you can use our /search-help command. -servers-tab=Servers -servers-tooltip=Links to our other servers and sites -servers-general=This is only one of our servers for factorio, we host many of others as well. Below you can find details about all the servers that we host as well as links to our external services such as discord or github. -servers-factorio=Factorio Servers -servers-1=S1 -servers-d1=This server resets regularly. -servers-2=S2 -servers-d2=This server resets regularly. -servers-3=S3 -servers-d3=This server resets regularly. -servers-5=S5 -servers-d5=This server is only for members. Check discord for more details. -servers-6=S6 -servers-d6=This server is only for members. Check discord for more details. -servers-8=S8 -servers-d8=This server is only for event and others. Check discord for more details. -servers-connect-Offline=Server is currently offline -servers-connect-Current=This is your current server -servers-connect-Version=Server is on a different version: __1__ -servers-connect-Password=Server requires a password -servers-connect-Modded=Server requires mods to be downloaded -servers-connect-Online=Server is online -servers-external=External Links -servers-open-in-browser=Open in your browser -backers-tab=Backers -backers-tooltip=People who have helped make our server -backers-general=We would like to thank all our staff and backers who have helped our community grow. Our staff have helped to keep our servers safe from trolls and a fun place to play. Our backers have helped us to cover our running costs and provide a great community for us all to enjoy together. -backers-management=Administrators -backers-staff=Staff Members -backers-backers=Board Members, Supporters, and Partners -backers-active=Active Players -data-tab=Data -data-tooltip=All of your stored player data -data-general=Our servers will save your player data so that we can sync it between servers. All of your data can be found below, if you wish to save a copy locally then use /save-data. If you want to change what data is saved then use /set-preference. -data-settings=Settings -data-statistics=Statistics -data-required=Required -data-misc=Miscellaneous -data-format=__1____2__ - [bonus] description=Get / Set the amount of bonus you receive. arg-amount=Amount to set your bonus to, 0 will disable bonus. diff --git a/exp_legacy/module/locale/zh-CN/gui.cfg b/exp_legacy/module/locale/zh-CN/gui.cfg index 0c2959ab..7e2f5954 100644 --- a/exp_legacy/module/locale/zh-CN/gui.cfg +++ b/exp_legacy/module/locale/zh-CN/gui.cfg @@ -54,28 +54,6 @@ progress-caption=__1__ % progress-tooltip=該火箭發射井發射了 __1__ 次 launch-failed=火箭發射失敗, 請過一會再試。 -[task-list] -main-caption=工作流程 [img=info] -main-tooltip=工作流程 -sub-tooltip=需要完成的工作流程\n- 你可以用富文本來加上圖片 [img=utility/not_enough_repair_packs_icon] 或 [color=blue] 顏色[/color]。 -no-tasks=沒有工作流程 -no-tasks-tooltip=按加號加入工作流程 -last-edit=最後由 __1__ 在 __2__ 修改 -add-tooltip=加入工作流程 -confirm=確認 -confirm-tooltip=儲存工作流程 (最少要5個字長) -discard=放棄 -discard-tooltip=放棄更改動 -delete=刪除 -delete-tooltip=刪除工作流程 -close-tooltip=關閉工作流程 -edit=修改工作流程 -edit-tooltip=現被 __1__ 修改中 -edit-tooltip-none=現沒有被人修改 -create-footer-header=加入工作流程 -edit-footer-header=修改工作流程 -view-footer-header=工作流程細節 - [warp-list] main-caption=傳送陣清單 [img=info] main-tooltip=傳送陣清單 @@ -107,74 +85,6 @@ goto-cooldown=傳送冷卻中, 請等候冷卻 goto-disabled=你不在傳送陣, 請移至任意傳送陣 goto-edit=修改傳送陣圖案 -[readme] -main-tooltip=資訊 -welcome-tab=歡迎 -welcome-tooltip=歡迎來到 APERX -welcome-general=歡迎來到 APERX; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __1__ -welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__ -welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」 -rules-tab=規則 -rules-tooltip=服務器規則 -rules-general=你在本服務器遊玩即等同同意以下規則。管理員有機會就相關事項提問。你可能會因為違反規則而被封禁,你可以在 Discord 中提出反對。 -rules-1=開掛或濫用漏洞將不會被容忍。 -rules-2=當你找到漏洞可以通知職員。 -rules-3=請在聊天室中尊重其他人。 -rules-4=請不要把所有物品全部取走。 -rules-5=請不要濫發信息,大量鋪設地磚,或不為箱子設置上限,浪費資源。 -rules-6=當你想大量拆除原有設施前請通知其他用戶。 -rules-7=請不要無故使用機器人來大量鋪設或拆除地磚,濫用主動出貨箱。 -rules-8=請不要隨意移動來開大量地圖,這有助減少地圖下載時間。 -rules-9=請不要無故使用全圖喇叭。 -rules-10=請不要無故轉動傳送帶方向,停用傳送帶,或停止生產。 -rules-11=請不要用迴旋處。 火車站尾返程則是例外。 -rules-12=請跟其他人使用相同的火車組成。常用的有 1-2-1,2-4-2,或 3-8-3,即1個動車組拖2個貨車組再拖不同方向的1個動車組。 -rules-13=火車必須是左上右下 (LHD)。 -rules-14=禁止要求身份組,發廣告,發惡意連結。 -rules-15=使用常識, 舉報違規人員,管理員有最終決定權。 -commands-tab=指令 -commands-tooltip=你可用的指令 -commands-general=這裏有自訂的指令。你可以在下邊找到你可用的指令及其功能介紹。你可以用 /search-help 來取得更多資訊。 -servers-tab=伺服器 -servers-tooltip=到其他伺服器及網站的連結 -servers-general=這是其中一個伺服器。你可以在下方找到其他同樣是由我們運行的伺服器資料。 -servers-factorio=異星工廠伺服器 -servers-1=S1 -servers-d1=這個服務器定期重設。 -servers-2=S2 -servers-d2=這個服務器定期重設。 -servers-3=S3 -servers-d3=這個服務器定期重設。 -servers-5=S5 -servers-d5=這個服務器只為會員運行,可在 Discord 中得到更多資訊。 -servers-6=S6 -servers-d6=這個服務器只為會員運行,可在 Discord 中得到更多資訊。 -servers-8=S8 -servers-d8=這個服務器只在活動和其他時運行,可在 Discord 中得到更多資訊。 -servers-connect-Offline=該服務器目前沒有在運行 -servers-connect-Current=你目前所在的伺服器 -servers-connect-Version=該服務器運行不同的遊戲版本: __1__ -servers-connect-Password=該服務器需要密碼 -servers-connect-Modded=該服務器需要下載模組 -servers-connect-Online=該服務器在線 -servers-external=外部連結 -servers-open-in-browser=可在你的瀏覽器中打開 -backers-tab=支持者 -backers-tooltip=支持者 -backers-general=他們為服務器運行提供了不少幫助。 -backers-management=管理員 -backers-staff=職員 -backers-backers=議員,支持者,和夥伴 -backers-active=活躍玩家 -data-tab=資料 -data-tooltip=所有已存資料 -data-general=資料會自動存到各個服務器中。 你也可以用 /save-data 存一份副本。 也可用 /set-preference 來更改喜好。 -data-settings=設定 -data-statistics=數據 -data-required=需要 -data-misc=雜項 -data-format=__1____2__ - [bonus] description=取得 / 設定 Bonus 量。 arg-amount=Bonus 數量, 0 來停用。 diff --git a/exp_legacy/module/locale/zh-TW/gui.cfg b/exp_legacy/module/locale/zh-TW/gui.cfg index 0c2959ab..7e2f5954 100644 --- a/exp_legacy/module/locale/zh-TW/gui.cfg +++ b/exp_legacy/module/locale/zh-TW/gui.cfg @@ -54,28 +54,6 @@ progress-caption=__1__ % progress-tooltip=該火箭發射井發射了 __1__ 次 launch-failed=火箭發射失敗, 請過一會再試。 -[task-list] -main-caption=工作流程 [img=info] -main-tooltip=工作流程 -sub-tooltip=需要完成的工作流程\n- 你可以用富文本來加上圖片 [img=utility/not_enough_repair_packs_icon] 或 [color=blue] 顏色[/color]。 -no-tasks=沒有工作流程 -no-tasks-tooltip=按加號加入工作流程 -last-edit=最後由 __1__ 在 __2__ 修改 -add-tooltip=加入工作流程 -confirm=確認 -confirm-tooltip=儲存工作流程 (最少要5個字長) -discard=放棄 -discard-tooltip=放棄更改動 -delete=刪除 -delete-tooltip=刪除工作流程 -close-tooltip=關閉工作流程 -edit=修改工作流程 -edit-tooltip=現被 __1__ 修改中 -edit-tooltip-none=現沒有被人修改 -create-footer-header=加入工作流程 -edit-footer-header=修改工作流程 -view-footer-header=工作流程細節 - [warp-list] main-caption=傳送陣清單 [img=info] main-tooltip=傳送陣清單 @@ -107,74 +85,6 @@ goto-cooldown=傳送冷卻中, 請等候冷卻 goto-disabled=你不在傳送陣, 請移至任意傳送陣 goto-edit=修改傳送陣圖案 -[readme] -main-tooltip=資訊 -welcome-tab=歡迎 -welcome-tooltip=歡迎來到 APERX -welcome-general=歡迎來到 APERX; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __1__ -welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__ -welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」 -rules-tab=規則 -rules-tooltip=服務器規則 -rules-general=你在本服務器遊玩即等同同意以下規則。管理員有機會就相關事項提問。你可能會因為違反規則而被封禁,你可以在 Discord 中提出反對。 -rules-1=開掛或濫用漏洞將不會被容忍。 -rules-2=當你找到漏洞可以通知職員。 -rules-3=請在聊天室中尊重其他人。 -rules-4=請不要把所有物品全部取走。 -rules-5=請不要濫發信息,大量鋪設地磚,或不為箱子設置上限,浪費資源。 -rules-6=當你想大量拆除原有設施前請通知其他用戶。 -rules-7=請不要無故使用機器人來大量鋪設或拆除地磚,濫用主動出貨箱。 -rules-8=請不要隨意移動來開大量地圖,這有助減少地圖下載時間。 -rules-9=請不要無故使用全圖喇叭。 -rules-10=請不要無故轉動傳送帶方向,停用傳送帶,或停止生產。 -rules-11=請不要用迴旋處。 火車站尾返程則是例外。 -rules-12=請跟其他人使用相同的火車組成。常用的有 1-2-1,2-4-2,或 3-8-3,即1個動車組拖2個貨車組再拖不同方向的1個動車組。 -rules-13=火車必須是左上右下 (LHD)。 -rules-14=禁止要求身份組,發廣告,發惡意連結。 -rules-15=使用常識, 舉報違規人員,管理員有最終決定權。 -commands-tab=指令 -commands-tooltip=你可用的指令 -commands-general=這裏有自訂的指令。你可以在下邊找到你可用的指令及其功能介紹。你可以用 /search-help 來取得更多資訊。 -servers-tab=伺服器 -servers-tooltip=到其他伺服器及網站的連結 -servers-general=這是其中一個伺服器。你可以在下方找到其他同樣是由我們運行的伺服器資料。 -servers-factorio=異星工廠伺服器 -servers-1=S1 -servers-d1=這個服務器定期重設。 -servers-2=S2 -servers-d2=這個服務器定期重設。 -servers-3=S3 -servers-d3=這個服務器定期重設。 -servers-5=S5 -servers-d5=這個服務器只為會員運行,可在 Discord 中得到更多資訊。 -servers-6=S6 -servers-d6=這個服務器只為會員運行,可在 Discord 中得到更多資訊。 -servers-8=S8 -servers-d8=這個服務器只在活動和其他時運行,可在 Discord 中得到更多資訊。 -servers-connect-Offline=該服務器目前沒有在運行 -servers-connect-Current=你目前所在的伺服器 -servers-connect-Version=該服務器運行不同的遊戲版本: __1__ -servers-connect-Password=該服務器需要密碼 -servers-connect-Modded=該服務器需要下載模組 -servers-connect-Online=該服務器在線 -servers-external=外部連結 -servers-open-in-browser=可在你的瀏覽器中打開 -backers-tab=支持者 -backers-tooltip=支持者 -backers-general=他們為服務器運行提供了不少幫助。 -backers-management=管理員 -backers-staff=職員 -backers-backers=議員,支持者,和夥伴 -backers-active=活躍玩家 -data-tab=資料 -data-tooltip=所有已存資料 -data-general=資料會自動存到各個服務器中。 你也可以用 /save-data 存一份副本。 也可用 /set-preference 來更改喜好。 -data-settings=設定 -data-statistics=數據 -data-required=需要 -data-misc=雜項 -data-format=__1____2__ - [bonus] description=取得 / 設定 Bonus 量。 arg-amount=Bonus 數量, 0 來停用。 diff --git a/exp_legacy/module/modules/control/tasks.lua b/exp_legacy/module/modules/control/tasks.lua deleted file mode 100644 index 6a03a089..00000000 --- a/exp_legacy/module/modules/control/tasks.lua +++ /dev/null @@ -1,176 +0,0 @@ ---[[-- Control Module - Tasks -- Stores tasks for each force. -@control Tasks -@alias Tasks - -@usage-- Making and then editing a new task -local task_id = Tasks.add_task(game.player.force.name, nil, game.player.name) - -Tasks.update_task(task_id, 'We need more iron!', game.player.name) - -]] - -local Datastore = require("modules.exp_legacy.expcore.datastore") --- @dep expcore.datastore -local Storage = require("modules/exp_util/storage") - ---- Stores all data for the warp gui -local TaskData = Datastore.connect("TaskData") -TaskData:set_serializer(function(raw_key) return raw_key.task_id end) - -local Tasks = {} - --- Storage lookup table for force name to task ids -local force_tasks = { _uid = 1 } -Storage.register(force_tasks, function(tbl) - force_tasks = tbl -end) - ---- Setters. --- functions used to created and alter tasks --- @section setters - ---[[-- Add a new task for a force, the task can be placed into a certain position for that force -@tparam string force_name the name of the force to add the task for -@tparam[opt] string player_name the player who added this task, will cause them to be listed under editing -@tparam[opt] string task_title the task title, if not given default is used -@tparam[opt] string task_body the task body, if not given default is used -@treturn string the uid of the task which was created - -@usage-- Adding a new task for your force -local task_id = Tasks.add_task(game.player.force.name, game.player.name, nil, nil) - -]] -function Tasks.add_task(force_name, player_name, task_title, task_body) - -- Get a new task id - local task_id = tostring(force_tasks._uid) - force_tasks._uid = force_tasks._uid + 1 - - -- Get the existing tasks for this force - local task_ids = force_tasks[force_name] --[[@as table?]] - if not task_ids then - task_ids = {} - force_tasks[force_name] = task_ids --[[@as any]] - end - - -- Insert the task id into the forces tasks - table.insert(task_ids, task_id) - - -- Add the new task to the store - TaskData:set(task_id, { - task_id = task_id, - force_name = force_name, - title = task_title or "", - body = task_body or "", - last_edit_name = player_name or "", - last_edit_time = game.tick, - currently_editing = {}, - }) - - return task_id -end - ---[[-- Removes a task and any data that is linked with it -@tparam string task_id the uid of the task which you want to remove - -@usage-- Removing a task -Tasks.remove_task(task_id) - -]] -function Tasks.remove_task(task_id) - local task = TaskData:get(task_id) - local force_name = task.force_name - table.remove_element(force_tasks[force_name], task_id) - TaskData:remove(task_id) -end - ---[[-- Update the message and last edited information for a task -@tparam string task_id the uid of the task to update -@tparam string player_name the name of the player who made the edit -@tparam string task_title the title of the task to update to -@tparam string task_body the body of the task to update to - -@usage-- Updating the message for on a task -Task.update_task(task_id, game.player.name, 'We need more iron!', 'Build more iron outposts.') - -]] -function Tasks.update_task(task_id, player_name, task_title, task_body) - TaskData:update(task_id, function(_, task) - task.last_edit_name = player_name - task.last_edit_time = game.tick - task.title = task_title - task.body = task_body - end) -end - ---[[-- Set the editing state for a player, can be used as a warning or to display a text field -@tparam string task_id the uid of the task that you want to effect -@tparam string player_name the name of the player you want to set the state for -@tparam boolean state the new state to set editing to - -@usage-- Setting your editing state to true -Tasks.set_editing(task_id, game.player.name, true) - -]] -function Tasks.set_editing(task_id, player_name, state) - TaskData:update(task_id, function(_, task) - task.currently_editing[player_name] = state - end) -end - ---[[-- Adds an update handler for when a task is added, removed, or updated -@tparam function handler the handler which is called when a task is updated - -@usage-- Add a game print when a task is updated -Tasks.on_update(function(task) - game.print(task.force_name..' now has the task: '..task.message) -end) - -]] -function Tasks.on_update(handler) - TaskData:on_update(handler) -end - ---- Getters. --- function used to get information about tasks --- @section getters - ---[[-- Gets the task information that is linked with this id -@tparam string task_id the uid of the task you want to get -@treturn table the task information - -@usage-- Getting task information outside of on_update -local task = Tasks.get_task(task_id) - -]] -function Tasks.get_task(task_id) - return TaskData:get(task_id) -end - ---[[-- Gets all the task ids that a force has -@tparam string force_name the name of the force that you want the task ids for -@treturn table an array of all the task ids - -@usage-- Getting the task ids for a force -local task_ids = Tasks.get_force_task_ids(game.player.force.name) - -]] -function Tasks.get_force_task_ids(force_name) - return force_tasks[force_name] or {} -end - ---[[-- Gets the editing state for a player -@tparam string task_id the uid of the task you want to check -@tparam string player_name the name of the player that you want to check -@treturn boolean weather the player is currently editing this task - -@usage-- Check if a player is editing a task or not -local editing = Tasks.get_editing(task_id, game.player.name) - -]] -function Tasks.get_editing(task_id, player_name) - local task = TaskData:get(task_id) - return task.currently_editing[player_name] -end - --- Module Return -return Tasks diff --git a/exp_legacy/module/modules/data/language.lua b/exp_legacy/module/modules/data/language.lua index 9a1f5826..5a188b65 100644 --- a/exp_legacy/module/modules/data/language.lua +++ b/exp_legacy/module/modules/data/language.lua @@ -5,6 +5,10 @@ local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data local LocalLanguage = PlayerData.Statistics:combine("LocalLanguage") LocalLanguage:set_default("Unknown") +LocalLanguage:set_metadata{ + name = { "exp-statistics.Locale" }, + tooltip = { "exp-statistics.Locale-tooltip" }, +} local function set_locale(event) local player = game.players[event.player_index] diff --git a/exp_legacy/module/modules/gui/readme.lua b/exp_legacy/module/modules/gui/readme.lua deleted file mode 100644 index a90e65c2..00000000 --- a/exp_legacy/module/modules/gui/readme.lua +++ /dev/null @@ -1,483 +0,0 @@ ---[[-- Gui Module - Readme - - Adds a main gui that contains lots of important information about our server - @gui Readme - @alias readme -]] - -local ExpUtil = require("modules/exp_util") -local Gui = require("modules/exp_gui") -local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event -local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles -local Commands = require("modules/exp_commands") --- @dep expcore.commands -local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data -local External = require("modules.exp_legacy.expcore.external") --- @dep expcore.external -local format_number = require("util").format_number --- @dep util - -local tabs = {} -local function define_tab(caption, tooltip, element_define) - tabs[#tabs + 1] = { caption, tooltip, element_define } -end - -local frame_width = 595 -- controls width of top descriptions -local title_width = 270 -- controls the centering of the titles -local scroll_height = 275 -- controls the height of the scrolls - ---- Sub content area used within the content areas -local sub_content = Gui.define("readme_sub_content") - :draw{ - type = "frame", - direction = "vertical", - style = "inside_deep_frame", - } - :style{ - horizontally_stretchable = true, - horizontal_align = "center", - padding = { 2, 2 }, - top_margin = 2, - } - ---- Table which has a title above it above it -local title_table = Gui.define("readme_title_table") - :draw(function(_, parent, bar_size, caption, column_count) - Gui.elements.title_label(parent, bar_size, caption) - - return parent.add{ - type = "table", - column_count = column_count, - style = "bordered_table", - } - end) - :style{ - padding = 0, - cell_padding = 0, - vertical_align = "center", - horizontally_stretchable = true, - } - ---- Scroll to be used with Gui.elements.title_label tables -local title_table_scroll = Gui.define("readme_title_table_scroll") - :draw{ - type = "scroll-pane", - direction = "vertical", - horizontal_scroll_policy = "never", - vertical_scroll_policy = "auto", - style = "scroll_pane_under_subheader", - } - :style{ - padding = { 1, 3 }, - maximal_height = scroll_height, - horizontally_stretchable = true, - } - ---- Used to connect to servers in server list -local join_server = Gui.define("readme_join_server") - :draw(function(_, parent, server_id, wrong_version) - local status = External.get_server_status(server_id) or "Offline" - if wrong_version then status = "Version" end - local flow = parent.add{ name = server_id, type = "flow" } - local button = flow.add{ - type = "sprite-button", - sprite = "utility/circuit_network_panel", - hovered_sprite = "utility/circuit_network_panel", - tooltip = { "readme.servers-connect-" .. status, wrong_version }, - style = "frame_action_button", - } - - if status == "Offline" or status == "Current" then - button.enabled = false - button.sprite = "utility/circuit_network_panel" - elseif status == "Version" then - button.enabled = false - button.sprite = "utility/shuffle" - elseif status == "Password" then - button.sprite = "utility/warning_white" - button.hovered_sprite = "utility/warning" - elseif status == "Modded" then - button.sprite = "utility/downloading_white" - button.hovered_sprite = "utility/downloading" - end - - return button - end) - :style{ - size = 20, - padding = -1, - } - :on_click(function(def, player, element) - local server_id = element.parent.name - External.request_connection(player, server_id, true) - end) - -local welcome_time_format = ExpUtil.format_time_factory_locale{ format = "long", days = true, hours = true, minutes = true } - ---- Content area for the welcome tab -define_tab({ "readme.welcome-tab" }, { "readme.welcome-tooltip" }, Gui.define("readme_welcome") - :draw(function(_, parent) - local server_details = { name = "APERX S0 - Local", welcome = "Failed to load description: disconnected from external api.", reset_time = "Non Set", branch = "Unknown" } - if External.valid() then server_details = External.get_current_server() end - local container = parent.add{ type = "flow", direction = "vertical" } - local player = Gui.get_player(parent) - - -- Set up the top flow with logos - local top_flow = container.add{ type = "flow" } - top_flow.add{ type = "sprite", sprite = "file/modules/exp_legacy/modules/gui/logo.png" } - local top_vertical_flow = top_flow.add{ type = "flow", direction = "vertical" } - top_flow.add{ type = "sprite", sprite = "file/modules/exp_legacy/modules/gui/logo.png" } - top_vertical_flow.style.horizontal_align = "center" - - -- Add the title and description to the top flow - Gui.elements.title_label(top_vertical_flow, 62, "Welcome to " .. server_details.name) - Gui.elements.centered_label(top_vertical_flow, 380, server_details.welcome) - Gui.elements.bar(container) - - -- Get the names of the roles the player has - local player_roles = Roles.get_player_roles(player) - local role_names = {} - for i, role in ipairs(player_roles) do - role_names[i] = role.name - end - - -- Add the other information to the gui - container.add{ type = "flow" }.style.height = 4 - local online_time = welcome_time_format(game.tick) - Gui.elements.centered_label(sub_content(container), frame_width, { "readme.welcome-general", server_details.reset_time, online_time }) - Gui.elements.centered_label(sub_content(container), frame_width, { "readme.welcome-roles", table.concat(role_names, ", ") }) - Gui.elements.centered_label(sub_content(container), frame_width, { "readme.welcome-chat" }) - - return container - end)) - ---- Content area for the rules tab -define_tab({ "readme.rules-tab" }, { "readme.rules-tooltip" }, Gui.define("readme_rules") - :draw(function(_, parent) - local container = parent.add{ type = "flow", direction = "vertical" } - - -- Add the title and description to the content - Gui.elements.title_label(container, title_width - 3, { "readme.rules-tab" }) - Gui.elements.centered_label(container, frame_width, { "readme.rules-general" }) - Gui.elements.bar(container) - container.add{ type = "flow" } - - -- Add a table for the rules - local rules = Gui.elements.scroll_table(container, scroll_height, 1) --[[@as LuaGuiElement]] - rules.style = "bordered_table" - rules.style.cell_padding = 4 - - -- Add the rules to the table - for i = 1, 15 do - Gui.elements.centered_label(rules, 565, { "readme.rules-" .. i }) - end - - return container - end)) - ---- Content area for the commands tab -define_tab({ "readme.commands-tab" }, { "readme.commands-tooltip" }, Gui.define("readme_commands") - :draw(function(_, parent) - local container = parent.add{ type = "flow", direction = "vertical" } - local player = Gui.get_player(parent) - - -- Add the title and description to the content - Gui.elements.title_label(container, title_width - 20, { "readme.commands-tab" }) - Gui.elements.centered_label(container, frame_width, { "readme.commands-general" }) - Gui.elements.bar(container) - container.add{ type = "flow" } - - -- Add a table for the commands - local commands = Gui.elements.scroll_table(container, scroll_height, 2) --[[@as LuaGuiElement]] - commands.style = "bordered_table" - commands.style.cell_padding = 0 - - -- Add the rules to the table - for name, command in pairs(Commands.list_for_player(player)) do - Gui.elements.centered_label(commands, 120, name) - Gui.elements.centered_label(commands, 450, command.description) - end - - return container - end)) - ---- Content area for the servers tab -define_tab({ "readme.servers-tab" }, { "readme.servers-tooltip" }, Gui.define("readme_servers") - :draw(function(_, parent) - local container = parent.add{ type = "flow", direction = "vertical" } - - -- Add the title and description to the content - Gui.elements.title_label(container, title_width - 10, { "readme.servers-tab" }) - Gui.elements.centered_label(container, frame_width, { "readme.servers-general" }) - Gui.elements.bar(container) - container.add{ type = "flow" } - - -- Draw the scroll - local scroll_pane = title_table_scroll(container) - scroll_pane.style.maximal_height = scroll_height + 20 -- the text is a bit shorter - - -- Add the factorio servers - if External.valid() then - local factorio_servers = title_table(scroll_pane, 225, { "readme.servers-factorio" }, 3) - local current_version = External.get_current_server().version - for server_id, server in pairs(External.get_servers()) do - Gui.elements.centered_label(factorio_servers, 110, server.short_name) - Gui.elements.centered_label(factorio_servers, 436, server.description) - join_server(factorio_servers, server_id, current_version ~= server.version and server.version) - end - else - local factorio_servers = title_table(scroll_pane, 225, { "readme.servers-factorio" }, 2) - for _, i in pairs{ 1, 2, 3, 5, 6, 8 } do - Gui.elements.centered_label(factorio_servers, 110, { "readme.servers-" .. i }) - Gui.elements.centered_label(factorio_servers, 460, { "readme.servers-d" .. i }) - end - end - - -- Add the external links - local external_links = title_table(scroll_pane, 235, { "readme.servers-external" }, 2) - for _, key in ipairs{ "website", "github" } do - local upper_key = key:gsub("^%l", string.upper) - Gui.elements.centered_label(external_links, 110, upper_key) - Gui.elements.centered_label(external_links, 460, { "links." .. key }, { "readme.servers-open-in-browser" }) - end - - return container - end)) - ---- Content area for the servers tab -define_tab({ "readme.backers-tab" }, { "readme.backers-tooltip" }, Gui.define("readme_backers") - :draw(function(_, parent) - local container = parent.add{ type = "flow", direction = "vertical" } - - -- Add the title and description to the content - Gui.elements.title_label(container, title_width - 10, { "readme.backers-tab" }) - Gui.elements.centered_label(container, frame_width, { "readme.backers-general" }) - Gui.elements.bar(container) - container.add{ type = "flow" } - - -- Find which players will go where - local done = {} - local groups = { - { _roles = { "Senior Administrator", "Administrator" }, _title = { "readme.backers-management" }, _width = 230 }, - { _roles = { "Senior Moderator", "Moderator", "Trainee Moderator" }, _title = { "readme.backers-staff" }, _width = 230 }, - { _roles = { "Board Member", "Supporter", "Partner" }, _title = { "readme.backers-backers" }, _width = 230 }, -- change role to board - { _roles = { "Veteran" }, _title = { "readme.backers-active" }, _width = 230 }, - -- _time = 3 * 3600 * 60 - } - - -- Fill by player roles - for player_name, player_roles in pairs(Roles.config.players) do - for _, players in ipairs(groups) do - for _, role_name in pairs(players._roles) do - if table.contains(player_roles, role_name) then - done[player_name] = true - table.insert(players, player_name) - break - end - end - end - end - - -- Fill by active times - for _, player in pairs(game.players) do - if not done[player.name] then - for _, players in ipairs(groups) do - if players._time and player.online_time > players._time then - table.insert(players, player.name) - end - end - end - end - - -- Add the different tables - local scroll_pane = title_table_scroll(container) - for _, players in ipairs(groups) do - local table = title_table(scroll_pane, players._width, players._title, 4) - for _, player_name in ipairs(players) do - Gui.elements.centered_label(table, 140, player_name) - end - - if #players < 4 then - for i = 1, 4 - #players do - Gui.elements.centered_label(table, 140) - end - end - end - - return container - end)) - ---- Content area for the player data tab -define_tab({ "readme.data-tab" }, { "readme.data-tooltip" }, Gui.define("readme_data") - :draw(function(_, parent) - local container = parent.add{ type = "flow", direction = "vertical" } - local player = Gui.get_player(parent) - local player_name = player.name - - local enum = PlayerData.PreferenceEnum - local preference = PlayerData.DataSavingPreference:get(player_name) - local preference_meta = PlayerData.DataSavingPreference.metadata - preference = enum[preference] - - -- Add the title and description to the content - Gui.elements.title_label(container, title_width, { "readme.data-tab" }) - Gui.elements.centered_label(container, frame_width, { "readme.data-general" }) - Gui.elements.bar(container) - container.add{ type = "flow" } - local scroll_pane = title_table_scroll(container) - - -- Add the required area - local required = title_table(scroll_pane, 250, { "readme.data-required" }, 2) - Gui.elements.centered_label(required, 150, preference_meta.name, preference_meta.tooltip) - Gui.elements.centered_label(required, 420, { "expcore-data.preference-" .. enum[preference] }, preference_meta.value_tooltip) - - for name, child in pairs(PlayerData.Required.children) do - local metadata = child.metadata - local value = child:get(player_name) - if value ~= nil or metadata.show_always then - if metadata.stringify then value = metadata.stringify(value) end - Gui.elements.centered_label(required, 150, metadata.name or { "exp-required." .. name }, metadata.tooltip or { "exp-required." .. name .. "-tooltip" }) - Gui.elements.centered_label(required, 420, tostring(value), metadata.value_tooltip or { "exp-required." .. name .. "-value-tooltip" }) - end - end - - -- Add the settings area - if preference <= enum.Settings then - local settings = title_table(scroll_pane, 255, { "readme.data-settings" }, 2) - for name, child in pairs(PlayerData.Settings.children) do - local metadata = child.metadata - local value = child:get(player_name) - if not metadata.permission or Roles.player_allowed(player, metadata.permission) then - if metadata.stringify then value = metadata.stringify(value) end - if value == nil then value = "None set" end - Gui.elements.centered_label(settings, 150, metadata.name or { "exp-settings." .. name }, metadata.tooltip or { "exp-settings." .. name .. "-tooltip" }) - Gui.elements.centered_label(settings, 420, tostring(value), metadata.value_tooltip or { "exp-settings." .. name .. "-value-tooltip" }) - end - end - end - - -- Add the statistics area - if preference <= enum.Statistics then - local count = 4 - local statistics = title_table(scroll_pane, 250, { "readme.data-statistics" }, 4) - for _, name in pairs(PlayerData.Statistics.metadata.display_order) do - local child = PlayerData.Statistics[name] - local metadata = child.metadata - local value = child:get(player_name) - if value ~= nil or metadata.show_always then - count = count - 2 - if metadata.stringify then - value = metadata.stringify(value) - else - value = format_number(value or 0, false) - end - Gui.elements.centered_label(statistics, 150, metadata.name or { "exp-statistics." .. name }, metadata.tooltip or { "exp-statistics." .. name .. "-tooltip" }) - Gui.elements.centered_label(statistics, 130, { "readme.data-format", value, metadata.unit or "" }, metadata.value_tooltip or { "exp-statistics." .. name .. "-tooltip" }) - end - end - - if count > 0 then for i = 1, count do Gui.elements.centered_label(statistics, 140) end end - end - - -- Add the misc area - local skip = { DataSavingPreference = true, Settings = true, Statistics = true, Required = true } - local count = 0; for _ in pairs(PlayerData.All.children) do count = count + 1 end - - if preference <= enum.All and count > 4 then - local misc = title_table(scroll_pane, 232, { "readme.data-misc" }, 2) - for name, child in pairs(PlayerData.All.children) do - if not skip[name] then - local metadata = child.metadata - local value = child:get(player_name) - if value ~= nil or metadata.show_always then - if metadata.stringify then value = metadata.stringify(value) end - Gui.elements.centered_label(misc, 150, metadata.name or name, metadata.tooltip) - Gui.elements.centered_label(misc, 420, tostring(value), metadata.value_tooltip) - end - end - end - end - - return container - end)) - ---- Main readme container for the center flow -local readme_toggle -local readme = Gui.define("readme") - :draw(function(def, parent) - local container = parent.add{ - name = def.name, - type = "frame", - style = "invisible_frame", - } - - -- Add the left hand side of the frame back, removed because of frame_tabbed_pane style - local left_alignment = Gui.elements.aligned_flow(container, { vertical_align = "bottom" }) - left_alignment.style.padding = { 32, 0, 0, 0 } - - local left_side = - left_alignment.add{ - type = "frame", - style = "character_gui_left_side", - } - left_side.style.vertically_stretchable = true - left_side.style.padding = 0 - left_side.style.width = 5 - - -- Add the tab pane - local tab_pane = container.add{ - name = "pane", - type = "tabbed-pane", - style = "frame_tabbed_pane", - } - - -- Add the different content areas - for _, tab_details in ipairs(tabs) do - local tab = tab_pane.add{ type = "tab", style = "frame_tab", caption = tab_details[1], tooltip = tab_details[2] } - tab_pane.add_tab(tab, tab_details[3](tab_pane)) - end - - return container - end) - :on_opened(function(def, player, element) - Gui.toolbar.set_button_toggled_state(readme_toggle, player, true) - end) - :on_closed(function(def, player, element) - Gui.toolbar.set_button_toggled_state(readme_toggle, player, false) - Gui.destroy_if_valid(element) - end) - ---- Toggle button for the readme gui -readme_toggle = - Gui.toolbar.create_button{ - name = "readme_toggle", - auto_toggle = true, - sprite = "virtual-signal/signal-info", - tooltip = { "readme.main-tooltip" }, - visible = function(player, element) - return Roles.player_allowed(player, "gui/readme") - end - } - :on_click(function(def, player, element) - local center = player.gui.center - if center[readme.name] then - player.opened = nil - else - player.opened = readme(center) - end - end) - ---- When a player joins the game for the first time show this gui -Event.add(defines.events.on_player_created, function(event) - local player = game.players[event.player_index] - local element = readme(player.gui.center) - element.pane.selected_tab_index = 1 - player.opened = element -end) - -local function clear_readme(event) - local player = game.players[event.player_index] - if not player.opened then - Gui.destroy_if_valid(player.gui.center[readme.name]) - end -end - ---- When a player joins or respawns, clear center unless the player has something open -Event.add(defines.events.on_player_joined_game, clear_readme) -Event.add(defines.events.on_player_respawned, clear_readme) diff --git a/exp_legacy/module/modules/gui/task-list.lua b/exp_legacy/module/modules/gui/task-list.lua deleted file mode 100644 index 3cbdf040..00000000 --- a/exp_legacy/module/modules/gui/task-list.lua +++ /dev/null @@ -1,794 +0,0 @@ ---[[-- Gui Module - Task List - - Adds a task list to the game which players can add, remove and edit items on - @gui Task-List - @alias task_list -]] - -local ExpUtil = require("modules/exp_util") -local Gui = require("modules/exp_gui") -local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event -local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles -local Datastore = require("modules.exp_legacy.expcore.datastore") --- @dep expcore.datastore -local config = require("modules.exp_legacy.config.gui.tasks") --- @dep config.gui.tasks -local Tasks = require("modules.exp_legacy.modules.control.tasks") --- @dep modules.control.tasks - -local format_time = ExpUtil.format_time_factory_locale{ format = "short", hours = true, minutes = true } - ---- Stores all data for the task gui by player -local TaskGuiData = Datastore.connect("TaskGuiData") -TaskGuiData:set_serializer(Datastore.name_serializer) -local PlayerIsEditing = TaskGuiData:combine("PlayerIsEditing") -PlayerIsEditing:set_default(false) -local PlayerIsCreating = TaskGuiData:combine("PlayerIsCreating") -PlayerIsCreating:set_default(false) -local PlayerSelected = TaskGuiData:combine("PlayerSelected") -PlayerSelected:set_default(nil) - --- Styles used for sprite buttons -local Styles = { - sprite22 = { - height = 22, - width = 22, - padding = -2, - }, - footer_button = { - height = 29, - maximal_width = 268, - horizontally_stretchable = true, - padding = -2, - }, -} - ---- If a player is allowed to use the edit buttons -local function check_player_permissions(player, task) - if task then - -- When a task is given check if the player can edit it - local allow_edit_task = config.allow_edit_task - - -- Check if the player being the last to edit will override existing permisisons - if config.user_can_edit_own_tasks and task.last_edit_name == player.name then - return true - end - - -- Check player has permisison based on value in the config - if allow_edit_task == "all" then - return true - elseif allow_edit_task == "admin" then - return player.admin - elseif allow_edit_task == "expcore.roles" then - return Roles.player_allowed(player, config.expcore_roles_allow_edit_task) - end - - -- Return false as all other condidtions have not been met - return false - else - -- When a task is not given check if the player can add a new task - local allow_add_task = config.allow_add_task - - -- Check player has permisison based on value in the config - if allow_add_task == "all" then - return true - elseif allow_add_task == "admin" then - return player.admin - elseif allow_add_task == "expcore.roles" then - return Roles.player_allowed(player, config.expcore_roles_allow_add_task) - end - - -- Return false as all other condidtions have not been met - return false - end -end - ---- Elements - ---- Button displayed in the header bar, used to add a new task --- @element add_new_task -local add_new_task = Gui.define("add_new_task") - :draw{ - type = "sprite-button", - sprite = "utility/add", - tooltip = { "task-list.add-tooltip" }, - style = "tool_button", - name = Gui.from_name, - } - :style(Styles.sprite22) - :on_click( - function(def, player, element) - -- Disable editing - PlayerIsEditing:set(player, false) - -- Clear selected - PlayerSelected:set(player, nil) - -- Open task create footer - PlayerIsCreating:set(player, true) - end - ) - ---- Header displayed when no tasks are in the task list --- @element no_tasks_found -local no_tasks_found = Gui.define("no_tasks_found") - :draw( - function(_, parent) - local header = - parent.add{ - name = "no_tasks_found_element", - type = "frame", - style = "negative_subheader_frame", - } - header.style.horizontally_stretchable = true - header.style.bottom_margin = 0 - -- Flow used for centering the content in the subheader - local center = - header.add{ - type = "flow", - } - center.style.vertical_align = "center" - center.style.horizontal_align = "center" - center.style.horizontally_stretchable = true - center.add{ - name = "header_label", - type = "label", - style = "bold_label", - caption = { "", "[img=utility/warning_white] ", { "task-list.no-tasks" } }, - tooltip = { "task-list.no-tasks-tooltip" }, - } - return header - end - ) - ---- Frame element with the right styling --- @element subfooter_frame -local subfooter_frame = Gui.define("task_list_subfooter_frame") - :draw{ - type = "frame", - name = Gui.from_argument(1), - direction = "vertical", - style = "subfooter_frame", - } - :style{ - height = 0, - padding = 5, - use_header_filler = false, - } - - ---- Label element preset --- @element subfooter_label -local subfooter_label = Gui.define("task_list_subfooter_label") - :draw{ - name = "footer_label", - type = "label", - style = "frame_title", - caption = Gui.from_argument(1), - } - ---- Action flow that contains action buttons --- @element subfooter_actions -local subfooter_actions = Gui.define("task_list_subfooter_actions") - :draw{ - type = "flow", - name = "actions", - } - ---- Button element with a flow around it to fix duplicate name inside of the scroll flow --- @element task_list_item -local task_list_item = Gui.define("task_list_item") - :draw( - function(def, parent, task) - local flow = parent.add{ - type = "flow", - name = "task-" .. task.task_id, - caption = task.task_id, - } - - flow.style.horizontally_stretchable = true - - local button = flow.add{ - name = def.name, - type = "button", - style = "list_box_item", - caption = task.title, - tooltip = { "task-list.last-edit", task.last_edit_name, format_time(task.last_edit_time) }, - } - - button.style.horizontally_stretchable = true - button.style.horizontally_squashable = true - - return button - end - ) - :on_click( - function(def, player, element) - local task_id = element.parent.caption - PlayerSelected:set(player, task_id) - end - ) - ---- Scrollable list of all tasks --- @element task_list -local task_list = Gui.define("task_list") - :draw( - function(_, parent) - local scroll_pane = - parent.add{ - name = "scroll", - type = "scroll-pane", - direction = "vertical", - horizontal_scroll_policy = "never", - vertical_scroll_policy = "auto", - style = "scroll_pane_under_subheader", - } - scroll_pane.style.horizontally_stretchable = true - scroll_pane.style.padding = 0 - scroll_pane.style.maximal_height = 224 - - local flow = - scroll_pane.add{ - name = "task_list", - type = "flow", - direction = "vertical", - } - flow.style.vertical_spacing = 0 - flow.style.horizontally_stretchable = true - - return flow - end - ) - ---- Button element inside the task view footer to start editing a task --- @element task_view_edit_button -local task_view_edit_button = Gui.define("task_view_edit_button") - :draw{ - type = "button", - name = Gui.from_name, - caption = { "", "[img=utility/rename_icon] ", { "task-list.edit" } }, - tooltip = { "task-list.edit-tooltip" }, - style = "shortcut_bar_button", - }:style(Styles.footer_button):on_click( - function(def, player, element) - local selected = PlayerSelected:get(player) - PlayerIsEditing:set(player, true) - - Tasks.set_editing(selected, player.name, true) - end - ) - ---- Button to close the task view footer --- @element task_view_close_button -local task_view_close_button = Gui.define("task_view_close_button") - :draw{ - type = "sprite-button", - sprite = "utility/collapse", - style = "frame_action_button", - tooltip = { "task-list.close-tooltip" }, - } - :style(Styles.sprite22) - :on_click( - function(def, player, element) - PlayerSelected:set(player, nil) - end - ) - ---- Button to delete the task inside the task view footer --- @element task_view_delete_button -local task_view_delete_button = Gui.define("task_view_delete_button") - :draw{ - type = "button", - name = Gui.from_name, - caption = { "", "[img=utility/trash] ", { "task-list.delete" } }, - tooltip = { "task-list.delete-tooltip" }, - style = "shortcut_bar_button_red", - } - :style(Styles.footer_button) - :on_click( - function(def, player, element) - local selected = PlayerSelected:get(player) - PlayerSelected:set(player, nil) - Tasks.remove_task(selected) - end - ) - ---- Subfooter inside the tasklist container that holds all the elements for viewing a task --- @element task_view_footer -local task_view_footer = Gui.define("task_view_footer") - :draw( - function(_, parent) - local footer = subfooter_frame(parent, "view") - local flow = footer.add{ type = "flow" } - subfooter_label(flow, { "task-list.view-footer-header" }) - local alignment = Gui.elements.aligned_flow(flow) - task_view_close_button(alignment) - local title_label = - footer.add{ - type = "label", - name = "title", - } - title_label.style.padding = 4 - title_label.style.font = "default-bold" - title_label.style.single_line = false - local body_label = - footer.add{ - type = "label", - name = "body", - } - body_label.style.padding = 4 - body_label.style.single_line = false - - local action_flow = subfooter_actions(footer) - task_view_delete_button(action_flow) - task_view_edit_button(action_flow) - return footer - end - ) - -local message_pattern = "(.-)\n(.*)" - ---- Parse a string into a message object with title and body --- @tparam string str message data -local function parse_message(str) - -- Trim the spaces of the string - local trimmed = string.gsub(str, "^%s*(.-)%s*$", "%1") - local message = { title = "", body = "" } - local title, body = string.match(trimmed, message_pattern) - if not title then - -- If it doesn't match the pattern return the str as a title - message.title = trimmed - else - message.title = title - message.body = body - end - return message -end - --- Button variable initialisation because it is used inside the textfield element events -local task_edit_confirm_button -local task_create_confirm_button - ---- Textfield element used in both the task create and edit footers --- @element task_message_textfield -local task_message_textfield = Gui.define("task_message_textfield") - :draw{ - name = Gui.from_name, - type = "text-box", - text = "", - }:style{ - maximal_width = 268, - minimal_height = 100, - horizontally_stretchable = true, - } - :on_text_changed( - function(def, player, element) - local is_editing = PlayerIsEditing:get(player) - local is_creating = PlayerIsCreating:get(player) - - local valid = string.len(element.text) > 5 - - if is_creating then - element.parent.actions[task_create_confirm_button.name].enabled = valid - elseif is_editing then - element.parent.actions[task_edit_confirm_button.name].enabled = valid - end - end - ) - ---- Button to confirm the changes inside the task edit footer --- @element task_edit_confirm_button -task_edit_confirm_button = Gui.define("task_edit_confirm_button") - :draw{ - type = "button", - name = Gui.from_name, - caption = { "", "[img=utility/check_mark] ", { "task-list.confirm" } }, - tooltip = { "task-list.confirm-tooltip" }, - style = "shortcut_bar_button_green", - } - :style(Styles.footer_button) - :on_click( - function(def, player, element) - local selected = PlayerSelected:get(player) - PlayerIsEditing:set(player, false) - local new_message = element.parent.parent[task_message_textfield.name].text - local parsed = parse_message(new_message) - Tasks.update_task(selected, player.name, parsed.title, parsed.body) - Tasks.set_editing(selected, player.name, nil) - end - ) - ---- Button to discard the changes inside the task edit footer --- @element edit_task_discard_button -local edit_task_discard_button = Gui.define("edit_task_discard_button") - :draw{ - type = "button", - caption = { "", "[img=utility/close_black] ", { "task-list.discard" } }, - tooltip = { "task-list.discard-tooltip" }, - style = "shortcut_bar_button_red", - } - :style(Styles.footer_button) - :on_click( - function(def, player, element) - local selected = PlayerSelected:get(player) - Tasks.set_editing(selected, player.name, nil) - PlayerIsEditing:set(player, false) - end - ) - ---- Subfooter inside the tasklist container that holds all the elements for editing a task --- @element task_edit_footer -local task_edit_footer = Gui.define("task_edit_footer") - :draw( - function(_, parent) - local footer = subfooter_frame(parent, "edit") - subfooter_label(footer, { "task-list.edit-footer-header" }) - - task_message_textfield(footer) - - local action_flow = subfooter_actions(footer) - - edit_task_discard_button(action_flow) - task_edit_confirm_button(action_flow) - - return footer - end - ) - ---- Button to confirm the changes inside the task create footer --- @element task_create_confirm_button -task_create_confirm_button = Gui.define("task_create_confirm_button") - :draw{ - type = "button", - name = Gui.from_name, - caption = { "", "[img=utility/check_mark] ", { "task-list.confirm" } }, - tooltip = { "task-list.confirm-tooltip" }, - style = "shortcut_bar_button_green", - enabled = false, - } - :style(Styles.footer_button) - :on_click( - function(def, player, element) - local message = element.parent.parent[task_message_textfield.name].text - PlayerIsCreating:set(player, false) - local parsed = parse_message(message) - local task_id = Tasks.add_task(player.force.name, player.name, parsed.title, parsed.body) - PlayerSelected:set(player, task_id) - end - ) - ---- Button to discard the changes inside the task create footer --- @element task_create_discard_button -local task_create_discard_button = Gui.define("task_create_discard_button") - :draw{ - type = "button", - caption = { "", "[img=utility/close_black] ", { "task-list.discard" } }, - tooltip = { "task-list.discard-tooltip" }, - style = "shortcut_bar_button_red", - } - :style(Styles.footer_button) - :on_click( - function(def, player, element) - PlayerIsCreating:set(player, false) - end - ) - ---- Subfooter inside the tasklist container that holds all the elements to create a new task --- @element task_create_footer -local task_create_footer = Gui.define("task_create_footer") - :draw( - function(_, parent) - local footer = subfooter_frame(parent, "create") - subfooter_label(footer, { "task-list.create-footer-header" }) - - task_message_textfield(footer) - - local action_flow = subfooter_actions(footer) - - task_create_discard_button(action_flow) - task_create_confirm_button(action_flow) - - return footer - end - ) - ---- Clear and repopulate the task list with all current tasks -local repopulate_task_list = function(task_list_element) - local force = Gui.get_player(task_list_element).force - local task_ids = Tasks.get_force_task_ids(force.name) - task_list_element.clear() - - -- Set visibility of the no_tasks_found element depending on the amount of tasks still in the task manager - task_list_element.parent.parent.no_tasks_found_element.visible = #task_ids == 0 - - -- Add each task to the flow - for _, task_id in ipairs(task_ids) do - -- Add the task - local task = Tasks.get_task(task_id) - task_list_item(task_list_element, task) - end -end - ---- Main task list container for the left flow --- @element task_list_container -local task_list_container = Gui.define("task_list_container") - :draw( - function(def, parent) - -- Draw the internal container - local container = Gui.elements.container(parent, 268) - container.style.maximal_width = 268 - - -- Draw the header - local header = Gui.elements.header(container, { - name = "header", - caption = { "task-list.main-caption" }, - tooltip = { "task-list.sub-tooltip" }, - }) - - -- Draw the new task button - local player = Gui.get_player(parent) - local add_new_task_element = add_new_task(header) - add_new_task_element.visible = check_player_permissions(player) - - -- Draw no task found element - no_tasks_found(container) - - -- Draw task list element - local task_list_element = task_list(container) - repopulate_task_list(task_list_element) - - local task_view_footer_element = task_view_footer(container) - local task_edit_footer_element = task_edit_footer(container) - local task_create_footer_element = task_create_footer(container) - task_view_footer_element.visible = false - task_edit_footer_element.visible = false - task_create_footer_element.visible = false - -- Return the external container - return container.parent - end - ) - ---- Add the element to the left flow with a toolbar button -Gui.add_left_element(task_list_container, function(player) - local task_ids = Tasks.get_force_task_ids(player.force.name) - return #task_ids > 0 -end) -Gui.toolbar.create_button{ - name = "task_list_toggle", - left_element = task_list_container, - sprite = "utility/not_enough_repair_packs_icon", - tooltip = { "task-list.main-tooltip" }, - visible = function(player, element) - return Roles.player_allowed(player, "gui/task-list") - end -} - --- Function to update a single task and some of the elements inside the container -local update_task = function(player, task_list_element, task_id) - local task = Tasks.get_task(task_id) - local task_ids = Tasks.get_force_task_ids(player.force.name) - -- Set visibility of the no_tasks_found element depending on the amount of tasks still in the task manager - task_list_element.parent.parent.no_tasks_found_element.visible = #task_ids == 0 - - -- Task no longer exists so should be removed from the list - if not task then - task_list_element["task-" .. task_id].destroy() - return - end - - local flow = task_list_element["task-" .. task_id] - if not flow then - -- If task does not exist yet add it to the list - task_list_item(task_list_element, task) - else - -- If the task exists update the caption and tooltip - local button = flow[task_list_item.name] - button.caption = task.title - button.tooltip = { "task-list.last-edit", task.last_edit_name, format_time(task.last_edit_time) } - end -end - --- Update the footer task edit view -local update_task_edit_footer = function(player, task_id) - local task = Tasks.get_task(task_id) - local container = Gui.get_left_element(task_list_container, player) - local edit_flow = container.frame.edit - - local message_element = edit_flow[task_message_textfield.name] - - message_element.focus() - message_element.text = task.title .. "\n" .. task.body -end - --- Update the footer task view -local update_task_view_footer = function(player, task_id) - local task = Tasks.get_task(task_id) - local container = Gui.get_left_element(task_list_container, player) - local view_flow = container.frame.view - local has_permission = check_player_permissions(player, task) - - local title_element = view_flow.title - local body_element = view_flow.body - local edit_button_element = view_flow.actions[task_view_edit_button.name] - local delete_button_element = view_flow.actions[task_view_delete_button.name] - - edit_button_element.visible = has_permission - delete_button_element.visible = has_permission - title_element.caption = task.title - body_element.caption = task.body - - local players_editing = table.get_keys(task.currently_editing) - if #players_editing > 0 then - edit_button_element.tooltip = { "task-list.edit-tooltip", table.concat(players_editing, ", ") } - else - edit_button_element.tooltip = { "task-list.edit-tooltip-none" } - end -end - ---- When a new task is added it will update the task list for everyone on that force ---- Or when a task is updated it will update the specific task elements -Tasks.on_update( - function(task_id, curr_state, prev_state) - -- Get the force to update, task is nil when removed - local force - if curr_state then - force = game.forces[curr_state.force_name] - else - force = game.forces[prev_state.force_name] - end - - -- Update the task for all the players on the force - for _, player in pairs(force.connected_players) do - -- Update the task view elements if the player currently being looped over has this specific task selected - local selected = PlayerSelected:get(player) - if selected == task_id then - if curr_state then - update_task_view_footer(player, selected) - else - PlayerSelected:set(player, nil) - end - end - - local container = Gui.get_left_element(task_list_container, player) - local task_list_element = container.frame.scroll.task_list - - -- Update the task that was changed - update_task(player, task_list_element, task_id) - end - end -) - --- When a player is creating a new task. -PlayerIsCreating:on_update( - function(player_name, curr_state, _) - local player = game.players[player_name] - - local container = Gui.get_left_element(task_list_container, player) - local create = container.frame.create - - -- Clear the textfield - local message_element = container.frame.create[task_message_textfield.name] - local confirm_button_element = container.frame.create.actions[task_create_confirm_button.name] - message_element.focus() - message_element.text = "" - confirm_button_element.enabled = false - - if curr_state then - create.visible = true - else - create.visible = false - end - end -) - --- When a player selects a different warp from the list -PlayerSelected:on_update( - function(player_name, curr_state, prev_state) - local player = game.players[player_name] - - local container = Gui.get_left_element(task_list_container, player) - local task_list_element = container.frame.scroll.task_list - local view_flow = container.frame.view - local edit_flow = container.frame.edit - local is_editing = PlayerIsEditing:get(player) - local is_creating = PlayerIsCreating:get(player) - - -- If the selection has an previous state re-enable the button list element - if prev_state then - task_list_element["task-" .. prev_state][task_list_item.name].enabled = true - end - - if curr_state then - -- Disable the selected element - task_list_element["task-" .. curr_state][task_list_item.name].enabled = false - - -- Update the view footer - update_task_view_footer(player, curr_state) - - -- If a player is creating then remove the creation dialogue - if is_creating then - PlayerIsCreating:set(player, false) - end - - -- Depending on if the player is currently editing change the current task edit footer to the current task - if is_editing then - update_task_edit_footer(player, curr_state) - Tasks.set_editing(prev_state, player.name, nil) - Tasks.set_editing(curr_state, player.name, true) - view_flow.visible = false - edit_flow.visible = true - else - view_flow.visible = true - edit_flow.visible = false - end - else - -- If curr_state nil then hide footer elements and set editing to nil for prev_state - if prev_state and Tasks.get_task(prev_state) then - Tasks.set_editing(prev_state, player.name, nil) - end - view_flow.visible = false - edit_flow.visible = false - end - end -) - --- When the edit view opens or closes -PlayerIsEditing:on_update( - function(player_name, curr_state, _) - local player = game.players[player_name] - - local container = Gui.get_left_element(task_list_container, player) - local view_flow = container.frame.view - local edit_flow = container.frame.edit - - local selected = PlayerSelected:get(player) - if curr_state then - update_task_edit_footer(player, selected) - view_flow.visible = false - edit_flow.visible = true - else - view_flow.visible = true - edit_flow.visible = false - end - end -) - ---- Makes sure the right buttons are present when roles change -local function role_update_event(event) - local player = game.players[event.player_index] - local frame = Gui.get_left_element(task_list_container, player).frame - -- Update the view task - local selected = PlayerSelected:get(player) - if selected then - update_task_view_footer(player, selected) - PlayerSelected:set(player, selected) - -- button to edit the task. - -- Resetting the players selected task to make sure the player does not see an - end - - -- Update the new task button and create footer in case the user can now add them - local has_permission = check_player_permissions(player) - local add_new_task_element = frame.header[add_new_task.name] - add_new_task_element.visible = has_permission - local is_creating = PlayerIsCreating:get(player) - if is_creating and not has_permission then - PlayerIsCreating:set(player, false) - end -end - -Event.add(Roles.events.on_role_assigned, role_update_event) -Event.add(Roles.events.on_role_unassigned, role_update_event) - ---- Redraw all tasks and clear editing/creating after joining or changing force -local function reset_task_list(event) - -- Repopulate the task list - local player = game.players[event.player_index] - local container = Gui.get_left_element(task_list_container, player) - local task_list_element = container.frame.scroll.task_list - repopulate_task_list(task_list_element) - - -- Check if the selected task is still valid - local selected = PlayerSelected:get(player) - if selected and Tasks.get_task(selected) ~= nil then - PlayerIsCreating:set(player, false) - PlayerIsEditing:set(player, false) - PlayerSelected:set(player, nil) - end -end - -Event.add(defines.events.on_player_joined_game, reset_task_list) -Event.add(defines.events.on_player_changed_force, reset_task_list) diff --git a/exp_scenario/index.ts b/exp_scenario/index.ts index d6e85fcc..978a372c 100644 --- a/exp_scenario/index.ts +++ b/exp_scenario/index.ts @@ -1,5 +1,5 @@ import * as lib from "@clusterio/lib"; -import * as Messages from "./messages"; +// import * as Messages from "./messages"; lib.definePermission({ name: "exp_scenario.config.view", @@ -24,6 +24,7 @@ export const plugin: lib.PluginDeclaration = { controllerEntrypoint: "./dist/node/controller", instanceEntrypoint: "./dist/node/instance", + /* messages: [ ], @@ -31,4 +32,5 @@ export const plugin: lib.PluginDeclaration = { routes: [ "/exp_scenario", ], + */ }; diff --git a/exp_scenario/module/control.lua b/exp_scenario/module/control.lua index 62427829..65e35d78 100644 --- a/exp_scenario/module/control.lua +++ b/exp_scenario/module/control.lua @@ -76,6 +76,8 @@ add(require("modules/exp_scenario/gui/player_bonus")) add(require("modules/exp_scenario/gui/player_stats")) add(require("modules/exp_scenario/gui/production_stats")) add(require("modules/exp_scenario/gui/quick_actions")) +add(require("modules/exp_scenario/gui/readme")) add(require("modules/exp_scenario/gui/research_milestones")) add(require("modules/exp_scenario/gui/science_production")) add(require("modules/exp_scenario/gui/surveillance")) +add(require("modules/exp_scenario/gui/task_list")) diff --git a/exp_scenario/module/control/extra_logging.lua b/exp_scenario/module/control/extra_logging.lua index aaacd3d1..d469c390 100644 --- a/exp_scenario/module/control/extra_logging.lua +++ b/exp_scenario/module/control/extra_logging.lua @@ -37,8 +37,11 @@ local function on_pre_player_died(event) local player = assert(game.get_player(event.player_index)) local cause = event.cause if cause then - local by_player = event.cause.player - add_log_line("[DEATH]", player.name, "died because of", by_player and by_player.name or event.cause.name) + if cause.type == "character" then + add_log_line("[DEATH]", player.name, "died because of", cause.player.name) + else + add_log_line("[DEATH]", player.name, "died because of", cause.name) + end else add_log_line("[DEATH]", player.name, "died because of unknown reason") end @@ -52,9 +55,9 @@ local function on_research_finished(event) local inf_research_level = config_res.inf_res[config_res.mod_set][event.research.name] if inf_research_level and event.research.level >= inf_research_level then - add_log_line_locale{ "", "[RES] ", event.research.prototype.localised_name, " at level ", event.research.level - 1, "has been researched\n" } + add_log_line_locale{ "", "[RES]", event.research.prototype.localised_name, " at level ", event.research.level - 1, " has been researched\n" } else - add_log_line_locale{ "", "[RES] ", event.research.prototype.localised_name, "has been researched\n" } + add_log_line_locale{ "", "[RES]", event.research.prototype.localised_name, " has been researched\n" } end end @@ -67,7 +70,7 @@ end --- @param event EventData.on_player_left_game local function on_player_left_game(event) local player = assert(game.get_player(event.player_index)) - add_log_line("[LEAVE]", game.players[event.player_index].name, config.disconnect_reason[event.reason]) + add_log_line("[LEAVE]", player.name, config.disconnect_reason[event.reason]) end local e = defines.events diff --git a/exp_scenario/module/control/inventory_clear.lua b/exp_scenario/module/control/inventory_clear.lua index 2dc63e31..cdbfd650 100644 --- a/exp_scenario/module/control/inventory_clear.lua +++ b/exp_scenario/module/control/inventory_clear.lua @@ -1,5 +1,8 @@ --[[-- Control - Inventory Clear Will move players items to spawn when they are banned or kicked, option to clear on leave + +on_player_banned - player_name +on_player_kicked - player_index ]] local ExpUtil = require("modules/exp_util") @@ -7,6 +10,7 @@ local events = require("modules.exp_legacy.config.inventory_clear") --- @param event { player_index: number } local function clear_items(event) + if not event.player_index then return end local player = assert(game.get_player(event.player_index)) local inventory = assert(player.get_main_inventory()) ExpUtil.transfer_inventory_to_surface{ diff --git a/exp_scenario/module/gui/readme.lua b/exp_scenario/module/gui/readme.lua new file mode 100644 index 00000000..42a3778f --- /dev/null +++ b/exp_scenario/module/gui/readme.lua @@ -0,0 +1,701 @@ +--[[-- Gui Module - Readme +Adds a main gui that contains important information about the server. +]] + +local ExpUtil = require("modules/exp_util") +local Gui = require("modules/exp_gui") +local Roles = require("modules.exp_legacy.expcore.roles") +local Commands = require("modules/exp_commands") +local PlayerData = require("modules.exp_legacy.expcore.player_data") +local External = require("modules.exp_legacy.expcore.external") + +local format_number = require("util").format_number +local format_time = ExpUtil.format_time_factory_locale{ format = "long", days = true, hours = true, minutes = true } + +local frame_width = 595 +local title_width = 270 +local scroll_height = 275 + +--- @class ExpGui_Readme.elements +local Elements = {} + +--- @type table +local tabs = {} + +--- Register a readme tab +--- @param caption LocalisedString +--- @param tooltip LocalisedString +--- @param element ExpElement +local function define_tab(caption, tooltip, element) + tabs[#tabs + 1] = { caption = caption, tooltip = tooltip, element = element } +end + +--- Create a title section table +--- @class ExpGui_Readme.elements.title_table: ExpElement +--- @overload fun(parent: LuaGuiElement, bar_size: number, caption: LocalisedString, column_count: number): LuaGuiElement +Elements.title_table = Gui.define("readme/title_table") + :draw(function(_, parent, bar_size, caption, column_count) + Gui.elements.title_label(parent, bar_size, caption) + return parent.add{ + type = "table", + column_count = column_count, + style = "bordered_table", + } + end) + :style{ + padding = 0, + cell_padding = 0, + vertical_align = "center", + horizontally_stretchable = true, + } --[[ @as any ]] + +--- Scroll pane used for title tables +--- @class ExpGui_Readme.elements.title_table_scroll: ExpElement +--- @overload fun(parent: LuaGuiElement): LuaGuiElement +Elements.title_table_scroll = Gui.define("readme/title_table_scroll") + :draw{ + type = "scroll-pane", + direction = "vertical", + horizontal_scroll_policy = "never", + vertical_scroll_policy = "auto", + style = "scroll_pane_under_subheader", + } + :style{ + padding = { 1, 3 }, + maximal_height = scroll_height, + horizontally_stretchable = true, + } --[[ @as any ]] + +--- Sub content frame +--- @class ExpGui_Readme.elements.sub_content: ExpElement +--- @overload fun(parent: LuaGuiElement): LuaGuiElement +Elements.sub_content = Gui.define("readme/sub_content") + :draw{ + type = "frame", + direction = "vertical", + style = "inside_deep_frame", + } + :style{ + horizontally_stretchable = true, + horizontal_align = "center", + padding = { 2, 2 }, + top_margin = 2, + } --[[ @as any ]] + +--- @class ExpGui_Readme.elements.join_server.elements +--- @field server_id string + +--- Join server button +--- @class ExpGui_Readme.elements.join_server: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, server_id: string, wrong_version: string?): LuaGuiElement +Elements.join_server = Gui.define("readme/join_server") + :track_all_elements() + :draw(function(def, parent, server_id, wrong_version) + --- @cast def ExpGui_Readme.elements.join_server + local flow = parent.add{ + type = "flow", + } + + local button = flow.add{ + type = "sprite-button", + sprite = "utility/circuit_network_panel", + hovered_sprite = "utility/circuit_network_panel", + style = "frame_action_button", + } + + def.data[button] = { + server_id = server_id, + } + + Elements.join_server.refresh(button, wrong_version) + return button + end) + :style{ + size = 20, + padding = -1, + } + :on_click(function(def, player, button) + --- @cast def ExpGui_Readme.elements.join_server + local server_id = def.data[button].server_id + External.request_connection(player, server_id, true) + end) --[[ @as any ]] + +--- Refresh join server button +--- @param button LuaGuiElement +--- @param wrong_version string? +function Elements.join_server.refresh(button, wrong_version) + local server_id = Elements.join_server.data[button].server_id + local status = External.get_server_status(server_id) or "Offline" + + if wrong_version then + status = "Version" + end + + button.tooltip = { "exp-gui_readme.servers-connect-" .. status, wrong_version } + + if status == "Offline" or status == "Current" then + button.enabled = false + button.sprite = "utility/circuit_network_panel" + button.hovered_sprite = "utility/circuit_network_panel" + + elseif status == "Version" then + button.enabled = false + button.sprite = "utility/shuffle" + button.hovered_sprite = "utility/shuffle" + + elseif status == "Password" then + button.enabled = true + button.sprite = "utility/warning_white" + button.hovered_sprite = "utility/warning" + + elseif status == "Modded" then + button.enabled = true + button.sprite = "utility/downloading_white" + button.hovered_sprite = "utility/downloading" + + else + button.enabled = true + button.sprite = "utility/circuit_network_panel" + button.hovered_sprite = "utility/circuit_network_panel" + end +end + +--- Refresh all online join buttons +function Elements.join_server.refresh_all() + if not External.valid() then + return + end + + local current_version = External.get_current_server().version + + for _, button in Elements.join_server:tracked_elements() do + local server_id = Elements.join_server.data[button].server_id + local server = External.get_servers()[server_id] + + if server then + Elements.join_server.refresh(button, current_version ~= server.version and server.version or nil) + end + end +end + +--- Welcome tab +define_tab( + { "exp-gui_readme.welcome-tab" }, + { "exp-gui_readme.welcome-tooltip" }, + Gui.define("readme/welcome") + :draw(function(_, parent) + local player = Gui.get_player(parent) + + local server_details = { + name = "ExpGaming S0 - Local", + welcome = "Failed to load description: disconnected from external api.", + reset_time = "Not Set", + } + + if External.valid() then + server_details = External.get_current_server() + end + + local container = parent.add{ type = "flow", direction = "vertical" } + + local top_flow = container.add{ type = "flow" } + top_flow.add{ type = "sprite", sprite = "file/modules/exp_legacy/modules/gui/logo.png" } + + local center_flow = top_flow.add{ type = "flow", direction = "vertical" } + center_flow.style.horizontal_align = "center" + + Gui.elements.title_label(center_flow, 62, { "exp-gui_readme.welcome-title", server_details.name }) + Gui.elements.centered_label(center_flow, 380, server_details.welcome) + + top_flow.add{ type = "sprite", sprite = "file/modules/exp_legacy/modules/gui/logo.png" } + + Gui.elements.bar(container) + container.add{ type = "flow" }.style.height = 4 + + local role_names = {} + for i, role in ipairs(Roles.get_player_roles(player)) do + role_names[i] = role.name + end + + Gui.elements.centered_label( + Elements.sub_content(container), + frame_width, + { + "exp-gui_readme.welcome-general", + server_details.reset_time, + format_time(game.tick), + } + ) + + Gui.elements.centered_label( + Elements.sub_content(container), + frame_width, + { + "exp-gui_readme.welcome-roles", + table.concat(role_names, ", "), + } + ) + + Gui.elements.centered_label( + Elements.sub_content(container), + frame_width, + { "exp-gui_readme.welcome-chat" } + ) + + return container + end) --[[ @as any ]] +) + +--- Rules tab +define_tab( + { "exp-gui_readme.rules-tab" }, + { "exp-gui_readme.rules-tooltip" }, + Gui.define("readme/rules") + :draw(function(_, parent) + local container = parent.add{ type = "flow", direction = "vertical" } + Gui.elements.title_label(container, title_width - 3, { "exp-gui_readme.rules-tab" }) + Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.rules-general" }) + Gui.elements.bar(container) + container.add{ type = "flow" } + + local rules = Gui.elements.scroll_table(container, scroll_height, 1) + rules.style = "bordered_table" + rules.style.cell_padding = 4 + + for i = 1, 15 do + Gui.elements.centered_label(rules, frame_width - 30, { "exp-gui_readme.rules-" .. i }) + end + + return container + end) --[[ @as any ]] +) + +--- Commands tab +define_tab( + { "exp-gui_readme.commands-tab" }, + { "exp-gui_readme.commands-tooltip" }, + Gui.define("readme/commands") + :draw(function(_, parent) + local player = Gui.get_player(parent) + + local container = parent.add{ type = "flow", direction = "vertical" } + Gui.elements.title_label(container, title_width - 20, { "exp-gui_readme.commands-tab" }) + Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.commands-general" }) + Gui.elements.bar(container) + container.add{ type = "flow" } + + local commands = Gui.elements.scroll_table(container, scroll_height, 2) + commands.style = "bordered_table" + commands.style.cell_padding = 0 + + for name, command in pairs(Commands.list_for_player(player)) do + Gui.elements.centered_label(commands, 120, name) + Gui.elements.centered_label(commands, 450, command.description) + end + + return container + end) --[[ @as any ]] +) + +--- Servers tab +define_tab( + { "exp-gui_readme.servers-tab" }, + { "exp-gui_readme.servers-tooltip" }, + Gui.define("readme/servers") + :draw(function(_, parent) + local container = parent.add{ type = "flow", direction = "vertical" } + Gui.elements.title_label(container, title_width - 10, { "exp-gui_readme.servers-tab" }) + Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.servers-general" }) + Gui.elements.bar(container) + container.add{ type = "flow" } + + local scroll_pane = Elements.title_table_scroll(container) + scroll_pane.style.maximal_height = scroll_height + 20 + + if External.valid() then + local current_version = External.get_current_server().version + + local factorio_servers = Elements.title_table(scroll_pane, 225, { "exp-gui_readme.servers-factorio" }, 3) + + for server_id, server in pairs(External.get_servers()) do + Gui.elements.centered_label(factorio_servers, 110, server.short_name) + Gui.elements.centered_label(factorio_servers, 436, server.description) + Elements.join_server(factorio_servers, server_id, current_version ~= server.version and server.version or nil) + end + else + local factorio_servers = Elements.title_table(scroll_pane, 225, { "exp-gui_readme.servers-factorio" }, 2) + for i = 1, 8 do + Gui.elements.centered_label(factorio_servers, 110, { "exp-gui_readme.servers-" .. i }) + Gui.elements.centered_label(factorio_servers, 460, { "exp-gui_readme.servers-d" .. i }) + end + end + + local external_links = Elements.title_table(scroll_pane, 235, { "exp-gui_readme.servers-external" }, 2) + for _, key in ipairs{ "discord", "website", "patreon", "status", "github" } do + Gui.elements.centered_label(external_links, 110, key:gsub("^%l", string.upper)) + Gui.elements.centered_label(external_links, 460, { "links." .. key }, { "exp-gui_readme.servers-open-in-browser" }) + end + + return container + end) --[[ @as any ]] +) + +--- Backers tab +--- Content area for the backers tab +define_tab( + { "exp-gui_readme.backers-tab" }, + { "exp-gui_readme.backers-tooltip" }, + Gui.define("readme/backers") + :draw(function(_, parent) + local container = parent.add{ type = "flow", direction = "vertical" } + Gui.elements.title_label(container, title_width - 10, { "exp-gui_readme.backers-tab" }) + Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.backers-general" }) + Gui.elements.bar(container) + container.add{ type = "flow" } + + local groups = { + { + roles = { "Senior Administrator", "Administrator" }, + title = { "exp-gui_readme.backers-management" }, + width = 230, + players = {}, + }, + { + roles = { "Senior Moderator", "Moderator", "Trainee Moderator" }, + title = { "exp-gui_readme.backers-staff" }, + width = 230, + players = {}, + }, + { + roles = { "Board Member", "Supporter", "Partner" }, + title = { "exp-gui_readme.backers-backers" }, + width = 230, + players = {}, + }, + { + roles = {}, + time = 1 * 3600 * 60, + title = { "exp-gui_readme.backers-active" }, + width = 230, + players = {}, + }, + } + + local done = {} + + -- Fill groups from configured roles + for player_name, player_roles in pairs(Roles.config.players) do + for _, group in ipairs(groups) do + for _, role_name in ipairs(group.roles) do + if table.contains(player_roles, role_name) then + done[player_name] = true + group.players[#group.players + 1] = player_name + break + end + end + end + end + + -- Fill active player group + for _, player in pairs(game.players) do + if not done[player.name] then + for _, group in ipairs(groups) do + if group.time and player.online_time > group.time then + group.players[#group.players + 1] = player.name + end + end + end + end + + local scroll_pane = Elements.title_table_scroll(container) + + for _, group in ipairs(groups) do + if #group.players > 0 then + local backers_table = Elements.title_table(scroll_pane, group.width, group.title, 4) + + for _, player_name in ipairs(group.players) do + Gui.elements.centered_label(backers_table, 140, player_name) + end + + if #group.players < 4 then + for i = 1, 4 - #group.players do + Gui.elements.centered_label(backers_table, 140) + end + end + end + end + + return container + end) --[[ @as any ]] +) + +--- @class (exact) ExpGui_Readme.elements.readme_data.param table +--- @field scroll_pane LuaGuiElement +--- @field player LuaPlayer +--- @field player_name string +--- @field children table +--- @field title LocalisedString +--- @field locale_prefix string +--- @field default_stringify fun(value: any): string +--- @field columns number +--- @field title_width number +--- @field column_width number +--- @field extra_rows fun(data_table: LuaGuiElement)? + +--- Render a player data category +--- @param opts ExpGui_Readme.elements.readme_data.param +local function render_data_category(opts) + local data_table = Elements.title_table(opts.scroll_pane, opts.title_width, opts.title, opts.columns) + + if opts.extra_rows then + opts.extra_rows(data_table) + end + + for name, child in pairs(opts.children) do + local metadata = child.metadata + + if not metadata.permission or Roles.player_allowed(opts.player, metadata.permission) then + local value = child:get(opts.player_name) + + if value ~= nil or metadata.show_always then + if metadata.stringify_short then + value = metadata.stringify_short(value) + elseif metadata.stringify then + value = metadata.stringify(value) + else + value = opts.default_stringify(value) + end + + local tooltip = metadata.tooltip or { opts.locale_prefix .. name .. "-tooltip" } + Gui.elements.centered_label( + data_table, 150, + metadata.name or { opts.locale_prefix .. name }, + tooltip + ) + + Gui.elements.centered_label( + data_table, opts.column_width, + { "exp-gui_readme.data-format", value, metadata.unit or "" }, + metadata.value_tooltip or { "?", { opts.locale_prefix .. name .. "-value-tooltip" }, tooltip } + ) + end + end + end +end + +--- Content area for the player data tab +define_tab( + { "exp-gui_readme.data-tab" }, + { "exp-gui_readme.data-tooltip" }, + Gui.define("readme/data") + :draw(function(_, parent) + local container = parent.add{ type = "flow", direction = "vertical" } + + local player = Gui.get_player(parent) + local player_name = player.name + + local enum = PlayerData.PreferenceEnum + local preference = PlayerData.DataSavingPreference:get(player_name) + local preference_meta = PlayerData.DataSavingPreference.metadata + preference = enum[preference] + + Gui.elements.title_label(container, title_width, { "exp-gui_readme.data-tab" }) + Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.data-general" }) + Gui.elements.bar(container) + container.add{ type = "flow" } + + local scroll_pane = Elements.title_table_scroll(container) + + render_data_category{ + scroll_pane = scroll_pane, + player = player, + player_name = player_name, + children = PlayerData.Required.children, + title = { "exp-gui_readme.data-required" }, + locale_prefix = "exp-required.", + columns = 2, + title_width = 250, + column_width = 420, + default_stringify = tostring, + extra_rows = function(required) + Gui.elements.centered_label(required, 150, preference_meta.name, preference_meta.tooltip) + Gui.elements.centered_label(required, 420, { "expcore-data.preference-" .. enum[preference] }, preference_meta.value_tooltip) + end, + } + + if preference <= enum.Settings then + render_data_category{ + scroll_pane = scroll_pane, + player = player, + player_name = player_name, + children = PlayerData.Settings.children, + title = { "exp-gui_readme.data-settings" }, + locale_prefix = "exp-settings.", + columns = 2, + title_width = 255, + column_width = 420, + default_stringify = function(value) + return tostring(value or "None set") + end, + } + end + + if preference <= enum.Statistics then + render_data_category{ + scroll_pane = scroll_pane, + player = player, + player_name = player_name, + children = PlayerData.Statistics.children, + title = { "exp-gui_readme.data-statistics" }, + locale_prefix = "exp-statistics.", + columns = 4, + title_width = 250, + column_width = 130, + default_stringify = function(value) + return format_number(value or 0, false) + end, + } + end + + local skip = { + DataSavingPreference = true, + Settings = true, + Statistics = true, + Required = true, + } + + local count = 0 + for _ in pairs(PlayerData.All.children) do + count = count + 1 + end + + if preference <= enum.All and count > 4 then + local misc = {} + for name, child in pairs(PlayerData.All.children) do + if not skip[name] then + misc[name] = child + end + end + + render_data_category{ + scroll_pane = scroll_pane, + player = player, + player_name = player_name, + children = misc, + title = { "exp-gui_readme.data-misc" }, + locale_prefix = "", + columns = 2, + title_width = 232, + column_width = 420, + default_stringify = tostring, + } + end + + return container + end) --[[ @as any ]] +) + +--- @class ExpGui_Readme.elements.container.elements +--- @field pane LuaGuiElement + +--- Main readme container +--- @class ExpGui_Readme.elements.container: ExpElement +--- @field data table +Elements.container = Gui.define("readme/container") + :track_all_elements() + :draw(function(def, parent) + --- @cast def ExpGui_Readme.elements.container + local container = parent.add{ name = def.name, type = "frame", style = "invisible_frame" } + + local left_alignment = Gui.elements.aligned_flow(container, { vertical_align = "bottom" }) + left_alignment.style.padding = { 32, 0, 0, 0 } + + local left_side = left_alignment.add{ type = "frame", style = "character_gui_left_side" } + left_side.style.vertically_stretchable = true + left_side.style.padding = 0 + left_side.style.width = 5 + + local pane = container.add{ + name = "pane", + type = "tabbed-pane", + style = "frame_tabbed_pane", + } + + for _, tab in ipairs(tabs) do + local gui_tab = pane.add{ + type = "tab", + style = "frame_tab", + caption = tab.caption, + tooltip = tab.tooltip, + } + + pane.add_tab(gui_tab, tab.element(pane)) + end + + def.data[container] = { + pane = pane, + } + + return container + end) + :on_opened(function(def, player) + Gui.toolbar.set_button_toggled_state(Elements.toggle_button, player, true) + end) + :on_closed(function(def, player, element) + Gui.toolbar.set_button_toggled_state(Elements.toggle_button, player, false) + Gui.destroy_if_valid(element) + end) + +--- Toggle button +Elements.toggle_button = Gui.toolbar.create_button{ + name = "readme_toggle", + auto_toggle = true, + sprite = "virtual-signal/signal-info", + tooltip = { "exp-gui_readme.main-tooltip" }, + visible = function(player) + return Roles.player_allowed(player, "gui/readme") + end, + } + :on_click(function(_, player) + local center = player.gui.center + local readme = center[Elements.container.name] + + if readme then + player.opened = nil + else + player.opened = Elements.container(center) + end + end) + +--- Open readme for new players +--- @param event EventData.on_player_created +local function open_readme(event) + local player = assert(game.get_player(event.player_index)) + local element = Elements.container(player.gui.center) + element.pane.selected_tab_index = 1 + player.opened = element +end + +--- Clear stale readme +--- @param event EventData.on_player_joined_game | EventData.on_player_respawned +local function clear_readme(event) + local player = game.players[event.player_index] + if not player.opened then + Gui.destroy_if_valid(player.gui.center[Elements.container.name]) + end +end + +local e = defines.events + +return { + elements = Elements, + events = { + [e.on_player_created] = open_readme, + [e.on_player_joined_game] = clear_readme, + [e.on_player_respawned] = clear_readme, + }, + on_nth_tick = { + [60 * 60] = Elements.join_server.refresh_all, + } +} diff --git a/exp_scenario/module/gui/task_list.lua b/exp_scenario/module/gui/task_list.lua new file mode 100644 index 00000000..25b8cdea --- /dev/null +++ b/exp_scenario/module/gui/task_list.lua @@ -0,0 +1,951 @@ +--[[-- Gui - Task List +Adds a task list to the game which players can add, remove and edit items on +]] + +local Gui = require("modules/exp_gui") +local Roles = require("modules.exp_legacy.expcore.roles") +local config = require("modules.exp_legacy.config.gui.tasks") + +local ExpUtil = require("modules/exp_util") +local format_time = ExpUtil.format_time_factory_locale{ format = "short", hours = true, minutes = true } + +--- @class ExpGui_TaskList.elements +local Elements = {} + +local Styles = { + sprite22 = Gui.styles.sprite{ + size = 22 + }, + footer_button = Gui.styles.sprite{ + height = 29, + maximal_width = 268, + horizontally_stretchable = true, + }, +} + +--- @class ExpGui_TaskList.Task +--- @field id number +--- @field last_user LuaPlayer +--- @field last_edit_tick number +--- @field editing table +--- @field title string +--- @field body string +--- @field new boolean? +--- @field deleted boolean? + +--- Check if a player can create a new task +--- @param player LuaPlayer +--- @return boolean +local function has_permission_create_task(player) + local allow_add_task = config.allow_add_task + + if allow_add_task == "all" then + return true + elseif allow_add_task == "admin" then + return player.admin + elseif allow_add_task == "expcore.roles" then + return Roles.player_allowed(player, config.expcore_roles_allow_add_task) + end + + return false +end + +--- Check if a player can edit an existing task +--- @param player LuaPlayer +--- @param task ExpGui_TaskList.Task +--- @return boolean +local function has_permission_edit_task(player, task) + local allow_edit_task = config.allow_edit_task + + -- Check if editing your own task allows bypassing other permissions + if config.user_can_edit_own_tasks and task.last_user.index == player.index then + return true + end + + -- Check player has permission based on value in the config + if allow_edit_task == "all" then + return true + elseif allow_edit_task == "admin" then + return player.admin + elseif allow_edit_task == "expcore.roles" then + return Roles.player_allowed(player, config.expcore_roles_allow_edit_task) + end + + return false +end + +--- @class ExpGui_TaskList.element.new_task_button.elements +--- @field container LuaGuiElement + +--- Button displayed in the header bar, used to add a new task +--- @class ExpGui_TaskList.element.new_task_button: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, container: LuaGuiElement): LuaGuiElement +Elements.new_task_button = Gui.define("task_list/new_task_button") + :track_all_elements() + :draw{ + type = "sprite-button", + sprite = "utility/add", + tooltip = { "exp-gui_task-list.tooltip-new" }, + style = "tool_button", + } + :style(Styles.sprite22) + :element_data{ + container = Gui.from_argument(1) + } + :on_click(function(def, player, new_task_button) + --- @cast def ExpGui_TaskList.element.new_task_button + local container = def.data[new_task_button].container + Elements.container.open_edit_task(container, { + id = Elements.container.next_task_id(), + last_edit_tick = game.tick, + last_user = player, + editing = {}, + title = "", + body = "", + new = true, + }) + end) --[[ @as any ]] + +--- Refresh the visibility based on player permissions +--- @param new_task_button LuaGuiElement +function Elements.new_task_button.refresh(new_task_button) + local player = Gui.get_player(new_task_button) + new_task_button.visible = has_permission_create_task(player) +end + +--- Refresh the visibility based on player permissions +--- @param player LuaPlayer +function Elements.new_task_button.refresh_player(player) + local visible = has_permission_create_task(player) + for _, new_task_button in Elements.new_task_button:tracked_elements(player) do + new_task_button.visible = visible + end +end + +--- @class ExpGui_TaskList.elements.view_task_button.elements +--- @field task ExpGui_TaskList.Task +--- @field container LuaGuiElement + +--- Button used to view a task details, the caption is the task title +--- @class ExpGui_TaskList.element.view_task_button: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, task: ExpGui_TaskList.Task, container: LuaGuiElement): LuaGuiElement +Elements.view_task_button = Gui.define("task_list/view_task_button") + :draw(function(def, parent, task) + --- @cast def ExpGui_TaskList.element.view_task_button + --- @cast task ExpGui_TaskList.Task + return parent.add{ + type = "button", + style = "list_box_item", + caption = task.title, + tooltip = { "exp-gui_task-list.tooltip-last-edit", task.last_user.name, format_time(task.last_edit_tick) }, + } + end) + :style{ + width = 268, + horizontally_stretchable = true, + } + :element_data{ + task = Gui.from_argument(1), + container = Gui.from_argument(2), + } + :on_click(function(def, player, view_task_button) + --- @cast def ExpGui_TaskList.element.view_task_button + local elements = def.data[view_task_button] + Elements.container.open_view_task(elements.container, elements.task) + end) --[[ @as any ]] + +--- Refresh the title and tooltip of the view task button +--- @param view_task_button LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.view_task_button.refresh(view_task_button, task) + view_task_button.caption = task.title + view_task_button.tooltip = { "exp-gui_task-list.tooltip-last-edit", task.last_user.name, format_time(task.last_edit_tick) } +end + +--- Label used to signal that no tasks are open +--- @class ExpGui_TaskList.elements.no_tasks_header: ExpElement +--- @overload fun(parent: LuaGuiElement): LuaGuiElement +Elements.no_tasks_header = Gui.define("task_list/no_tasks_header") + :track_all_elements() + :draw(function(def, parent, ...) + local subheader = Gui.elements.subframe_base(parent, "negative_subheader_frame") + + local label = subheader.add{ + type = "label", + style = "bold_label", + caption = { "exp-gui_task-list.caption-no-tasks" }, + tooltip = { "exp-gui_task-list.tooltip-no-tasks" }, + } + + label.style.width = 268 + label.style.horizontal_align = "center" + + return subheader + end) + :style{ + padding = { 2, 0 }, + bottom_margin = 0, + } --[[ @as any ]] + +--- Refresh the visibility of the no tasks label +--- @param no_tasks_header LuaGuiElement +function Elements.no_tasks_header.refresh(no_tasks_header) + local force = Gui.get_player(no_tasks_header).force --[[ @as LuaForce ]] + no_tasks_header.visible = not Elements.container.has_tasks(force) +end + +--- Refresh the visibility of the no tasks label +--- @param player LuaPlayer +function Elements.no_tasks_header.refresh_player(player) + local visible = not Elements.container.has_tasks(player.force --[[ @as LuaForce ]]) + for _, no_tasks_header in Elements.no_tasks_header:tracked_elements(player) do + no_tasks_header.visible = visible + end +end + +--- Refresh the visibility of the no tasks label +--- @param force LuaForce +function Elements.no_tasks_header.refresh_force_online(force) + local visible = not Elements.container.has_tasks(force) + for _, no_tasks_header in Elements.no_tasks_header:online_elements(force) do + no_tasks_header.visible = visible + end +end + +--- A table containing all of the current tasks +--- @class ExpGui_TaskList.elements.task_table: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement): LuaGuiElement +Elements.task_list = Gui.define("task_list/task_list") + :draw(function(_, parent) + local task_list = parent.add{ + type = "scroll-pane", + vertical_scroll_policy = "auto", + horizontal_scroll_policy = "never", + style = "scroll_pane_under_subheader", + } + + local task_list_style = task_list.style + task_list_style.horizontally_stretchable = true + task_list_style.maximal_height = 224 + task_list_style.padding = 0 + + -- Cant modify vertical spacing on scroll pane style so need a sub flow + task_list = task_list.add{ type = "flow", direction = "vertical" } + + task_list_style = task_list.style + task_list_style.horizontally_stretchable = true + task_list_style.vertical_spacing = 0 + task_list_style.padding = 0 + + -- Add the no tasks header + local no_tasks_header = Elements.no_tasks_header(task_list) + Elements.no_tasks_header.refresh(no_tasks_header) + + return task_list + end) + :element_data{} --[[ @as any ]] + +--- Adds a task to the task list +--- @param task_list LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.task_list.add_task(task_list, task) + local container = assert(task_list.parent.parent.parent) + local view_task_buttons = Elements.task_list.data[task_list] + view_task_buttons[task.id] = Elements.view_task_button(task_list, task, container) +end + +--- Remove a task from the task list +--- @param task_list LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.task_list.remove_task(task_list, task) + local view_task_buttons = Elements.task_list.data[task_list] + Gui.destroy_if_valid(view_task_buttons[task.id]) + view_task_buttons[task.id] = nil +end + +--- Refresh a task on the list +--- @param task_list LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.task_list.refresh_task(task_list, task) + local view_task_buttons = Elements.task_list.data[task_list] + Elements.view_task_button.refresh(view_task_buttons[task.id], task) +end + +--- Refresh all tasks on the list +--- @param task_list LuaGuiElement +--- @param tasks ExpGui_TaskList.Task[] +function Elements.task_list.refresh_tasks(task_list, tasks) + local view_task_buttons = Elements.task_list.data[task_list] + local done = {} + + -- Refresh all valid tasks + for _, task in ipairs(tasks) do + done[task.id] = true + local view_task_button = view_task_buttons[task.id] + if view_task_button then + Elements.view_task_button.refresh(view_task_button, task) + else + Elements.task_list.add_task(task_list, task) + end + end + + -- Remove tasks buttons that are no longer required + for id, view_task_button in pairs(view_task_buttons) do + if not done[id] then + view_task_button.destroy() + end + end +end + +--- Select a task button, if nil then all buttons are reset +--- @param task_list LuaGuiElement +--- @param task ExpGui_TaskList.Task? +function Elements.task_list.select_task_button(task_list, task) + local view_task_buttons = Elements.task_list.data[task_list] + local task_button = task and view_task_buttons[task.id] + if task_button and not task_button.enabled then + return + end + for _, view_task_button in pairs(view_task_buttons) do + view_task_button.enabled = true + end + if task_button then + task_button.enabled = false + end +end + +--- The base footer used for view and edit +--- @class ExpGui_TaskList.elements.task_footer: ExpElement +--- @overload fun(parent: LuaGuiElement): LuaGuiElement +Elements.task_footer = Gui.define("task_list/task_footer") + :draw{ + type = "frame", + direction = "vertical", + style = "subfooter_frame", + } + :style{ + height = 0, + padding = 5, + use_header_filler = false, + } --[[ @as any ]] + +--- @class ExpGui_TaskList.elements.close_task_button.elements +--- @field container LuaGuiElement + +--- Button used to close an open task details +--- @class ExpGui_TaskList.element.close_task_button: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, container: LuaGuiElement): LuaGuiElement +Elements.close_task_button = Gui.define("task_list/close_task_button") + :draw{ + type = "sprite-button", + sprite = "utility/collapse", + style = "frame_action_button", + tooltip = { "exp-gui_task-list.tooltip-close" }, + } + :style(Styles.sprite22) + :element_data{ + container = Gui.from_argument(1), + } + :on_click(function(def, player, close_task_button) + --- @cast def ExpGui_TaskList.element.close_task_button + local elements = def.data[close_task_button] + Elements.container.close_footers(elements.container) + end) --[[ @as any ]] + +--- @class ExpGui_TaskList.elements.task_button.elements +--- @field task ExpGui_TaskList.Task? +--- @field container LuaGuiElement + +--- Button used to edit a task +--- @class ExpGui_TaskList.element.edit_task_button: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, container: LuaGuiElement): LuaGuiElement +Elements.edit_task_button = Gui.define("task_list/edit_task_button") + :draw{ + type = "button", + caption = { "exp-gui_task-list.caption-edit" }, + tooltip = { "exp-gui_task-list.tooltip-edit" }, + style = "shortcut_bar_button", + } + :style(Styles.footer_button) + :element_data{ + container = Gui.from_argument(1), + } + :on_click(function(def, player, edit_task_button) + --- @cast def ExpGui_TaskList.element.edit_task_button + local elements = def.data[edit_task_button] + Elements.container.open_edit_task(elements.container, assert(elements.task)) + end) --[[ @as any ]] + +--- Refresh the edit button +--- @param edit_task_button LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.edit_task_button.refresh(edit_task_button, task) + local player = Gui.get_player(edit_task_button) + Elements.edit_task_button.data[edit_task_button].task = task + edit_task_button.visible = has_permission_edit_task(player, task) + + if next(task.editing) then + local player_names = table.get_values(task.editing) + edit_task_button.tooltip = { "exp-gui_task-list.tooltip-edit", table.concat(player_names, ", ") } + else + edit_task_button.tooltip = { "exp-gui_task-list.tooltip-edit-none" } + end +end + +--- Button used to delete a task +--- @class ExpGui_TaskList.element.delete_task_button: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, container: LuaGuiElement): LuaGuiElement +Elements.delete_task_button = Gui.define("task_list/delete_task_button") + :draw{ + type = "button", + caption = { "exp-gui_task-list.caption-delete" }, + tooltip = { "exp-gui_task-list.tooltip-delete" }, + style = "shortcut_bar_button_red", + } + :style(Styles.footer_button) + :element_data{ + container = Gui.from_argument(1), + } + :on_click(function(def, player, delete_task_button) + --- @cast def ExpGui_TaskList.element.delete_task_button + local elements = def.data[delete_task_button] + Elements.container.remove_task(player.force --[[ @as LuaForce ]], elements.task) + Elements.container.close_footers(elements.container) + end) --[[ @as any ]] + +--- Refresh the delete button +--- @param delete_task_button LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.delete_task_button.refresh(delete_task_button, task) + local player = Gui.get_player(delete_task_button) + Elements.delete_task_button.data[delete_task_button].task = task + delete_task_button.visible = has_permission_edit_task(player, task) +end + +--- @class ExpGui_TaskList.elements.view_task_footer.elements +--- @field task ExpGui_TaskList.Task? +--- @field body_label LuaGuiElement +--- @field title_label LuaGuiElement +--- @field delete_task_button LuaGuiElement +--- @field edit_task_button LuaGuiElement + +--- The view footer used for view task details +--- @class ExpGui_TaskList.elements.view_task_footer: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, container: LuaGuiElement): LuaGuiElement +Elements.view_task_footer = Gui.define("task_list/view_task_footer") + :draw(function(def, parent, container) + --- @cast def ExpGui_TaskList.elements.view_task_footer + local view_task_footer = Elements.task_footer(parent) + + local header_flow = view_task_footer.add{ type = "flow" } + header_flow.add{ + type = "label", + style = "frame_title", + caption = { "exp-gui_task-list.caption-view-footer" }, + } + header_flow.style.right_padding = 1 + header_flow.add{ type = "empty-widget" }.style.horizontally_stretchable = true + Elements.close_task_button(header_flow, container) + + local title_label = view_task_footer.add{ type = "label" } + local title_label_style = title_label.style + title_label_style.font = "default-bold" + title_label_style.single_line = false + title_label_style.padding = 4 + + local body_label = view_task_footer.add{ type = "label" } + body_label.style.single_line = false + body_label.style.padding = 4 + + local action_flow = view_task_footer.add{ type = "flow" } + local delete_task_button = Elements.delete_task_button(action_flow, container) + local edit_task_button = Elements.edit_task_button(action_flow, container) + + def.data[view_task_footer] = { + task = nil, + body_label = body_label, + title_label = title_label, + delete_task_button = delete_task_button, + edit_task_button = edit_task_button, + } + + return view_task_footer + end) --[[ @as any ]] + +--- Refresh the view task with new task details +--- @param view_task_footer LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.view_task_footer.refresh(view_task_footer, task) + local elements = Elements.view_task_footer.data[view_task_footer] + Elements.delete_task_button.refresh(elements.delete_task_button, task) + Elements.edit_task_button.refresh(elements.edit_task_button, task) + elements.title_label.caption = task.title + elements.body_label.caption = task.body + elements.task = task +end + +--- Refresh the view task with previously selected task +--- If task is provided, then will only update if task is the selected task +--- @param view_task_footer LuaGuiElement +--- @param task ExpGui_TaskList.Task? +function Elements.view_task_footer.update(view_task_footer, task) + local elements = Elements.view_task_footer.data[view_task_footer] + if elements.task and (task == nil or task == elements.task) then + Elements.view_task_footer.refresh(view_task_footer, elements.task) + end +end + +--- Refresh the view task with the previously selected task +--- @param player LuaPlayer +function Elements.view_task_footer.update_player(player) + for _, view_task_footer in Elements.view_task_footer:tracked_elements(player) do + Elements.view_task_footer.update(view_task_footer) + end +end + +--- @class ExpGui_TaskList.elements.task_message_textfield.elements +--- @field confirm_task_button LuaGuiElement? + +--- Textfield element used in both the task create and edit footers +--- @class ExpGui_TaskList.elements.task_message_textfield: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, confirm_task_button: LuaGuiElement?): LuaGuiElement +Elements.task_message_textfield = Gui.define("task_list/task_message_textfield") + :draw{ + type = "text-box", + text = "", + } + :style{ + maximal_width = 268, + minimal_height = 100, + horizontally_stretchable = true, + } + :element_data{ + confirm_task_button = Gui.from_argument(1), + } + :on_text_changed(function(def, player, task_message_textfield) + --- @cast def ExpGui_TaskList.elements.task_message_textfield + local confirm_task_button = def.data[task_message_textfield].confirm_task_button + confirm_task_button.enabled = string.len(task_message_textfield.text) > 5 + end) --[[ @as any ]] + +--- Set the confirm task button to update on text changed +--- @param task_message_textfield LuaGuiElement +--- @param confirm_task_button LuaGuiElement +function Elements.task_message_textfield.set_confirm_task_button(task_message_textfield, confirm_task_button) + Elements.task_message_textfield.data[task_message_textfield].confirm_task_button = confirm_task_button +end + +--- Refresh the task message field +--- @param task_message_textfield LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.task_message_textfield.refresh(task_message_textfield, task) + local elements = Elements.task_message_textfield.data[task_message_textfield] + local message = task.new and "" or task.title .. "\n" .. task.body + elements.confirm_task_button.enabled = string.len(message) > 5 + task_message_textfield.text = message + task_message_textfield.focus() +end + +--- @class ExpGui_TaskList.elements.confirm_task_button.elements +--- @field task ExpGui_TaskList.Task? +--- @field task_message_textfield LuaGuiElement +--- @field container LuaGuiElement + +--- Textfield element used in both the task create and edit footers +--- @class ExpGui_TaskList.elements.confirm_task_button: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, task_message_textfield: LuaGuiElement, container: LuaGuiElement): LuaGuiElement +Elements.confirm_task_button = Gui.define("task_list/confirm_task_button") + :draw{ + type = "button", + name = Gui.from_name, + caption = { "exp-gui_task-list.caption-confirm" }, + tooltip = { "exp-gui_task-list.tooltip-confirm" }, + style = "shortcut_bar_button_green", + } + :style(Styles.footer_button) + :element_data{ + task_message_textfield = Gui.from_argument(1), + container = Gui.from_argument(2), + } + :on_click(function(def, player, confirm_task_button) + --- @cast def ExpGui_TaskList.elements.confirm_task_button + local elements = def.data[confirm_task_button] + local task_message_textfield = elements.task_message_textfield + local task = assert(elements.task) + + local parsed = Elements.confirm_task_button.parse(task_message_textfield.text) + task.last_edit_tick = game.tick + task.last_user = player + task.title = parsed.title + task.body = parsed.body + + Elements.container.close_footers(elements.container) + + local force = player.force --[[ @as LuaForce ]] + if task.new then + Elements.container.add_task(force, task) + else + Elements.container.refresh_force_online(force, task) + end + end) --[[ @as any ]] + +--- Refresh the confirm task button +--- @param confirm_task_button LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.confirm_task_button.refresh(confirm_task_button, task) + Elements.confirm_task_button.data[confirm_task_button].task = task +end + +--- Parse a task message into its two parts +--- @param message string +--- @return { title: string, body: string } +function Elements.confirm_task_button.parse(message) + -- Trim the spaces of the string + local trimmed = string.gsub(message, "^%s*(.-)%s*$", "%1") + local title, body = string.match(trimmed, "(.-)\n(.*)") + local parsed = { title = title, body = body } + if not title then + -- If it doesn't match the pattern return the str as a title + parsed.title = trimmed + parsed.body = "" + end + return parsed +end + +--- @class ExpGui_TaskList.elements.discard_task_button.elements +--- @field task ExpGui_TaskList.Task? +--- @field container LuaGuiElement + +--- Button used to close an open task details +--- @class ExpGui_TaskList.element.discard_task_button: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, container: LuaGuiElement): LuaGuiElement +Elements.discard_task_button = Gui.define("task_list/discard_task_button") + :draw{ + type = "button", + caption = { "exp-gui_task-list.caption-discard" }, + tooltip = { "exp-gui_task-list.tooltip-discard" }, + style = "shortcut_bar_button_red", + } + :style(Styles.footer_button) + :element_data{ + container = Gui.from_argument(1), + } + :on_click(function(def, player, discard_task_button) + --- @cast def ExpGui_TaskList.element.discard_task_button + local elements = def.data[discard_task_button] + local task = assert(elements.task) + if task.new then + Elements.container.close_footers(elements.container) + else + Elements.container.open_view_task(elements.container, task) + end + end) --[[ @as any ]] + +--- Refresh the discard task button +--- @param discard_task_button LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.discard_task_button.refresh(discard_task_button, task) + Elements.discard_task_button.data[discard_task_button].task = task +end + +--- @class ExpGui_TaskList.elements.edit_task_footer.elements +--- @field task ExpGui_TaskList.Task? +--- @field header LuaGuiElement +--- @field task_message_textfield LuaGuiElement +--- @field discard_task_button LuaGuiElement +--- @field confirm_task_button LuaGuiElement + +--- The view footer used for view task details +--- @class ExpGui_TaskList.elements.edit_task_footer: ExpElement +--- @field data table +--- @overload fun(parent: LuaGuiElement, container: LuaGuiElement): LuaGuiElement +Elements.edit_task_footer = Gui.define("task_list/edit_task_footer") + :draw(function(def, parent, container) + --- @cast def ExpGui_TaskList.elements.edit_task_footer + local edit_task_footer = Elements.task_footer(parent) + + local header = edit_task_footer.add{ + type = "label", + style = "frame_title", + caption = { "exp-gui_task-list.caption-edit-footer" }, + } + + local task_message_textfield = Elements.task_message_textfield(edit_task_footer) + + local action_flow = edit_task_footer.add{ type = "flow" } + local discard_task_button = Elements.discard_task_button(action_flow, container) + local confirm_task_button = Elements.confirm_task_button(action_flow, task_message_textfield, container) + Elements.task_message_textfield.set_confirm_task_button(task_message_textfield, confirm_task_button) + + def.data[edit_task_footer] = { + task = nil, + header = header, + task_message_textfield = task_message_textfield, + discard_task_button = discard_task_button, + confirm_task_button = confirm_task_button, + } + + return edit_task_footer + end) --[[ @as any ]] + +--- Refresh the view task with new task details +--- @param edit_task_footer LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.edit_task_footer.refresh(edit_task_footer, task) + local player = Gui.get_player(edit_task_footer) + local elements = Elements.edit_task_footer.data[edit_task_footer] + task.editing[player.index] = player.name + + if elements.task and elements.task ~= task then + elements.task.editing[player.index] = nil + end + + elements.header.caption = { + task.new and "exp-gui_task-list.caption-create-footer" or "exp-gui_task-list.caption-edit-footer" + } + + Elements.task_message_textfield.refresh(elements.task_message_textfield, task) + Elements.confirm_task_button.refresh(elements.confirm_task_button, task) + Elements.discard_task_button.refresh(elements.discard_task_button, task) + elements.task = task +end + +--- Refresh the view task with previously selected task +--- If task is provided, then will only update if task is the selected task +--- @param edit_task_footer LuaGuiElement +--- @param task ExpGui_TaskList.Task? +function Elements.edit_task_footer.update(edit_task_footer, task) + local elements = Elements.edit_task_footer.data[edit_task_footer] + if elements.task and (task == nil or task == elements.task) then + Elements.edit_task_footer.refresh(edit_task_footer, elements.task) + end +end + +--- Refresh the view task with the previously selected task +--- @param player LuaPlayer +function Elements.edit_task_footer.update_player(player) + for _, edit_task_footer in Elements.edit_task_footer:tracked_elements(player) do + Elements.edit_task_footer.update(edit_task_footer) + end +end + +--- Clear the previously edited task +--- @param edit_task_footer LuaGuiElement +function Elements.edit_task_footer.clear(edit_task_footer) + local elements = Elements.edit_task_footer.data[edit_task_footer] + if elements.task then + local player = Gui.get_player(edit_task_footer) + elements.task.editing[player.index] = nil + elements.task = nil + end +end + +--- @class ExpGui_TaskList.elements.container.elements +--- @field task_list LuaGuiElement +--- @field view_task_footer LuaGuiElement +--- @field edit_task_footer LuaGuiElement + +--- Container added to the left gui flow +--- @class ExpGui_TaskList.elements.container: ExpElement +--- @field data table | table | table<"global_data", { next_task_id: number }> +Elements.container = Gui.define("task_list/container") + :track_all_elements() + :draw(function(def, parent) + --- @cast def ExpGui_TaskList.elements.container + local container = Gui.elements.container(parent) -- width 268 + local root = Gui.elements.container.get_root_element(container) + local elements = {} + + -- Add the header + local header = Gui.elements.header(container, { + caption = { "exp-gui_task-list.caption-main" }, + tooltip = { "exp-gui_task-list.tooltip-sub" }, + }) + + -- Add buttons to the header + local new_task_button = Elements.new_task_button(header, root) + Elements.new_task_button.refresh(new_task_button) + + -- Add the task table and footers + elements.task_list = Elements.task_list(container) + + -- Add tasks to the list if there are any + local player = Gui.get_player(parent) + local force = player.force --[[ @as LuaForce ]] + local tasks = def.data[force] + if tasks then + for _, task in ipairs(tasks) do + Elements.task_list.add_task(elements.task_list, task) + end + end + + -- Add the footers + elements.view_task_footer = Elements.view_task_footer(container, root) + elements.edit_task_footer = Elements.edit_task_footer(container, root) + elements.view_task_footer.visible = false + elements.edit_task_footer.visible = false + + -- Set the data and return + def.data[root] = elements --[[ @as any ]] + return root + end) + :global_data{ next_task_id = 1 } + :force_data{} --[[ @as any ]] + +--- Check if a force has tasks +--- @param force LuaForce +--- @return boolean +function Elements.container.has_tasks(force) + local tasks = Elements.container.data[force] + return tasks and #tasks > 0 +end + +--- Get the next task id +--- @return number +function Elements.container.next_task_id() + local next_task_id = Elements.container.data.global_data.next_task_id + Elements.container.data.global_data.next_task_id = next_task_id + 1 + return next_task_id +end + +--- Add a new task for a force +--- @param force LuaForce +--- @param task ExpGui_TaskList.Task +function Elements.container.add_task(force, task) + local tasks = Elements.container.data[force] + tasks[#tasks + 1] = task + task.deleted = nil + task.new = nil + + Elements.no_tasks_header.refresh_force_online(force) + for _, container in Elements.container:online_elements(force) do + local task_list = Elements.container.data[container].task_list + Elements.task_list.add_task(task_list, task) + end +end + +--- Remove a task from a force +--- @param force LuaForce +--- @param task ExpGui_TaskList.Task +function Elements.container.remove_task(force, task) + local tasks = Elements.container.data[force] + table.remove_element(tasks, task) + task.deleted = true + + Elements.no_tasks_header.refresh_force_online(force) + for _, container in Elements.container:online_elements(force) do + local task_list = Elements.container.data[container].task_list + Elements.task_list.remove_task(task_list, task) + end +end + +--- Open the view footer +--- @param container LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.container.open_view_task(container, task) + local elements = Elements.container.data[container] + Elements.view_task_footer.refresh(elements.view_task_footer, task) + Elements.edit_task_footer.clear(elements.edit_task_footer) + Elements.task_list.select_task_button(elements.task_list, task) + elements.view_task_footer.visible = true + elements.edit_task_footer.visible = false +end + +--- Open the edit footer +--- @param container LuaGuiElement +--- @param task ExpGui_TaskList.Task +function Elements.container.open_edit_task(container, task) + local elements = Elements.container.data[container] + Elements.edit_task_footer.refresh(elements.edit_task_footer, task) + Elements.task_list.select_task_button(elements.task_list, task) + elements.edit_task_footer.visible = true + elements.view_task_footer.visible = false +end + +--- Close the footers +--- @param container LuaGuiElement +function Elements.container.close_footers(container) + local elements = Elements.container.data[container] + Elements.edit_task_footer.clear(elements.edit_task_footer) + Elements.task_list.select_task_button(elements.task_list) + elements.view_task_footer.visible = false + elements.edit_task_footer.visible = false +end + +--- Refresh all tasks for a player +--- @param player LuaPlayer +function Elements.container.refresh_player(player) + local tasks = Elements.container.data[ player.force --[[ @as LuaForce ]] ] + for _, container in Elements.container:tracked_elements(player) do + local elements = Elements.container.data[container] + Elements.task_list.refresh_tasks(elements.task_list, tasks) + Elements.view_task_footer.update(elements.view_task_footer) + Elements.edit_task_footer.update(elements.edit_task_footer) + end +end + +--- Refresh a tasks for a force +--- @param force LuaForce +--- @param task ExpGui_TaskList.Task +function Elements.container.refresh_force_online(force, task) + for _, container in Elements.container:online_elements(force) do + local elements = Elements.container.data[container] + Elements.task_list.refresh_task(elements.task_list, task) + Elements.view_task_footer.update(elements.view_task_footer, task) + Elements.edit_task_footer.update(elements.edit_task_footer, task) + end +end + +--- Add the element to the left flow with a toolbar button +Gui.add_left_element(Elements.container, function(player) + return Elements.container.has_tasks(player.force --[[ @as LuaForce ]]) +end) + +Gui.toolbar.create_button{ + name = "toggle_task_list", + left_element = Elements.container, + sprite = "utility/not_enough_repair_packs_icon", + tooltip = { "exp-gui_task-list.tooltip-main" }, + visible = function(player, element) + return Roles.player_allowed(player, "gui/task-list") + end +} + +--- Update the gui when the player joins because it is likely to be outdated +--- @param event EventData.on_player_joined_game +local function refresh_player_tasks(event) + local player = Gui.get_player(event) + Elements.container.refresh_player(player) + Elements.no_tasks_header.refresh_player(player) +end + +--- Update the gui when the player joins because it is likely to be outdated +--- @param event EventData.on_player_joined_game +local function refresh_player_permissions(event) + local player = Gui.get_player(event) + Elements.new_task_button.refresh_player(player) + Elements.view_task_footer.update_player(player) + Elements.edit_task_footer.update_player(player) +end + +local e = defines.events + +return { + elements = Elements, + events = { + [e.on_player_joined_game] = refresh_player_tasks, + [e.on_player_changed_force] = refresh_player_tasks, + [Roles.events.on_role_assigned] = refresh_player_permissions, + [Roles.events.on_role_unassigned] = refresh_player_permissions, + } +} diff --git a/exp_scenario/module/locale/en.cfg b/exp_scenario/module/locale/en.cfg index 5c3e2b51..d2c5cf99 100644 --- a/exp_scenario/module/locale/en.cfg +++ b/exp_scenario/module/locale/en.cfg @@ -346,6 +346,80 @@ tooltip-trains=Set all trains to automatic caption-waterfill=Waterfill tooltip-waterfill=Change tiles to water +[exp-gui_readme] +main-tooltip=Information +welcome-tab=Welcome +welcome-tooltip=Welcome to Explosive Gaming +welcome-title=Welcome to __1__ +welcome-general=Welcome to Explosive Gaming; we host many Factorio servers. While you are here, we ask you to follow our rules. You can find these in the tab above. You can also find our custom commands and links to our other servers. This map has been online for __2__.\nPlease note that our servers reset periodically, the next reset is: __1__ +welcome-roles=We run a custom role system to help protect the work of others. As a result you may not be able to use your deconstruction planner yet or drop items on the ground. Roles also give you access to some custom features such as adding tasks to our task list or making new warp points.\nYou have been assigned the roles: __1__ +welcome-chat=Chatting can be difficult for new players because it’s different than other games! It’s very simple, the button you need to press is the “GRAVE/TILDE” key (which is located under the “ESC key”). If you would like to change the key, go to your Controls tab in options.\nThe setting you need to change is “Toggle chat (and Lua console)” you currently have it set to "__CONTROL__toggle-console__" +rules-tab=Rules +rules-tooltip=Rules for our server +rules-general=By playing on our servers you accept the rules below. If you are suspected of breaking a rule then you will be questioned by one of our moderators. If required you will be banned from our servers. Appeals can be made by contacting an Administrator on our Discord. +rules-1=Hacking / cheating / abusing bugs will not be tolerated. +rules-2=Any bugs or exploits found should be reported to our staff members. +rules-3=Be respectful to other players in chat, this includes any other forms of communication. +rules-4=Taking all items from a belt or logistics network is forbidden: sharing resources is mandatory. +rules-5=Spamming of chat, bots, unlimited chests, or concrete is not allowed. +rules-6=Before removing major parts of the factory tell other players why you are removing it. +rules-7=Do not cause unnecessary lag by placing/removing tiles with bots or using active provider chests. If you think something might cause lag please ask staff first. +rules-8=Do not walk in random directions with no reason, this is to reduce map download times. +rules-9=Do not use speakers on global or with alerts without prior permission. No one wants to hear your music at full volume without knowing where the off switch is. +rules-10=Do not rotate belts, deactivate belts with wires, or cause production to stop without good reason. This goes for inserters and splitters as well. +rules-11=Do not make train roundabouts. Other loops such as RoRo stations are allowed. +rules-12=When using trains, use the same size other players have used. Many players use 1-2-1, 2-4-2, or 3-8-3, meaning 1 engine 2 cargo 1 engine. +rules-13=Trains are Left Hand Drive (LHD) only, this means trains drive on the left side of the tracks. +rules-14=Do not beg for roles, advertise other servers, or link to harmful sites. +rules-15=Use common sense, report rule breakers, and Administrators have the final word. +commands-tab=Commands +commands-tooltip=Commands which you are able to use +commands-general=We have lots of custom commands which you are able to use. Below you can find a list of all the commands that you are allowed to use and what they do. If you need more information or want to search for a command you can use our /search-help command. +servers-tab=Servers +servers-tooltip=Links to our other servers and sites +servers-general=This is only one of our Factorio servers, we host many others as well. Below you can find details about all the servers that we host as well as links to our external services such as Discord or GitHub. +servers-factorio=Factorio Servers +servers-external=External Links +servers-open-in-browser=Open in your browser +servers-1=S1 Public +servers-d1=This is our 48 hour reset server. +servers-2=S2 Off +servers-d2=This server is closed. +servers-3=S3 Weekly +servers-d3=This is our weekly reset server. +servers-4=S4 Monthly +servers-d4=This is our monthly reset server. +servers-5=S5 Modded +servers-d5=This is our modded server, see Discord for details. +servers-6=S6 Donator +servers-d6=This is our donator only server, online when requested. +servers-7=S7 Event +servers-d7=This is our event server, we try to run events at least once per week. +servers-8=S8 T̷-̶s̶-̴:̷ +servers-d8=N̵o̴ ̶o̷-̶e̵ ̴k̸n̷-̶w̵s̸ ̴w̷h̷a̶-̶ ̷h̴a̴p̷p̴e̷n̷s̸ ̷o̶n̴ ̷t̶h̴-̶s̶ ̷s̷e̶r̸v̸e̴r̷,̶ ̸i̸t̴ ̷m̶-̸g̴h̶t̷ ̸n̸-̶t̵ ̷e̴v̸e̸n̶t̷ ̵-̷x̴i̵s̶t̸.̸ +servers-connect-Offline=Server is currently offline +servers-connect-Current=This is your current server +servers-connect-Version=Server is on a different version: __1__ +servers-connect-Password=Server requires a password +servers-connect-Modded=Server requires mods to be downloaded +servers-connect-Online=Server is online +backers-tab=Backers +backers-tooltip=People who have helped make our server +backers-general=We would like to thank all our staff and backers who have helped our community grow. Our staff have helped to keep our servers safe from trolls and a fun place to play. Our backers have helped us to cover our running costs and provide a great community for us all to enjoy together. +backers-management=Administrators +backers-board=Board Members and Senior Backers +backers-staff=Staff Members +backers-backers=Sponsors and Supporters +backers-active=Active Players +data-tab=Data +data-tooltip=All of your stored player data +data-general=Our servers will save your player data so that we can sync it between servers. All of your data can be found below. If you wish to save a copy locally then use /save-data. If you want to change what data is saved then use /set-preference. +data-required=Required +data-settings=Settings +data-statistics=Statistics +data-misc=Miscellaneous +data-format=__1____2__ + [exp-gui_research-milestones] tooltip-main=Research Milestones caption-main=Milestones @@ -376,6 +450,28 @@ type-player=Player type-static=Static type-loop=Loop +[exp-gui_task-list] +caption-main=Task List [img=info] +tooltip-main=Task List +tooltip-sub=Tasks that remain to be done\n- You can use richtext to include images [img=utility/not_enough_repair_packs_icon] or [color=blue]color[/color] your tasks. +caption-no-tasks=No tasks found! +tooltip-no-tasks=Click on the plus button to the top right of this window to add a new task! +tooltip-last-edit=Last edited by __1__ at __2__ +tooltip-close=Close task details +tooltip-new=Add new task +caption-confirm=[img=utility/check_mark] Confirm +tooltip-confirm=Save changes (minimum of 5 characters long) +caption-discard=[img=utility/close_black] Discard +tooltip-discard=Discard changes +caption-delete=[img=utility/trash] Delete +tooltip-delete=Delete task +caption-edit=[img=utility/rename_icon] Edit +tooltip-edit=Currently being edited by: __1__ +tooltip-edit-none=Currently being edited by: Nobody +caption-create-footer=Create task +caption-edit-footer=Edit task +caption-view-footer=Task details + [exp_afk-kick] kick-message=All players were kicked because everyone was AFK. diff --git a/exp_scenario/module/locale/zh-CN.cfg b/exp_scenario/module/locale/zh-CN.cfg index 8768808a..eea134ae 100644 --- a/exp_scenario/module/locale/zh-CN.cfg +++ b/exp_scenario/module/locale/zh-CN.cfg @@ -346,6 +346,79 @@ tooltip-trains=把火車設置為自動模式 caption-waterfill=挖水 tooltip-waterfill=把地換為水。 +[exp-gui_readme] +main-tooltip=資訊 +welcome-tab=歡迎 +welcome-tooltip=歡迎來到 Explosive Gaming +welcome-general=歡迎來到 Explosive Gaming; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __1__ +welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__ +welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」 +rules-tab=規則 +rules-tooltip=服務器規則 +rules-general=你在本服務器遊玩即等同同意以下規則。管理員有機會就相關事項提問。你可能會因為違反規則而被封禁,你可以在 Discord 中提出反對。 +rules-1=開掛或濫用漏洞將不會被容忍。 +rules-2=當你找到漏洞可以通知職員。 +rules-3=請在聊天室中尊重其他人。 +rules-4=請不要把所有物品全部取走。 +rules-5=請不要濫發信息,大量鋪設地磚,或不為箱子設置上限,浪費資源。 +rules-6=當你想大量拆除原有設施前請通知其他用戶。 +rules-7=請不要無故使用機器人來大量鋪設或拆除地磚,濫用主動出貨箱。 +rules-8=請不要隨意移動來開大量地圖,這有助減少地圖下載時間。 +rules-9=請不要無故使用全圖喇叭。 +rules-10=請不要無故轉動傳送帶方向,停用傳送帶,或停止生產。 +rules-11=請不要用迴旋處。 火車站尾返程則是例外。 +rules-12=請跟其他人使用相同的火車組成。常用的有 1-2-1,2-4-2,或 3-8-3,即1個動車組拖2個貨車組再拖不同方向的1個動車組。 +rules-13=火車必須是左上右下 (LHD)。 +rules-14=禁止要求身份組,發廣告,發惡意連結。 +rules-15=使用常識, 舉報違規人員,管理員有最終決定權。 +commands-tab=指令 +commands-tooltip=你可用的指令 +commands-general=這裏有自訂的指令。你可以在下邊找到你可用的指令及其功能介紹。你可以用 /search-help 來取得更多資訊。 +servers-tab=伺服器 +servers-tooltip=到其他伺服器及網站的連結 +servers-general=這是其中一個伺服器。你可以在下方找到其他同樣是由我們運行的伺服器資料。 +servers-factorio=異星工廠伺服器 +servers-1=S1 公共 +servers-d1=這個服務器每兩日重設。 +servers-2=S2 - +servers-d2=這個服務器沒在營運。 +servers-3=S3 周 +servers-d3=這個服務器每週重設。 +servers-4=S4 月 +servers-d4=這個服務器每月重設。 +servers-5=S5 模組 +servers-d5=這個服務器運行模組,可在 Discord 中得到更多資訊。 +servers-6=S6 Donator +servers-d6=這個服務器為支持者運行,可在 Discord 中得到更多資訊。 +servers-7=S7 項目 +servers-d7=這個服務器只在有項目期間運行。 +servers-8=S8 T̷-̶s̶-̴:̷ +servers-d8=N̵o̴ ̶o̷-̶e̵ ̴k̸n̷-̶w̵s̸ ̴w̷h̷a̶-̶ ̷h̴a̴p̷p̴e̷n̷s̸ ̷o̶n̴ ̷t̶h̴-̶s̶ ̷s̷e̶r̸v̸e̴r̷,̶ ̸i̸t̴ ̷m̶-̸g̴h̶t̷ ̸n̸-̶t̵ ̷e̴v̸e̸n̶t̷ ̵-̷x̴i̵s̶t̸。̸ +servers-connect-Offline=該服務器目前沒有在運行 +servers-connect-Current=你目前所在的伺服器 +servers-connect-Version=該服務器運行不同的遊戲版本: __1__ +servers-connect-Password=該服務器需要密碼 +servers-connect-Modded=該服務器需要下載模組 +servers-connect-Online=該服務器在線 +servers-external=外部連結 +servers-open-in-browser=可在你的瀏覽器中打開 +backers-tab=支持者 +backers-tooltip=支持者 +backers-general=他們為服務器運行提供了不少幫助。 +backers-management=系統管理員 +backers-board=議員 +backers-staff=職員 +backers-backers=支持者 +backers-active=活躍玩家 +data-tab=資料 +data-tooltip=所有已存資料 +data-general=資料會自動存到各個服務器中。 你也可以用 /save-data 存一份副本。 也可用 /set-preference 來更改喜好。 +data-settings=設定 +data-statistics=數據 +data-required=需要 +data-misc=雜項 +data-format=__1____2__ + [exp-gui_research-milestones] tooltip-main=研究介面 caption-main=研究介面 @@ -376,6 +449,28 @@ type-player=用戶 type-static=靜態 type-loop=循環 +[exp-gui_task-list] +caption-main=工作流程 [img=info] +tooltip-main=工作流程 +tooltip-sub=需要完成的工作流程\n- 你可以用富文本來加上圖片 [img=utility/not_enough_repair_packs_icon] 或 [color=blue] 顏色[/color]。 +caption-no-tasks=沒有工作流程 +tooltip-no-tasks=按加號加入工作流程 +tooltip-last-edit=最後由 __1__ 在 __2__ 修改 +tooltip-close=關閉工作流程 +tooltip-new=加入工作流程 +caption-confirm=[img=utility/check_mark] 確認 +confirm-tooltip=儲存工作流程 (最少要5個字長) +caption-discard=[img=utility/close_black] 放棄 +tooltip-discard=放棄更改動 +caption-delete=[img=utility/trash] 刪除 +tooltip-delete=刪除工作流程 +caption-edit=[img=utility/rename_icon] 修改工作流程 +tooltip-edit=現被 __1__ 修改中 +tooltip-edit-none=現沒有被人修改 +caption-create-footer=加入工作流程 +caption-edit-footer=修改工作流程 +caption-view-footer=工作流程細節 + [exp_afk-kick] kick-message=因地圖中沒有活躍玩家,所以所有人都已被請離。 diff --git a/exp_scenario/module/locale/zh-TW.cfg b/exp_scenario/module/locale/zh-TW.cfg index 8768808a..eea134ae 100644 --- a/exp_scenario/module/locale/zh-TW.cfg +++ b/exp_scenario/module/locale/zh-TW.cfg @@ -346,6 +346,79 @@ tooltip-trains=把火車設置為自動模式 caption-waterfill=挖水 tooltip-waterfill=把地換為水。 +[exp-gui_readme] +main-tooltip=資訊 +welcome-tab=歡迎 +welcome-tooltip=歡迎來到 Explosive Gaming +welcome-general=歡迎來到 Explosive Gaming; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __1__ +welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__ +welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」 +rules-tab=規則 +rules-tooltip=服務器規則 +rules-general=你在本服務器遊玩即等同同意以下規則。管理員有機會就相關事項提問。你可能會因為違反規則而被封禁,你可以在 Discord 中提出反對。 +rules-1=開掛或濫用漏洞將不會被容忍。 +rules-2=當你找到漏洞可以通知職員。 +rules-3=請在聊天室中尊重其他人。 +rules-4=請不要把所有物品全部取走。 +rules-5=請不要濫發信息,大量鋪設地磚,或不為箱子設置上限,浪費資源。 +rules-6=當你想大量拆除原有設施前請通知其他用戶。 +rules-7=請不要無故使用機器人來大量鋪設或拆除地磚,濫用主動出貨箱。 +rules-8=請不要隨意移動來開大量地圖,這有助減少地圖下載時間。 +rules-9=請不要無故使用全圖喇叭。 +rules-10=請不要無故轉動傳送帶方向,停用傳送帶,或停止生產。 +rules-11=請不要用迴旋處。 火車站尾返程則是例外。 +rules-12=請跟其他人使用相同的火車組成。常用的有 1-2-1,2-4-2,或 3-8-3,即1個動車組拖2個貨車組再拖不同方向的1個動車組。 +rules-13=火車必須是左上右下 (LHD)。 +rules-14=禁止要求身份組,發廣告,發惡意連結。 +rules-15=使用常識, 舉報違規人員,管理員有最終決定權。 +commands-tab=指令 +commands-tooltip=你可用的指令 +commands-general=這裏有自訂的指令。你可以在下邊找到你可用的指令及其功能介紹。你可以用 /search-help 來取得更多資訊。 +servers-tab=伺服器 +servers-tooltip=到其他伺服器及網站的連結 +servers-general=這是其中一個伺服器。你可以在下方找到其他同樣是由我們運行的伺服器資料。 +servers-factorio=異星工廠伺服器 +servers-1=S1 公共 +servers-d1=這個服務器每兩日重設。 +servers-2=S2 - +servers-d2=這個服務器沒在營運。 +servers-3=S3 周 +servers-d3=這個服務器每週重設。 +servers-4=S4 月 +servers-d4=這個服務器每月重設。 +servers-5=S5 模組 +servers-d5=這個服務器運行模組,可在 Discord 中得到更多資訊。 +servers-6=S6 Donator +servers-d6=這個服務器為支持者運行,可在 Discord 中得到更多資訊。 +servers-7=S7 項目 +servers-d7=這個服務器只在有項目期間運行。 +servers-8=S8 T̷-̶s̶-̴:̷ +servers-d8=N̵o̴ ̶o̷-̶e̵ ̴k̸n̷-̶w̵s̸ ̴w̷h̷a̶-̶ ̷h̴a̴p̷p̴e̷n̷s̸ ̷o̶n̴ ̷t̶h̴-̶s̶ ̷s̷e̶r̸v̸e̴r̷,̶ ̸i̸t̴ ̷m̶-̸g̴h̶t̷ ̸n̸-̶t̵ ̷e̴v̸e̸n̶t̷ ̵-̷x̴i̵s̶t̸。̸ +servers-connect-Offline=該服務器目前沒有在運行 +servers-connect-Current=你目前所在的伺服器 +servers-connect-Version=該服務器運行不同的遊戲版本: __1__ +servers-connect-Password=該服務器需要密碼 +servers-connect-Modded=該服務器需要下載模組 +servers-connect-Online=該服務器在線 +servers-external=外部連結 +servers-open-in-browser=可在你的瀏覽器中打開 +backers-tab=支持者 +backers-tooltip=支持者 +backers-general=他們為服務器運行提供了不少幫助。 +backers-management=系統管理員 +backers-board=議員 +backers-staff=職員 +backers-backers=支持者 +backers-active=活躍玩家 +data-tab=資料 +data-tooltip=所有已存資料 +data-general=資料會自動存到各個服務器中。 你也可以用 /save-data 存一份副本。 也可用 /set-preference 來更改喜好。 +data-settings=設定 +data-statistics=數據 +data-required=需要 +data-misc=雜項 +data-format=__1____2__ + [exp-gui_research-milestones] tooltip-main=研究介面 caption-main=研究介面 @@ -376,6 +449,28 @@ type-player=用戶 type-static=靜態 type-loop=循環 +[exp-gui_task-list] +caption-main=工作流程 [img=info] +tooltip-main=工作流程 +tooltip-sub=需要完成的工作流程\n- 你可以用富文本來加上圖片 [img=utility/not_enough_repair_packs_icon] 或 [color=blue] 顏色[/color]。 +caption-no-tasks=沒有工作流程 +tooltip-no-tasks=按加號加入工作流程 +tooltip-last-edit=最後由 __1__ 在 __2__ 修改 +tooltip-close=關閉工作流程 +tooltip-new=加入工作流程 +caption-confirm=[img=utility/check_mark] 確認 +confirm-tooltip=儲存工作流程 (最少要5個字長) +caption-discard=[img=utility/close_black] 放棄 +tooltip-discard=放棄更改動 +caption-delete=[img=utility/trash] 刪除 +tooltip-delete=刪除工作流程 +caption-edit=[img=utility/rename_icon] 修改工作流程 +tooltip-edit=現被 __1__ 修改中 +tooltip-edit-none=現沒有被人修改 +caption-create-footer=加入工作流程 +caption-edit-footer=修改工作流程 +caption-view-footer=工作流程細節 + [exp_afk-kick] kick-message=因地圖中沒有活躍玩家,所以所有人都已被請離。 diff --git a/exp_scenario/web/index.tsx b/exp_scenario/web/index.tsx index f4d7ff80..e69de29b 100644 --- a/exp_scenario/web/index.tsx +++ b/exp_scenario/web/index.tsx @@ -1,68 +0,0 @@ -import React, { - useContext, useEffect, useState, - useCallback, useSyncExternalStore, -} from "react"; - -// import { -// -// } from "antd"; - -import { - BaseWebPlugin, PageLayout, PageHeader, Control, ControlContext, notifyErrorHandler, -} from "@clusterio/web_ui"; - -import { - PluginExampleEvent, PluginExampleRequest, - ExampleSubscribableUpdate, ExampleSubscribableValue, -} from "../messages"; - -import * as lib from "@clusterio/lib"; - -function MyTemplatePage() { - const control = useContext(ControlContext); - const plugin = control.plugins.get("exp_scenario") as WebPlugin; - const [subscribableData, synced] = plugin.useSubscribableData(); - - return - - Synced: {String(synced)} Data: {JSON.stringify([...subscribableData.values()])} - ; -} - -export class WebPlugin extends BaseWebPlugin { - subscribableData = new lib.EventSubscriber(ExampleSubscribableUpdate, this.control); - - async init() { - this.pages = [ - { - path: "/exp_scenario", - sidebarName: "exp_scenario", - // This permission is client side only, so it must match the permission string of a resource request to be secure - // An undefined value means that the page will always be visible - permission: "exp_scenario.example.permission.subscribe", - content: , - }, - ]; - - this.control.handle(PluginExampleEvent, this.handlePluginExampleEvent.bind(this)); - this.control.handle(PluginExampleRequest, this.handlePluginExampleRequest.bind(this)); - } - - useSubscribableData() { - const control = useContext(ControlContext); - const subscribe = useCallback((callback: () => void) => this.subscribableData.subscribe(callback), [control]); - return useSyncExternalStore(subscribe, () => this.subscribableData.getSnapshot()); - } - - async handlePluginExampleEvent(event: PluginExampleEvent) { - this.logger.info(JSON.stringify(event)); - } - - async handlePluginExampleRequest(request: PluginExampleRequest) { - this.logger.info(JSON.stringify(request)); - return { - myResponseString: request.myString, - myResponseNumbers: request.myNumberArray, - }; - } -} diff --git a/exp_scenario/web/~index.tsx b/exp_scenario/web/~index.tsx new file mode 100644 index 00000000..f4d7ff80 --- /dev/null +++ b/exp_scenario/web/~index.tsx @@ -0,0 +1,68 @@ +import React, { + useContext, useEffect, useState, + useCallback, useSyncExternalStore, +} from "react"; + +// import { +// +// } from "antd"; + +import { + BaseWebPlugin, PageLayout, PageHeader, Control, ControlContext, notifyErrorHandler, +} from "@clusterio/web_ui"; + +import { + PluginExampleEvent, PluginExampleRequest, + ExampleSubscribableUpdate, ExampleSubscribableValue, +} from "../messages"; + +import * as lib from "@clusterio/lib"; + +function MyTemplatePage() { + const control = useContext(ControlContext); + const plugin = control.plugins.get("exp_scenario") as WebPlugin; + const [subscribableData, synced] = plugin.useSubscribableData(); + + return + + Synced: {String(synced)} Data: {JSON.stringify([...subscribableData.values()])} + ; +} + +export class WebPlugin extends BaseWebPlugin { + subscribableData = new lib.EventSubscriber(ExampleSubscribableUpdate, this.control); + + async init() { + this.pages = [ + { + path: "/exp_scenario", + sidebarName: "exp_scenario", + // This permission is client side only, so it must match the permission string of a resource request to be secure + // An undefined value means that the page will always be visible + permission: "exp_scenario.example.permission.subscribe", + content: , + }, + ]; + + this.control.handle(PluginExampleEvent, this.handlePluginExampleEvent.bind(this)); + this.control.handle(PluginExampleRequest, this.handlePluginExampleRequest.bind(this)); + } + + useSubscribableData() { + const control = useContext(ControlContext); + const subscribe = useCallback((callback: () => void) => this.subscribableData.subscribe(callback), [control]); + return useSyncExternalStore(subscribe, () => this.subscribableData.getSnapshot()); + } + + async handlePluginExampleEvent(event: PluginExampleEvent) { + this.logger.info(JSON.stringify(event)); + } + + async handlePluginExampleRequest(request: PluginExampleRequest) { + this.logger.info(JSON.stringify(request)); + return { + myResponseString: request.myString, + myResponseNumbers: request.myNumberArray, + }; + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58f4c8db..ae212b88 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,41 +7,41 @@ settings: catalogs: default: '@clusterio/lib': - specifier: ^2.0.0-alpha.21 - version: 2.0.0-alpha.21 + specifier: 2.0.0-alpha.22b + version: 2.0.0-alpha.22b '@clusterio/web_ui': - specifier: ^2.0.0-alpha.21 - version: 2.0.0-alpha.21 + specifier: 2.0.0-alpha.22b + version: 2.0.0-alpha.22b '@sinclair/typebox': specifier: ^0.30.4 version: 0.30.4 '@types/node': - specifier: ^20.14.9 - version: 20.17.10 + specifier: ^20.19.29 + version: 20.19.29 '@types/react': - specifier: ^18.2.21 - version: 18.3.18 + specifier: 18.2.0 + version: 18.2.0 antd: - specifier: ^5.13.0 - version: 5.24.6 + specifier: 5.24.2 + version: 5.24.2 react: - specifier: ^18.2.0 - version: 18.3.1 + specifier: 18.2.0 + version: 18.2.0 react-dom: - specifier: ^18.2.0 - version: 18.3.1 + specifier: 18.2.0 + version: 18.2.0 typescript: - specifier: ^5.5.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 webpack: - specifier: ^5.98.0 + specifier: 5.98.0 version: 5.98.0 webpack-cli: - specifier: ^5.1.4 + specifier: 5.1.4 version: 5.1.4 webpack-merge: - specifier: ^5.9.0 - version: 5.10.0 + specifier: 5.9.0 + version: 5.9.0 importers: @@ -49,7 +49,7 @@ importers: devDependencies: typescript: specifier: 'catalog:' - version: 5.8.3 + version: 5.9.3 exp_commands: dependencies: @@ -62,68 +62,68 @@ importers: devDependencies: '@clusterio/lib': specifier: 'catalog:' - version: 2.0.0-alpha.21 + version: 2.0.0-alpha.22b '@types/node': specifier: 'catalog:' - version: 20.17.10 + version: 20.19.29 typescript: specifier: 'catalog:' - version: 5.8.3 + version: 5.9.3 webpack: specifier: 'catalog:' - version: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + version: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: specifier: 'catalog:' version: 5.1.4(webpack@5.98.0) webpack-merge: specifier: 'catalog:' - version: 5.10.0 + version: 5.9.0 exp_groups: dependencies: '@sinclair/typebox': - specifier: ^0.30.4 + specifier: 'catalog:' version: 0.30.4 fs-extra: - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^11.3.3 + version: 11.3.3 devDependencies: '@clusterio/lib': - specifier: ^2.0.0-alpha.20 - version: 2.0.0-alpha.20 + specifier: 'catalog:' + version: 2.0.0-alpha.22b '@clusterio/web_ui': - specifier: ^2.0.0-alpha.20.b - version: 2.0.0-alpha.20.b + specifier: 'catalog:' + version: 2.0.0-alpha.22b '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 '@types/node': - specifier: ^20.4.5 - version: 20.17.10 + specifier: 'catalog:' + version: 20.19.29 '@types/react': - specifier: ^18.2.21 - version: 18.3.18 + specifier: 'catalog:' + version: 18.2.0 antd: - specifier: ^5.13.0 - version: 5.22.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 'catalog:' + version: 5.24.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: - specifier: ^18.2.0 - version: 18.3.1 + specifier: 'catalog:' + version: 18.2.0 react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) + specifier: 'catalog:' + version: 18.2.0(react@18.2.0) typescript: - specifier: ^5.5.3 - version: 5.7.2 + specifier: 'catalog:' + version: 5.9.3 webpack: - specifier: ^5.98.0 - version: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + specifier: 'catalog:' + version: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: - specifier: ^5.1.4 + specifier: 'catalog:' version: 5.1.4(webpack@5.98.0) webpack-merge: - specifier: ^5.9.0 - version: 5.10.0 + specifier: 'catalog:' + version: 5.9.0 exp_gui: dependencies: @@ -136,22 +136,22 @@ importers: devDependencies: '@clusterio/lib': specifier: 'catalog:' - version: 2.0.0-alpha.21 + version: 2.0.0-alpha.22b '@types/node': specifier: 'catalog:' - version: 20.17.10 + version: 20.19.29 typescript: specifier: 'catalog:' - version: 5.8.3 + version: 5.9.3 webpack: specifier: 'catalog:' - version: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + version: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: specifier: 'catalog:' version: 5.1.4(webpack@5.98.0) webpack-merge: specifier: 'catalog:' - version: 5.10.0 + version: 5.9.0 exp_legacy: dependencies: @@ -167,22 +167,22 @@ importers: devDependencies: '@clusterio/lib': specifier: 'catalog:' - version: 2.0.0-alpha.21 + version: 2.0.0-alpha.22b '@types/node': specifier: 'catalog:' - version: 20.17.10 + version: 20.19.29 typescript: specifier: 'catalog:' - version: 5.8.3 + version: 5.9.3 webpack: specifier: 'catalog:' - version: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + version: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: specifier: 'catalog:' version: 5.1.4(webpack@5.98.0) webpack-merge: specifier: 'catalog:' - version: 5.10.0 + version: 5.9.0 exp_scenario: dependencies: @@ -198,37 +198,37 @@ importers: devDependencies: '@clusterio/lib': specifier: 'catalog:' - version: 2.0.0-alpha.21 + version: 2.0.0-alpha.22b '@clusterio/web_ui': specifier: 'catalog:' - version: 2.0.0-alpha.21 + version: 2.0.0-alpha.22b '@types/node': specifier: 'catalog:' - version: 20.17.10 + version: 20.19.29 '@types/react': specifier: 'catalog:' - version: 18.3.18 + version: 18.2.0 antd: specifier: 'catalog:' - version: 5.24.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.24.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: specifier: 'catalog:' - version: 18.3.1 + version: 18.2.0 react-dom: specifier: 'catalog:' - version: 18.3.1(react@18.3.1) + version: 18.2.0(react@18.2.0) typescript: specifier: 'catalog:' - version: 5.8.3 + version: 5.9.3 webpack: specifier: 'catalog:' - version: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + version: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: specifier: 'catalog:' version: 5.1.4(webpack@5.98.0) webpack-merge: specifier: 'catalog:' - version: 5.10.0 + version: 5.9.0 exp_server_ups: dependencies: @@ -247,22 +247,22 @@ importers: devDependencies: '@clusterio/lib': specifier: 'catalog:' - version: 2.0.0-alpha.21 + version: 2.0.0-alpha.22b '@types/node': specifier: 'catalog:' - version: 20.17.10 + version: 20.19.29 typescript: specifier: 'catalog:' - version: 5.8.3 + version: 5.9.3 webpack: specifier: 'catalog:' - version: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + version: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: specifier: 'catalog:' version: 5.1.4(webpack@5.98.0) webpack-merge: specifier: 'catalog:' - version: 5.10.0 + version: 5.9.0 exp_util: dependencies: @@ -272,30 +272,27 @@ importers: devDependencies: '@clusterio/lib': specifier: 'catalog:' - version: 2.0.0-alpha.21 + version: 2.0.0-alpha.22b '@types/node': specifier: 'catalog:' - version: 20.17.10 + version: 20.19.29 typescript: specifier: 'catalog:' - version: 5.8.3 + version: 5.9.3 webpack: specifier: 'catalog:' - version: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + version: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: specifier: 'catalog:' version: 5.1.4(webpack@5.98.0) webpack-merge: specifier: 'catalog:' - version: 5.10.0 + version: 5.9.0 packages: - '@ant-design/colors@7.1.0': - resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==} - - '@ant-design/colors@7.2.0': - resolution: {integrity: sha512-bjTObSnZ9C/O8MB/B4OUtd/q9COomuJAR2SYfhxLyHvCKn4EKwCN3e+fWGMo7H5InAyV0wL17jdE9ALrdOW/6A==} + '@ant-design/colors@7.2.1': + resolution: {integrity: sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==} '@ant-design/cssinjs-utils@1.1.3': resolution: {integrity: sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==} @@ -303,14 +300,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@ant-design/cssinjs@1.22.1': - resolution: {integrity: sha512-SLuXM4wiEE1blOx94iXrkOgseMZHzdr4ngdFu3VVDq6AOWh7rlwqTkMAtJho3EsBF6x/eUGOtK53VZXGQG7+sQ==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - '@ant-design/cssinjs@1.23.0': - resolution: {integrity: sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==} + '@ant-design/cssinjs@1.24.0': + resolution: {integrity: sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' @@ -322,13 +313,6 @@ packages: '@ant-design/icons-svg@4.4.2': resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} - '@ant-design/icons@5.5.2': - resolution: {integrity: sha512-xc53rjVBl9v2BqFxUjZGti/RfdDeA8/6KYglmInM2PNqSXc/WfuGDTifJI/ZsokJK0aeKvOIbXc9y2g8ILAhEA==} - engines: {node: '>=8'} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - '@ant-design/icons@5.6.1': resolution: {integrity: sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==} engines: {node: '>=8'} @@ -341,40 +325,24 @@ packages: peerDependencies: react: '>=16.9.0' - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} - engines: {node: '>=6.9.0'} - - '@clusterio/lib@2.0.0-alpha.20': - resolution: {integrity: sha512-3+iYtTKmvk8/bAGLeg5yGGGDGuryOy5EEI0vOTPNT7oAJrOVt8dtWiH//WXLQFlUa6U6hrlHoc1xUDjcgIdV+w==} + '@clusterio/lib@2.0.0-alpha.22b': + resolution: {integrity: sha512-tzuRsAaUBkgWQIhBmvuR4ynP7oxREEHibuLNaWk3mjYl4k4boDdiPFcYhJBrdYoteYVnsS5uH6iY+14Zsepw1w==} engines: {node: '>=12'} - '@clusterio/lib@2.0.0-alpha.21': - resolution: {integrity: sha512-Mm1J5E75d+gV5fFgBOjEuAEZBiRb/NJJfLeLDE8wvQwZlljPFeyFsDhdd9f0DlZ/CFMYrNczEjezzoUA+yLd/A==} - engines: {node: '>=12'} - - '@clusterio/web_ui@2.0.0-alpha.20.b': - resolution: {integrity: sha512-Ahwq+pHg1J77LkVYk3OHt67SJ8TdwWin4fPjSUtDxpe2rJImCU0Gfss99aXWfKjOwvJUgOEP1m/tHPqsM95U6Q==} - engines: {node: '>=12'} - - '@clusterio/web_ui@2.0.0-alpha.21': - resolution: {integrity: sha512-zwfqmrhR4op3FFNLrzLzqook5EI9mIr1Im9f7lnxYUV9zfH+RupoNnKNsxFwqZywwmgEg42cbDQsC/f7hUT8sA==} + '@clusterio/web_ui@2.0.0-alpha.22b': + resolution: {integrity: sha512-NLVNJ77dpDDczngdqgjSWtiZKXGsrW28wM0jIhnAshPlU5VkP2d/0Z/MDLS1/CzkSvHxghNsTosaxiMN6am3mw==} engines: {node: '>=12'} '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} - '@ctrl/tinycolor@3.6.1': - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} - engines: {node: '>=10'} - - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} '@discoveryjs/json-ext@0.5.7': resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} @@ -386,29 +354,32 @@ packages: '@emotion/unitless@0.7.5': resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@rc-component/async-validator@5.0.4': - resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} + '@rc-component/async-validator@5.1.0': + resolution: {integrity: sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==} engines: {node: '>=14.x'} '@rc-component/color-picker@2.0.1': @@ -441,8 +412,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/qrcode@1.0.0': - resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==} + '@rc-component/qrcode@1.0.1': + resolution: {integrity: sha512-g8eeeaMyFXVlq8cZUeaxCDhfIYjpao0l9cvm5gFwKXy/Vm1yDWV7h2sjH5jHYzdFedlVKBpATFB1VKMrHzwaWQ==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -455,85 +426,88 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/trigger@2.2.6': - resolution: {integrity: sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==} + '@rc-component/trigger@2.3.1': + resolution: {integrity: sha512-ORENF39PeXTzM+gQEshuk460Z8N4+6DkjpxlpE7Q3gYy1iBpLrx0FOJz3h62ryrJZ/3zCAUIkT1Pb/8hHWpb3A==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - '@remix-run/router@1.23.0': - resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} + '@remix-run/router@1.23.2': + resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} engines: {node: '>=14.0.0'} '@sinclair/typebox@0.30.4': resolution: {integrity: sha512-wFuuDR+O1OAE2GL0q68h1Ty00RE6Ihcixr55A6TU5RCvOUHnwJw9LGuDVg9NxDiAp7m/YJpa+UaOuLAz0ziyOQ==} - '@swc/core-darwin-arm64@1.11.16': - resolution: {integrity: sha512-l6uWMU+MUdfLHCl3dJgtVEdsUHPskoA4BSu0L1hh9SGBwPZ8xeOz8iLIqZM27lTuXxL4KsYH6GQR/OdQ/vhLtg==} + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@swc/core-darwin-arm64@1.15.8': + resolution: {integrity: sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.16': - resolution: {integrity: sha512-TH0IW8Ao1WZ4ARFHIh29dAQHYBEl4YnP74n++rjppmlCjY+8v3s5nXMA7IqxO3b5LVHyggWtU4+46DXTyMJM7g==} + '@swc/core-darwin-x64@1.15.8': + resolution: {integrity: sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.16': - resolution: {integrity: sha512-2IxD9t09oNZrbv37p4cJ9cTHMUAK6qNiShi9s2FJ9LcqSnZSN4iS4hvaaX6KZuG54d58vWnMU7yycjkdOTQcMg==} + '@swc/core-linux-arm-gnueabihf@1.15.8': + resolution: {integrity: sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.16': - resolution: {integrity: sha512-AYkN23DOiPh1bf3XBf/xzZQDKSsgZTxlbyTyUIhprLJpAAAT0ZCGAUcS5mHqydk0nWQ13ABUymodvHoroutNzw==} + '@swc/core-linux-arm64-gnu@1.15.8': + resolution: {integrity: sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.16': - resolution: {integrity: sha512-n/nWXDRCIhM51dDGELfBcTMNnCiFatE7LDvsbYxb7DJt1HGjaCNvHHCKURb/apJTh/YNtWfgFap9dbsTgw8yPA==} + '@swc/core-linux-arm64-musl@1.15.8': + resolution: {integrity: sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.16': - resolution: {integrity: sha512-xr182YQrF47n7Awxj+/ruI21bYw+xO/B26KFVnb+i3ezF9NOhqoqTX+33RL1ZLA/uFTq8ksPZO/y+ZVS/odtQA==} + '@swc/core-linux-x64-gnu@1.15.8': + resolution: {integrity: sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.16': - resolution: {integrity: sha512-k2JBfiwWfXCIKrBRjFO9/vEdLSYq0QLJ+iNSLdfrejZ/aENNkbEg8O7O2GKUSb30RBacn6k8HMfJrcPLFiEyCQ==} + '@swc/core-linux-x64-musl@1.15.8': + resolution: {integrity: sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.16': - resolution: {integrity: sha512-taOb5U+abyEhQgex+hr6cI48BoqSvSdfmdirWcxprIEUBHCxa1dSriVwnJRAJOFI9T+5BEz88by6rgbB9MjbHA==} + '@swc/core-win32-arm64-msvc@1.15.8': + resolution: {integrity: sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.16': - resolution: {integrity: sha512-b7yYggM9LBDiMY+XUt5kYWvs5sn0U3PXSOGvF3CbLufD/N/YQiDcYON2N3lrWHYL8aYnwbuZl45ojmQHSQPcdA==} + '@swc/core-win32-ia32-msvc@1.15.8': + resolution: {integrity: sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.16': - resolution: {integrity: sha512-/ibq/YDc3B5AROkpOKPGxVkSyCKOg+ml8k11RxrW7FAPy6a9y5y9KPcWIqV74Ahq4RuaMNslTQqHWAGSm0xJsQ==} + '@swc/core-win32-x64-msvc@1.15.8': + resolution: {integrity: sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.16': - resolution: {integrity: sha512-wgjrJqVUss8Lxqilg0vkiE0tkEKU3mZkoybQM1Ehy+PKWwwB6lFAwKi20cAEFlSSWo8jFR8hRo19ZELAoLDowg==} + '@swc/core@1.15.8': + resolution: {integrity: sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw==} engines: {node: '>=10'} peerDependencies: - '@swc/helpers': '*' + '@swc/helpers': '>=0.5.17' peerDependenciesMeta: '@swc/helpers': optional: true @@ -541,8 +515,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.21': - resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -550,8 +524,8 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -565,17 +539,21 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/minimatch@6.0.0': + resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} + deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. - '@types/node@20.17.10': - resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==} + '@types/node@20.19.29': + resolution: {integrity: sha512-YrT9ArrGaHForBaCNwFjoqJWmn8G1Pr7+BH/vwyLHciA9qT/wSiuOhxGCT50JA5xLvFBd6PIiGkE3afxcPE1nw==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react@18.3.18': - resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + '@types/react@18.2.0': + resolution: {integrity: sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==} + + '@types/scheduler@0.26.0': + resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} @@ -656,8 +634,8 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -688,14 +666,8 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - antd@5.22.6: - resolution: {integrity: sha512-ZYURSV3FR8qQgbfpa554thlO07L6PeHwhAM0wmxnobOBogND/HqSnTU+UZTqT2b2y9MxSfAIu5Xn1uEM9UpceQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - antd@5.24.6: - resolution: {integrity: sha512-xIlTa/1CTbgkZsdU/dOXkYvJXb9VoiMwsaCzpKFH2zAEY3xqOfwQ57/DdG7lAdrWP7QORtSld4UA6suxzuTHXw==} + antd@5.24.2: + resolution: {integrity: sha512-7Z9HsE3ZIK3sE/WuUqii3w7Gl1IJuRL21sDUTtkN95JS5KhRYP8ISv7m/HxsJ3Mn/yxgojBCgLPJ212+Dn+aPw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -727,17 +699,21 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.9.14: + resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} + hasBin: true + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.24.3: - resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -747,20 +723,20 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - caniuse-lite@1.0.30001712: - resolution: {integrity: sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==} + caniuse-lite@1.0.30001764: + resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -787,31 +763,32 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -852,11 +829,11 @@ packages: engines: {node: '>=4'} hasBin: true - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} @@ -874,8 +851,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.132: - resolution: {integrity: sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -887,12 +864,12 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} - envinfo@7.14.0: - resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + envinfo@7.21.0: + resolution: {integrity: sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==} engines: {node: '>=4'} hasBin: true @@ -904,11 +881,11 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} escalade@3.2.0: @@ -941,8 +918,8 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} @@ -961,22 +938,15 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} fs.realpath@1.0.0: @@ -985,12 +955,20 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} glob-to-regexp@0.4.1: @@ -1062,9 +1040,6 @@ packages: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -1077,8 +1052,8 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-nan@1.3.2: @@ -1101,6 +1076,10 @@ packages: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -1143,8 +1122,8 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -1163,8 +1142,8 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} loader-utils@2.0.4: @@ -1198,22 +1177,26 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} null-loader@4.0.1: resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==} @@ -1309,8 +1292,8 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} postcss-modules-extract-imports@3.1.0: @@ -1337,15 +1320,15 @@ packages: peerDependencies: postcss: ^8.1.0 - postcss-selector-parser@7.0.0: - resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} process-nextick-args@2.0.1: @@ -1362,24 +1345,12 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - rc-cascader@3.30.0: - resolution: {integrity: sha512-rrzSbk1Bdqbu+pDwiLCLHu72+lwX9BZ28+JKzoi0DWZ4N29QYFeip8Gctl33QVd2Xg3Rf14D3yAOG76ElJw16w==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-cascader@3.33.1: resolution: {integrity: sha512-Kyl4EJ7ZfCBuidmZVieegcbFw0RcU5bHHSbtEdmuLYd0fYHCAiYKZ6zon7fWAVyC6rWWOOib0XKdTSf7ElC9rg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-checkbox@3.3.0: - resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-checkbox@3.5.0: resolution: {integrity: sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==} peerDependencies: @@ -1417,67 +1388,37 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-field-form@2.7.0: - resolution: {integrity: sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==} + rc-field-form@2.7.1: + resolution: {integrity: sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-image@7.11.0: - resolution: {integrity: sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-image@7.11.1: resolution: {integrity: sha512-XuoWx4KUXg7hNy5mRTy1i8c8p3K8boWg6UajbHpDXS5AlRVucNfTi5YxTtPBTBzegxAZpvuLfh3emXFt6ybUdA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-input-number@9.3.0: - resolution: {integrity: sha512-JQ363ywqRyxwgVxpg2z2kja3CehTpYdqR7emJ/6yJjRdbvo+RvfE83fcpBCIJRq3zLp8SakmEXq60qzWyZ7Usw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-input-number@9.4.0: resolution: {integrity: sha512-Tiy4DcXcFXAf9wDhN8aUAyMeCLHJUHA/VA/t7Hj8ZEx5ETvxG7MArDOSE6psbiSCo+vJPm4E3fGN710ITVn6GA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-input@1.6.4: - resolution: {integrity: sha512-lBZhfRD4NSAUW0zOKLUeI6GJuXkxeZYi0hr8VcJgJpyTNOvHw1ysrKWAHcEOAAHj7guxgmWYSi6xWrEdfrSAsA==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - rc-input@1.7.3: resolution: {integrity: sha512-A5w4egJq8+4JzlQ55FfQjDnPvOaAbzwC3VLOAdOytyek3TboSOP9qxN+Gifup+shVXfvecBLBbWBpWxmk02SWQ==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' - rc-mentions@2.17.0: - resolution: {integrity: sha512-sfHy+qLvc+p8jx8GUsujZWXDOIlIimp6YQz7N5ONQ6bHsa2kyG+BLa5k2wuxgebBbH97is33wxiyq5UkiXRpHA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-mentions@2.19.1: resolution: {integrity: sha512-KK3bAc/bPFI993J3necmaMXD2reZTzytZdlTvkeBbp50IGH1BDPDvxLdHDUrpQx2b2TGaVJsn+86BvYa03kGqA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-menu@9.16.0: - resolution: {integrity: sha512-vAL0yqPkmXWk3+YKRkmIR8TYj3RVdEt3ptG2jCJXWNAvQbT0VJJdRyHZ7kG/l1JsZlB+VJq/VcYOo69VR4oD+w==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-menu@9.16.1: resolution: {integrity: sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==} peerDependencies: @@ -1490,28 +1431,15 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-notification@5.6.2: - resolution: {integrity: sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==} + rc-notification@5.6.4: + resolution: {integrity: sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-notification@5.6.3: - resolution: {integrity: sha512-42szwnn8VYQoT6GnjO00i1iwqV9D1TTMvxObWsuLwgl0TsOokzhkYiufdtQBsJMFjJravS1hfDKVMHLKLcPE4g==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-overflow@1.4.1: - resolution: {integrity: sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-pagination@5.0.0: - resolution: {integrity: sha512-QjrPvbAQwps93iluvFM62AEYglGYhWW2q/nliQqmvkTi4PXP4HHoh00iC1Sa5LLVmtWQHmG73fBi2x6H6vFHRg==} + rc-overflow@1.5.0: + resolution: {integrity: sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -1542,39 +1470,12 @@ packages: moment: optional: true - rc-picker@4.8.3: - resolution: {integrity: sha512-hJ45qoEs4mfxXPAJdp1n3sKwADul874Cd0/HwnsEOE60H+tgiJUGgbOD62As3EG/rFVNS5AWRfBCDJJfmRqOVQ==} - engines: {node: '>=8.x'} - peerDependencies: - date-fns: '>= 2.x' - dayjs: '>= 1.x' - luxon: '>= 3.x' - moment: '>= 2.x' - react: '>=16.9.0' - react-dom: '>=16.9.0' - peerDependenciesMeta: - date-fns: - optional: true - dayjs: - optional: true - luxon: - optional: true - moment: - optional: true - rc-progress@4.0.0: resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-rate@2.13.0: - resolution: {integrity: sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-rate@2.13.1: resolution: {integrity: sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==} engines: {node: '>=8.x'} @@ -1588,41 +1489,21 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-segmented@2.5.0: - resolution: {integrity: sha512-B28Fe3J9iUFOhFJET3RoXAPFJ2u47QvLSYcZWC4tFYNGPEjug5LAxEasZlA/PpAxhdOPqGWsGbSj7ftneukJnw==} + rc-segmented@2.7.1: + resolution: {integrity: sha512-izj1Nw/Dw2Vb7EVr+D/E9lUTkBe+kKC+SAFSU9zqr7WV2W5Ktaa9Gc7cB2jTqgk8GROJayltaec+DBlYKc6d+g==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' - rc-segmented@2.7.0: - resolution: {integrity: sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - rc-select@14.16.4: - resolution: {integrity: sha512-jP6qf7+vjnxGvPpfPWbGYfFlSl3h8L2XcD4O7g2GYXmEeBC0mw+nPD7i++OOE8v3YGqP8xtYjRKAWCMLfjgxlw==} + rc-select@14.16.8: + resolution: {integrity: sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==} engines: {node: '>=8.x'} peerDependencies: react: '*' react-dom: '*' - rc-select@14.16.6: - resolution: {integrity: sha512-YPMtRPqfZWOm2XGTbx5/YVr1HT0vn//8QS77At0Gjb3Lv+Lbut0IORJPKLWu1hQ3u4GsA0SrDzs7nI8JG7Zmyg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '*' - react-dom: '*' - - rc-slider@11.1.7: - resolution: {integrity: sha512-ytYbZei81TX7otdC0QvoYD72XSlxvTihNth5OeZ6PMXyEDq/vHdWFulQmfDGyXK1NwKwSlKgpvINOa88uT5g2A==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-slider@11.1.8: - resolution: {integrity: sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==} + rc-slider@11.1.9: + resolution: {integrity: sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -1641,22 +1522,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-table@7.49.0: - resolution: {integrity: sha512-/FoPLX94muAQOxVpi1jhnpKjOIqUbT81eELQPAzSXOke4ky4oCWYUXOcVpL31ZCO90xScwVSXRd7coqtgtB1Ng==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-table@7.50.4: - resolution: {integrity: sha512-Y+YuncnQqoS5e7yHvfvlv8BmCvwDYDX/2VixTBEhkMDk9itS9aBINp4nhzXFKiBP/frG4w0pS9d9Rgisl0T1Bw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-tabs@15.4.0: - resolution: {integrity: sha512-llKuyiAVqmXm2z7OrmhX5cNb2ueZaL8ZyA2P4R+6/72NYYcbEgOXibwHiQCFY2RiN3swXl53SIABi2CumUS02g==} + rc-table@7.50.5: + resolution: {integrity: sha512-FDZu8aolhSYd3v9KOc3lZOVAU77wmRRu44R0Wfb8Oj1dXRUsloFaXMSl6f7yuWZUxArJTli7k8TEOX2mvhDl4A==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -1669,49 +1536,24 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-textarea@1.8.2: - resolution: {integrity: sha512-UFAezAqltyR00a8Lf0IPAyTd29Jj9ee8wt8DqXyDMal7r/Cg/nDt3e1OOv3Th4W6mKaZijjgwuPXhAfVNTN8sw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-textarea@1.9.0: resolution: {integrity: sha512-dQW/Bc/MriPBTugj2Kx9PMS5eXCCGn2cxoIaichjbNvOiARlaHdI99j4DTxLl/V8+PIfW06uFy7kjfUIDDKyxQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-tooltip@6.2.1: - resolution: {integrity: sha512-rws0duD/3sHHsD905Nex7FvoUGy2UBQRhTkKxeEvr2FB+r21HsOxcDJI0TzyO8NHhnAA8ILr8pfbSBg5Jj5KBg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-tooltip@6.4.0: resolution: {integrity: sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-tree-select@5.24.5: - resolution: {integrity: sha512-PnyR8LZJWaiEFw0SHRqo4MNQWyyZsyMs8eNmo68uXZWjxc7QqeWcjPPoONN0rc90c3HZqGF9z+Roz+GLzY5GXA==} - peerDependencies: - react: '*' - react-dom: '*' - rc-tree-select@5.27.0: resolution: {integrity: sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==} peerDependencies: react: '*' react-dom: '*' - rc-tree@5.10.1: - resolution: {integrity: sha512-FPXb3tT/u39mgjr6JNlHaUTYfHkVGW56XaGDahDpEFLGsnPxGcVLNTjcqoQb/GNbSCycl7tD7EvIymwOTP0+Yw==} - engines: {node: '>=10.x'} - peerDependencies: - react: '*' - react-dom: '*' - rc-tree@5.13.1: resolution: {integrity: sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==} engines: {node: '>=10.x'} @@ -1725,48 +1567,42 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-util@5.44.3: - resolution: {integrity: sha512-q6KCcOFk3rv/zD3MckhJteZxb0VjAIFuf622B7ElK4vfrZdAzs16XR5p3VTdy3+U5jfJU5ACz4QnhLSuAGe5dA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-util@5.44.4: resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-virtual-list@3.18.5: - resolution: {integrity: sha512-1FuxVSxhzTj3y8k5xMPbhXCB0t2TOiI3Tq+qE2Bu+GGV7f+ECVuQl4OUg6lZ2qT5fordTW7CBpr9czdzXCI7Pg==} + rc-virtual-list@3.19.2: + resolution: {integrity: sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: ^18.3.1 + react: ^18.2.0 react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-router-dom@6.30.0: - resolution: {integrity: sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==} + react-router-dom@6.30.3: + resolution: {integrity: sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.30.0: - resolution: {integrity: sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==} + react-router@6.30.3: + resolution: {integrity: sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} readable-stream@2.3.8: @@ -1780,9 +1616,6 @@ packages: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -1802,8 +1635,8 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true @@ -1818,6 +1651,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} @@ -1829,15 +1666,15 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - schema-utils@4.3.0: - resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -1866,9 +1703,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} @@ -1927,18 +1761,18 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - swc-loader@0.2.6: - resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} + swc-loader@0.2.7: + resolution: {integrity: sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w==} peerDependencies: '@swc/core': ^1.2.147 webpack: '>=2' - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - terser-webpack-plugin@5.3.11: - resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -1953,8 +1787,8 @@ packages: uglify-js: optional: true - terser@5.37.0: - resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + terser@5.44.1: + resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} engines: {node: '>=10'} hasBin: true @@ -1972,30 +1806,20 @@ packages: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2009,8 +1833,8 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + watchpack@2.5.0: + resolution: {integrity: sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==} engines: {node: '>=10.13.0'} webpack-cli@5.1.4: @@ -2030,22 +1854,22 @@ packages: webpack-dev-server: optional: true - webpack-manifest-plugin@5.0.0: - resolution: {integrity: sha512-8RQfMAdc5Uw3QbCQ/CBV/AXqOR8mt03B6GJmRbhWopE8GzRfEpn+k0ZuWywxW+5QZsffhmFDY1J6ohqJo+eMuw==} - engines: {node: '>=12.22.0'} + webpack-manifest-plugin@5.0.1: + resolution: {integrity: sha512-xTlX7dC3hrASixA2inuWFMz6qHsNi6MT3Uiqw621sJjRTShtpMjbDYhPPZBwWUKdIYKIjSq9em6+uzWayf38aQ==} + engines: {node: '>=14'} peerDependencies: - webpack: ^5.47.0 + webpack: ^5.75.0 - webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + webpack-merge@5.9.0: + resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} engines: {node: '>=10.0.0'} webpack-sources@2.3.1: resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} engines: {node: '>=10.13.0'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} webpack@5.98.0: @@ -2058,8 +1882,8 @@ packages: webpack-cli: optional: true - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -2074,8 +1898,8 @@ packages: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} - winston@3.17.0: - resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} engines: {node: '>= 12.0.0'} wrap-ansi@7.0.0: @@ -2085,8 +1909,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2111,134 +1935,83 @@ packages: snapshots: - '@ant-design/colors@7.1.0': - dependencies: - '@ctrl/tinycolor': 3.6.1 - - '@ant-design/colors@7.2.0': + '@ant-design/colors@7.2.1': dependencies: '@ant-design/fast-color': 2.0.6 - '@ant-design/cssinjs-utils@1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/cssinjs-utils@1.1.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@ant-design/cssinjs': 1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@babel/runtime': 7.27.0 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@ant-design/cssinjs': 1.24.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.28.6 + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@ant-design/cssinjs@1.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/cssinjs@1.24.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 - csstype: 3.1.3 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - stylis: 4.3.6 - - '@ant-design/cssinjs@1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.27.0 - '@emotion/hash': 0.8.0 - '@emotion/unitless': 0.7.5 - classnames: 2.5.1 - csstype: 3.1.3 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + csstype: 3.2.3 + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) stylis: 4.3.6 '@ant-design/fast-color@2.0.6': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 '@ant-design/icons-svg@4.4.2': {} - '@ant-design/icons@5.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/icons@5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@ant-design/colors': 7.2.0 + '@ant-design/colors': 7.2.1 '@ant-design/icons-svg': 4.4.2 - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@ant-design/icons@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/react-slick@1.1.2(react@18.2.0)': dependencies: - '@ant-design/colors': 7.2.0 - '@ant-design/icons-svg': 4.4.2 - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@ant-design/react-slick@1.1.2(react@18.3.1)': - dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 json2mq: 0.2.0 - react: 18.3.1 + react: 18.2.0 resize-observer-polyfill: 1.5.1 throttle-debounce: 5.0.2 - '@babel/runtime@7.26.0': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.28.6': {} - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@clusterio/lib@2.0.0-alpha.20': + '@clusterio/lib@2.0.0-alpha.22b': dependencies: '@sinclair/typebox': 0.30.4 ajv: 8.17.1 chalk: 4.1.2 fast-deep-equal: 3.1.3 - fs-extra: 11.3.0 + fs-extra: 11.3.3 jszip: 3.10.1 klaw: 4.1.0 set-blocking: 2.0.0 triple-beam: 1.4.1 - winston: 3.17.0 + winston: 3.19.0 winston-transport: 4.9.0 - ws: 8.18.1 + ws: 8.19.0 yargs: 17.7.2 transitivePeerDependencies: - bufferutil - utf-8-validate - '@clusterio/lib@2.0.0-alpha.21': + '@clusterio/web_ui@2.0.0-alpha.22b': dependencies: + '@ant-design/icons': 5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@clusterio/lib': 2.0.0-alpha.22b '@sinclair/typebox': 0.30.4 - ajv: 8.17.1 - chalk: 4.1.2 - fast-deep-equal: 3.1.3 - fs-extra: 11.3.0 - jszip: 3.10.1 - klaw: 4.1.0 - set-blocking: 2.0.0 - triple-beam: 1.4.1 - winston: 3.17.0 - winston-transport: 4.9.0 - ws: 8.18.1 - yargs: 17.7.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@clusterio/web_ui@2.0.0-alpha.20.b': - dependencies: - '@ant-design/icons': 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@clusterio/lib': 2.0.0-alpha.20 - '@sinclair/typebox': 0.30.4 - '@swc/core': 1.11.16 - antd: 5.24.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@swc/core': 1.15.8 + antd: 5.24.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) assert: 2.1.0 browserify-zlib: 0.2.0 buffer: 6.0.3 @@ -2250,64 +2023,19 @@ snapshots: os-browserify: 0.3.0 path-browserify: 1.0.1 process: 0.11.10 - rc-field-form: 1.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router-dom: 6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-field-form: 1.44.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router-dom: 6.30.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) stream-browserify: 3.0.0 style-loader: 3.3.4(webpack@5.98.0) - swc-loader: 0.2.6(@swc/core@1.11.16)(webpack@5.98.0) - terser-webpack-plugin: 5.3.11(@swc/core@1.11.16)(webpack@5.98.0) - typescript: 5.9.2 + swc-loader: 0.2.7(@swc/core@1.15.8)(webpack@5.98.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.8)(webpack@5.98.0) + typescript: 5.9.3 util: 0.12.5 - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.98.0) - webpack-manifest-plugin: 5.0.0(webpack@5.98.0) - transitivePeerDependencies: - - '@rspack/core' - - '@swc/helpers' - - '@webpack-cli/generators' - - bufferutil - - date-fns - - esbuild - - luxon - - moment - - uglify-js - - utf-8-validate - - webpack-bundle-analyzer - - webpack-dev-server - - '@clusterio/web_ui@2.0.0-alpha.21': - dependencies: - '@ant-design/icons': 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@clusterio/lib': 2.0.0-alpha.21 - '@sinclair/typebox': 0.30.4 - '@swc/core': 1.11.16 - antd: 5.24.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - assert: 2.1.0 - browserify-zlib: 0.2.0 - buffer: 6.0.3 - clean-webpack-plugin: 4.0.0(webpack@5.98.0) - css-loader: 6.11.0(webpack@5.98.0) - events: 3.3.0 - file-loader: 6.2.0(webpack@5.98.0) - null-loader: 4.0.1(webpack@5.98.0) - os-browserify: 0.3.0 - path-browserify: 1.0.1 - process: 0.11.10 - rc-field-form: 1.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router-dom: 6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - stream-browserify: 3.0.0 - style-loader: 3.3.4(webpack@5.98.0) - swc-loader: 0.2.6(@swc/core@1.11.16)(webpack@5.98.0) - terser-webpack-plugin: 5.3.11(@swc/core@1.11.16)(webpack@5.98.0) - typescript: 5.8.3 - util: 0.12.5 - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.98.0) - webpack-manifest-plugin: 5.0.0(webpack@5.98.0) + webpack-manifest-plugin: 5.0.1(webpack@5.98.0) transitivePeerDependencies: - '@rspack/core' - '@swc/helpers' @@ -2324,11 +2052,9 @@ snapshots: '@colors/colors@1.6.0': {} - '@ctrl/tinycolor@3.6.1': {} - - '@dabh/diagnostics@2.0.3': + '@dabh/diagnostics@2.0.8': dependencies: - colorspace: 1.1.4 + '@so-ric/colorspace': 1.1.6 enabled: 2.0.0 kuler: 2.0.0 @@ -2338,193 +2064,205 @@ snapshots: '@emotion/unitless@0.7.5': {} - '@jridgewell/gen-mapping@0.3.8': + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@isaacs/balanced-match': 4.0.1 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.11': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 - '@rc-component/async-validator@5.0.4': + '@rc-component/async-validator@5.1.0': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 - '@rc-component/color-picker@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/color-picker@2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@ant-design/fast-color': 2.0.6 - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/context@1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.0 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@babel/runtime': 7.28.6 + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) '@rc-component/mini-decimal@1.1.0': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 - '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/mutate-observer@1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/portal@1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/qrcode@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@rc-component/tour@1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/tour@1.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 + '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/trigger': 2.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@rc-component/trigger@2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/trigger@2.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 + '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@remix-run/router@1.23.0': {} + '@remix-run/router@1.23.2': {} '@sinclair/typebox@0.30.4': {} - '@swc/core-darwin-arm64@1.11.16': + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + + '@swc/core-darwin-arm64@1.15.8': optional: true - '@swc/core-darwin-x64@1.11.16': + '@swc/core-darwin-x64@1.15.8': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.16': + '@swc/core-linux-arm-gnueabihf@1.15.8': optional: true - '@swc/core-linux-arm64-gnu@1.11.16': + '@swc/core-linux-arm64-gnu@1.15.8': optional: true - '@swc/core-linux-arm64-musl@1.11.16': + '@swc/core-linux-arm64-musl@1.15.8': optional: true - '@swc/core-linux-x64-gnu@1.11.16': + '@swc/core-linux-x64-gnu@1.15.8': optional: true - '@swc/core-linux-x64-musl@1.11.16': + '@swc/core-linux-x64-musl@1.15.8': optional: true - '@swc/core-win32-arm64-msvc@1.11.16': + '@swc/core-win32-arm64-msvc@1.15.8': optional: true - '@swc/core-win32-ia32-msvc@1.11.16': + '@swc/core-win32-ia32-msvc@1.15.8': optional: true - '@swc/core-win32-x64-msvc@1.11.16': + '@swc/core-win32-x64-msvc@1.15.8': optional: true - '@swc/core@1.11.16': + '@swc/core@1.15.8': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.21 + '@swc/types': 0.1.25 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.16 - '@swc/core-darwin-x64': 1.11.16 - '@swc/core-linux-arm-gnueabihf': 1.11.16 - '@swc/core-linux-arm64-gnu': 1.11.16 - '@swc/core-linux-arm64-musl': 1.11.16 - '@swc/core-linux-x64-gnu': 1.11.16 - '@swc/core-linux-x64-musl': 1.11.16 - '@swc/core-win32-arm64-msvc': 1.11.16 - '@swc/core-win32-ia32-msvc': 1.11.16 - '@swc/core-win32-x64-msvc': 1.11.16 + '@swc/core-darwin-arm64': 1.15.8 + '@swc/core-darwin-x64': 1.15.8 + '@swc/core-linux-arm-gnueabihf': 1.15.8 + '@swc/core-linux-arm64-gnu': 1.15.8 + '@swc/core-linux-arm64-musl': 1.15.8 + '@swc/core-linux-x64-gnu': 1.15.8 + '@swc/core-linux-x64-musl': 1.15.8 + '@swc/core-win32-arm64-msvc': 1.15.8 + '@swc/core-win32-ia32-msvc': 1.15.8 + '@swc/core-win32-x64-msvc': 1.15.8 '@swc/counter@0.1.3': {} - '@swc/types@0.1.21': + '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.17.10 + '@types/node': 20.19.29 '@types/glob@7.2.0': dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.17.10 + '@types/minimatch': 6.0.0 + '@types/node': 20.19.29 '@types/json-schema@7.0.15': {} '@types/jsonfile@6.1.4': dependencies: - '@types/node': 20.17.10 + '@types/node': 20.19.29 - '@types/minimatch@5.1.2': {} - - '@types/node@20.17.10': + '@types/minimatch@6.0.0': dependencies: - undici-types: 6.19.8 + minimatch: 10.1.1 - '@types/prop-types@15.7.14': {} - - '@types/react@18.3.18': + '@types/node@20.19.29': dependencies: - '@types/prop-types': 15.7.14 - csstype: 3.1.3 + undici-types: 6.21.0 + + '@types/prop-types@15.7.15': {} + + '@types/react@18.2.0': + dependencies: + '@types/prop-types': 15.7.15 + '@types/scheduler': 0.26.0 + csstype: 3.2.3 + + '@types/scheduler@0.26.0': {} '@types/triple-beam@1.3.5': {} @@ -2606,24 +2344,24 @@ snapshots: '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.98.0)': dependencies: - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.98.0) '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.98.0)': dependencies: - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.98.0) '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.98.0)': dependencies: - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.98.0) '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} - acorn@8.14.1: {} + acorn@8.15.0: {} ajv-formats@2.1.1: dependencies: @@ -2648,7 +2386,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -2658,115 +2396,57 @@ snapshots: dependencies: color-convert: 2.0.1 - antd@5.22.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + antd@5.24.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@ant-design/colors': 7.1.0 - '@ant-design/cssinjs': 1.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/cssinjs-utils': 1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/icons': 5.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/react-slick': 1.1.2(react@18.3.1) - '@babel/runtime': 7.26.0 - '@ctrl/tinycolor': 3.6.1 - '@rc-component/color-picker': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/tour': 1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - copy-to-clipboard: 3.3.3 - dayjs: 1.11.13 - rc-cascader: 3.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-checkbox: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-collapse: 3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-drawer: 7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-field-form: 2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-image: 7.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input: 1.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input-number: 9.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-mentions: 2.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-notification: 5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-pagination: 5.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-picker: 4.8.3(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-rate: 2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-segmented: 2.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-select: 14.16.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-slider: 11.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-table: 7.49.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tabs: 15.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tooltip: 6.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.10.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree-select: 5.24.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-upload: 4.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - scroll-into-view-if-needed: 3.1.0 - throttle-debounce: 5.0.2 - transitivePeerDependencies: - - date-fns - - luxon - - moment - - antd@5.24.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@ant-design/colors': 7.2.0 - '@ant-design/cssinjs': 1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/cssinjs-utils': 1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/colors': 7.2.1 + '@ant-design/cssinjs': 1.24.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@ant-design/cssinjs-utils': 1.1.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@ant-design/fast-color': 2.0.6 - '@ant-design/icons': 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/react-slick': 1.1.2(react@18.3.1) - '@babel/runtime': 7.27.0 - '@rc-component/color-picker': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/tour': 1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/icons': 5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@ant-design/react-slick': 1.1.2(react@18.2.0) + '@babel/runtime': 7.28.6 + '@rc-component/color-picker': 2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/mutate-observer': 1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/qrcode': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/tour': 1.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/trigger': 2.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 copy-to-clipboard: 3.3.3 - dayjs: 1.11.13 - rc-cascader: 3.33.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-checkbox: 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-collapse: 3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-drawer: 7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-field-form: 2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-image: 7.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input: 1.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input-number: 9.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-mentions: 2.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-notification: 5.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-pagination: 5.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-picker: 4.11.3(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-rate: 2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-segmented: 2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-select: 14.16.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-slider: 11.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-table: 7.50.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tabs: 15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tooltip: 6.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree-select: 5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-upload: 4.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + dayjs: 1.11.19 + rc-cascader: 3.33.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-checkbox: 3.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-collapse: 3.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-dialog: 9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-drawer: 7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-dropdown: 4.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-field-form: 2.7.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-image: 7.11.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input: 1.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input-number: 9.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-mentions: 2.19.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-menu: 9.16.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-notification: 5.6.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-pagination: 5.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-picker: 4.11.3(dayjs@1.11.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-progress: 4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-rate: 2.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-segmented: 2.7.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-select: 14.16.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-slider: 11.1.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-steps: 6.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-switch: 4.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-table: 7.50.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tabs: 15.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-textarea: 1.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tooltip: 6.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree: 5.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree-select: 5.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-upload: 4.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) scroll-into-view-if-needed: 3.1.0 throttle-debounce: 5.0.2 transitivePeerDependencies: @@ -2794,15 +2474,17 @@ snapshots: available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 balanced-match@1.0.2: {} base64-js@1.5.1: {} + baseline-browser-mapping@2.9.14: {} + big.js@5.2.2: {} - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -2811,12 +2493,13 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.24.3: + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001712 - electron-to-chromium: 1.5.132 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.3) + baseline-browser-mapping: 2.9.14 + caniuse-lite: 1.0.30001764 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) buffer-from@1.1.2: {} @@ -2825,24 +2508,24 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 - call-bound@1.0.3: + call-bound@1.0.4: dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.6 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 - caniuse-lite@1.0.30001712: {} + caniuse-lite@1.0.30001764: {} chalk@4.1.2: dependencies: @@ -2856,7 +2539,7 @@ snapshots: clean-webpack-plugin@4.0.0(webpack@5.98.0): dependencies: del: 4.1.1 - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) cliui@8.0.1: dependencies: @@ -2870,35 +2553,29 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 + color-name@2.1.0: {} - color@3.2.1: + color-string@2.1.4: dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + color-name: 2.1.0 + + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 colorette@2.0.20: {} - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - commander@10.0.1: {} commander@2.20.3: {} @@ -2921,22 +2598,22 @@ snapshots: css-loader@6.11.0(webpack@5.98.0): dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.49) - postcss-modules-local-by-default: 4.2.0(postcss@8.4.49) - postcss-modules-scope: 3.2.1(postcss@8.4.49) - postcss-modules-values: 4.0.0(postcss@8.4.49) + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.6.3 + semver: 7.7.3 optionalDependencies: - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) cssesc@3.0.0: {} - csstype@3.1.3: {} + csstype@3.2.3: {} - dayjs@1.11.13: {} + dayjs@1.11.19: {} define-data-property@1.1.4: dependencies: @@ -2962,11 +2639,11 @@ snapshots: dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.132: {} + electron-to-chromium@1.5.267: {} emoji-regex@8.0.0: {} @@ -2974,20 +2651,20 @@ snapshots: enabled@2.0.0: {} - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.3.0 - envinfo@7.14.0: {} + envinfo@7.21.0: {} es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-module-lexer@1.5.4: {} + es-module-lexer@1.7.0: {} - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -3012,7 +2689,7 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fastest-levenshtein@1.0.16: {} @@ -3022,52 +2699,51 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - flat@5.0.2: {} - fn.name@1.1.0: {} - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - fs-extra@11.2.0: + fs-extra@11.3.3: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@11.3.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs.realpath@1.0.0: {} function-bind@1.1.2: {} + generator-function@2.0.1: {} + get-caller-file@2.0.5: {} - get-intrinsic@1.2.6: + get-intrinsic@1.3.0: dependencies: - call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 + get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 math-intrinsics: 1.1.0 + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + glob-to-regexp@0.4.1: {} glob@7.2.3: @@ -3107,9 +2783,9 @@ snapshots: dependencies: function-bind: 1.1.2 - icss-utils@5.1.0(postcss@8.4.49): + icss-utils@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.4.49 + postcss: 8.5.6 ieee754@1.2.1: {} @@ -3131,11 +2807,9 @@ snapshots: is-arguments@1.2.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-arrayish@0.3.2: {} - is-callable@1.2.7: {} is-core-module@2.16.1: @@ -3144,9 +2818,13 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: + is-generator-function@1.1.2: dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-nan@1.3.2: dependencies: @@ -3167,11 +2845,18 @@ snapshots: dependencies: isobject: 3.0.1 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + is-stream@2.0.1: {} is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 isarray@1.0.0: {} @@ -3181,7 +2866,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.17.10 + '@types/node': 20.19.29 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -3199,7 +2884,7 @@ snapshots: json5@2.2.3: {} - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -3222,7 +2907,7 @@ snapshots: dependencies: immediate: 3.0.6 - loader-runner@4.3.0: {} + loader-runner@4.3.1: {} loader-utils@2.0.4: dependencies: @@ -3257,23 +2942,27 @@ snapshots: dependencies: mime-db: 1.52.0 + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 ms@2.1.3: {} - nanoid@3.3.8: {} + nanoid@3.3.11: {} neo-async@2.6.2: {} - node-releases@2.0.19: {} + node-releases@2.0.27: {} null-loader@4.0.1(webpack@5.98.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) object-assign@4.1.1: {} @@ -3287,9 +2976,9 @@ snapshots: object.assign@4.1.7: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -3345,39 +3034,39 @@ snapshots: dependencies: find-up: 4.1.0 - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} - postcss-modules-extract-imports@3.1.0(postcss@8.4.49): + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: - postcss: 8.4.49 + postcss: 8.5.6 - postcss-modules-local-by-default@4.2.0(postcss@8.4.49): + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-selector-parser: 7.0.0 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.4.49): + postcss-modules-scope@3.2.1(postcss@8.5.6): dependencies: - postcss: 8.4.49 - postcss-selector-parser: 7.0.0 + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 - postcss-modules-values@4.0.0(postcss@8.4.49): + postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 - postcss-selector-parser@7.0.0: + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} - postcss@8.4.49: + postcss@8.5.6: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -3391,559 +3080,354 @@ snapshots: dependencies: safe-buffer: 5.2.1 - rc-cascader@3.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-cascader@3.33.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-select: 14.16.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.10.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-select: 14.16.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree: 5.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-cascader@3.33.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-checkbox@3.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-select: 14.16.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-checkbox@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-collapse@3.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-checkbox@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-dialog@9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 + '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-collapse@3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-drawer@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 + '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-dialog@9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-dropdown@4.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 + '@rc-component/trigger': 2.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-drawer@7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-field-form@1.44.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-dropdown@4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-field-form@1.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 async-validator: 4.2.5 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-field-form@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-field-form@2.7.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/async-validator': 5.0.4 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@babel/runtime': 7.28.6 + '@rc-component/async-validator': 5.1.0 + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-image@7.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-image@7.11.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 + '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-dialog: 9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-image@7.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-input-number@9.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-input-number@9.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 - rc-input: 1.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-input: 1.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-input-number@9.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-input@1.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/mini-decimal': 1.1.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-input: 1.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-input@1.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-mentions@2.19.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 + '@rc-component/trigger': 2.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-input: 1.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-menu: 9.16.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-textarea: 1.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-input@1.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-menu@9.16.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 + '@rc-component/trigger': 2.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-overflow: 1.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-mentions@2.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-motion@2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-input: 1.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-mentions@2.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-notification@5.6.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-input: 1.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-menu@9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-overflow@1.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-menu@9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-pagination@5.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-motion@2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-picker@4.11.3(dayjs@1.11.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 + '@rc-component/trigger': 2.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-notification@5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-notification@5.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-overflow@1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-pagination@5.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-pagination@5.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-picker@4.11.3(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-overflow: 1.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) optionalDependencies: - dayjs: 1.11.13 + dayjs: 1.11.19 - rc-picker@4.8.3(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-progress@4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - dayjs: 1.11.13 + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-rate@2.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-rate@2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-resize-observer@1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-rate@2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-resize-observer@1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) resize-observer-polyfill: 1.5.1 - rc-segmented@2.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-segmented@2.7.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-segmented@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-select@14.16.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 + '@rc-component/trigger': 2.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-overflow: 1.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-virtual-list: 3.19.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-select@14.16.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-slider@11.1.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.18.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-select@14.16.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-steps@6.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.18.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-slider@11.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-switch@4.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-slider@11.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-table@7.50.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 + '@rc-component/context': 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-virtual-list: 3.19.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tabs@15.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-dropdown: 4.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-menu: 9.16.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-textarea@1.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-input: 1.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-table@7.49.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tooltip@6.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 + '@rc-component/trigger': 2.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.18.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-table@7.50.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tree-select@5.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.18.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-select: 14.16.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree: 5.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-tabs@15.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tree@5.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-virtual-list: 3.19.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-tabs@15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-upload@4.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - rc-textarea@1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-util@5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-input: 1.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-textarea@1.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-input: 1.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tooltip@6.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tooltip@6.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tree-select@5.24.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-select: 14.16.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.10.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tree-select@5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-select: 14.16.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tree@5.10.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.18.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tree@5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.18.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-upload@4.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-util@5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@babel/runtime': 7.28.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) react-is: 18.3.1 - rc-util@5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-virtual-list@3.19.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.27.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 - - rc-virtual-list@3.18.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.28.6 classnames: 2.5.1 - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.44.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - react-dom@18.3.1(react@18.3.1): + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 - react: 18.3.1 + react: 18.2.0 scheduler: 0.23.2 react-is@18.3.1: {} - react-router-dom@6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.30.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@remix-run/router': 1.23.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router: 6.30.0(react@18.3.1) + '@remix-run/router': 1.23.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.30.3(react@18.2.0) - react-router@6.30.0(react@18.3.1): + react-router@6.30.3(react@18.2.0): dependencies: - '@remix-run/router': 1.23.0 - react: 18.3.1 + '@remix-run/router': 1.23.2 + react: 18.2.0 - react@18.3.1: + react@18.2.0: dependencies: loose-envify: 1.4.0 @@ -3965,9 +3449,7 @@ snapshots: rechoir@0.8.0: dependencies: - resolve: 1.22.10 - - regenerator-runtime@0.14.1: {} + resolve: 1.22.11 require-directory@2.1.1: {} @@ -3981,7 +3463,7 @@ snapshots: resolve-from@5.0.0: {} - resolve@1.22.10: + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 @@ -3995,6 +3477,12 @@ snapshots: safe-buffer@5.2.1: {} + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} scheduler@0.23.2: @@ -4007,7 +3495,7 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - schema-utils@4.3.0: + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -4018,7 +3506,7 @@ snapshots: dependencies: compute-scroll-into-view: 3.1.1 - semver@7.6.3: {} + semver@7.7.3: {} serialize-javascript@6.0.2: dependencies: @@ -4031,7 +3519,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -4047,10 +3535,6 @@ snapshots: shebang-regex@3.0.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - source-list-map@2.0.1: {} source-map-js@1.2.1: {} @@ -4091,7 +3575,7 @@ snapshots: style-loader@3.3.4(webpack@5.98.0): dependencies: - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) stylis@4.3.6: {} @@ -4105,29 +3589,29 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swc-loader@0.2.6(@swc/core@1.11.16)(webpack@5.98.0): + swc-loader@0.2.7(@swc/core@1.15.8)(webpack@5.98.0): dependencies: - '@swc/core': 1.11.16 + '@swc/core': 1.15.8 '@swc/counter': 0.1.3 - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) - tapable@2.2.1: {} + tapable@2.3.0: {} - terser-webpack-plugin@5.3.11(@swc/core@1.11.16)(webpack@5.98.0): + terser-webpack-plugin@5.3.16(@swc/core@1.15.8)(webpack@5.98.0): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.0 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.37.0 - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + terser: 5.44.1 + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) optionalDependencies: - '@swc/core': 1.11.16 + '@swc/core': 1.15.8 - terser@5.37.0: + terser@5.44.1: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -4139,19 +3623,15 @@ snapshots: triple-beam@1.4.1: {} - typescript@5.7.2: {} + typescript@5.9.3: {} - typescript@5.8.3: {} - - typescript@5.9.2: {} - - undici-types@6.19.8: {} + undici-types@6.21.0: {} universalify@2.0.1: {} - update-browserslist-db@1.1.3(browserslist@4.24.3): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.24.3 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -4165,11 +3645,11 @@ snapshots: dependencies: inherits: 2.0.4 is-arguments: 1.2.0 - is-generator-function: 1.0.10 + is-generator-function: 1.1.2 is-typed-array: 1.1.15 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 - watchpack@2.4.2: + watchpack@2.5.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -4183,24 +3663,23 @@ snapshots: colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 - envinfo: 7.14.0 + envinfo: 7.21.0 fastest-levenshtein: 1.0.16 import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) - webpack-merge: 5.10.0 + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) + webpack-merge: 5.9.0 - webpack-manifest-plugin@5.0.0(webpack@5.98.0): + webpack-manifest-plugin@5.0.1(webpack@5.98.0): dependencies: - tapable: 2.2.1 - webpack: 5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4) + tapable: 2.3.0 + webpack: 5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4) webpack-sources: 2.3.1 - webpack-merge@5.10.0: + webpack-merge@5.9.0: dependencies: clone-deep: 4.0.1 - flat: 5.0.2 wildcard: 2.0.1 webpack-sources@2.3.1: @@ -4208,33 +3687,33 @@ snapshots: source-list-map: 2.0.1 source-map: 0.6.1 - webpack-sources@3.2.3: {} + webpack-sources@3.3.3: {} - webpack@5.98.0(@swc/core@1.11.16)(webpack-cli@5.1.4): + webpack@5.98.0(@swc/core@1.15.8)(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 - browserslist: 4.24.3 + acorn: 8.15.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.0 - es-module-lexer: 1.5.4 + enhanced-resolve: 5.18.4 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(@swc/core@1.11.16)(webpack@5.98.0) - watchpack: 2.4.2 - webpack-sources: 3.2.3 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.8)(webpack@5.98.0) + watchpack: 2.5.0 + webpack-sources: 3.3.3 optionalDependencies: webpack-cli: 5.1.4(webpack@5.98.0) transitivePeerDependencies: @@ -4242,12 +3721,13 @@ snapshots: - esbuild - uglify-js - which-typed-array@1.1.18: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 - for-each: 0.3.3 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -4263,10 +3743,10 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.17.0: + winston@3.19.0: dependencies: '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 + '@dabh/diagnostics': 2.0.8 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -4285,7 +3765,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.1: {} + ws@8.19.0: {} y18n@5.0.8: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8b339ce7..d698a918 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,16 +1,16 @@ packages: - - "*" + - '*' catalog: - "@clusterio/lib": ^2.0.0-alpha.21 - "@clusterio/web_ui": ^2.0.0-alpha.21 - "@sinclair/typebox": ^0.30.4 - "@types/node": ^20.14.9 - "@types/react": ^18.2.21 - "typescript": ^5.5.3 - "antd": ^5.13.0 - "react": ^18.2.0 - "react-dom": ^18.2.0 - "webpack": ^5.98.0 - "webpack-cli": ^5.1.4 - "webpack-merge": ^5.9.0 + '@clusterio/lib': 2.0.0-alpha.22b + '@clusterio/web_ui': 2.0.0-alpha.22b + '@sinclair/typebox': ^0.30.4 + '@types/node': ^20.19.29 + '@types/react': 18.2.0 + antd: 5.24.2 + react: 18.2.0 + react-dom: 18.2.0 + typescript: ^5.9.3 + webpack: 5.98.0 + webpack-cli: 5.1.4 + webpack-merge: 5.9.0