// ==UserScript== // @name Planner Plus // @namespace https://docs.scriptcat.org/ // @version 2.0.2 // @description Enhance your Planner experience with extra features. // @author Shu Su // @homepage https://scriptcat.org/en/script-show-page/5384 // @homepageURL https://scriptcat.org/en/script-show-page/5384 // @match https://tasks.office.com/* // @match https://planner.cloud.microsoft/* // @icon data:image/x-icon;base64,AAABAAEAQEAAAAEAIAAoQAAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1qUD/9alA//WpQP/1qUD/9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPWpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPWpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPWpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAA9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAA9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPWpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPWpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPWpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP8AAAAAAAAAAAAAAAAAAAAAAAAAALY4cv+2OHL/tjhy/7Y4cv/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAALY4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAALY4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAtjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAtjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAALY4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA/wAAAAD1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/9alA//WpQP/1qUD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALY4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI//WpQP/1qUD/9alA//WpQP/NOsj/9alA//WpQP/1qUD/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/9alA//WpQP/1qUD/9alA//WpQP/1qUD/zTrI/806yP/NOsj/zTrI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALY4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/AAAAAM06yP/NOsj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/9alA//WpQP8AAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAALY4cv8AAAAAtjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv8AAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/wAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv8AAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/AAAAAAAAAAAAAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALY4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/AAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALY4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/7Y4cv+2OHL/tjhy/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2OHL/tjhy/7Y4cv+2OHL/tjhy/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/AAAAAM06yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/wAAAADNOsj/zTrI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP/NOsj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM06yP/NOsj/zTrI/806yP/NOsj/zTrI/806yP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA // @require https://code.jquery.com/jquery-4.0.0.min.js // @grant GM_addStyle // @grant GM_info // @license MIT // ==/UserScript== /* global $ */ /* global GM_info */ /* global GM_addStyle */ (() => { // src/plugins/planner/styles.css var styles_default = '\r\n#plannerPlusLottery,\r\n#plannerPlusStart {\r\n position: fixed;\r\n display: inline-flex;\r\n z-index: 9998;\r\n}\r\n\r\n#plannerPlusLottery .planner-plus-icon-wrap,\r\n#plannerPlusStart .planner-plus-icon-wrap {\r\n position: relative;\r\n display: inline-flex;\r\n}\r\n\r\n#plannerPlusLottery .planner-plus-tooltip,\r\n#plannerPlusStart .planner-plus-tooltip {\r\n position: absolute;\r\n right: calc(100% + 10px);\r\n top: 50%;\r\n z-index: 10001;\r\n width: max-content;\r\n max-width: calc(100vw - 24px);\r\n white-space: nowrap;\r\n padding: 9px 11px;\r\n border-radius: 4px;\r\n color: #fff;\r\n background: #172b4d;\r\n box-shadow: 0 4px 12px rgba(9, 30, 66, .25);\r\n font: 12px/1.4 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;\r\n text-align: left;\r\n pointer-events: none;\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translateY(-50%) translateX(4px);\r\n transition: opacity .15s ease, transform .15s ease, visibility .15s ease;\r\n}\r\n\r\n#plannerPlusLottery .planner-plus-icon-wrap:hover .planner-plus-tooltip,\r\n#plannerPlusStart .planner-plus-icon-wrap:hover .planner-plus-tooltip,\r\n#plannerPlusLottery .planner-plus-icon-wrap:focus-within .planner-plus-tooltip,\r\n#plannerPlusStart .planner-plus-icon-wrap:focus-within .planner-plus-tooltip {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: translateY(-50%) translateX(0);\r\n}\r\n#plannerPlusLottery .planner-plus-tooltip--right,\r\n#plannerPlusStart .planner-plus-tooltip--right {\r\n right: auto;\r\n left: calc(100% + 10px);\r\n top: 50%;\r\n bottom: auto;\r\n transform: translateY(-50%) translateX(-4px);\r\n}\r\n#plannerPlusLottery .planner-plus-tooltip--bottom,\r\n#plannerPlusStart .planner-plus-tooltip--bottom {\r\n right: 0;\r\n left: auto;\r\n top: calc(100% + 10px);\r\n bottom: auto;\r\n transform: translateY(-4px);\r\n}\r\n#plannerPlusLottery .planner-plus-tooltip--left,\r\n#plannerPlusStart .planner-plus-tooltip--left {\r\n right: calc(100% + 10px);\r\n left: auto;\r\n top: 50%;\r\n bottom: auto;\r\n transform: translateY(-50%) translateX(4px);\r\n}\r\n#plannerPlusLottery .planner-plus-tooltip--top,\r\n#plannerPlusStart .planner-plus-tooltip--top {\r\n right: 0;\r\n left: auto;\r\n top: auto;\r\n bottom: calc(100% + 10px);\r\n transform: translateY(4px);\r\n}\r\n#plannerPlusLottery .planner-plus-icon-wrap:hover .planner-plus-tooltip--right,\r\n#plannerPlusStart .planner-plus-icon-wrap:hover .planner-plus-tooltip--right,\r\n#plannerPlusLottery .planner-plus-icon-wrap:focus-within .planner-plus-tooltip--right,\r\n#plannerPlusStart .planner-plus-icon-wrap:focus-within .planner-plus-tooltip--right { transform: translateY(-50%) translateX(0); }\r\n#plannerPlusLottery .planner-plus-icon-wrap:hover .planner-plus-tooltip--bottom,\r\n#plannerPlusStart .planner-plus-icon-wrap:hover .planner-plus-tooltip--bottom,\r\n#plannerPlusLottery .planner-plus-icon-wrap:focus-within .planner-plus-tooltip--bottom,\r\n#plannerPlusStart .planner-plus-icon-wrap:focus-within .planner-plus-tooltip--bottom { transform: translateY(0); }\r\n#plannerPlusLottery .planner-plus-icon-wrap:hover .planner-plus-tooltip--left,\r\n#plannerPlusStart .planner-plus-icon-wrap:hover .planner-plus-tooltip--left,\r\n#plannerPlusLottery .planner-plus-icon-wrap:focus-within .planner-plus-tooltip--left,\r\n#plannerPlusStart .planner-plus-icon-wrap:focus-within .planner-plus-tooltip--left { transform: translateY(-50%) translateX(0); }\r\n#plannerPlusLottery .planner-plus-icon-wrap:hover .planner-plus-tooltip--top,\r\n#plannerPlusStart .planner-plus-icon-wrap:hover .planner-plus-tooltip--top,\r\n#plannerPlusLottery .planner-plus-icon-wrap:focus-within .planner-plus-tooltip--top,\r\n#plannerPlusStart .planner-plus-icon-wrap:focus-within .planner-plus-tooltip--top { transform: translateY(0); }\r\n\r\n#plannerPlusLottery {\r\n align-items: center;\r\n}\r\n\r\n#plannerPlusTimer {\r\n margin: 0 10px 0 0;\r\n font-size: 20pt;\r\n line-height: 1.25;\r\n height: auto;\r\n min-height: 1.5rem;\r\n background: transparent;\r\n}\r\n\r\n#plannerPlusLotteryImg,\r\n#plannerPlusStartImg {\r\n cursor: pointer;\r\n width: 48px;\r\n height: 48px;\r\n}\r\n\r\n#plannerPlusFirework {\r\n width: 100%;\r\n height: 100%;\r\n z-index: 9999;\r\n}\r\n\r\n#plannerPlusDialog.planner-plus-modal {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 10000;\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;\r\n color: #172b4d;\r\n box-sizing: border-box;\r\n}\r\n#plannerPlusDialog.planner-plus-modal.is-open {\r\n display: flex;\r\n}\r\n#plannerPlusDialog.planner-plus-modal *,\r\n#plannerPlusDialog.planner-plus-modal *::before,\r\n#plannerPlusDialog.planner-plus-modal *::after {\r\n box-sizing: border-box;\r\n}\r\n#plannerPlusDialog .planner-plus-modal__scrim {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(9, 30, 66, 0.28);\r\n}\r\n#plannerPlusDialog .planner-plus-modal__panel {\r\n align-self: center;\r\n position: relative;\r\n display: flex;\r\n flex: 0 1 auto;\r\n flex-direction: column;\r\n width: min(860px, calc(100vw - 36px));\r\n height: min(695px, calc(100dvh - 36px));\r\n max-height: calc(100dvh - 36px);\r\n overflow: hidden;\r\n border-radius: 9px;\r\n background: #fff;\r\n box-shadow: 0 18px 48px rgba(9, 30, 66, .22), 0 3px 12px rgba(9, 30, 66, .12);\r\n}\r\n#plannerPlusDialog .planner-plus-modal__header {\r\n display: flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 12px;\r\n padding: 18px 20px 16px;\r\n border-bottom: 1px solid #dfe1e6;\r\n}\r\n#plannerPlusDialog .planner-plus-modal__heading {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n}\r\n#plannerPlusDialog .planner-plus-modal__icon {\r\n width: 36px;\r\n height: 36px;\r\n flex: 0 0 36px;\r\n border-radius: 7px;\r\n}\r\n#plannerPlusDialog .planner-plus-modal__header strong,\r\n#plannerPlusDialog .planner-plus-modal__header small {\r\n display: block;\r\n}\r\n#plannerPlusDialog .planner-plus-modal__header strong { font-size: 16px; line-height: 1.2; }\r\n#plannerPlusDialog .planner-plus-modal__header small { margin-top: 4px; color: #5e6c84; font-size: 12px; }\r\n#plannerPlusDialog .planner-plus-modal__close {\r\n border: 0;\r\n border-radius: 5px;\r\n background: transparent;\r\n color: #6b778c;\r\n font-size: 22px;\r\n line-height: 30px;\r\n width: 30px;\r\n height: 30px;\r\n cursor: pointer;\r\n}\r\n#plannerPlusDialog .planner-plus-modal__close:hover { background: #ebecf0; color: #172b4d; }\r\n#plannerPlusDialog .planner-plus-modal__close:focus { outline: 0; }\r\n#plannerPlusDialog .planner-plus-modal__body {\r\n flex: 1 1 0;\r\n min-height: 0;\r\n max-height: none;\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n padding: 14px;\r\n scrollbar-color: var(--planner-plus-border, #dfe1e6) transparent;\r\n scrollbar-width: thin;\r\n}\r\n#plannerPlusDialog .planner-plus-modal__body::-webkit-scrollbar { width: 8px; }\r\n#plannerPlusDialog .planner-plus-modal__body::-webkit-scrollbar-thumb { background: var(--planner-plus-border, #dfe1e6); border-radius: 999px; }\r\n#plannerPlusDialog .planner-plus-modal__body::-webkit-scrollbar-track { background: transparent; }\r\n#plannerPlusDialog .planner-plus-modal__config-list { display: grid; gap: 8px; }\r\n#plannerPlusDialog .planner-plus-modal__config-section { color: var(--planner-plus-text, #172b4d); font-size: 12px; letter-spacing: .04em; margin: 4px 2px 0; text-transform: uppercase; }\r\n#plannerPlusDialog .planner-plus-modal__config-group { border: 1px solid var(--planner-plus-border, #dfe1e6); border-radius: 9px; overflow: hidden; }\r\n#plannerPlusDialog .planner-plus-modal__config-group[hidden] { display: none !important; }\r\n#plannerPlusDialog .planner-plus-modal__config-summary { align-items: center; background: var(--planner-plus-control, #f8fafc); color: var(--planner-plus-text, #172b4d); cursor: pointer; display: flex; font-size: 12px; font-weight: 700; justify-content: flex-start; letter-spacing: .04em; list-style: none; padding: 9px 36px 9px 12px; position: relative; text-transform: uppercase; }\r\n#plannerPlusDialog .planner-plus-modal__config-summary::-webkit-details-marker { display: none; }\r\n#plannerPlusDialog .planner-plus-modal__config-summary:hover { background: var(--planner-plus-hover, #f1f5f9); }\r\n#plannerPlusDialog .planner-plus-modal__config-chevron { align-items: center; color: var(--planner-plus-muted, #5e6c84); display: inline-flex; height: 18px; justify-content: center; position: absolute; right: 12px; top: 50%; transform: translateY(-50%); transition: transform .18s ease; width: 18px; }\r\n#plannerPlusDialog .planner-plus-modal__config-chevron img { display: block; height: 16px; width: 16px; }\r\n#plannerPlusDialog .planner-plus-modal__config-group[open] .planner-plus-modal__config-chevron { transform: translateY(-50%) rotate(180deg); }\r\n#plannerPlusDialog .planner-plus-modal__config-group-content { display: grid; gap: 8px; padding: 8px; }\r\n#plannerPlusDialog .planner-plus-modal__config-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(150px, 42%); align-items: center; gap: 14px; min-height: 60px; padding: 9px 12px; border: 1px solid var(--planner-plus-border, #dfe1e6); border-radius: 9px; background: var(--planner-plus-control, #f4f5f7); }\r\n.planner-plus-autofocus-hidden { display: none !important; }\r\n.planner-plus-highlight-row,\r\n.planner-plus-highlight-row > td { background-color: #e9d5ff !important; color: #5b21b6 !important; }\r\n.planner-plus-highlight-row-dark,\r\n.planner-plus-highlight-row-dark > td { background-color: #3b245c !important; color: #e9b8ff !important; }\r\n#plannerPlusDialog .planner-plus-modal__config-copy { min-width: 0; }\r\n#plannerPlusDialog .planner-plus-modal__config-title, #plannerPlusDialog .planner-plus-modal__config-description { display: block; }\r\n#plannerPlusDialog .planner-plus-modal__config-title { color: var(--planner-plus-text, #172b4d); font-size: 13px; font-weight: 650; }\r\n#plannerPlusDialog .planner-plus-modal__config-description { margin-top: 4px; color: var(--planner-plus-muted, #5e6c84); font-size: 11px; line-height: 1.35; }\r\n#plannerPlusDialog .planner-plus-modal__config-control { min-width: 0; }\r\n#plannerPlusDialog .planner-plus-modal__config-control input[type="number"], #plannerPlusDialog .planner-plus-modal__config-control select { width: 100%; height: 40px; border: 2px solid var(--planner-plus-border, #dfe1e6); border-radius: 7px; outline: 0; padding: 0 11px; color: var(--planner-plus-text, #172b4d); background: var(--planner-plus-surface, #fff); font: inherit; font-size: 13px; font-weight: 400; }\r\n#plannerPlusDialog .planner-plus-modal__config-control select { cursor: pointer; appearance: none; -webkit-appearance: none; padding-right: 38px; }\r\n#plannerPlusDialog .planner-plus-modal__select-control { position: relative; }\r\n#plannerPlusDialog .planner-plus-modal__select-control::after { content: ""; position: absolute; top: 14px; right: 14px; width: 8px; height: 8px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; color: var(--planner-plus-muted, #5e6c84); pointer-events: none; transform: rotate(45deg); }\r\n#plannerPlusDialog .planner-plus-modal__config-control input:focus, #plannerPlusDialog .planner-plus-modal__config-control select:focus { border-color: var(--planner-plus-accent, #0c66e4); box-shadow: 0 0 0 2px rgba(12, 102, 228, .2); }\r\n#plannerPlusDialog .planner-plus-modal__config-control input[type="number"]::-webkit-inner-spin-button,\r\n#plannerPlusDialog .planner-plus-modal__config-control input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\r\n#plannerPlusDialog .planner-plus-modal__config-control input[type="number"] { -moz-appearance: textfield; }\r\n#plannerPlusDialog .planner-plus-modal__number-control { position: relative; }\r\n#plannerPlusDialog .planner-plus-modal__number-control input { padding-right: 42px; }\r\n#plannerPlusDialog .planner-plus-modal__number-control em { position: absolute; top: 10px; right: 11px; color: var(--planner-plus-muted, #5e6c84); font-size: 12px; font-style: normal; }\r\n#plannerPlusDialog .planner-plus-modal__toggle-control { align-items: center; cursor: pointer; display: inline-flex; justify-content: flex-end; position: relative; }\r\n#plannerPlusDialog .planner-plus-modal__toggle-control input { cursor: pointer; height: 24px; inset: 0; margin: 0; opacity: 0; position: absolute; width: 42px; z-index: 1; }\r\n#plannerPlusDialog .planner-plus-modal__switch { background: var(--planner-plus-muted, #8993a4); border-radius: 999px; cursor: pointer; height: 24px; pointer-events: none; position: relative; width: 42px; }\r\n#plannerPlusDialog .planner-plus-modal__toggle-control input:focus-visible + .planner-plus-modal__switch { outline: 2px solid var(--planner-plus-accent, #0c66e4); outline-offset: 2px; }\r\n#plannerPlusDialog .planner-plus-modal__switch::after { content: ""; position: absolute; top: 3px; left: 3px; width: 18px; height: 18px; border-radius: 50%; background: #fff; transition: transform .15s ease; }\r\n#plannerPlusDialog .planner-plus-modal__toggle-control input:checked + .planner-plus-modal__switch { background: var(--planner-plus-accent, #0c66e4); }\r\n#plannerPlusDialog .planner-plus-modal__toggle-control input:checked + .planner-plus-modal__switch::after { transform: translateX(18px); }\r\n\r\n[data-testid="task-board-root"].planner-plus-preview-host { position: relative; }\r\n#plannerPlusActivityPreview.planner-plus-preview {\r\n position: absolute;\r\n animation: planner-plus-preview-fade-in .22s ease-out both;\r\n inset: 0;\r\n z-index: 10002;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 24px;\r\n color: #172b4d;\r\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;\r\n}\r\n#plannerPlusActivityPreview.planner-plus-preview.is-closing {\r\n animation: planner-plus-preview-fade-out .22s ease-in forwards;\r\n pointer-events: none;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview__backdrop {\r\n position: absolute;\r\n inset: 0;\r\n background: transparent;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview__panel {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n width: min(900px, 100%);\r\n max-height: calc(100% - 48px);\r\n overflow: hidden;\r\n border-radius: 10px;\r\n background: #fff;\r\n box-shadow: 0 20px 70px rgba(0, 0, 0, .5);\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview__header,\r\n#plannerPlusActivityPreview .planner-plus-preview__footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 16px;\r\n padding: 16px 22px;\r\n border-bottom: 1px solid #dfe1e6;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview__header h2 { margin: 0; font-size: 22px; }\r\n#plannerPlusActivityPreview .planner-plus-preview__summary { color: #5e6c84; font-size: 15px; font-weight: 500; }\r\n#plannerPlusActivityPreview .planner-plus-preview__summary.is-over-threshold { color: #ef6a6a; }\r\n#plannerPlusActivityPreview .planner-plus-preview__header { display: grid; grid-template-columns: minmax(0, 1fr) 30px; }\r\n#plannerPlusActivityPreview .planner-plus-preview__header-spacer { display: none; }\r\n#plannerPlusActivityPreview .planner-plus-preview__heading { align-items: center; display: flex; flex: 1; gap: 10px; grid-column: 1; justify-content: flex-start; min-width: 0; text-align: left; }\r\n#plannerPlusActivityPreview .planner-plus-preview__avatar { align-items: center; background: #dfe1e6; border-radius: 50%; color: #172b4d; display: inline-flex; flex: 0 0 36px; font-size: 12px; font-weight: 700; height: 36px; justify-content: center; overflow: hidden; width: 36px; }\r\n#plannerPlusActivityPreview .planner-plus-preview__avatar img { height: 100%; object-fit: cover; width: 100%; }\r\n#plannerPlusActivityPreview .planner-plus-preview__heading h2 { min-width: 0; text-align: left; }\r\n#plannerPlusActivityPreview .planner-plus-preview__close { grid-column: 2; grid-row: 1; }\r\n#plannerPlusActivityPreview .planner-plus-preview__divider { margin: 8px 0 0; border: 0; border-top: 1px solid #dfe1e6; }\r\n#plannerPlusActivityPreview .planner-plus-preview__meta { display: flex; gap: 12px; margin-top: 6px; color: #5e6c84; font-size: 13px; }\r\n#plannerPlusActivityPreview .planner-plus-preview__task-title { margin-top: 8px; overflow: hidden; color: #172b4d; font-size: 16px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; }\r\n#plannerPlusActivityPreview .planner-plus-preview__close {\r\n border: 0; background: transparent; color: #42526e; cursor: pointer; font-size: 30px; line-height: 1;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview__content {\r\n min-height: 180px;\r\n overflow: auto;\r\n padding: 24px;\r\n font-size: 16px;\r\n line-height: 1.5;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview-task-content {\r\n font-size: 14px !important;\r\n line-height: 1.5 !important;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview-task-content\r\n :where(p, li, span, a, [role="text"], [data-testid="task-card-title"]) {\r\n font-size: 14px !important;\r\n line-height: 1.5 !important;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview__footer {\r\n justify-content: center;\r\n border-top: 1px solid #dfe1e6;\r\n border-bottom: 0;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview__content,\r\n#plannerPlusActivityPreview .planner-plus-preview__content * { color: #172b4d !important; }\r\n#plannerPlusActivityPreview .planner-plus-preview__content { background: #fff; }\r\n#plannerPlusActivityPreview .planner-plus-preview__content a { color: #0c66e4 !important; }\r\n#plannerPlusActivityPreview .planner-plus-preview__count { min-width: 70px; text-align: center; font-weight: 700; }\r\n#plannerPlusActivityPreview .planner-plus-preview__footer {\r\n display: grid;\r\n grid-template-columns: minmax(0, 1fr) auto minmax(70px, auto) auto minmax(0, 1fr);\r\n justify-content: stretch;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview__adjacent { overflow: hidden; color: #5e6c84; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }\r\n#plannerPlusActivityPreview .planner-plus-preview__previous-name { text-align: right; }\r\n#plannerPlusActivityPreview .planner-plus-preview__next-name { text-align: left; }\r\n#plannerPlusActivityPreview .planner-plus-preview__button {\r\n min-height: 40px; padding: 0 18px; border: 0; border-radius: 5px; color: #fff; background: #0c66e4; cursor: pointer; font: inherit; font-weight: 600;\r\n}\r\n#plannerPlusActivityPreview .planner-plus-preview__button:hover { background: #0747a6; }\r\n#plannerPlusActivityPreview .planner-plus-preview__button:disabled { cursor: not-allowed; opacity: .45; }\r\n\r\n#plannerPlusActivityPreview .planner-plus-preview__content-grid { display: grid; grid-template-columns: 28px minmax(0, 1fr) 28px; min-height: 330px; }\r\n#plannerPlusActivityPreview .planner-plus-preview__content-column { display: flex; flex: 1; flex-direction: column; min-height: 330px; min-width: 0; }\r\n#plannerPlusActivityPreview .planner-plus-preview__content { flex: 1; min-height: 0; overflow-x: hidden; overflow-y: auto; scrollbar-gutter: stable; }\r\n#plannerPlusActivityPreview .planner-plus-preview__content:focus { outline: none; }\r\n#plannerPlusActivityPreview .planner-plus-preview__task-footer { align-items: center; background: #f7f9fb; border-top: 1px solid #dfe1e6; display: grid; gap: 10px; grid-template-columns: minmax(0, 1fr) auto auto; min-height: 52px; padding: 8px 14px; }\r\n#plannerPlusActivityPreview .planner-plus-preview__checklist-count { color: #5e6c84; font-size: 13px; font-weight: 650; justify-self: start; white-space: nowrap; }\r\n#plannerPlusActivityPreview .planner-plus-preview__checklist-warning { color: #de350b; font-size: 12px; font-weight: 650; justify-self: end; text-align: right; white-space: nowrap; }\r\n#plannerPlusActivityPreview .planner-plus-preview__open-card { border: 0; border-radius: 6px; color: #fff; background: #0c66e4; cursor: pointer; font: inherit; font-size: 12px; font-weight: 650; justify-self: end; min-height: 34px; padding: 0 12px; white-space: nowrap; }\r\n#plannerPlusActivityPreview .planner-plus-preview__open-card:hover { background: #0747a6; }\r\n#plannerPlusActivityPreview .planner-plus-preview__open-card.is-overflow { animation: planner-plus-open-card-pulse 1.4s ease-in-out infinite; box-shadow: 0 0 0 0 rgba(222, 53, 11, .55); background: #de350b; }\r\n@keyframes planner-plus-open-card-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(222, 53, 11, .55); } 50% { box-shadow: 0 0 0 7px rgba(222, 53, 11, 0); } }\r\n#plannerPlusActivityPreview .planner-plus-preview__nav-zone { display: flex; align-items: center; justify-content: center; border: 0; background: #fafbfc; color: #5e6c84; cursor: pointer; padding: 0; user-select: none; -webkit-user-select: none; }\r\n#plannerPlusActivityPreview .planner-plus-preview__nav-zone:hover:not(:disabled) { background: #f0f7ff; color: #0c66e4; }\r\n#plannerPlusActivityPreview .planner-plus-preview__nav-zone:disabled { cursor: not-allowed; opacity: .38; }\r\n#plannerPlusActivityPreview .planner-plus-preview__arrow { width: 24px; height: 34px; display: grid; place-items: center; border-radius: 4px; font-size: 27px; line-height: 1; user-select: none; -webkit-user-select: none; }\r\n@keyframes planner-plus-preview-fade-in {\r\n from { opacity: 0; transform: translateY(8px) scale(.985); }\r\n to { opacity: 1; transform: translateY(0) scale(1); }\r\n}\r\n@keyframes planner-plus-preview-fade-out {\r\n from { opacity: 1; transform: translateY(0) scale(1); }\r\n to { opacity: 0; transform: translateY(4px) scale(.99); }\r\n}\r\n@media (prefers-reduced-motion: reduce) {\r\n #plannerPlusActivityPreview.planner-plus-preview,\r\n #plannerPlusActivityPreview.planner-plus-preview.is-closing {\r\n animation: none;\r\n }\r\n}\r\n\r\n.planner-plus-animate {\r\n -webkit-animation: spin 1s linear infinite;\r\n -moz-animation: spin 1s linear infinite;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@-moz-keyframes spin {\r\n 100% {\r\n -moz-transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@-webkit-keyframes spin {\r\n 100% {\r\n -webkit-transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@keyframes spin {\r\n 100% {\r\n -webkit-transform: rotate(360deg);\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n/* Planner Plus theme is scoped to injected UI roots. */\r\n#plannerPlusStart[data-planner-plus-theme],\r\n#plannerPlusLottery[data-planner-plus-theme],\r\n#plannerPlusDialog[data-planner-plus-theme],\r\n#plannerPlusActivityPreview[data-planner-plus-theme] {\r\n --planner-plus-bg: #fff;\r\n --planner-plus-surface: #fff;\r\n --planner-plus-text: #172b4d;\r\n --planner-plus-muted: #5e6c84;\r\n --planner-plus-border: #dfe1e6;\r\n --planner-plus-hover: #ebecf0;\r\n --planner-plus-control: #f4f5f7;\r\n --planner-plus-input: #fff;\r\n --planner-plus-accent: #0c66e4;\r\n --planner-plus-accent-hover: #0747a6;\r\n --planner-plus-tooltip: #172b4d;\r\n --planner-plus-tooltip-text: #fff;\r\n}\r\n#plannerPlusDialog[data-planner-plus-theme="dark"] .planner-plus-modal__config-chevron img, #plannerPlusDialog[data-planner-plus-theme="dark"] .planner-plus-voice-chevron img { filter: brightness(0) invert(1); }\r\n#plannerPlusStart[data-planner-plus-theme="dark"],\r\n#plannerPlusLottery[data-planner-plus-theme="dark"],\r\n#plannerPlusDialog[data-planner-plus-theme="dark"],\r\n#plannerPlusActivityPreview[data-planner-plus-theme="dark"] {\r\n --planner-plus-bg: #101214;\r\n --planner-plus-surface: #1d2125;\r\n --planner-plus-text: #e6edf3;\r\n --planner-plus-muted: #a8b3c2;\r\n --planner-plus-border: #3b434d;\r\n --planner-plus-control: #252b33;\r\n --planner-plus-hover: #30363d;\r\n --planner-plus-input: #1d2125;\r\n --planner-plus-accent: #579dff;\r\n --planner-plus-accent-hover: #579dff;\r\n --planner-plus-tooltip: #e6edf3;\r\n --planner-plus-tooltip-text: #1d2125;\r\n}\r\n#plannerPlusStart[data-planner-plus-theme] .planner-plus-tooltip,\r\n#plannerPlusLottery[data-planner-plus-theme] .planner-plus-tooltip { color: var(--planner-plus-tooltip-text); background: var(--planner-plus-tooltip); }\r\n#plannerPlusLottery[data-planner-plus-theme] #plannerPlusTimer { color: var(--planner-plus-text); background: transparent; }\r\n#plannerPlusLottery[data-planner-plus-theme] #plannerPlusTimer.is-over-threshold { color: #ef6a6a; }\r\n#plannerPlusDialog[data-planner-plus-theme], #plannerPlusActivityPreview[data-planner-plus-theme] { color: var(--planner-plus-text); }\r\n#plannerPlusDialog[data-planner-plus-theme] .planner-plus-modal__panel,\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__panel { background: var(--planner-plus-surface); color: var(--planner-plus-text); }\r\n#plannerPlusDialog[data-planner-plus-theme] .planner-plus-modal__header,\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__header,\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__footer { border-color: var(--planner-plus-border); }\r\n#plannerPlusDialog[data-planner-plus-theme] .planner-plus-modal__header small,\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__summary,\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__meta { color: var(--planner-plus-muted); }\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__summary.is-over-threshold { color: #ef6a6a; }\r\n#plannerPlusDialog[data-planner-plus-theme] input,\r\n#plannerPlusDialog[data-planner-plus-theme] select { border-color: var(--planner-plus-border); color: var(--planner-plus-text); background: var(--planner-plus-input); }\r\n#plannerPlusDialog[data-planner-plus-theme] .planner-plus-modal__close:hover,\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__button { background: var(--planner-plus-accent); }\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__content,\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__content * { color: var(--planner-plus-text) !important; background-color: var(--planner-plus-surface); }\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__content a { color: var(--planner-plus-accent) !important; }\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__task-footer { background: var(--planner-plus-control); border-color: var(--planner-plus-border); }\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__checklist-count { color: var(--planner-plus-muted); }\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__open-card { background: var(--planner-plus-accent); }\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__open-card:hover { background: var(--planner-plus-accent-hover); }\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__nav-zone { color: var(--planner-plus-muted); background: var(--planner-plus-bg); }\r\n#plannerPlusActivityPreview[data-planner-plus-theme] .planner-plus-preview__nav-zone:hover:not(:disabled) { color: var(--planner-plus-accent); background: var(--planner-plus-hover); }\r\n\r\n/* Planner Plus voice configuration \u2014 visual parity with the approved ADO Plus demo. */\r\n#plannerPlusDialog .planner-plus-voice-config { border: 1px solid var(--planner-plus-border, #dfe1e6); border-radius: 10px; overflow: hidden; }\r\n#plannerPlusDialog .planner-plus-voice-summary { align-items: center; background: var(--planner-plus-control, #f8fafc); cursor: pointer; display: flex; justify-content: space-between; list-style: none; min-height: 60px; padding: 9px 12px; }\r\n#plannerPlusDialog .planner-plus-voice-summary::-webkit-details-marker { display: none; }\r\n#plannerPlusDialog .planner-plus-voice-summary > div:first-child { flex: 1 1 0; min-width: 0; }\r\n#plannerPlusDialog .planner-plus-voice-title, #plannerPlusDialog .planner-plus-voice-description { display: block; }\r\n#plannerPlusDialog .planner-plus-voice-title { color: var(--planner-plus-text, #172b4d); font-size: 13px; font-weight: 650; }\r\n#plannerPlusDialog .planner-plus-voice-description { color: var(--planner-plus-muted, #5e6c84); font-size: 11px; line-height: 1.35; margin-top: 4px; }\r\n#plannerPlusDialog .planner-plus-voice-summary-right { align-items: flex-end; display: flex; flex: 0 1 420px; flex-direction: column; min-width: 280px; }\r\n#plannerPlusDialog .planner-plus-voice-summary-right strong { font-size: 13px; font-weight: 650; line-height: 1.35;\r\n max-width: 400px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n#plannerPlusDialog .planner-plus-voice-summary-right small, #plannerPlusDialog .planner-plus-voice-help { color: var(--planner-plus-muted, #5e6c84); font-size: 11px; }\r\n#plannerPlusDialog .planner-plus-voice-chevron { align-items: center; display: inline-flex; height: 18px; justify-content: center; transition: transform .18s ease; width: 18px; }\r\n#plannerPlusDialog .planner-plus-voice-chevron img { display: block; height: 16px; width: 16px; }\r\n#plannerPlusDialog .planner-plus-voice-config[open] .planner-plus-voice-chevron { transform: rotate(180deg); }\r\n#plannerPlusDialog .planner-plus-voice-content { border-top: 1px solid var(--planner-plus-border, #dfe1e6); padding: 14px 14px 0; }\r\n#plannerPlusDialog .planner-plus-voice-help { margin: 0 0 10px; }\r\n#plannerPlusDialog .planner-plus-voice-table-wrap { border: 1px solid var(--planner-plus-border, #dfe1e6); border-radius: 7px; height: 282px; overflow: auto; }\r\n#plannerPlusDialog .planner-plus-voice-table { border-collapse: collapse; table-layout: fixed; width: 100%; }\r\n#plannerPlusDialog .planner-plus-voice-table th { background: var(--planner-plus-control, #f4f5f7); background-clip: padding-box; border-inline: 0; box-shadow: none; box-sizing: border-box; color: var(--planner-plus-text, #172b4d); font-size: 12px; line-height: 1.35; padding: 8px; position: sticky; text-align: left; top: 0; vertical-align: middle; white-space: nowrap; z-index: 1; }\r\n#plannerPlusDialog .planner-plus-voice-table td { border-inline: 0; border-top: 1px solid var(--planner-plus-border, #dfe1e6); box-shadow: none; box-sizing: border-box; color: var(--planner-plus-text, #172b4d); font-size: 13px; height: 46px; line-height: 1.35; min-width: 0; padding: 7px 8px; }\r\n#plannerPlusDialog .planner-plus-voice-table thead th > span, #plannerPlusDialog .planner-plus-voice-table thead th > .planner-plus-voice-filter { vertical-align: middle; }\r\n#plannerPlusDialog .planner-plus-voice-table th:nth-child(1), #plannerPlusDialog .planner-plus-voice-table td:nth-child(1) { width: 42px; }\r\n#plannerPlusDialog .planner-plus-voice-table th:nth-child(2), #plannerPlusDialog .planner-plus-voice-table td:nth-child(2) { width: 72px; }\r\n#plannerPlusDialog .planner-plus-voice-table th:nth-child(4), #plannerPlusDialog .planner-plus-voice-table td:nth-child(4) { width: 145px; }\r\n#plannerPlusDialog .planner-plus-voice-table th:nth-child(5), #plannerPlusDialog .planner-plus-voice-table td:nth-child(5) { width: 120px; }\r\n#plannerPlusDialog .planner-plus-voice-check, #plannerPlusDialog .planner-plus-voice-preview { text-align: center; }\r\n#plannerPlusDialog .planner-plus-voice-preview button { background: transparent; border: 0; border-radius: 6px; color: var(--planner-plus-accent, #0c66e4); cursor: pointer; }\r\n#plannerPlusDialog .planner-plus-voice-preview button:hover { background: var(--planner-plus-hover, #ebecf0); }\r\n#plannerPlusDialog .planner-plus-voice-name-host { display: block; min-width: 0; position: relative; }\r\n#plannerPlusDialog .planner-plus-voice-name { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n#plannerPlusDialog .planner-plus-voice-name-host .planner-plus-voice-tooltip { background: var(--planner-plus-text, #172b4d); border-radius: 5px; box-shadow: 0 4px 12px rgba(9,30,66,.25); color: var(--planner-plus-surface, #fff); font-size: 12px; left: 0; line-height: 1.55; max-width: min(420px, calc(100vw - 48px)); opacity: 0; padding: 8px 10px; pointer-events: none; position: absolute; top: calc(100% + 8px); transform: translateY(-4px); transition: opacity .15s ease, transform .15s ease, visibility .15s ease; visibility: hidden; white-space: normal; word-break: break-word; z-index: 10004; }\r\n#plannerPlusDialog .planner-plus-voice-name-host:hover .planner-plus-voice-tooltip, #plannerPlusDialog .planner-plus-voice-name-host:focus-within .planner-plus-voice-tooltip { opacity: 1; transform: translateY(0); visibility: visible; }\r\n#plannerPlusDialog .planner-plus-voice-badge { border-radius: 999px; display: inline-block; font-size: 11px; font-weight: 650; padding: 3px 7px; }\r\n#plannerPlusDialog .planner-plus-voice-badge.local { background: #dff6e9; color: #075b38; }\r\n#plannerPlusDialog .planner-plus-voice-badge.remote { background: #eee8ff; color: #5d4698; }\r\n#plannerPlusDialog .planner-plus-voice-table tr.is-checked { background: color-mix(in srgb, var(--planner-plus-accent, #0c66e4) 10%, transparent); }\r\n#plannerPlusDialog .planner-plus-voice-empty { color: var(--planner-plus-muted, #5e6c84); padding: 18px; text-align: center; }\r\n#plannerPlusDialog .planner-plus-voice-stats { align-items: center; color: var(--planner-plus-muted, #5e6c84); display: flex; flex-wrap: wrap; font-size: 11px; gap: 6px 12px; margin-top: 9px; }\r\n#plannerPlusDialog .planner-plus-voice-stats strong { color: var(--planner-plus-text, #172b4d); }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls { align-items: center; display: grid; gap: 14px 16px; grid-template-columns: minmax(0, 1fr) 200px; margin-top: 16px; }\r\n#plannerPlusDialog .planner-plus-voice-preview-text { align-items: stretch; display: grid; gap: 7px; grid-column: 1; grid-row: 1; }\r\n#plannerPlusDialog .filter-label { color: var(--planner-plus-text, #172b4d); font-size: 12px; font-weight: 650; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls input.control { background: var(--planner-plus-surface, #fff); border: 1px solid var(--planner-plus-border, #dfe1e6); border-radius: 7px; color: var(--planner-plus-text, #172b4d); font: inherit; height: 40px; padding: 0 11px; width: 100%; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .preview-button { align-self: end; background: var(--planner-plus-accent, #0c66e4); border: 0; border-radius: 7px; color: #fff; cursor: pointer; font: inherit; font-weight: 650; grid-column: 2; grid-row: 1; height: 40px; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .custom-preview-text, #plannerPlusDialog .planner-plus-voice-preview-controls .remote-startup-fix { align-items: flex-start; background: color-mix(in srgb, var(--planner-plus-accent, #0c66e4) 5%, var(--planner-plus-surface, #fff)); border: 1px solid color-mix(in srgb, var(--planner-plus-accent, #0c66e4) 18%, var(--planner-plus-border, #dfe1e6)); border-radius: 8px; display: flex; gap: 10px; min-height: 66px; padding: 10px 12px; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .custom-preview-text { grid-column: 1 / -1; grid-row: 2; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .remote-startup-fix { grid-column: 1 / -1; grid-row: 3; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .custom-preview-text input, #plannerPlusDialog .planner-plus-voice-preview-controls .remote-startup-fix input { flex: 0 0 auto; height: 18px; margin: 1px 0 0; width: 18px; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .custom-preview-text span, #plannerPlusDialog .planner-plus-voice-preview-controls .remote-startup-fix span { display: grid; gap: 4px; min-width: 0; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .custom-preview-text strong, #plannerPlusDialog .planner-plus-voice-preview-controls .remote-startup-fix strong { font-size: 12px; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .custom-preview-text small, #plannerPlusDialog .planner-plus-voice-preview-controls .remote-startup-fix small { color: var(--planner-plus-muted, #5e6c84); font-size: 11px; line-height: 1.4; }#plannerPlusDialog .planner-plus-voice-summary-right small { font-size: 11px; font-weight: 400; line-height: 1.35; }\r\n#plannerPlusDialog .planner-plus-voice-filter { background: transparent; border: 0; border-radius: 6px; color: var(--planner-plus-accent, #0c66e4); cursor: pointer; font-size: 16px; line-height: 1; margin-left: 5px; padding: 3px 5px; vertical-align: middle; }\r\n#plannerPlusDialog .planner-plus-voice-filter:hover { background: var(--planner-plus-hover, #ebecf0); }\r\n#plannerPlusVoiceFilterPopover { background: var(--planner-plus-surface, #fff); border: 1px solid var(--planner-plus-border, #dfe1e6); border-radius: 8px; box-shadow: 0 8px 24px rgba(9,30,66,.22); color: var(--planner-plus-text, #172b4d); max-height: min(440px, calc(100vh - 24px)); overflow: auto; padding: 12px; position: fixed; width: 280px; z-index: 10010; }\r\n#plannerPlusVoiceFilterPopover[hidden] { display: none; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-voice-filter-heading { align-items: center; display: flex; justify-content: space-between; margin-bottom: 10px; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-voice-filter-heading button { background: transparent; border: 0; color: var(--planner-plus-accent, #0c66e4); cursor: pointer; }\r\n#plannerPlusVoiceFilterPopover label { color: var(--planner-plus-text, #172b4d); display: grid; font-size: 12px; gap: 6px; margin: 8px 0; }\r\n#plannerPlusVoiceFilterPopover input[type=search], #plannerPlusVoiceFilterPopover select { appearance: auto; background: var(--planner-plus-surface, #fff); border: 2px solid var(--planner-plus-border, #dfe1e6); border-radius: 8px; box-sizing: border-box; color: var(--planner-plus-text, #172b4d); font: inherit; min-height: 42px; padding: 0 11px; width: 100%; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-language-all { align-items: center; display: flex; gap: 7px; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-language-list { border-top: 1px solid var(--planner-plus-border, #dfe1e6); margin-top: 8px; max-height: 260px; overflow: auto; padding-top: 6px; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-language-list label { align-items: center; display: flex; gap: 7px; }#plannerPlusDialog .planner-plus-voice-stats button { background: var(--planner-plus-accent, #0c66e4); border: 0; border-radius: 5px; color: #fff; cursor: pointer; font-family: inherit; font-size: 11px; font-weight: 650; padding: 5px 9px; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls input.control:disabled { background: color-mix(in srgb, var(--planner-plus-muted, #5e6c84) 12%, var(--planner-plus-surface, #fff)); border-color: color-mix(in srgb, var(--planner-plus-border, #dfe1e6) 72%, var(--planner-plus-muted, #5e6c84)); color: var(--planner-plus-muted, #5e6c84); cursor: not-allowed; opacity: .72; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls input.control { transition: background-color .15s ease, border-color .15s ease, color .15s ease, opacity .15s ease; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .custom-preview-text strong { font-size: 13px; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .custom-preview-text small { line-height: 1.45; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls .preview-result { color: var(--planner-plus-muted, #5e6c84); font-size: 11px; grid-column: 1 / -1; grid-row: 4; line-height: 1.45; margin: -4px 0 0; }\r\n#plannerPlusDialog .planner-plus-voice-manager[hidden] { display: none; }\r\n#plannerPlusDialog .planner-plus-voice-manager { inset: 0; position: fixed; z-index: 10020; }\r\n#plannerPlusDialog .planner-plus-voice-manager-backdrop { background: rgba(9,30,66,.45); inset: 0; position: absolute; }\r\n#plannerPlusDialog .planner-plus-voice-manager section { background: var(--planner-plus-surface, #fff); border-radius: 9px; box-shadow: 0 18px 48px rgba(9,30,66,.3); left: 50%; max-height: min(640px, calc(100vh - 40px)); overflow: auto; padding: 16px; position: absolute; top: 50%; transform: translate(-50%, -50%); width: min(760px, calc(100vw - 36px)); }\r\n#plannerPlusDialog .planner-plus-voice-manager header { align-items: center; display: flex; justify-content: space-between; }\r\n#plannerPlusDialog .planner-plus-voice-manager header small { color: var(--planner-plus-muted, #5e6c84); display: block; font-size: 11px; }\r\n#plannerPlusDialog .planner-plus-voice-manager header button { background: transparent; border: 0; color: var(--planner-plus-text, #172b4d); cursor: pointer; font-size: 24px; }\r\n#plannerPlusDialog .planner-plus-voice-manager-actions { margin: 12px 0; }\r\n#plannerPlusDialog .planner-plus-voice-manager p { color: var(--planner-plus-muted, #5e6c84); font-size: 11px; }\r\n#plannerPlusDialog .planner-plus-voice-manager tr.is-unchecked { opacity: .65; }#plannerPlusDialog .planner-plus-voice-filter { align-items: center; display: inline-flex; height: 24px; justify-content: center; margin-left: 6px; padding: 0; vertical-align: middle; width: 24px; }\r\n#plannerPlusDialog .planner-plus-voice-filter svg { display: block; height: 15px; pointer-events: none; width: 15px; }\r\n#plannerPlusVoiceFilterPopover { max-height: min(540px, calc(100vh - 16px)); max-width: calc(100vw - 16px); width: 300px; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-voice-filter-field { display: grid; gap: 6px; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-voice-filter-field > span { color: var(--planner-plus-text, #172b4d); font-size: 12px; font-weight: 650; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-voice-filter-stats { color: var(--planner-plus-muted, #5e6c84); font-size: 12px; margin: 0 0 10px; }\r\n#plannerPlusVoiceFilterPopover input[type="checkbox"] { accent-color: var(--planner-plus-accent, #0c66e4); }\r\n#plannerPlusVoiceFilterPopover .planner-plus-voice-filter-check { align-items: center; display: flex; gap: 10px; font-size: 13px; min-height: 30px; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-voice-language-group label, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-list label { align-items: center; display: flex; font-size: 13px; gap: 10px; min-height: 30px; }\r\n#plannerPlusVoiceFilterPopover h4 { color: var(--planner-plus-text, #172b4d); font-size: 13px; font-weight: 700; margin: 14px 0 6px; }\r\n#plannerPlusVoiceFilterPopover, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-group, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-list { scrollbar-color: color-mix(in srgb, var(--planner-plus-muted, #5e6c84) 72%, transparent) transparent; scrollbar-width: thin; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-voice-language-group, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-list { display: grid; gap: 2px; max-height: 150px; overflow-y: scroll; }\r\n#plannerPlusVoiceFilterPopover .planner-plus-voice-language-list { border-top: 1px solid var(--planner-plus-border, #dfe1e6); max-height: 180px; padding-top: 5px; }\r\n#plannerPlusVoiceFilterPopover::-webkit-scrollbar, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-group::-webkit-scrollbar, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-list::-webkit-scrollbar { height: 8px; width: 8px; }\r\n#plannerPlusVoiceFilterPopover::-webkit-scrollbar-track, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-group::-webkit-scrollbar-track, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-list::-webkit-scrollbar-track { background: transparent; }\r\n#plannerPlusVoiceFilterPopover::-webkit-scrollbar-thumb, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-group::-webkit-scrollbar-thumb, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-list::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--planner-plus-muted, #5e6c84) 72%, transparent); border: 2px solid transparent; border-radius: 999px; background-clip: padding-box; }\r\n#plannerPlusVoiceFilterPopover::-webkit-scrollbar-thumb:hover, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-group::-webkit-scrollbar-thumb:hover, #plannerPlusVoiceFilterPopover .planner-plus-voice-language-list::-webkit-scrollbar-thumb:hover { background-color: color-mix(in srgb, var(--planner-plus-accent, #0c66e4) 65%, transparent); }\r\n#plannerPlusVoiceFilterPopover [data-planner-voice-language-row] { align-items: center; display: grid; gap: 7px; grid-template-columns: auto minmax(0, 1fr) auto; margin: 0; min-height: 30px; }\r\n#plannerPlusVoiceFilterPopover [data-planner-voice-common] { align-items: center; background: transparent; border: 0; color: var(--planner-plus-accent, #0c66e4); cursor: pointer; display: inline-flex; font-family: "Segoe UI Symbol", "Segoe UI", sans-serif; font-size: 21px; font-weight: 400; height: 27px; justify-content: center; justify-self: end; line-height: 1; margin-left: auto; padding: 0; width: 27px; }\r\n#plannerPlusDialog .voice-playback-rule-row { align-items: center; background: color-mix(in srgb, var(--planner-plus-accent, #0c66e4) 5%, var(--planner-plus-surface, #fff)); border: 1px solid color-mix(in srgb, var(--planner-plus-accent, #0c66e4) 18%, var(--planner-plus-border, #dfe1e6)); border-radius: 8px; box-sizing: border-box; display: grid; gap: 12px; grid-column: 1 / -1; grid-template-columns: minmax(0, 1fr) 200px; margin: 0; min-height: 66px; padding: 10px 12px; }\r\n#plannerPlusDialog .planner-plus-voice-preview-controls { margin-bottom: 0; }\r\n#plannerPlusDialog .voice-playback-rule-row .planner-plus-modal__config-title { color: var(--planner-plus-text, #172b4d); display: block; font-size: 13px; font-weight: 650; }\r\n#plannerPlusDialog .voice-playback-rule-row .planner-plus-modal__config-description { color: var(--planner-plus-muted, #5e6c84); display: block; font-size: 11px; line-height: 1.45; margin-top: 4px; }\r\n#plannerPlusDialog .voice-playback-rule-row select { background: var(--planner-plus-surface, #fff); border: 1px solid var(--planner-plus-border, #dfe1e6); border-radius: 7px; box-sizing: border-box; color: var(--planner-plus-text, #172b4d); font: inherit; min-height: 40px; padding: 0 10px; width: 100%; }\r\n@media (max-width: 700px) { #plannerPlusDialog .voice-playback-rule-row { grid-template-columns: minmax(0, 1fr); } }\r\n#plannerPlusDialog .voice-manager-notice { background: color-mix(in srgb, var(--planner-plus-accent, #0c66e4) 10%, var(--planner-plus-surface, #fff)); border: 1px solid color-mix(in srgb, var(--planner-plus-accent, #0c66e4) 28%, var(--planner-plus-border, #dfe1e6)); border-radius: 7px; color: var(--planner-plus-text, #172b4d); font-size: 11px; line-height: 1.45; margin: 8px 14px 0; padding: 8px 10px; }\r\n\r\n.planner-plus-toast { bottom: 24px; max-width: min(430px, calc(100vw - 48px)); min-width: 0; opacity: 0; pointer-events: none; position: fixed; right: 24px; transform: translateY(14px); transition: opacity .2s ease, transform .2s ease; visibility: hidden; width: min(430px, calc(100vw - 48px)); z-index: 10002; }\r\n.planner-plus-toast[hidden] { display: none; }\r\n.planner-plus-toast.is-visible { opacity: 1; pointer-events: auto; transform: translateY(0); visibility: visible; }\r\n.planner-plus-toast-stack { display: flex; flex-direction: column; gap: 10px; max-width: min(430px, calc(100vw - 32px)); pointer-events: none; position: fixed; right: 24px; top: 20px; width: min(430px, calc(100vw - 32px)); z-index: 2147483000; }\r\n.planner-plus-toast-stack[hidden] { display: none; }\r\n.planner-plus-toast-stack .planner-plus-toast { bottom: auto; max-width: none; opacity: 0; pointer-events: auto; position: relative; right: auto; top: auto; transform: translateX(18px); width: 100%; }\r\n.planner-plus-toast-stack .planner-plus-toast.is-visible { opacity: 1; transform: translateX(0); }\r\n.planner-plus-toast-stack .planner-plus-toast.is-leaving { opacity: 0; transform: translateX(18px); }\r\n\r\n#plannerPlusDialog .voice-playback-rule-row { grid-template-columns: minmax(0, 1fr) minmax(260px, 42%); }\r\n'; // src/shared/toast.css var toast_default = "\r\n[dft-data-toast-stack] {\r\n --toast-success-bg: #eaf7ef;\r\n --toast-success-border: #88cba4;\r\n --toast-success-text: #195c38;\r\n --toast-success-icon: #287a4a;\r\n --toast-info-bg: #edf4ff;\r\n --toast-info-border: #9bbcf3;\r\n --toast-info-text: #214c8c;\r\n --toast-info-icon: #356ec1;\r\n --toast-error-bg: #fff0ef;\r\n --toast-error-border: #edaaa5;\r\n --toast-error-text: #8a302b;\r\n --toast-error-icon: #bd4840;\r\n --toast-focus-ring: #2864d7;\r\n}\r\n[dft-data-toast-stack].is-dark {\r\n --toast-success-bg: #19392b;\r\n --toast-success-border: #3d9164;\r\n --toast-success-text: #d8f2e2;\r\n --toast-success-icon: #55b87c;\r\n --toast-info-bg: #1d3049;\r\n --toast-info-border: #456da6;\r\n --toast-info-text: #dce9ff;\r\n --toast-info-icon: #7ca9ed;\r\n --toast-error-bg: #452624;\r\n --toast-error-border: #a34f49;\r\n --toast-error-text: #ffe2df;\r\n --toast-error-icon: #ef837a;\r\n --toast-focus-ring: #82aaff;\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-item] {\r\n align-items: flex-start;\r\n border: 1px solid var(--toast-info-border);\r\n border-radius: 10px;\r\n background: var(--toast-info-bg);\r\n box-shadow: 0 16px 42px rgba(9, 30, 66, .28);\r\n color: var(--toast-info-text);\r\n display: flex;\r\n gap: 12px;\r\n padding: 14px 16px 30px;\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-item].is-success {\r\n background: var(--toast-success-bg);\r\n border-color: var(--toast-success-border);\r\n color: var(--toast-success-text);\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-item].is-info {\r\n background: var(--toast-info-bg);\r\n border-color: var(--toast-info-border);\r\n color: var(--toast-info-text);\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-item].is-error {\r\n background: var(--toast-error-bg);\r\n border-color: var(--toast-error-border);\r\n color: var(--toast-error-text);\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-icon] {\r\n align-items: center;\r\n background: var(--toast-info-icon);\r\n border-radius: 50%;\r\n color: #fff;\r\n display: inline-flex;\r\n flex: 0 0 24px;\r\n font-size: 14px;\r\n font-weight: 800;\r\n height: 24px;\r\n justify-content: center;\r\n line-height: 1;\r\n width: 24px;\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-item].is-success [dft-data-toast-icon] { background: var(--toast-success-icon); }\r\n[dft-data-toast-stack] [dft-data-toast-item].is-info [dft-data-toast-icon] { background: var(--toast-info-icon); }\r\n[dft-data-toast-stack] [dft-data-toast-item].is-error [dft-data-toast-icon] { background: var(--toast-error-icon); }\r\n[dft-data-toast-stack] [dft-data-toast-copy] { display: flex; flex: 1; flex-direction: column; gap: 2px; min-width: 0; }\r\n[dft-data-toast-stack] [dft-data-toast-title] { font-size: 13px; }\r\n[dft-data-toast-stack] [dft-data-toast-message] {\r\n color: inherit;\r\n font-size: 12px;\r\n line-height: 1.45;\r\n overflow-wrap: anywhere;\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-time] {\r\n bottom: 8px;\r\n color: inherit;\r\n font-size: 10px;\r\n line-height: 1;\r\n opacity: .78;\r\n position: absolute;\r\n right: 12px;\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-close] {\r\n background: transparent;\r\n border: 0;\r\n border-radius: 5px;\r\n color: inherit;\r\n cursor: pointer;\r\n flex: 0 0 auto;\r\n font-size: 20px;\r\n height: 24px;\r\n line-height: 1;\r\n padding: 0 4px;\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-close]:hover {\r\n background: color-mix(in srgb, currentColor 12%, transparent);\r\n color: inherit;\r\n}\r\n[dft-data-toast-stack] [dft-data-toast-close]:focus-visible {\r\n outline: 2px solid var(--toast-focus-ring);\r\n outline-offset: 2px;\r\n}\r\n"; // src/plugins/planner/styles.js var css = `${styles_default} ${toast_default}`; function injectStyles() { if (typeof GM_addStyle === "function") { GM_addStyle(css); return; } if (typeof document === "undefined") return; const style = document.createElement("style"); style.dataset.plannerPlus = "true"; style.textContent = css; (document.head || document.documentElement).appendChild(style); } // src/plugins/planner/runtime/config.js function createPlannerConfig() { const constants2 = { extension: "plannerPlus", start: "plannerPlusStart", startImg: "plannerPlusStartImg", lottery: "plannerPlusLottery", timer: "plannerPlusTimer", lotteryImg: "plannerPlusLotteryImg", dialog: "plannerPlusDialog", dialogIcon: "plannerPlusDialogIcon", preview: "plannerPlusActivityPreview", bucket: ["Group by: Bucket", "\u5206\u7EC4\u4F9D\u636E: \u5B58\u50A8\u6876"], assignedTo: ["Group by: Assigned to", "\u5206\u7EC4\u4F9D\u636E: \u5206\u914D\u5BF9\u8C61"], uselessColumns: ["Unassigned", "Planner Agent", "Former member"] }; const statuses2 = { idle: "idle", initializing: "initializing", ready: "ready", drawing: "drawing", finished: "finished", destroyed: "destroyed" }; const elements2 = { start: () => $(`#${constants2.start}`), startImg: () => $(`#${constants2.startImg}`), lottery: () => $(`#${constants2.lottery}`), timer: () => $(`#${constants2.timer}`), lotteryImg: () => $(`#${constants2.lotteryImg}`), dialog: () => $(`#${constants2.dialog}`), groupBy: () => document.querySelector('#basicPlanView [data-testid="group-by-menu-button"], [data-testid="group-by-menu-button"], [data-groupby-button="true"], #basicPlanView [role="toolbar"] .fui-Button.fui-MenuButton') }; return { constants: constants2, statuses: statuses2, elements: elements2 }; } // src/plugins/planner/runtime/planner-preview.js function createPlannerPreview({ host, properties: properties2, configs: configs2, constants: constants2, elements: elements2, renderLocale: renderLocale2, getLocaleText: getLocaleText2 }) { const t = host; t.showActivityPreview = () => { t.closePreview(); const requestId = ++properties2.previewRequestId; const autoPreviewActivity = properties2.roundConfig?.autoPreviewActivity ?? configs2.autoPreviewActivity; if (!autoPreviewActivity || !properties2.currentUser) { return; } const userId = properties2.currentUser.id; const startedAt = Date.now(); const waitForVirtualContent = () => { if (requestId !== properties2.previewRequestId || !properties2.currentUser || properties2.currentUser.id !== userId) { return; } const participant = document.querySelector( `[data-planner-plus-id="${userId}"]` ); const previewCount = participant ? participant.querySelectorAll( '[data-testid="task-board-card"] [data-testid="task-card-preview"]' ).length : 0; const animationFinished = Date.now() - startedAt >= 1050; if (animationFinished && previewCount > 0) { t.showActivityPreviewNow(); return; } if (Date.now() - startedAt >= 5e3) { console.warn( "TeamTools - PlannerPlus: Timed out waiting for virtual task previews.", { userId, previewCount } ); return; } t.setTimeout(waitForVirtualContent, 80, "previewWaitTimer"); }; waitForVirtualContent(); }; t.showActivityPreviewNow = () => { t.closePreview(); const autoPreviewActivity = properties2.roundConfig?.autoPreviewActivity ?? configs2.autoPreviewActivity; if (!autoPreviewActivity || !properties2.currentUser) { return; } const participant = document.querySelector( `[data-planner-plus-id="${properties2.currentUser.id}"]` ); if (!participant) { return; } const contentRoot = document.querySelector('[data-testid="task-board-root"]'); if (!contentRoot) { return; } contentRoot.classList.add("planner-plus-preview-host"); const taskCards = [...participant.querySelectorAll('[data-testid="task-board-card"]')]; const items = taskCards.map( (card) => [...card.querySelectorAll('[data-testid="task-card-preview"]')].map( (preview) => { const clonedPreview = preview.cloneNode(true); clonedPreview.classList.add("planner-plus-preview-task-content"); return clonedPreview; } ) ); if (items.length === 0) { return; } const taskChecklist = taskCards.map((card) => { const indicator = card.querySelector('[data-testid="checklist-indicator"]'); const label = indicator?.getAttribute("aria-label") || ""; const match = label.match(/(\d+)\s+of\s+(\d+)/i); return match ? { completed: Number(match[1]), total: Number(match[2]) } : { completed: 0, total: 0 }; }); const taskTitles = taskCards.map( (card) => card.querySelector('[data-testid="task-card-title"]')?.textContent.trim() || getLocaleText2("preview.untitled") ); const avatarImage = participant.querySelector('[role="img"] img, img[alt]'); const avatarSrc = avatarImage?.getAttribute("src") || ""; const avatarAlt = avatarImage?.getAttribute("alt") || properties2.currentUser.name; const avatarInitials = properties2.currentUser.name.split(/\s+/).filter(Boolean).map((part) => part[0]).join("").slice(0, 2).toUpperCase(); let index = 0; const overlay = $(` `).appendTo(contentRoot); t.applyTheme(); const previewAvatar = overlay.find(".planner-plus-preview__avatar"); if (avatarSrc) { previewAvatar.find("img").attr({ src: avatarSrc, alt: avatarAlt }).show(); previewAvatar.find("span").hide(); } const syncAvatar = () => { const liveAvatar = participant.querySelector('[role="img"] img[src], [role="img"] img'); const liveAvatarSrc = liveAvatar?.getAttribute("src") || ""; const liveAvatarRoot = liveAvatar?.closest('[role="img"]'); const liveAvatarAlt = liveAvatar?.getAttribute("alt") || liveAvatarRoot?.getAttribute("aria-label") || avatarAlt; if (liveAvatarSrc) { previewAvatar.find("img").attr({ src: liveAvatarSrc, alt: liveAvatarAlt }).show(); previewAvatar.find("span").hide(); } else { previewAvatar.find("img").hide().removeAttr("src"); previewAvatar.find("span").show(); } }; syncAvatar(); const avatarObserver = new MutationObserver(syncAvatar); avatarObserver.observe(participant, { attributes: true, childList: true, subtree: true, attributeFilter: ["src", "aria-label", "class"] }); overlay.data("plannerPlusAvatarObserver", avatarObserver); renderLocale2(overlay); const content = overlay.find(".planner-plus-preview__content"); const render = () => { content.empty(); if (items[index].length === 0) { content.text(getLocaleText2("preview.empty")); } else { items[index].forEach((preview) => content.append(preview)); } overlay.find(".planner-plus-preview__summary").text( getLocaleText2("preview.summary", configs2.language, { name: properties2.currentUser.name, task: taskTitles[index], seconds: Number(elements2.timer().text().match(/[::]\s*(\d+)$/)?.[1]) || 0 }) ); overlay.find(".planner-plus-preview__summary").toggleClass("is-over-threshold", (Number(elements2.timer().text().match(/[::]\s*(\d+)$/)?.[1]) || 0) >= configs2.elapsedTime); const checklist = taskChecklist[index]; const remaining = Math.max(checklist.total - checklist.completed, 0); overlay.find(".planner-plus-preview__checklist-count").attr({ "data-checklist-completed": checklist.completed, "data-checklist-total": checklist.total }).text( checklist.total > 0 ? getLocaleText2("preview.checklist", configs2.language, checklist) : getLocaleText2("preview.noChecklist") ); overlay.find(".planner-plus-preview__checklist-warning").text(remaining > 10 ? getLocaleText2("preview.incomplete") : "").toggle(remaining > 10); overlay.find(".planner-plus-preview__open-card").toggleClass("is-overflow", remaining > 10); overlay.data("task-title", taskTitles[index]); overlay.find(".planner-plus-preview__previous").prop("disabled", index === 0); overlay.find(".planner-plus-preview__next").prop("disabled", index === items.length - 1); }; const move = (step) => { const nextIndex = index + step; if (nextIndex < 0 || nextIndex >= items.length) { return; } index = nextIndex; render(); }; overlay.on("click.plannerPlusPreview", ".planner-plus-preview__close, .planner-plus-preview__backdrop", t.closePreview); overlay.on("click.plannerPlusPreview", ".planner-plus-preview__previous", () => move(-1)); overlay.on("click.plannerPlusPreview", ".planner-plus-preview__next", () => move(1)); overlay.on("click.plannerPlusPreview", ".planner-plus-preview__open-card", (event) => { if (event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) { return; } const card = taskCards[index]; if (!card) { return; } event.preventDefault(); event.stopPropagation(); properties2.openingPreviewTask = true; properties2.previewReturnUrl = properties2.pageUrl; card.scrollIntoView?.({ behavior: "smooth", block: "center", inline: "nearest" }); $(card).trigger("click"); }); render(); t.focusPreviewContent(); }; return t; } // src/plugins/planner/runtime/planner-taskboard.js function createPlannerTaskboard({ host, properties: properties2, configs: configs2, constants: constants2, statuses: statuses2, elements: elements2, getLocaleText: getLocaleText2 }) { const t = host; t.setTime = (value) => { if (value === -1) { elements2.timer().text(""); } else { elements2.timer().text(getLocaleText2("general.timerStatus", configs2.language, { name: properties2.currentUser.name, seconds: value })); elements2.timer().toggleClass("is-over-threshold", value >= configs2.elapsedTime); const preview = $(`#${constants2.preview}`); if (preview.length > 0) { preview.find(".planner-plus-preview__summary").toggleClass("is-over-threshold", value >= configs2.elapsedTime).text( getLocaleText2("preview.summary", configs2.language, { name: properties2.currentUser.name, task: preview.data("task-title") || "", seconds: value }) ); } } }; t.callName = () => { t.speech(properties2.currentUser.name); }; t.end = () => { t.toggleElements(false); elements2.start().show(); elements2.lottery().hide(); t.reset(); properties2.roundConfig = null; }; t.resetDrawState = ({ clearUsers = false } = {}) => { t.stopRunWhen(); t.clearTimer(); t.resetPlannerSpeechRound(); t.closePreview(true); t.resetRow(); properties2.currentIndex = 0; properties2.currentUser = null; properties2.roundConfig = null; properties2.status = statuses2.idle; if (clearUsers) { properties2.allUsers = []; } }; t.reset = () => t.resetDrawState({ clearUsers: true }); t.animate = () => { t.clearTimeout("animateTimer"); elements2.lotteryImg().addClass("planner-plus-animate"); t.setTimeout(() => { elements2.lotteryImg().removeClass("planner-plus-animate"); }, 1e3, "animateTimer"); }; t.jumpToRow = () => { if (!properties2.currentUser) { return; } const row = $( `[data-planner-plus-id="${properties2.currentUser.id}"]` ); const rowElement = row[0]; if (!rowElement) { return; } t.resetRow(); properties2.currentHighlightedRow = rowElement; row.addClass("planner-plus-highlight-row").toggleClass( "planner-plus-highlight-row-dark", properties2.resolvedTheme === "dark" ); if (typeof rowElement.scrollIntoView === "function") { rowElement.scrollIntoView({ behavior: "smooth", block: "start", inline: "nearest" }); } }; t.resetRow = () => { const row = $(properties2.currentHighlightedRow); row.removeClass("planner-plus-highlight-row planner-plus-highlight-row-dark"); properties2.currentHighlightedRow = null; }; return t; } // src/shared/route-monitor.js function createRouteMonitor({ host, eventNamespace, clearTimer, setTimer, interval = 500 }) { const t = host; t.startRouteMonitor = () => { t.syncPage(); clearTimer(); setTimer(setInterval(t.syncPage, interval)); $(window).off(`popstate.${eventNamespace} hashchange.${eventNamespace}`).on(`popstate.${eventNamespace} hashchange.${eventNamespace}`, t.syncPage); }; return t; } // src/plugins/planner/runtime/planner-route.js function createPlannerRoute({ host, properties: properties2, constants: constants2, elements: elements2, renderLocale: renderLocale2, images: images2 }) { const t = host; Object.assign(t, createRouteMonitor({ host: t, eventNamespace: "plannerPlusRoute", clearTimer: () => t.clearInterval("routeMonitorTimer"), setTimer: (timer) => { properties2.routeMonitorTimer = timer; properties2.timerHandles.add(timer); } })); t.syncPage = () => { const url = location.href; const isPlannerBoard = document.querySelector("#basicPlanView") !== null; const currentGroupBy = t.getGroupBy(); const groupByChanged = properties2.isPageActive && properties2.groupBy && currentGroupBy && properties2.groupBy !== currentGroupBy; const routeChanged = properties2.pageUrl !== url; if (properties2.isPageActive && routeChanged && properties2.openingPreviewTask) { properties2.pageUrl = url; if (properties2.previewReturnUrl && url === properties2.previewReturnUrl) { properties2.openingPreviewTask = false; properties2.previewReturnUrl = ""; requestAnimationFrame(() => t.restoreLotteryFocus()); t.setTimeout(() => { if (properties2.isPageActive && !properties2.openingPreviewTask) { t.restoreLotteryFocus(); } }, 120); } return; } if (isPlannerBoard) { const shouldInitialize = !properties2.isPageActive || properties2.pageUrl !== url || groupByChanged; if (shouldInitialize) { if (properties2.isPageActive) { t.destroy(); } t.init(); properties2.isPageActive = true; properties2.pageUrl = url; properties2.routeScope = t.getRouteScope(url); } } else if (properties2.isPageActive) { t.destroy(); } }; t.initUI = () => { t.destroyUI(); $("body").append(`
Start lottery Left-click or press ~: Start lottery
Right-click: Open settings
`); const configList = elements2.dialog().find(".planner-plus-modal__config-list"); $("#config-language").closest(".planner-plus-modal__config-row").insertBefore($("#config-theme").closest(".planner-plus-modal__config-row")); configList.children(".planner-plus-modal__config-section").each(function() { const heading = $(this); const group = $('
'); const content = $('
'); const label = heading.text().trim(); heading.nextUntil(".planner-plus-modal__config-section").detach().appendTo(content); heading.replaceWith(group); const labelKey = /^general$/i.test(label) ? "general.general" : /^taskboard$/i.test(label) ? "general.taskboard" : ""; group.append(`${label}`); group.append(content); }); $("#config-language option[value='system']").attr("data-i18n", "general.system"); $("#config-language option[value='en']").attr("data-i18n", "general.english"); $("#config-language option[value='zh-CN']").attr("data-i18n", "general.chinese"); $("#config-theme option[value='system']").attr("data-i18n", "general.system"); $("#config-theme option[value='light']").attr("data-i18n", "general.light"); $("#config-theme option[value='dark']").attr("data-i18n", "general.dark"); $("#config-theme").attr({ "data-i18n": "general.theme", "data-i18n-attr": "aria-label" }); $("#config-language").attr({ "data-i18n": "general.language", "data-i18n-attr": "aria-label" }); $("#to-right").attr({ "data-i18n": "general.floatingPosition", "data-i18n-attr": "aria-label" }); $("#config-elapsed-time").attr({ "data-i18n": "general.elapsedTime", "data-i18n-attr": "aria-label" }); $("#to-right").siblings("em").attr("data-i18n", "general.unitPixels"); $("#config-elapsed-time").siblings("em").attr("data-i18n", "general.unitSeconds"); elements2.startImg().attr({ "data-i18n": "general.startLotteryAlt", "data-i18n-attr": "alt" }); elements2.lotteryImg().attr({ "data-i18n": "general.drawNextAlt", "data-i18n-attr": "alt" }); elements2.start().find(".planner-plus-tooltip").attr("data-i18n", "general.tooltip"); elements2.lottery().find(".planner-plus-tooltip").attr("data-i18n", "general.drawTooltip"); renderLocale2(elements2.dialog()); renderLocale2(elements2.start()); renderLocale2(elements2.lottery()); elements2.startImg().attr("src", images2.plugin); elements2.lotteryImg().attr("src", images2.wheel); elements2.dialog().find(`#${constants2.dialogIcon}`).attr("src", GM_info.script.icon || images2.plugin); elements2.start().add(elements2.lottery()).find(".planner-plus-icon-wrap").off("mouseenter.plannerPlusTooltip focusin.plannerPlusTooltip").on("mouseenter.plannerPlusTooltip focusin.plannerPlusTooltip", (event) => { t.positionTooltip(event.currentTarget); }); }; return t; } // src/shared/speech.js function createVoiceId(voice) { return `${voice.voiceURI || ""}\0${voice.name || ""}\0${voice.lang || ""}`; } function normalizeVoices(nativeVoices, createId = createVoiceId) { const seen = /* @__PURE__ */ new Set(); return nativeVoices.map((nativeVoice) => ({ id: createId(nativeVoice), name: nativeVoice.name || "Unnamed voice", lang: nativeVoice.lang || "und", voiceURI: nativeVoice.voiceURI || "", localService: Boolean(nativeVoice.localService), default: Boolean(nativeVoice.default), nativeVoice })).filter((voice) => !seen.has(voice.id) && seen.add(voice.id)).sort((left, right) => left.name.localeCompare(right.name) || left.lang.localeCompare(right.lang)); } function filterVoices(voices, filters = {}) { const term = String(filters.name || "").trim().toLowerCase(); const localService = filters.localService || "all"; const languageMode = filters.languageMode || "all"; const languages = Array.isArray(filters.languages) ? filters.languages : []; return voices.filter( (voice) => (!term || voice.name.toLowerCase().includes(term)) && (localService === "all" || String(voice.localService) === localService) && (languageMode !== "include" || languages.includes(voice.lang)) ); } // src/shared/speech-controller.js function createSpeechController({ state, getLocaleText: getLocaleText2, getLanguage, logPrefix, previewResultSelector }) { const controller = {}; const warn = (message, error) => console.warn("TeamTools - " + logPrefix + ": " + message, error); const getSpeech = () => window.speechSynthesis; const getNativeVoice = (voice) => voice?.nativeVoice || voice || null; const getPreviewText = (message, values = {}) => getLocaleText2(message, getLanguage(), values); const warmedVoices = state.voiceWarmupVoices || (state.voiceWarmupVoices = /* @__PURE__ */ new WeakSet()); controller.clear = () => { state.voiceRequestId = (state.voiceRequestId || 0) + 1; clearTimeout(state.voiceDelayTimer); clearTimeout(state.voiceWarmupTimer); state.voiceDelayTimer = -1; state.voiceWarmupTimer = -1; try { getSpeech()?.cancel(); } catch (error) { warn("Failed to stop speech synthesis.", error); } }; controller.speak = (text, voice, mode = "preview", metadata = {}) => { const speech = getSpeech(); const trimmed = String(text || "").trim(); if (!trimmed || !speech || typeof SpeechSynthesisUtterance !== "function") { if (!trimmed && mode === "preview" && previewResultSelector) { $(previewResultSelector).text(getPreviewText("general.enterPreviewText")); } return; } const requestId = (state.voiceRequestId || 0) + 1; state.voiceRequestId = requestId; clearTimeout(state.voiceDelayTimer); clearTimeout(state.voiceWarmupTimer); const active = speech.speaking || speech.pending; try { speech.cancel(); } catch (error) { warn("Failed to cancel previous speech request.", error); } const nativeVoice = getNativeVoice(voice); const protect = Boolean(nativeVoice && !nativeVoice.localService); const preview = (message, values = {}) => { if (mode === "preview" && previewResultSelector) { $(previewResultSelector).text(getPreviewText(message, values)); } }; const speakActual = (reason) => { if (requestId !== state.voiceRequestId) return; try { const utterance = new SpeechSynthesisUtterance(trimmed); if (nativeVoice) { utterance.voice = nativeVoice; utterance.lang = nativeVoice.lang; } utterance.onstart = () => preview("general.previewingVoice", { name: nativeVoice?.name || "" }); utterance.onend = () => { if (requestId === state.voiceRequestId && previewResultSelector) { $(previewResultSelector).text(""); } }; utterance.onerror = (event) => { warn("Speech failed.", event.error); if (requestId === state.voiceRequestId && previewResultSelector) { $(previewResultSelector).text(""); } }; speech.speak(utterance); console.info("TeamTools - " + logPrefix + ": Spoken voice", { text: trimmed, mode, voiceName: nativeVoice?.name || "Browser default", lang: nativeVoice?.lang || "", localService: nativeVoice?.localService, default: nativeVoice?.default, voiceURI: nativeVoice?.voiceURI || "", selectedBy: metadata.selectedBy || "browser-fallback", remoteStartupProtection: protect, reason }); } catch (error) { warn("Failed to speak text.", error); } }; const start2 = () => { if (requestId !== state.voiceRequestId) return; speech.resume?.(); if (!protect) { speakActual("direct"); return; } if (warmedVoices.has(nativeVoice)) { speakActual("remote-warmup-reused"); return; } let started = false; const warmupText = /^(zh|ja|ko)(-|$)/i.test(nativeVoice.lang) ? "\u3002" : "."; const afterWarmup = (reason) => { if (started || requestId !== state.voiceRequestId) return; started = true; warmedVoices.add(nativeVoice); clearTimeout(state.voiceWarmupTimer); state.voiceDelayTimer = setTimeout(() => speakActual("remote-light-warmup-" + reason), 60); }; const warmup = new SpeechSynthesisUtterance(warmupText); warmup.voice = nativeVoice; warmup.lang = nativeVoice.lang; warmup.volume = 0.01; warmup.onend = () => afterWarmup("end"); warmup.onerror = () => afterWarmup("error"); speech.speak(warmup); state.voiceWarmupTimer = setTimeout(() => afterWarmup("timeout"), 450); }; if (active) { state.voiceDelayTimer = setTimeout(start2, protect ? 80 : 120); } else if (protect) { state.voiceDelayTimer = setTimeout(start2, 40); } else { start2(); } }; return controller; } // src/shared/toast.js function createToastController({ selector, className, getLocaleText: getLocaleText2, closeLabelKey, getThemeClass, maxVisible = 3 }) { const timers = /* @__PURE__ */ new WeakMap(); const findStack = () => { let stack = $(selector); if (!stack.length) stack = $(`[dft-data-toast-stack].${className}-stack`); return stack; }; const ensureStack = () => { let stack = findStack(); if (stack.length) return stack; stack = $(``).appendTo(document.body); return stack; }; const clearToastTimer = (toast) => { const timer = timers.get(toast[0]); if (timer === void 0) return; window.clearTimeout(timer); timers.delete(toast[0]); }; const hideItem = (toast) => { clearToastTimer(toast); const stack = toast.parent(); toast.removeClass("is-visible is-success is-info is-error").addClass("is-leaving"); window.setTimeout(() => { toast.remove(); if (!stack.children("[dft-data-toast-item]").length) stack.prop("hidden", true); }, 180); }; const controller = { hide() { const stack = findStack(); const items = stack.children("[dft-data-toast-item]"); items.each(function() { clearToastTimer($(this)); }); items.remove(); stack.prop("hidden", true); }, show({ level = "info", title = "", message = "", duration = 5e3 } = {}) { const stack = ensureStack(); stack.toggleClass("is-dark", Boolean(getThemeClass?.())); const normalized = ["success", "info", "error"].includes(level) ? level : "info"; const toast = $(`
`); toast.addClass(`is-${normalized}`).find("[dft-data-toast-title]").text(title || ""); toast.find("[dft-data-toast-message]").text(message || ""); toast.find("[dft-data-toast-time]").text((/* @__PURE__ */ new Date()).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit", hour12: false })); toast.find("[dft-data-toast-icon]").text(normalized === "success" ? "\u2713" : normalized === "error" ? "!" : "i"); toast.find("[dft-data-toast-close]").attr("aria-label", getLocaleText2(closeLabelKey)); toast.on("click.toast", "[dft-data-toast-close]", () => hideItem(toast)); stack.prop("hidden", false).append(toast); const items = stack.children("[dft-data-toast-item]"); if (items.length > maxVisible) { const expired = items.slice(0, items.length - maxVisible); expired.each(function() { clearToastTimer($(this)); }); expired.remove(); } requestAnimationFrame(() => toast.addClass("is-visible")); timers.set(toast[0], window.setTimeout(() => hideItem(toast), Math.max(1500, Number(duration) || 5e3))); } }; return controller; } // src/shared/speech-config.js var SPEECH_PLAYBACK_RULES = ["browser-default", "first-checked", "round-random", "per-play-random"]; var DEFAULT_SPEECH_PLAYBACK_RULE = "browser-default"; function getDefaultSpeechPreviewText(lang) { const value = String(lang || "").toLowerCase(); if (value.startsWith("zh")) return "\u8FD9\u662F\u8BED\u97F3\u8BD5\u542C\u3002"; if (value.startsWith("ja")) return "\u3053\u308C\u306F\u97F3\u58F0\u30C6\u30B9\u30C8\u3067\u3059\u3002"; if (value.startsWith("ko")) return "\uC774\uAC83\uC740 \uC74C\uC131 \uD14C\uC2A4\uD2B8\uC785\uB2C8\uB2E4."; if (value.startsWith("es")) return "Esta es una prueba de voz."; if (value.startsWith("fr")) return "Ceci est un test vocal."; if (value.startsWith("de")) return "Dies ist ein Sprachtest."; if (value.startsWith("ar")) return "\u0647\u0630\u0627 \u0627\u062E\u062A\u0628\u0627\u0631 \u0644\u0644\u0635\u0648\u062A."; if (value.startsWith("pt")) return "Este \xE9 um teste de voz."; if (value.startsWith("ru")) return "\u042D\u0442\u043E \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0433\u043E\u043B\u043E\u0441\u0430\u3002"; return "This is a voice preview."; } function ensureSpeechConfig(config) { config.checkedVoiceIds = Array.isArray(config.checkedVoiceIds) ? config.checkedVoiceIds : []; config.checkedVoiceIdsInitialized = config.checkedVoiceIdsInitialized === true || config.checkedVoiceIds.length > 0; config.filters = config.filters && typeof config.filters === "object" ? config.filters : {}; config.filters.name = typeof config.filters.name === "string" ? config.filters.name : ""; config.filters.localService = ["all", "true", "false"].includes(config.filters.localService) ? config.filters.localService : "all"; config.filters.languages = Array.isArray(config.filters.languages) ? config.filters.languages : []; config.filters.languageMode = ["all", "include", "none"].includes(config.filters.languageMode) ? config.filters.languageMode : config.filters.languages.length ? "include" : "all"; config.commonLanguages = Array.isArray(config.commonLanguages) ? config.commonLanguages : ["en-US", "zh-CN"]; config.useCustomPreviewText = config.useCustomPreviewText === true; config.customPreviewText = typeof config.customPreviewText === "string" ? config.customPreviewText : ""; config.playbackRule = SPEECH_PLAYBACK_RULES.includes(config.playbackRule) ? config.playbackRule : DEFAULT_SPEECH_PLAYBACK_RULE; return config; } function initializeSpeechConfig({ config, voices, save, defaultLanguage }) { ensureSpeechConfig(config); const available = new Set(voices.map((voice) => voice.id)); if (voices.length) { config.checkedVoiceIds = [...new Set(config.checkedVoiceIds.filter((id) => available.has(id)))]; config.filters.languages = config.filters.languages.filter((lang) => voices.some((voice) => voice.lang === lang)); } if (voices.length && (!config.configured || !config.checkedVoiceIdsInitialized && !config.checkedVoiceIds.length)) { const defaultVoice = voices.find((voice) => voice.default); config.checkedVoiceIds = defaultVoice ? [defaultVoice.id] : []; config.checkedVoiceIdsInitialized = true; config.useCustomPreviewText = false; config.customPreviewText = getDefaultSpeechPreviewText(defaultVoice?.lang || defaultLanguage); config.playbackRule = DEFAULT_SPEECH_PLAYBACK_RULE; config.configured = true; save?.(); } return config; } function resetSpeechRoundVoice(state) { if (state) state.roundVoiceId = ""; } function normalizeSpeechSelection(config, voices) { if (!config.checkedVoiceIds.length) { const defaultVoice = voices.find((voice) => voice.default); config.checkedVoiceIds = defaultVoice ? [defaultVoice.id] : []; config.playbackRule = DEFAULT_SPEECH_PLAYBACK_RULE; } return config; } function selectSpeechVoice(voices, config, state = null) { const checked = voices.filter((voice) => config.checkedVoiceIds.includes(voice.id)); const defaultVoice = voices.find((voice) => voice.default) || null; if (config.playbackRule === "browser-default" || !checked.length) { return { voice: defaultVoice, selectedBy: defaultVoice ? "browser-default" : "browser-fallback" }; } if (config.playbackRule === "first-checked") { return { voice: checked[0], selectedBy: "first-checked" }; } if (config.playbackRule === "round-random") { const cached = state?.roundVoiceId && checked.find((voice2) => voice2.id === state.roundVoiceId); const voice = cached || checked[Math.floor(Math.random() * checked.length)]; if (state) state.roundVoiceId = voice.id; return { voice, selectedBy: cached ? "round-random-cached" : "round-random" }; } return { voice: checked[Math.floor(Math.random() * checked.length)], selectedBy: "per-play-random" }; } function getSpeechVoicePresentation(voices, config, fallback, labels = {}) { const checked = voices.filter((voice) => config.checkedVoiceIds.includes(voice.id)); const defaultVoice = voices.find((voice) => voice.default) || null; const rule = config.playbackRule || DEFAULT_SPEECH_PLAYBACK_RULE; const languageSummary = getSpeechVoiceSummary(checked, fallback); const selectedVoice = checked.length === 1 ? checked[0] : rule === "browser-default" ? defaultVoice : rule === "first-checked" ? checked[0] : null; if (selectedVoice) { return { primary: selectedVoice.name || fallback, meta: selectedVoice.lang || fallback }; } if (rule === "browser-default") { return { primary: fallback, meta: fallback }; } if (rule === "round-random") { const primary2 = labels.roundRandomSummary || labels.roundRandom || "Random once per round"; return { primary: primary2.replace("{{count}}", String(checked.length)), meta: languageSummary }; } const primary = labels.perPlayRandomSummary || labels.perPlayRandom || "Random for every playback"; return { primary: primary.replace("{{count}}", String(checked.length)), meta: languageSummary }; } function getSpeechVoiceSummary(voices, fallback) { const languages = [...new Set(voices.map((voice) => voice.lang).filter(Boolean))]; return languages.length ? languages.slice(0, 3).join("\u3001") + (languages.length > 3 ? "\u2026" : "") : fallback; } // src/plugins/planner/runtime/planner-voice.js function createPlannerVoice({ host, properties: properties2, configs: configs2, elements: elements2, renderLocale: renderLocale2, getLocaleText: getLocaleText2 }) { const t = host; const speechController = createSpeechController({ state: properties2, getVoiceConfig: () => { t.ensurePlannerVoiceConfig(); return configs2.voice; }, getLocaleText: getLocaleText2, getLanguage: () => configs2.language, logPrefix: "PlannerPlus", previewResultSelector: "#plannerPlusVoicePreviewResult" }); const toastController = createToastController({ selector: "[data-planner-toast-stack]", className: "planner-plus-toast", getLocaleText: getLocaleText2, getThemeClass: () => $("#plannerPlusDialog").attr("data-planner-plus-theme") === "dark", closeLabelKey: "general.close" }); t.showToast = (options = {}) => toastController.show(options); t.hideToast = () => toastController.hide(); t.getPlannerVoices = () => { try { return normalizeVoices(window.speechSynthesis?.getVoices?.() || [], t.getVoiceId); } catch (error) { console.warn("TeamTools - PlannerPlus: Failed to get browser voices.", error); return []; } }; t.ensurePlannerVoiceConfig = () => ensureSpeechConfig(configs2.voice = configs2.voice || {}); t.getPlannerDefaultPreviewText = (lang) => getDefaultSpeechPreviewText(lang); t.initializeVoiceConfig = (voices = t.getPlannerVoices()) => initializeSpeechConfig({ config: configs2.voice, voices, save: () => t.save(), defaultLanguage: navigator.language }); t.resolvePlannerSpeechVoice = () => selectSpeechVoice(t.getPlannerVoices(), t.ensurePlannerVoiceConfig(), properties2); t.resetPlannerSpeechRound = () => resetSpeechRoundVoice(properties2); t.filterPlannerVoices = (voices = t.getPlannerVoices()) => { t.ensurePlannerVoiceConfig(); return filterVoices(voices, configs2.voice.filters); }; t.bindPlannerVoiceListener = () => { if (properties2.voiceListenerBound || !window.speechSynthesis) return; const refresh = () => { clearTimeout(properties2.voiceRefreshTimer); properties2.voiceRefreshTimer = setTimeout(() => { const voices = t.getPlannerVoices(); t.initializeVoiceConfig(voices); t.renderVoiceConfig(); }, 80); }; properties2.voiceChangedHandler = refresh; if (typeof window.speechSynthesis.addEventListener === "function") window.speechSynthesis.addEventListener("voiceschanged", refresh); else window.speechSynthesis.onvoiceschanged = refresh; properties2.voiceListenerBound = true; }; t.clearVoiceSpeech = () => speechController.clear(); t.speakVoice = (text, voice, mode = "preview", metadata = {}) => speechController.speak(text, voice, mode, metadata); t.renderPlannerVoiceFilter = (kind, anchor) => { t.ensurePlannerVoiceConfig(); const popover = $("#plannerPlusVoiceFilterPopover"); const config = configs2.voice; const text = (key, variables = {}) => getLocaleText2(key, configs2.language, variables); const escapeHtml = (value) => $("").text(value).html(); const rect = anchor.getBoundingClientRect(); const previousLanguageScroll = { common: popover.find(".planner-plus-voice-language-group").scrollTop(), all: popover.find(".planner-plus-voice-language-list").scrollTop() }; const dialog = $("#plannerPlusDialog"); const dialogStyles = getComputedStyle(dialog[0]); ["--planner-plus-surface", "--planner-plus-text", "--planner-plus-muted", "--planner-plus-border", "--planner-plus-accent", "--planner-plus-hover"].forEach((name) => popover[0]?.style.setProperty(name, dialogStyles.getPropertyValue(name))); popover.css("color-scheme", dialog.attr("data-planner-plus-theme") === "dark" ? "dark" : "light"); popover.data("plannerVoiceFilterKind", kind).css({ left: 8, top: 8, visibility: "hidden" }).prop("hidden", false).empty(); const heading = (title) => `
${title}
`; if (kind === "name") popover.append(`${heading(text("general.filterName"))}`); if (kind === "local") popover.append(`${heading(text("general.filterLocalService"))}`).find("select").val(config.filters.localService); if (kind === "language") { const languages = [...new Set(t.getPlannerVoices().map((voice) => voice.lang))].sort(); const common = languages.filter((lang) => config.commonLanguages.includes(lang)); const allLanguages = languages; const selected = new Set(config.filters.languages); const allSelected = config.filters.languageMode === "all"; const checkedCount = allSelected ? languages.length : config.filters.languageMode === "none" ? 0 : languages.filter((lang) => selected.has(lang)).length; const rows = (items) => items.map((lang) => { const isCommon = config.commonLanguages.includes(lang); const isChecked = allSelected || config.filters.languageMode === "include" && selected.has(lang); return ``; }).join(""); popover.append(`${heading(text("general.filterLanguage"))}
${text("general.totalChecked", { total: languages.length, checked: checkedCount })}

${text("general.favorite")} (${common.length})

${rows(common)}

${text("general.allLanguages")} (${allLanguages.length})

${rows(allLanguages)}
`); } const popoverRect = popover[0].getBoundingClientRect(); const gap = 8; const left = Math.max(8, Math.min(rect.right - popoverRect.width, window.innerWidth - popoverRect.width - 8)); const top = rect.bottom + gap + popoverRect.height <= window.innerHeight ? rect.bottom + gap : Math.max(8, rect.top - popoverRect.height - gap); popover.css({ left, top, visibility: "visible" }); popover.find(".planner-plus-voice-language-group").scrollTop(previousLanguageScroll.common); popover.find(".planner-plus-voice-language-list").scrollTop(previousLanguageScroll.all); }; t.getPlannerVoiceSummary = (checkedVoices = []) => getSpeechVoiceSummary(checkedVoices, getLocaleText2("general.browserDefaultVoice", configs2.language)); t.renderVoiceConfig = () => { const all = t.getPlannerVoices(); t.initializeVoiceConfig(all); const voices = t.filterPlannerVoices(all); const selectableVoices = voices; const checked = new Set(configs2.voice.checkedVoiceIds); const rows = $("#plannerPlusVoiceRows").empty(); voices.forEach((voice) => { const safe = $("").text(voice.name).html(); const row = $("").toggleClass("is-checked", checked.has(voice.id)); row.append($("").addClass("planner-plus-voice-check").append($("", { type: "checkbox", "data-planner-voice": encodeURIComponent(voice.id), checked: checked.has(voice.id) }))); row.append($("").addClass("planner-plus-voice-preview").append($("${safe}${voice.localService}${$("").text(voice.lang).html()}`); }); const all = voices.length && voices.every((voice) => selected.has(voice.id)); $("#plannerPlusVoiceManagerAll, #plannerPlusVoiceManagerTableAll").prop("checked", all).prop("indeterminate", !all && voices.some((voice) => selected.has(voice.id))).prop("disabled", !voices.length); $("#plannerPlusVoiceManagerCount").text(getLocaleText2("general.voiceManagerCount", configs2.language, { count: voices.length, checked: selected.size })); }; t.openPlannerVoiceManager = () => { t.ensurePlannerVoiceConfig(); const voices = t.getPlannerVoices(); t.initializeVoiceConfig(voices); properties2.voiceManagerVoices = voices.filter((voice) => configs2.voice.checkedVoiceIds.includes(voice.id)); properties2.voiceManagerChecked = new Set(properties2.voiceManagerVoices.map((voice) => voice.id)); t.renderPlannerVoiceManager(); renderLocale2($("#plannerPlusVoiceManager")); $("#plannerPlusVoiceManager").prop("hidden", false); }; t.closePlannerVoiceManager = () => { t.ensurePlannerVoiceConfig(); const snapshot = new Set((properties2.voiceManagerVoices || []).map((voice) => voice.id)); configs2.voice.checkedVoiceIds = configs2.voice.checkedVoiceIds.filter((id) => !snapshot.has(id)); (properties2.voiceManagerChecked || /* @__PURE__ */ new Set()).forEach((id) => configs2.voice.checkedVoiceIds.push(id)); configs2.voice.checkedVoiceIds = [...new Set(configs2.voice.checkedVoiceIds)]; configs2.voice.checkedVoiceIdsInitialized = true; if (properties2.voiceManagerDefaultApplied) configs2.voice.playbackRule = "browser-default"; t.save(); $("#plannerPlusVoiceManager").prop("hidden", true); properties2.voiceManagerDefaultApplied = false; t.renderVoiceConfig(); }; t.bindVoiceConfig = () => { const notifyDefaultVoice = () => t.showToast?.({ level: "info", title: getLocaleText2("general.defaultVoiceAutoSelectedTitle", configs2.language), message: getLocaleText2("general.defaultVoiceAutoSelected", configs2.language) }); const ensureManagerDefault = () => { const defaultVoice = t.getPlannerVoices().find((voice) => voice.default); if (!defaultVoice) return; if (!(properties2.voiceManagerVoices || []).some((voice) => voice.id === defaultVoice.id)) properties2.voiceManagerVoices = [...properties2.voiceManagerVoices || [], defaultVoice]; properties2.voiceManagerChecked.add(defaultVoice.id); properties2.voiceManagerDefaultApplied = true; }; const dialog = elements2.dialog(); dialog.off(".plannerPlusVoice").on("change.plannerPlusVoice", "[data-planner-voice]", (e) => { const config = configs2.voice; const wasEmpty = config.checkedVoiceIds.length === 0; const id = decodeURIComponent($(e.currentTarget).attr("data-planner-voice")); const selected = new Set(config.checkedVoiceIds); $(e.currentTarget).is(":checked") ? selected.add(id) : selected.delete(id); config.checkedVoiceIds = [...selected]; config.checkedVoiceIdsInitialized = true; config.configured = true; config.playbackRule = config.checkedVoiceIds.length ? wasEmpty || config.playbackRule === "browser-default" ? "round-random" : config.playbackRule : "browser-default"; if (!config.checkedVoiceIds.length) { normalizeSpeechSelection(config, t.getPlannerVoices()); notifyDefaultVoice(); } t.resetPlannerSpeechRound(); t.save(); t.renderVoiceConfig(); }).on("change.plannerPlusVoice", "#plannerPlusVoiceCheckAll", (e) => { const config = configs2.voice; const filtered = t.filterPlannerVoices(t.getPlannerVoices()); const wasEmpty = config.checkedVoiceIds.length === 0; const selected = new Set(config.checkedVoiceIds); filtered.forEach((voice) => $(e.currentTarget).is(":checked") ? selected.add(voice.id) : selected.delete(voice.id)); config.checkedVoiceIds = [...selected]; config.checkedVoiceIdsInitialized = true; config.playbackRule = config.checkedVoiceIds.length ? wasEmpty || config.playbackRule === "browser-default" ? "round-random" : config.playbackRule : "browser-default"; if (!$(e.currentTarget).is(":checked") && !config.checkedVoiceIds.length) { normalizeSpeechSelection(config, t.getPlannerVoices()); notifyDefaultVoice(); } t.resetPlannerSpeechRound(); t.save(); t.renderVoiceConfig(); }).on("change.plannerPlusVoice", "#plannerPlusVoicePlaybackRule", (e) => { const config = configs2.voice; config.playbackRule = $(e.currentTarget).val(); const defaultVoice = t.getPlannerVoices().find((voice) => voice.default); if (config.playbackRule === "browser-default") config.checkedVoiceIds = defaultVoice ? [defaultVoice.id] : []; else if (!config.checkedVoiceIds.length) config.playbackRule = "browser-default"; t.resetPlannerSpeechRound(); t.save(); t.renderVoiceConfig(); }).on("click.plannerPlusVoice", "[data-planner-voice-preview]", (e) => { const voice = t.getPlannerVoices().find((item) => item.id === decodeURIComponent($(e.currentTarget).attr("data-planner-voice-preview"))); if (voice) t.speakVoice(configs2.voice.useCustomPreviewText ? configs2.voice.customPreviewText : t.getPlannerDefaultPreviewText(voice.lang), voice); }).on("click.plannerPlusVoice", "#plannerPlusVoiceSimulate", () => { const voice = t.getPlannerVoices().find((item) => configs2.voice.checkedVoiceIds.includes(item.id)) || t.getPlannerVoices().find((item) => item.default); if (voice) t.speakVoice(configs2.voice.useCustomPreviewText ? configs2.voice.customPreviewText : t.getPlannerDefaultPreviewText(voice.lang), voice); }).on("click.plannerPlusVoice", "#plannerPlusManageCheckedVoices", () => t.openPlannerVoiceManager()).on("click.plannerPlusVoice", "[data-planner-manager-close]", () => t.closePlannerVoiceManager()).on("change.plannerPlusVoice", "[data-planner-manager-voice]", (e) => { const id = decodeURIComponent($(e.currentTarget).attr("data-planner-manager-voice")); $(e.currentTarget).is(":checked") ? properties2.voiceManagerChecked.add(id) : properties2.voiceManagerChecked.delete(id); if ($(e.currentTarget).is(":checked")) properties2.voiceManagerDefaultApplied = false; if (!properties2.voiceManagerChecked.size) { ensureManagerDefault(); notifyDefaultVoice(); } t.renderPlannerVoiceManager(); }).on("click.plannerPlusVoice", "[data-planner-manager-preview]", (e) => { const voice = (properties2.voiceManagerVoices || []).find((item) => item.id === decodeURIComponent($(e.currentTarget).attr("data-planner-manager-preview"))); if (voice) t.speakVoice(configs2.voice.useCustomPreviewText ? configs2.voice.customPreviewText : "This is a voice preview.", voice); }).on("change.plannerPlusVoice", "#plannerPlusVoiceManagerAll, #plannerPlusVoiceManagerTableAll", (e) => { properties2.voiceManagerChecked = new Set($(e.currentTarget).is(":checked") ? (properties2.voiceManagerVoices || []).map((voice) => voice.id) : []); if ($(e.currentTarget).is(":checked")) properties2.voiceManagerDefaultApplied = false; if (!properties2.voiceManagerChecked.size) { ensureManagerDefault(); notifyDefaultVoice(); } t.renderPlannerVoiceManager(); }).on("click.plannerPlusVoice", ".planner-plus-voice-manager-backdrop", () => t.closePlannerVoiceManager()).on("click.plannerPlusVoice", ".planner-plus-voice-filter", (e) => { e.stopPropagation(); t.renderPlannerVoiceFilter($(e.currentTarget).data("planner-voice-filter"), e.currentTarget); }).on("input.plannerPlusVoice", "#plannerVoiceFilterName", (e) => { configs2.voice.filters.name = $(e.currentTarget).val(); t.save(); t.renderVoiceConfig(); }).on("change.plannerPlusVoice", "#plannerVoiceFilterLocal", (e) => { configs2.voice.filters.localService = $(e.currentTarget).val(); t.save(); t.renderVoiceConfig(); }).on("change.plannerPlusVoice", "[data-planner-language]", (e) => { const languages = [...new Set(t.getPlannerVoices().map((voice) => voice.lang))]; const lang = $(e.currentTarget).attr("data-planner-language"); const checked = $(e.currentTarget).is(":checked"); const selected = new Set(configs2.voice.filters.languageMode === "all" ? languages : configs2.voice.filters.languages); checked ? selected.add(lang) : selected.delete(lang); configs2.voice.filters.languageMode = selected.size === 0 ? "none" : selected.size === languages.length ? "all" : "include"; configs2.voice.filters.languages = configs2.voice.filters.languageMode === "include" ? [...selected] : []; t.save(); t.renderVoiceConfig(); t.refreshPlannerLanguageFilter(); }).on("input.plannerPlusVoice", "#plannerVoiceFilterLanguageSearch", (e) => { const term = $(e.currentTarget).val().toLowerCase(); $("#plannerPlusVoiceFilterPopover [data-planner-voice-language-row]").each((_, row) => $(row).toggle(!term || $(row).attr("data-planner-voice-language-row").toLowerCase().includes(term))); }).on("click.plannerPlusVoice", "[data-planner-voice-common]", (e) => { e.preventDefault(); e.stopPropagation(); const lang = $(e.currentTarget).attr("data-planner-voice-common"); const common = new Set(configs2.voice.commonLanguages); common.has(lang) ? common.delete(lang) : common.add(lang); configs2.voice.commonLanguages = [...common]; t.save(); t.syncPlannerFavoriteLanguage(lang); }).on("input.plannerPlusVoice", "#plannerPlusVoiceText", (e) => { configs2.voice.customPreviewText = $(e.currentTarget).val(); t.save(); }).on("change.plannerPlusVoice", "#plannerPlusVoiceUseCustom", (e) => { configs2.voice.useCustomPreviewText = $(e.currentTarget).is(":checked"); t.save(); t.renderVoiceConfig(); }).on("click.plannerPlusVoice", "[data-planner-filter-clear]", (e) => { e.preventDefault(); e.stopPropagation(); const kind = $(e.currentTarget).attr("data-planner-filter-clear"); if (kind === "name") configs2.voice.filters.name = ""; if (kind === "local") { configs2.voice.filters.localService = "all"; $("#plannerVoiceFilterLocal").val("all"); } if (kind === "language") { configs2.voice.filters.languageMode = "none"; configs2.voice.filters.languages = []; $("#plannerPlusVoiceFilterPopover [data-planner-language]").prop("checked", false); } t.save(); t.renderVoiceConfig(); }); $(document).off("click.plannerPlusVoiceFilter").on("click.plannerPlusVoiceFilter", (e) => { if (!$(e.target).closest("#plannerPlusVoiceFilterPopover, .planner-plus-voice-filter").length) $("#plannerPlusVoiceFilterPopover").prop("hidden", true); }); if (!properties2.voiceListenerBound && window.speechSynthesis?.addEventListener) { properties2.voiceListenerBound = true; properties2.voiceChangedHandler = () => { clearTimeout(properties2.voiceRefreshTimer); properties2.voiceRefreshTimer = setTimeout(() => { t.initializeVoiceConfig(t.getPlannerVoices()); t.renderVoiceConfig(); }, 100); }; window.speechSynthesis.addEventListener("voiceschanged", properties2.voiceChangedHandler); } let attempts = 0; const refresh = () => { t.renderVoiceConfig(); if (!t.getPlannerVoices().length && attempts++ < 20) properties2.voiceRefreshTimer = setTimeout(refresh, 150); }; refresh(); }; t.initConfig = () => { t.load(); t.bindPlannerVoiceListener(); t.applyTheme(); renderLocale2(elements2.start()); renderLocale2(elements2.lottery()); renderLocale2(elements2.dialog()); $("#plannerPlusVoiceLoadState").removeAttr("data-i18n"); t.bindVoiceConfig(); t.renderVoiceConfig(); elements2.start().css("right", configs2.right); elements2.start().off("contextmenu.plannerPlus"); elements2.start().on("contextmenu.plannerPlus", t.contextMenu); elements2.lottery().css("right", configs2.right); elements2.lottery().off("contextmenu.plannerPlus"); elements2.lottery().on("contextmenu.plannerPlus", t.contextMenu); }; return t; } // src/shared/theme.js var VALID_THEMES = ["light", "dark", "system"]; function resolveTheme(value, prefersDark, fallback = "system") { const theme = VALID_THEMES.includes(value) ? value : fallback; return theme === "system" ? prefersDark ? "dark" : "light" : theme; } // src/shared/tooltip.js var PLACEMENTS = ["right", "bottom", "left", "top"]; function positionTooltip(host, { tooltipSelector = '[role="tooltip"]', placementClassPrefix, gap = 10, fallbackWidth = 280, fallbackHeight = 48 } = {}) { const tooltip = host?.querySelector?.(tooltipSelector); if (!host || !tooltip || !placementClassPrefix) return null; const view = host.ownerDocument?.defaultView || globalThis.window; if (!view) return null; const hostRect = host.getBoundingClientRect(); const tooltipRect = tooltip.getBoundingClientRect(); const width = tooltipRect.width || fallbackWidth; const height = tooltipRect.height || fallbackHeight; const viewportPadding = 8; const spaces = { right: view.innerWidth - hostRect.right, bottom: view.innerHeight - hostRect.bottom, left: hostRect.left, top: hostRect.top }; const fits = { right: spaces.right >= width + gap && hostRect.top - height / 2 >= viewportPadding && hostRect.bottom + height / 2 <= view.innerHeight - viewportPadding, bottom: spaces.bottom >= height + gap && hostRect.right - width >= viewportPadding, left: spaces.left >= width + gap && hostRect.top - height / 2 >= viewportPadding && hostRect.bottom + height / 2 <= view.innerHeight - viewportPadding, top: spaces.top >= height + gap && hostRect.right - width >= viewportPadding }; const placement = PLACEMENTS.find((side) => fits[side]) || PLACEMENTS.find((side) => spaces[side] >= (side === "right" || side === "left" ? width : height) + gap) || "top"; tooltip.classList.remove(...PLACEMENTS.map((side) => placementClassPrefix + "--" + side)); tooltip.classList.add(placementClassPrefix + "--" + placement); return placement; } var SHARED_TOOLTIP_STYLE_ID = "dft-shared-tooltip-styles"; var SHARED_TOOLTIP_HOST_CLASS = "dft-shared-tooltip-host"; var SHARED_TOOLTIP_CLASS = "dft-shared-tooltip"; var SHARED_TOOLTIP_CSS = [ ".dft-shared-tooltip-host { position: relative; }", ".dft-shared-tooltip { background: #172b4d; border-radius: 6px; box-shadow: 0 5px 16px rgba(9,30,66,.28); color: #fff; font: 12px/1.5 system-ui,sans-serif; max-width: min(360px,calc(100vw - 16px)); opacity: 0; padding: 8px 10px; pointer-events: none; position: fixed; text-align: left; transition: opacity .15s ease,visibility .15s ease; visibility: hidden; white-space: pre-line; width: max-content; z-index: 2147483647; }", ".dft-shared-tooltip.dft-shared-tooltip--visible { opacity: 1; visibility: visible; }", ".dft-shared-tooltip-host > .dft-shared-tooltip { background: #172b4d; border-radius: 6px; box-shadow: 0 5px 16px rgba(9,30,66,.28); color: #fff; font: 12px/1.5 system-ui,sans-serif; left: auto; max-width: min(360px,calc(100vw - 16px)); opacity: 0; padding: 8px 10px; pointer-events: none; position: absolute; text-align: left; top: calc(100% + 10px); transform: translateY(-4px); transition: opacity .15s ease,transform .15s ease,visibility .15s ease; visibility: hidden; white-space: pre-line; width: max-content; z-index: 100100; }", ".dft-shared-tooltip-host:hover > .dft-shared-tooltip, .dft-shared-tooltip-host:focus-within > .dft-shared-tooltip { opacity: 1; transform: translateY(0); visibility: visible; }", ".dft-shared-tooltip-host > .dft-shared-tooltip--right { left: calc(100% + 10px); top: 50%; transform: translateY(-50%) translateX(-4px); }", ".dft-shared-tooltip-host > .dft-shared-tooltip--bottom { left: auto; right: 0; top: calc(100% + 10px); transform: translateY(-4px); }", ".dft-shared-tooltip-host > .dft-shared-tooltip--left { left: auto; right: calc(100% + 10px); top: 50%; transform: translateY(-50%) translateX(4px); }", ".dft-shared-tooltip-host > .dft-shared-tooltip--top { bottom: calc(100% + 10px); left: auto; right: 0; top: auto; transform: translateY(4px); }", ".dft-shared-tooltip-host:hover > .dft-shared-tooltip--right, .dft-shared-tooltip-host:focus-within > .dft-shared-tooltip--right, .dft-shared-tooltip-host:hover > .dft-shared-tooltip--left, .dft-shared-tooltip-host:focus-within > .dft-shared-tooltip--left { transform: translateY(-50%) translateX(0); }", ".dft-shared-tooltip-host:hover > .dft-shared-tooltip--bottom, .dft-shared-tooltip-host:focus-within > .dft-shared-tooltip--bottom, .dft-shared-tooltip-host:hover > .dft-shared-tooltip--top, .dft-shared-tooltip-host:focus-within > .dft-shared-tooltip--top { transform: translateY(0); }" ].join("\n"); function installSharedTooltipStyles(document2) { if (!document2?.head || document2.getElementById(SHARED_TOOLTIP_STYLE_ID)) return; const style = document2.createElement("style"); style.id = SHARED_TOOLTIP_STYLE_ID; style.textContent = SHARED_TOOLTIP_CSS; document2.head.appendChild(style); } function isCustomTooltipElement(element) { return Boolean(element.closest?.([".ado-plus-action-tooltip-host", ".confluence-plus-label-title-tooltip", ".confluence-plus-label-apply-tooltip-host"].join(","))); } function positionSharedPortalTooltip(host, tooltip) { const view = host.ownerDocument?.defaultView || globalThis.window; if (!view) return; const rect = host.getBoundingClientRect(); tooltip.style.left = "-10000px"; tooltip.style.top = "-10000px"; tooltip.classList.add(SHARED_TOOLTIP_CLASS + "--visible"); const size = tooltip.getBoundingClientRect(); const width = size.width || 280; const height = size.height || 48; const gap = 10; const padding = 8; const spaces = { right: view.innerWidth - rect.right, bottom: view.innerHeight - rect.bottom, left: rect.left, top: rect.top }; const fits = { right: spaces.right >= width + gap && rect.top - height / 2 >= padding && rect.bottom + height / 2 <= view.innerHeight - padding, bottom: spaces.bottom >= height + gap && rect.right - width >= padding, left: spaces.left >= width + gap && rect.top - height / 2 >= padding && rect.bottom + height / 2 <= view.innerHeight - padding, top: spaces.top >= height + gap && rect.right - width >= padding }; const placement = PLACEMENTS.find((side) => fits[side]) || "top"; const positions = { right: [rect.right + gap, rect.top + (rect.height - height) / 2], bottom: [rect.right - width, rect.bottom + gap], left: [rect.left - width - gap, rect.top + (rect.height - height) / 2], top: [rect.right - width, rect.top - height - gap] }; const [left, top] = positions[placement]; tooltip.classList.remove(...PLACEMENTS.map((side) => SHARED_TOOLTIP_CLASS + "--" + side)); tooltip.classList.add(SHARED_TOOLTIP_CLASS + "--" + placement, SHARED_TOOLTIP_CLASS + "--visible"); tooltip.style.left = Math.max(padding, Math.min(left, view.innerWidth - width - padding)) + "px"; tooltip.style.top = Math.max(padding, Math.min(top, view.innerHeight - height - padding)) + "px"; } function setSharedTooltip(element, content) { if (!element || !content || element.tagName === "OPTION") return; installSharedTooltipStyles(element.ownerDocument); element.removeAttribute("title"); element.classList.add(SHARED_TOOLTIP_HOST_CLASS); let tooltip = element.__dftSharedTooltip; if (!tooltip) { tooltip = element.ownerDocument.createElement("span"); tooltip.className = SHARED_TOOLTIP_CLASS; tooltip.setAttribute("role", "tooltip"); element.__dftSharedTooltip = tooltip; (element.ownerDocument.body || element.ownerDocument.documentElement).appendChild(tooltip); } tooltip.textContent = String(content); if (!element.__dftSharedTooltipBound) { element.__dftSharedTooltipBound = true; const show = () => positionSharedPortalTooltip(element, tooltip); const hide = () => { tooltip.classList.remove(SHARED_TOOLTIP_CLASS + "--visible"); }; element.addEventListener("mouseenter", show); element.addEventListener("focusin", show); element.addEventListener("mouseleave", hide); element.addEventListener("focusout", hide); } } function convertNativeTitles(document2, root = document2) { if (!root?.querySelectorAll) return; const elements2 = []; if (root.nodeType === 1 && root.hasAttribute?.("title")) elements2.push(root); elements2.push(...root.querySelectorAll("[title]")); elements2.forEach((element) => { const content = element.getAttribute("title"); if (!content) return; if (isCustomTooltipElement(element)) { element.removeAttribute("title"); return; } if (element.tagName === "OPTION") { const select = element.parentElement; if (select?.tagName === "SELECT" && select.selectedOptions[0] === element) setSharedTooltip(select.parentElement || select, content); element.removeAttribute("title"); return; } setSharedTooltip(element, content); }); } function installSharedTooltips(document2 = globalThis.document) { if (!document2 || document2.__dftSharedTooltipsInstalled) return; document2.__dftSharedTooltipsInstalled = true; installSharedTooltipStyles(document2); convertNativeTitles(document2); const observer = new MutationObserver((mutations) => mutations.forEach((mutation) => { if (mutation.type === "childList") mutation.addedNodes.forEach((node) => convertNativeTitles(document2, node)); if (mutation.type === "attributes" && mutation.attributeName === "title") convertNativeTitles(document2, mutation.target); })); observer.observe(document2.documentElement, { attributes: true, attributeFilter: ["title"], childList: true, subtree: true }); } // src/plugins/planner/runtime/utils.js function createPlannerUtils({ properties: properties2, configs: configs2, constants: constants2, statuses: statuses2, elements: elements2, validUiLanguages: validUiLanguages2, resolveUiLanguage: resolveUiLanguage3, renderLocale: renderLocale2, images: images2, getTemplates, getLocaleText: getLocaleText2 }) { const util2 = (() => { const t = {}; Object.assign(t, createPlannerTaskboard({ host: t, properties: properties2, configs: configs2, constants: constants2, statuses: statuses2, elements: elements2, getLocaleText: getLocaleText2 })); Object.assign(t, createPlannerRoute({ host: t, properties: properties2, constants: constants2, statuses: statuses2, elements: elements2, renderLocale: renderLocale2, images: images2 })); Object.assign(t, createPlannerPreview({ host: t, properties: properties2, configs: configs2, constants: constants2, elements: elements2, renderLocale: renderLocale2, getLocaleText: getLocaleText2 })); Object.assign(t, createPlannerVoice({ host: t, properties: properties2, configs: configs2, elements: elements2, renderLocale: renderLocale2, getLocaleText: getLocaleText2 })); t.setTimeout = (callback, delay, property) => { const timer = setTimeout(() => { properties2.timerHandles.delete(timer); if (property) properties2[property] = -1; callback(); }, delay); properties2.timerHandles.add(timer); if (property) properties2[property] = timer; return timer; }; t.positionTooltip = (wrap) => positionTooltip(wrap, { tooltipSelector: ".planner-plus-tooltip", placementClassPrefix: "planner-plus-tooltip" }); t.clearTimeout = (property) => { const timer = properties2[property]; if (timer !== -1) { clearTimeout(timer); properties2.timerHandles.delete(timer); properties2[property] = -1; } }; t.clearInterval = (property) => { const timer = properties2[property]; if (timer !== -1) { clearInterval(timer); properties2.timerHandles.delete(timer); properties2[property] = -1; } }; t.clearRegisteredTimers = () => { properties2.timerHandles.forEach((timer) => { clearTimeout(timer); clearInterval(timer); }); properties2.timerHandles.clear(); properties2.interval = -1; properties2.animateTimer = -1; properties2.routeMonitorTimer = -1; properties2.previewWaitTimer = -1; properties2.previewCloseTimer = -1; }; t.save = () => { try { const json = JSON.stringify(configs2); localStorage.setItem(constants2.extension, json); } catch (error) { console.warn( "TeamTools - PlannerPlus: Failed to save configuration.", error ); } }; t.getGroupBy = () => { const element = elements2.groupBy(); if (!element) { return ""; } const ariaLabel = element.getAttribute("aria-label") || element.ariaLabel; return typeof ariaLabel === "string" ? ariaLabel.trim() : ""; }; t.getColumnLabel = (element) => { if (!element) { return ""; } const ariaLabel = element.getAttribute("aria-label") || element.ariaLabel; return typeof ariaLabel === "string" ? ariaLabel.trim() : ""; }; t.load = () => { const replaceConfig = (next) => { Object.keys(configs2).forEach((key) => delete configs2[key]); Object.assign(configs2, next); }; const defaults = { theme: "system", language: "system", elapsedTime: properties2.defaultElapsedTime, right: properties2.rightDefault, autoFocusContent: properties2.defaultAutoFocusContent, autoPreviewActivity: properties2.defaultAutoPreviewActivity, voice: { configured: false, checkedVoiceIds: [], checkedVoiceIdsInitialized: false, useCustomPreviewText: false, customPreviewText: "", playbackRule: "browser-default", filters: { name: "", localService: "all", languageMode: "all", languages: [] }, commonLanguages: ["en-US", "zh-CN"] } }; const normalizeVoice = (value) => { const voice = value && typeof value === "object" ? value : {}; const filters = voice.filters && typeof voice.filters === "object" ? voice.filters : {}; return { configured: voice.configured === true, filters: { name: typeof filters.name === "string" ? filters.name : "", localService: ["all", "true", "false"].includes(filters.localService) ? filters.localService : "all", languageMode: ["all", "include", "none"].includes(filters.languageMode) ? filters.languageMode : Array.isArray(filters.languages) && filters.languages.length ? "include" : "all", languages: Array.isArray(filters.languages) ? [...new Set(filters.languages.filter((x) => typeof x === "string" && x))] : [] }, checkedVoiceIds: Array.isArray(voice.checkedVoiceIds) ? [...new Set(voice.checkedVoiceIds.filter((x) => typeof x === "string" && x))] : [], checkedVoiceIdsInitialized: voice.checkedVoiceIdsInitialized === true || Array.isArray(voice.checkedVoiceIds) && voice.checkedVoiceIds.length > 0, commonLanguages: Array.isArray(voice.commonLanguages) ? [...new Set(voice.commonLanguages.filter((x) => typeof x === "string" && x))] : [...defaults.voice.commonLanguages], useCustomPreviewText: voice.useCustomPreviewText === true, customPreviewText: typeof voice.customPreviewText === "string" ? voice.customPreviewText : "", playbackRule: ["browser-default", "first-checked", "round-random", "per-play-random"].includes(voice.playbackRule) ? voice.playbackRule : "browser-default" }; }; try { const json = localStorage.getItem(constants2.extension); if (!json) { replaceConfig(defaults); return; } const parsed = JSON.parse(json); const theme = ["light", "dark", "system"].includes(parsed.theme) ? parsed.theme : defaults.theme; const language = validUiLanguages2.includes(parsed.language) ? parsed.language : defaults.language; const elapsedTime = Number(parsed.elapsedTime); const right = Number(parsed.right); replaceConfig({ theme, language, elapsedTime: Number.isFinite(elapsedTime) && elapsedTime > 0 ? Math.min(Math.floor(elapsedTime), 3600) : defaults.elapsedTime, right: Number.isFinite(right) ? Math.min( Math.max(Math.floor(right), properties2.rightMin), properties2.rightMax ) : defaults.right, autoFocusContent: typeof parsed.autoFocusContent === "boolean" ? parsed.autoFocusContent : defaults.autoFocusContent, autoPreviewActivity: typeof parsed.autoPreviewActivity === "boolean" ? parsed.autoPreviewActivity : defaults.autoPreviewActivity, voice: normalizeVoice(parsed.voice) }); } catch (error) { console.warn( "TeamTools - PlannerPlus: Failed to load configuration. Using defaults.", error ); replaceConfig(defaults); } }; t.applyTheme = () => { const media = properties2.themeMediaQuery || (typeof window.matchMedia === "function" ? window.matchMedia("(prefers-color-scheme: dark)") : null); properties2.themeMediaQuery = media; const theme = configs2.theme; const resolved = resolveTheme(theme, Boolean(media?.matches)); properties2.resolvedTheme = resolved; [elements2.start()[0], elements2.lottery()[0], elements2.dialog()[0], document.getElementById(constants2.preview)].forEach((element) => { if (element) { element.setAttribute("data-planner-plus-theme", resolved); } }); if (media && !properties2.themeChangeHandler) { properties2.themeChangeHandler = () => { if (configs2.theme === "system") t.applyTheme(); }; if (typeof media.addEventListener === "function") media.addEventListener("change", properties2.themeChangeHandler); else if (typeof media.addListener === "function") media.addListener(properties2.themeChangeHandler); } }; t.random = (arr) => { const temp = $.map(arr, (el) => { return { val: el, _factor: Math.random() }; }).sort((x, y) => x._factor - y._factor); return $.map(temp, (el) => el.val); }; t.getVoiceId = createVoiceId; t.getVoices = () => { if (!window.speechSynthesis || typeof window.speechSynthesis.getVoices !== "function") { return []; } try { const voices = window.speechSynthesis.getVoices().map((voice) => ({ id: t.getVoiceId(voice), name: voice.name || "Unnamed voice", lang: voice.lang || "und", voiceURI: voice.voiceURI || "", localService: Boolean(voice.localService), default: Boolean(voice.default), nativeVoice: voice })); const checked = new Set(configs2.voice?.checkedVoiceIds || []); const selected = voices.filter((voice) => checked.has(voice.id)); return t.random(selected.length ? selected : voices); } catch (error) { console.warn( "TeamTools - PlannerPlus: Failed to load speech voices.", error ); return []; } }; t.speech = (text) => { const resolved = t.resolvePlannerSpeechVoice(); t.speakVoice(text, resolved.voice, "taskboard", { selectedBy: resolved.selectedBy }); }; t.runWhen = (conditionFunc, callbackFunc, timeout = 3e4) => { const delay = 300; const startTime = Date.now(); const poll = () => { if (properties2.status !== statuses2.initializing) { return; } if (Date.now() - startTime >= timeout) { console.warn( "TeamTools - PlannerPlus: Timed out while waiting for Planner board.", { groupBy: util2.getGroupBy(), boardColumns: document.querySelectorAll( "ul[data-testid=taskBoardView] > li" ).length } ); return; } let matched = false; try { matched = conditionFunc(); } catch (error) { console.warn( "TeamTools - PlannerPlus: Failed to detect Planner board.", error ); return; } if (matched && properties2.status === statuses2.initializing) { try { callbackFunc(); } catch (error) { console.warn( "TeamTools - PlannerPlus: Failed to initialize the board.", error ); t.stopRunWhen(); t.reset(); window.alert( getLocaleText2("errors.initializationFailed") ); } return; } const timer = t.setTimeout(() => { properties2.runWhenTimers.delete(timer); poll(); }, delay); properties2.runWhenTimers.add(timer); }; poll(); }; t.stopRunWhen = () => { properties2.runWhenTimers.forEach((timer) => { clearTimeout(timer); properties2.timerHandles.delete(timer); }); properties2.runWhenTimers.clear(); }; t.resetTimer = () => { t.clearTimer(); properties2.startTime = (/* @__PURE__ */ new Date()).getTime(); properties2.interval = setInterval(() => { const currentTime = (/* @__PURE__ */ new Date()).getTime(); const value = parseInt((currentTime - properties2.startTime) / 1e3, 10); t.setTime(value); }, 100); properties2.timerHandles.add(properties2.interval); }; t.clearTimer = () => { t.clearInterval("interval"); t.setTime(-1); }; t.getRouteScope = (url) => { try { const parsed = new URL(url, location.href); const route = `${parsed.pathname}${parsed.hash}`.replace( /\/(?:task|tasks)(?:\/|$).*/i, "" ); return `${parsed.origin}${route}`; } catch { return url; } }; t.closePreview = (immediate = false) => { properties2.previewRequestId += 1; t.clearTimeout("previewWaitTimer"); const preview = $(`#${constants2.preview}`); if (preview.length > 0) { preview.data("plannerPlusAvatarObserver")?.disconnect(); } if (preview.length === 0) { document.querySelector('[data-testid="task-board-root"].planner-plus-preview-host')?.classList.remove("planner-plus-preview-host"); return; } if (immediate) { t.clearTimeout("previewCloseTimer"); preview.remove(); document.querySelector('[data-testid="task-board-root"].planner-plus-preview-host')?.classList.remove("planner-plus-preview-host"); return; } t.clearTimeout("previewCloseTimer"); preview.addClass("is-closing"); const previewElement = preview[0]; t.setTimeout(() => { previewElement.remove(); if (!document.getElementById(constants2.preview)) { document.querySelector('[data-testid="task-board-root"].planner-plus-preview-host')?.classList.remove("planner-plus-preview-host"); } }, 220, "previewCloseTimer"); }; t.focusPreviewContent = () => { const focusTarget = $(`#${constants2.preview} .planner-plus-preview__content`)[0]; if (focusTarget && focusTarget.isConnected && typeof focusTarget.focus === "function") { focusTarget.focus({ preventScroll: true }); return true; } return false; }; t.restoreLotteryFocus = () => { if (t.focusPreviewContent()) { return true; } const lotteryTarget = elements2.lotteryImg()[0]; if (lotteryTarget && lotteryTarget.isConnected && typeof lotteryTarget.focus === "function") { lotteryTarget.focus({ preventScroll: true }); return true; } return false; }; t.draw = () => { if (properties2.status !== statuses2.ready && properties2.status !== statuses2.drawing) { return; } properties2.status = statuses2.drawing; if (properties2.currentIndex === 0 && typeof t.refreshPlannerUsers === "function") { t.refreshPlannerUsers(); } if (properties2.currentIndex !== 0) { t.resetRow(); } if (properties2.currentIndex === properties2.allUsers.length) { properties2.status = statuses2.finished; properties2.currentUser = null; t.closePreview(); t.clearTimer(); t.resetRow(); t.end(); return; } else { properties2.currentUser = properties2.allUsers[properties2.currentIndex++]; t.callName(); t.resetTimer(); t.jumpToRow(); t.animate(); t.showActivityPreview(); } }; t.init = () => { t.resetDrawState({ clearUsers: true }); t.initUI(); t.initConfig(); t.bind(); }; t.destroyUI = () => { elements2.dialog().remove(); elements2.start().off(".plannerPlus"); elements2.lottery().off(".plannerPlus"); elements2.start().remove(); elements2.lottery().remove(); }; t.destroy = () => { t.stopRunWhen(); t.clearTimer(); properties2.openingPreviewTask = false; properties2.previewReturnUrl = ""; t.clearRegisteredTimers(); if (properties2.themeMediaQuery && properties2.themeChangeHandler) { if (typeof properties2.themeMediaQuery.removeEventListener === "function") properties2.themeMediaQuery.removeEventListener("change", properties2.themeChangeHandler); else if (typeof properties2.themeMediaQuery.removeListener === "function") properties2.themeMediaQuery.removeListener(properties2.themeChangeHandler); properties2.themeChangeHandler = null; } clearTimeout(properties2.voiceRefreshTimer); properties2.voiceRefreshTimer = -1; if (properties2.voiceListenerBound && properties2.voiceChangedHandler && window.speechSynthesis?.removeEventListener) { if (window.speechSynthesis.removeEventListener) window.speechSynthesis.removeEventListener("voiceschanged", properties2.voiceChangedHandler); if (window.speechSynthesis.onvoiceschanged === properties2.voiceChangedHandler) window.speechSynthesis.onvoiceschanged = null; properties2.voiceListenerBound = false; properties2.voiceChangedHandler = null; } if (window.speechSynthesis) { try { window.speechSynthesis.cancel(); } catch (error) { console.warn( "TeamTools - PlannerPlus: Failed to stop speech synthesis.", error ); } } t.resetRow(); t.closePreview(true); t.toggleElements(false); if (properties2.keydownHandler) { document.removeEventListener("keydown", properties2.keydownHandler, true); properties2.keydownHandler = null; } $(window).off("popstate.plannerPlusRoute hashchange.plannerPlusRoute"); t.destroyUI(); properties2.allUsers = []; properties2.currentUser = null; properties2.currentIndex = 0; properties2.status = statuses2.destroyed; properties2.groupBy = ""; properties2.isPageActive = false; properties2.pageUrl = ""; properties2.routeScope = ""; t.refreshPlannerUsers = null; }; t.contextMenu = (event) => { if (event) { event.preventDefault(); } const dialog = elements2.dialog(); const close = () => { dialog.attr("aria-hidden", "true").removeClass("is-open"); }; const updateConfig = (key, value) => { if (key === "theme") { configs2.theme = ["light", "dark", "system"].includes(value) ? value : "system"; t.applyTheme(); } else if (key === "language") { const nextLanguage = validUiLanguages2.includes(value) ? value : "system"; const languageChanged = resolveUiLanguage3(configs2.language) !== resolveUiLanguage3(nextLanguage); configs2.language = nextLanguage; if (languageChanged) { renderLocale2(elements2.dialog()); renderLocale2(elements2.start()); renderLocale2(elements2.lottery()); renderLocale2($(`#${constants2.preview}`)); t.renderVoiceConfig(); const filterPopover = $("#plannerPlusVoiceFilterPopover"); const filterKind = filterPopover.data("plannerVoiceFilterKind"); const filterAnchor = filterKind && document.querySelector(`[data-planner-voice-filter="${filterKind}"]`); if (!filterPopover.prop("hidden") && filterAnchor) t.renderPlannerVoiceFilter(filterKind, filterAnchor); if (!$("#plannerPlusVoiceManager").prop("hidden")) { t.renderPlannerVoiceManager(); renderLocale2($("#plannerPlusVoiceManager")); } } } else if (key === "elapsedTime") { const elapsedTime = Number(value); configs2.elapsedTime = Number.isFinite(elapsedTime) && elapsedTime > 0 ? Math.min(Math.floor(elapsedTime), 3600) : properties2.defaultElapsedTime; } else if (key === "right") { const right = Number(value); configs2.right = Number.isFinite(right) ? Math.min(Math.max(Math.floor(right), properties2.rightMin), properties2.rightMax) : properties2.rightDefault; renderLocale2(elements2.start()); renderLocale2(elements2.lottery()); renderLocale2(elements2.dialog()); $("#plannerPlusVoiceLoadState").removeAttr("data-i18n"); t.bindVoiceConfig(); t.renderVoiceConfig(); elements2.start().css("right", configs2.right); elements2.lottery().css("right", configs2.right); } else if (key === "autoFocusContent") { configs2.autoFocusContent = Boolean(value); } else if (key === "autoPreviewActivity") { configs2.autoPreviewActivity = Boolean(value); } t.save(); }; t.load(); renderLocale2(dialog); if (dialog.parent()[0] !== document.body) { dialog.detach().appendTo("body"); } dialog.find("#config-theme").val(configs2.theme); dialog.find("#config-language").val(configs2.language); dialog.find("#config-elapsed-time").val(configs2.elapsedTime); dialog.find("#to-right").val(configs2.right); dialog.find("#config-auto-focus-content").prop("checked", configs2.autoFocusContent); dialog.find("#config-auto-preview-activity").prop("checked", configs2.autoPreviewActivity); t.applyTheme(); dialog.off("change.plannerPlusConfig", "#config-theme").on("change.plannerPlusConfig", "#config-theme", (e) => { updateConfig("theme", $(e.currentTarget).val()); }).off("change.plannerPlusConfig", "#config-language").on("change.plannerPlusConfig", "#config-language", (e) => { updateConfig("language", $(e.currentTarget).val()); }).off("change.plannerPlusConfig", "#config-elapsed-time").on("change.plannerPlusConfig", "#config-elapsed-time", (e) => { updateConfig("elapsedTime", $(e.currentTarget).val()); $(e.currentTarget).val(configs2.elapsedTime); }).off("change.plannerPlusConfig", "#to-right").on("change.plannerPlusConfig", "#to-right", (e) => { updateConfig("right", $(e.currentTarget).val()); $(e.currentTarget).val(configs2.right); }).off("change.plannerPlusConfig", "#config-auto-focus-content").on("change.plannerPlusConfig", "#config-auto-focus-content", (e) => { updateConfig("autoFocusContent", $(e.currentTarget).is(":checked")); }).off("change.plannerPlusConfig", "#config-auto-preview-activity").on("change.plannerPlusConfig", "#config-auto-preview-activity", (e) => { updateConfig("autoPreviewActivity", $(e.currentTarget).is(":checked")); }).attr("aria-hidden", "false").addClass("is-open"); dialog.find(".planner-plus-modal__close").trigger("focus"); dialog.find(".planner-plus-modal__close, .planner-plus-modal__scrim").off("click.plannerPlusDialog").on("click.plannerPlusDialog", close); return false; }; t.bind = () => { elements2.startImg().off("click.plannerPlus"); elements2.startImg().on("click.plannerPlus", (event) => { event.preventDefault(); event.stopPropagation(); t.build(); }); elements2.lotteryImg().off("click.plannerPlus"); elements2.lotteryImg().on("click.plannerPlus", (event) => { event.preventDefault(); event.stopPropagation(); t.draw(); }); if (properties2.keydownHandler) { document.removeEventListener("keydown", properties2.keydownHandler, true); } properties2.keydownHandler = (e) => { if ($(`#${constants2.preview}`).length > 0) { if (e.key === "Escape") { e.preventDefault(); t.closePreview(); return; } if (e.key === "ArrowLeft" || e.key === "ArrowRight") { e.preventDefault(); const button = $(`#${constants2.preview} .planner-plus-preview__${e.key === "ArrowLeft" ? "previous" : "next"}`); button.trigger("click"); return; } } const target = e.target; const isEditing = target && $(target).closest( "input, textarea, select, [contenteditable='true']" ).length > 0; if (isEditing) { return; } if (e.key === "~" || e.code === "Backquote") { e.preventDefault(); if (properties2.status === statuses2.idle || properties2.status === statuses2.finished) { t.build(); } else if (properties2.status === statuses2.ready || properties2.status === statuses2.drawing) { t.draw(); } return; } }; document.addEventListener("keydown", properties2.keydownHandler, true); }; t.requestFullscreen = () => { if (!configs2.autoFocusContent || document.fullscreenElement || !document.fullscreenEnabled) { return; } const body = document.querySelector("body"); if (!body || typeof body.requestFullscreen !== "function") { return; } body.requestFullscreen().then(() => { properties2.fullscreenEnteredByScript = true; }).catch((error) => { console.warn( "TeamTools - PlannerPlus: Failed to enter fullscreen.", error ); }); }; t.build = () => { t.requestFullscreen(); console.info("TeamTools - PlannerPlus: Start icon clicked.", { groupBy: util2.getGroupBy(), boardColumns: document.querySelectorAll( "ul[data-testid=taskBoardView] > li" ).length }); t.reset(); properties2.status = statuses2.initializing; let selectedTemplate = null; let previousBoardSignature = ""; let stableBoardReads = 0; const getBoardSignature = () => [...document.querySelectorAll("ul[data-testid=taskBoardView] > li")].filter((element) => element.id !== "null" && !!util2.getColumnLabel(element)).map((element) => element.id + "|" + util2.getColumnLabel(element)).join(""); const findTemplate = () => { const candidate = getTemplates().find((template) => template.condition()); if (!candidate) { selectedTemplate = null; previousBoardSignature = ""; stableBoardReads = 0; return false; } const boardSignature = getBoardSignature(); if (boardSignature !== previousBoardSignature) { previousBoardSignature = boardSignature; stableBoardReads = 0; return false; } stableBoardReads += 1; selectedTemplate = candidate; return stableBoardReads >= 2; }; t.runWhen(findTemplate, () => { if (properties2.status !== statuses2.initializing || !selectedTemplate) { return; } t.stopRunWhen(); const template = selectedTemplate; t.refreshPlannerUsers = () => { const previousUsers = properties2.allUsers; template.initUsers(); if (!properties2.allUsers.length) { properties2.allUsers = previousUsers; } }; console.log( `TeamTools - PlannerPlus: Version ${template.version} detected, now will intialize the lottery accordingly...` ); try { template.initProperties(); template.initUsers(); } catch (error) { console.warn( "TeamTools - PlannerPlus: Failed to initialize the selected group.", error ); window.alert( getLocaleText2("errors.readGroupsFailed") ); t.reset(); return; } if (properties2.allUsers.length === 0) { console.warn( "TeamTools - PlannerPlus: No drawable groups were found on the board." ); window.alert( getLocaleText2("errors.noDrawableGroups") ); t.reset(); return; } t.ready(); console.log(`TeamTools - PlannerPlus: PlannerPlus is initialized.`); console.log( `TeamTools - PlannerPlus: TeamTools is maintained by the DFT team.` ); }); }; t.toggleLeftNavigation = (collapse) => { const button = document.querySelector( '[data-testid="left-nav-toggle-button"]' ); if (!button) { return; } const expanded = button.getAttribute("aria-expanded") === "true"; if (collapse && expanded) { button.click(); properties2.previewCollapsedNavigation = true; } else if (!collapse && properties2.previewCollapsedNavigation && !expanded) { button.click(); properties2.previewCollapsedNavigation = false; } }; t.toggleElements = (start2) => { const autoFocusContent = properties2.roundConfig?.autoFocusContent ?? configs2.autoFocusContent; t.toggleLeftNavigation(start2 && autoFocusContent); if (autoFocusContent) { const content = document.querySelector( '[data-testid="task-board-root"]' ); const headers = document.querySelectorAll( '[data-testid="page-header-layout"], [data-testid="view-transform-bar-layout"]' ); if (start2) { headers.forEach((element) => element.classList.add("planner-plus-autofocus-hidden")); content?.scrollIntoView({ block: "start", inline: "nearest" }); } else { headers.forEach((element) => element.classList.remove("planner-plus-autofocus-hidden")); if (properties2.fullscreenEnteredByScript && document.fullscreenElement && typeof document.exitFullscreen === "function") { properties2.fullscreenEnteredByScript = false; document.exitFullscreen().catch((error) => { console.warn( "TeamTools - PlannerPlus: Failed to exit fullscreen.", error ); }); } properties2.fullscreenEnteredByScript = false; } } if (!start2 && properties2.fullscreenEnteredByScript && document.fullscreenElement && typeof document.exitFullscreen === "function") { properties2.fullscreenEnteredByScript = false; document.exitFullscreen().catch((error) => { console.warn( "TeamTools - PlannerPlus: Failed to exit fullscreen.", error ); }); } }; t.ready = () => { t.resetDrawState(); properties2.roundConfig = { autoFocusContent: configs2.autoFocusContent, autoPreviewActivity: configs2.autoPreviewActivity }; properties2.status = statuses2.ready; t.toggleElements(true); elements2.start().hide(); elements2.lottery().show(); }; return t; })(); return util2; } // src/shared/locale.js var VALID_UI_LANGUAGES = ["system", "en", "zh-CN"]; function resolveUiLanguage(value, browserLanguage = navigator.language || "") { return value === "zh-CN" || value === "system" && /^zh(?:-|$)/i.test(browserLanguage) ? "zh-CN" : "en"; } function interpolateLocaleText(text, key, variables = {}) { return (text || key).replace(/\{\{(\w+)\}\}/g, (_, name) => variables[name] ?? ""); } // src/shared/runtime/locale-runtime.js function lookupMessage(messages, language, key) { const languageMessages = messages?.[language]; if (languageMessages && Object.prototype.hasOwnProperty.call(languageMessages, key)) { return languageMessages[key]; } const parts = key.split("."); let entry = messages; parts.forEach((part) => { entry = entry?.[part]; }); return entry?.[language]; } function createLocaleRuntime({ messages, getLanguage, browserLanguage }) { const resolveLanguage = (value = getLanguage()) => resolveUiLanguage(value, browserLanguage?.() ?? navigator.language ?? ""); const getLocaleText2 = (key, value = getLanguage(), variables = {}) => interpolateLocaleText(lookupMessage(messages, resolveLanguage(value), key), key, variables); return { validUiLanguages: VALID_UI_LANGUAGES, resolveUiLanguage: resolveLanguage, getLocaleText: getLocaleText2 }; } // src/plugins/planner/runtime/locale-messages.js var localeMessages = { general: { settings: { en: "Planner Plus settings", "zh-CN": "Planner Plus \u8BBE\u7F6E" }, subtitle: { en: "Configure taskboard lottery", "zh-CN": "\u914D\u7F6E\u4EFB\u52A1\u677F\u62BD\u7B7E" }, close: { en: "Close", "zh-CN": "\u5173\u95ED" }, general: { en: "General", "zh-CN": "\u5E38\u89C4" }, language: { en: "Language", "zh-CN": "\u8BED\u8A00" }, languageDescription: { en: "Choose the plugin display language.", "zh-CN": "\u9009\u62E9\u63D2\u4EF6\u663E\u793A\u8BED\u8A00\u3002" }, theme: { en: "Theme", "zh-CN": "\u4E3B\u9898" }, themeDescription: { en: "Light, dark, or follow system", "zh-CN": "\u6D45\u8272\u3001\u6DF1\u8272\u6216\u8DDF\u968F\u7CFB\u7EDF\u3002" }, system: { en: "System", "zh-CN": "\u7CFB\u7EDF" }, english: { en: "English", "zh-CN": "English" }, chinese: { en: "\u4E2D\u6587", "zh-CN": "\u4E2D\u6587" }, light: { en: "Light", "zh-CN": "\u6D45\u8272" }, dark: { en: "Dark", "zh-CN": "\u6DF1\u8272" }, taskboard: { en: "TASKBOARD", "zh-CN": "\u4EFB\u52A1\u677F" }, floatingPosition: { en: "Floating button position", "zh-CN": "\u6D6E\u52A8\u6309\u94AE\u4F4D\u7F6E" }, floatingPositionDescription: { en: "Distance from the right edge of the screen.", "zh-CN": "\u8DDD\u79BB\u5C4F\u5E55\u53F3\u4FA7\u7684\u8DDD\u79BB\u3002" }, elapsedTime: { en: "Elapsed time threshold", "zh-CN": "\u8D85\u65F6\u9608\u503C" }, elapsedTimeDescription: { en: "How long the current participant can remain active.", "zh-CN": "\u5F53\u524D\u53C2\u4E0E\u8005\u53EF\u4EE5\u4FDD\u6301\u6D3B\u52A8\u72B6\u6001\u7684\u65F6\u957F\u3002" }, autoFocus: { en: "Auto-focus content", "zh-CN": "\u81EA\u52A8\u805A\u7126\u5185\u5BB9" }, autoFocusDescription: { en: "Give the board more room while drawing. Changes apply in the next lottery round.", "zh-CN": "\u62BD\u7B7E\u65F6\u4E3A\u4EFB\u52A1\u677F\u7559\u51FA\u66F4\u591A\u7A7A\u95F4\u3002\u66F4\u6539\u5C06\u5728\u4E0B\u4E00\u8F6E\u62BD\u7B7E\u65F6\u751F\u6548\u3002" }, autoPreview: { en: "Auto preview activity", "zh-CN": "\u81EA\u52A8\u9884\u89C8\u6D3B\u52A8" }, autoPreviewDescription: { en: "Show task previews after each participant is drawn. Changes apply in the next lottery round.", "zh-CN": "\u6BCF\u6B21\u62BD\u53D6\u53C2\u4E0E\u8005\u540E\u663E\u793A\u4EFB\u52A1\u9884\u89C8\u3002\u66F4\u6539\u5C06\u5728\u4E0B\u4E00\u8F6E\u62BD\u7B7E\u65F6\u751F\u6548\u3002" }, startLotteryAlt: { en: "Start lottery", "zh-CN": "\u5F00\u59CB\u62BD\u7B7E" }, drawNextAlt: { en: "Draw next participant", "zh-CN": "\u62BD\u53D6\u4E0B\u4E00\u4F4D\u53C2\u4E0E\u8005" }, tooltip: { en: "Left-click or press ~: Start lottery
Right-click: Open settings", "zh-CN": "\u5DE6\u952E\u6216\u6309 ~\uFF1A\u5F00\u59CB\u62BD\u7B7E
\u53F3\u952E\uFF1A\u6253\u5F00\u8BBE\u7F6E" }, drawTooltip: { en: "Left-click or press ~: Draw next participant
Right-click: Open settings", "zh-CN": "\u5DE6\u952E\u6216\u6309 ~\uFF1A\u62BD\u53D6\u4E0B\u4E00\u4F4D\u53C2\u4E0E\u8005
\u53F3\u952E\uFF1A\u6253\u5F00\u8BBE\u7F6E" }, unitPixels: { en: "px", "zh-CN": "px" }, unitSeconds: { en: "sec", "zh-CN": "\u79D2" }, timerStatus: { en: "{{name}}: {{seconds}}", "zh-CN": "{{name}}\uFF1A{{seconds}}" }, voice: { en: "Voice", "zh-CN": "\u8BED\u97F3" }, voiceDescription: { en: "Choose voices used to announce taskboard participants.", "zh-CN": "\u9009\u62E9\u4EFB\u52A1\u677F\u53EB\u540D\u65F6\u4F7F\u7528\u7684\u8BED\u97F3\u3002" }, total: { en: "Total", "zh-CN": "\u603B\u8BA1" }, filtered: { en: "Filtered", "zh-CN": "\u7B5B\u9009\u540E" }, checked: { en: "Checked", "zh-CN": "\u5DF2\u52FE\u9009" }, preview: { en: "Preview", "zh-CN": "\u8BD5\u542C" }, name: { en: "Name", "zh-CN": "\u540D\u79F0" }, localService: { en: "LocalService", "zh-CN": "\u672C\u5730\u670D\u52A1" }, languageFilter: { en: "Language", "zh-CN": "\u8BED\u8A00" }, selectVoice: { en: "Select {{name}}", "zh-CN": "\u9009\u62E9 {{name}}" }, previewVoice: { en: "Preview {{name}}", "zh-CN": "\u8BD5\u542C {{name}}" }, customPreviewText: { en: "Custom preview text", "zh-CN": "\u81EA\u5B9A\u4E49\u8BD5\u542C\u6587\u672C" }, useCustomPreviewText: { en: "Use custom preview text", "zh-CN": "\u4F7F\u7528\u81EA\u5B9A\u4E49\u6587\u672C\u8BD5\u542C" }, useCustomPreviewTextDescription: { en: "When unchecked, a built-in preview text matching the selected voice language is used. Check it to use the text above.", "zh-CN": "\u672A\u52FE\u9009\u65F6\uFF0C\u4F1A\u6309\u5F53\u524D\u5B9E\u9645\u8C03\u7528\u8BED\u97F3\u7684\u8BED\u8A00\u4F7F\u7528\u5185\u7F6E\u8BD5\u542C\u6587\u672C\uFF1B\u52FE\u9009\u540E\u624D\u4F7F\u7528\u4E0A\u65B9\u6587\u672C\u3002" }, loadingBrowserVoices: { en: "Loading browser voices\u2026", "zh-CN": "\u6B63\u5728\u8BFB\u53D6\u6D4F\u89C8\u5668\u8BED\u97F3\u2026" }, noVoicesMatch: { en: "No voices match the current filters.", "zh-CN": "\u6CA1\u6709\u5339\u914D\u5F53\u524D\u7B5B\u9009\u6761\u4EF6\u7684\u8BED\u97F3\u3002" }, enterPreviewText: { en: "Enter preview text first.", "zh-CN": "\u8BF7\u5148\u8F93\u5165\u8BD5\u542C\u6587\u672C\u3002" }, previewingVoice: { en: "Previewing {{name}}\u2026", "zh-CN": "\u6B63\u5728\u8BD5\u542C {{name}}\u2026" }, randomVoice: { en: "Random", "zh-CN": "\u968F\u673A" }, playbackRule: { en: "Voice playback rule", "zh-CN": "\u8BED\u97F3\u64AD\u653E\u89C4\u5219" }, playbackRuleDescription: { en: "Choose how selected voices are used during the taskboard lottery.", "zh-CN": "\u9009\u62E9\u4EFB\u52A1\u677F\u62BD\u7B7E\u8FC7\u7A0B\u4E2D\u5982\u4F55\u4F7F\u7528\u5DF2\u52FE\u9009\u7684\u8BED\u97F3\u3002" }, browserDefaultRule: { en: "Browser default", "zh-CN": "\u6D4F\u89C8\u5668\u9ED8\u8BA4" }, firstCheckedRule: { en: "Always use the first checked voice", "zh-CN": "\u59CB\u7EC8\u7B2C\u4E00\u4E2A" }, roundRandomRule: { en: "Random once per round", "zh-CN": "\u6BCF\u8F6E\u968F\u673A" }, perPlayRandomRule: { en: "Random for every playback", "zh-CN": "\u6BCF\u6B21\u968F\u673A" }, firstCheckedVoice: { en: "Always use the first checked voice", "zh-CN": "\u59CB\u7EC8\u4F7F\u7528\u7B2C\u4E00\u4E2A\u5DF2\u52FE\u9009\u8BED\u97F3" }, roundRandomVoice: { en: "Random once per round", "zh-CN": "\u6BCF\u8F6E\u968F\u673A" }, perPlayRandomVoice: { en: "Random for every playback", "zh-CN": "\u6BCF\u6B21\u968F\u673A" }, voiceCandidates: { en: "{{count}} checked voices", "zh-CN": "\u5DF2\u52FE\u9009 {{count}} \u4E2A\u8BED\u97F3" }, voiceLanguageTooltip: { en: "{{count}} languages selected", "zh-CN": "\u5DF2\u52FE\u9009\u8BED\u97F3\u5171 {{count}} \u79CD\u8BED\u8A00" }, roundRandomSummary: { en: "{{count}} checked voices \xB7 Random once per round", "zh-CN": "\u5DF2\u52FE\u9009 {{count}} \u4E2A\u8BED\u97F3 \xB7 \u6BCF\u8F6E\u968F\u673A" }, perPlayRandomSummary: { en: "{{count}} checked voices \xB7 Random for every playback", "zh-CN": "\u5DF2\u52FE\u9009 {{count}} \u4E2A\u8BED\u97F3 \xB7 \u6BCF\u6B21\u968F\u673A" }, browserDefaultRuleDescription: { en: "Always use the browser's default voice.", "zh-CN": "\u59CB\u7EC8\u4F7F\u7528\u6D4F\u89C8\u5668\u9ED8\u8BA4\u8BED\u97F3\u3002" }, firstCheckedRuleDescription: { en: "Always use the first voice in the checked list.", "zh-CN": "\u59CB\u7EC8\u4F7F\u7528\u5DF2\u52FE\u9009\u5217\u8868\u4E2D\u7684\u7B2C\u4E00\u4E2A\u8BED\u97F3\u3002" }, roundRandomRuleDescription: { en: "Choose one checked voice at the start of each lottery round and keep it for the entire round.", "zh-CN": "\u6BCF\u8F6E\u62BD\u7B7E\u5F00\u59CB\u65F6\u968F\u673A\u9009\u62E9\u4E00\u4E2A\u5DF2\u52FE\u9009\u8BED\u97F3\uFF0C\u5E76\u5728\u672C\u8F6E\u4E2D\u4FDD\u6301\u4E0D\u53D8\u3002" }, perPlayRandomRuleDescription: { en: "Choose a checked voice for every playback; this may increase startup latency.", "zh-CN": "\u6BCF\u6B21\u64AD\u653E\u90FD\u91CD\u65B0\u9009\u62E9\u4E00\u4E2A\u5DF2\u52FE\u9009\u8BED\u97F3\uFF0C\u53EF\u80FD\u589E\u52A0\u542F\u52A8\u5EF6\u8FDF\u3002" }, simulateUsage: { en: "Simulate actual usage", "zh-CN": "\u6A21\u62DF\u5B9E\u9645\u4F7F\u7528" }, selectAllWindowVoices: { en: "Select all window voices", "zh-CN": "\u5168\u9009\u672C\u7A97\u53E3\u8BED\u97F3" }, checkedVoiceSnapshot: { en: "This is a snapshot of checked voices. Changes apply when closed.", "zh-CN": "\u8FD9\u662F\u5DF2\u52FE\u9009\u8BED\u97F3\u7684\u5FEB\u7167\uFF0C\u5173\u95ED\u7A97\u53E3\u65F6\u624D\u4F1A\u5E94\u7528\u53D8\u66F4\u3002" }, defaultVoiceAutoSelected: { en: "No voices remain selected. The browser default voice was selected automatically.", "zh-CN": "\u6CA1\u6709\u4FDD\u7559\u5176\u4ED6\u8BED\u97F3\uFF0C\u5DF2\u81EA\u52A8\u52FE\u9009\u6D4F\u89C8\u5668\u9ED8\u8BA4\u8BED\u97F3\u3002" }, defaultVoiceAutoSelectedTitle: { en: "Voice selection updated", "zh-CN": "\u8BED\u97F3\u9009\u62E9\u5DF2\u66F4\u65B0" }, checkedVoices: { en: "Checked voices", "zh-CN": "\u5DF2\u52FE\u9009\u8BED\u97F3" }, manageCheckedVoices: { en: "Manage checked voices", "zh-CN": "\u7BA1\u7406\u5DF2\u52FE\u9009\u8BED\u97F3" }, voiceManagerCount: { en: "{{count}} voices \xB7 {{checked}} checked", "zh-CN": "\u5171 {{count}} \u4E2A\u8BED\u97F3 \xB7 \u5DF2\u52FE\u9009 {{checked}} \u4E2A" }, filterName: { en: "Filter Name", "zh-CN": "\u7B5B\u9009\u540D\u79F0" }, filterLocalService: { en: "Filter LocalService", "zh-CN": "\u7B5B\u9009\u672C\u5730\u670D\u52A1" }, filterLanguage: { en: "Filter Language", "zh-CN": "\u7B5B\u9009\u8BED\u8A00" }, clear: { en: "Clear", "zh-CN": "\u6E05\u9664" }, searchVoiceName: { en: "Search voice name", "zh-CN": "\u641C\u7D22\u8BED\u97F3\u540D\u79F0" }, searchLanguage: { en: "Search language", "zh-CN": "\u641C\u7D22\u8BED\u8A00" }, all: { en: "All", "zh-CN": "\u5168\u90E8" }, allLanguages: { en: "All languages", "zh-CN": "\u6240\u6709\u8BED\u8A00" }, browserDefaultVoice: { en: "Browser default voice", "zh-CN": "\u6D4F\u89C8\u5668\u9ED8\u8BA4\u8BED\u97F3" }, checkedVoiceCount: { en: "{{count}} checked voices", "zh-CN": "\u5DF2\u52FE\u9009 {{count}} \u4E2A\u8BED\u97F3" }, checkedVoiceSummary: { en: "{{languages}} \xB7 {{count}} checked voices", "zh-CN": "{{languages}} \xB7 \u5DF2\u52FE\u9009 {{count}} \u4E2A\u8BED\u97F3" }, loadedBrowserVoices: { en: "Loaded {{count}} browser voices", "zh-CN": "\u5DF2\u8BFB\u53D6 {{count}} \u4E2A\u6D4F\u89C8\u5668\u8BED\u97F3" }, waitingBrowserVoices: { en: "Waiting for browser voices\u2026", "zh-CN": "\u6B63\u5728\u7B49\u5F85\u6D4F\u89C8\u5668\u8BED\u97F3\u2026" }, noBrowserVoicesReturned: { en: "No browser voices were returned.", "zh-CN": "\u6D4F\u89C8\u5668\u672A\u8FD4\u56DE\u4EFB\u4F55\u8BED\u97F3\u3002" }, totalChecked: { en: "Total {{total}} \xB7 Checked {{checked}}", "zh-CN": "\u603B\u8BA1 {{total}} \xB7 \u5DF2\u52FE\u9009 {{checked}}" }, common: { en: "Common", "zh-CN": "\u5E38\u7528" }, favorite: { en: "Favorite", "zh-CN": "\u6536\u85CF" }, other: { en: "Other", "zh-CN": "\u5176\u4ED6" }, addToCommon: { en: "Add to favorites", "zh-CN": "\u6DFB\u52A0\u5230\u6536\u85CF" }, removeFromCommon: { en: "Remove from favorites", "zh-CN": "\u4ECE\u6536\u85CF\u4E2D\u79FB\u9664" } }, preview: { close: { en: "Close activity preview", "zh-CN": "\u5173\u95ED\u6D3B\u52A8\u9884\u89C8" }, previous: { en: "Previous", "zh-CN": "\u4E0A\u4E00\u4E2A" }, previousTask: { en: "Previous task", "zh-CN": "\u4E0A\u4E00\u4E2A\u4EFB\u52A1" }, next: { en: "Next", "zh-CN": "\u4E0B\u4E00\u4E2A" }, nextTask: { en: "Next task", "zh-CN": "\u4E0B\u4E00\u4E2A\u4EFB\u52A1" }, openOriginal: { en: "Open original task", "zh-CN": "\u6253\u5F00\u539F\u4EFB\u52A1" }, empty: { en: "No activity preview is available for this task.", "zh-CN": "\u6B64\u4EFB\u52A1\u6CA1\u6709\u53EF\u7528\u7684\u6D3B\u52A8\u9884\u89C8\u3002" }, untitled: { en: "Untitled task", "zh-CN": "\u672A\u547D\u540D\u4EFB\u52A1" }, checklist: { en: "Completed {{completed}} / {{total}}", "zh-CN": "\u5DF2\u5B8C\u6210 {{completed}} / {{total}}" }, noChecklist: { en: "No checklist data", "zh-CN": "\u6682\u65E0\u6E05\u5355\u6570\u636E" }, incomplete: { en: "Some content is not fully displayed. Open the original task to view it.", "zh-CN": "\u8FD8\u6709\u5185\u5BB9\u672A\u5B8C\u5168\u663E\u793A\uFF0C\u8BF7\u6253\u5F00\u539F\u4EFB\u52A1\u67E5\u770B\u3002" }, summary: { en: "{{name}} - {{task}} - {{seconds}}", "zh-CN": "{{name}} - {{task}} - {{seconds}}" } }, errors: { initializationFailed: { en: "Planner Plus: Initialization failed. Please reload the board and try again.", "zh-CN": "Planner Plus\uFF1A\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u52A0\u8F7D\u4EFB\u52A1\u677F\u540E\u91CD\u8BD5\u3002" }, readGroupsFailed: { en: "Planner Plus: Failed to read the current groups. Please try again after the board finishes loading.", "zh-CN": "Planner Plus\uFF1A\u65E0\u6CD5\u8BFB\u53D6\u5F53\u524D\u5206\u7EC4\uFF0C\u8BF7\u7B49\u5F85\u4EFB\u52A1\u677F\u52A0\u8F7D\u5B8C\u6210\u540E\u91CD\u8BD5\u3002" }, noDrawableGroups: { en: "Planner Plus: No drawable groups were found on the board. Please check that the board has finished loading.", "zh-CN": "Planner Plus\uFF1A\u4EFB\u52A1\u677F\u4E0A\u6CA1\u6709\u53EF\u62BD\u53D6\u7684\u5206\u7EC4\uFF0C\u8BF7\u786E\u8BA4\u4EFB\u52A1\u677F\u5DF2\u52A0\u8F7D\u5B8C\u6210\u3002" } } }; // src/plugins/planner/runtime/locale.js function createLocaleService({ getLanguage }) { const { validUiLanguages: validUiLanguages2, resolveUiLanguage: resolveUiLanguage3, getLocaleText: getLocaleText2 } = createLocaleRuntime({ messages: localeMessages, getLanguage }); const markLocale = (root = document) => { const keys = { "Configure taskboard lottery": "general.subtitle", "Floating button position": "general.floatingPosition", "Distance from the right edge of the screen.": "general.floatingPositionDescription", "Elapsed time threshold": "general.elapsedTime", "How long the current participant can remain active.": "general.elapsedTimeDescription", "Auto-focus content": "general.autoFocus", "Give the board more room while drawing. Changes apply in the next lottery round.": "general.autoFocusDescription", "Auto preview activity": "general.autoPreview", "Show task previews after each participant is drawn. Changes apply in the next lottery round.": "general.autoPreviewDescription", "TASKBOARD": "general.taskboard", "Open original task": "preview.openOriginal", "\u6253\u5F00\u539F\u4EFB\u52A1": "preview.openOriginal", "No activity preview is available for this task.": "preview.empty", "\u6682\u65E0\u6E05\u5355\u6570\u636E": "preview.noChecklist", "\u8FD8\u6709\u5185\u5BB9\u672A\u5B8C\u5168\u663E\u793A\uFF0C\u8BF7\u6253\u5F00\u539F\u4EFB\u52A1\u67E5\u770B": "preview.incomplete", "Previous": "preview.previous", "Previous task": "preview.previousTask", "Next": "preview.next", "Next task": "preview.nextTask", "Close activity preview": "preview.close" }; $(root).find("*:not(script):not(style)").each(function() { const element = $(this); if (element.children().length === 0) { const key = keys[element.text().trim()]; if (key) element.attr("data-i18n", key); } }); }; const renderLocale2 = (root = document) => { markLocale(root); $(root).find("[data-i18n]").addBack("[data-i18n]").each(function() { const element = $(this); const text = getLocaleText2(element.attr("data-i18n")); const attribute = element.attr("data-i18n-attr"); if (attribute) element.attr(attribute, text); const ariaKey = element.attr("data-i18n-aria-label"); if (ariaKey) element.attr("aria-label", getLocaleText2(ariaKey)); if (!attribute && !ariaKey) element.html(text); }); $(root).find(".planner-plus-preview__checklist-count[data-checklist-total]").each(function() { const element = $(this); const completed = Number(element.attr("data-checklist-completed")) || 0; const total = Number(element.attr("data-checklist-total")) || 0; element.text(total > 0 ? getLocaleText2("preview.checklist", getLanguage(), { completed, total }) : getLocaleText2("preview.noChecklist")); }); const dialogTitle = $(root).find("#plannerPlusDialogTitle"); if (dialogTitle.length) dialogTitle.text(`${getLocaleText2("general.settings")} (v${GM_info.script.version})`); $(root).find(".planner-plus-modal__close").attr("aria-label", getLocaleText2("general.close")); }; return { validUiLanguages: validUiLanguages2, resolveUiLanguage: resolveUiLanguage3, getLocaleText: getLocaleText2, renderLocale: renderLocale2 }; } // src/plugins/planner/runtime/templates.js function createPlannerTemplates({ util: util2, constants: constants2, properties: properties2 }) { const templates2 = [ { version: 1, description: "Apply for 'Grouped by Assigned To'", condition: () => { const groupBy = util2.getGroupBy().toLowerCase(); const els = [ ...document.querySelectorAll("ul[data-testid=taskBoardView] > li") ].filter((x) => x.id !== "null" && !!util2.getColumnLabel(x)); const nonMemberCount = els.filter( (x) => util2.getColumnLabel(x).split(",")[0].trim().toLowerCase() === "column non-member" ).length; return els.length > 0 && constants2.assignedTo.some((x) => x.toLowerCase() === groupBy) && (nonMemberCount === 1 || els.every( (el) => util2.getColumnLabel(el).split(",")[0].trim().toLowerCase() !== "column non-member" )); }, initUsers: () => { const users = [ ...document.querySelectorAll("ul[data-testid=taskBoardView] > li") ].filter((x) => x.id !== "null" && !!util2.getColumnLabel(x)).map((el, index) => { const arrNameParts = util2.getColumnLabel(el).split(",")[0].split(" "); if (arrNameParts.length < 3) { return null; } const name = `${arrNameParts[1]} ${arrNameParts[2]}`; const id = `planner-plus-row-${index + 1}`; el.dataset.plannerPlusId = id; return { name, id }; }).filter((x) => x).filter((x) => !constants2.uselessColumns.includes(x.name)); properties2.allUsers = util2.random(users); }, initProperties: () => { properties2.groupBy = util2.getGroupBy(); } }, { version: 2, description: "Apply for 'Grouped by Bucket'", condition: () => { const groupBy = util2.getGroupBy().toLowerCase(); const els = [ ...document.querySelectorAll("ul[data-testid=taskBoardView] > li") ].filter((x) => x.id !== "null" && !!util2.getColumnLabel(x)); return els.length > 0 && constants2.bucket.some((x) => x.toLowerCase() === groupBy) && els.every( (el) => util2.getColumnLabel(el).split(",")[0].trim().length >= 2 ); }, initUsers: () => { const users = [ ...document.querySelectorAll("ul[data-testid=taskBoardView] > li") ].filter((x) => x.id !== "null" && !!util2.getColumnLabel(x)).map((el, index) => { const arrNameParts = util2.getColumnLabel(el).split(",")[0].split(" "); if (arrNameParts.length < 2) { return null; } arrNameParts.shift(); const name = arrNameParts.join(" "); const id = `planner-plus-row-${index + 1}`; el.dataset.plannerPlusId = id; return { name, id }; }).filter((x) => x).filter((x) => !constants2.uselessColumns.includes(x.name)); properties2.allUsers = util2.random(users); }, initProperties: () => { properties2.groupBy = util2.getGroupBy(); } } ]; return templates2; } // src/plugins/planner/runtime/core.js var properties = { status: "idle", startTime: "", interval: -1, animateTimer: -1, routeMonitorTimer: -1, timerHandles: /* @__PURE__ */ new Set(), previewWaitTimer: -1, previewCloseTimer: -1, currentHighlightedRow: null, fullscreenEnteredByScript: false, themeChangeHandler: null, allUsers: [], currentUser: null, currentIndex: 0, defaultElapsedTime: 90, rightDefault: 250, runWhenTimers: /* @__PURE__ */ new Set(), isPageActive: false, pageUrl: "", routeScope: "", rightMin: 0, rightMax: 1e3, groupBy: "", defaultAutoFocusContent: false, defaultAutoPreviewActivity: false, previewCollapsedNavigation: false, previewRequestId: 0, openingPreviewTask: false, previewReturnUrl: "", keydownHandler: null, themeMediaQuery: null, resolvedTheme: "light", roundConfig: null, voiceListenerBound: false, voiceChangedHandler: null, voiceRefreshTimer: -1, voiceRequestId: 0, voiceDelayTimer: -1, voiceWarmupTimer: -1 }; var { validUiLanguages, resolveUiLanguage: resolveUiLanguage2, getLocaleText, renderLocale } = createLocaleService({ getLanguage: () => configs.language }); var configs = { theme: "system", language: "system", elapsedTime: properties.defaultElapsedTime, right: properties.rightDefault, autoFocusContent: properties.defaultAutoFocusContent, autoPreviewActivity: properties.defaultAutoPreviewActivity, voice: { configured: false, checkedVoiceIds: [], useCustomPreviewText: false, customPreviewText: "", playbackRule: "browser-default" } }; var { constants, statuses, elements: plannerElements } = createPlannerConfig(); var images = { configChevron: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTcgMTBsNSA1IDUtNSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBmaWxsPSJub25lIi8+PC9zdmc+", wheel: "data:image/png;base64,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", plugin: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+PGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjgiIGZpbGw9IiMwYzY2ZTQiLz48cmVjdCB4PSIxNCIgeT0iMjMiIHdpZHRoPSIzNiIgaGVpZ2h0PSIxOCIgcng9IjkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIzLjUiLz48Y2lyY2xlIGN4PSI0MSIgY3k9IjMyIiByPSI2IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTIwIDMyaDgiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIG9wYWNpdHk9Ii43NSIvPjxwYXRoIGQ9Ik00MSAxOHYtNU00OSAyMWwzLTNNNTIgMzJoNCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PC9zdmc+" }; var elements = plannerElements; var templates = []; var util = createPlannerUtils({ properties, configs, constants, statuses, elements, validUiLanguages, resolveUiLanguage: resolveUiLanguage2, renderLocale, images, getTemplates: () => templates, getLocaleText }); templates = createPlannerTemplates({ util, constants, properties }); function start() { injectStyles(); $(document).ready(() => { console.log( `Script ${GM_info.script.name} is loaded and version is ${GM_info.script.version}` ); util.startRouteMonitor(); }); } // src/plugins/planner/entry.js installSharedTooltips(); start(); })();